当前位置: 首页 > news >正文

腾讯二面:做了三个 Agent 项目,“大模型怎么学会调工具“都说不清,面试官直摇头

昨天一个读者给我发了条很长的消息,说他腾讯二面挂了,挂在一个他"怎么也没想到会被问"的问题上。

他简历上写了三段 Agent 项目经历,LangChain、Function Calling 用得很溜,面试的时候项目拆解也讲得挺顺。面试官一直在点头,他心想稳了。

👨‍💻然后面试官突然问了一句:“你天天在用 Function Calling,那你能说说,大模型这个能力是怎么来的吗?它怎么就’学会’了看到工具描述之后输出一段 JSON?”

🙋‍♂️他愣了一下,说:“应该是……微调出来的?”

👨‍💻面试官追问:“微调分好几种,SFT 和 RLHF 在工具调用这件事上分别解决了什么问题?”

🙋‍♂️他支支吾吾说了句"SFT 教格式,RLHF 教质量",就再也说不下去了。

👨‍💻面试官最后说:“你用了三个项目的 Function Calling,但对它的训练原理一无所知。这就像一个司机开了五年车,却不知道发动机怎么把油变成动力。能开,但修不了车。”


这件事我觉得特别有代表性。做 Agent 开发的人太多了,但大部分人对工具调用的认知停留在"调 API"的层面 ——知道怎么定义 tools 列表、知道怎么解析 tool_calls 返回、知道怎么把结果塞回 messages。

但往下追一层 ——模型为什么能这样做?这个能力是怎么训练出来的?能答上来的人少之又少。

今天把这道题从头到尾讲透。

简要回答

大模型的工具调用能力不是天生的,是后天训练出来的,分两个阶段。

第一个阶段是 SFT(监督微调)。简单说就是给模型看大量"正确的工具调用示范"——一条条精心构造的训练样本,每条都完整展示了"用户问了什么 → 有哪些工具可用 → 该不该调 → 调哪个 → 参数怎么填 → 结果回来之后怎么回答"。模型在几十万条这样的样本上反复训练,就学会了这一整套动作流程。

第二个阶段是 RLHF(基于人类反馈的强化学习)。SFT 教会了模型"怎么调",但没教会它"什么时候该调、什么时候不该调"。RLHF 的作用就是通过人类的偏好反馈,帮模型建立起判断边界——简单问题直接回答,别画蛇添足去调工具;需要外部数据的问题才去调。

面试的时候如果被问到这个话题,只说"微调出来的"等于什么都没说。能把 SFT 和 RLHF 各自解决什么问题讲清楚,再点到训练数据的构造方式和运行时的调用流程,才是一个完整的回答。

详细解析

先搞清楚:原始大模型为什么不会调工具

这个问题看起来很基础,但它是理解后面所有内容的前提。

大模型在预训练阶段做的事情本质上只有一件:给一段文本,预测下一个 token。它在互联网上几乎所有的公开文本上训练过——百科、新闻、论文、代码、论坛帖子……但整个训练过程都发生在纯文本的世界里。模型从来没有"操作过"任何外部系统,也从来没有见过"输出一段 JSON 触发一次 API 调用"这种行为模式。

你可以这样类比:一个人从小到大只读书、不动手。他读过无数本关于烹饪的书,知道"热锅凉油"四个字怎么写,但从来没有摸过锅铲。你突然把他扔进厨房,递给他一把铲子说"炒个菜",他是没法直接上手的——他对"炒菜"的认知还停留在文字描述层面,没有变成可以执行的动作模式。

原始大模型面对工具调用的处境也是一样的。你在 System Prompt 里告诉它"你有一个查库存的工具",它能理解这句话的意思,甚至可能回复一句"好的,我来帮你查一下库存"——但它不会输出一段结构化的 JSON 调用请求,因为它的训练数据里从来没有这种格式的输出。

所以工具调用能力必须靠后天专门的训练来注入。接下来就是 SFT 和 RLHF 各自登场的环节。

SFT 阶段:教模型"看示范、学动作"

SFT 的全称是 Supervised Fine-Tuning,监督微调。如果类比到职场,SFT 就像新员工入职培训的第一周:师傅领着你,手把手演示流程——“遇到这种情况该填这个表,走这个审批”,你看十遍二十遍,自然就学会了。

具体到工具调用,SFT 要做的就是构造大量"标准示范"给模型看。每条训练样本是一个完整的多轮对话,里面至少包含五个部分:

第一部分是系统消息,列出当前可用的工具清单。每个工具的名称、功能描述、参数定义都写得很详细——这就相当于给模型发了一份"工具使用手册"。

