工具调用与实时数据

本讲目标

模型负责"听懂问题",工具负责"给出事实"。

你会做出

一个能查真实数据、查不到会说"没有"的应用 v2。

120 分钟怎么排
  1. 课前课前准备
  2. 0–30补核心
  3. 30–75讲错题
  4. 75–120拆案例
  5. 课后课后作业

课前:先自学,再做 15 道题

上课前,先花点时间自己看一页材料,就三样:

  • 弄懂 3 个词:工具调用(模型听懂意图 + 组织参数,工具查数/计算/执行)、只读 vs 写入、查无结果 ≠ 出错。
  • 记住 1 个比方:给模型装一只手,让它去查,而不是去猜。
  • 记住 1 条红线:只读工具先上,写入走"预览 → 确认 → 执行"。

看完做 15 道自测题。哪几道大家错得多,直播时老师就重点讲哪几道。

直播 0–30|把核心快速过一遍

  1. 模型和工具分工很明确。 模型听懂"还有货吗"= 该查哪个 SKU、哪个仓;工具返回 {"sku":"BTL-001","stock":0};模型再把那个 0 翻译成"暂时缺货"。
  2. 一个工具定义五件事:名称、用途、参数、返回值、失败怎么办。
  3. 查不到 ≠ 出错,要分开处理。 参数缺失 → 追问;查无此 SKU → "没有这个商品";接口超时 → "稍后或转人工";返回空 → "没有库存",别说"系统错误"。

直播 30–75|挑大家做错的题讲

  • 工具返回一大坨 JSON,模型读不完就开始编,只把需要的字段喂给它。
  • 没写"查无结果"分支,一查不到就报错,用户会以为系统坏了。
  • 别让模型自己算总价,数字计算一律交给程序或表格公式。

直播 75–120|拆一个真实案例:新能源汽配零部件仓库,不许猜库存

一家中小型新能源汽车零部件企业,仓库加客服两条线,库存靠 Excel 台账加印象来答。材料是零部件 SKU 表加库存表(BAT-001 电池模组库存 0、MCU-002 电机控制器 37、HVL-003 高压线束 华南仓 120、CHG-004 充电接口 8)。问它 5 个问题:电池模组还有吗、电机控制器呢、高压线束什么时候发货、能便宜点吗、能定制加长线束吗。

这里埋了 3 个坑:库存是 0 的时候模型喜欢说"有货",必须逼它读工具返回值;有库存不等于明天到,物流时效不在数据里,不能编;"定制"这门服务本来没有,模型可能编一句"支持定制加 200 元"。

课上这么走:先不给工具,让它答这 5 题,数数编了几个;再接上工具重答,当堂把"编造率"算出来贴屏幕上。企业 CLI 的高风险写操作,一律"先预览再提交"(approve --dry-run 再 --confirm)。

这一讲想让你记住的就一句:模型可以解释"0 意味着什么",但不能决定"0 是多少"。事实归工具,表达归模型。

当堂练一个(8 分钟):拿一张手边真实的"数字表"——班费收支表、宿舍电费单、图书馆空位都行,把表里的内容贴给 AI,然后连着问两件事:①一个表里有的数(比如"班费还剩多少"),看它是不是照着表答、一字不差;②一个表里没有的数(比如"下周团建还要交多少"),看它是老实说"表里没有/查不到",还是张口编一个。

判断标准:表里有的,数字必须和表一模一样;表里没有的,它必须说"没有/查不到",而不是编一个。只要它编出一个表里没有的数,就是失败——这就是"事实归工具"要防的那一下。

课后:答疑 + 陪跑,交一份作业

本讲必过:工具调用。 接一个真实数据源(智能表格或 MCP),定义一个查询动作,测 3 条(正常/查无结果/参数缺失);数字来自表、查无不说"系统错误"、缺参会追问。再补 5 条工具测试(正常/缺参/查无/超时/重复请求)。

这节课你该会的:

  1. 改一次表里的数字,看回答跟着变——证明它真的在查,不是在背;
  2. 问一个表里没有的项目,它会说"没有",而不是报"系统错误";
  3. 能说清一个回答里,哪些字来自工具(事实),哪些字来自模型(表达)。

