添加历史消息
在应用开发一中我们已经成功调用了deepseek的api,但是我们发现我的AI助手仅仅只能回答一次问题,对以前讨论的问题并不知道。
原因是因为AI模型的上下文是以列表[]储存的,每一条消息是一个集合{},每个集合有两个字典元素,也就是两个键值对,类似于:
all_prompt = [
{"role":"user","content":"你好"}#用户问题
{"role":"assitant","content":"你好!请问有什么可以帮助的吗?"}#模型回复
]
而我们在循环中每一次调用chat_with_llm函数就相当于重新清空了上下文,所以AI模型不知道我们以前的对话内容。
所以,我们只需要在函数中加入用户的问题和模型的回复作为上下文即可,可以对列表使用append方法,将用户之前的用户问题和模型回复作为上下文传递给模型,完整代码如下:
import openai
openai.api_key = "sk-2c***477"
openai.api_base= "https://api.deepseek.com"
prompt = []
def chat_with_llm(user_input):
#加入用户的问题
prompt.append({"role":"user","content":user_input})
try:
response = openai.ChatCompletion.create(
model = "deepseek-chat",
messages = prompt,
temperature=0.7
)
assistant_response = response.choices[0].message.content
#加入模型的回复
prompt.append({"role":"assistant","content":assistant_response})
return assistant_response
except Exception as e:
return f"发生错误: {str(e)}"
while True:
print("小崔:",end="")
user_input = input()
response = chat_with_llm(user_input)
print("AI助手:"+response)
运行以上代码,我们就可以发现模型已经知道了历史消息。
模型容纳上下文长度有限度,我们常看到的“最大上下文16k”,就是代表模型的历史消息不能超过模型的最大上下文窗口大小约为 16,000 个 token(16k),(可以将一个token理解为一个文字,具体解释可以询问AI),这意味着模型在处理对话时,最多只能记住 最近 16k token 以内的内容(包括用户输入和模型回复)。超出这个范围的旧消息会被丢弃或截断,无法再影响模型的理解和回复。所以我们在和AI对话时,尽量言简意赅,简洁表达问题,分批次交互,而不是所有问题占用一个对话窗口。