AI是如何选择工具的
在进一步学习AI工具定义之前,我们有必要先了解一下AI是如何选择工具的,这样才能设计出更好用的AI工具。
AI如何决定调哪个工具?
工具和参数的描述(description)极为重要,AI要根据工具的描述选择合适的工具(一般会定义多个工具)。
例如假定我们定义了三个工具:
caller.AddTool("get_weather",
"获取指定城市的天气信息")
caller.AddTool("search_customer",
"在客户数据库中搜索客户")
caller.AddTool("get_current_time",
"获取当前日期和时间")
如果用户问:“今天北京的天气怎么样?”
AI 看到 get_weather 的描述里有关键词 “天气”,而其他工具的描述里没有,于是选择调用 get_weather
如果用户问:“帮我查一下客户张三的电话。”
AI 看到 search_customer 的描述里有关键词 “客户”,于是选择调用 search_customer。
通过参数进行二次确认
如果两个工具名字和描述都很像,AI 还会通过参数结构来二次确认,例如下面两个工具的描述非常相近:
With
caller.AddTool("query_weather",
"获取指定城市的天气信息")
.AddParameter("city",
"string",
"城市名称,如:北京、上海、广州",
True)
End
With
With caller.AddTool("query_aqi",
"查询指定城市的空气质量")
.AddParameter("city",
"string",
"城市名称,如:北京、上海、广州",
True)
.AddParameter("hour",
"integer",
"查询的小时(0-23),不传则返回当前小时的数据")
End
With
如果用户问“北京现在的空气质量怎么样?”,AI 会发现:
query_weather工具的参数只有city,和问题中的"现在"不是很匹配,且工具描述为"查询天气",而用户问题中提到了“空气质量”,也不是很匹配。
query_aqi 工具多了个 hour 参数,根据参数名和参数描述可知这是用于指定时间的,且工具描述为"查询空气质量",更匹配问题中的"现在"和"空气质量"这个场景。
于是AI决定调用query_aqi工具,如果没有query_aqi工具,则会退而求其次,调用query_weather工具。
定义工具的时候,参数的名称要有意义,而且要有具体描述,能有利于AI准确匹配工具和生成参数。
更具体的描述
为了让AI能更准确地选择工具,可以进行更具体的描述,例如:
Dim
caller
As
New
LLMCaller("https://api.deepseek.com/chat/completions",
"deepseek-flash",
"sk-a734b83536da45e9aedc3e42605bfb3a")
With
caller.AddTool("get_weather",
"获取指定城市指定时间的综合天气数据,包括温度、湿度、风速、降水概率等。用户问'天气怎么样'时用这个")
.AddParameter("city",
"string",
"城市名称,如:北京、上海、广州",
True)
.AddParameter("hour",
"integer",
"查询的小时(0-23),不传则返回当前小时的数据")
End
With
With
caller.AddTool("get_temperature",
"仅获取指定城市指定时间的实时温度数值(摄氏度),不返回其他信息。用户问'多少度'或'热不热'时用这个。")
.AddParameter("city",
"string",
"城市名称,如:北京、上海、广州",
True)
.AddParameter("hour",
"integer",
"查询的小时(0-23),不传则返回当前小时的数据")
End
With
不管是工具的描述,还是参数的描述,都应该尽可能准确具体一些,帮助AI快速匹配到合适的工具。
AI如何生成参数值
如果用户定义了一个工具:
With
caller.AddTool("query_weather",
"获取指定城市的天气信息")
.AddParameter("city",
"string",
"城市名称,如:北京、上海、广州",
True)
End
With
这相当于告诉AI:“我有一个工具叫 query_weather,它需要一个参数叫 city,类型是字符串,描述是城市名称。”
当用户说“今天北京的天气怎么样?”时,AI 会:
|
步骤 |
AI 做什么 |
|---|---|
| 1. 分析用户问题 | 提取关键信息:“北京”、“天气” |
| 2. 查看工具参数结构 | 知道需要填一个 city 字段,类型是 string |
| 3. 匹配信息到参数 | 将“北京”填入 city |
| 4. 生成 JSON | {"city": "北京"} |
如果工具需要多个参数,AI 会从用户问题中提取多个信息,例如用户定义了一个工具:
With
caller.AddTool("send_email",
"发送一封电子邮件给指定收件人,支持设置主题和正文内容。当用户需要写信、发邮件、通知他人时使用此工具")
.AddParameter("to",
"string",
"收件人姓名或邮箱地址,如:张三
或
zhangsan@company.com",
True)
.AddParameter("subject",
"string",
"邮件主题,应简洁概括邮件内容,如:项目汇报、会议通知")
.AddParameter("body",
"string",
"邮件正文内容,应清晰完整,包含所有必要信息")
End
With
如果用户说:"帮我写一封邮件给张总,告诉他明天下午3点开会,主题是项目汇报。"
AI 推理过程:
1. 用户说“给张总”→“to”参数填“张总”
2. 用户说“主题是项目汇报”→“subject”参数填“项目汇报”
3. 用户说“明天下午3点开会”→“body”参数填“明天下午3点开会”
4. 生成:{"to": "张总", "subject": "项目汇报", "body": "明天下午3点开会"}
再例如对于下面的工具:
With
caller.AddTool("search_products",
"根据产品名称、分类和价格范围筛选产品")
.AddParameter("keyword",
"string",
"产品名称关键词")
.AddParameter("category",
"string",
"产品分类")
.AddParameter("min_price",
"number",
"最低价格")
.AddParameter("max_price",
"number",
"最高价格")
End
With
如果用户说:“帮我找一下价格在 100 到 500 之间的电子类产品,关键词是耳机。”
AI 推理后生成的参数为:{"keyword": "耳机", "category": "电子", "min_price": 100, "max_price": 500}