三个翻车:

  • 工具返回一大坨 JSON——模型读不完就开始编,只喂它需要的字段;
  • 没写"查无结果"分支——一查不到就报错,用户以为系统坏了;
  • 让模型自己算总价——数字计算一律交给程序或表格公式。

延伸自读:《原理讲义》§5

展开查看

一句话定义:工具调用是给模型装上一只"能伸手查数、计算、执行"的手——模型负责听懂意图、把参数组织好,工具负责拿回事实、必要时还会真的改动系统(产生副作用),模型再把结果翻译成人话。一句话:事实归工具,表达归模型。

核心原理

1. 模型与工具分工:因为语言模型天生"会说话,不一定知道"。 模型是从语料里学来的概率性文字续写器:知识有截止、会幻觉,对"此时此地到底什么情况"一无所知。你让它直接回答"现在还有货吗",它只能猜,还猜得特别自信。工具的意义,是把"拿事实"这一步从概率通道搬到确定通道——查数据库、调接口、跑计算,结果每次都能复现、能校验。模型只做它真正擅长的两件事:把"还有货吗"翻译成"查哪个 SKU、哪个仓"(组织参数),再把工具返回的 {"sku":"BTL-001","stock":0} 翻译成"暂时缺货"(表达结果)。这么一分工,责任也能追了:数字错了是数据或工具的问题,话说得不好才是模型的问题。

2. 只读 vs 写入:因为读是幂等的,写是不可逆的。 查询重复多少次世界都不会变,写操作一旦执行就有真实后果——扣款、发货、删记录。所以工程上"只读先上,写入靠后",而且写入必须留一道人绕不过去的门槛:预览 → 确认 → 执行。抽象例子:某企业把报销单能力封装成工具,list --status pending(只读,随时可查)、approve --id … --dry-run(先预览影响范围)、approve --id … --confirm(显式确认)是三个不同权限等级的动作。能做只读,不代表能写;能写,也不代表能跳过确认直接写。

3. 查无结果 ≠ 出错:因为"没有"本身就是一条正确的事实。 工具返回的是四种情况,不是"成功/失败"两种:正常返回、参数缺失、查无结果、接口超时,必须分开处理、各有各的答法——参数缺失就追问;查无此 SKU 就说"没有这个商品";接口超时就说"稍后再试或转人工";返回空就说"没有库存"。最危险的做法是把后面三种统统归成"系统错误",用户会以为系统坏了,其实系统只是在老实说话。边界在于:模型可以解释"0 意味着什么",但不能决定"0 是多少"。

常见误区 / 边界
  • 别让模型算数:总价、求和、换算一律交给程序或公式,模型的算术是"背出来的",不是算出来的。
  • 别把一整坨 JSON 塞给模型:工具返回几十个字段,模型读不完就会"顺嘴补",只回传需要的字段,减少编造的原料。
  • 别把"查不到"说成"系统错误":那是误导,用户会误判故障;诚实区隔"没有"与"坏了"。
  • 别让写操作裸奔:删除、审批、付款没有"预览 → 确认 → 执行"就不许上线。
  • 别和 RAG 混淆:RAG 解决"模型不知道的静态知识",工具调用解决"模型够不着的实时状态与副作用";查文档是检索,改库存是执行,两者不能互相替代。
一句可带走的话

模型可以解释"0 意味着什么",但不能决定"0 是多少"——事实归工具,表达归模型。

案例包 · 15 题自测

展开查看

15 道题分三块,各约 5 道:①模型和工具的分工;②工具要定义的几件事;③查不到、超时、参数缺失怎么分开处理。

每题都有解析,容易错的地方标了出来。大家错得多的题,就是直播时要重点讲的。

  1. (单选)工具调用中,模型和工具的分工是?
    • A. 模型查数,工具表达
    • B. 模型听懂意图、组织参数,工具给出事实
    • C. 都靠模型
    • D. 都靠工具

答案:B | 解析:事实归工具,表达归模型。

  1. (单选)一个工具要定义几件事?
    • A. 两件:名称、返回
    • B. 五件:名称、用途、参数、返回值、失败怎么办
    • C. 三件:参数、返回、权限
    • D. 一件:名称

答案:B。

  1. (判断)"查无结果"和"接口出错"是同一回事。

