启用多轮对话
使用LLMCaller实现多轮对话非常简单,只需定义一个JArray对象并赋值给Messages属性即可。
下面是多轮对话参考代码,可在命令窗口测试执行:
'''Async
Dim
caller
As
New
LLMCaller("https://api.deepseek.com/chat/completions",
"deepseek-flash",
"sk-a734b83536da45e9aedc3e42605bfb3a")
'指定接入地址、模型名称和密钥
caller.SystemPrompt = "你是一个地理专家"
'系统提示词
caller.Messages =
New
JArray()
'开启多轮对话
'第一轮对话
caller.UserMessage =
"珠穆朗玛峰多高?"
If
caller.GetResult()
Then
MessageBox.Show(caller.Result)
Else
MessageBox.Show(caller.Error)
End
If
'第二轮对话
caller.UserMessage =
"第二名呢?"
If
caller.GetResult()
Then
MessageBox.Show(caller.Result)
Else
MessageBox.Show(caller.Error)
End
If
'第三轮对话
caller.UserMessage =
"分别在哪个国家?"
If
caller.GetResult()
Then
MessageBox.Show(caller.Result)
Else
MessageBox.Show(caller.Error)
End
If
你可以试试删除下面这行代码然后重新执行:
caller.Messages =
New
JArray()
'开启多轮对话
你会发现第二轮和第三轮对话的答案大概率是错误的
多轮对话的本质
一般用户可以忽略下面的内容。
大模型的API是无状态的,即服务端不记录用户请求的上下文,这意味着:每次请求都必须包含完整的对话历史。
多轮对话的本质就是:在第 N 轮请求时,把前面N-1轮问题和答案全部拼接进messages数组里,一起发给 API。
我们可以在命令窗口执行下面的代码进行验证:
'''Async
Dim
caller
As
New
LLMCaller("https://api.deepseek.com/chat/completions",
"deepseek-flash",
"sk-a734b83536da45e9aedc3e42605bfb3a")
'指定接入地址、模型名称和密钥
caller.SystemPrompt =
"你是一个地理专家"
'系统提示词
caller.Messages =
New
JArray()
'开启多轮对话
'第一轮对话
caller.UserMessage =
"珠穆朗玛峰多高?"
If
caller.GetResult()
Then
MessageBox.Show(caller.Messages.ToString())
Else
MessageBox.Show(caller.Error)
End
If
'第二轮对话
caller.UserMessage =
"第二名呢?"
If
caller.GetResult()
Then
MessageBox.Show(caller.Messages.ToString())
Else
MessageBox.Show(caller.Error)
End
If
'第三轮对话
caller.UserMessage =
"分别在哪个国家?"
If
caller.GetResult()
Then
MessageBox.Show(caller.Messages.ToString())
Else
MessageBox.Show(caller.Error)
End
If
你会发现每一轮对话,Messages数组都会包括之前n-1轮的问题和答案,例如第三轮对话结束后,Messages数组的内容是:
[
{
"role": "system",
"content": "你是一个地理专家"
},
{
"role": "user",
"content": "珠穆朗玛峰多高?"
},
{
"role": "assistant",
"content": "珠穆朗玛峰的最新官方高程是 **8848.86 米**(海拔高度)。这是
**2020 年中国和尼泊尔联合公布**的数据,通常指峰顶**雪面高度**。\n\n如果指去除峰顶冰雪层后的**岩面高度**,中国
2005 年测得约为 **8844.43 米**。所以日常说“珠峰高
8848.86 米”是最新、最常用的说法。"
},
{
"role": "user",
"content": "第二名呢?"
},
{
"role": "assistant",
"content": "世界第二高峰是 **乔戈里峰**,国际上也叫
**K2**,海拔 **8611 米**。\n\n它位于**喀喇昆仑山脉**,在**中国新疆与巴基斯坦边界**上。"
},
{
"role": "user",
"content": "分别在哪个国家?"
},
{
"role": "assistant",
"content": "按“国家”简答:\n\n- **珠穆朗玛峰**:位于
**中国** 和 **尼泊尔**
边界上。 \n - 北坡在中国西藏;南坡在尼泊尔。\n\n-
**乔戈里峰(K2)**:位于
**中国** 和 **巴基斯坦**
边界上。 \n - 中国一侧在新疆塔什库尔干塔吉克自治县;巴基斯坦一侧在吉尔吉特-巴尔蒂斯坦(巴控克什米尔地区,印度也对该地区有主权声索)。\n\n所以:**珠峰跨中国、尼泊尔;K2
跨中国、巴基斯坦。**"
}
]