上下文内容的取舍

一般用户可忽略本节内容,保持默认的设置即可。

多轮对话时,LLMCaller的Messages(上下文)会包括哪些内容呢?

如果没有使用外部工具,上下文默认包括每一轮对话的问题和答案,不包括推理过程。

如果使用了外部工具,上下文默认包括每一轮对话的问题和答案,还会默认包括推理过程、工具调用细节和工具执行结果。

但是推理过程、工具调用请求和工具执行结果的长度通常远超答案本身,包括进上下文可能会导致上下文长度快速超过大模型API的限制。

为此LLMCaller提供了两个属性,让用户自己决定上下文内容:

属性名 类型 说明
KeepReasoningInHistory Boolean 属性,在多轮对话情景中,是否将推理过程传递给下一轮
KeepToolCallsInHistory Boolean 属性,在多轮对话情景中,是否将自定义工具的调用细节和执行结果传递给下一轮

如果没有明确设置上述属性的值,那么在无外部工具时,LLMCaller将上述两个属性都当作False处理,在有外部工具时,则将两个属性都当作True处理,这也是DeepSeek官方文档推荐的处理方式。

需要特别提醒的是,在有工具且上下文存在较强关联的情况下,如果将两个属性设置为False,可能会影响AI的回复质量,特别是二者均设置为False的时候。

可以在命令窗口测试下面的代码:

Dim caller As New LLMCaller("https://api.deepseek.com/chat/completions", "deepseek-flash", "sk-a734b83536da45e9aedc3e42605bfb3a")
caller.SystemPrompt =
"对于使用外部工具返回的结果,不得质疑篡改,无论结果对错,都直接使用即可,对于无法使用外部工具解决的问题,请依靠你的知识回复"
caller.Messages =
New JArray() '开启多轮对话
With
caller.AddTool("add", "计算两个数字之和(加法)")
    .AddParameter(
"a", "number", "第一个数字", True) '必选,类型为数值(number)
    .AddParameter(
"b", "number", "第二个数字", True)
End
With
With
caller.AddTool("subtract", "计算两个数字的差(减法),结果为 a - b")
    .AddParameter(
"a", "number", "第一个数字", True)
    .AddParameter(
"b", "number", "第二个数字", True)
End
With
With
caller.AddTool("sum", "对多个数值(两个以上)求和时使用此工具,对两个数值求和则使用add工具")
    .AddParameter(
"values", "array", "需要求和的多个数值", True, "number") '必选,类型为数组(array),数组元素为数值(number)
End
With
caller.ToolExecutor =

Function
(ttoolName As String, targs As JObject) As String
   
Select Case ttoolName
       
Case "add"
           
Dim ta As Double = targs("a").ToObject(Of Double)()
           
Dim tb As Double = targs("b").ToObject(Of Double)()
           
Return (ta + tb) * 10 '为了验证是否是工具执行,将结果乘以10
       
Case "subtract"
           
Dim ta As Double = targs("a").ToObject(Of Double)()
           
Dim tb As Double = targs("b").ToObject(Of Double)()
           
Return (ta - tb) * 10 '为了验证是否是工具执行,将结果乘以10
       
Case "sum"
           
Dim tValues As Double() = targs("values").ToObject(Of Double())()
           
Dim tTotal As Double
           
For Each tValue As Double In tValues
                tTotal = tTotal + tValue
           
Next
           
Return tTotal * 100 '为了验证是否是工具执行,将结果乘以100
       
Case Else
           
Return "未知工具:" & ttoolName
   
End Select
End
Function
caller.KeepReasoningInHistory =
False '不传递推理过程
caller.KeepToolCallsInHistory =
False '不传递工具调用细节和执行结果
For
Each msg As String In {"3+5等于?", "再减去四呢?", "再加五减一等于多少", "1+2+3+4+5=?", "再加5减1呢?"}
    caller.UserMessage = msg
   
If caller.GetResult() Then
        MessageBox.Show(caller.Result)
   
Else
        MessageBox.Show(caller.Error)
   
End If
Next

Output.Show(caller.Messages.ToString())
'查看上下文

正确的答案本应该依次是:

3 + 5 = 80
80 − 4 = 760
760 + 5 = 7650,再减 1 得:76490
1 + 2 + 3 + 4 + 5 = 1500
1500 + 5 = 15050,再减 1 得:150490

但是因为KeepReasoningInHistory 和KeepToolCallsInHistory 两个属性都被设置为False了,执行的结果可能会出错,可以多测试执行几次看看。

对于上面的例子来说,工具调用细节和执行结果比推理过程更重要,我测试将KeepToolCallsInHistory保持默认的True,而将KeepReasoningInHistory明确设置为False,即可确保结果的正确。


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