vllm/vllm-ascned 多轮工具调用失败问题分析与解决
·
作者:昇腾实战派
背景概述
在使用vllm/vllm-ascned进行多轮工具调用时,遇到了调用失败的问题。本文将详细描述问题现象、初步定位、根因分析及解决方案,帮助开发者解决类似问题。
问题现象
在使用vllm/vllm-ascned进行多轮工具调用时,发现调用失败。具体表现为,通过官方API和NV部署API测试通过,但在昇腾部署API测试时失败。以下是一个具体的测试用例:
curl --location --request POST 'http://127.0.0.1:8004/v1/chat/completions'
--header 'Authorization: Bearer 1111'
--header 'Content-Type: application/json'
--data-raw '{
"model": "deepseekv3_1",
"messages": [
{
"content": "---\nCURRENT_TIME: 2026-04-03 09:03:59\n---\n\n你是铁矿石行业的researcher代理。你致力于使用工具确保Description中明确指定要收集的数据内容进行彻底的调查,并通过系统地使用工具提供全面的解决方案。\n\n# 可用工具\n\n1. 动态加载的工具:根据配置,可能提供的其他工具。这些工具是动态加载的,将出现在你的可用工具列表中。示例包括:\n - fetch_data 历史数据查询工具(价格等结构化数据)\n - fetch_news 新闻舆情搜索工具(市场动态、事件、政策、专业分析师文章等文字信息)\n - model_choice、model_predict 预测模型选择工具、执行模型预测工具(先选择合适的模型,再调用模型预测)\n - fetch_knowledge 基础知识查询工具(包含相关的含义、概念、基础逻辑等资料)\n - 以及许多其他工具\n\n## 如何使用动态加载的工具\n- 问题分解:将问题按要点分解,分多次调用工具,逐步收集信息。\n- 工具选择:为每个子问题选择最合适的工具。\n- 工具文档:在使用工具之前仔细阅读工具文档。注意必需参数和预期输出。\n- 工具参数:结合研究的方向,传入符合用户预期的参数,尽可能的将用户需求拆解,分多次调用工具。\n- 错误处理:如果工具返回错误,尝试理解错误消息并相应调整传入的参数,如果调整失败,可以尝试先跳过。\n- 组合工具:通常,最好的结果来自于组合多个工具。\n- 预期偏离:如果工具的输出与预期不符,可以尝试选择不同的工具,或分析输出理解偏离的原因,并相应调整工具参数,相同问题最多不超过2次。\n\n## 例如:\n- 如果用户的问题是关于某个市场的当前动态,你可能需要使用fetch_news工具来获取最新的新闻和分析。\n- 如果用户的问题涉及历史价格数据,你可能需要使用fetch_data工具来获取相关的结构化数据。\n- 如果用户的问题需要对未来趋势进行预测,你可能需要使用model_choice工具来选择合适的预测模型,然后使用model_predict工具来执行预测。\n- 如果用户的问题涉及多个方面,如:市场动态、供需变化、政策调整及国际贸易情况等,你需要先调查市场动态,再调查供需变化,再调查政策调整,最后调查国际贸易情况,每个方面都要分开调用工具进行调查,而不是一次性调用工具试图获取所有信息。\n\n# 步骤\n\n1. 理解问题:忘记你之前的知识,仔细阅读Description以识别所需的关键信息。\n2. 问题分解:将问题分解成更小、更可管理的部分,以便更系统地使用工具进行调查。\n3. 评估可用工具:注意你可用的所有工具,包括任何动态加载的工具。\n4. 规划解决方案:确定使用可用工具解决问题的最佳方法。\n5. 执行解决方案:\n - 忘记你之前的知识,所以你应该利用工具来检索信息。\n - 强制要求:在研究开始时必须使用工具至少执行一次搜索。这不是可选项。\n - 当任务包括时间范围要求时:\n - 根据当前时间和用户问题,确定适当的时间范围。\n - 在查询中纳入适当的基于当前时间的搜索参数(如\"xx年\"、\"xx月\"或特定日期范围)\n - 确保搜索结果尊重指定的时间约束。\n - 注意特定工具对时间范围的支持,比如fetch_data、fetch_news工具仅支持查询截至当前时间的历史数据,需要预测未来数据时,必须使用model_choice和model_predict工具。\n6. 尽职调查:确保Description中明确指定要收集的数据内容都已收集完毕。\n7. 合成总结:\n - 合并总结所有使用工具收集的信息或数据,永远不虚构或假设信息或数据,数据回复必须与用户指定的地域、行业、口径完全一致,禁止用省份数据冒充全国数据、用局部数据冒充整体数据;查不到完全匹配数据时如实告知,不得替换或编造。\n - 合并总结时指出哪些是用户希望但没有获取到的信息或数据。\n - 所有行业指标名称必须使用行业标准名称输出,不得自己编造。\n - 只总结与用户问题有直接关系的信息或数据,无关的可直接忽略,只回答用户明确提问的问题,未提及的问题即使查询到也禁止输出,不主动补充、不夹带无关数据、不扩展额外指标。\n - 文字信息通常是动态的,可能会随着时间的推移而变化,因此在合成信息时要特别注意时间敏感性,标注发生时间。\n - 价格数据要标注指标、周期、计价方式,禁止只给数字或数据维度模糊。\n - 价格对比时默认使用同比、环比,如有特殊对比时需注明。\n - 价格分析聚焦主力合约、主流品种,非重点标的(非主力 / 非主流)不作为核心分析依据,不优先展示。\n - 当数据非常多时,无需全部展示,总结数据特征,并说明数据的总体趋势或分布情况。\n\n# 输出格式\n\n- 提供结构化的markdown格式响应。\n- 包括以下部分:\n - 问题陈述:重新表述问题以获得清晰度。\n - 研究发现:按使用工具获取的数据或信息组织你的发现。对于每个主要发现:\n - 总结关键信息\n - markdown格式的数据值表格(如果适用)\n - 包括来自工具调用结果中的相关图表或图像(遵循可视化图表指南中的要求)\n - 结论:基于收集的信息提供问题的综合响应。\n- 直接输出完整的Markdown格式报告内容,不要包含任何markdown代码块标记。\n- 始终以中文的语言输出。\n\n# 可视化图表指南\n- 工具调用结果中存在以下格式的图像或图表时,在总结部分中包括它们很有帮助。\n- 将图像或图表放在合适的位置,以增强相关内容的理解。\n- 图表格式示例:\n- 图片格式示例:\n- 其中'![chart_tool]'为特殊占位符,不要修改其中的内容。\n- 如果工具调用结果中没有图像或图表,则忽略该指南输出中不要包含任何图像或图表。\n- ``仅为示例,不要输出。\n\n# 注意\n\n- 关键要求:绝对不能自己编造信息或数据。所有信息或数据必须来自之前工具调用的结果。这是强制要求。\n- 强制要求:始终使用工具检索。不要依赖你的内部知识。\n- 不要进行任何数学运算或文件操作。\n- 不要执行任何数学计算。\n- 不要尝试任何文件操作。\n- 始终使用中文的语言进行输出。\n- 当任务中指定了时间范围要求时,严格遵守这些约束条件在搜索查询中,并验证所有提供的信息都在指定的时间段内。\n- 当告诉你Tool call limit exceeded时,立马停止搜索,开始信息合成",
"role": "system"
},
{
"content": "# Original Topic\n\n国内铁矿石主力合约是哪些,包括具体合约代码、交易所以及相关信息\n\n# Research Topic\n\n获取国内铁矿石主力合约信息\n\n# Current Step\n\n## Title\n\n数据收集\n\n## Description\n\n收集当前国内主要交易所的铁矿石主力期货合约品种和代码信息。\n\n## Locale\n\nzh-CN",
"role": "user"
},
{
"content": "我将帮您收集国内铁矿石主力合约的相关信息。让我先搜索相关的期货合约数据。",
"name": "deepresearch",
"role": "assistant",
"tool_calls": [
{
"type": "function",
"id": "chatcmpl-tool-b69d0bc01294feee",
"function": {
"name": "fetch_data",
"arguments": "{\"query\": \"国内铁矿石主力期货合约品种和代码\", \"start_time\": \"2025-01-01\", \"end_time\": \"2026-04-03\", \"frequency\": \"日度\", \"task_id\": null}"
}
}
]
},
{
"content": "未检索到信息",
"role": "tool",
"tool_call_id": "chatcmpl-tool-b69d0bc01294feee"
}
],
"max_tokens": 4096,
"stream": false,
"tools": [
{
"type": "function",
"function": {
"name": "fetch_data",
"description": "Powered by 'xmschain-mcp-tools'.\n历史数据查询工具,起始和截至日期需要结合需求和当前时间判断填入。如果需要未来日期的预测数据应当使用预测模型工具进行预测",
"parameters": {
"properties": {
"query": {
"description": "需查询数据的详细文字描述,组合问题需拆分后分多次检索",
"type": "string"
},
"start_time": {
"description": "数据起始日期,格式:YYYY-MM-DD",
"type": "string"
},
"end_time": {
"description": "数据截至日期,格式:YYYY-MM-DD",
"type": "string"
},
"frequency": {
"description": "数据频率,例如:日度、周度、月度、季度、半年度、年度",
"type": "string"
},
"task_id": {
"anyOf": [
{},
{
"type": "null"
}
],
"description": "任务id,无需关注, 不需要传递此参数"
}
},
"required": [
"query",
"start_time",
"end_time",
"frequency",
"task_id"
],
"type": "object"
}
}
},
{
"type": "function",
"function": {
"name": "model_choice",
"description": "Powered by 'xmschain-mcp-tools'.\n根据用户预测需求,返回一个可用的预测模型",
"parameters": {
"properties": {
"query": {
"description": "进行未来预测的详细描述,包含预测的目标名称、频度(日度、周度、月度、季度、年度), 仅支持价格、供应、需求等方面。例如:预测未来液态铁的周度数据",
"type": "string"
},
"task_id": {
"anyOf": [
{},
{
"type": "null"
}
],
"description": "任务id,无需关注, 不需要传递此参数"
}
},
"required": [
"query",
"task_id"
],
"type": "object"
}
}
},
{
"type": "function",
"function": {
"name": "model_predict",
"description": "Powered by 'xmschain-mcp-tools'.\n调用预测模型进行预测",
"parameters": {
"properties": {
"plan_id": {
"description": "根据model_choice工具选择的planId参数",
"type": "integer"
},
"real_time": {
"description": "选择是否实时运行。用户明确指明使用实时预测时使用True,否则为False",
"type": "boolean"
},
"task_id": {
"anyOf": [
{},
{
"type": "null"
}
],
"description": "任务id,无需关注, 不需要传递此参数"
}
},
"required": [
"plan_id",
"real_time",
"task_id"
],
"type": "object"
}
}
},
{
"type": "function",
"function": {
"name": "fetch_knowledge",
"description": "Powered by 'xmschain-mcp-tools'.\n基础知识,包含相关的含义、概念、基础逻辑等资料。起始和截至日期需要结合需求和当前时间判断填入。",
"parameters": {
"properties": {
"query": {
"description": "所需信息的问题描述",
"type": "string"
},
"start_time": {
"description": "搜索起始日期,格式:YYYY-MM-DD",
"type": "string"
},
"end_time": {
"description": "搜索截至日期,格式:YYYY-MM-DD",
"type": "string"
},
"task_id": {
"anyOf": [
{},
{
"type": "null"
}
],
"description": "任务id,无需关注, 不需要传递此参数"
}
},
"required": [
"query",
"start_time",
"end_time",
"task_id"
],
"type": "object"
}
}
},
{
"type": "function",
"function": {
"name": "fetch_news",
"description": "Powered by 'xmschain-mcp-tools'.\n新闻舆情知识库搜索工具,知识范围包含相关行业动态、新闻舆情、背景信息、参考资料或上下文证据等。\n起始和截至日期需要结合需求和当前时间判断填入,最小7天。",
"parameters": {
"properties": {
"query": {
"description": "所需信息的问题描述",
"type": "string"
},
"start_time": {
"description": "搜索起始日期,格式:YYYY-MM-DD",
"type": "string"
},
"end_time": {
"description": "搜索截至日期,格式:YYYY-MM-DD",
"type": "string"
},
"task_id": {
"anyOf": [
{},
{
"type": "null"
}
],
"description": "任务id,无需关注, 不需要传递此参数"
}
},
"required": [
"query",
"start_time",
"end_time",
"task_id"
],
"type": "object"
}
}
}
]
}'
vllm后端报错日志如下:

问题定位
-
初步原因:多个function call解析报错。
-
代码bug描述:
- 代码显示目标48行字符串拼接错误。
-
function call模板查看:

-
根因分析:多轮调用时,输出为字典,无法与字符串直接拼接。
解决方案
-
官方API无报错:官方API和NV部署API测试通过,说明问题可能出在昇腾部署API的特定实现上。
-
查看官方模板:
-
替换测试:将昇腾部署API的模板替换为官方模板,问题解决。
通过以上步骤,成功解决了多轮工具调用失败的问题。希望本文能帮助遇到类似问题的开发者快速定位并解决问题。
更多推荐



所有评论(0)