第二部分是用户的提问。比如"帮我查一下深圳明天会不会下雨"。

第三部分是模型应该输出的工具调用请求——注意,这里不是自然语言回答,而是一段格式规范的 JSON。类似于{"tool_calls": [{"name": "check_weather", "arguments": {"city": "深圳", "date": "明天"}}]}。这段 JSON 就是模型需要学会输出的"标准答案"。

第四部分是工具执行后的返回结果。训练时这一步是模拟出来的,比如返回"深圳明天:小雨转多云,22-28°C"。

第五部分是模型拿到工具结果后生成的最终回答。它需要把结构化的数据翻译成用户友好的自然语言:“深圳明天有小雨,建议带把伞,气温在 22 到 28 度之间。”

模型在几十万条甚至上百万条这样的样本上训练,就能学会整套链路:读懂工具说明 → 判断要不要调 → 选对工具 → 把参数填对 → 拿到结果后组织自然语言回答。

训练数据从哪来?主要两个渠道。一是人工标注——工程师构造问题和对应的工具调用标准答案,质量最高但成本也高,通常用于制作核心种子数据。二是用更强的模型(比如 GPT-4)自动批量生成——给它一批工具定义和问题,让它生成对应的调用样本,然后人工抽检质量。这是目前业界的主流做法,效率高、成本低、可规模化。

SFT 的一个关键短板

SFT 教会了模型"怎么调工具",但它有一个明显的盲区:模型不太会判断"该不该调"。

这是因为 SFT 的训练数据绝大多数都是"需要调工具"的正样本——毕竟你要教模型学会调用工具,当然得给它看调用工具的示范。但这导致了一个副作用:模型训练之后会变得过度热衷调工具。

你问它"3 乘以 7 等于多少",它不直接说 21,反而去调一个计算器工具。你问它"太阳从哪边升起",它可能去调搜索引擎搜一下。这些问题它本来就知道答案,完全不需要工具帮忙,但它还是调了——因为在训练数据里,"调工具"这个动作得到了太多正向强化,模型形成了一种"有工具就调"的惯性。

这个问题,SFT 自己解决不了。需要第二阶段的 RLHF 来矫正。

RLHF 阶段:教模型"什么时候该克制"

RLHF 的全称是 Reinforcement Learning from Human Feedback,基于人类反馈的强化学习。如果 SFT 是新员工的入职培训,RLHF 就是他工作了几个月之后,主管根据他实际表现给的持续反馈:这件事处理得好,加分;那件事过度操作了,减分。时间一长,他就知道了什么场景下该积极行动、什么场景下该保持克制。

RLHF 的流程分四步。

第一步,让 SFT 之后的模型对同一个问题生成多种不同的处理方式。比如面对"法国的首都是哪里"这个问题,模型可能生成三种回答:直接回答"巴黎"、调搜索工具查一下再回答、调了工具但参数填错了。

第二步,让人类标注员给这些回答排序。这个例子里,显然"直接回答巴黎"最好,"调工具但答对了"次之,"调工具还填错参数"最差。标注员的偏好数据记录了人类在不同场景下对"该不该调工具"的判断。

第三步,基于这批偏好数据训练一个专门打分的小模型,叫奖励模型(Reward Model)。它不回答问题,只负责评估——给一个回答打个分,预测"人类会不会喜欢这个回答"。

第四步,用奖励模型的打分信号去持续优化主模型。简单来说就是让模型不断尝试不同的回答策略,奖励模型打分高的策略被强化,打分低的被削弱。经过几轮迭代,模型就形成了更精细的判断力:常识问题直接答、需要实时数据的才调工具、一个工具能搞定的不要调两个。

值得一提的是,现在业界也在用 RLAIF(AI Feedback)替代人类标注——用另一个大模型来充当"标注员"的角色做偏好判断。成本更低、速度更快,效果和人工标注的差距越来越小。

训练完之后:运行时到底发生了什么

理解了训练过程,再来看运行时的调用流程就清晰了。

当你的应用代码调用模型 API 时,你会把两样东西一起传过去:用户的问题,以及当前可用的工具列表(JSON Schema 格式的工具定义)。

模型收到之后,做的第一个判断是:这个问题需要工具吗?如果不需要(比如用户只是打了个招呼),它直接输出自然语言回答,完事。

如果需要工具,模型不会直接输出最终答案,而是返回一段tool_callsJSON——告诉你"我要调哪个工具、参数是什么"。此时模型就停了。

