我目前正在为一个项目构建一个聊天机器人,它不断回复相同的内容
def chat_bot():
knowledge_base:dict = load_knowledge_base('knowledge_base.json')
while True:
user_input:str = input('You:')
if user_input.lower()=='quit':
break
best_match: str | None = find_best_match(user_input, list(q("question") for q in knowledge_base("questions")))
if best_match:
answer: str = get_answer_for_question(best_match, knowledge_base)
print(f'AXIS: {answer}')
else:
print('AXIS: I don\'t know the answer. please teach me?')
new_answer: str = input('Type the answer or "skip" to skip: ')
if new_answer.lower() != 'skip':
knowledge_base["questions"].append({"question": user_input, "answer": new_answer})
save_knowledge_base('knowledge_base.json', knowledge_base)
print('AXIS: I have learned a new response!')
我已经浏览了相当多的堆栈溢出问题,这些问题也有类似的问题,并试图将它们合并进来,但没有运气,也没有新的错误,我想这是一个胜利,但为了您的方便,我将其设置回原来的状态。收到错误。 / 否则我没有更多信息。如果您能帮助我,我将非常感激。
knowledge_base 目前非常简单,如下所示。
{
"questions": [
]
}
当您教授聊天机器人时,知识库会建立在自身之上
这是完整代码
import json
from difflib import get_close_matches
def load_knowledge_base(file_path: str):
return dict
with open(file_path,'r')as file:
data: dict = json.load(file)
return data
def save_knowledge_base(file_path: str, data: dict):
with open(file_path,'w')as file:
json.dump(data,file, indent=2)
def find_best_match(user_question: str, questions: list[str]):
return str | None
matches: list = get_close_matches(user_question, questions, n=1, cutoff=0.6)
return matches[0] if matches else None
def get_answer_for_question(question: str, knowledge_base: dict):
return str | None
for q in knowledge_base["questions"]:
if q["question"] == question:
return q["answer"]
def AXIS():
knowledge_base:dict = load_knowledge_base('knowledge_base.json')
while True:
user_input:str = input('You:')
if user_input.lower()=='quit':
break
best_match: str | None = find_best_match(user_input, list(q("question") for q in knowledge_base("questions")))
if best_match:
answer: str = get_answer_for_question(best_match, knowledge_base)
print(f'AXIS: {answer}')
else:
print('AXIS: I don\'t know the answer. please teach me?')
new_answer: str = input('Type the answer or "skip" to skip: ')
if new_answer.lower() != 'skip':
knowledge_base["questions"].append({"question": user_input, "answer": new_answer})
save_knowledge_base('knowledge_base.json', knowledge_base)
print('AXIS: I have learned a new response!')
完全错误vvv
ValueError Traceback (most recent call last)
<ipython-input-25-93f5e57e724b> in <cell line: 44>()
43
44 if __name__ =='__main__':
---> 45 chat_bot()
<ipython-input-25-93f5e57e724b> in chat_bot()
30 break
31
---> 32 best_match: str | None = find_best_match(user_input, list(q("question") for q in knowledge_base("questions")), t=3)
33 if best_match:
34 answer: str = get_answer_for_question(best_match, knowledge_base)
ValueError: dictionary update sequence element #0 has length 1; 2 is required
我正在按照 YouTube 教程来构建它。 https://www.youtube.com/watch?v=CkkjXTER2KE
当我使用
打印字典类型时print(type(knowledge_base))
它给了我
更新了第二版代码
def AXIS():
knowledge_base:dict = open('knowledge_base.json','r',errors = 'ignore')
while True:
user_input:str = input('You:')
if user_input.lower()=='quit':
break
best_match: str | None = find_best_match(user_input, list['q("question") for q in knowledge_base.json("questions")'])
if best_match:
answer: str = get_answer_for_question(best_match, knowledge_base)
print(f'AXIS: {answer}')
else:
print('AXIS: I don\'t know the answer. please teach me?')
new_answer: str = input('Type the answer or "skip" to skip: ')
if new_answer.lower() != 'skip':
knowledge_base["questions"].append({"question": user_input, "answer": new_answer})
save_knowledge_base('knowledge_base.json', knowledge_base)
print('AXIS: I have learned a new response!')
if __name__ =='__main__':
AXIS()
现在只能用 str|none 回复
You:hi
AXIS: str | None
You:hello
AXIS: str | None
You:
knowledge_base("questions")
:你正在调用字典;也许您想要方括号:knowledge_base["questions"]
?
尽管这个错误不应该导致您收到错误消息。但是你告诉人们
knowledge_base
是第 26 行中的一个字典。那么也许它是一个派生类型?什么是type(knowledge_base)
?
我注意到以下几点:
def load_knowledge_base(file_path: str):
return dict
...
您正在返回一个类型! 我怀疑这是否是故意的。也许只是简单地删除该行?
它明确解释了错误消息。如果您返回实际实例化的字典,而不是类型,您将遇到我在顶部提到的错误。所以你至少有两件事需要解决。