【高级编排】实验室预约流程使用fastgpt推荐的模型(FastAI、月之暗面等LLM)可以正确判断调用哪个工具和接口,使用智谱AI时则报错
例行检查
- [x] 我已确认目前没有类似 issue
- [x] 我已完整查看过项目 README,以及项目文档
- [x] 我使用了自己的 key,并确认我的 key 是可正常使用的
- [x] 我理解并愿意跟进此 issue,协助测试和提供反馈
- [x] 我理解并认可上述内容,并理解项目维护者精力有限,不遵循规则的 issue 可能会被无视或直接关闭
你的版本
- [ ] 公有云版本
- [x] 私有部署版本, 具体版本号: v4.8-alpha2
问题描述, 日志截图
【高级编排】实验室预约流程使用fastgpt推荐的模型(FastAI、月之暗面等LLM)可以正确判断调用哪个工具和接口,使用智谱AI时则报错
复现步骤
实验室预约,工具选择节点模型选择智谱AI,然后测试
预期结果
报错:Cannot read properties of undefined (reading 'value')
相关截图
config.josn配置文件里面好像有个配置,toolchoice,functioncalltoice。看看设置对没对
工具调用除了chatgpt以外需要 配置以下参数。
"toolChoice": false,
"functionCall": false,
"defaultConfig": {
"temperature": 0.5,
"max_tokens": 2048
}
我测试过的模型: Nvidia: meta/llama3-70b-instruct // 工具调用可以
deepseek: deepseek-chat // 工具调用不行, deepseek-coder // 工具调用可以,速度快,便宜,推荐
toolchoice,functioncalltoice 改了配置之后虽然不报错了,但是还是没办法调用工具
"toolChoice": false, "functionCall": false,
@romejiang 大佬您好,向您请教一下问题。 我用xinference部署了qwen1.5:72b、llama3:70b,使用oneapi接入了fastgpt,聊天和补全都是没问题的,但工具调用一直失败。用同样的大模型,接入dify(选择xinference模式),是可以用工具调用的。 我看您给出了配置文件的示例,"toolChoice": false, "functionCall": false, 按照官方文档对配置文件的描述,您这样配置,大模型会使用提示词模式。我测试了一下效果很差。 我尝试了这几种配置组合,工具调用都没有成功。 "toolChoice": true, "functionCall": true //one-api报错,bad_response_status_code bad response status code 400 (request id: 2024052522532778097880037127142) "toolChoice": false, "functionCall": true //工具调用有输出,是纯文本,在胡说。 "toolChoice": false, "functionCall": false//走的提示词模式,效果很差。我贴一下问答记录,我付到最后
请问有什么方法,能正常调用qwen1.5:72b、llama3:70b的工具调用能力?
官方文档对配置的介绍:
"toolChoice": true, // 是否支持工具选择(分类,内容提取,工具调用会用到。目前只有gpt支持) "functionCall": false, // 是否支持函数调用(分类,内容提取,工具调用会用到。会优先使用 toolChoice,如果为false,则使用 functionCall,如果仍为 false,则使用提示词模式),
提示词模式的报错:
System 调用多种工具,获取站点的实时水情数据,或者获取黄河大型水库实时水情信息,都需使用中文回答。 一、当用户获取站点的实时水情数据时,按以下方式执行: 1.首先检索知识库,根据站点名称,获取站址编码。 2.随后获取当前时间,根据用户输入,确定起始和终止的时间范围。 3.最后调用获取实时雨情数据工具,获取站点的实时雨情信息,当code为200时,表示接口成功调用,在返回的data数据中,ss为水势,6标示涨,5表示落,4表示平;date为时间戳,flow为流量,单位为立方米每秒;level为水位,单位为米。
二、当用户获取黄河大型水库实时水情信息时,按以下方式执行: 1.调用获取黄河大型水库实时水情信息工具,获得期望的信息,其中ennm为水库名称;date为时间戳,inflow为水库入流,单位为立方米每秒;level为水库水位,单位为米;outflow为出库流量,单位为立方米每秒 Human <Instruction> 你是一个智能机器人,除了可以回答用户问题外,你还掌握工具的使用能力。有时候,你可以依赖工具的运行结果,来更准确的回答用户。
工具使用了 JSON Schema 的格式声明,其中 toolId 是工具的 description 是工具的描述,parameters 是工具的参数,包括参数的类型和描述,required 是必填参数的列表。
请你根据工具描述,决定回答问题或是使用工具。在完成任务过程中,USER代表用户的输入,TOOL_RESPONSE代表工具运行结果。ASSISTANT 代表你的输出。 你的每次输出都必须以0,1开头,代表是否需要调用工具: 0: 不使用工具,直接回答内容。 1: 使用工具,返回工具调用的参数。
例如:
USER: 你好呀 ANSWER: 0: 你好,有什么可以帮助你的么? USER: 今天杭州的天气如何 ANSWER: 1: {"toolId":"testToolId",arguments:{"city": "杭州"}} TOOL_RESPONSE: """ 晴天...... """ ANSWER: 0: 今天杭州是晴天。 USER: 今天杭州的天气适合去哪里玩? ANSWER: 1: {"toolId":"testToolId2",arguments:{"query": "杭州 天气 去哪里玩"}} TOOL_RESPONSE: """ 晴天. 西湖、灵隐寺、千岛湖…… """ ANSWER: 0: 今天杭州是晴天,适合去西湖、灵隐寺、千岛湖等地玩。 </Instruction>
现在,我们开始吧!下面是你本次可以使用的工具:
""" [{"toolId":"qFPUK590uyiq","description":"调用“语义检索”和“全文检索”能力,从“知识库”中查找可能与问题相关的参考内容","parameters":{"type":"object","properties":{"userChatInput":{"type":"string","description":"需要检索的内容"}},"required":["userChatInput"]}},{"toolId":"c6MfNozgtABx","description":"获取用户当前时区的时间。","parameters":{"type":"object","properties":{},"required":[]}},{"toolId":"ew9xgB2gk0Vz","description":"获取黄河大型水库实时水情信息","parameters":{"type":"object","properties":{},"required":[]}},{"toolId":"eLXLEqhS013w","description":"获取站点实时水情数据","parameters":{"type":"object","properties":{"hysta":{"type":"string","description":"Hydrometric station ID"},"startDate":{"type":"string","description":"Start date and time for data retrieval"},"endDate":{"type":"string","description":"End date and time for data retrieval"}},"required":["hysta","startDate","endDate"]}}] """
下面是正式的对话内容:
USER: 查询黄河大型水库实时水情信息 ANSWER: 1:{"toolId":"ew9xgB2gk0Vz","arguments":{}} TOOL_RESPONSE: """ { "result": { "code": 200, "data": [ { "date": 1716595200000, "ennm": "龙羊峡", "ennmcd": "BDA00000011", "inflow": 830, "level": 2586.65, "outflow": 1108, "wq": 190.1 },
"toolChoice": false,
"functionCall": false,
这个选项非 openai 的接口必须设成false。所以除了openai以外,用其他LLM的API驱动工具调用,必须是“提示词模式”的。
至于效果,你可以调整系统提示词,然后就是换模型。我用的 llama3-70b-instruct 和 deepseek-coder 基本能满足我的要求。
@romejiang 感谢解答。 非openai,将functionCall设置为true,大模型不调用工具,开始胡说八道。我新提了个issue #1596 我这里纯提示词模式,效果确实不行。。。
你可以在工具调用的提示词里写:
请不要返回思考或分析的过程,只返回结果。
或者
不要输出 TOOL_RESPONSE。
工具调用的提示词是内置提示词的补充,你可以试着完善它。如果还不行,就换个模型。
还有一点,容易配错,变量需要你设置到api接口里。