接下来轮到你的应用代码出场。你解析这段 JSON,找到对应的真实函数,执行它,拿到结果。

然后你把工具执行结果以role: "tool"的消息格式塞回对话历史,再次调用模型。这一次模型有了工具返回的真实数据,就能组织出一个基于事实的自然语言回答了。

整个过程本质上是两轮对话加中间一步执行。模型全程只做决策,不做执行。这个"决策与执行分离"的设计非常重要——它意味着你可以在执行层做权限控制、参数校验、沙箱隔离,而不用担心模型直接操作系统资源带来的安全风险。

举个代码层面的例子,让你更直观地感受这个流程:

# 伪代码:Function Calling 的运行时闭环import json# 第一轮:把工具定义和用户问题一起传给模型response = llm.chat( messages=[{"role": "user", "content": "帮我查一下杭州明天的天气"}], tools=weather_tool_schema # 工具说明书)# 模型判断需要调工具,返回 tool_callsif response.finish_reason == "tool_calls": call = response.tool_calls[0] func_name = call.name # "get_weather" func_args = json.loads(call.arguments) # {"city": "杭州", "date": "明天"} # 你的代码去真正执行 result = execute_tool(func_name, func_args) # 第二轮:把执行结果喂回模型 messages.append(response.message) messages.append({"role": "tool", "tool_call_id": call.id, "content": result}) final = llm.chat(messages=messages, tools=weather_tool_schema) print(final.content) # "杭州明天多云,气温 18-25°C,适合出行。"

注意这段代码里模型做了什么——它只是输出了一段 JSON 说"我要调 get_weather,参数是杭州和明天"。它既没有访问网络,也没有调用任何 API。真正干活的是你写的execute_tool函数。

面试里为什么爱问这道题

这道题的区分度极高,因为它直接暴露了你对 Agent 技术栈的认知深度。

会用 Function Calling 的人很多。但大多数人的认知链条是这样的:定义 tools → 调 API → 解析 tool_calls → 执行 → 返回结果。这条链条是运行时的操作流程,不涉及任何原理。面试官一追问"这个能力怎么来的",链条就断了。

而真正理解原理的人,脑子里的链条更深一层:预训练阶段模型不具备工具调用能力 → SFT 阶段通过示范数据教会模型输出结构化调用请求 → RLHF 阶段通过偏好反馈教会模型判断什么时候该调什么时候不该调 → 运行时模型只做决策,宿主代码做执行。这条链条从训练到推理是完整的。

容易翻车的第一个点:混淆 SFT 和 RLHF 的分工。有人说"SFT 教格式,RLHF 提升效果"——这太模糊了。精确的说法是:SFT 教的是"工具调用的完整行为模式",包括识别工具描述、判断是否需要调用、生成结构化 JSON 请求、根据返回结果生成最终回答;RLHF 教的是"在什么场景下应该调用、什么场景下不应该调用",也就是建立调用的边界感。

容易翻车的第二个点:以为 Function Calling 是模型"自己去执行"。面试官问"大模型是怎么查天气的",如果你说"它自己去调 API",说明你对执行流程的理解是错的。模型不执行任何东西,它只输出一段 JSON 指令。真正发起 HTTP 请求、访问数据库、执行代码的,始终是你的应用程序。

容易翻车的第三个点:说不清训练数据是怎么来的。面试官可能追问"SFT 的训练数据怎么构造",如果你只说"标注出来的"就结束了,会显得很浅。能补充说"核心种子数据靠人工标注保证质量,大规模数据靠更强的模型批量生成再人工抽检",显得你对工业界的实践有了解。

如果你在面试里能把上面这些点串起来讲清楚,再加一句"我在项目里实际遇到过模型过度调工具的问题,后来我在 Prompt 里加了明确的指导规则,让模型只在确实需要外部数据时才触发调用,误调率降了不少"——这种带实战经验的补充会让面试官觉得你不是在背概念。

写在最后

Function Calling 是当前 Agent 开发的基石技术,几乎所有的工具调用、外部系统对接都建立在这套机制上。但太多人只把它当成一个"API 的使用方式"来学,知道怎么传 tools 参数、怎么解析返回值,就觉得自己掌握了。

真正的理解应该再往下挖一层。模型为什么能在看到工具描述之后输出正确的 JSON?因为 SFT 阶段看了几十万条标准示范。模型为什么不会对所有问题都傻乎乎地调工具?因为 RLHF 阶段通过人类偏好建立了判断边界。模型为什么不直接执行工具而是输出 JSON?因为架构设计上刻意做了决策与执行的分离,安全性和灵活性都在这一层体现。

