启用多轮对话

使用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 跨中国、巴基斯坦。
**"
  }
]


本页地址:http://www.foxtable.com/webhelp/topics/7209.htm