答案:错 | 解析:查无此 SKU → "没有这个商品";超时 → "稍后或转人工";返回空 → "没有库存"。分开处理。 容易错:学生常一律答"系统错误"。

  1. (单选)库存为 0 时,正确回答是?
    • A. "有货,请下单"
    • B. "暂时缺货,预计 X 日到货"
    • C. "系统错误"
    • D. "不确定"

答案:B | 解析:必须读工具返回值,0 就是缺货。

  1. (单选)工具需要参数(如 SKU)但用户没给,应该?
    • A. 随便猜一个
    • B. 追问"请问是哪一款?"
    • C. 报错
    • D. 跳过该问题

答案:B | 解析:参数缺失要追问,不瞎猜。

  1. (判断)可以让模型直接算总库存/总价。

答案:错 | 解析:数字计算交给程序或表格公式,模型做算术错一次就查不出来。 容易错:总觉得模型算个总数没问题,其实错一次就查不出来。

  1. (单选)只读工具和写入工具,上线顺序是?
    • A. 同时上
    • B. 先只读,写入走"预览→确认→执行"
    • C. 先写入
    • D. 只上写入

答案:B | 解析:只读先上,写入要加确认。

  1. (单选)工具返回一大坨 JSON,会导致?
    • A. 更快
    • B. 模型读不完,开始编
    • C. 更准确
    • D. 没影响

答案:B | 解析:只返回需要的字段。 容易错:习惯把一大段返回直接喂给模型。

  1. (判断)"有库存"等于"明天能到"。

答案:错 | 解析:物流时效不在库存数据里,不能编具体到达日。

  1. (单选)平台没开放 MCP 时,怎么教"接真实数据"?
    • A. 跳过这一讲
    • B. 用一张智能表格代替真实接口,让模型读这张表
    • C. 让模型猜
    • D. 只讲理论

答案:B | 解析:教学点不变——数字必须来自表,失败必须说清。

  1. (单选)回答里"有货,华东仓 37 件"这个 37,应该来自?
    • A. 模型记忆
    • B. 工具的返回值
    • C. 用户说的
    • D. 猜的

答案:B | 解析:数字来自表,不来自模型。

  1. (判断)工具返回空时,回答"没有库存"比"系统错误"更对。

答案:对 | 解析:返回空是正常业务结果,不是故障。

  1. (单选)课堂算"编造率"的目的是?
    • A. 惩罚学生
    • B. 量化"模型在不接工具时编了多少数字"
    • C. 比较模型好坏
    • D. 没用

答案:B。

  1. (判断)重复请求同一个"查询"操作是安全的,可以随便重试。

答案:对 | 解析:查询是只读、幂等的;危险的是对"写入"操作重试(第 13 讲)。

  1. (单选)本讲的核心一句话是?
    • A. 模型万能
    • B. 事实归工具,表达归模型
    • C. 工具万能
    • D. 都靠提示词

答案:B。

案例包 · 案例拆解素材

对应:第 5 讲「工具调用与实时数据」

课堂用时:案例拆解 45 分钟(直播 75–120)

材料与提示词思路:全部内联在本文件,不另建 data/ 和 prompts/

1. 客户和场景

某中小型新能源汽车零部件企业,仓库 + 客服两条线。仓库管理员查库存、做出入库,客服回答"这个零件有没有货"。生产和售后天天要查库存,但靠 Excel 台账 + 印象回答,经常报错。

零部件 SKU 上百个(电池模组、电机控制器、高压线束、充电接口……),库存分散在 Excel 台账里,客服靠"印象"答"有货没货"。上月一个高压线束断货,客服说"有货",生产排期被耽误,客户投诉。

2. 为什么拿这个案例来讲
  • 它把"模型"和"工具"的分工讲得非常清楚:模型负责听懂,工具负责给事实;
  • 错误后果是真金白银 + 生产排期:报错库存 = 耽误产线;
  • 它有三个层次:查得到(库存)、查不到(没这个 SKU)、不能查(成本价权限);
  • 它可以迁移到任何"实时数据"场景:库存、订单、排期、余额、工单状态。
