news 2026/4/23 13:49:05

【实战踩坑】大模型多轮对话中 Function Calling 失效?原来是上下文(Context)管理出了锅!

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【实战踩坑】大模型多轮对话中 Function Calling 失效?原来是上下文(Context)管理出了锅!

大模型 Function Calling 避坑:当你的 AI 助手“光说不练”时

前言

在开发基于大模型(LLM)的智能助手时,Function Calling(工具调用)是连接模型与外部世界的核心能力。最近在调试一个控制设备音量的场景时,遇到一个非常诡异的 Bug:

  • 第一轮对话:用户说“声音大一点”,模型准确识别并调用了set_volume工具,执行成功。
  • 第二轮对话:用户接着说“声音调小一点”,模型却不再调用工具,而是直接回复了一句“好的,明白”,导致设备没有任何反应。

经过深入排查,发现问题的根源竟然在于对话历史(Context)的构建方式。本文将记录这次排查过程及正确的解决方案,希望能帮大家避坑。


问题复现

场景描述

我正在开发一个语音助手,支持通过自然语言控制音量。

错误的历史记录构建

为了“节省 Token”或者图省事,在第一轮工具调用结束后,我在构建传给模型的 messages 历史时,手动修改了 Assistant 的回复

我构建的(错误的)历史记录:

[{"role":"user","content":"声音大一点"},{"role":"assistant","content":"好的,已为您调大音量。"}// ❌ 错误:这里丢失了 tool_calls 信息,被我替换成了纯文本]

结果
当用户进行第二轮提问“声音调小一点”时,模型看到上面的历史记录,它“学到”了一个规律:“在这个对话里,当用户要求调音量时,我只需要口头答应,不需要真的去调工具。”

这就是大模型的上下文学习(In-Context Learning)能力带来的副作用。模型被我伪造的历史记录误导了。


核心原因分析

大模型是基于“预测下一个 token”的机制工作的。它会极度依赖 messages 列表中的上下文模式。

  • 正确的模式:用户提问 -> 助手发起tool_calls-> tool 返回结果 -> 助手总结。
  • 错误的模式:用户提问 -> 助手直接回复文本(Content)。

如果我们在历史记录中抹去了tool_calls的痕迹,模型就会认为自己从未调用过工具,从而在后续对话中倾向于生成纯文本回复,导致 Function Calling 失效。


解决方案:标准的 Function Calling 链路

要解决这个问题,必须如实记录之前的工具调用过程。一个完整的工具调用闭环在 messages 中必须包含以下 4 个步骤:

  1. User: 提出需求。
  2. Assistant: 返回tool_calls字段(此时content通常为null)。
  3. Tool: 客户端执行代码,以role: tool返回执行结果。
  4. Assistant: 根据工具结果生成的最终回复。

正确的 JSON 结构示例

发给 API 的 Request Body 应该长这样:

{"messages":[{"role":"system","content":"你是一个智能硬件助手..."},// --- 第一轮 ---{"role":"user","content":"声音大一点"},// 关键点1:保留带有 tool_calls 的 assistant 消息{"role":"assistant","content":null,"tool_calls":[{"id":"call_abc123","type":"function","function":{"name":"set_volume","arguments":"{\"volumeCode\": \"volume_up\"}"}}]},// 关键点2:必须追加 tool 类型的消息,传入对应的 call_id 和执行结果{"role":"tool","tool_call_id":"call_abc123","content":"success"},// 助手对第一轮的总结{"role":"assistant","content":"好的,音量已调大。"},// --- 第二轮 ---{"role":"user","content":"声音调小一点"}// 此时模型看到上面发生过 tool_calls,这次它就会继续触发 tool_calls]}

代码实现 (Python)

下面是一个模拟正确构建对话历史的 Python 代码示例:

importjson# 模拟工具定义tools=[{'type':'function','function':{'name':'set_volume','description':'调整设备音量','parameters':{'type':'object','properties':{'volumeCode':{'type':'string','enum':['volume_up','volume_down']}},'required':['volumeCode']}}}]# 初始化对话历史messages=[{'role':'system','content':'你是一个全能AI助理,可以控制设备音量。'}]# --- 第一轮交互 ---print(">>> User: 声音大一点")messages.append({'role':'user','content':'声音大一点'})# 假设这里调用了大模型 API,模型返回了 tool_calls# 模拟模型返回的数据结构response_msg={"role":"assistant","content":None,"tool_calls":[{"id":"call_123456","type":"function","function":{"name":"set_volume","arguments":"{\"volumeCode\": \"volume_up\"}"}}]}# 【关键步骤】:将模型返回的原始消息(含 tool_calls)加入历史messages.append(response_msg)# 客户端执行工具逻辑...tool_output="Volume turned up successfully"tool_call_id=response_msg["tool_calls"][0]["id"]# 【关键步骤】:将工具执行结果以 role='tool' 加入历史messages.append({"role":"tool","tool_call_id":tool_call_id,"content":tool_output})# 模型根据工具结果给出的反馈final_feedback={'role':'assistant','content':'好的,声音已经调大了。'}messages.append(final_feedback)# --- 第二轮交互 ---print(">>> User: 声音调小一点")messages.append({'role':'user','content':'声音调小一点'})# 打印最终发送给模型的 Messages 结构print(json.dumps(messages,indent=2,ensure_ascii=False))# 此时再次调用 API,模型会因为看到了历史中的 tool_calls,从而正确地再次调用工具

总结

  1. 不要伪造历史:千万不要把 Assistant 的tool_calls响应手动转换成纯文本的content存入历史。
  2. 保持链路完整Assistant (tool_calls) -> Tool (result)这两步是成对出现的,缺一不可。
  3. 理解上下文学习:模型是很“懒”的,如果历史记录告诉它“只动口不动手”也能混过去,它下次就真的不动手了。

希望这篇踩坑记录能帮到正在折腾 Function Calling 的朋友们!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 11:26:33

React服务器组件(RSC)协议中的严重漏洞CVE-2025-55182深度解析

React服务器组件(RSC)协议中的严重漏洞CVE-2025-55182 仓库概述 我创建这篇博客是因为没有找到任何向真正了解React但无法理解此问题的初学者解释该漏洞的博客。本文纯粹用于教育目的。 此问题的根源在于Next.js中React服务器函数处理客户端与服务器之间数据块的方式存在安全…

作者头像 李华
网站建设 2026/4/17 13:02:01

机器学习西瓜书编程作业(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

机器学习西瓜书编程作业(设计源文件万字报告讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码 包含代码和报告。报告中包含题目如下: 1.采用留出法实现对率回归,给出西瓜数据集3.0a的性能评估结果。 2.实现基于信息增益(ID3)和信息增益率…

作者头像 李华
网站建设 2026/4/22 22:12:19

对话式AI:端到端语音识别与算法公平性研究进展

2022年,语音领域规模最大、最全面的国际学术会议Interspeech在韩国仁川举行。某中心作为白金赞助商出席。某中心语音AI组织的几位资深科学家重点介绍了该机构在本次会议上贡献的研究,本文聚焦于语音科学方面的进展,围绕近期语音AI研究的两个核…

作者头像 李华
网站建设 2026/4/23 10:12:32

第九课实战版:异常与日志体系 —— 后端稳定性的第一道防线

第9课的目标,从来不是教你“写几个异常类”。而是:在你的后端工程中,亲手搭建一套 👉 可扩展、可定位、可治理的稳定性底座。从这一课开始,你写的不再只是功能代码, 而是在搭一套系统工程能力。如果用 Andr…

作者头像 李华
网站建设 2026/4/23 10:12:22

2026年数字人大管理新趋势:专业平台如何引领变革?

随着数字政府建设加速推进,人大工作的数字化转型已从"可选项"变为"必答题"。据行业调研机构预测,到2026年,全国超过85%的省级人大将完成核心业务系统的数字化重构,而专业化的数字人大管理平台将成为这场变革的…

作者头像 李华
网站建设 2026/4/23 11:21:47

全网最全继续教育一键生成论文工具TOP9:9款深度测评与推荐

全网最全继续教育一键生成论文工具TOP9:9款深度测评与推荐 2026年继续教育论文工具测评:为何选择这些工具? 在当前继续教育日益普及的背景下,越来越多的学习者需要撰写高质量的学术论文。然而,从选题、资料收集到写作…

作者头像 李华