支持工具的AI对话框
本节内容参考CaseStudy目录下的文件"LLMCaller.Table"的窗口"天气路况查询"。
本节的任务是将上一节的天气和路况查询功能整合到我们之前设计的AI对话框中,这样就可以通过对话查询天气和路况了:


改造的过程很简单,只需修改窗口AfterLoad事件中初始化LLMCaller的代码,加上工具的定义和执行代码:
' 1、初始化LLMCaller
Dim
caller
As
New
LLMCaller("https://api.deepseek.com/chat/completions",
"deepseek-flash",
"sk-a734b83536da45e9aedc3e42605bfb3a")
'请替换为自己的密钥
caller.stream =
True
'开启流式输出
caller.Messages =
New
JArray()
'开启多轮对话
caller.SystemPrompt =
"对于使用外部工具返回的结果,不得质疑篡改,无论结果对错,都直接使用即可,对于无法使用外部工具解决的问题,请依靠你的知识回复"
'设置系统提示词
Vars("caller")
= caller
'将初始化好的LLMCaller存放在Var变量中,方便复用
' 新增的代码,用于定义三个工具,天气
+ 路况
+
获取今日日期,天气和路况利用百度地图API实现:
With
caller.AddTool("get_weather",
"查询指定区县的综合天气信息,包括:实时天气(温度、体感、风力、湿度、天气现象、AQI等)、未来7天天气预报(每日最高/最低温度、白天/晚上天气现象及风力风向)、生活指数(晨练、穿衣、洗车等)、气象预警(如有)、未来24小时逐小时预报(温度、天气现象、风力、相对湿度、降水量等)。当用户询问天气时,优先提取区县名称(如'赤坎区'),如果用户同时提到了城市(如'湛江')和省份(如'广东'),也一并提取,以区分同名区县。")
.AddParameter("province",
"string",
"省份名称,例如:广东省、山东省。当用户提到省份时提取,用于辅助定位区县。",
False)
.AddParameter("city",
"string",
"城市名称,例如:湛江市、济南市。当用户提到城市时提取,用于辅助定位区县。",
False)
.AddParameter("district",
"string",
"区县名称,例如:赤坎区、历下区。必须提取用户明确提到的区县名,这是查询天气的核心参数。",
True)
End
With
With
caller.AddTool("get_traffic",
"查询指定城市中某条道路的实时路况信息,包括整体通行状态、语义化描述、拥堵路段详情(拥堵距离、平均车速、拥堵趋势等)。当用户询问路况、堵车、道路通行情况时使用此工具。")
.AddParameter("road_name",
"string",
"道路名称,例如:东二环、北五环、信息路。必须提取用户明确提到的道路名。",
True)
.AddParameter("city",
"string",
"城市名称,例如:北京市、上海市。必须提取用户明确提到的城市名。",
True)
End
With
caller.AddTool("get_today_date",
"获取当前系统日期,以
YYYY-MM-DD
格式返回。当用户询问今天几号、今天日期、当前日期等信息时使用此工具。无需任何参数")
Dim
ak
As
String
=
"bYDdADrPUCNkSAID9bJU70EF8Iy5htGu"
'请替换为自己的百度地图API
Key
caller.ToolExecutor =
Function(ttoolName
As
String,
targs
As
JObject)
As
String
Dim
hc
As
HttpClient =
Nothing
Select
Case
ttoolName
Case
"get_weather"
'天气查询
Dim
district
As
String
= targs("district").ToString()
'区县参数
Dim
city
As
String
=
""
Dim
province
As
String
=
""
If
targs.ContainsKey("city")
Then
city = targs("city").ToString()
'如果提供了城市名参数
If
targs.ContainsKey("province")
Then
province = targs("province").ToString()
'如果提供了省名称参数
Dim
url
As
String
=
"https://api.map.baidu.com/weather/v1/"
Dim
params
As
New
List(Of
String)
params.Add("district="
& UrlEncode(district))
If
Not
String.IsNullOrEmpty(city)
Then
params.Add("city="
& UrlEncode(city))
End
If
If
Not
String.IsNullOrEmpty(province)
Then
params.Add("province="
& UrlEncode(province))
End
If
params.Add("data_type=all")
'
获取全部数据(实时+预报+指数+预警+逐小时)
params.Add("ak="
& ak)
url &=
"?"
&
String.Join("&",
params)
hc =
New
HttpClient(url)
Case
"get_traffic"
'路况查询
Dim
road_name
As
String
= targs("road_name").ToString()
'获得路名
Dim
city
As
String
= targs("city").ToString()
'获得城市名
Dim
url
As
String
=
"https://api.map.baidu.com/traffic/v1/road?road_name="
& UrlEncode(road_name) &
"&city="
& UrlEncode(city) &
"&ak="
& ak
hc =
New
HttpClient(url)
Case
"get_today_date"
Return
Date.Now.ToString("yyyy-MM-dd")
Case
Else
Return
"未知工具:"
& ttoolName
End
Select
If
hc
IsNot
Nothing
Then
hc.SkipError =
True
Dim
ret
As
String
= hc.GetData()
If
hc.StatusCode = 200
Then
Return
ret
Else
Return
"{""StatusCode"":"
& hc.StatusCode &
",""StatusDescription"":"""
& hc.StatusDescription &
"""}"
End
If
End
If
End
Function