上下文内容的取舍
一般用户可忽略本节内容,保持默认的设置即可。
多轮对话时,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,即可确保结果的正确。