修复 vLLM 中的工具调用准确性
所有博客文章 2026年10月20日 · 8分钟阅读 Jesse Donkervliet 和 Junhao Li 高级软件工程师 当我使用开放权重模型时,我看到的结果与质量基准指示的相距甚远。如今,身为 AI 模型的软件开发者,工具调用准确性是服务开放权重模型的重要组成部分。当你的工具调用不准确时,模型会构建出毫无意义的上下文。这导致低质量的结果,尤其是在多轮会话普遍存在的代理工作负载中。遗憾的是,许多提供商和广泛使用的推理引擎并没有完全通过工具调用准确性测试。例如,当我们使用 vLLM 版本 0.28 服务 Kimi K2.6 时,期望的工具调用模式仅出现 92% 的时间。换句话说,每 25 次尝试的工具调用中有 2 次失败。幸运的是,vLLM 最近新增了对约束解码的支持,这是一种保证模式遵循的技术。此功能已在 vLLM 0.31 中作为服务器端标志发布。通过启用它,您可以在较新的 Kimi 和 DeepSeek 模型中实现 100% 的模式准确性。在这篇博客文章中,我们首先描述工具调用模式准确性以及它在服务代理工作负载中的重要性。然后,我们讨论约束解码以及它如何修复模式准确性问题。 工具调用模式 您可以通过两个步骤使 LLM 调用外部工具:(1) 通知 AI 模型可用的外部工具调用的存在,以及 (2) 向模型提供如何输出结构化工具调用的说明。例如,在将 OpenCode 连接到 Kimi 时,OpenCode 向 Kimi 发送一个描述可用工具的 JSON 数组。这个列表中的一个工具是 webfetch,用于获取网页内容:[{ "type" : "function" , "function" : { "name" : "webfetch" , "description" : "- 从指定 URL 获取内容\n- 以 URL 和可选格式为输入\n- 获取 URL 内容,转换为请求的格式(默认为 markdown)\n- 以指定格式返回内容\n- 当您需要检索和分析网页内容时使用此工具\n\n使用注意事项:\n [内容已编辑以简洁] \n" , "parameters" : { "$schema" : "https://json-schema.org/draft/2020-12/schema" , "type" : "object" , "properties" : { "url" : { "type" : "string" , "description" : "要获取内容的 URL" }, "format" : { "type" : "string" , "enum" : [ "text" , "markdown" , "html" ], "description" : "以何种格式返回内容(文本、markdown 或 html)。默认为 markdown。" , "default" : "markdown" }, "timeout" : { "type" : "number" , "description" : "可选超时(秒)(最大 120)" } }, "required" : [ "url" ] } } }, ...] 推理引擎随后将此 JSON 描述包装在 LLM 特定的标记中,然后再将其传递给 LLM,以匹配 LLM 被训练时识别工具声明的方式。服务 Kimi 时,这看起来像:<|im_system|>tool_declare<|im_middle|>[{ "type" : "function" , "function" :{...}, ...]<|im_end|> 描述工具(或上面的 JSON 中的函数)的 JSON 对象包括工具的参数、它们的类型、哪些参数是必需的等等。这被称为工具的模式。为了使一个代理工具(例如,OpenCode)成功执行 LLM 生成的工具调用,调用必须遵循其模式中指定的规则。然后,当用户通过他们的代理工具请求获取网页时,LLM 可能会输出以下标记:我将获取该页面。<|tool_calls_section_begin|><|tool_call_begin|>functions.webfetch: 0 <|tool_call_argument_begin|>{ "url" : "https://ubicloud.com" , "format" : "markdown" }<|tool_call_end|><|tool_calls_section_end|> 这些标记由推理服务器的解析器解析,提取 LLM 特定的标记并将调用转换为 JSON 对象,例如:{ "role" : "assistant" , "content" : "我将获取该页面。" , "tool_calls" : [ { "id" : "functions.webfetch:0" , "type" : "function" , "function" : { "name" : "webfetch" , "arguments" : "{\"url\": \"https://example.com\", \"format\": \"markdown\"}" } } ] } 这随后被发送回您的工具(在本示例中为 OpenCode),它运行其 webfetch 工具并将其输出发送回模型。 模式准确性的重要性 要使工具调用成功,调用必须符合工具的模式。工具调用的简单方法是让模型自由生成工具调用,并相信模型的训练足以生成正确的调用。这与我们信任模型生成语法正确的散文类似。简单的方法大多数时间都有效,因为现代模型擅长遵循结构化模式。但是,“大多数时间成功”意味着许多工具调用仍可能失败,从而导致由于错误信息而造成的上下文窗口污染、模型性能降低以及由于代理不得不重试一次或多次调用而导致的成本增加。为了避免在使用 Kimi 时遇到这种体验,Moonshot AI 发布了他们的 K2VV ToolCall 基准。
阅读全文 →本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