分享
无需微调,仅用提示词工程就能让 LLM 获得 tool calling 的功能
输入“/”快速插入内容
无需微调,仅用提示词工程就能让 LLM 获得 tool calling 的功能
用户4392
用户4392
用户2926
用户2926
2024年8月1日修改
大家好,我是一个开源项目作者 ailm。目前,绝大多数小型本地开源大语言模型以及部分商用大模型接口都不支持稳定的 tool calling 功能。而现有的解决方案是微调 LLM,这导致大量的时间和算力被浪费。本文提出一种仅使用提示词工程和一些精巧的代码设计,即可让 LLM 获得稳定的 tool calling 能力。本文使用多个不具备 tool calling 能力的 LLM 作为测试模型,在多个工具调用任务上进行实验,成功率为 100%。本文所有工作是基于 comfyui 开发,适合完全没有代码基础的小伙伴们复现并且按自己的想法修改我的工作。
效果展示
1、实验任务
本文以目前主流的小型开源模型 llama3-8b、gemma2-9b、qwen2-7b、mistral-7b 的 ollama 量化版本作为测试模型,将如下调用工具作为测试任务,并以不同的提问方式测试 10 次:
1.
查询不同时区的实时时间;
2.
查询不同地点的实时天气;
3.
谷歌搜索相关信息后回答最近发生的事情;
4.
使用 python 解释器计算数学问题;
5.
搜索本地文件信息回答问题;
6.
查询 arxiv 上的相关论文;
7.
搜索本地知识图谱回答问题。
2、实验设备及平台
测试使用的设备为 nvidia 的 GeForce RTX 4080,搭建智能体的平台为笔者 ailm 自己开发的开源项目:
https://github.com/heshengtao/comfyui_LLM_party
该项目已经在 github 上开源。如果需要快速复现本文的成果可以下载该项目做测试。
3、实验结果
表格 1 为多个模型在多个 tool calling 任务下的使用本文提出的提示词工程后调用工具的成功次数。对于不使用提示词注入方法的模型,工具信息会以 tool 接口传入这些模型,但是由于这些模型不支持 tool calling 功能,所以不可能会调用这些 tool。
表格 1 使用提示词工程后调用工具的成功次数表
任务
llama3-8b
gemma2-9b
qwen2-7b
mistral-7b
查询实时时间
10
10
10
10
查询实时天气
10
10
10
10
谷歌搜索
10
10
10
10
python 解释器
1
10
10
2
搜索本地文件
10
10
10
8
查询 arxiv
10
10
10
10
搜索知识图谱
10
10
1
1
表格 1 中,所有模型都能成功执行调用工具这一步,正确输出了能被正则表达式抓取的字典,但是受限于代码生成水平限制,在使用 python 解释器任务上,ollama 量化版本的 llama3-8b 和 mistral-7b 模型不能很好地输出正确的代码,导致无法稳定的完成计算任务。在搜索知识图谱任务上,所有模型都成功让工具返回了相关的知识,但是受限于逻辑理解能力限制,ollama 量化版本的 qwen2-7b 和 mistral-7b 模型不能稳定地理解知识图谱中多个关系边之间的逻辑关系。该实验结果证明,提示词工程可以让完全不具备 tool calling 能力的 LLM 获得 tool calling 能力,但是能否真正利用上工具返回的信息,从而解决用户的问题,还是受限于 LLM 自身的智能水平,在较大的模型(gemma2-9b)上,对工具返回的结果的利用能力明显更加的稳定。
下图为 gemma2-9b 调用天气工具时的输出结果:
当不使用提示词工程时,图中 is_tools_in_sys_prompt 属性为 disable,gemma2-9b 模型的接口直接拒绝了 tool 输入。
当使用提示词工程时,图中 is_tools_in_sys_prompt 属性为 enable,gemma2-9b 模型给出了正确的实时天气信息。