目前,绝大多数小型本地开源大语言模型以及部分商用大模型接口通常不支持稳定的 tool calling 功能。现有的解决方案多为微调 LLM,但会浪费大量时间和算力。有一种新的方法,即仅使用提示词工程和精巧的代码设计,就能让 LLM 获得稳定的 tool calling 能力。
通过多个不具备 tool calling 能力的 LLM 进行实验,结果显示所有模型都能成功执行调用工具这一步,并正确输出能被正则表达式抓取的字典。但在使用 python 解释器任务上,ollama 量化版本的 llama3-8b 和 mistral-7b 模型受限于代码生成水平,不能很好地输出正确代码,导致无法稳定完成计算任务。在搜索知识图谱任务上,所有模型都能让工具返回相关知识,但 ollama 量化版本的 qwen2-7b 和 mistral-7b 模型受限于逻辑理解能力,不能稳定理解知识图谱中多个关系边之间的逻辑关系。实验证明提示词工程可让 LLM 获得 tool calling 能力,但能否利用工具返回的信息解决用户问题,仍受 LLM 自身智能水平限制,较大的模型(如 gemma2-9b)对工具返回结果的利用能力更稳定。
在大模型请求中,最大的两个变量是 Messages 和 Tools。Messages 里放的是 sys prompt、memory、user query;Tools 里放的是一些能力的 Json Scheme,两者组合形成整个完全的 Prompt。Agent 应用开发的本质是动态 Prompt 拼接,通过工程化手段将业务需求转述成新的 prompt。短期记忆是 messages 里的历史 QA 对,长期记忆是 summary 之后的文本再塞回 system prompt。RAG 是向量相似性检索,可放在 system prompt 里或通过 tools 触发检索。Action 是触发 tool_calls 标记,进入请求循环,拿模型生成的请求参数进行 API request,再把结果返回给大模型进行交互,没有 tool_calls 标记则循环结束。Multi Agents 则是更换 system prompt 和 tools。当然,想做深做好肯定还有很多坑需要踩。
大家好,我是一个开源项目作者ailm。目前,绝大多数小型本地开源大语言模型以及部分商用大模型接口都不支持稳定的tool calling功能。而现有的解决方案是微调LLM,这导致大量的时间和算力被浪费。本文提出一种仅使用提示词工程和一些精巧的代码设计,即可让LLM获得稳定的tool calling能力。本文使用多个不具备tool calling能力的LLM作为测试模型,在多个工具调用任务上进行实验,成功率为100%。本文所有工作是基于comfyui开发,适合完全没有代码基础的小伙伴们复现并且按自己的想法修改我的工作。
表格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模型给出了正确的实时天气信息。
其实只要看过官方文档的应该都能知道,大模型请求中,最大的两个变量:Messages和Tools。Messages里面放的是sys prompt,memory,user query;Tools里面放的是一些能力的Json Scheme;而这两者组合在一起,就形成整个完全的Prompt。所以Agent应用开发的本质是什么?动态Prompt拼接。通过工程化的手段,不断把业务需求转述成新的prompt。短期记忆:messages里的历史QA对;长期记忆:summary之后的本文,再塞回system prompt;RAG是啥?向量相似性检索,然后放在system prompt里或者通过tools触发检索Action:触发tool_calls标记,进入请求循环,拿模型生成的请求参数进行API request,再把结果返回给大模型进行交互;没有tool_calls标记了,循环结束。对应页面上就是对话一轮对话结束。Multi Agents是啥?把system prompt和tools换一换,A就变成B了。还有啥?没了呀,本质就是这些东西。当然,这也就是最基本的原理,想做深,做好,肯定还有很多坑需要踩。