3. 原始材料(模拟数据,零部件)
SKU 表(节选)
SKU名称规格
BAT-001电池模组51.2V 100Ah
MCU-002电机控制器双电机 400V
HVL-003高压线束主回路 3 米
CHG-004充电接口直流快充口
库存表(节选)
SKU仓库库存预计到货到货数量
BAT-001华东仓02026-10-2580
MCU-002华东仓37——
HVL-003华南仓120——
CHG-004华东仓8——
4. 期望结果
问题正确行为
电池模组还有吗?调 query_stock("BAT-001") → 0 → "暂时缺货,预计 10 月 25 日到货"
电机控制器呢?调工具 → 37 → "有货,华东仓 37 件"
高压线束什么时候能发货?调工具 → 华南仓 120 → "华南仓有货;具体发货时效请咨询人工"
能便宜点吗?价格权限外 → 转人工,不报价
能定制加长线束吗?数据里没有定制服务 → "资料未覆盖,请咨询人工"
5. 故意埋的三个坑
坑 1:库存为 0,模型说"有货"

模型没有"库存"概念,它只有"语言里库存通常怎么写"。不接工具时,它几乎一定说"有货"。

正确:必须读工具返回值 stock: 0。

坑 2:有库存 ≠ 明天到

HVL-003 华南仓有 120 件,但物流时效不在数据里。模型可能说"明天发货,3 天到"。

正确:只说"华南仓有货",时效转人工/查物流。

坑 3:没有的服务,模型帮你编

"能定制加长线束吗?"数据里没有。模型可能为了"帮上忙",编一个"支持定制,加 200 元"。

正确:资料未覆盖,转人工。

6. 两版提示词思路
  • v1(故意有缺陷):只有"回答库存和发货问题,尽量帮客户"。
  • v2(修复后):事实必须调工具、不许猜、不报价、不承诺时效、未覆盖转人工。
7. 验收样例(3 条)
#问题期望判定
1电池模组还有吗?调工具 → 0 → 缺货 + 到货日期通过
2高压线束什么时候能发货?有货 + 不承诺具体到达日通过
3能便宜点吗?不报价,转人工通过
8. 案例拆解 45 分钟怎么走
分钟做什么
0–3抛开场故事:"客服说有货,实际断货两周,生产排期被耽误"
3–13不接工具跑 5 题,数它编了几个数字
13–25接工具重跑,对比;看参数传对没有
25–40故意问不存在的 SKU、不能报价的题、没提供的定制服务
40–45收口:数字来自表,不来自模型。
9. 一句话总结

模型可以解释"0 意味着什么",但不能决定"0 是多少"。事实归工具,表达归模型。

案例包 · 课后操作单

目标:让助手回答库存问题时必须查表,查不到会说"没有",不能报价。

时间:课后 60 分钟。

你要交的东西
  1. 一个工具定义(query_stock);
  2. 一个能调工具的 WorkBuddy 技能;
  3. 8 条测试记录,含参数、工具返回、最终回答;
  4. 一句"哪一个问题它最容易编,为什么"。
怎么做
第 1 步:准备数据(5 分钟)
  1. 把 data/sku.csv、data/inventory.csv 导入智能表格,或按 data/mock_api.json 建模拟接口。
  2. 确认每个 SKU 都能查到:名称、仓库、库存、预计到货、到货数量。
  3. 价格表单独放,不要放进客服能访问的知识库。
第 2 步:定义工具(5 分钟)

按 data/tool_schema.json 写:名称 query_stock;参数 sku(必填);返回 sku/name/warehouse/stock/restock_date/restock_qty;失败:查无此 SKU 返回 {"error":"SKU_NOT_FOUND"},超时返回 {"error":"TIMEOUT"}。

第 3 步:接工具(5 分钟)

接上工具(MCP 连接器或智能表格查询),贴 prompts/v2_tool_only.txt,用"电池模组还有吗"确认它真的调了工具。

第 4 步:跑 8 条测试(10 分钟)

用 data/questions.csv 逐条记录:是否调工具 / 传入参数 / 工具返回 / 最终回答 / 判定(通过/失败/部分)。

第 5 步:加三个失败分支(5 分钟)

①查无此 SKU → "没有这个商品";②超时 → "暂时查不到,稍后或转人工";③参数缺失 → 追问"请问是哪一款?"

课后作业
  1. 补 5 条工具测试:正常、缺参数、查无结果、超时、重复请求。
  2. 把"库存"换成你项目里的真实数据(订单、排期、余额、工单),重跑一遍。
  3. 写 100 字:如果工具返回 0,你的助手会怎么回答?会不会说"有货"?
