了解如何开启一轮对话后,就需要了解如何开启多轮对话。根据deepseek官方文档指出,/chat/completionsAPI是一个无状态API,服务端并不会记录用户请求的上下文,为了实现多轮对话,用户只能在每次请求时,将所有对话历史拼接到本次请求后,一起传给API。
第一步还是先创建client
messages = [
{"role": "system", "content": f'你只能使用{tools}中的函数,你要从中选择合适的函数来回答问题,如果提供的函数不能解决问题,告诉用户没有相应的函数就行,如果有的话,以标准json'
f'的格式输出,例如:{{ '
f'"func":"calculator","args":"{{ '
f'参数键值对}}"}}'},
{"role": "user", "content": "西安的天气怎么样?"}
]
completion = client.chat.completions.create(
model="deepseek-r1:1.5b",
messages=messages,
max_tokens=1024,
temperature=0.7,
response_format={
'type': 'json_object'
}
)
client创建好之后,我们先打印第一次传入API的message值和API给我们的返回值
print(messages)
print(completion.choices[0].message.content)
可以看到第一条是我们传入的messages,第二条是AI给我们返回的。可以看到AI已经识别并且返回了需要调用的函数名和参数列表。
现在我们将传入的messages和AI给我们的返回数据拼接到一起(此时messages是第一轮对话的全部内容,包括问题和答案)
messages.append(completion.choices[0].message)
接下来我们将第二轮对话的messages拼接上去
messages.append({"role": "user", "content": "上海的呢?"})
接着创建第二个client
completion = client.chat.completions.create(
model="deepseek-r1:1.5b",
messages=messages,
max_tokens=1024,
temperature=0.7,
response_format={
'type': 'json_object'
}
)
我们看一下两轮下来,messages变成了什么样?
此时的message已经将第二轮我们的问题拼接了上去,接下来我们看看AI的返回
可以看到第二轮虽然我只问了上海的呢,并没有问上海的天气,但是AI依旧返回了调用函数的名称和参数列表。
接下来我们只需要在每轮对话结束之后,调用处理AI返回值的函数,即可根据AI返回值来执行我们需要的函数。从而实现根据需求,多次调用本地方法。