llama.cpp 跑通 Qwen2.5 工具调用:从启动到自查的完整指南
【免费下载链接】llama.cppLLM inference in C/C++项目地址: https://gitcode.com/GitHub_Trending/ll/llama.cpp
llama.cpp 支持 OpenAI 风格接口,本文演示如何为 Qwen2.5 开启工具调用(Tool Calling):用--jinja加载聊天模板,启动 llama-server,发一条带tools的请求,再核对tool_calls输出,全程四步。
先定目标:一次成功的工具调用长什么样
先明确验证锚点。一次成功的工具调用,输入和输出分别长这样:
| 方向 | 字段 | 内容 |
|---|---|---|
| 输入 | messages | 对话消息,例如「北京今天天气怎么样?」 |
| 输入 | tools | 工具定义数组:函数名、描述、参数 schema |
| 输出 | message.tool_calls | 非空数组,元素含name和arguments |
| 输出 | finish_reason | 值为tool |
只要响应里tool_calls非空,链路就算跑通。反过来,如果tool_calls为空、而content里是「北京今天晴,适合出行」这类自然语言回答,说明模型没进入工具调用模式,问题通常出在模板上。
一个关键机制:--jinja 与聊天模板为什么决定成败
llama-server 收到请求后,要把messages和tools拼成模型能理解的提示词,这一步靠聊天模板完成。--jinja让服务端启用 Jinja 模板引擎渲染,Qwen2.5 的模板原生带工具调用格式,服务端识别后会走 Qwen 的工具调用解析器,把模型输出还原成标准tool_calls结构。模板没配对,tools会被忽略,模型退回普通聊天模式,用文字"描述"调用——这是绝大多数踩坑的根源。显式带上--jinja可以排除版本默认差异:新版本默认已启用,但写出来更稳。你启动后访问http://localhost:8080/props,确认chat_template与chat_template_tool_use有值,即可判定当前模板可用。
分步实操:最快启动方式与第一条带 tools 的请求 🛠️
- 准备模型:拿到一份 Qwen2.5 Instruct 版 GGUF 文件,例如
Qwen2.5-7B-Instruct-Q4_K_M.gguf。Base 版不要选,它没做过指令对齐。 - 启动 llama-server:
llama-server --jinja -fa -m Qwen2.5-7B-Instruct-Q4_K_M.gguf --port 8080-fa开启 Flash Attention,降低内存占用;--port可按需修改。
- 发一条带
tools的请求:
curl http://localhost:8080/v1/chat/completions -d '{ "model": "qwen2.5", "messages": [{"role": "user", "content": "北京今天天气怎么样?"}], "tools": [{"type": "function", "function": { "name": "get_current_weather", "description": "Get the current weather in a given location", "parameters": {"type": "object", "properties": { "location": {"type": "string"} }, "required": ["location"]} }}] }'- 核对输出:
finish_reason应为tool,tool_calls里应有name: get_current_weather,arguments是一段 JSON 字符串,例如{"location": "Beijing, China"}。到这里,工具调用就跑通了。
自查清单:tool_calls 为空时按顺序排查 📋
| 顺序 | 检查点 | 怎么处理 |
|---|---|---|
| 1 | 启动时是否带了--jinja | 没带会直接报 "tools param requires --jinja flag",加上后重启 |
| 2 | 模板是否支持工具 | 查props里的chat_template_tool_use;缺失时用--chat-template-file指定模板,或退回--chat-template chatml |
| 3 | 请求体里tools是否真的传了 | 必须位于 body 顶层、且是非空数组,漏传或拼错位置都不生效 |
| 4 | 是否开了极端的 KV 量化 | 如-ctk q4_0,会明显拉低工具调用成功率 |
| 5 | 模型版本是否合适 | Base 版、部分蒸馏模型倾向不调用工具,换 Instruct 版再验证 |
按顺序查完仍为空,把完整响应拿出来比对:正常调用时content应为null,若它是自然语言,多半回到第 2 项。
收尾:下一步
跑通单工具后,你可以往tools里加第二个函数,或在请求体传"parallel_tool_calls": true试多工具并行。完整的原生支持模型清单与模板对照表,见 docs/function-calling.md。
【免费下载链接】llama.cppLLM inference in C/C++项目地址: https://gitcode.com/GitHub_Trending/ll/llama.cpp
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考