这些东西不是你在 LangChain 文档里能读到的,也不是 OpenAI 的 API 教程里会教的。但恰恰是面试官最喜欢问的——因为它能一眼区分出"调过 API 的人"和"理解这套系统的人"。

学AI大模型的正确顺序,千万不要搞错了

🤔2026年AI风口已来!各行各业的AI渗透肉眼可见,超多公司要么转型做AI相关产品,要么高薪挖AI技术人才,机遇直接摆在眼前!

有往AI方向发展,或者本身有后端编程基础的朋友,直接冲AI大模型应用开发转岗超合适!

就算暂时不打算转岗,了解大模型、RAG、Prompt、Agent这些热门概念,能上手做简单项目,也绝对是求职加分王🔋

📝给大家整理了超全最新的AI大模型应用开发学习清单和资料,手把手帮你快速入门!👇👇

学习路线:

✅大模型基础认知—大模型核心原理、发展历程、主流模型(GPT、文心一言等)特点解析
✅核心技术模块—RAG检索增强生成、Prompt工程实战、Agent智能体开发逻辑
✅开发基础能力—Python进阶、API接口调用、大模型开发框架(LangChain等)实操
✅应用场景开发—智能问答系统、企业知识库、AIGC内容生成工具、行业定制化大模型应用
✅项目落地流程—需求拆解、技术选型、模型调优、测试上线、运维迭代
✅面试求职冲刺—岗位JD解析、简历AI项目包装、高频面试题汇总、模拟面经

以上6大模块,看似清晰好上手,实则每个部分都有扎实的核心内容需要吃透!

我把大模型的学习全流程已经整理📚好了!抓住AI时代风口,轻松解锁职业新可能,希望大家都能把握机遇,实现薪资/职业跃迁~

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

http://www.jsqmd.com/news/689662/

相关文章:

  • 3分钟快速清理:为什么你的Windows 11需要Win11Debloat系统优化工具
  • 从C语言到PLC思维:给嵌入式工程师的倍福TwinCAT快速上手指南
  • 别再只用brew了!对比Mac安装Helm的3种方法(tar包、脚本、包管理器)及适用场景
  • 2026年最新排班管理软件盘点!10款主流排班管理软件功能对比与选型指南
  • 2026届学术党必备的五大降AI率平台横评
  • WeDLM-7B-Base实际作品:英文SCI论文引言段落续写,符合Nature子刊风格
  • DistroAV终极指南:在OBS Studio中实现专业级NDI视频流传输
  • 告别状态机陷阱:深入HAL库源码,理解并修复UART DMA发送的‘一次性’问题
  • 量子态随机截断协议:高效制备与资源优化
  • 大模型幻觉背后的真相:RAG技术如何让AI“先查资料再回答”?
  • OpenClaw联网搜索终极配置指南:给你的AI装上“实时眼睛”
  • RAGFlow + Ollama 搭建本地知识库:30 分钟跑通
  • 保姆级教程:用Python仿真SAR欺骗干扰(附代码与避坑指南)
  • 用torch.mul()给CV模型加『注意力』:手把手实现特征图空间权重调制
  • 5大突破性功能:如何用OpenVINO AI插件彻底改变你的音频创作流程
  • 终极Cookie本地导出工具:如何在浏览器中安全获取cookies.txt文件
  • 告别手动抄录!用Android手机+GreenDao快速搭建NFC卡号采集与Excel导出工具
  • 终极学术效率神器:Elsevier Tracker让投稿进度监控自动化
  • GPU算力梯队:选卡必看指南
  • 从PSPNet到CCNet:语义分割中的上下文建模演进史,我们到底需要多‘全局’?
  • 从零开始玩转ZU19EG评估板:手把手教你搭建第一个ZYNQ MPSoC原型系统(含资源分配避坑指南)
  • 番茄叶片病害检测数据集分享(适用于YOLO系列深度学习分类检测任务)
  • 人工智能+到底加了什么
  • 用AI制作科研演示动画:提升学术汇报效果
  • ChatGPT医疗应用爆发!AI诊断胜过专家?一文读懂LLMs如何重塑医疗行业!
  • 跨越系统壁垒:实现蓝牙键鼠在Windows与ArchLinux间的无缝漫游
  • 抖音无水印下载终极方案:douyin-downloader 一站式高效下载工具
  • 从GICP到FAST-LIO2:高精地图匹配定位算法的演进与实战解析
  • 操作系统教学清单
  • 保姆级教程:用VSCode+Python从零搭建NoneBot QQ机器人(附go-cqhttp配置避坑指南)