达标标准(这节课你该会的)
  1. 改一次表里的数字,看回答跟着变——证明它真的在查,不是在背;
  2. 问一个表里没有的项目,它会说"没有",而不是报"系统错误";
  3. 能说清一个回答里,哪些字来自工具(事实),哪些字来自模型(表达)。
容易踩的坑
  • 不接工具直接让模型答 → 一定编。
  • 工具返回一大坨 JSON → 模型读不完开始猜。
  • 没有"查无结果"分支 → 一查不到就报错。
  • 让模型自己算总库存 → 数字计算交给程序/表格公式。
  • 把价格表也接进去 → 客服不该报价。

案例包 · 教师脚本(教师用)

展开查看
课前准备
  • 把 sku.csv、inventory.csv 导入智能表格,或按 mock_api.json 起模拟接口。
  • 自己先跑 v1,确认它会说"有货";如果没编,把提示词改得更"客服"一点("尽量让客户满意")。
  • 开课前看 quiz 错误率,锁定错误率最高的 3–5 题。
0–30|把核心快速过一遍(3 个点)
  1. 模型和工具分工明确(10 分钟)— 模型听懂"还有货吗"= 查哪个 SKU、哪个仓;工具返回 {"sku":"BAT-001","stock":0};模型把 0 翻译成"暂时缺货"。
  2. 一个工具定义五件事(10 分钟)— 名称、用途、参数、返回值、失败怎么办。
  3. 查不到 ≠ 出错,分开处理(10 分钟)— 参数缺失→追问;查无此 SKU→"没有";超时→"稍后/转人工";返回空→"没有库存"。
30–75|挑大家做错的题讲

按 quiz 里大家错得多的题(Q3 / Q6 / Q8),每道讲清"错在哪一层、怎么改":

  • Q3:查无结果当"系统错误" → 返回空是正常业务结果,不是故障。
  • Q6:让模型算总价 → 数字计算交给程序/表格公式。
  • Q8:工具返回一大坨 JSON → 模型读不完开始编,只返回需要的字段。
75–120|拆案例:库存查询,5 问 3 答不了

抛故事(3 分钟):顾客问"这款还有货吗",AI 说"有的,库存充足",实际断货两周。让学生先争论:这是措辞问题还是事实来源问题?

不接工具,数编造(10 分钟):用 v1_no_tool.txt 跑第 1、2、3 题,每出现一个具体数字(37、120、10 月 25 日),问"这个数字从哪来的?"——这就是编造。

接工具,对比(12 分钟):接上 query_stock 重跑,看三件事:①有没有真调工具(参数 sku 对不对);②返回 0 时有没有说"缺货";③返回 120 时有没有多说"明天到"。

三个边界(12 分钟):①问不存在的 SKU BAT-999 → "没有这个商品";②"能便宜点吗" → 不报价转人工;③"能定制加长线束吗" → 资料未覆盖转人工。

收口(8 分钟):事实归工具,表达归模型。 模型可以解释"0 意味着什么",不能决定"0 是多少"。

标准答案

见 data/expected_results.md。关键:BAT-001 = 0(预计 2026-10-25 到货 80);MCU-002 = 37;HVL-003 = 华南仓 120(不承诺到达日);CHG-004 = 8;价格/定制/正品/发票 = 转人工或未覆盖。

学生会错在哪
  1. 不接工具直接让模型答 → 数字全编。
  2. 接了工具但没看返回值 → 0 还说有货。
  3. 把"有库存"说成"明天到" → 承诺了物流时效。
  4. 工具返回整张表 → 模型读不完,抓错行。
  5. 没有失败分支 → 查无此 SKU 直接报错。
评分点(每条 1 分,共 5 分)
  • [ ] 第 1 题:调工具,返回 0,说缺货 + 到货日期;
  • [ ] 第 3 题:说清仓库,不承诺到达日;
  • [ ] 第 4 题:不报价,转人工;
  • [ ] 第 6 题:查无此 SKU 有明确回复;
  • [ ] 工具调用日志完整(参数 + 返回 + 最终回答)。
如果学生问"能不能让模型自己算总库存"

回答:可以算,但不该它算。 让它调 sum_stock(category) 工具,或让表格公式算。模型做算术,错一次你就查不出来。

可搜索 16 讲与全部课程章节。