从一颗 Token
到一支智能体团队
这不是一份名词表,而是一条从 0 到 1 的路径。每一章都从一个问题出发,落到一个能动手的产物;
五个岗位视角(Prompt / RAG / AIGC / Agent / 产品与项目)各有各的读法。读完你应该能回答:当有人说「我们做个 Agent」时,他到底要动几层东西,我该先干哪一步。
先认识这支团队:AI 不是一个人,是一家公司
拟人化全景
- 分清模型与系统:你叫「AI」的时候,实际在叫一整条链路
- 记住 11 个角色各自负责什么,以及他们不能替代谁
- 建立「分部件归因」的直觉:效果不好时,先问是哪一环
- 理解为什么后面每一章都要单独讲一层
大多数人想象中的 AI,是一个坐在屏幕里什么都会的「大脑」。这个想象会让你在所有技术选型上判断失误。 真实的 AI 系统更接近一家公司:有人负责把话听清,有人负责查资料,有人负责动手,有人负责兜底。 你叫它「AI」的时候,其实是在叫整家公司。
下面这 11 位,就是这套教材的全部主角。后面每一章,都是在讲其中某一位具体在干什么活、被谁管、以及他做不了什么。
如果你要动手做东西:直接跳到第 5 章,那里每一节都写了「它解决什么 / 它依赖什么 / 它什么时候会崩」。
如果你要面试或做技术决策:第 7 章对照表是压缩版。
本 章 小 结
这一章唯一要带走的:AI 不是一个人,是一条流水线。后面所有技术判断,都建立在「能指出是哪一环出了问题」这个能力上。
行动建议:读完本书后,试着把你自己业务里的一次 AI 调用,拆成这 11 个角色的位置——拆不出来,说明还没看懂。
认知地图:LLM 往上加什么,就变成什么产品
演进链 / 十二步配方 / 什么时候不该加
- 一条加法链:LLM → +Prompt → +RAG → +Tools → +循环=Agent → +记忆 → +多 Agent → +多模态 → Workflow → +Harness → +MCP → +Skills
- 每一步都要能回答三个问题:变成了什么产品、补上了什么缺口、欠下了什么债
- 四个关键转折点:RAG 让它「有据可依」、Agent 让它「能动手」、Workflow 让它「可交付」、Harness 让它「敢上线」
- Workflow 不是 Agent 的升级,是降级换稳定——这是最容易搞反的一步
- 反向读法:先想产品,再倒推「我到底需要加到第几步」
这一章只讲一件事:AI 产品是一条加法链,不是一个选择题。
你看到的每个产品——知识库问答、客服机器人、编码 Agent、内容生产线——都是同一条链上某个位置的产物。
位置决定了它能干什么,也决定了它会怎么坏。
所以读完这一章,你应该能对任何一个需求说出一句话:「这个要加到第几步,多加的那几步是浪费。」
1.1 十二步配方表:每一步加什么、变成什么
先说结论:底下的模型不变,上面每加一个部件,产品的形态就跳一档。 下面这张表是全章的骨架,后面四节只拆解其中四个转折点。
| 步 | 公式(在上一形态上加什么) | 变成什么产品 | 补上的缺口 | 新欠的债 |
|---|---|---|---|---|
| 0 | LLM 裸模型 Transformer + 预训练 |
一个 API、一个输入框 | 会说话、懂常识、能泛化 | 不知道你的私有事实;不会动手;不记得你;行为不可控 |
| 1 | + Prompt / 上下文工程 角色、约束、格式、示例 |
ChatGPT 类对话产品 | 把意图说清楚、把输出格式约束住 | 知识仍在参数里:有截止时间、会编。光靠提示词救不了 |
| 2 | + RAG 切块 + 向量化 + 检索 + 重排 |
企业知识库问答 / 文档助手 / 合同审阅 / 客服机器人 | 私有知识、实时数据、可溯源到原文 | 检索错了就全错;答案仍停在纸面,不会动手 |
| 3 | + Function Calling 工具描述 + 参数 schema |
能办事的助手(查单、订票、开灯、查库) | 把「答案」变成「动作」 | 一次只调一个,不会自己决定调用顺序;模型可能编参数 |
| 4 | + 循环与规划 ReAct:想 → 调 → 看结果 → 再想 |
Agent(编码 Agent、研究 Agent) | 自主完成多步任务、根据结果调整 | 成本随轮次涨、会跑飞、结果不可复现 |
| 5 | + 记忆 写入策略 + 读取过滤 + 遗忘 |
长期陪伴型个人助理 | 跨会话记得你的偏好与历史 | 记忆污染、隐私风险、「记错了比不记更糟」 |
| 6 | + 多 Agent 分工 Supervisor / 角色拆分 / 通信 |
Agent 团队(研究+写作+审校) | 复杂任务拆解、并行、互相检查 | 通信成本、责任归属、调试困难(三个人干活三个人开会) |
| 7 | + 多模态 视觉编码 / 语音 / GUI 操作 |
视觉 Agent、GUI Agent、语音助手 | 能看图、能听声、能点别人的界面 | 像素理解有上限、延迟高、单次成本贵 |
| 8 | → Workflow 把步骤写进 DAG,只在节点内用模型 |
业务流水线(审批、报告生成、内容产线) | 确定性、可审计、可回滚、成本可控 | 覆盖不到长尾;流程一变就要改图 |
| 9 | + Harness 上下文管理、工具注册、权限、沙箱、循环上限、可观测 |
能交付给别人的产品 | 可运维、可信任、出事能查 | 工具要一个个接;工程量大 |
| 10 | + MCP / A2A 工具与 Agent 的接口协议 |
可插拔生态、工具市场 | 接入从 M×N 变成 M+N | 多一层协议就多一层调试成本 |
| 11 | + Skills / 插件包 把「做对一次」固化成能力单元 |
垂直行业产品、一人公司工作台 | 质量稳定、可复用、可交付 | 技能冲突、版本管理、写死模型名会绑死自己 |
| 12 | + 常驻与实时 端侧、流式、世界模型 |
下一形态:一直在线的执行层 | 不等你提问、看见就处理 | 算力、隐私、责任边界都还没定 |
第 2 步到第 4 步是能力扩张(越来越好用,也越来越不可控);第 8 步往上是工程收敛(能力不再增加,但开始能交付)。 很多人卡住,是因为只会做前半段。
图上每层正面的 ▸ 那一行,就是这一层的技术重点。下面把它们摊开,并标出每个点在本书哪一章展开—— 看图知道位置,查表知道去哪一章看细节。
| 层 | 关键技术点(图上 ▸ 那一行) | 展开在哪 |
|---|---|---|
| ① LLM | Token/BPE(文字怎么切成块)· 自注意力(QKV 怎么算相似)· 参数量(7B/70B 指什么)· KV Cache | 第 4、5 章 |
| ② Prompt | 角色与约束(把输出空间压窄)· few-shot 示例· 结构化输出(JSON 模式)· 温度(采样随机性) | 第 7 章 |
| ③ RAG | 切块(效果的第一决定因素)· Embedding(语义坐标)· HNSW(近似最近邻)· RRF 融合· Cross-Encoder 重排 | 第 9、10、24 章 |
| ④ Function Calling | JSON Schema(工具怎么描述)· tool_calls(模型只给意图)· 参数校验(不能信模型输出)· 流式分片累积 | 第 11 章 |
| ⑤ 循环与规划 | ReAct(想→调→看→再想)· 终止条件(什么时候该停)· 轮次上限· 成本闸门 | 第 11 章 |
| ⑥ 记忆 | 短期 vs 长期· 写入策略(什么值得记)· 读取过滤(相关性阈值)· TTL 与遗忘 | 第 26 章 |
| ⑦ 多 Agent | Supervisor 拓扑· 任务拆分粒度· 消息格式· 责任归属(出错算谁的) | 第 12 章 |
| ⑧ 多模态 | Patch 切分· 视觉编码器· 投影层· GUI 坐标定位· 视觉自校验 | 第 13 章 |
| ⑨ Workflow | DAG 编排· 节点内用模型· 人工闸门(关键处停下来)· 回滚与重跑 | 第 14 章 |
| ⑩ Harness | 上下文拼装顺序· 工具注册表· 最小权限与沙箱· 循环上限· 全链路审计 | 第 15 章 |
| ⑪ MCP / A2A | Host / Client / Server 三角色· 三类原语(Tools/Resources/Prompts)· stdio 与 HTTP 传输 | 第 16 章 |
| ⑫ Skills | 触发条件· 输入契约· 步骤分解· 自检· 失败处理· 版本管理 | 第 23 章(21.10) |
③ 的切块——七成 RAG 效果差,问题出在切块和解析,不在模型;
⑤ 的终止条件——没有它,Agent 会跑到账单失控;
⑩ 的最小权限与审计——没有它,做出来的东西只能演示,不能交付。
1.2 四个转折点:产品形态在这里跳档
转折一:LLM + RAG = 开卷考试
它变成了什么:一个能引用原文的知识问答系统——企业知识库、客服机器人、合同审阅、政策查询,全是这一个配方。
为什么会走到这一步:因为裸模型的知识有三个硬缺陷——有截止时间、不含你的私有资料、说不清依据。 前两个可以靠微调缓解,第三个微调解决不了:参数里没有"出处"这个东西。 而 RAG 把答案的来源摆在明面上,用户能点开看第几页第几段。
它欠下的债:只解决「知道」,不解决「做到」。所以下一步很自然——让它能动手。
转折二:+ 工具 + 循环 = Agent
它变成了什么:一个能自己决定下一步做什么的执行体。编码 Agent、研究 Agent、运维 Agent,都是这个形态。
关键差别只有一处:Function Calling 是「问一次,调一次」;Agent 是「调完看一眼结果,再决定下一次」。 多出来的这个循环,就是「助手」和「执行者」的分界线。
| 对比项 | Function Calling(无循环) | Agent(有循环) |
|---|---|---|
| 谁决定步骤 | 你的代码写死顺序 | 模型自己决定 |
| 失败怎么办 | 报错,人来处理 | 模型看到错误,换个方法再试 |
| 成本 | 可预测(一次调用) | 不可预测(轮次 × 上下文重发) |
| 典型故障 | 参数填错 | 死循环、目标漂移、越权操作 |
它欠下的债:不可控。同一个任务跑两次,路径可能完全不同,成本差三倍。 于是几乎所有做过 Agent 的团队,最后都会走到下一步。
转折三:Agent → Workflow = 把决策权收回来
它的思路是——把「下一步做什么」从模型手里拿走,写进流程里;模型只负责每个节点内的「怎么做」。 能力上限降低了,但确定性、成本、可审计性全部回来了。
| 维度 | 纯 Agent | Workflow | 谁赢 |
|---|---|---|---|
| 处理长尾 | 遇到没见过的输入也能试着做 | 只能走图里画好的路 | Agent |
| 结果稳定性 | 每次路径可能不同 | 路径固定,可复现 | Workflow |
| 成本 | 随轮次浮动,最坏无上限 | 节点数固定,可预算 | Workflow |
| 可审计 | 只能看日志猜它为什么这么走 | 每一步都有明确记录 | Workflow |
| 迭代速度 | 改提示词即可 | 要改流程图和节点 | Agent |
怎么选:步骤稳定、出错代价高、要给外人用 → Workflow;输入五花八门、要探索 → Agent。 现实里最常见的是混合:外层 Workflow 管骨架,某个节点内部放一个小 Agent 处理不确定性。
转折四:+ Harness = 从「能跑」到「敢交付」
它变成了什么:一个能给别人用的产品。同样的模型,有无 Harness,体验和可靠性差一个量级。
前面所有的加法,其实都在做同一件事——一层一层往里包。 把这三层拆开看,它们是包裹关系,不是并列关系:
怎么读这张图:LLM 在最里面,只会做一件事——把上下文变成下一个 token 的概率分布。 它不会循环、没有手脚、不记得上一次。Agent 包在它外面,用「想 → 调工具 → 看结果 → 再决定」这个圈, 把一次推理变成一串动作。Harness 再包在 Agent 外面,管住它能不能跑、跑多久、能碰什么、出了事怎么查。
| 层 | 它负责 | 它做不到 | 坏了的典型症状 |
|---|---|---|---|
| LLM (内核) |
把上下文变成下一步的概率分布:理解、生成、判断 | 不会自己循环、没有手脚、不记事、不知道什么时候该停 | 说得像但不对;知识截止;要求它「去做」时只会给你一段操作说明 |
| Agent (循环) |
决定下一步做什么、调哪个工具、结果怎么看、要不要重来 | 单步推理的深度仍然取决于内核;自己管不住自己 | 死循环、目标漂移、同一任务跑两次结果差很多、账单失控 |
| Harness (外壳) |
上下文怎么拼、工具怎么注册、权限与沙箱、轮次与成本上限、全链路日志 | 不产生任何智能——它只约束,不创造 | 功能都在但不敢给别人用;出了问题只能靠猜;换个模型就像换了个产品 |
再往后(+MCP 协议、+Skills 插件包)属于「扩大接入面」和「固化质量」, 它们不改变产品形态,只改变你能接多少工具、能复制多少份。这两步的细节在后面的 MCP 章与一人公司章。
1.3 能力阶梯:一句话版本
把上面十二步压成六级,就是这张图。每一级都在回答同一个问题:它还缺什么?
1.4 每加一层的代价
加法链不是免费的。每加一层,你都在这五个维度上做交易——看清楚代价,才知道哪一层现在不该加。
| 加的这层 | 延迟 | 成本 | 可控性 | 调试难度 | 典型新故障 |
|---|---|---|---|---|---|
| + Prompt | 0 | 0 | 高 | 低 | 格式跑偏、被诱导越界 |
| + RAG | +0.3–1s | 低 | 中 | 中 | 检索不到 / 检索到错的 |
| + Tools | +0.5–3s | 低 | 中 | 中 | 参数填错、调了不该调的 |
| + Agent 循环 | 数秒–数分 | 高(×轮次) | 低 | 高 | 死循环、目标漂移、账单失控 |
| + 记忆 | +0.2s | 低 | 中 | 中 | 记错、被污染、隐私泄露 |
| + 多 Agent | 数秒 | 很高 | 很低 | 很高 | 互相踢皮球、责任说不清 |
| + 多模态 | +1–3s | 中高 | 中 | 中 | 看不清小字、算错表格 |
| → Workflow | 更低更稳 | 可预算 | 很高 | 低 | 覆盖不到长尾,用户觉得「死板」 |
| + Harness | +少量 | 低 | 很高 | 中 | 配置错导致全线异常 |
| + MCP | +少量 | 低 | 高 | 中 | 协议握手失败、工具描述不匹配 |
| + Skills | 0 | 0 | 高 | 低 | 技能冲突、互相抢触发 |
① 加了之后没人能说出它比上一版好在哪——通常是因为原来的问题根本不在这一层;
② 调试时间超过开发时间——层数太多,故障点已经定位不到;
③ 成本涨了三倍,效果只涨了三个点——这一层的边际收益已经为负。
1.5 反向读法:从产品倒推「要加到第几步」
实际做项目时,顺序是反的:先有产品,再倒推需要哪几层。 下表左边是常见产品,右边是「必须有」和「可以没有」——「可以没有」那一列,就是省钱和少踩坑的地方。
| 要做的产品 | 必须有 | 可以没有(别加) |
|---|---|---|
| 企业知识库问答 | LLM + RAG + 引用 + 权限 | Agent、多模态、多 Agent——加了只是徒增成本 |
| 客服工单处理 | LLM + RAG + Tools + Workflow(分流与升级)+ 人工兜底 | 自主 Agent(工单流程本来就固定) |
| 编码 Agent | LLM + Tools + Agent 循环 + Harness(沙箱、权限、循环上限) | RAG(代码就在仓库里,直接读文件即可) |
| 个人助理 | LLM + 记忆 + Tools(+ 语音可选) | 多 Agent、复杂 Workflow |
| 内容生产线 | Workflow + Skills + 多模态生成 + 素材库 | 自主 Agent(选题和分镜都该由人定) |
| 审批 / 报告生成 | Workflow + 结构化输出 + 校验节点 | Agent、记忆 |
| 一人公司工作台 | Workflow + 轻 RAG + Skills + 轻 Harness | 多 Agent、MCP(工具就那几个,不值得上协议) |
1.6 三句话建立坐标系
训练是把互联网压进参数。压缩必然丢细节、必然有截止时间。所以它「大致懂」,但「具体不准」。
不改参数,只在提问时把相关资料塞进上下文。便宜、实时、可溯源,但受限于「能不能检索对」。
让模型输出变成动作,再把动作结果喂回去。能力上限大幅提升,故障模式也从「说错话」变成「做错事」。
本 章 小 结
把 AI 产品看成一条加法链:LLM 是底座,RAG 给它资料,Tools 给它手脚,循环让它自主,
Workflow 把决策权收回,Harness 让它能交付,协议和技能包让它能规模化复制。
每一步都有明确的「变成什么 / 补什么 / 欠什么」,也都有明确的「什么时候该走、什么时候不该走」。
行动建议:拿你手上的一个真实需求,在 1.5 的表里找到对应行,写下它「必须有」和「可以没有」的层。
写不出来的部分,就是你还没搞清楚这个产品到底要干什么。
这本书怎么用:五个阶段,从「听不懂」到「能交付」
阶段划分 / 五条岗位路线 / 每阶段验收标准
- 先分清三种目标——能聊、能选、能做,三者需要的时间差十倍,别用错力
- 五个阶段(S0–S5),每个阶段只回答一个问题,以及「什么算过关」
- 五条岗位路线各自的必读章、可跳过章、15 天排法
- 为什么 S0 和 S1 的顺序不能颠倒
- 三种读法:通读、按岗跳读、查问题
大部分 AI 教材的问题是:它把知识全给你了,但没告诉你先学哪个、学到什么程度算够、学完能干什么。 结果读完一遍,脑子里是一堆并列的名词;真让你做一个东西,还是不知道从哪下手。 这一章不教技术,它教你怎么用这本书。
阿凯读了三十多篇文章,能跟你聊 RAG、Agent、MoE、Harness。你问他做过什么,他说:「还在打基础。」
小雅只读了五篇,但她做了一个东西:把公司三百份合同丢进一个库,能用一句话问出 「哪些合同的付款周期超过 90 天」。她知道这东西什么时候会答错,也知道错了该从哪查。
差别不是勤奋程度。是阿凯没有把学习组织成一条有终点的路——他收集了地图,但从没出发。
2.1 先回答一个问题:你要的是「懂」还是「能做」
这不是修辞。这三件事的知识量差三倍,时间差十倍,而很多人是从中间那个开始、假装自己在做第三个。
| 目标 | 你会表现成什么样 | 需要读什么 | 实际耗时 |
|---|---|---|---|
| 能聊 | 别人说 RAG、Agent、Harness,你知道那是什么,不会听懵;能跟供应商对话不被忽悠 | 第 1–6 章 + 第 41 章术语表 | 约 1 周(每天 1.5 小时) |
| 能选 | 团队要上 AI,你能判断该用 RAG 还是微调、该买还是自建、预算大概多少 | 上面 + 第 19、20、30、31 章 | 约 3 周 |
| 能做 | 能独立交付一个别人敢用的系统,出了问题知道往哪查 | 全书主线(S0–S4)+ 至少两次动手 | 2–3 个月 |
看过 20 篇 RAG 教程的人,能说出切块要 500 token;真正做过的人知道,你那批 PDF 里有 30% 是扫描件,双栏排版会把左右两栏的文字串成一句。 这个认知只能从脏数据里长出来,读书读不到。所以如果你的目标是「能做」,任何跳过动手的读法都是无效的。
2.2 五个阶段:每个阶段只回答一个问题
全书的四十章不是线性排列的知识点,而是六个阶段。每个阶段有一个核心问题——所有内容都是为了回答它。 判断你是否过关,不看「读完了没有」,看那个问题你能不能用自己的话答上来,并且有产物。
| 阶段 | 它只回答这一个问题 | 读哪几章 | 动手做什么 | 什么时候算过关 |
|---|---|---|---|---|
| S0 建立直觉 | 它凭什么能说话?又为什么一定会编? | 第 3–6 章 | 用 API 跑 20 次,专门找它出错 | 能解释「它为什么会一本正经地胡说」,且举得出自己遇到的例子 |
| S1 会指挥 | 怎么让它按我要的来,而且每次都稳定? | 第 7 章 | 把一条提示词迭代 5 版,留版本记录 | 同一个任务跑 20 次,输出结构一致、关键信息不缺 |
| S2 会查证 | 它不知道的东西,怎么让它知道,而且说得有依据? | 第 9、10、24、25 章 | 建一个 200 篇文档的库,跑 20 条真实问题 | Recall@5 ≥ 0.8,答案能指到具体段落 |
| S3 会动手 | 怎么让它自己把多步任务干完,而不是只给我一段说明? | 第 11–15 章 | 一个能连续完成 3 步以上、失败能自己重试的 Agent | 给它一个没预设路径的任务,它能在 10 轮内收敛 |
| S4 会交付 | 怎么敢把它给别人用,出事我能兜住? | 第 15–18、32 章 | 加权限边界、评测集、成本闸门、日志 | 60 条评测集通过率 ≥ 85%,且单次成本可控 |
| S5 会经营 | 这事到底值不值得做,钱花在哪、什么时候回本? | 第 36–39 章 | 一份 PRD + 一份 ROI 测算 | 能算清一次调用的成本和一笔省下的人工 |
很多人一上手就学提示词技巧,收集了五十个模板,结果发现「有时候灵有时候不灵」——因为他不知道模型在做什么, 所以无法判断失败是提示词没写对,还是这件事模型根本做不到。
S0 的意义不是「打基础」,是给你一把归因的尺子。没有这把尺子,你在 S1 的每一次失败都会归错因,然后越改越乱。
2.3 五条岗位路线:五个岗位的知识重叠不到四成
你说要按岗位视角学,那得先承认一件事:Prompt 工程师和 Agent 开发工程师需要的知识,重叠不到 40%。 全读一遍是浪费,跳读也必须知道跳什么。下面五张表就是「跳什么」的许可。
| 岗位 | 必读 | 可以先跳过 | 15 天怎么排 | 面试真正会问的 |
|---|---|---|---|---|
| Prompt 工程师 | 第 3、4、7 章;第 18.3 评测 | 第 24、25、28、32–35 章 | D1–4 读第 3、4 章;D5–10 读第 7 章并做 5 版迭代;D11–13 建 50 条评测集;D14–15 做一次 A/B | 「你写的提示词,怎么证明它比上一版好?」——问的是评测,不是文采 |
| RAG 应用工程师 | 第 9、10、24、25 章;第 7 章基础;第 18 章评测 | 第 13、17、23、33 章 | D1–3 读第 9 章;D4–6 读第 10 章;D7–9 读第 24 章选型;D10–12 建库调参;D13–15 做出召回率报表 | 「召回率 0.6,你先改哪一步?」——考的是排查顺序,不是模型名 |
| AIGC 应用工程师 | 第 23 章;第 13 章;第 7 章;第 30 章 | 第 24、25、32 章 | D1–4 读第 23 章前半;D5–9 搭最小产线;D10–12 做一致性方案;D13–15 跑通一条完整成片 | 「人物一致性怎么保证?」——考的是工程组合,不是哪个模型更强 |
| Agent 开发工程师 | 第 11、12、15、16 章;第 7 章;第 18 章 | 第 23、24、28、33 章 | D1–4 读第 11 章;D5–7 写第一个工具调用;D8–11 加循环与终止条件;D12–14 加权限与日志;D15 压测 | 「它为什么会跑死循环,你怎么防?」——考的是边界设计 |
| AI 产品 / 项目经理 | 第 1、19、38、39 章;第 18 章;第 31 章 | 第 10、24、32 章的细节 | D1–4 读第 1、19 章;D5–9 读第 39 章并写一份 PRD;D10–12 读第 38 章做风险表;D13–15 算 ROI | 「这个需求该不该做 AI,你怎么判断?」——考的是边界感 |
2.4 三个阶段最容易卡住的地方
下面这三处,是我见过的转岗者最常停下的位置。它们的共同点是:看起来是技术问题,实际是方法问题。
读完了原理,还是不知道怎么下手写第一条提示词。原因是把「理解」和「操作」当成了同一件事。
破法:别写新提示词,先改一条现成的。找一段你觉得「答得不好」的对话,只改一处(加一个示例 / 加一句边界声明),看变化。改一处,你才知道是哪一处起了作用。
RAG 做出来了,但不敢让它自己动手——因为不知道它会干什么。
破法:先做只读工具(查订单、查文档、查天气),全部只读不写。跑一百次,看它会不会乱调。等你对它的行为有直觉了,再加第一个写操作,并且加人工确认。
系统能跑,但说不清它值多少钱,所以推不动立项。
破法:别算「效率提升百分之多少」,算三个具体数字:单次调用成本、人工复核耗时、错误一次的代价。这三个数一摆出来,值不值得做自然清楚。
2.5 三种读法,以及各自的入口
| 读法 | 怎么走 | 适合什么场景 | 预计用时 |
|---|---|---|---|
| 通读 | 第 3 章 → 第 18 章依次读,每两章做一次实验;第 19 章收束全局;第 22 章之后按需 | 完全从零开始,没有明确岗位目标 | 6–8 周(每天 1.5 小时) |
| 按岗跳读 | 查 2.3 的表,按「必读」列走,遇到不懂的词查第 41 章 | 已有明确岗位目标,或要在两周内上手一个方向 | 2–3 周 |
| 查问题 | 第 41 章术语表(可搜索)+ 第 20 章技术对照表;遇到具体故障查各章末的「易错点」 | 已经在做项目,遇到卡点 | 按需,几分钟 |
还有一条不算读法、但更有效的用法:把这本书当检查清单。 你手上如果已经有一个 AI 项目,直接翻各章末尾的「易错点」——全书四十多处,每一条都是别人踩过的坑。 对照自己的项目看一遍,比从头读一遍的收益高得多。
2.6 一条反常识的建议:先做,再懂
很多人卡在「我要先把原理搞懂再动手」,然后卡三个月。
真相是:AI 系统的失败,大多不在原理层,在数据层和工程层。 你花两周搞懂注意力矩阵怎么算,不会让你少踩一个「PDF 双栏解析错位」的坑;也不会让你提前想到「用户问的问题,答案分散在三份文件里」。 这些坑只能在做的时候遇到。
所以建议的节奏是交替,不是串联:每读两章,必须写一次代码或做一次实验。 读的时候带着「这东西能解决我上次遇到的哪个问题」,做的时候带着「它为什么会这样,书上哪一章讲过」。
第 1 周产物 = 一份「20 次调用失败记录」;第 2 周 = 一条迭代 5 版的提示词; 第 3 周 = 一个能答 20 个真实问题的 RAG;第 4 周 = 一个能连做 3 步的 Agent。
四个产物摆在一起,就是你面试时唯一需要讲的东西。
本 章 小 结
这本书的结构是六个阶段 × 五个岗位,不是四十个并列的知识点。
先想清楚你要「能聊、能选、还是能做」——三者耗时差十倍;再按 2.3 的表选一条路线走完,别混着走。
行动建议:现在就写下你这一周的唯一产物是什么,然后从对应阶段的第一个章节开始。
LLM 零基础入门:它到底是什么,凭什么能说话
三层定义 / 能力边界 / 六代成长史 / 它和插件的关系
- 用三种说法解释 LLM——技术定义、功能定义、你的用法定义,分别对应不同的场合
- 它能干四类事、不能干五类事,「不能」是架构决定的,不是还不够强
- 六代演进:每一代解决了什么问题,又留下了什么没解决
- LLM 与 Prompt / RAG / Agent / Harness 的关系——它是发动机,不是汽车
- 第一周三个实验:亲手看到幻觉、不稳定性、和「给了材料就变准」
如果你完全没接触过 AI,这一章是为你写的。它一个问题一个问题往下问,不预设你懂任何术语。
如果你已经用过 ChatGPT 几个月,也建议扫一遍——因为「用过」和「知道它是什么」,中间隔着一层很关键的东西:
你能不能预判它什么时候会出错。
3.1 一个完全外行,最该先问的三个问题
你问它「法国的首都是哪」,它不是「查到了巴黎」,是「在马赛、里昂、巴黎里面,巴黎出现的概率最高」。
这也是为什么它写得出能跑的代码,却常常写错边界条件:它模仿的是「像代码」,不是「正确」。
插件补的就是这三样。模型本身一点没变——变的只是「这次递给它什么材料」和「它说完之后谁去执行」。
同样一个 AI,做下面三件事,哪一件它一定做错?
① 把一段两小时的会议记录压成 5 条要点
② 算出这 12 笔报销的合计金额
③ 判断一条评论是真用户还是水军
看答案(先自己想 10 秒)
① 基本能做对:要点就在材料里,它只需要搬。
③ 看你怎么给标准。你说「看有没有夸张用词」,它按这个判,能做到七八成; 你不给标准,它按自己的直觉判,结果不可复现。
这三件事的差别,就是后面整章要讲的「能力边界」。
这三问三答,基本就是这一章的全部内容。下面逐条拆开。
3.2 它是什么:一句话,和三种说法
陈默用 AI 写了一份竞品分析,四页纸,结构清楚,还带了市场份额对比。他挺满意,直接发给了老板。
半小时后老板走过来,指着第二页:「这个 32% 哪来的?我们自己的口径是 27%。」
陈默翻回对话记录,从头看到尾——AI 从来没有说过这个数字有出处。它只是写了一句 「据行业报告,头部厂商占据约 32% 的市场份额」,语气自然得像在陈述常识。
老周说:「不是聪明不聪明。你问它的方式,决定了它只能给你『最像答案的东西』,而不是『答案』。」
这句话不好懂。要拆开它,得先看清它到底是个什么物件——而且要用三种不同的说法去看, 因为对着不同的人,说法不能一样;说错了对象,会出问题。
同一个东西,在三种场合要说三种话。搞混了会出问题:跟老板用技术定义,他听不懂;跟工程师用功能定义,他会低估复杂度。
| 说法 | 怎么表述 | 对谁讲 | 这个说法的风险 |
|---|---|---|---|
| 技术定义 | 一个自回归的 Transformer 解码器,用海量 token 做下一 token 预测训练出来的概率模型 | 工程师、技术评审 | 外行完全听不懂,容易把「概率」听成「差不多」 |
| 功能定义 | 一个读过大量公开文本、能按你的要求生成和改写文字的助手,能力广但不可靠 | 业务方、老板、客户 | 容易被当成「什么都能干」,承诺过头 |
| 用法定义 | 它是个条件续写引擎:你给的条件越具体、材料越充分,它的输出越可控 | 你自己、以及所有要写提示词的人 | 没有风险——这是三种说法里最接近实操的一种 |
如果它是「什么都能干的助手」,那它答不好,你只能换模型;如果它是「条件续写引擎」,那它答不好,你能想到三个可动手的地方: 条件写清楚(提示词)、材料给够(RAG)、材料里的信息别打架(上下文组织)。后两个才是工程的主要工作。
3.3 它能干什么:四类任务,可靠性完全不同
组长列了四件事,让 AI 试了一周:
① 把留言分成「物流 / 质量 / 退款 / 其他」——准确率 91%,能用。
② 按工单写一段回复草稿——八成能直接发,剩下的改两句。
③ 算这个订单该退多少钱(含优惠券分摊)——十次错三次,而且错得很自信。
④ 查「这个客户上周投诉过没有」——它编了一个工单号。
答案不在「AI 强不强」,在这四件事的性质根本不同——而性质决定了它能不能做对。
所以「AI 能干什么」这个问题问得太粗。更有用的问法是:它做哪一类事比较可靠,做哪一类必须有人复核。
| 任务类型 | 典型例子 | 可靠性 | 为什么 |
|---|---|---|---|
| 生成 | 写文案、写邮件、写代码、起标题 | 中—高 | 开放性任务,「好」的标准松,只要看起来合理就有价值。但事实性内容必须核对 |
| 转换 | 翻译、摘要、格式转换、改语气、结构化提取 | 高 | 输入和输出都在上下文里,它不需要「知道」什么,只需要「搬」。这是最该优先用 AI 的一类 |
| 判断 | 这条评论是正面还是负面、这封简历匹配不匹配、这段代码有没有风险 | 中 | 需要「标准」。标准不给,它按自己的先验判;标准写清楚,准确率会明显上升。但边界样本一定出错 |
| 计算 / 精确事实 | 算 137×248、查某公司去年营收、今天是几号 | 低 | 它在「猜一个像样的数字」,不是「算」。这类必须交给工具(计算器、SQL、搜索) |
是 → 它大概率能做对(转换、提取、摘要);不是 → 它在猜(算数、查最新数据、回忆细节)。
这条判断能帮你避开八成的误用。
3.4 它不能干什么:五条边界,都是架构决定的
法务:让 AI 起草催款函,它引用了「《民法典》第五百七十七条关于违约金的规定」—— 条文号对得上,但把内容说反了。律师花一小时才核对完。
财务:让它合计一批报销,12 笔、总额四万多——它算错两笔,但格式漂亮、对齐工整,直接进了表。
客服:客户在第三轮说「我改主意了,先不退了」,它继续按退款流程走—— 因为它只盯着最后一句,前面说过什么它已经「看不见」了。
这一节比上一节重要。因为「能干什么」决定你能用它做什么,「不能干什么」决定你会在哪里翻车。 下面五条不是「现在还不够强」,是这个架构天然做不到——指望下一代模型解决,通常等不到。
| 边界 | 真实情况 | 正确做法 |
|---|---|---|
| 知识有截止 | 训练数据停在某个时间点,之后的事它不知道。更麻烦的是它不会告诉你「我不知道」,而是编一个像样的答案 | 外接检索(RAG)或搜索工具;提示里明确允许「材料未提及」 |
| 不会精确计算 | 它是在「生成一个数字的形状」,不是执行运算。三位数乘法就可能错 | 算数、统计、查表全部交给代码 / SQL / 计算器,让它只负责组织语言 |
| 没有记忆 | 每次调用都是独立的函数调用,权重冻结、状态清零。你以为它记得,其实是每次都把历史重发一遍 | 上下文里带上历史,或用外部存储做长期记忆(第 26 章) |
| 没有手脚 | 它只能输出文字。让它「去发一封邮件」,它只会给你一段「你可以这样发」 | 加工具调用(Function Calling)+ 执行层(Agent / Harness) |
| 输出不确定 | 按概率采样,同输入两次结果可能不同;长输出更容易漂 | 温度设 0、固定种子(部分厂商支持)、结构化输出、把确定性逻辑移出模型 |
3.5 它的成长史:六代演进,每一代都留下一个没解决的问题
了解历史不是为了考试,是为了理解为什么现在的设计长这样。 AI 的每一次转向,都是被上一代的天花板逼出来的——而这些天花板,现在仍然以「它的某种怪毛病」的形式留在你面前。
| 阶段 | 核心思路 | 突破了什么 | 为什么被下一代取代 |
|---|---|---|---|
| 规则时代 | 人把知识写成 if-else | 第一次实现「机器对话」(ELIZA 靠模式匹配就能让人误以为被理解) | 知识无穷无尽,规则写不完;换个说法就失效 |
| 统计时代 | 从语料里统计词与词的共现概率 | 不用人写规则了,数据里有什么它就学什么 | 只能看前后 2–3 个词,长句子理解不了;维度爆炸 |
| 词向量 | 把词映射成稠密向量,语义相近则距离近 | 「意思」第一次变成了可计算的数字,同义词、类比关系都能算 | 一个词只有一个向量,「苹果」的水果义和公司义分不开 |
| Transformer | 自注意力:每个词直接看所有词 | 长距离依赖 + 训练可并行(这是能「做大」的前提) | 它只会「续写最像的后文」,不会「按你的要求办事」 |
| 对齐时代 | 指令微调 + 人类偏好对齐(RLHF) | 从「接龙模型」变成「助手」:听得懂指令、知道该拒什么 | 为了「答得像」,它学会了在不知道时也给出流畅答案——幻觉被强化 |
| 推理 + 动手 | 先想再答(CoT / 推理模型)+ 工具调用 + 长上下文 | 多步推理稳定性大幅提升,能查资料、能调工具、能连续执行 | 成本上升、延迟变长;能动手之后,「谁负责」成了新问题 |
规则时代的问题是「覆盖不到」;统计时代是「看不懂长句」;对齐时代是「自信地编」;Agent 时代是「跑飞了没人拦」。
所以不要问「它什么时候能不出错」,要问「它这次出错,代价有多大,我怎么兜住」。这个问题问对了,你的系统设计就开始了。
3.6 它和那些「插件」是什么关系:发动机与汽车
这是零基础的人最困惑的一块。市面上有一堆名词——Prompt、RAG、Function Calling、Agent、Workflow、Harness、MCP——它们听起来像并列的几样东西,其实根本不在同一个层级。
一个类比自己就能说清:LLM 是发动机,不是汽车。
| 部件 | 它补的是 LLM 的哪个缺陷 | 没有它会怎样 | 哪一章 |
|---|---|---|---|
| Prompt | 它不知道你要什么。提示词把「任务、材料、格式、边界」说清楚 | 输出随缘,格式每次都不一样,无法接进系统 | 第 7 章 |
| RAG | 它不知道你的私有资料,也不知道训练之后的事 | 答得像但不对;无法回答公司内部问题;说不出来源 | 第 9、10 章 |
| Function Calling | 它没有手脚,只能说不能做 | 所有操作都要人复制粘贴,等于没自动化 | 第 11 章 |
| Agent | 它不会「做一步看一步」,只会一次性输出 | 多步任务做不完,中间错了也不会回头 | 第 11–13 章 |
| Workflow | 它的决策不可控,业务上要求每次都一样 | 结果不稳定,无法审计,不敢给外部用户 | 第 14 章 |
| Harness | 它不知道边界,会跑飞、会越权、会烧钱 | 能演示,不能上线;出了事查不到原因 | 第 15 章 |
| MCP | 每个工具都要单独写一遍接入代码 | 接第 5 个工具时,维护成本已经失控 | 第 16 章 |
| Skills | 同一个任务每次都要重新组织一遍提示 | 做得对,但没法复用、没法保证每次都做对 | 第 23 章 |
先让发动机能转(能用 API 说清楚话)→ 再装油箱(RAG 补知识)→ 再装传动轴和方向盘(工具 + 循环) → 最后装刹车和气囊(Harness)。
顺序反了会怎样:先装刹车的人,往往连发动机都没点着——他做了一个「安全合规的框架」,但里面没有能干活的东西。
3.7 第一周:三个实验,亲手看到它的三副面孔
光读没用。这三个实验加起来不到两小时,但能让你对它的判断从「听说」变成「见过」。
实验一 · 让它答一件它不可能知道的事
怎么做:问它「我们公司上个月的报销流程改成了几级审批?」(换成任何一个只有你公司内部才知道的事实)。
你会看到:大概率它会给你一个结构完整、语气笃定的答案,比如「通常是三级:部门主管、财务、分管领导」。它不会说「我不知道」。
结论:这就是幻觉。不是它坏了,是它的训练目标就是「生成看起来合理的文本」,而不是「说真话」。
可动手的地方:在提示词里加一句「如果材料中没有相关信息,直接回答『未提及』」,再看一次——你会发现它立刻老实了。
实验二 · 同一个问题,连问五次
怎么做:找一个需要一点判断的问题(「这段用户评论是正面还是负面」),把温度设为默认值,同样的问法连问五次。
你会看到:五次答案不完全一样,措辞不同,偶尔结论也会翻。如果你要它输出 JSON,还可能五次里有两次格式不对。
结论:它是采样出来的,不是查表。所以任何要进生产系统的输出,都必须约束格式 + 校验结果,不能假设它「应该」稳定。
可动手的地方:温度调到 0,再跑五次;然后加一句「只输出 JSON,不要任何解释」,再跑五次。对比两次的变化。
实验三 · 先给它材料,再问同样的问题
怎么做:先问「这份合同的违约金比例是多少」,不给材料;然后把你手上任何一份文档贴进去,加上「只依据下文回答,并引用原句」,再问一次。
你会看到:第一次它编了一个常见比例(比如 20%);第二次它准确引用了原文那一句,甚至标出了段落。
结论:同一个模型,给不给材料,可靠性差一个量级。这就是 RAG 的全部价值来源——不是让模型变聪明,是让它「有据可依」。
可动手的地方:故意给它一份不含答案的材料,看它会不会编。这一步决定你的系统要不要加「拒答」逻辑。
这个判断会反过来决定你后面所有技术选择——先想「材料怎么给」,再想「用哪个模型」。
3.8 零基础最容易带上的八个误解
| 误解 | 实际情况 | 这个误解会导致什么 |
|---|---|---|
| 「它什么都懂,是个百科」 | 它是从文本里学到的统计规律,不是查数据库。越冷门越容易编 | 把它的输出直接当事实用,不做核对 |
| 「它记得我们上次聊的」 | 默认不记得。你看到「记得」,是产品把历史重新发了一遍 | 设计多轮功能时忽略上下文成本 |
| 「换个更贵的模型就好了」 | 很多问题是材料没给对,换模型无效 | 预算翻倍,效果没动 |
| 「提示词要写得越长越详细」 | 过长会稀释关键指令,还会触发中段丢失 | 越写越长,效果反而下降 |
| 「它算错了,说明数学能力差」 | 它不做运算,只生成像数字的文本 | 在需要精确的地方硬用它,出错率不可控 |
| 「AI 会取代我这个岗位」 | 它取代的是任务,不是岗位。能被完整描述的任务才会被替代 | 焦虑或盲目乐观,都不指向行动 |
| 「开源模型一定不如闭源」 | 在特定任务上,微调过的开源小模型经常反超 | 多花十倍成本,效果还更差 |
| 「先搭平台,再想场景」 | 平台是给多个场景用的。只有一个场景时搭平台,是纯浪费 | 三个月做出一个没人用的系统 |
3.9 接下来往哪走
这一章给你的是一张「它是什么」的地图。但地图不等于地形——你还需要知道它内部到底怎么运转, 不然你永远只能靠试错来调它。
接下来四章是由外向内拆:
- 第 4 章:文字怎么变成数字(Token、上下文窗口、Embedding)——这一层决定了成本、容量和「它为什么数不清字数」
- 第 5 章:Transformer 与参数——它凭什么能理解上下文,参数量的「大」到底大在哪
- 第 7 章:Prompt 工程——从这一章开始,你就在动手了
- 第 9 章起:往外装部件(RAG、Agent、Workflow、Harness)
本 章 小 结
LLM 是一个条件续写引擎:给它条件,它续写最可能的后文。它擅长「答案就在材料里」的任务,做不到「答案不在材料里」或「需要确定性」的任务。
六代演进中,每次能力提升都带来新的失效模式——所以问题不是「它什么时候不出错」,而是「它这次出错,代价多大,我怎么兜住」。
行动建议:做完 3.7 的三个实验,把三次观察写下来。这三条记录,比读完这一章更有价值。
第一层 · 简单:文字是怎么变成数字的
Token / 上下文 / Embedding
- Token 的切法(BPE)与三个后果:计费、容量、字符级能力弱
- 中文 token 效率为什么比英文差,成本怎么估算
- 上下文窗口是「工作台」不是「硬盘」,Lost in the Middle 的真实影响
- Embedding 如何把「意思像不像」变成「距离近不近」,余弦相似度的算法
计算机不认识字,只认识数。所以任何 AI 的第一步,都是把人类语言拆成整数序列。 这一步看起来最枯燥,但它决定了很多你后来会踩的坑:为什么模型数不清字数、为什么中文比英文贵、为什么长文档中间的内容会被忽略。
4.1 Token:AI 眼里的「字」不是字
小 Tok 的工作很简单:拿一段文本,按训练时学好的词表切块,每块给一个编号。切法叫 BPE(Byte Pair Encoding)—— 从单个字符开始,反复把「最常一起出现的两段」合并成一个新单位。所以高频词会被合并成一整块,生僻词会被拆成碎片。
模型的算力消耗与 token 数量近似成正比。所以定价、上下文长度、生成速度,都是「每 token」的指标。 一个经验值:英文 1 token ≈ 0.75 个单词;中文 1 个汉字 ≈ 1~2 个 token(取决于分词器,GPT 系对中文的压缩率明显低于国产模型)。
① 中文调用成本天然偏高;② 模型「数字数」很不靠谱(它数的是 token 不是字);③ 拼写、倒序、字符级操作是弱项(一个字被切碎了,它看不到字)。
4.2 上下文窗口:模型的「工作台」有多大
上下文窗口(context window)是模型一次能同时看到的 token 上限。它不是硬盘,是工作台—— 桌子上摊开的纸越多,你能同时对照的东西越多,但每张纸能分到的注意力会变少。
| 概念 | 含义 | 工程影响 |
|---|---|---|
| 上下文窗口 | 单次请求可承载的最大 token 数(输入 + 输出) | 决定你能不能整本手册塞进去;超了就要做切分或摘要 |
| Lost in the Middle | 关键信息在长上下文中部时,被召回率显著下降 | 重要指令放开头或结尾,别埋中间 |
| 注意力成本 | 标准注意力随长度呈平方增长 | 长上下文 = 更贵更慢,不是免费的 |
| KV Cache | 缓存已算过的键值对,避免重复计算 | 决定并发能力与显存占用,是推理优化的核心 |
4.3 Embedding:把「意思」变成坐标
阿嵌不读句子,他给每段文本算一个高维坐标(常见 768 / 1024 / 1536 / 3072 维)。 神奇的地方在于:语义相近的文本,坐标也相近。于是「意思像不像」这个模糊问题,变成了「距离近不近」这个可计算问题。
相似度怎么算?最常用 余弦相似度:把两个向量都归一化后求点积,值域 −1 到 1,越接近 1 越像。 实际工程里更常用 内积(dot product),因为归一化后两者等价,而内积算得更快。
A·B / (|A||B|)。若向量已归一化为单位长度,分母为 1,余弦相似度就等于内积。所以向量库普遍用内积索引,省一次除法,还能用矩阵乘法批量算。本 章 小 结
这一章是地基。你后来遇到的所有「成本超预算」「长文档效果差」「数字数不准」,根因都在这里。
行动建议:用目标模型的 tokenizer 实测一段你业务里的中文文本,看它到底值多少 token——这个数字会改变你对成本的直觉。
Transformer 与参数:能力从哪来
注意力 / 参数 / 训练推理
- Transformer 是什么:三层结构、一条数据流、N 个 Block 堆叠
- 完整架构:编码器 / 解码器两栏,以及三处注意力(自注意力 / 掩码自注意力 / 交叉注意力)各自解决什么
- 一个 Block 内部:注意力负责通信,FFN 负责计算,残差与 LayerNorm 保证能训得深
- 单头 vs 多头:为什么能把维度切成 32 份,而计算量几乎不变;MQA / GQA 省的是什么
- 三种形态:仅编码器 / 仅解码器 / 编码器-解码器,以及为什么现在全是仅解码器
- 七种同类架构的取舍:RNN、LSTM、TextCNN、Transformer、线性注意力、RWKV、Mamba
- 参数量与显存的换算,为什么必须额外算 KV Cache
- 训练三阶段(预训练 / SFT / RLHF)与推理采样的区别
上一步我们只把字变成了数字。要让它「懂」,需要解决一个核心问题:每个词该看哪些别的词。 「苹果发布了新手机,它很贵」——「它」指什么?人一眼就知道,机器必须靠机制算出来。这个机制叫注意力。
5.1 什么是 Transformer:一句话、一个结构、一条数据流
上一章我们把文字变成了向量。但向量之间是互相孤立的——「苹果」的向量不知道旁边有「发布」「新手机」。 要让模型理解一句话,必须解决一个问题:怎么让这些向量互相交流。
整体结构:三层,一条直线
不管多大的模型,骨架都是这三段:输入层 → N 个 Block 堆叠 → 输出层。 「7B」「70B」说的就是这些 Block 里的参数总量,「32 层」「80 层」说的就是 N。
上面那张是压缩版——它只说清「输入进、输出出,中间叠 N 层」。 把它展开,就是 Transformer 论文里那张著名的双栏结构图。这张图值得逐块看一遍,因为后面所有术语都在这里面。
这张图里有三处注意力,它们是初学者最常混的地方:
| 位置 | Q / K / V 来自哪 | 它解决什么 | 去掉会怎样 |
|---|---|---|---|
| ① 自注意力 (编码器) |
三个都来自输入本身 | 让每个词理解整句话——双向,能看左右两边 | 模型只能理解孤立的词,读不懂句意 |
| ② 掩码自注意力 (解码器) |
三个都来自已生成的部分 | 生成第 5 个词时只能看前 4 个,不许看后面 | 训练时直接作弊:答案就在输入里,学不到真本事 |
| ③ 交叉注意力 (解码器) |
Q 来自解码器,K/V 来自编码器 | 把「我要生成什么」和「原文说了什么」对上 | 翻不了译、答不了问,因为输出和输入彻底断开了 |
5.2 一个 Block 里到底有什么:两个子层,两次残差
这是理解 Transformer 的关键。一个 Block 只做两件事,交替进行:
负责「位置之间通信」。让每个词去看其他所有词,把相关信息吸收进来。
这是唯一一个「跨位置」的操作——Transformer 的全部魔力都在这里。
负责「每个位置内部计算」。对每个位置的向量单独做一次升维→激活→降维,位置之间互不干扰。
一般认为模型的「知识」主要存在这里。
输出 = 子层(x) + x。那个 + x 是一条「高速公路」:反向传播时梯度可以绕过子层直接流回前面。没有它,堆到 12 层以上就会梯度消失,模型根本训不动。ResNet 也是靠这个才把网络做深的。LN(x + 子层(x))(Post-LN),后来发现深层难训;现代模型几乎都用 x + 子层(LN(x))(Pre-LN),训练更稳,但表达力略弱,需要更多层补偿。看到「Pre-LN」就知道这是 2019 年之后的模型。d → 4d → d。先升维是为了在高维空间里做非线性变换(特征组合),再压回去。这个 4 倍是经验值,后来出现了 SwiGLU(用门控代替 ReLU),把比例调成约 2/3 × 4 倍并加一个门,效果更好,Llama 系列都用它。5.3 三种形态:同一套零件,三种装法
Transformer 不是一个固定结构,而是一套零件。按「注意力能不能回头看」和「有没有解码器」,分成三种形态。 这个区分很重要——你调用不同模型时,行为差异的根源就在这里。
| 形态 | 注意力方向 | 训练目标 | 代表模型 | 擅长 |
|---|---|---|---|---|
| 仅编码器 Encoder-only |
双向:每个词能看前后所有词 | 掩码语言模型(挖空填词) | BERT、RoBERTa、BGE | 理解类:分类、抽取、Embedding、重排 |
| 仅解码器 Decoder-only |
单向:只能看前面,不能看后面(因果掩码) | 下一个词预测 | GPT、Llama、Qwen、DeepSeek | 生成类:对话、写作、代码、几乎所有大模型 |
| 编码器-解码器 Encoder-Decoder |
编码器双向读,解码器单向写 | 序列到序列 | T5、BART、Whisper | 翻译、摘要、语音识别 |
① 目标统一——都是「预测下一个词」,一套训练代码通吃所有任务,不用为每个任务改结构。
② 工程简单——推理时能缓存历史(KV Cache),流式输出天然支持。
③ Scaling 更可预测——规模上去能力平滑增长,做研究容易押注。
④ 上下文学习能力强——它的训练目标就是「看前文学会接龙」,所以给它几个例子它就会模仿,这正好是 few-shot 的底层机制。
而 BERT 那种「挖空填词」的训练目标,天然不适合生成,只能做理解。不是它不优秀,是它的形态决定了天花板。
5.4 自注意力:Block 里的那场圆桌会议
Q×Kᵀ → ② 归一化 softmax(分数 / √d) → ③ 加权求和 × V。除以 √d 是为了防止维度高时点积过大、softmax 退化成「只看一个人」。给每个 token 配三个向量:Query(我在找什么)、Key(我是什么)、Value(我能提供什么)。 用我的 Q 去和所有人的 K 做点积,得到一组相关性分数,softmax 归一化后,对所有 V 加权求和——这就是我这个位置的「新理解」。
一组 QKV 只能学到一种「看法」。多头就是同时开 32 / 64 个会,各自关注不同关系(语法、指代、时序、实体),最后拼接。 这是模型能同时处理多种语言现象的关键。
注意力本身是「无序」的,必须额外告诉模型谁在前谁在后。从绝对位置编码 → 相对位置(RoPE)→ 长上下文外推(YaRN / NTK), 这条线直接决定了模型能不能撑住 128K 上下文。
一个 Transformer Block = 多头注意力 + 残差连接 + LayerNorm + 前馈网络(FFN)。 把几十到上百个这样的 Block 堆起来,就是「层数」。FFN 承担了大部分参数,也一般认为承载了模型的「知识记忆」。
5.5 单头与多头:为什么要把一组 QKV 拆成 32 组
第 5.4 节讲了自注意力的三个步骤,但有个前提没说:那一节默认你只有一组 Q、K、V。 真实模型不是这样——它是「多头」。这一节把单头和多头的差别说清,以及一个反直觉的事实: 多头几乎不增加成本。
单头的问题:一张表装不下所有关系
先把「单头」说清楚。自注意力的计算是三步:Q 和 K 点积算相关性 → softmax 归一化成权重 → 用权重加权求和 V。 如果只有一组 Q、K、V,那么对每个位置来说,它最终只得到一张权重分布。
问题就出在「一张」上。一句话里同时存在多种关系:
| 关系类型 | 例子 | 它需要的注意力 |
|---|---|---|
| 语法依存 | 「他把书放在桌上」——动词要找宾语 | 看结构位置 |
| 指代消解 | 「小明迟到了,他很急」——他要指回小明 | 看语义指向前文 |
| 局部搭配 | 「人工智能」——相邻词构成固定短语 | 看紧邻位置 |
| 长距主题 | 段落开头定的主题,影响后面每个词的理解 | 看很远的位置 |
单头必须用同一张权重表同时兼顾这四件事,结果是每种都做得不够专。 这就是多头的出发点:不是让它看得更多,是让它能同时用几种不同的「看的角度」。
多头怎么做:切维度,不是复制模型
很多人以为多头是「跑 32 个 Transformer」,这是错的。多头是把同一个 d_model 切成 h 份,每份独立做一次注意力,再拼回去。
最反直觉的一点:计算量几乎没变
直觉上「32 个头」应该贵 32 倍。实际不是,因为每个头的维度也缩小了 32 倍。
| 方案 | 头数 × 每头维度 | 总维度和 | 相对计算量 |
|---|---|---|---|
| 单头 | 1 × 4096 | 4096 | 1× |
| 多头 h=32 | 32 × 128 | 4096 | ≈1×(基本持平) |
| 多头 h=64 | 64 × 64 | 4096 | ≈1×(但每头太窄,收益递减) |
所以多头是一笔「几乎免费的表达力提升」——参数总量没涨,计算量没涨,但模型能同时保留多种关注模式。 这也是为什么它从 2017 年至今没被替换掉。
头到底在学什么:别把它想得太整齐
论文和科普常画「这个头管语法、那个头管指代」,读起来很舒服。但要说实话:没有哪一层是被人工指定分工的, 这些观察是事后分析出来的,而且不同模型、不同层差异很大。
| 常见说法 | 实际情况 | 工程含义 |
|---|---|---|
| 「第 3 个头专门管指代」 | 是统计倾向,不是硬编码。同一个头在别的输入上可能干别的事 | 不要基于「头编号」做任何工程假设 |
| 「头越多越好」 | 超过一定数量收益递减,且大量头可以被剪掉而性能几乎不掉 | 剪枝、蒸馏时头是首选目标 |
| 「多头 = 多个模型集成」 | 共享同一个输入与同一套嵌入,不是独立模型 | 不能指望它带来「集成」那种稳健性 |
| 「多头一定比单头强」 | 在极小模型或极短任务上,多头的优势可能被噪声吃掉 | 小模型可以少开几个头,省算力 |
工程变体:MQA 与 GQA,省的是显存不是表达力
标准多头(MHA)在推理时有个麻烦:KV Cache 会随头数线性增长。于是出现了两个变体, 它们不改「多头提升表达力」这件事,只改推理时缓存多少 K 和 V。
| 方案 | Q 头数 / KV 头数 | KV Cache 大小 | 效果 | 谁在用 |
|---|---|---|---|---|
| MHA 标准多头 | h / h | 1×(最大) | 表达力最强 | 训练阶段、多数早期模型 |
| MQA 多查询 | h / 1 | 1/h | 略降,长上下文时明显 | 高并发推理服务 |
| GQA 分组查询 | h / g(如 8 组) | g/h | 接近 MHA | 当前主流开源模型普遍采用 |
5.6 同类架构:Transformer 的对手们,以及它们为什么没赢
这一节回答一个被大多数教材跳过的问题:Transformer 是唯一的选择吗? 不是。过去三十年,处理序列数据至少有六种主流架构,每一种都在解决「怎么让模型记住前文」这个问题, 只是取舍不同。理解这些取舍,你才能看懂今天为什么是现在这个样子,也才能判断未来的变化。
七种架构横向对比
| 架构 | 核心机制 | 训练并行 | 复杂度 | 推理内存 | 长依赖 | 现状 |
|---|---|---|---|---|---|---|
| RNN 1990s |
隐状态逐时间步传递:hₜ = f(hₜ₋₁, xₜ) |
❌ 必须串行 | O(n·d²) | O(d) | 弱(衰减) | 基本淘汰 |
| LSTM / GRU 1997 / 2014 |
加门控(遗忘门、输入门、输出门)控制信息留存 | ❌ 必须串行 | O(n·d²) | O(d) | 中(缓解但不根治) | 少数时序任务 |
| TextCNN 2014 |
多个不同宽度的卷积核滑过序列,提取局部 n-gram 特征 | ✅ 完全并行 | O(n·k·d) | O(1) | 弱(感受野有限) | 短文本分类偶用 |
| Transformer 2017 |
全对全注意力,任意两位置直接相连 | ✅ 完全并行 | O(n²·d) | O(n) KV Cache | 强 | 绝对主流 |
| 线性注意力 2020–2021 |
用核函数重写 softmax,把矩阵乘顺序换一下,复杂度降到线性 | ✅ 完全并行 | O(n·d²) | O(d) | 中 | 研究 + 部分产品 |
| RWKV 2023 |
训练时像 Transformer(并行),推理时像 RNN(递推) | ✅ 完全并行 | O(n·d) | O(d) | 中 | 小众社区 |
| Mamba / SSM 2021–2024 |
选择性状态空间:参数随输入变化,能主动决定「记住什么」 | ✅ 完全并行(用扫描算法) | O(n·d) | O(d) | 中强 | 混合架构中崛起 |
逐个说清楚:每种架构的取舍
softmax(QKᵀ) 要先算一个 n×n 矩阵。线性注意力用数学技巧(核函数近似)改变矩阵乘法的顺序,先算 KᵀV(d×d),再乘 Q——矩阵从 n² 降到 d²,复杂度变成线性。h(t) 描述系统,输入 x(t) 通过状态方程推动它演化。Mamba 的关键创新叫「选择性」——传统 SSM 的参数是固定的,Mamba 让参数随输入变化,于是模型能主动决定「这条信息该记住还是忽略」。一张表说清「谁在解决什么问题」
| 你想解决的问题 | 该看什么 | 它做了什么 |
|---|---|---|
| 训练太慢、GPU 用不满 | Transformer 本身 | 用注意力换掉循环,让整句可以并行算 |
| 长上下文显存爆炸 | Mamba / 线性注意力 | 把 O(n²) 压成 O(n),代价是精确检索能力 |
| 注意力计算本身太慢 | FlashAttention | 不改变数学,只优化显存读写(IO-aware) |
| 推理时 KV Cache 太大 | PagedAttention / GQA / MLA | 分页管理、共享 KV 头、低秩压缩 |
| 模型太大装不下 | MoE / 量化 | 稀疏激活 / 降低精度 |
| 长上下文外推不够 | RoPE 插值 / YaRN | 调整位置编码的频率,让模型「见过」更长位置 |
5.7 参数:7B、70B 到底指什么
参数就是模型里那些可被训练的数字(权重矩阵里的元素)。7B = 70 亿个浮点数。 它决定了模型「脑子里能装多少东西」,但参数量 ≠ 能力——数据质量、训练策略、后训练对齐,对最终表现的影响往往比参数量更大。
| 规模 | FP16 显存(仅权重) | INT8 | INT4 | 典型部署 |
|---|---|---|---|---|
| 7B | ≈ 14 GB | ≈ 7 GB | ≈ 4 GB | 单张 24G 消费卡即可,边缘/私有化首选 |
| 14B | ≈ 28 GB | ≈ 14 GB | ≈ 8 GB | 单张 A10 / 4090 量化后可跑 |
| 70B | ≈ 140 GB | ≈ 70 GB | ≈ 40 GB | 2×A100 80G 或 4×48G |
| 671B(MoE) | ≈ 1.3 TB | ≈ 670 GB | ≈ 350 GB | 多机多卡;但激活参数远小于总参数 |
5.8 训练 vs 推理:两个完全不同的过程
预训练(Pre-training)
拿几万亿 token 的文本,做「预测下一个词」的自监督学习。前向算出预测,反向传播算梯度,更新参数。这一步烧掉 95% 以上的算力,产出的是一个「什么都懂一点、但不太听话」的基座模型。
监督微调(SFT)
用几万到几百万条「指令 → 理想回答」的样本继续训。让模型学会「按人类期望的格式和风格回应」,而不是接龙。
偏好对齐(RLHF / DPO)
让人给多个回答排序,训练奖励模型,再用强化学习(PPO)或直接偏好优化(DPO)把模型往「人类更喜欢」的方向推。这一步决定模型的安全性和「好用程度」。
推理(Inference)
参数冻结,只做前向计算:输入 token → 逐层计算 → 输出下一个 token 的概率分布 → 采样 → 追加回输入 → 再来一轮。这就是「自回归生成」。
温度与采样:为什么同一个问题答案不一样
- Temperature:调低(0~0.3)→ 输出更确定、更收敛,适合抽取、代码、分类;调高(0.8~1.2)→ 更发散,适合创意。
- Top-p(核采样):只在累计概率达到 p 的候选里采样,砍掉长尾胡话。
- Top-k:只保留概率最高的 k 个候选。
- Greedy / Beam Search:取最高概率或保留多条候选路径,用于翻译、结构化输出等确定性任务。
p_i = e^(z_i/T) / Σ e^(z_j/T)。所有概率为正、加起来等于 1。本 章 小 结
这一章从「一个 Block 里有什么」讲到「七种架构为什么只剩它」。三条主线值得记住:
① 结构上,Transformer 的骨架是「注意力负责通信、FFN 负责计算」,两次残差保证能堆得很深。输入输出形状不变,所以能无限堆叠。
② 形态上,只有「仅解码器」这一支赢到了最后,因为它训练目标统一、工程简单、上下文学习能力强。BERT 不是不优秀,是形态锁死了天花板。
③ 演进上,所有挑战者(线性注意力、RWKV、Mamba)都在解决同一个问题——把 O(n²) 压成 O(n),代价是精确检索能力。目前最务实的答案是混合架构,而不是谁取代谁。
最后一句:参数量决定容量上限,但决定实际表现的是数据质量与后训练策略。所以「换个更大的模型」经常不如「换更干净的数据」。
第二层 · 入门:模型为什么会「一本正经地胡说」
生成原理 / 涌现 / 知识边界
- 下一 token 预测的机制,以及它为什么能长出品智能
- 幻觉的数学本质:优化的是「像不像」,不是「真不真」
- Scaling Law 与涌现,以及「涌现是否错觉」的争议
- 知识截止为什么会导致「自信地说错」
如果你只记住这一章的一句话,请记住这句:大模型不是「知识库 + 检索」,而是「概率续写器」。 它的每一个字都是「最可能接下去的那个字」。理解了这一点,幻觉、上下文遗忘、不能算数、不会用工具,全都变得可解释。
6.1 下一 Token 预测:一个被低估的机制
训练目标只有一个:给定前文,最大化下一个 token 的似然。看起来简单到不像能产生智能,但要在整个互联网上把这个任务做好, 模型被迫学会了语法、事实关联、逻辑推理、代码结构、翻译对齐——因为这些都是「预测下一个词」的必要条件。
6.2 涌现能力与 Scaling Law
6.3 知识截止与「不知道」的缺失
模型的全部世界知识来自训练语料,语料有截止日期。截止之后发生的事,它一律不知道——但它不会告诉你「我不知道」, 因为它没有被训练成「先判断可知性再回答」,而是「接着往下写」。
想让我别编,只有两条路:把资料递到我手上(RAG),或者给我一个能查的工具(Agent)。」
本 章 小 结
本章最重要的一句:大模型不是知识库 + 检索,是概率续写器。
它的每一个字都是「最可能接下去的那个字」。想让它别编,只有两条路——把资料递到它手上(RAG),或给它一个能查的工具(Agent)。
Prompt 工程:Prompt 工程师每天在做的六件事
岗位能力模型 / 六段结构 / 基础五式与进阶六式 / 评测与版本管理
- 这个岗位不是「会聊天」,是「能把一件模糊的事变成可复现的指令」——六维能力模型
- 一条工业级提示词的六段结构:角色、任务、材料、约束、示例、输出格式
- 基础五式与进阶六式,每一式都要知道什么时候失效
- 怎么证明一版比上一版好:成对比较 + 回归集 + 三个指标
- 十种失效模式的排查表,和一条从 v1 迭代到 v5 的完整案例
很多人对 Prompt 工程师的理解停在「会写咒语」。真实情况正相反:这个岗位的核心不是措辞,是实验设计。
一个人能不能胜任,看他被问「你怎么证明改完更好」时的反应——答不出评测方法的,都还停在「玩」的阶段。
7.1 这个岗位到底在解决什么问题
7.2 能力模型:六个维度,缺一个就会卡在某个环节
- 能把「帮我处理一下客户反馈」拆成:分类 → 抽取要素 → 判定紧急度 → 生成回复草稿
- 知道哪些步骤该给模型、哪些该给代码
- 缺这一维 → 一条提示词塞八个要求,模型每次漏两个
- 能用六段结构组织一条长提示,而不是一段话堆到底
- 知道关键约束要前置、材料要标号、指令和材料要物理隔开
- 缺这一维 → 提示词越改越长,效果越来越差
- 能挑出 2–3 个覆盖边界的示例,而不是挑最漂亮的
- 知道示例里的格式会被模仿,包括你不想要的格式
- 缺这一维 → 示例给了一堆,模型学到的全是错的模式
- 能写出下游解析得住的结构(JSON Schema / 固定列 / 枚举值)
- 知道「格式不对」要在程序侧校验重试,不能只靠提示词祈祷
- 缺这一维 → 演示时好好的,一接系统就崩
- 能建 30–50 条覆盖真实分布的回归集
- 会用成对比较而不是绝对打分;知道怎么算通过率、格式合规率
- 缺这一维 → 永远在「感觉好像好了一点」里打转
- 每条提示词有版本号、有变更记录、有对应的评测结果
- 知道怎么回滚,知道线上跑的是哪一版
- 缺这一维 → 出问题找不到是哪次改动引入的
7.3 一条工业级提示词的六段结构
你手上有个会要开,随手把一叠会议记录递给新来的小陆:「帮我整理一下。」
两小时后他交上来一份东西:把记录重抄了一遍,还加了几段自己的感想。
你有点烦:「我不是要这个。」他也委屈:「你没说要不要感想啊。」
写提示词,本质就是把「派活」这件事做到不留歧义。下面这六段,就是六件必须交代的事—— 少一件,对方就得靠猜;而 AI 猜的方向,往往跟你想的正好相反。
网上流传的提示词多是「一段话」。能用,但不可维护。真实项目里的提示词是分块的,每一块承担不同职责, 出问题时你能定位到是哪一块的问题——就像派活时你能说清「是目标没说清,还是格式没说清」。
把六段拼起来,一份可用的模板长这样。注意两处细节:标签用尖括号把材料包起来(避免材料里的文字被当成指令), 以及约束写的是「替代动作」而不是「禁止」。
# 角色
你是一名企业合同审阅助手,只做风险标注,不做法律意见。
# 任务
阅读 <doc> 中的合同文本,找出对我方不利的条款,按风险等级排序。
# 材料
<doc id="1">
(这里粘贴合同全文或检索到的段落)
</doc>
# 约束
1. 只依据 <doc> 中的内容判断,不得引入外部知识。
2. 每条结论必须附「原文引用」,引用不超过 30 字。
3. 若 <doc> 中找不到相关条款,输出「未在合同中找到相关约定」。
4. 不做金额计算,如涉及比例,原文照抄。
# 示例
输入:甲方有权单方面调整服务价格。
输出:{"risk":"高","clause":"甲方有权单方面调整服务价格",
"reason":"价格调整权单方归属,我方无异议机制","suggest":"增加提前30日书面通知"}
# 输出格式
严格输出 JSON 数组,每个元素包含 risk / clause / reason / suggest 四个字段。
risk 只能是 "高" / "中" / "低"。不要输出任何解释性文字。
第 3 条「找不到就说未找到」——它把模型的退路留出来了,直接消灭大部分编造。
第 4 条「不做金额计算」——它把模型不擅长的部分摘出去了,交给后面的人工或代码。
写提示词的高阶动作,是「减法」:把不该它做的事明确摘出去。
7.4 基础五式:每一式都要知道什么时候失效
这五种是所有人都该会的。但网上只讲「怎么用」,不讲「什么时候没用」——后者才是你排查问题时需要的。
| 技术 | 怎么写 | 什么时候有效 | 什么时候失效 |
|---|---|---|---|
| Zero-shot | 直接说任务,不给例子 | 任务常见、格式简单(翻译、摘要、改写语气) | 任务有特殊约定(你们公司的分类体系、特殊格式)——它只能猜 |
| Few-shot | 给 2–5 个「输入 → 输出」示例 | 格式复杂、判断标准模糊、需要固定风格 | 示例不覆盖边界时:你给 3 个「正面评论」,它会把中性判成负面;示例本身有错,错误会被稳定复制 |
| CoT 思维链 |
要求「先分析再结论」,或给一个带推理过程的示例 | 多步推理、涉及比较和计算、需要可解释 | 简单任务上反而变差——强行编推理过程会引入错误;推理模型上也不需要手动要求 |
| 角色设定 | 「你是一名……」 | 需要特定语气、特定知识范围、特定严格程度 | 把它当成「能力增强」用——写「你是资深律师」不会让它多懂法律,只会改变表达风格 |
| 输出格式约束 | 指定 JSON / 表格列 / 枚举值 | 任何要接进系统的场景,都是必须的 | 只写「输出 JSON」不够——字段名、类型、可选值都要写死,否则每次结构都不一样 |
比如做评论情感分类,三个示例不该是「好评 / 中评 / 差评」,而该是 「明确好评」「表面夸实际吐槽」「只有表情没有文字」——后两个才是模型会错的地方。
示例是用来划边界的,不是用来展示平均情况的。
7.5 进阶六式:把一次性问答变成可拆解的流程
同一问题跑 5 次,取多数结论。成本 ×5,换来的是方差下降。
适用:判断类任务(这条是不是违规、这封简历匹配不匹配),且错一次的代价高。
不适用:生成类任务(五次文案取多数没有意义)。
让它先出 3 个思路,各自评估,再选一个展开——而不是一条路走到底。
适用:开放式方案设计(写什么标题、怎么拆这个需求)。
不适用:有唯一正确答案的任务,纯浪费 token。
「想 → 调工具 → 看结果 → 再想」。这是 Agent 的基础循环,第 9 章详讲。
适用:需要外部信息或外部动作的任务。
注意:必须设轮次上限,否则会绕圈。
让它先答一版,再让它按标准自查一遍,然后改。相当于把「复核」也交给它。
适用:有明确验收标准的任务(代码是否可运行、文案是否含禁用词)。
注意:它会看不出自己的错,因为错的地方它认为是对的。自查只能抓「形式问题」,抓不到「事实问题」。
把一个复杂任务拆成 3–5 次调用,每次只做一件事,中间结果落盘可查。
适用:长文档处理、多字段抽取、需要中间校验的流程。
为什么比一条长提示好:中间结果可见,错了知道错在哪一步。
让模型帮你写提示词:给它任务和三个失败案例,让它输出改进后的提示。
适用:冷启动、想不出结构时。
注意:它写出来的提示往往偏长且堆砌,必须你亲手删掉一半才可用。
7.6 结构化输出:让下游能接住
提示词写得再好,如果输出是一段自然语言,它就只是个「玩具」。能进系统,必须机器可解析。
现在主流模型都支持结构化输出(JSON Schema 约束),这是最可靠的方式。但即使不用它,你也该按下面三层来做:
第一层 · 在提示里写死结构
不要只说「输出 JSON」,要给出完整骨架:字段名、类型、可选值、是否允许 null。最好给一个完整的输出示例(这就是 few-shot 用在格式上)。
第二层 · 程序侧校验
拿到输出先 parse,失败就带着错误信息重试一次:「上次输出缺少字段 reason,请重新输出,只输出 JSON」。这一招能救回九成的格式错误。
第三层 · 业务校验
格式对了不代表内容对:金额是不是负数、日期是不是未来、枚举值是不是在范围内。这一层必须由代码做,不能交给模型自查。
amount 是字符串「1,200元」,还有一批 date 是「下周一」。7.7 幻觉:不是 bug,是机制的必然产物
Hallucination(幻觉)指模型生成了流畅、自信、但事实错误或无依据的内容。它有三种完全不同的成因,对应三种完全不同的解法—— 用错解法是常见浪费。
| 类型 | 表现 | 根因 | 有效对策 |
|---|---|---|---|
| 事实性幻觉 | 编造不存在的人名、论文、法条、数据 | 参数里没有这条知识,但「格式」见过太多次 | RAG 提供依据 + 强制引用 + 无依据时拒答 |
| 忠实性幻觉 | 资料里明明写了 A,它总结成 B | 生成长度超出可靠范围、指令冲突、上下文过长 | 缩短输入、分段处理、要求逐条对照原文、加校验环节 |
| 逻辑性幻觉 | 推理链条看似合理,中间某步算错或跳步 | 自回归一次前进一步,缺少全局校验 | CoT / DoT 显式展开、让模型自检、用代码工具算数 |
① 给依据:把原文放进上下文,并要求「逐句标注来自第几段」。
② 给退路:明确允许回答「材料未提及」。不给退路,模型一定会编。
③ 给校验:生成后跑一次「这条结论能否在原文找到支撑」的二次判断。
④ 给工具:算数、查库、查时间,交给确定性工具,不要交给概率模型。
7.8 怎么证明一版比上一版好:提示词评测
这是整个岗位最关键的一节。没有评测,你的每一次修改都是赌博——而且你会在「这次感觉好多了」的错觉里循环, 直到上线才发现某类输入全崩了。
具体怎么建评测集,三条规则:
| 规则 | 怎么做 | 为什么 |
|---|---|---|
| 从真实数据来 | 从线上日志、客服工单、用户提问里抽,不要自己编 | 自己编的样本会不自觉地避开难点,测出来永远好看 |
| 必须包含边界 | 按 60 / 25 / 15 配比:60% 常见、25% 边界、15% 该拒答的 | 只测常见样本,等于只测它会的那部分 |
| 成对比较优于打分 | 同一批样本,旧版和新版各跑一遍,让人(或裁判模型)判断「哪个更好」,而不是给绝对分 | 绝对分在不同时间点会漂移——今天给 7 分,明天同样的输出可能给 6 分 |
① 长度偏好:更长的答案更容易被判为好。
② 位置偏好:放在前面的候选更容易赢。
③ 自我偏好:同族模型倾向给同族输出高分。
对策:交换顺序跑两次取一致结果;控制长度;裁判模型与被测模型不用同一家。
7.9 版本管理:出问题时,你得知道是哪一次改动
提示词是代码,不是配置。它该有版本号、变更记录、和对应的评测结果。
最小可行的做法,一个表格就够了:
| 版本 | 改了什么 | 通过率 | 格式合规 | 结论 |
|---|---|---|---|---|
| v1 | 初版:只写了任务和格式 | 62% | 71% | 基线 |
| v2 | 加两个边界示例 | 74% | 88% | 格式问题基本解决 |
| v3 | 加「未提及时拒答」 | 79% | 88% | 编造率下降,但漏答上升 |
| v4 | 把材料用标签隔开 | 85% | 91% | 当前线上版本 |
| v5 | 换成更强模型(提示未改) | 86% | 93% | 提升有限,成本翻倍,不采用 |
v5 这一行很值得看:换模型只带来 1 个点,成本翻倍。这就是为什么 6.8 的评测必须先做—— 没有这张表,你会在「感觉不够好」时本能地换更贵的模型,然后既没解决问题,又抬高了成本。
7.10 完整案例:把「帮我写周报」从 v1 改到 v5
这个案例小到可以今天做完,但包含了上面全部要素。
v1 · 自然语言版
帮我根据下面的工作记录写一份周报。
(粘贴一堆流水账)
问题:输出像日记,没有结构;长度随它心情;有的条目编了细节。通过率约 50%(10 条里 5 条能用)。
v2 · 加结构与长度约束
根据工作记录写周报,严格按以下结构:
1. 本周完成(3–5 条,每条不超过 40 字,格式:事项 + 结果)
2. 进行中(含当前进度百分比)
3. 风险与需要支持(没有就写「无」)
总长度不超过 400 字。
变化:结构稳定了,但出现了新问题——它会把「和产品对了一次需求」写成「完成需求评审并推动落地」,夸大了。通过率 68%。
v3 · 加「不许加工」的约束
(在 v2 基础上追加)
约束:
- 只使用记录中出现的事实,不得补充、推断或美化。
- 每条必须能对应到原文的某一句,若记录过于简略,
照原样写,不要扩写。
- 若某条记录不足以判断结果,写「进展:待确认」。
变化:夸大问题基本消失。但新问题出现——有些条写得过于干瘪,不像周报。通过率 76%。
v4 · 加一个示例(关键一步)
(在 v3 基础上加示例)
示例:
记录:周三跟产品对了下订单模块的改法,还差接口没定
输出:订单模块改造方案已对齐,接口定义待确认(进度 60%)
注意:示例展示的是「如何在不夸大的前提下写清楚」,
不是让你照抄这个句式。
变化:这一步提升最大——通过率 85%,格式合规 94%。因为它同时解决了「太干」和「太夸」两个方向,示例是唯一能同时表达「尺度」的手段。
v5 · 换模型对照
同样的提示词,换更强的模型跑一遍:通过率 86%,成本约为原来的 3 倍。
结论:不换。剩下那 14% 的失败,不是模型能力问题——是那几条工作记录本身就写得太简略,任何模型都还原不出结果。 这时候正确的动作是改输入规范(要求大家记录时写清结果),不是换模型。
认不清这一点的人,会在最后 15% 上耗费 80% 的时间。
7.11 十种失效模式:拿着这张表去排查
| 症状 | 最常见的原因 | 先改什么 |
|---|---|---|
| 输出格式每次都不一样 | 只说了「输出 JSON」,没说字段和类型 | 给完整骨架 + 一个输出示例;程序侧加校验重试 |
| 该拒答的时候编了 | 没给退路,或退路的措辞不够明确 | 加「未提及时回答『未提及』」,并把拒答样本放进评测集 |
| 长文档后半段被忽略 | 材料太长,中段丢失 | 分段处理(链式),或先检索再喂;不要靠「请你仔细阅读」 |
| 指令明明写了却不遵守 | 关键约束埋在长段落中间;或与其他指令冲突 | 把约束前置、编号、单独成段;检查有没有互相矛盾的条目 |
| 示例给得越多越差 | 示例不覆盖边界,或示例本身有错 | 删到 2–3 个,专门挑「表面像但结论不同」的样本 |
| 同一输入两次结果差很多 | 温度高;或任务本身有歧义 | 温度设 0;把歧义在提示里消除(明确判定规则) |
| 越改越长,效果越差 | 约束互相打架;或关键信息被稀释 | 删掉一半:只保留「材料、约束、格式」,其余是包装 |
| 换个模型就崩了 | 提示里用了某家的特殊语法或隐式约定 | 用标准结构重写;把厂商特性降到最低 |
| 多轮对话后跑偏 | 历史太长,早期设定的角色被稀释 | 每一轮都重新注入关键约束,而不是只在第一轮说 |
| 加了工具就乱调 | 工具描述太模糊,或工具太多 | 精简工具数量;把每个工具的「什么时候用」写进描述 |
7.12 七天练习:从会写到会证明
把一件事说清楚
- 选一个你每周真做的事(写周报、回客户邮件、整理会议纪要)
- 写 v1,只写任务,不给结构
- 跑 10 次,记录 10 条输出里有多少条你能直接用
- 产物:一份「v1 通过率」记录
加结构与示例
- 按六段结构重写为 v2:加材料标签、约束、输出格式
- 挑 2 个「边界」示例(不是最漂亮的,是最容易错的)
- 再跑 10 次,对比通过率
- 产物:v1 vs v2 的对照表
建回归集
- 从真实记录里凑 30 条,按 60/25/15 配比
- 写一个脚本批量跑,输出通过率与格式合规率
- 再改两版,每版只改一处
- 产物:一张四行的版本记录表
做一次对照实验
- 同一提示词,换一个模型跑同一批样本
- 记录:通过率变化 vs 成本变化
- 写一句结论:值不值得换
- 产物:一页结论,能直接给老板看
这个能力,比记住一百个「提示词技巧」有用得多——技巧会随模型迭代失效,评测方法不会。
本 章 小 结
提示词工程的本质不是措辞,是把条件设对,并且能证明它设对了。
六段结构里,真正起决定作用的是材料、约束、格式;提升曲线先陡后平,卡在 85% 时该改的是输入和边界,不是模型。
行动建议:今天就选一件你每周真做的事,写出 v1 并跑 10 次,把「能用几条」记下来。这个数字是你后面所有改进的基线。
微调、量化、推理模型:三条不同的改造路径
Fine-tuning / Quantization / Reasoning
- 微调改的是行为(风格、格式),不是知识
- LoRA / QLoRA 的原理与适用边界
- 量化换显存的真实代价:哪三类任务最先退化
- 推理模型与 test-time compute:想更久换正确率,代价是 5~30 倍成本
模型不够用的时候,绝大多数人的第一反应是「微调一下」。但微调只解决一类问题—— 让模型改变「行为方式」,而不是「补充知识」或「获得实时信息」。选错路径,钱和时间都会白花。
8.1 微调家族
ΔW = B·A(A 是 d×r,B 是 r×d,r 通常 8~64)。只训这几十万到几百万个参数,显存需求降到全参的几十分之一,效果在多数任务上接近全参。8.2 量化:用精度换显存
8.3 推理模型:把算力花在「想」上
2024 年之后出现了一类新范式:模型在给出答案前,先产生一长串内部推理(可能几千 token), 通过「想更久」来提升正确率。这类模型被称为推理模型(reasoning model),核心思想叫 test-time compute(测试时计算)。
8.4 三条路径怎么选:一张决策表
| 你的问题 | 正确手段 | 为什么不用别的 |
|---|---|---|
| 模型不知道我们公司的产品参数 | RAG | 微调注入知识成本高、更新难、且容易编造相似内容 |
| 模型回答风格不对、格式总跑偏 | 微调(LoRA) | 提示词能缓解但不稳定,长尾格式靠提示压不住 |
| 模型需要查实时数据、执行操作 | Agent + 工具 | 微调和 RAG 都无法产生「动作」 |
| 本地部署,显存不够 | 量化 | 换小模型会损失能力,量化是更平滑的折中 |
| 数学、多步逻辑、复杂代码总是差一点 | 推理模型 / CoT | 微调很难教会「推理过程」,这是训练范式问题 |
| 任务固定、步骤明确、要求稳定 | Workflow | 让模型自由发挥反而不稳定,写死流程更可靠 |
本 章 小 结
三条改造路径要分清:补知识用 RAG,改行为用微调,省显存用量化,提推理用推理模型。
选择顺序永远是:Prompt → RAG → Workflow → 微调,因为迭代成本从一分钟涨到一个月。跳过前两步直接微调,是最常见的预算浪费。
第三层 · 深入①:RAG,给模型配一个图书管理员
检索增强生成
- RAG 与大模型的三层关系:供给、约束、互补,以及参数化知识 vs 非参数化知识
- 八个环节逐一拆解:解析 → 切块 → 向量化 → 索引 → 改写 → 检索 → 重排 → 拼装
- 每个环节的关键参数、代码做法、失败模式
- 查询改写与重排:两个性价比最高、最常被跳过的环节
- RAG 的四种形态:Naive / Advanced / Modular / Agentic
- 一条完整数据流的数字感受(耗时、token、成本)
- 调优顺序:解析 → 切块 → 检索 → 重排 → 提示 → 换模型
RAG 是全篇最容易理解、也最容易做砸的技术。它的想法一句话说得完:回答之前先去查,把查到的原文一起递给模型。 但真正决定效果的,不是「查不查」,而是「怎么切、怎么找、怎么排、怎么塞」这四件事。
9.1 先讲清关系:RAG 和大模型到底是什么关系
绝大多数教材直接把 RAG 讲成「检索 + 生成」,但它和模型的关系没讲透,导致后面所有设计决策都缺少依据。 我的理解是:RAG 不是模型的插件,是模型的「外部知识供给线」。
供给
约束
互补
一个绕不开的概念区分:参数化知识 vs 非参数化知识
这是理解 RAG 价值的关键。模型的知识有两种存在形式,各有利弊:
| 维度 | 参数化知识(训练进权重) | 非参数化知识(RAG 提供) |
|---|---|---|
| 存在形式 | 分散在几十亿参数的连接强度里 | 存在外部数据库,原文明明白白 |
| 精度 | 模糊。能说出大概,记不准具体数字 | 精确。原文怎么写就是什么 |
| 更新 | 要重新训练,成本以万计 | 改一条文档,几秒钟生效 |
| 溯源 | 做不到。「你为什么这么答」只能给个大概 | 能指到第几页第几段 |
| 覆盖 | 广。整个互联网的常识与语言规律 | 窄。只有你给的那几段 |
| 成本 | 训练贵,推理便宜 | 存储便宜,但每次请求都要付 token 费 |
| 适合 | 语言能力、常识、推理模式 | 事实、数字、条款、时效信息 |
所以「用 RAG 还是用微调」这个问题,本质是问:你要补的是「表达方式」还是「事实内容」? 补表达 → 微调;补事实 → RAG。搞反了,钱和时间都会白花。
一个更直观的比喻:开卷考试
闭卷考试(纯模型)考的是记忆力——学生(模型)只能靠脑子里存的。记错了也得写,还得写得理直气壮。
开卷考试(RAG)我负责把相关的几页书翻到桌上。但注意三件事:
① 我翻得对不对,决定他答得对不对;
② 我只翻几页,不是整本书——翻多了他反而看不完;
③ 书在他手上,他仍然可能抄错行。所以还得要求他标注引用,方便你核对。」
RAG 不能做什么:三条边界必须说清
检索到三段材料,需要「综合这三段推出结论」——这一步仍然靠模型。材料再好,模型推不出来就是推不出来。RAG 补的是知识,不是智力。
检索本质是「猜哪几段最相关」,必然有错。而且模型有个坏习惯:检索错了它也照答,还会很自信。这叫忠实性幻觉。
用户问「这两个概念有什么区别」,材料里没写,模型得靠自己懂的常识来组织答案。所以 RAG 系统依然依赖一个足够强的基座模型。
9.2 两条链路:离线索引 vs 在线查询
初学者最常犯的错,是把 RAG 想成「一个函数」。它其实是两条独立的流水线: 一条在后台把文档加工成可检索的形态(离线,可以慢),一条在用户提问时实时跑(在线,必须快)。两条链路共用同一个向量库。
9.3 环节一:文档解析——最脏、最容易被跳过的一步
如果你的 RAG 效果不好,先别怀疑模型,先去看解析出来的文本长什么样。 我见过太多项目:检索算法调了两周,最后发现问题出在 PDF 解析把双栏读成了串行。
判断方法很简单:随便抽 5 份文档,把解析后的纯文本打印出来读一遍。 如果你自己都读不通(句子错位、表格变乱码、页眉页脚混进正文),模型更读不通。
PDF 有三种,处理方式完全不同
| 类型 | 特征 | 处理方式 | 典型问题 |
|---|---|---|---|
| 文本型 | 能选中、能复制文字 | 直接抽取文字层,同时读取位置信息(每个字在哪一页、哪个坐标) | 双栏会串行;页眉页脚混进正文;公式变成乱码 |
| 扫描型 | 整页是图,选不中 | OCR 识别;必须先做图像预处理(去噪、纠偏、二值化) | 识别错字;表格结构丢失;手写体基本不可用 |
| 混合型 | 正文是文本,插图/表格是图 | 文本层 + 图像区域分别处理,再按位置合并 | 图文顺序错乱;表格被当普通文本读 |
一条完整的解析链路
① 类型判断
抽取前几页的文字层,字符数接近 0 就判定为扫描件,走 OCR 分支。不要对所有文档都用 OCR——OCR 又慢又容易错,文本型直接用文字层质量高得多。
② 版面分析(Layout Analysis)
识别出「标题、正文、表格、图片、页眉页脚、页码」这些区域,并按阅读顺序排序。这一步是解决双栏串行的关键—— 不做版面分析,双栏文档会被逐行读成「左一句右一句」。
③ 表格单独处理
表格绝不能当普通文本切。要么转成 Markdown 表格、要么转成「字段: 值」对、要么直接入结构化库。 一个 10 行 6 列的表格,如果被切成 60 个碎片,检索出来全是噪声。
④ 清洗
去掉页眉页脚、页码、水印文字;合并被硬换行切断的句子;统一全角半角;修掉 OCR 常见错字(「0」和「O」、「1」和「l」)。
⑤ 结构化输出
输出不应该是「一大段纯文本」,而应该是带层级的块:每块带「所属章节、页码、类型(正文/表格/图注)」。 这些元数据在后面切块、检索、引用时都要用。
| 任务 | 常用工具 | 选择要点 |
|---|---|---|
| 文本抽取 | PyMuPDF、pdfplumber | PyMuPDF 快;pdfplumber 能拿到字符坐标,做版面分析更方便 |
| OCR | PaddleOCR、Tesseract、云服务 | 中文场景优先 PaddleOCR;Tesseract 对中文和表格支持弱 |
| 版面分析 | DocLayout-YOLO、LayoutLM 系列、MinerU | 决定双栏/多栏能否正确还原,比 OCR 更值得投入 |
| 表格识别 | Camelot、Table Transformer、多模态模型 | 规则表格用 Camelot;复杂合并单元格用模型 |
| 一句话方案 | MinerU、Unstructured、Marker | 想要「开箱即用」,先试这三个,再决定要不要自建 |
9.4 环节二:切块——RAG 效果的第一决定因素
Chunking(切块)是把长文档切成小片段的过程。切得好,每块都是语义完整的「一页知识」;切得差,一句话被拦腰截断,检索出来也没法用。
9.5 环节三:向量化与索引——把块变成可检索的形态
切完块,每一块要变成向量并存进数据库。这一步技术上最简单,但有几个「不报错却毁效果」的细节。
必须批量编码(batch 32~128),单条调用会浪费 90% 的 GPU。编码后统一做 L2 归一化,
这样余弦相似度就等于内积,索引可以用最快的算法。
如果模型本身输出未归一化而你漏了这一步,相似度会被向量长度干扰——排序结果看起来很怪,但不会报错。
索引用的模型和查询用的模型必须完全一致(同版本、同参数、同归一化方式)。
换模型必须全量重建索引,不能增量混用——两批向量不在同一空间,算出来的相似度没有意义。
元数据设计:决定后面能不能「过滤」
向量库存的不能只有向量和原文。元数据决定了你能做多精细的检索——没有它,你只能全库搜,无法做「只查这个部门」「只要今年的」这类限定。
| 字段 | 必填 | 作用 |
|---|---|---|
doc_id | ✅ | 文档唯一标识。删除、更新、去重都靠它 |
chunk_id | ✅ | 块序号。用于「取相邻块补充上下文」 |
source | ✅ | 来源文件名 / URL。引用时显示给用户 |
page / section | ✅ | 页码与章节标题。引用可溯源的关键,也用于给块加「所属章节」前缀 |
tenant_id | ✅(多租户) | 租户隔离。缺这个字段就是数据泄露风险 |
dept / acl | 建议 | 部门与权限标签。做到「检索前过滤」而不是「检索后筛」 |
created_at / version | 建议 | 时间与版本。用于时效排序、旧版本淘汰 |
doc_type | 可选 | 正文 / 表格 / 图注。不同类型可用不同策略 |
原文块:「……因此该条款不适用。」
加上前缀后:「《华东区经销合同 v3》第 6 章 违约条款 —— ……因此该条款不适用。」
这个前缀在编码时一起算进向量,能显著提升检索命中率——因为孤立的一句话往往缺少足够的语义线索。
9.6 环节四:查询改写——提升效果最快,做的人最少
这一步的性价比高得离谱:不动模型、不重建索引,只加一个改写环节,召回率常能提升 10~20 个点。 但大多数教程跳过了它。
原因很简单:用户的问题和文档的写法不匹配。用户问「报销多久到账」,文档写的是「费用核销流程的时限规定」。 向量模型再强,也难把这两种表达直接对上。
| 方法 | 怎么做 | 解决什么问题 | 成本 |
|---|---|---|---|
| 多查询 Multi-Query |
让模型把原问题改写成 3~5 个不同说法,分别检索,结果合并去重 | 单一表述的召回盲区 | 检索 3~5 倍 |
| HyDE | 让模型先「编」一个假答案,用假答案去检索(而不是用问题) | 问题与文档表述差异大——假答案更像文档的语气 | 多一次生成 |
| 指代消解 | 多轮对话里把「那第二条呢」补全成「华东区合同的第二条违约条款是什么」 | 省略、指代导致的语义残缺 | 很低 |
| 查询分解 | 复杂问题拆成多个子问题,分别检索再综合 | 多跳问题(「A 的负责人所在部门的预算」) | 多轮检索 |
| 同义扩展 | 加行业同义词、缩写全称(「五险一金」↔「社保公积金」) | 领域术语不统一 | 很低 |
# 多查询 + HyDE 的组合(伪代码)
def rewrite(query, history):
# ① 指代消解:把多轮里的省略补全
standalone = llm(f"把这个问题改写成不依赖上下文、可独立理解的完整问题:\n"
f"对话历史:{history}\n当前问题:{query}")
# ② 多查询:生成 3 个不同角度的表述
variants = llm(f"从不同角度改写这个问题,输出 3 条,每行一条:\n{standalone}").split("\n")
# ③ HyDE:生成一段「假设的答案」,用于检索(可选,对短查询特别有效)
hypothetical = llm(f"用文档的语气写一段可能回答这个问题的文字(200 字以内):\n{standalone}")
return [standalone] + variants + [hypothetical]
反过来,如果失败原因是「召回了一堆不相关的」,那问题在重排,不在改写。
9.7 环节五:检索——从百万条里捞出那几条
检索这一步要做四件事:算相似度、取 top-k、去重、融合多路结果。每一件都有讲究。
① 相似度与 top-k:粗筛要「多取」
粗筛阶段的目标不是「准确」,是不遗漏。所以 top-k 要取得大一些——常见 k=20~50, 然后交给重排去精挑。如果 k 只取 5,重排就没有发挥空间,而且一旦粗筛漏了,后面全错。
② 去重:MMR 算法,解决「五条结果说的是同一件事」
纯按相似度排序,很容易返回 5 条几乎重复的片段——因为它们都和问题「很像」,但信息量重复。 这时模型看到的是五种说法讲同一件事,而不是五个不同方面。
分数 = λ × 相关性(问题, 候选) − (1−λ) × 最大相似度(候选, 已选)λ=1 时退化成纯相关性排序;λ=0 时只看多样性。常用 λ=0.5~0.7。
③ 融合:多路结果怎么合并
向量检索和关键词检索的分数不可比(一个是余弦相似度,一个是 BM25 分值,量纲完全不同)。 所以不能用加权求和,要用只看排名的融合方法——RRF(倒数排名融合),在第 10 章讲过,这里给具体算式:
# RRF:只看排名,不看分数
def rrf(vector_results, bm25_results, k=60):
score = {}
for rank, doc in enumerate(vector_results, start=1):
score[doc.id] = score.get(doc.id, 0) + 1 / (k + rank)
for rank, doc in enumerate(bm25_results, start=1):
score[doc.id] = score.get(doc.id, 0) + 1 / (k + rank)
return sorted(score.items(), key=lambda x: -x[1])
9.8 环节六:重排——把「像」变成「对」
粗筛给你 30 条候选,重排要挑出真正能回答问题的 5 条。 它用的是交叉编码器(Cross-Encoder):把问题和候选拼在一起送进模型,逐词比对,输出一个相关性分数。
| 对比项 | 向量检索(双塔) | 重排(交叉编码器) |
|---|---|---|
| 输入 | 问题和文档分别编码 | 问题和文档拼在一起 |
| 能否预计算 | 能,文档向量可离线算好 | 不能,每条都要重跑一次 |
| 能处理多少 | 百万级 | 几十条 |
| 精度 | 中 | 高(能识别「提到了但没回答」) |
| 延迟 | 毫秒级 | 50~200ms |
重排的价值在于它能识别一种向量检索识别不了的情况:「这段提到了关键词,但没有回答问题」。 比如问「退款多久到账」,一段讲「退款流程需要提交申请」的文档,向量相似度很高,但没回答问题——重排模型能把它压下去。
9.9 环节七:上下文拼装——最后 10% 的胜负
检索对了,拼装错了,一样白搭。这一步决定了模型「怎么理解这些材料」。
[系统]
你是一名严谨的知识库助手。规则:
1. 只依据下方【材料】回答,不得使用材料之外的知识;
2. 每句结论后标注来源编号,如 [1][2];
3. 材料中没有的信息,回答「材料未提及」,不要推测;
4. 若多份材料矛盾,指出矛盾并分别标注来源。
【材料】
[1] 来源:《华东区经销合同 v3》第 6 章(2026-03-15)
原文……
[2] 来源:《退款管理办法》第 2 条(2026-01-08)
原文……
【问题】
退款一般多久到账?
[输出格式]
- 结论:一句话
- 依据:[编号] 原文摘录
- 备注:材料未覆盖的部分
- 编号:每条材料带 [1][2],方便引用与核对
- 来源:文件名 + 章节 + 日期,让模型能判断时效
- 顺序:最相关的放最前,其次放最后(避开中段丢失)
- 去重:同一段落被多条命中时只留一份
- 只贴原文不标来源 → 模型无法判断可信度
- 材料塞太多(10 条以上)→ 噪音压过信号
- 把检索结果和闲聊混在一起 → 模型分不清哪是依据
- 不留输出预算 → 回答被截断
9.10 环节八:生成与引用——让答案可核对
检索对了,最后一步仍可能翻车。模型看到材料,也可能「自由发挥」。所以提示模板必须给三条硬约束:
限定来源
「仅依据以下材料回答。材料中没有的信息,回答『材料未提及』,不要推测。」——必须给退路,否则它一定编。
强制引用
「每句结论后标注来源编号,如 [1][2]。」引用不是为了好看,是为了让用户和下游校验程序能核对。
结构化输出
指定「结论 / 依据 / 置信度」三段式,或 JSON 字段。结构约束能显著降低跑题率。
9.11 RAG 的四种形态:从「能跑」到「会自己想办法」
前面八个环节是「标准 RAG」的全部。但工程上其实有四种成熟度不同的形态,能力、成本、延迟差很多。 搞清楚自己在做哪一种,能避免「用 Naive 的方案期待 Agentic 的效果」。
| 形态 | 做法 | 检索次数 | 延迟 | 适合 |
|---|---|---|---|---|
| Naive RAG 朴素 |
问题向量化 → 检索 top-k → 拼进提示词 → 生成。一条直线,没有分支 | 1 次 | 最快 | 知识库小、问题简单、对延迟敏感 |
| Advanced RAG 进阶 |
在 Naive 基础上加:查询改写、混合检索、重排、上下文压缩。仍是固定流程 | 1~5 次 | 中 | 80% 的生产场景,性价比最高 |
| Modular RAG 模块化 |
把各环节做成可插拔模块,加路由(判断该查哪个库)、融合(多路结果合并)、记忆 | 按需 | 中高 | 多知识库、多数据源、需要按问题类型分流 |
| Agentic RAG 智能体化 |
把「检索」交给 Agent 决定:查几次、要不要改写、结果够不够、要不要换关键词重查 | 不定 | 最慢 | 多跳问题、需要判断「信息是否充分」的复杂任务 |
9.12 一个完整的例子:500 份文档,从提问到回答
抽象讲完,看一条真实的数据流。假设你是某公司的客服知识库,有 500 份制度文件、产品手册、FAQ。
离线:建库(一次性 + 增量)
500 份文档 → 解析(去页眉、还原表格、修 OCR 错字)→ 切成 12000 块(平均 450 token,重叠 60) → 批量向量化(batch 64,归一化)→ 写入向量库,带元数据(部门、生效日期、权限)。 耗时约 2~4 小时,用一张消费级显卡即可。
在线第 1 步:查询改写(约 300ms)
用户问「报销多久到账」。改写后得到三条: 「费用报销的打款周期是多久」「报销审批通过后什么时候能收到钱」「差旅报销到账时间」。 三条并行检索,覆盖面比单条宽得多。
在线第 2 步:检索(约 40ms)
三条查询 × 每条取 top-30 = 90 条候选,用 RRF 融合去重后剩 约 50 条。 同时跑一路 BM25 关键词检索,补充「到账」这类字面匹配的结果。
在线第 3 步:重排(约 120ms)
50 条候选送进交叉编码器,逐条判断「这段能不能回答问题」,取前 5 条。 这一步会把「讲报销流程但没提到账时间」的段落压下去。
在线第 4 步:拼装(约 10ms)
5 条材料约 2200 token,加上系统提示(400)+ 问题与历史(300)+ 输出预留(800), 总计约 3700 token。每条材料标注来源与日期。
在线第 5 步:生成(约 2~4 秒)
模型输出:「一般情况下,报销审批通过后 3~5 个工作日到账 [1]。若遇月末结算,可能延长至 7 个工作日 [2]。 材料未提及跨行转账的具体差异。」——结论、依据、边界都有。
| 环节 | 耗时 | token 消耗 | 这一环坏了会怎样 |
|---|---|---|---|
| 查询改写 | ~300ms | ~300 | 改写跑偏 → 后面全错,且很难察觉 |
| 检索 | ~40ms | — | 召回不足 → 正确答案根本没进来 |
| 重排 | ~120ms | — | 排序错 → 噪音挤掉正确材料 |
| 拼装 | ~10ms | ~2200 | 顺序/格式差 → 模型理解错材料关系 |
| 生成 | 2~4s | ~1500 | 不守约束 → 编造、不引用 |
| 合计 | 约 3~5s | 约 3700 | — |
成本感受:按 2 元/百万 token 算,这一次问答约 0.0074 元。 如果换成「把 500 份文档全塞进长上下文」,一次是 约 12 元——差 1600 倍。 这就是 RAG 在经济上的根本意义。
9.13 评测与调优:先测哪一层,后改哪一层
RAG 调优最常见的浪费,是「一上来就换模型」。正确顺序是先定位问题在哪一层,再动那一层。
| 层 | 测什么 | 怎么测 | 不达标就先改这里 |
|---|---|---|---|
| 解析层 | 文本是否可读、表格是否完整 | 抽样 20 份,人工读一遍 | 换解析工具、加版面分析 |
| 切块层 | 块是否语义完整 | 随机抽 30 块,能否独立看懂 | 调 chunk_size、改切分策略、加章节前缀 |
| 检索层 | Recall@K:正确材料有没有进候选 | 200 条问题 + 标注答案位置 | 查询改写、混合检索、换 embedding |
| 重排层 | MRR / nDCG:正确材料排第几 | 同上,看首次命中排名 | 换重排模型、调整 top_n |
| 生成层 | 忠实度:答案是否都有材料支撑 | 人工抽 50 条,逐句核对 | 改提示模板、降温度、加自检 |
越靠前,改动越便宜、收益越大;越靠后,越贵且收益递减。 「换个大模型」永远是最后一步,不是第一步。而且如果你检索的 Recall@5 只有 0.6,换模型一点用都没有—— 材料根本没进上下文,模型再强也变不出来。
拿一条答错的案例,把正确的原文段落手工塞进提示词,再问一次。
· 塞了就对了 → 检索问题(回到检索层、重排层)
· 塞了还是错 → 生成问题(回到提示模板、模型能力)
这个测试能省掉几天的盲目调参。
9.14 十四种失败模式:一张排查表
| 症状 | 最可能的原因 | 先改哪里 |
|---|---|---|
| 答非所问,但材料里确实有正确答案 | 切块把答案切碎了 / 检索没召回 | 先看 Recall@K,再看切块策略 |
| 回答了,但用的是旧版本内容 | 索引没更新 / 没有版本管理 | 加增量更新与文档去重 |
| 答案夹带了材料里没有的内容 | 提示没给退路 / 温度过高 | 改提示模板,温度降到 0.2 以下 |
| 多跳问题答不出(A 的负责人所在部门的预算) | 单轮检索无法串联 | 查询分解 / GraphRAG / Agentic RAG |
| 表格和数字总是错 | 表格被当纯文本切碎 | 表格单独结构化存储,或改用 SQL 查询 |
| 检索回来五条,说的是同一件事 | 没做去重 | 加 MMR(λ=0.5~0.7) |
| 问题换个说法就查不到 | 没有查询改写,只有一种表述 | 加多查询 / HyDE / 同义扩展 |
| 明明库里有,就是搜不出来 | 元数据过滤过严,或切块太小缺上下文 | 放宽过滤条件;给块加章节前缀;调大 chunk_size |
| 长文档中间段落的内容总是漏 | 中段丢失 + 材料塞太多 | 控制在 3~5 条;重要材料放首尾 |
| 回答很笼统,不给原文依据 | 提示没强制引用 | 要求「每句结论标注 [编号]」 |
| 多轮对话到第三轮开始跑偏 | 指代没消解(「那第二条呢」) | 加指代消解改写;或每轮重写完整问题 |
| 不同部门的用户看到了彼此的内容 | 权限过滤缺失(安全事故) | 检索前按 tenant/dept 过滤,且在数据库层做 |
| 响应越来越慢 | 索引膨胀 / top-k 太大 / 上下文过长 | 清理过期数据;降低粗筛 k;压缩历史 |
| 上线三个月后效果逐渐变差 | 业务在变,文档和评测集没跟着变 | 建 badcase 回流机制;季度重建评测集 |
9.15 如果这是你的岗位:RAG 应用工程师的一天
「我们想让 AI 回答客户关于产品的问题。资料都在共享盘里,你看着办。」
这句话里有三个陷阱:「看着办」意味着没有验收标准;「资料都在共享盘」意味着你还没见过那批文件有多脏; 「回答产品问题」意味着答错的代价由业务方承担,但责任在你。
先说清这个岗位和其他岗位的分界,因为它是被误解最多的一个。
| 岗位 | 他交付什么 | 他不负责什么 |
|---|---|---|
| 算法工程师 | 训练/微调向量模型、优化召回算法 | 不管数据脏不脏、不管业务验收 |
| Prompt 工程师 | 生成阶段的指令与格式 | 不管材料对不对、不管召不召得回 |
| RAG 应用工程师 | 一个召回率可测、答案可溯源、能持续更新的问答系统 | 不训模型;也不改业务规则 |
| 后端工程师 | 接口、并发、权限、部署 | 不管效果好不好 |
换句话说:RAG 应用工程师是那个「对最终准确率负责,但没有权力改模型」的人。 所有能提效果的手段,都在数据和流程里——这正是这份工作的难点,也是它的价值所在。
六项能力,每一项的达标标准是可验的
- 能判断一批 PDF 是文本型、扫描型还是混合型,并分别处理
- 能识别双栏串行、表格错位、页眉页脚污染
- 达标:随机抽 20 页,人工能读懂的段落,解析后也读得懂
- 知道按标题切、按语义切、按固定长度切的差别
- 会给块加章节前缀,让孤立的段落也能被召回
- 达标:随机取 20 个块,每个块单独看都能看懂在说什么
- 会在自己的 200 条真实查询上测 Recall@5,而不是只看榜单
- 知道维度、最大长度、语言支持、许可各自的代价
- 达标:能说出「为什么选它」和「它在什么情况下会失效」
- 会用混合检索 + RRF,会做 MMR 去重
- 知道 top-k 该取大再重排,而不是直接取 3
- 达标:能定位「是该改检索还是该改重排」
- 有一批固定查询 + 标准答案段落,能算召回率
- 会做分类型统计(按文档类型、按问题类型)
- 达标:每次改动前后,能给出一张对比表
- 增量更新、版本管理、权限隔离、失败降级
- 知道换模型要全量重建索引,成本提前算
- 达标:文档更新后 10 分钟内可被检索到
一条铁律:调优顺序不能反
这是这一节最想让你记住的一句话: 解析 → 切块 → 检索 → 重排 → 提示 → 换模型。越靠前越便宜、收益越大。
| 顺序 | 改什么 | 耗时 | 典型收益 |
|---|---|---|---|
| 第 1 | 文档解析 | 1–3 天 | 召回率 +20~40 个点(脏文档场景) |
| 第 2 | 切块策略 | 半天 | +5~15 个点 |
| 第 3 | 查询改写 | 1 天 | +5~10 个点,且几乎零成本 |
| 第 4 | 混合检索 + 重排 | 1–2 天 | +5~12 个点 |
| 第 5 | 提示与拼装 | 半天 | +2~5 个点 |
| 第 6 | 换生成模型 | 半天 | +1~3 个点,成本可能翻倍 |
顺序反了,你会花两周调提示词,最后发现根本原因是「有 30% 的 PDF 没解析出文字」。
最后是分级。它比任何能力清单都更能回答「我现在值多少钱」。
| 级别 | 能独立做到什么 | 还做不了什么 | 经验量级 |
|---|---|---|---|
| L1 | 用现成框架搭一个能跑的问答,能调 chunk_size 和 top_k | 效果不好时说不清是哪一层的问题 | 1–3 个月 |
| L2 | 能从脏数据开始做完整链路,有评测集,能定位到具体环节 | 多租户、权限、大规模增量更新 | 6–12 个月 |
| L3 | 能设计多路召回 + 路由 + 图谱,能算清成本与延迟的权衡 | —— | 2 年以上 |
L1 会答「换个更好的模型」;L2 会先问「召回率是怎么算的、失败样本长什么样」; L3 会先要那 20 条失败样本,看完再说「这里有一半是解析问题,先别看检索」。
差别不在知识量,在排查顺序。
本 章 小 结
RAG 的本质是「把参数化知识换成非参数化知识」:模型负责「怎么说」,RAG 负责「说什么」。它给模型供给、也给模型约束,但不提升推理能力——这一点必须先认清,否则会把推理问题误判成检索问题。
八个环节里,解析和切块决定上限,改写和重排决定实际发挥。真正拉开差距的不是「用哪个向量库」,而是「PDF 解析有没有把双栏读成串行」「切块有没有把句子拦腰截断」「检索有没有做去重和改写」。
调优顺序记牢:解析 → 切块 → 检索 → 重排 → 提示 → 换模型。越靠前越便宜、收益越大。如果你检索的 Recall@5 只有 0.6,换再强的模型也没用——材料根本没进上下文。
检索与向量库:RAG 的发动机舱
ANN / HNSW / 混合检索 / 重排 / GraphRAG
- ANN 与 HNSW:为什么可以牺牲 1% 召回换几个数量级的速度
- 混合检索:向量管「意思像」,BM25 管「字面准」
- 重排(Cross-Encoder)为什么是性价比最高的单点优化
- GraphRAG 与 Agentic RAG 各自解决什么、代价是什么
上一节讲了 RAG 的流程,这一节拆开其中最关键的一环:「找得到」这件事是怎么在毫秒级完成的。 如果你只需要结论:向量检索负责「意思像」,关键词检索负责「字面准」,两者混合再重排,是目前最稳的组合。
10.1 为什么需要 ANN,而不是精确搜索
假设你有 100 万条文档块,每条 1024 维。要找出和查询最像的 10 条,最笨的办法是逐条算相似度——100 万次点积,单次约 1024 次乘加, 合计约 10 亿次运算,延迟到秒级,无法接受。所以工业界用 ANN(近似最近邻):牺牲一点点召回率,换取几个数量级的加速。
IVF 像先把图书馆的书按区域聚类,查询时只翻最可能的几个区,而不是全馆。
10.2 混合检索:向量找不准的地方,关键词能救
纯向量检索有个天然短板:它对专有名词、型号、错误码、人名极度不敏感。 比如查「ERR_CONN_5021 这个报错怎么解决」,向量模型会把它理解成「网络连接错误」这个语义, 然后把一堆讲 404、超时、DNS 的文档都排到前面——真正讲 5021 的那篇反而因为语义「不够典型」被排后。
score = Σ 1/(k + rank),k 常取 60。好处是不用把两种检索的分数归一化(它们的量纲根本不可比)。10.3 重排:把「像」变成「对」
10.4 当问题需要「串起来」:多跳与 GraphRAG
传统 RAG 只能回答「答案在某一两段里」的问题。但真实业务里大量问题是多跳的: 「负责华东区的销售总监,他上一份工作是哪家公司?」——需要先找到人,再查这个人的履历,两次检索。
| 检索方式 | 擅长 | 弱项 | 成本 |
|---|---|---|---|
| 向量(Dense) | 同义改写、语义泛化、跨语言 | 专有名词、编号、精确字面 | 中(需 GPU 编码) |
| 关键词(BM25) | 型号、错误码、人名、法条编号 | 同义词、口语化表达 | 低(CPU 即可) |
| 混合 + 重排 | 绝大多数生产场景 | 延迟增加 50~200ms | 中高 |
| GraphRAG | 多跳关系、全局概括 | 建图贵、更新难 | 高 |
| Agentic RAG | 需要多次检索、判断够不够 | 慢、贵、可能死循环 | 很高 |
本 章 小 结
检索层的一句话:向量负责泛化,关键词负责精确,重排负责精判。
如果你的系统查错误码、型号、人名总是不准,八成是只做了向量检索——这是最容易补、收益最直接的一个漏洞。
第三层 · 深入②:Agent,从「会说」到「会做」
ReAct / Function Calling / 记忆 / 规划
- Agent 的四个必备部件:模型、工具、循环、记忆
- ReAct 循环:Thought → Action → Observation → 判断
- Function Calling 的真实机制:模型只决策,程序才执行
- FC 的内部运转:三段 JSON 协议、七步流程、并行调用、流式分片、三层错误处理
- FC 与 MCP 的分层关系:一个是「点菜方式」,一个是「插座标准」
- 路由:六种路由、三级兜底实现、四个失败模式
- 四个翻车现场:死循环、工具误用、错误累积、目标漂移
RAG 让模型「知道得更多」,Agent 让模型「能做更多」。这是性质上的变化: RAG 的错误是说错话,Agent 的错误是做错事。所以从这一节开始,工程重点从「效果」转向「效果 + 可控」。
11.1 ReAct 循环:Agent 的心跳
ReAct = Reasoning + Acting,是目前几乎所有 Agent 的基础范式。它把「思考」和「行动」交替进行, 关键在于:每次行动的结果会回到上下文里,成为下一轮思考的依据。这就是 Agent 与「一次性问答」的本质区别。
11.2 Function Calling:模型怎么「动手」
这是一个必须讲清楚的机制细节:模型本身不能调用任何函数。它只能输出一段特定格式的文本,说「我想调用 weather 工具,参数是 city=南京」。 真正执行的是你的程序。程序执行完,把结果作为一条消息塞回对话,模型再继续。
// 第 1 步:你告诉模型「有哪些工具可用」
tools = [{
name: "get_weather",
description: "查询指定城市当前天气",
parameters: { city: "string, 城市名" }
}]
// 第 2 步:模型返回的不是答案,而是一个「调用意图」
{ "tool_calls": [{ "name": "get_weather", "arguments": { "city": "南京" } }] }
// 第 3 步:你的代码真的去调气象 API
result = requests.get("https://api.weather.com/...", params={...})
// 第 4 步:把结果作为 role=tool 的消息塞回去
{ "role": "tool", "content": "{\"temp\": 21, \"weather\": \"多云\"}" }
// 第 5 步:模型基于这个结果,生成最终回答
name 和 description 判断何时用哪个工具。描述模糊(如「处理数据」)会导致误调用。写成「当用户询问订单状态且提供订单号时使用」这种条件式描述,调用准确率提升明显。协议层:三个角色,三段 JSON
所谓「内部运转」,本质是三段结构化数据的往返。看懂这三段,你就知道每一步该由谁负责。
| 角色 | 谁产生 | 关键字段 | 容易踩的坑 |
|---|---|---|---|
| 请求 | 你的代码 | tools[](name / description / parameters 的 JSON Schema)、tool_choice | schema 写得不严,模型就会乱填参数 |
| 调用意图 | 模型 | tool_calls[]:每个带 id、function.name、function.arguments | arguments 是字符串不是对象,必须自己 parse |
| 执行结果 | 你的代码 | role: "tool"、tool_call_id、content | 漏了 tool_call_id,多工具时模型会张冠李戴 |
// ① 请求:告诉模型「有哪些工具」
{
"tools": [{
"type": "function",
"function": {
"name": "get_weather",
"description": "当用户询问某城市当前天气时使用;缺少城市名时先追问,不要调用",
"parameters": {
"type": "object",
"properties": {
"city": { "type": "string", "description": "城市名,如「南京」" }
},
"required": ["city"]
}
}
}],
"tool_choice": "auto" // auto / required / 指定某个函数 / none
}
// ② 模型返回:不是答案,是「调用意图」
{
"choices": [{
"message": {
"role": "assistant",
"content": null, // 注意:这里是 null,不是文字
"tool_calls": [{
"id": "call_abc123", // 唯一标识,回传时必须带上
"type": "function",
"function": {
"name": "get_weather",
"arguments": "{\"city\": \"南京\"}" // 字符串!需要 JSON.parse
}
}]
},
"finish_reason": "tool_calls" // 见到这个值就说明该你去执行了
}]
}
// ③ 回传:把执行结果塞回去
{
"role": "tool",
"tool_call_id": "call_abc123", // 与上面的 id 对应
"content": "{\"temp\": 21, \"weather\": \"多云\"}" // 也只能是字符串
}
七步内部流程:一次调用到底发生了什么
① 组装请求
把「系统提示 + 历史消息 + 工具定义(JSON Schema)」一起发出去。工具定义会占用大量 token——20 个工具的描述可能就有 2000 token,且每次都要重发。这是 FC 的隐性成本。
② 模型推理,输出意图
模型不是「执行」函数,而是在生成「一段符合工具调用格式的文本」。它为什么知道该调?因为训练时见过大量「什么场景该调什么工具」的样本。所以工具描述写得像人话,它才判断得准。
③ 解析与校验(你的代码)
解析 arguments 字符串 → 校验工具名是否存在 → 用 JSON Schema 校验参数类型与必填项。这一步必须做,不能信任模型输出——它可能给出 "city": null,也可能编一个不存在的工具名。
④ 执行真实动作
调用你的函数、HTTP 接口、数据库。这一步可能超时、可能 500、可能权限不足。要设超时(如 10 秒),并区分「可重试」与「不可重试」。
⑤ 序列化结果
把返回值转成字符串。这里有个关键取舍:返回全文还是摘要?一个接口返回 50KB JSON,直接塞回去会挤爆上下文,也会让模型抓不住重点。正确做法是只保留模型决策需要的字段。
⑥ 回传并进入下一轮
把结果作为 role: "tool" 的消息追加进 messages,再调一次模型。注意:这是一次全新的推理请求,token 又要付一遍。
⑦ 循环或收敛
模型看到结果后,可能:输出最终答案(结束)、再调一个工具(继续循环)、或说「信息不足」(也要有兜底)。这个循环必须有上限,否则就是第 11.4 节讲的死循环。
并行调用:一次返回多个意图
模型可以在一次响应里返回多个 tool_calls。比如「查北京和南京的天气」,它会同时给出两个调用。
你的代码可以并发执行,再把两个结果一起回传——这样只花一轮,而不是两轮。
# 并行执行多个 tool_calls
results = await asyncio.gather(*[
execute(tc["function"]["name"], json.loads(tc["function"]["arguments"]))
for tc in message["tool_calls"]
])
# 每个结果都必须单独回传,且带上对应的 id
for tc, res in zip(message["tool_calls"], results):
messages.append({
"role": "tool",
"tool_call_id": tc["id"], # 关键:不能漏
"content": json.dumps(res, ensure_ascii=False)
})
流式场景:最容易踩的坑
开了 stream=true 之后,tool_calls 不是一次性到齐的,而是分片到达:
chunk 1: {"tool_calls":[{"index":0,"id":"call_abc","function":{"name":"get_weather","arguments":""}}]}
chunk 2: {"tool_calls":[{"index":0,"function":{"arguments":"{\"ci"}}]}
chunk 3: {"tool_calls":[{"index":0,"function":{"arguments":"ty\":\"南"}}]}
chunk 4: {"tool_calls":[{"index":0,"function":{"arguments":"京\"}"}}]}
# 必须按 index 累积拼接,拼完才是完整参数
buffers[index]["arguments"] += delta
如果直接把每个 chunk 的 arguments 拿去 parse,必然报错。这是接入流式 FC 时最常见的 bug, 而且因为只在流式下复现,很容易被漏掉。
错误处理:三层,三种策略
| 层 | 典型错误 | 处理策略 | 能不能自动重试 |
|---|---|---|---|
| 解析层 | arguments 不是合法 JSON;缺必填参数;工具名不存在 | 把错误信息作为 tool 结果回传:「参数 city 缺失,请补充后重试」让模型自己修 | 可以,1~2 次 |
| 执行层 | 超时、5xx、鉴权失败、限流 | 区分「暂时性」(可重试,退避)与「永久性」(直接告知模型换路径或放弃) | 暂时性可以 |
| 语义层 | 调用成功但结果为空、结果明显不对、返回了错误的对象 | 不能盲目重试。要把「查到了但没有」和「查到了错误数据」区分开告诉模型 | 不建议 |
比如接口 404,不要直接让整个 Agent 崩掉,而是回传
{"error": "未找到该订单,订单号可能已失效"}。
模型看到这个,往往会自己换个思路("那我帮您查一下最近的订单")。这比抛异常中断用户体验好得多。
Function Calling 与 MCP:不是替代,是两层
这两个概念经常被混在一起问。一句话说清:Function Calling 是「模型怎么表达我想调工具」,MCP 是「工具怎么被接进来」。 前者是模型能力,后者是接入协议,它们在不同层,配合使用。
| 维度 | Function Calling | MCP |
|---|---|---|
| 解决什么 | 模型如何输出「我要调哪个函数、参数是什么」 | 工具如何被标准化地描述、发现和调用 |
| 层级 | 模型 <-> 你的代码 | 你的应用 <-> 外部系统 |
| 谁定义 | 各家模型厂商(OpenAI / Anthropic 格式略有差异) | 开放协议(Anthropic 开源,社区维护) |
| 没有对方会怎样 | 没有 MCP,FC 照样能用——你自己在代码里实现每个工具 | 没有 FC,MCP 也能用——但要靠别的机制触发调用 |
| 类比 | 语言:模型说的「工具调用语」 | 插座标准:工具怎么插进来 |
实际协作方式:你的应用通过 MCP 连上若干个 Server,把它们的工具能力转换成 Function Calling 的 schema 发给模型;
模型输出 tool_calls;你的代码把调用转发给对应的 MCP Server;结果再转回 role: "tool" 塞回去。
所以 MCP 是「工具的供应链」,Function Calling 是「点菜的方式」。点菜方式不变,供应链换了,菜品更多了。
11.3 记忆:Agent 为什么会「忘了刚才做过什么」
| 记忆类型 | 存在哪 | 存什么 | 生命周期 |
|---|---|---|---|
| 短期记忆(工作记忆) | 上下文窗口 | 本轮对话、工具返回、中间结论 | 一次会话,超长就被截断 |
| 长期记忆(语义记忆) | 向量库 / 数据库 | 用户偏好、历史结论、事实沉淀 | 持久,需要检索才召回 |
| 情景记忆 | 日志 / 结构化存储 | 「上次做这类任务时,第 3 步失败了」 | 持久,用于改进策略 |
| 程序记忆 | 提示词 / 代码 / 技能库 | 固定流程、工具用法、SOP | 版本化管理 |
最容易忽略的是:上下文不是无限黑板。Agent 跑 20 轮之后,前面几轮的工具返回可能已被挤出窗口, 于是它开始重复劳动、或者忘记最初的约束。所以成熟的 Agent 必须做上下文压缩:把历史摘要成要点、把无用的工具返回丢弃、把关键状态写进结构化变量。
11.4 规划范式:从「走一步看一步」到「先想清楚再做」
边想边做,每步根据上一步结果调整。灵活,适合探索型任务。缺点是缺少全局规划,长任务容易绕路。
先让模型列出完整子任务清单,再逐个执行,最后汇总。可控性强、易并行。缺点是计划一旦错了,会系统性地错到底。
失败后先写一段「为什么失败」的反思,把反思存进记忆,再重试。适合有明确成败判定的任务(写代码过测试、答题对答案)。
① 死循环——反复调用同一个工具,因为每次都判断「信息不够」。必须有最大轮次和重复检测。
② 工具误用——用「发邮件」工具去「查邮件」。靠工具描述和权限约束解决。
③ 错误累积——第 2 步查错了数据,后面 8 步都在错误基础上推理,且模型不会自我怀疑。需要关键节点做校验。
④ 目标漂移——跑着跑着忘了最初要干什么,开始做「看起来相关」的事。需要在每轮把原始目标重新注入。
11.5 路由:Agent 的调度中枢
前面讲的都是「一个 Agent 怎么干活」。但真实系统里,第一件事往往不是干活,而是决定谁来干、用什么干。 这个动作叫路由(Routing)。它不显眼,却决定了整个系统的成本与稳定性。
六种路由,各管一段
| 类型 | 决定什么 | 典型实现 | 失败后果 |
|---|---|---|---|
| ① 意图路由 | 这是哪一类请求 | 关键词规则 → 小模型分类 → LLM 判断(三级兜底) | 最严重:后面整条链路都跑错 |
| ② 模型路由 | 用哪个模型 | 按任务类型查表 / 按输入长度与复杂度判断 / 按历史成功率 | 成本失控或质量下降 |
| ③ 检索路由 | 要不要检索、查哪个库 | 意图 → 库映射;或先判断「这个问题需要外部知识吗」 | 该查没查(编造)或不该查乱查(噪音) |
| ④ 工具路由 | 从几十个工具里选哪几个 | 工具描述向量化 → 检索 top-5 → 只把这几个人给模型 | 工具给太多,模型选错;给太少,做不了 |
| ⑤ 子 Agent 路由 | 交给哪个 Agent 做 | 能力清单匹配 / 主管 Agent 分派 / A2A 的 Agent Card | 派错人,来回踢皮球 |
| ⑥ 兜底路由 | 失败之后怎么办 | 重试 → 换模型 → 降级答案 → 转人工 | 用户体验断崖,或无限重试烧钱 |
实现的四种手段:从「快而脆」到「慢而活」
| 手段 | 延迟 | 成本 | 适合 | 局限 |
|---|---|---|---|---|
| 规则 / 关键词 | <1ms | 0 | 意图明确、量大的主路径(如「退款」→售后) | 覆盖不全,说法一变就漏 |
| 向量相似度 | ~10ms | 极低 | 工具选择、知识库选择(把候选描述向量化后比对) | 对「意图相近但处理不同」区分弱 |
| 小模型分类 | 50~200ms | 低 | 意图分类的主方案,可在自己数据上微调 | 需要标注数据;新意图要重训 |
| LLM 判断 | 0.5~2s | 较高 | 复杂、模糊、需要推理的请求(兜底用) | 慢且贵,不适合放在主路径 |
第一级规则(覆盖 60%~70% 的高频明确请求,零成本)→ 第二级小模型(覆盖 20%~30% 的变体,低成本)→ 第三级 LLM(只处理剩下的模糊请求,慢但准)。
这样平均延迟接近规则级,而覆盖率接近 LLM 级。直接把所有请求都丢给 LLM 路由,是最贵也最慢的做法。
代码:一个可运行的三级路由
ROUTES = {
"refund": {"kw": ["退款", "退货", "退钱"], "handler": refund_flow},
"order": {"kw": ["订单", "物流", "发货"], "handler": order_flow},
"invoice": {"kw": ["发票", "开票"], "handler": invoice_flow},
}
def route(query):
# 一级:关键词规则(快,覆盖主路径)
for name, cfg in ROUTES.items():
if any(k in query for k in cfg["kw"]):
return name, 0.95
# 二级:向量匹配(处理换说法的变体)
sim, name = vector_match(query, ROUTES) # 每个意图的描述向量化后比对
if sim > 0.82:
return name, sim
# 三级:LLM 判断(只处理模糊请求,且给出「无法归类」选项)
label = llm_classify(query, labels=list(ROUTES) + ["unknown"])
return label, 0.6 if label != "unknown" else 0.3
# 关键:路由结果要带置信度,低置信度走兜底,不要硬分派
注意最后一行:路由必须输出置信度。置信度低于阈值时,正确做法不是「猜一个继续」,而是 澄清追问(「您是想查订单,还是申请退款?」)或走通用路径。硬分派是路由系统最危险的设计。
什么时候不该做路由
两个分支用 if/else 就够了。加一层路由模型,只会增加延迟和故障点。
90% 的请求是同一类,剩下 10% 靠兜底即可。为 10% 建路由系统,投入产出不成立。
比如医疗分诊、资金操作。这时候应该先问清楚再做,而不是让模型猜。
四个失败模式
| 模式 | 表现 | 对策 |
|---|---|---|
| 过度路由 | 什么都想路由,链路变成「路由 → 子路由 → 再路由」,延迟和故障点翻倍 | 路由层数不超过 2 层;能在一条流程里用 if 解决的,不要新建一层 |
| 路由抖动 | 同一个问题两次路由到不同路径,用户觉得「这系统怎么一会儿一个说法」 | 规则优先级固定;LLM 路由设温度 0;加缓存(同样输入复用上次路由结果) |
| 冷启动 | 新业务上线,所有请求都落到 unknown | 先把 unknown 当成一类收集,人工看 50 条,再补规则或补训练样本 |
| 路由与执行不一致 | 路由说「这是售后问题」,但售后的 Agent 说「这我处理不了」 | 路由结果要能回传修正:执行层判断不匹配时,退回路由层重判一次 |
11.6 如果这是你的岗位:Agent 开发工程师的第一周
「做个 Agent,能自己处理客户工单:查订单、判断类型、该退就退、该转就转。」
你打开编辑器,第一反应是找框架。装了三个,跑通两个 demo,到第三天你发现:demo 里的 Agent 什么都能做, 真接进业务它什么都不敢做——因为它不知道自己能碰哪些数据,也不知道退错了钱谁负责。
这一节给的是第一周的施工顺序——按这个顺序做,你会在第四天就撞上真正的难点,而不是拖到第三周。
动手之前,先定三个参数
这三个数字如果没定,后面所有代码都会返工。它们不是技术选型,是产品决策,所以要和业务方一起定。
| 参数 | 怎么定 | 定错的后果 |
|---|---|---|
| 工具数量 | 第一版不超过 5 个。每多一个工具,模型选错的概率上升;超过 10 个必须做分组或路由 | 给了 20 个工具,模型每次挑错;错误率随工具数线性上升 |
| 轮次上限 | 简单任务 5 轮,复杂任务 15 轮。到上限必须停,并输出「当前进展 + 卡在哪」 | 跑成死循环,一晚上烧掉几百美元,且没有产出 |
| 失败策略 | 明确「重试几次、什么情况转人工、什么情况直接拒答」。三个都要有 | 所有失败都转人工,等于没自动化;都自动重试,等于放大错误 |
正确的做法是:先给 3 个只读工具,跑通再加。
七天,每天一个能验收的产物
只读跑通
- 接 1 个只读工具(查订单),不做循环
- 用 Function Calling 跑通一次「问 → 调 → 答」
- 验收:问一个订单号,它能真的查到并回答
- 坑:
arguments是字符串,要自己 parse
加循环
- 包一层 while,加上轮次上限
- 把工具结果拼回消息列表
- 验收:一个需要两次查询的问题能自动完成
- 坑:忘了带
tool_call_id,多工具时张冠李戴
加第二个工具
- 加「查工单历史」,同样是只读
- 写清每个工具「什么时候用」的描述
- 验收:给它一个模糊问题,它会先问清再说
- 坑:工具描述含糊,它两个都调一遍
撞上第一个真难点
- 加第一个写操作(发起退款),但先不真执行,只打日志
- 观察:它会不会在信息不全时就发起
- 验收:能列出它 10 次「不该发起但发起了」的案例
- 这一步是整个项目的转折点
加确认闸门
- 写操作前强制人工确认(或二次校验)
- 加「信息不全就追问」的规则
- 验收:10 个模糊案例里,8 个会先追问
加日志与回放
- 记录每轮:输入、决策、工具、结果、耗时、token
- 能回放一次完整会话
- 验收:出问题时能指出「第 3 轮选错了工具」
建评测集
- 20 条真实工单,覆盖:正常、信息不全、该拒答
- 跑一遍,算成功率与「危险动作率」
- 验收:有一张表,能说明它在哪类上不行
才谈上线
- 权限隔离、成本闸门、降级方案
- 灰度:先内部用一周,再放 5% 流量
- 见第 15 章 Harness
注意第 4 天和第 5 天的顺序:先让它犯错(只打日志不真执行),再加闸门。 反过来做的人,永远不知道自己的闸门该拦什么——因为他从没见过它犯错的样子。
三个最常见的死法
| 死法 | 症状 | 根因与解法 |
|---|---|---|
| 死在「什么都能做」 | 演示很惊艳,一接真实数据就乱 | 工具太多、描述太模糊。解法是砍到 5 个以内,把「什么时候用」写进描述 |
| 死在「不会停」 | 跑一晚上,账单三百美金,任务没完成 | 没有轮次上限,或上限设了但没在代码里强制。上限必须是硬编码的,不能靠提示词 |
| 死在「不敢用」 | 做出来了,但没人敢让它碰真实业务 | 没有权限边界、没有日志、没有回放能力。这三样比效果更决定能不能上线 |
那一章回答「这个岗位长期要会什么」——六块能力、三级分级、面试怎么答。
这一节回答「你第一周具体做什么」——三个参数、七天顺序、三个死法。
先按这一节做出一个东西,再回头看那一章,你会发现自己已经跨过了 L1。
本 章 小 结
从这一章开始,错误的性质变了:RAG 的错误是说错话,Agent 的错误是做错事。
所以工程重点从「效果」转向「效果 + 可控」。三道闸(最大轮次、token 预算、无进展检测)一个都不能少。
第三层 · 深入③:多智能体,把一个人拆成一个组
Multi-Agent / 拓扑 / 通信成本
- 四种拓扑:主管制、流水线、辩论、自由群聊
- 多 Agent 的真实收益:上下文隔离、并行、权限更小
- 真实成本:沟通开销随成员数平方增长、责任扩散
- 唯一的拆分判据:两个角色是否必须看到不同的信息
单个 Agent 遇到瓶颈时,直觉是「多找几个人」。这个直觉在部分场景成立,但大多数情况下是负收益—— 因为多智能体引入的成本不是线性的,而是沟通成本随成员数平方增长。
12.1 四种常见拓扑
本 章 小 结
多智能体不是「更高级」,是「更贵」的一种选择。
生产环境里 80% 的可用方案是主管制或流水线。能用一个 Agent 解决,就不要用两个——省下来的钱够你多跑几百轮评测。
第三层 · 深入④:多模态 Agent,给它眼睛和耳朵
单模态对比 / 融合路线 / Agent 集成
- 模态与单模态:文本 / 图像分类 / 图像生成 / 语音四种单模态各自的天花板
- 三种融合路线:早期融合、晚期融合、中间融合(主流)
- 图像如何变成 token:patch 切分 + 视觉编码 + 投影层
- 在 Agent 工作流中的六种接法,尤其是「视觉自校验」这一条
- 多模态 RAG 的三种方案与取舍
- GUI Agent 的四个能力层,以及为什么「有 API 就别点界面」
前面所有内容都建立在「文本」上。但真实世界里,大部分信息不是文字:合同是扫描件、故障是截图、需求是会议录音、操作要在界面上点。 多模态不是「加个图片上传按钮」,而是让模型能处理同一件事的不同表达形式。
② 原生多模态:从预训练阶段就用混合模态数据训练,模态之间没有「翻译层」——跨模态推理更自然,训练成本高得多。
13.1 什么是多模态:先看单模态长什么样
「多模态」这个词被用滥了。要讲清楚它,得先看它的反面——单模态模型。 因为没有对比,你无法判断一个模型到底「多」在哪。
四种单模态模型:各管一段,互不相通
| 单模态类型 | 代表 | 它能做什么 | 它做不到什么(关键) |
|---|---|---|---|
| 纯文本模型 Text-only LLM |
GPT-3、早期 Llama、多数开源基座 | 读写文字、代码、结构化数据;推理、总结、翻译 | 完全看不见图。你给它一张截图,它只看到文件名。要它看图,必须先有另一个模型把图转成文字描述 |
| 图像分类/检测模型 ResNet / YOLO |
ResNet、ViT、YOLO 系列 | 判断「这张图里有没有猫」「猫在哪」 | 只能输出预定义类别。你说「描述这张图的氛围」,它做不到——它没有语言能力 |
| 图像生成模型 SD / Midjourney |
Stable Diffusion、Flux、DALL·E | 根据文字描述画出图 | 不会「读」图。它能把文字变成图,但你给它一张图问「这是什么」,它答不上来 |
| 语音模型 ASR / TTS |
Whisper、各类 TTS | 语音转文字,或文字转语音 | 只做单向转换,不理解语义。转写完还需要文本模型接手 |
看出问题了吗?在单模态时代,要处理一张带表格的发票,你得串起一条流水线: OCR 模型(图→文字)→ 版面分析模型(判断哪块是表格)→ 文本模型(理解内容)→ 可能还要 规则引擎(校验金额)。 每一环都会丢信息,每一环都是一个故障点。
三种技术路线:融合发生在哪一步
| 路线 | 做法 | 优点 | 缺点 |
|---|---|---|---|
| 早期融合 Early Fusion |
把不同模态的原始信号在输入端就拼在一起(如图像 patch 和文本 token 混在一个序列里) | 模态间交互最充分,跨模态推理能力强 | 训练成本高,需要海量配对数据 |
| 晚期融合 Late Fusion |
各模态分别用专用模型处理,最后把结果拼接或投票 | 实现简单,可复用现成模型 | 模态之间不交流,丢失跨模态关联(图里的「红色」和文字里的「危险」关联不上) |
| 中间融合 主流方案 |
用视觉编码器把图变成「视觉 token」,通过投影层接到语言模型的输入序列里,与文本 token 一起做注意力 | 成本可控,能复用成熟的语言模型;跨模态注意力在模型内部发生 | 视觉信息经过一次「压缩」,细节有损;高分辨率图要切 patch |
13.2 一张图是怎么变成 token 的
13.3 多模态在 Agent 工作流中怎么用:六种接法
很多人以为「给 Agent 加多模态」就是「让它能传图」。不是。 多模态在 Agent 里真正的价值是多了一个感知通道和一个校验通道—— 前者让它能看到界面、文档、现场;后者让它能「看见自己干得对不对」。
接法一:作为感知输入(最基础,也最常用)
把截图、扫描件、照片直接送进模型,让它输出结构化结果。这一层替代了传统的「OCR + 版面分析 + 规则引擎」流水线。
- 界面截图 → 提取按钮、字段、状态
- 发票/单据 → 字段抽取(含位置关系)
- 现场照片 → 缺陷识别、安全帽检测
- 白板/手写 → 转结构化笔记
- 小字看不清 → 先放大/分块再送
- 跨页表格错乱 → 先做版面解析
- 手写潦草 → 置信度低要能识别出来并转人工
- 多页文档当一页送 → 每页单独处理,再汇总
接法二:作为校验通道(最容易被忽略,价值最高)
这是多模态 Agent 与纯文本 Agent 的本质区别:它能「回头看一眼」。 比如改完一个网页布局,再截一张图,自己判断「按钮有没有被遮住」——纯文本 Agent 只能看代码,判断不了渲染结果。
# 视觉自校验循环(伪代码)
for attempt in range(3):
action = model.decide(goal, current_screenshot) # ① 看图决策
execute(action) # ② 执行操作
time.sleep(0.5) # ③ 等渲染
new_shot = screenshot() # ④ 重新截图
verdict = model.judge(
before=current_screenshot,
after=new_shot,
expectation="弹窗应已关闭,且列表显示 3 条结果"
)
if verdict.ok:
return "done"
# ⑤ 不 OK 就把「差异」作为下一轮的输入,而不是盲目重试
current_screenshot = new_shot
return escalate_to_human("三次尝试后仍未达成预期")
这段代码里最关键的一行是 judge(expectation=...):
校验必须有明确的「预期」,否则模型只会说「看起来还行」。
预期要可观察——「弹窗已关闭」「列表有 3 条」「按钮变蓝」,而不是「界面更好看了」。
接法三:多模态 RAG(图文混合检索)
传统 RAG 只能检索文本。但企业知识库里大量内容是图:产品结构图、流程图、设计稿、扫描件。 多模态 RAG 要解决「用文字问题找到图」和「用图找相似图」两件事。
| 方案 | 做法 | 优点 | 代价 |
|---|---|---|---|
| 图转文再检索 | 用多模态模型给每张图生成详细描述,把描述存进向量库 | 实现最简单,复用现有文本 RAG | 描述有损,细节问题找不到 |
| 统一向量空间 | 用 CLIP 类模型把图和文编码到同一空间,直接算跨模态相似度 | 能用文字搜图,也能用图搜图 | 对图和文的细粒度对应弱(说不清「图里第三行」) |
| 混合(推荐) | 图存两套:CLIP 向量(粗召回)+ 文字描述向量(细召回),检索后合并 | 兼顾召回率与精度 | 存储翻倍,需要融合排序 |
接法四:GUI 操作闭环(下一节详讲)
看屏 → 决策 → 点击 → 再看屏。这是多模态最「科幻」也最脆弱的用法,因为它把模型放进了真实界面, 任何布局变化、加载延迟、弹窗都会打乱节奏。详见 11.4。
接法五:内容生成管线
在第 23 章的内容创作产线里,多模态承担了从「分镜」到「成片」的全部视觉环节: 分镜文本 → 关键帧图 → 图生视频 → 配音 → 剪辑。 这里的工程难点不是「能不能生成」,是「多张图之间的一致性」——同一角色在第 3 个镜头换脸,观众立刻出戏。 解法在 21.4 讲过:文本锚点 + 参考图 + 固定 seed + 角色 LoRA。
接法六:质检与审核(生成之后的把关)
生成完不等于能用。多模态模型可以做最后一道自动质检,而且比人快得多:
- 合规检查:图里有没有水印、敏感标识、不该出现的品牌 logo。
- 一致性检查:同一角色在不同镜头的服装、发型、配饰是否一致。
- 质量检查:手指数量、文字是否乱码、透视是否错误、有没有明显的 AI 痕迹。
- 对版检查:生成的图是否符合分镜描述(「雨夜、霓虹、近景」)。
一个完整例子:商品图审核 Agent
输入
商家上传 5 张商品图 + 一段文字描述(品类、材质、颜色、卖点)。
感知
多模态模型逐张读取:识别商品主体、背景、是否有文字水印、是否有多商品混放。
跨模态对齐
把图和文字描述做一致性判断:描述说「纯棉白色」,图里是不是白色?描述说「含配件」,图里有没有配件?这一步是纯文本模型做不到的,因为它看不到图。
规则 + 模型双判
硬规则(尺寸、格式、水印位置)用代码判;软规则(美观度、场景匹配)用模型判。两者结果合并,冲突时以硬规则为准。
输出与兜底
通过 → 自动上架;不通过 → 给出具体原因和修改建议(「第 3 张图右下角有水印,请重新上传」),而不是笼统的「审核不通过」。低置信度 → 转人工。
13.4 GUI Agent:在别人的界面上干活
Computer Use / GUI Agent 是近两年最实用也最脆弱的形态:模型看屏幕截图,输出「点击坐标 (x, y)」或「在输入框打字」, 由程序执行,再截下一张图判断结果。
| 能力层 | 做什么 | 成熟度 | 主要风险 |
|---|---|---|---|
| 截图理解 | 识别按钮、表格、状态、弹窗 | 较成熟 | 分辨率低、图标无文字时识别率下降 |
| 坐标定位 | 输出精确可点击位置 | 中等 | 布局变化即失效,滚动后坐标全偏 |
| 多步操作 | 连续点击、填表、翻页 | 偏弱 | 一步错则全盘错,且难以回退 |
| 异常处理 | 遇到弹窗、加载失败时自救 | 弱 | 极易卡死,需要人工兜底 |
本 章 小 结
这一章要分清三件事:单模态是「各管一段」——文本模型看不见图、图像分类模型不会说话、生成模型不会读图;多模态是「同一个模型里联合表示」,省掉了「图转文字」这个必然丢信息的中间环节;在 Agent 里,多模态的价值不只是「能看图」,更是「能看见自己干得对不对」——这是纯文本 Agent 结构上做不到的事。
六种接法按价值排:视觉自校验 > 感知输入 > 跨模态 RAG > 生成管线 > 质检审核 > GUI 操作。GUI 操作排最后,因为它最脆弱,而大多数场景其实有 API 可用。
一条工程原则:复杂版面先解析再喂模型,别赌模型对像素的理解极限;判断要不要多模态,就看「信息是否必须保持空间或时序关系」——是则用,否则转文本更划算。
第三层 · 深入⑤:Workflow,把决策权收回来
DAG / 编排 / 人机协同
- DAG 为什么比 Agent 可靠:有向 + 无环 = 一定能终止
- Workflow 与 Agent 的边界:路径能否枚举
- 人机协同节点该放在哪:高风险、需担责、不可逆的动作
- 混合架构:外层 Workflow 管流程,内层节点交给 Agent
这是全篇最容易被低估的一节。很多人以为 Workflow 是「Agent 的低配版」,恰恰相反—— 在生产环境里,Workflow 的可靠性远高于 Agent,因为它把「下一步做什么」从模型手里拿走了。
14.1 一张典型的审批工作流
14.2 Workflow 与 Agent 的边界
| 维度 | Workflow | Agent | 混合形态(最实用) |
|---|---|---|---|
| 决策权 | 人(写在图里) | 模型 | 主流程人定,局部模型定 |
| 可预测性 | 高,同输入基本同输出 | 低,每次路径可能不同 | 中,主干稳定 |
| 异常处理 | 需穷举分支,未覆盖即失败 | 可临场应变,但可能乱来 | 主干兜底 + 局部自主 |
| 开发成本 | 前高后低(画图累,维护省) | 前低后高(demo 快,调优难) | 中 |
| 典型场景 | 审批、报表、批量处理 | 调研、排障、开放式任务 | 客服、代码助手、文档处理 |
外层是 Workflow(负责触发、鉴权、日志、重试、人工闸门), 内层某个节点是 Agent(负责「这一步怎么做得看情况」的开放式子任务), Agent 的所有工具调用都经过 Harness 的权限与沙箱。
这样既能应对不确定性,又不会让整条链路变成黑盒。
本 章 小 结
这一章最容易被低估。很多人以为 Workflow 是 Agent 的低配版,恰恰相反——生产环境里它更可靠。
因为它把「下一步做什么」从模型手里拿走了。牺牲灵活性,换来确定性、可审计、可单步重试。
第三层 · 深入⑥:Harness,模型外面那层「安全绳」
Agent Runtime / 权限 / 沙箱 / 可观测
- Harness 的八项职责:上下文、工具、循环、权限、沙箱、状态、日志、成本
- 五个必须做的工程约束,以及每个约束缺了会怎样
- 提示注入的防线为什么在代码层而不在提示层
- 为什么同模型在不同产品里体验差距巨大
这是整篇教材里最被低估、也最能区分「做过 demo」和「上过生产」的一节。 同一句「用 Claude Code 改这个文件」,在 demo 里和在真实仓库里,差别不在模型,而在 Harness。
15.1 五个必须做的工程约束
权限:默认拒绝,白名单放行
不要用「禁止删除」这种黑名单——永远列不全。正确做法是默认无权限,只开放明确列出的命令与路径。写操作、网络请求、外发消息,三类必须单独授权。
沙箱:把执行关进笼子
代码执行放在容器/虚拟机里,限制 CPU、内存、时长、网络出口。文件系统只挂载工作目录。这样即便模型被提示注入操纵,破坏范围也是可控的。
循环控制:三道闸
最大轮次(如 30)、总 token 预算、无进展检测(连续两轮输出高度相似就强制停)。三者缺一,都会出现「跑到天亮」的账单事故。
可观测:每一步都要能复盘
记录每轮输入上下文、模型输出、工具调用参数与返回、耗时与 token。出问题时能回答「它当时看到了什么、为什么这么决定」——没有这层,Agent 就是不可调试的黑盒。
状态持久化:可中断、可恢复
长任务必须把中间状态写到外部存储(如任务表 + 检查点),而不是只留在上下文里。进程崩溃后能从第 7 步继续,而不是从第 1 步重来。
本 章 小 结
一句话:模型决定上限,Harness 决定实际发挥出多少。
换模型很容易,改 Harness 很难——这也是为什么「同样的 GPT,别人的产品比你的好用」。这一层是工程能力的真正分水岭。
第三层 · 深入⑦:MCP 与 A2A,把接口标准化
协议层
- MCP 的三个角色(Host / Client / Server)与三类原语
- MCP 解决的是纵向连接(AI ↔ 工具),A2A 是横向(Agent ↔ Agent)
- 什么时候该用协议,什么时候直接写函数调用就行
- 协议本身不解决权限问题——Server 的最小权限要自己控
在协议出现之前,每接一个系统都要写一套适配器:接 Jira 写一套、接数据库写一套、接内部 API 再写一套。 M 个模型 × N 个工具 = M×N 份工作。协议做的事,是把它变成 M+N。
Function Calling 是「模型怎么点菜」——它输出「我要调 get_weather,参数是南京」这样的结构化意图,属于模型能力。
MCP 是「菜从哪来」——它规定工具如何被描述、发现、调用,属于接入协议。
两者关系是:MCP 把外部系统的能力转成 Function Calling 的 schema 发给模型;模型返回调用意图;你的代码把意图转发给 MCP Server;结果再转回
role: "tool"。
一个管语言,一个管插座,配合使用。Function Calling 的内部七步流程见第 11.2 节。
| 对比项 | MCP | A2A | Function Calling |
|---|---|---|---|
| 连接的双方 | AI 应用 ↔ 工具/数据 | Agent ↔ Agent | 模型 ↔ 你的函数 |
| 层级 | 纵向(向下) | 横向(平级) | 最底层机制 |
| 是否标准化 | 是,开放协议 | 是,开放协议 | 各家 API 格式略有差异 |
| 解决的核心问题 | 集成爆炸(M×N) | 跨组织协作与任务委派 | 让模型能触发外部动作 |
| 成熟度(2026) | 生态成熟,Server 数量多 | 推进中,大型企业关注 | 所有模型厂商均已支持 |
本 章 小 结
协议的价值是把 M×N 变成 M+N。
务实建议:个人和小团队先掌握 MCP 就够,能显著减少接工具的重复劳动;A2A 属于企业级多 Agent 平台,单团队短期用不上,不必为了「技术先进」提前引入。
第三层 · 深入⑧:DoT,把推理从一条线画成一张图
CoT → ToT → GoT → DoT
- CoT 的三个硬伤:不能回溯、不能并行假设、中间结论无法验证
- 四代推理结构:CoT(线)→ ToT(树)→ GoT(网)→ DoT(图 + 回溯)
- DoT 的三个角色与拓扑序的作用
- 为什么「没有评估信号的分叉」只是把错误放大
这是全篇最偏「前沿」的一节,但它解决的是一个非常具体的老问题:模型一旦在推理中途走错一步,后面会一路错到底,而且不会回头。 DoT 的思路是:让推理不再是一条直线,而是一张可以分叉、可以合并、可以退回去的图。
17.1 先看 CoT 的三个硬伤
CoT(Chain of Thought,思维链)让模型把步骤写出来,确实显著提升了多步推理的正确率。但它有一个结构性缺陷:它是线性的、单向的。
第 3 步算错了,第 4 步会基于错的结果继续推。模型没有「等一下,前面那步好像不对」的机制——它只会往下写。
「如果方案 A 成立…如果不成立…」这种分支推理,CoT 只能串行写,写到 B 分支时 A 的上下文还在干扰。
中间步骤混在自然语言里,既不好单独抽出来校验,也不好复用。同一个子结论在三个地方要用,只能重写三遍。
17.2 四代推理结构的演进
本 章 小 结
结构越复杂,表达力越强,成本也越高。
正确用法是匹配,不是升级:日常问答用 CoT,多约束规划、需要交叉验证的论证才上 DoT。先用简单的,明确失败再升级结构。
第三层 · 深入⑨:评测与安全,决定能不能上线
Eval / 红队 / 提示注入
- 评测集怎么建:从真实问题抽样,50 条起步,覆盖三类分布
- 四层评测:组件级、端到端、任务级、体验级
- LLM-as-a-Judge 的三类偏差与校准方法
- 三种攻击面:提示注入、越权与泄露、输出侧风险
前面十五节讲的是「怎么做得出来」。这一节讲「怎么证明它做得对」。 我的判断很直接:没有评测集的 AI 项目,本质上是在靠感觉交付。它的每一次改动都是赌博,因为没人知道这次改动是变好还是变坏。
18.1 评测集:项目最该先建的资产
| 层级 | 测什么 | 指标示例 | 怎么测 |
|---|---|---|---|
| 组件级 | 检索是否召回、抽取是否准确 | Recall@K、MRR、字段准确率 | 离线,有标准答案,自动化 |
| 端到端 | 最终答案对不对 | 准确率、幻觉率、格式合规率 | 离线,人工标注 + 规则校验 |
| 任务级 | Agent 有没有把事办成 | 任务完成率、平均轮次、人工接管率 | 沙箱回放,成功率统计 |
| 体验级 | 用户是否愿意用 | 采纳率、追问率、留存、投诉率 | 线上 A/B,灰度发布 |
② 长度偏差:倾向给长答案高分 → 对策是在 rubric 里明确「简洁不加分」。
③ 自我偏好:倾向认同同族模型的输出 → 对策是换一个不同厂商的模型当裁判。
18.2 Bad case 治理:从一条差评到一次回归
16.1 讲的评测集是预防,这一节讲的是治疗。两者是一套闭环的两端: 评测集告诉你及格线在哪,bad case 告诉你离及格差在哪。
没有治理流程的团队,通常长这样:用户反馈不好用 → 团队凭印象改提示词 → 改完感觉好点了 → 下周又冒出同类问题。 问题不是不努力,是没有把「一条差评」变成「一条可复现的测试用例」。
三个入口,按性价比排序:
| 入口 | 怎么落 | 优缺点 |
|---|---|---|
| 产品里的「结果不对」按钮 | 一键提交,自动带上输入、检索片段、输出、模型版本 | 价值最高:用户主动标记的都是真痛点 |
| 日志抽样 | 按「低置信度」「用户重问」「会话中断」抽样 | 能抓到沉默的失败(用户懒得反馈) |
| 工单 / 社群里的抱怨 | 人工摘录,补齐上下文 | 信息最全,但样本少、滞后 |
| 现象 | 真实根因 | 先查什么 | 典型修法 |
|---|---|---|---|
| 答「材料里没有」但文档里有 | 检索没召回 | 把标准答案段落拿去搜,能不能搜到 | 改切块、加查询改写、补同义词 |
| 材料里有,答得却不对 | 召回了但没用上 | 看送进模型的上下文里,正确段落排第几 | 加引用约束、调拼装顺序、减无关段 |
| 答得像但事实错 | 模型理解错 / 超出能力 | 换个更强模型跑同一题,看是否还错 | 缩窄任务、加 few-shot、换模型 |
| 格式不对、解析失败 | 输出约束不足 | 看是否有 schema、是否给了示例 | 结构化输出 + 校验重试 |
| 不该答的硬答 | 缺「不知道」的出口 | 检查提示里有没有明确的拒答条件 | 加边界声明 + 兜底话术 |
同时改切块大小、提示词和模型,改完变好了——但你说不清是哪一步起的作用,下次出问题也不知道该回退哪个。
记录格式:改动内容 / 影响的 case 编号 / 预期指标变化 / 实际结果。四列,一行一条。
# 每条修好的 case,必须走完这四步才算修完
1. 把这条 case 加进评测集(带标准答案)
2. 跑全量评测,确认「修好的」和「没弄坏的」
3. 整体分数不降,才允许上线
4. 上线后一周,回查这条 case 有没有复发
# 关键:第 3 步的「不降」是硬门槛,不是参考
# 只修单条不看全量,是最常见的隐性退化来源
| 指标 | 含义 | 健康信号 |
|---|---|---|
| 新增 case 数 | 本周采集到多少条失败 | 趋于稳定而非无限增长(说明人群覆盖到了) |
| 已修复数 | 本周闭环了多少条 | ≥ 新增数的 60%,否则积压 |
| 复发率 | 修过的 case 再次出现的比例 | < 10%。高于这个数,说明根因没找对 |
| 平均修复时长 | 从采集到闭环的天数 | < 7 天。超过两周的 case 基本等于放弃 |
18.3 安全:三种必须防的攻击面
提示注入(Prompt Injection)
攻击者在模型会读到的内容里埋指令。分直接注入(用户自己输入「忽略以上设定」)和间接注入(藏在网页、PDF、邮件、代码注释里)。间接注入最危险,因为用户毫不知情。防御不在模型,在架构:把外部内容标记为「不可信数据」、工具权限最小化、外发动作强制人工确认。
越权与数据泄露
RAG 检索到用户无权查看的文档;Agent 用管理员凭据执行了操作;多租户场景下向量库没有做隔离。核心原则:权限校验必须在检索和执行两个环节都做,且以「当前用户身份」而非「系统身份」运行。
输出侧风险
生成侵权内容、泄露训练数据中的隐私、输出带偏见结论、给出高风险建议(医疗/法律/投资)。对策是输出过滤 + 免责声明 + 高风险领域强制人工复核,而不是指望模型「自己注意」。
本 章 小 结
这一章决定你能不能证明系统有效。
我的判断很直接:没有评测集的 AI 项目,本质上是在靠感觉交付。它的每一次改动都是赌博,因为没人知道这次是变好还是变坏。
技术关系总图:一张图看完所有依赖
全局关系 · 悬停查看说明
- 七层能力栈的完整依赖关系
- 四条容易被搞反的关系(RAG 不依赖 Agent、Agent 依赖 Harness 等)
- 每一层的典型代表技术与其邻接关系
- 怎么用这张图做归因:效果不好时定位到具体层
下面这张图是本教材的收束。它按七层能力栈排列,每一层向下依赖、向上支撑。 看这张图只需要抓三件事:谁在谁下面、谁替代不了谁、谁离了谁就跑不起来。
四条必须记住的依赖关系
RAG 只需要「向量化 + 检索」两件事,一个普通应用就能跑,不需要 Agent 框架。反过来,Agent 常常把 RAG 当作一个工具来调。方向不要搞反。
模型只能「说」要调什么。真正执行、鉴权、限流、记录的是 Harness。所以「换个更强的模型,Agent 就更可靠」这个判断只在决策质量上成立,执行安全依然取决于 Harness。
任务路径确定 → Workflow;路径不确定 → Agent。两者可以嵌套:Workflow 里放一个 Agent 节点,是目前最稳的混合架构。
多模态解决「看得见」,Agent 解决「动得了」。多模态 Agent = 两者结合。它不会让 Workflow 变得更可靠,也不会替代 RAG。
本 章 小 结
这张图是全书的地图。看它只需要抓三件事:谁在谁下面、谁替代不了谁、谁离了谁跑不起来。
建议把它保存下来,做方案评审时对着讲——比讲一堆名词有效得多。
技术对照表:选型时直接查这张
决策速查
- 十三项技术的四列对照:解决什么、依赖什么、何时别用、坏了什么样
- 选型口诀的完整逻辑
- 每一行的「典型失败」如何用来做风险预判
这张表是给「正在做决定的人」用的。每一行都回答四个问题:它解决什么、它依赖什么、什么时候不该用、它坏了长什么样。
| 技术 | 解决什么问题 | 前置依赖 | 什么时候不该用 | 典型失败长什么样 |
|---|---|---|---|---|
| Prompt 工程 | 让模型按期望的格式、角色、粒度输出 | 可调用的模型 API | 需要注入大量私有知识、需要执行动作 | 改一句提示,另一类问题就崩——缺乏回归评测 |
| RAG | 知识过时、私有知识、需要可溯源 | 文档、切块、Embedding、向量库 | 知识极少(直接塞进上下文即可)、需要多跳强推理 | 检索到错误片段,模型忠实地复述错误内容 |
| 微调(LoRA) | 固定输出风格、格式、领域话术 | 高质量标注数据、训练资源 | 只是想补知识、要求事实准确、数据频繁变化 | 过拟合到训练样本,换个问法就失效 |
| 量化 | 降低显存占用、提升推理速度 | 已训练好的模型权重 | 任务对精度极敏感(长链数学、复杂代码) | 短问答正常,长推理明显退化且不易察觉 |
| Agent | 需要多步操作、调用外部系统、临场判断 | 可靠的工具、Harness、循环控制 | 步骤固定可枚举(用 Workflow 更稳)、高风险无人值守 | 死循环、重复劳动、错误累积、账单失控 |
| 多智能体 | 需要独立审查视角、需要并行 | 单 Agent 已跑通、清晰的交接协议 | 单 Agent 能解决、预算紧张、需要强一致结果 | 互相推诿、无限对话、成本翻五倍效果没提升 |
| 多模态 | 处理图片、扫描件、语音、界面 | 视觉/语音编码、足够的上下文预算 | 纯文本任务、对坐标精度要求极高 | 看不清小字、表格跨页错乱、坐标点偏 |
| Workflow | 流程固定、需要审计、需要单步重试 | 明确的 SOP、稳定的接口 | 任务路径不固定、需要探索 | 分支越画越多,最后变成一个难维护的图形化程序 |
| Harness | 让概率系统变得可控、可审计、可恢复 | 日志、权限体系、沙箱环境 | 纯离线批处理、无外部副作用的场景 | 没有它:无法复盘、无法限权、出事故只能整体下线 |
| 推理模型 / CoT | 多步逻辑、数学、复杂代码 | 支持长输出的模型 | 简单抽取、分类、格式转换(浪费 10 倍成本) | 想得很长但结论错,且中间步骤无法验证 |
| DoT | 多约束规划、需要交叉验证的论证 | 可判断路径好坏的评估信号 | 日常问答、对延迟敏感的场景 | 分叉很多但都基于同一个错误前提 |
| MCP | 工具接入的标准化,减少重复适配 | 支持 MCP 的客户端 | 只接一两个工具、临时脚本 | Server 权限过大,等于给模型开了全库访问 |
| 评测集 | 证明改动是否有效、防止回退 | 真实样本、标注口径 | 一次性探索、无上线计划 | 没有它:每次优化都是赌博,团队靠感觉吵架 |
本 章 小 结
选型口诀:能提示解决就别建库,能建库解决就别微调,能写死流程就别放 Agent,能单 Agent 就别拆多 Agent。
顺序错了,成本会翻三到五倍。这一章可以当工具书用,做决策时直接查表。
学习路径:90 天从看懂到能做
分阶段计划 + 自测
- 90 天三段路径:看懂机制 → 能搭系统 → 能上生产
- 每一阶段的产物标准(没有产物等于没学)
- 六个自测题:能不能答上来,决定你在哪一层
- 为什么「没有产物的学习等于没学」
下面这条路径按「能交付什么」来划分,不按「学完哪本书」。每一阶段结束,你都应该有一个能演示、能给别人用的东西。 没有产物的学习,等于没学。
看懂机制
- 手算一次 BPE 分词,理解同一句话在不同模型里的 token 数差异
- 用 API 做三个实验:温度 0 / 0.7 / 1.2 的输出差异对比
- 写 20 条提示词,覆盖 zero-shot、few-shot、结构化输出
- 算一次成本:你的业务每天 1 万次调用,各模型月成本多少
- 产物:一份「模型能力与成本对照表」
能搭系统
- 用 20 份真实文档搭一个最小 RAG,跑通切块→检索→生成
- 建 50 条评测问题,记录准确率;再加重排,看提升了多少
- 写一个只有 2 个工具的 Agent(查库 + 算数),加最大轮次限制
- 把一个重复性工作改成 Workflow,量化节省的时间
- 产物:一个能用的内部工具 + 一份评测报告
能上生产
- 给系统加 Harness:权限白名单、日志、成本上限、失败重试
- 做一次红队测试:往文档里埋提示注入,看系统会不会中招
- 接 MCP,把内部系统包装成标准工具
- 灰度上线,跟踪采纳率与人工接管率
- 产物:一个可交付的系统 + 一份上线评估
自测:能不能答上来,决定你是哪一层
为什么模型的上下文有 200K,还需要 RAG?
Agent 和 Workflow,同一个需求该选哪个?
模型答错了,怎么判断是模型问题还是检索问题?
· 塞了原文就对了 → 检索问题(切块、Embedding、召回、重排)。
· 塞了原文还是错 → 生成问题(提示模板、模型能力、上下文过长、指令冲突)。
这个测试五分钟能做完,能省掉几天的瞎调。
为什么微调不能替代 RAG 来注入知识?
Harness 到底包含什么?为什么说它比模型更影响体验?
同一模型在不同产品里表现差异巨大,原因主要在这里:上下文给得对不对、工具描述写得好不好、失败后会不会重试、超长对话会不会压缩。模型决定上限,Harness 决定实际发挥出多少。
多智能体什么时候值得?
12 周体系化学习地图:本书章节 × 开源课程 × 产出物
书里有三条路径,容易混,先说清它们的区别:
| 路径 | 回答的问题 | 形态 | 适合谁 |
|---|---|---|---|
| 本章的自测 | 我现在处在哪一层 | 问题清单,答不上来就说明缺口在哪 | 先定位,再决定学什么 |
| 45 天 Agent 工程师路线(第 27 章) | 我想写代码做工程,每天干什么 | 逐日任务,偏实现 | 开发 / 转岗工程师 |
| 12 周学习地图(本节) | 我想转 AI 产品岗,怎么边学边攒作品 | 章节 + 外部课程 + 产出物,三线对齐 | 产品经理 / 求职者 |
下面这张表的用法:左边看本书哪一章补理论,中间看用哪个开源课程练手,右边看这周该交出什么。 没有产出物的学习,三个月后会全部忘掉——所以每一周都必须落一个能给人看的东西。
三个阶段
| 阶段 | 周次 | 重点 | 这一阶段结束你该能 |
|---|---|---|---|
| 一 · 技术扫盲 | 1–4 周 | LLM 原理、提示工程、RAG、应用环境 | 判断「什么该用 AI、什么该用规则」 |
| 二 · 动手与评测 | 5–9 周 | 跑通 RAG / Agent,建评测集,治 bad case | 交出一个可演示 Demo + 一份能算账的 PRD |
| 三 · 作品冲刺 | 10–12 周 | 赛事 / 组队实战、复盘、对外输出 | 一个端到端作品 + 一篇行业分析 |
12 周逐周安排
| 周 | 主题 | 本书对应章节 | 外部课程(可替换) | 本周产出物 | 掌握度 |
|---|---|---|---|---|---|
| W1 | 大模型基础 | 第 4、5、6 章 | LLM Cookbook · Prompt Engineering | 10 条高质量提示词 + 改写对比 | 20% |
| W2 | RAG 入门 | 第 9、10 章 | LLM Cookbook · 高级 RAG 应用 | 用自己电脑里的文档搭一个最小 RAG | 30% |
| W3 | 应用环境 | 第 32 章(Ollama / Dify 部署) | LLM Universe · C1 环境 + C2 API | 本地跑通一个 Dify 工作流 | 40% |
| W4 | Agent 概念 | 第 11 章 | LLM Universe · C4 + Hello-Agents · 第 6 章 | 复现一条完整的 Agent 调用链 | 50% |
| W5 | 项目一:知识助手 | 第 9 章全部 + 第 24 章(向量模型) | LLM Universe · C3 知识库 + C4 | RAG Demo v1(能给别人试用) | 55% |
| W6 | 评测体系 | 第 18.1 节 | LLM Universe · C5 + Hello-Agents · 第 14 章 | 100+ 条评测集 + 评测报表模板 | 60% |
| W7 | Bad case 治理 | 第 18.2 节 | LLM Universe · C5 优化实战 | Bad case 看板(新增/修复/复发/时长) | 65% |
| W8 | 项目二:Agent 工作流 | 第 11、14、15 章 | Hello-Agents · 第 6、9 章 | Agent Demo + 单次成本估算 | 72% |
| W9 | PRD 与算账 | 第 41.2 / 41.3 / 41.5 节 | — | 两份 PRD:一份带能力边界表,一份带 ROI | 78% |
| W10 | 选题与组队 | 第 22 章(实战篇) | Datawhale 夏令营 / 大模型竞赛 + Hello-Agents · 第 18 章 | 立项书 + 分工与排期 | 82% |
| W11 | 冲刺 | 第 15、18 章(Harness / 评测) | 赛事实战 | 参赛作品 + 3 分钟演示视频 | 88% |
| W12 | 复盘与输出 | 第 35 章(前沿)+ 第 38 章(项目管理) | — | 一篇垂直行业分析 + 一页作品集 Case | 92% |
课程资源怎么用:外部课练手,本书补脑
| 资源(可替换) | 它是什么 | 用它补什么 | 本书补什么 |
|---|---|---|---|
| LLM Cookbook | 吴恩达系列课程的中文本地化教程 | 提示词的手感——怎么写、怎么改、怎么对比 | 第 7 章:为什么提示词能起作用,以及幻觉的机制 |
| LLM Universe (C1–C5) |
面向入门开发者的大模型应用开发教程 | 环境、API、知识库、RAG 应用、评估优化五段实操 | 第 9、10、18、32 章:切块为什么是第一决定因素、评测怎么设计 |
| Hello-Agents (第 6/9/14/18 章) |
从零构建智能体的开源教程 | 智能体范式、框架搭建、性能评估、毕业设计 | 第 11、12、15、18 章:Agent 为什么会跑飞、Harness 管什么 |
| Datawhale 夏令营 / 黑客松 | 组队实战与赛事 | 端到端交付、协作、复盘 | 第 22、38 章:项目怎么排期、风险怎么登记 |
这 12 周真正在攒什么:四件能拿给面试官看的东西
| 交付物 | 权重 | 它证明什么 |
|---|---|---|
| RAG + Agent 两个 Demo | 40% | 能当场演示 = 你真的做过,比任何结业证书都硬 |
| 评测集 + Bad case 看板 | 30% | 证明你有「AI 特有的判断力」——这是 AI PM 与传统 PM 的分水岭 |
| 成本估算与 PRD | — | 能算账、能讲清 ROI,说明你理解技术-体验-成本三角 |
| 黑客松作品 + 复盘 | — | 端到端交付证据,以及协作与抗压 |
| 垂直行业分析文 | 20% | 行业 know-how,也是最稀缺的一条 |
本 章 小 结
这张路径表按「能交付什么」划分,不按「学完哪本书」。
如果你只能记住一条:每一阶段结束,都要有一个能演示、能给别人用的东西。没有产物的学习,会在三个月后全部忘掉。
实战篇:四个能直接照抄的落地方案
大型项目 / 个人工作台 / 产品经理 / 项目经理
- 大型项目六阶段与每阶段的 Gate 条件
- 个人工作台的四层结构与一周搭建计划
- AI 产品经理的需求评分卡与 PRD 六处差异
- AI 项目经理的能力里程碑写法与风险登记表
前面十九节讲的是「是什么、为什么」。这一节讲「怎么干」。 四个方案分别对应四种身份:你要交付一个企业系统、你要提升自己的效率、你要定义产品、你要管住项目。 每个方案都给了阶段、交付物和判断标准,可以直接改成你项目里的文档。
22.1 大型项目怎么搭:六阶段落地法
先给一个前提判断:企业级 AI 项目的失败,极少是模型不行,多数是「场景选错」和「没有验收标准」。 下面的阶段设计,核心就是把这两件事在前期钉死。
以「合同智能审查系统」为例(可替换为任何文档处理类项目)。规模假设:200 人规模企业,年合同量 8000 份,法务 5 人。
| 阶段 | 关键动作 | 交付物 | 退出条件(Gate) |
|---|---|---|---|
| 0 · 立项 1–2 周 |
选场景、算 ROI、明确不做哪些事 | 一页纸立项书:现状成本 / 目标指标 / 边界 | 能用数字说清「省多少人天」,且有人愿意为结果负责 |
| 1 · 数据与基线 2–4 周 |
收 200 份历史合同;标注 100 条黄金集;用纯人工跑一遍基线 | 评测集 v1 + 人工基线报告(准确率、平均耗时) | 黄金集覆盖三类以上合同类型;人工基线有明确数字 |
| 2 · PoC 3–4 周 |
只做一条链路:条款抽取 → 风险命中 → 输出报告 | 可演示原型 + 在黄金集上的得分 | 核心指标达到人工基线的 80%,且失败模式可解释 |
| 3 · 工程化 6–10 周 |
Workflow 编排、权限、日志、重试、人工审批节点、成本上限 | 可上线系统 + 运维手册 + 监控看板 | 单份合同 P95 延迟 < 90 秒;失败可重试;有完整 trace |
| 4 · 试点 4–6 周 |
选 1 个法务小组灰度,每周收集 badcase 并回归 | badcase 库 + 迭代记录 + 用户反馈 | 采纳率 > 60%;人工接管率 < 30%;无重大误判 |
| 5 · 推广运营 持续 |
培训、权限分级、月度评测回归、模型升级评估 | 运营月报 + 版本演进路线 | 月度活跃使用率稳定;成本在预算内 |
WBS 拆解(工程化阶段为主,约 8 周 / 4 人)
| 模块 | 工作项 | 角色 | 人天 | 依赖 |
|---|---|---|---|---|
| 数据管道 | 文档解析与 OCR(含表格) | 后端 | 8 | — |
| 切块策略与元数据设计 | 算法 | 5 | 解析完成 | |
| 索引构建与增量更新 | 后端 | 4 | 切块定稿 | |
| 核心能力 | 条款抽取(结构化输出) | 算法 | 10 | 评测集 v1 |
| 风险规则库(30 条) | 法务 + 算法 | 12 | 历史案例 | |
| 报告生成与引用标注 | 算法 | 6 | 抽取稳定 | |
| 编排与运行时 | Workflow 编排(含分支与人工闸门) | 后端 | 8 | 核心能力 |
| Harness:权限、日志、重试、限额 | 后端 | 10 | 编排完成 | |
| 前端界面(上传、审阅、批注) | 前端 | 12 | 接口定稿 | |
| 质量 | 评测流水线(自动回归) | 算法 | 5 | 评测集 v2 |
| 红队测试(注入 / 越权) | 安全 | 4 | 系统可运行 |
成本估算模板(按年算,别只算 API 费)
- 人力:84 人天(上表合计),按人天成本折算
- 数据标注:100 条黄金集 × 2 轮,法务参与
- 基础设施:向量库、日志存储、测试环境
- 集成:OA / 合同系统的对接改造
- 推理:8000 份 ÷ 12 × 单份 token 成本 × 1.3(重试冗余)
- Embedding 重建:全量一次 + 增量每日
- 人工复核:接管率 × 单份复核工时
- 运维:0.2 人力 + 监控
- 常被漏算:badcase 处理与评测回归的固定投入
① 跳过基线——没有人工基线,就无法证明 AI 更好,最后变成「感觉还行」的争论。
② 把 PoC 当产品——PoC 只需要一条链路跑通,产品需要权限、日志、重试、监控,工作量是 PoC 的三到五倍。
③ 没有人工闸门——合同、财务、对外发送类场景,必须保留人工确认节点。省掉这一步,一次误判的代价可能超过全年节省。
22.2 个人 AI 工作台:四层结构,一周搭完
个人工作台的目标不是「装很多工具」,而是让信息只进来一次,然后能被反复调用。 绝大多数人的问题不是工具少,而是同一条信息在微信、笔记、文档、浏览器收藏里存了四份,用的时候一份都找不到。
目录结构(直接照建)
工作台/
├── 00_收件箱/ # 一切新东西先扔这里,每周清空一次
├── 10_项目/ # 按项目建文件夹,活跃的才放这里
│ └── 项目A/
│ ├── 01_需求与背景.md
│ ├── 02_决策记录.md # 为什么这么定,比定了什么更重要
│ ├── 03_交付物/
│ └── 04_复盘.md
├── 20_领域知识/ # 可复用的、跨项目的知识
│ ├── 行业数据/
│ ├── 方法模板/
│ └── 术语表.md
├── 30_提示词库/ # 按用途分类,每个都写清「什么时候用」
│ ├── 01_写作类/
│ ├── 02_分析类/
│ ├── 03_审查类/
│ └── 04_会议类/
├── 40_模板/ # 周报、方案、评审、复盘的空壳
└── 50_归档/ # 结束的项目整体挪进来
四层分别用什么(按「够用」选,不按「先进」选)
| 层 | 要解决的事 | 可选方案 | 选择标准 |
|---|---|---|---|
| 输入 | 把散落的信息收进来 | 浏览器剪藏、手机分享、录音转写、截图 OCR | 一步能完成,超过两步你就不用了 |
| 知识 | 能被检索,而不是被收藏 | 本地 Markdown(Obsidian 等)+ 一个 RAG 工具;或云笔记 + 自带 AI 搜索 | 支持全文检索;文件在你手里(可导出) |
| 执行 | 重复任务不用每次重写提示 | 对话式 AI + 提示词库;或搭一个小型 Workflow | 提示词能版本化,好用的留下、差的删掉 |
| 自动化 | 不靠记性,靠定时与触发 | 系统定时任务、自动化平台、或简单的脚本 | 失败有通知;能手动重跑 |
一周搭建计划
Day 1–2:先清,再建
把现有的笔记、收藏、文档导出到一个地方,只做一件事:按「项目 / 领域 / 归档」三类分开。不要一开始就设计复杂标签体系,你会死在分类上。
Day 3:建目录与命名规则
用上面的结构。命名统一成 日期_主题_版本,比如 20261101_合同审查方案_v2.md。规则的价值在于:三个月后你还找得到。
Day 4:接上检索
把「领域知识」和「项目交付物」两个目录接进一个 RAG 工具。测试方法:提 10 个你以前问过的问题,看能不能检索到正确的文档。找不到就先修目录,别急着换工具。
Day 5:整理 10 条提示词
只挑你每周都要做的十件事:写周报、拆需求、审方案、写会议纪要、做竞品对比……每条提示词固定三部分:角色与目标、输入说明、输出格式。
Day 6:做一条自动化
只做一条,最简单的:每天早上把「收件箱」里的内容生成一份摘要,或每周五自动汇总本周项目变更。一条能跑通的自动化,胜过十条设计稿。
Day 7:定一个复盘机制
每周五花 15 分钟回答三个问题:这周哪件事 AI 帮上忙了?哪件事它反而添乱了?下周删掉哪个环节?工作台是删出来的,不是加出来的。
22.3 从 AI 产品经理视角:先判断「该不该做」,再想「怎么做」
传统产品经理的核心能力是「把需求翻译成功能」。AI 产品经理多了一项前置判断: 这个需求适不适合用 AI 做。判断错了,后面所有努力都是在给一个错误的方向做优化。
需求适配度评分卡(每项 1–5 分,低于 15 分建议不做)
| 维度 | 要回答的问题 | 权重 | 低分信号 |
|---|---|---|---|
| ① 任务重复度 | 这件事每周发生多少次?每次耗时多久? | ×1.2 | 一年做两次,做完就忘——投入产出不成立 |
| ② 容错空间 | 错了会怎样?能不能被人复核兜住? | ×1.5 | 错了直接造成资金损失、法律责任、不可逆后果 |
| ③ 数据可得性 | 有没有历史样本?质量如何?能不能拿到? | ×1.3 | 没有历史数据,或数据在别人手里拿不到 |
| ④ 评估可行性 | 「做对了」能不能被明确判定? | ×1.4 | 好坏只能靠感觉,专家之间也吵不出结论 |
| ⑤ 价值密度 | 节省的时间和它影响的人,值多少钱? | ×1.0 | 省的是「本来就不重要」的时间 |
① 要求 100% 准确——概率模型做不到,除非配人工兜底,那就要重算 ROI。
② 数据拿不到——「等数据打通再做」是正确回答,不是拖延。
③ 没有明确对错——连专家都判不了对错的任务,无法评估,也就无法迭代。
④ 低频高价值——一年 5 次的任务,优化它不如直接请专家。
AI 产品 PRD 与传统 PRD 的六处差异
| 章节 | 传统写法 | AI 产品要补什么 |
|---|---|---|
| 功能描述 | 「用户点击 A,系统返回 B」 | 要写能力边界:什么情况下它做不到、做不到时给什么反馈 |
| 输入定义 | 字段、格式、校验规则 | 补输入质量要求:模糊、超长、矛盾、缺字段时如何处理 |
| 输出定义 | 字段、枚举值 | 补不确定性表达:置信度、依据引用、多个候选、拒答 |
| 异常流程 | 网络失败、权限不足 | 补模型异常:幻觉、格式跑偏、超时、内容被安全策略拦截 |
| 验收标准 | 功能是否可用、通过率 | 补质量指标:准确率、召回率、幻觉率、采纳率、P95 延迟 |
| 衡量成功 | DAU、转化率 | 补人工替代率与接管率——这才是 AI 价值的直接证据 |
MVP 的正确切法
AI 产品的 MVP 不是「功能最少的版本」,而是「能验证核心假设的最小闭环」。它必须能端到端跑完一次, 哪怕中间有一段是人手动补的(这叫 Wizard of Oz,绿野仙踪法:后台人工冒充 AI,先验证需求是否真实)。
只留一个核心场景
不要做「既能审合同又能写报告」。选一个高频、判断标准清晰、错了能兜住的场景。
只做 3~5 个指标
准确率、人工接管率、单次耗时、成本。指标多了等于没有指标。
先做 50 条评测集
没有评测集就没有 MVP,只有 demo。50 条真实样本,两周能建完。
设计兜底路径
模型失败时用户怎么办?转人工、给候选、还是明确说「无法判断」?兜底路径的体验,决定用户敢不敢用。
22.4 从 AI 项目经理视角:管住不确定性
AI 项目的管理难点只有一个:你无法在前期准确估计「模型能不能做到」。 传统项目管理假设「需求确定、工作量可估」,这个假设在 AI 项目里基本不成立。 所以管理方法要变:用阶段性验证代替前期估算,用能力里程碑代替功能完成度。
里程碑设计:不要用「完成 80%」
| 错误写法 | 问题 | 正确写法 |
|---|---|---|
| 「抽取模块完成 80%」 | 80% 是代码量还是效果?无法验证 | 「在 100 条黄金集上,字段抽取准确率从 62% 提升到 85%」 |
| 「模型接入完成」 | 接了不等于能用 | 「端到端跑通 20 份真实合同,P95 延迟 < 90 秒」 |
| 「优化中」 | 无终点,无判据 | 「幻觉率从 18% 降到 8%,连续两轮评测稳定」 |
| 「准备上线」 | 上线条件不清 | 「权限、日志、限额、回滚四项验收通过」 |
风险登记表(AI 项目专属的五条)
| 风险 | 概率 | 影响 | 应对 | 触发信号 |
|---|---|---|---|---|
| 效果达不到可用线 | 高 | 高 | PoC 设硬门槛;预留「降级为辅助工具」的方案 | 连续两轮评测提升 < 3% |
| 数据质量不达标 | 高 | 高 | 第 1 周就抽样检查;不合格立即上报,不硬扛 | 解析失败率 > 15% |
| 成本超预算 | 中 | 中 | 设 token 上限与告警;简单任务路由到小模型 | 单任务成本 > 预算 1.5 倍 |
| 干系人期望过高 | 高 | 高 | 第一周就演示一次「它做不到什么」 | 出现「为什么它不能100%」的提问 |
| 合规与安全审查卡住 | 中 | 高 | 提前拉安全/法务进评审;数据脱敏方案先行 | 安全评审提出数据出境问题 |
用 AI 管项目:四个立刻能用的场景
喂给它:本周任务清单 + 上周计划 + 里程碑。
要求它输出:进度偏差项、风险信号、需要决策的事项。
关键:让它「只依据我给的数据,不要编造」,并要求每条结论标注来源。
喂给它:需求文档 + 历史项目复盘。
要求它输出:与历史失败模式相似的三处信号,并说明相似点。
关键:历史复盘是它唯一的判断依据,没有历史数据就别问。
喂给它:变更描述 + 当前 WBS。
要求它输出:受影响的工作项、需要重做的部分、新增依赖。
关键:让它「列出不确定的地方」,而不是给一个确定的天数——估算仍要人来定。
喂给它:录音转写文本。
要求它输出:决议、待办(负责人 + 时间)、未决问题三类,分开列。
关键:必须区分「讨论过」和「决定了」,这两者混淆是纪要最大的坑。
请完成三件事:
1. 找出进度偏差:计划完成但未完成、或未计划但已开始的项;
2. 找出风险信号:连续两周无进展、依赖项未确认、负责人未回应;
3. 列出需要我本周决策的事项,每条给出两个可选方案及各自代价。
约束:只依据我提供的数据,不要推测未出现的信息;数据不足以判断时,明确写出缺哪项。
输出:三张表,每张不超过 8 行。」
产品经理回答「做什么、为谁做、做到什么程度算成功」,要对价值负责。
项目经理回答「怎么在约束内交付、风险在哪、什么时候该停」,要对确定性负责。
AI 项目里最危险的情况是:产品经理用「模型会越来越强」来回避边界定义,项目经理用「先做出来再看」来回避验收标准。两者都会把风险推到上线之后。
本 章 小 结
这一章是「怎么干」。四个方案对应四种身份:交付系统、提升自己、定义产品、管住项目。
每个方案都给了阶段、交付物和判断标准,可以直接改成你项目里的文档——这也是它唯一的价值:能落地,不是能读。
一人公司(OPC)的内容产线:一个人怎么开一家内容公司
商业模型 / 五阶段 / 12 个功能模块 / 90 天
- 先想清楚「一人公司」的三个硬约束:每天 4 小时有效产能、注意力切换成本、月度现金上限。所有设计都由这三条推导出来
- 商业模型先于工具:卖给谁、卖什么、怎么收钱、复购从哪来——四个问题答不出,工具做得再好也是自娱自乐
- 从 0 到 1 的五个阶段 + 12 个功能模块的 P0/P1/P2 划分,以及 5 个 P0 功能的验收标准
- 工具怎么选:模型、图像、视频、配音四个品类的横向对比与三档预算组合,以及「按环节分层」的路由表
- Skills 怎么写:六段结构(触发/输入/步骤/输出/自检/失败处理)、四种来源、值不值得做的打分法
- 页面怎么搭:三条技术路线对比、五个页面的区域与交互、Streamlit 骨架代码
- 交互怎么做:状态驱动、批量队列、断点续跑、快捷键等七条模式
- 七天冲刺:每天一个能打开能用的东西,附当天验收标准
很多人把「内容创作平台」理解成一个工具:能生成剧本、能出图、能剪片。但一个人做内容,真正缺的从来不是工具——
缺的是「今天做什么、做完放哪、下周怎么复用」这套秩序。
所以这一章讲的是一个一人公司的运营系统:它由三部分组成——一套流程(先做什么后做什么)、
一个资产库(做过的东西怎么变成下次的起点)、一层自动化(哪些重复动作不该由人来做)。
软件只是这三样的载体。
后半部分(21.7 起)是具体的施工图:每个品类怎么选工具、对比谁、为什么选它;Skills 怎么写;
页面用哪条技术路线、五个页面各长什么样;交互怎么做;以及七天里每天交付什么。
23.1 先认清约束:一人公司和团队的差别不在人数
一人公司(One Person Company)不是「人少的公司」,是一种结构完全不同的组织: 它没有分工,没有交接,没有冗余。所有环节的瓶颈都是同一个人。
| 约束 | 具体表现 | 对系统设计的要求 |
|---|---|---|
| 时间 | 每天真正能投入的深度工作时间约 4 小时(其余被生活、回复、杂事切碎) | 单条内容的端到端工时必须可拆成 30 分钟以内的块;任何「要一口气做 3 小时」的环节都要改造 |
| 注意力 | 换任务要重新进入状态,每次切换损耗 10–20 分钟。一天切 8 次,就丢了 2 小时 | 批处理:同一天只做同一类事(周一选题、周二剧本、周三出图)。系统要支持「按阶段过滤任务」 |
| 现金 | 没有融资,工具订阅是纯支出,且按月扣 | 工具月费设上限(建议 ≤ 500 元起),能用按次计费就不用订阅;先验证再升级 |
| 无冗余 | 你病了、出差了,产线就停了 | 必须能中断能续上:每个环节的状态要落库,回来知道做到哪了(这就是「系统」而非「习惯」的意义) |
多次复用
23.2 商业模型先于工具:四个问题
一个人做内容,最常见的死法不是「做不出来」,是「做出来了但没人付费」。 所以在动手搭系统之前,先用一页纸回答四个问题。
| 问题 | 一人公司该怎么答(示例) | 答不出的后果 |
|---|---|---|
| 卖给谁 | 「28–35 岁、想转行做 AI 产品、但不知道怎么开始的在职产品经理」——具体到一个能想象出脸的人 | 内容没有取舍标准,每条都像给所有人看,结果没人觉得是给自己看的 |
| 卖什么 | 不是「视频」,是「帮他把三个月摸索压缩成两周」的方法与模板 | 只能靠平台流量分成,收入天花板极低且不可控 |
| 怎么收钱 | 三条腿:专栏/课程(一次性)、社群(订阅)、咨询/代做(高单价低频率) | 只有一条腿,平台一改规则就断粮 |
| 复购从哪来 | 内容是「连续剧」而不是「合集」——每周更新形成追更;社群提供持续价值 | 做一百条互不相关的内容,观众记不住你,也无法沉淀 |
三种一人公司内容形态的对照,先选一条路:
| 形态 | 日更压力 | 单条工时 | 变现路径 | 主要风险 |
|---|---|---|---|---|
| 流量号 (泛知识/影视解说) |
高,需日更或隔日更 | 1–2 小时 | 平台分成、星图/广告 | 同质化严重,单价持续下滑,随时被算法改规则 |
| 垂直知识 IP (专业领域输出) |
中,周更 2–3 条 | 4–8 小时 | 课程 / 社群 / 咨询,客单价高 | 起量慢(3–6 个月),要求你真的有专业积累 |
| 虚拟 IP 连载 (AI 短剧/动画) |
低,周更 1 集 | 10–20 小时 | IP 授权、广告、付费短剧 | 一致性极难,产能天花板明显,前期投入大 |
23.3 从 0 到 1 的五个阶段
目标:验证「这个话题有没有人要看」。注意:不是验证「你会不会做」,是验证「有没有需求」。 这一阶段刻意不碰视频,因为视频的沉没成本太高——做完一条不满意,你会舍不得放弃这个方向。
动作:
- 列出你比身边人懂得多的 10 个话题(越窄越好,「AI 产品经理如何写评测集」优于「AI 入门」)
- 每个话题写 3 条 300 字图文,发到 2 个平台,共 30 条,两周内发完
- 只看两个数:完读率、有没有人提问或私信
停止条件:两周后一条追问都没有 → 换话题,不要加大投入。这一步花两周,比花三个月做完一季视频才发现没人看要好。
目标:跑通「选题 → 剧本 → 分镜 → 生成 → 剪辑 → 发布」的一条完整路径, 哪怕每一段都很粗糙。这一阶段唯一的目标是「跑通」,不是「做好」。
动作:
- 只做 60 秒,只做 一个场景,只用一个角色(如果可以,连角色都不要,用旁白 + 空镜)
- 每一段都记录:花了多久、卡在哪、下次怎么更快——这份记录比成片更值钱
- 成片发出去,看数据,但不做大的方向调整(样本量不够)
停止条件:如果某一段(通常是视频生成或剪辑)耗时超过 4 小时,先解决这一段,不要做第二条。
目标:把单条生产的成本降下来。这是从「能做」到「能持续做」的关键一步, 也是最容易被跳过的一步——因为做资产不出内容,没有即时反馈。
| 要沉淀的资产 | 具体形态 | 省下什么 |
|---|---|---|
| 人物圣经 | 外貌、服装、声音、口癖、参考图,固定下来不再改 | 每次都重新描述角色,且形象漂移 |
| 镜头模板库 | 10 个常用运镜的提示词模板(推、拉、摇、特写、俯拍…) | 每次从零写提示词 |
| 片头片尾 / 字幕样式 | 做成工程模板,换文案即可 | 每次重搭时间线 |
| 选题库 | 30 条待做选题,带一句话钩子和参考素材 | 「今天做什么」的每日消耗 |
| 素材库 | 按项目/场景命名归档的空镜、转场、音效、配乐 | 找不到 = 等于没有 |
判断标准:如果你做第二条时还在「从零开始想」,说明资产化没做成,先停下来补资产,不要急着做第三条。
目标:把「发内容」变成一件有固定节奏、不消耗意志力的事。
动作:
- 定固定发布日(如每周二、四晚 8 点),并把「做内容」排进日历,当成会议对待
- 一稿多投:主平台发完整版,其他平台做尺寸与开头改写(不是简单搬运)
- 建立发布队列:至少提前 3 天做完,留出缓冲应对意外
停止条件:如果为了赶更导致质量明显下滑,宁可降频也不要注水——一人公司的口碑是最贵的资产。
目标:把流量变成收入,同时把重复动作交给机器,把省下的时间投到「只有你能做」的事上。
| 变现方式 | 启动门槛 | 一人公司的适配度 |
|---|---|---|
| 平台分成 / 广告 | 有播放量即可 | 收入低且不稳定,只当保底,不当目标 |
| 付费专栏 / 课程 | 1000 个精准关注 | 最适配:一次制作、长期售卖,边际成本近零 |
| 社群订阅 | 有持续输出能力 | 最适配:现金流稳定,且能反哺选题(用户直接告诉你缺什么) |
| 咨询 / 代做 | 有可验证的案例 | 单价高但卖时间,与内容生产冲突,控制在每月 2 单以内 |
| IP 授权 / 定制 | 有辨识度的形象 | 门槛高,但一旦成立,是唯一能「睡后收入」的路径 |
这一笔的意义不在金额,在于证明「有人在为你的判断力付费」,而不是在为平台流量付费——这是内容生意能不能长久的分水岭。
23.4 需求清单:一人公司真正需要的 12 个模块
下面是按「一人公司实际会用到」排的,不是按功能齐全排的。P0 是不做就跑不通,P1 是不做会很累,P2 是以后再说。
| 序 | 模块 | 一句话职责 | P0 最小可用 | 优先级 |
|---|---|---|---|---|
| 1 | 选题库 | 回答「今天做什么」 | 列表 + 钩子 + 状态(待做/在做/已发) | P0 |
| 2 | 资料库 | 存放事实、数据、引用来源 | 按选题挂附件,能全文搜 | P1 |
| 3 | 剧本工坊 | 把选题变成可拍的分场文本 | 结构化编辑(场次/台词/时长)+ 版本记录 | P0 |
| 4 | 人物圣经 | 保证角色跨镜头一致 | 固定字段 + 参考图 + 声音样本 | P0(有角色时) |
| 5 | 分镜台 | 把文字翻译成可执行的镜头清单 | 表格:镜号/时长/运镜/画面描述/首帧提示词 | P0 |
| 6 | 素材库 | 让做过的东西能被再找到 | 命名规范 + 标签 + 缩略图 | P0 |
| 7 | 图像生成 | 出首帧 / 关键帧 / 封面 | 批量提交 + 结果回填到分镜 | P1 |
| 8 | 视频生成 | 图生视频 / 文生视频 | 按镜号批量排队 + 失败重试 | P1 |
| 9 | 配音 | 统一音色,逐句可重录 | 按分场生成 + 单句重生成 | P1 |
| 10 | 剪辑时间线 | 把镜头拼成片 | 工程模板 + 素材按镜号自动排序 | P1 |
| 11 | 发布编排 | 管「什么时候发、发到哪」 | 状态机 + 各平台尺寸导出 | P0 |
| 12 | 数据回流 | 知道哪条有效、为什么 | 三个指标手工填也比不填强 | P1 |
23.5 五个 P0 功能怎么写验收标准
① 人物圣经:一致性不是靠提示词,是靠「不许改」
角色形象漂移是 AI 内容的第一大痛点。解决办法不是写更长的提示词,而是把角色变成一份固定档案, 每次生成都从档案里取,而不是重新描述。
| 字段 | 为什么必须有 | 示例 |
|---|---|---|
| 一张基准图 | 所有下游生成都以它为参考图,比文字描述可靠十倍 | 正面半身、纯色背景、自然光 |
| 外貌锁定字段 | 年龄/发型/脸型/肤色/体型/显著特征(疤、痣、眼镜) | 28 岁,短寸,方脸,左眉有疤 |
| 服装套装 | 按场景预设,不临时决定 | 工作装 / 居家装 / 外出装 三套 |
| 声音样本 | 配音音色要跨集一致 | 30 秒干声,无背景音 |
| 口癖与语气 | 让台词像同一个人说的 | 句尾常带「吧」,不用书面语 |
| 不许改清单 | 明确写「以下元素任何情况下不改」 | 发型、眉疤、瞳色 |
做不到的话,先检查是不是「基准图 + 参考强度」没用上——文字描述永远无法稳定锁住一张脸。
② 分镜表:一张表决定后面所有环节的效率
分镜表是「文字」和「素材」之间的唯一接口。它的字段设计得好,后面生成、剪辑、配音全都能并行;设计得差,全卡在你一个人身上。
| 字段 | 填什么 | 不填会怎样 |
|---|---|---|
| 镜号 | S01-03(场-镜),永不重排 | 素材文件名对不上,剪辑时靠肉眼找 |
| 时长 | 秒数,总和等于成片长度 | 配音时长对不上画面,反复返工 |
| 运镜 | 固定/推/拉/摇/跟/俯/仰 | 画面全是「静态中景」,看起来像 PPT |
| 画面描述 | 人话,写清谁在哪做什么 | 生成时无从下手,或每次理解不同 |
| 首帧提示词 | 可直接喂给图像模型的完整描述 | 每生成一次都要重新想,且风格不统一 |
| 台词/字幕 | 这一镜对应的文字 | 配音和画面对不齐 |
| 状态 | 待生成/已生成/待重做/已入库 | 不知道哪几个镜头还没做 |
这个标准听起来夸张,但它是一人公司最重要的保险——哪天你想外包一个环节,能不能外包,取决于这张表写得够不够清楚。
③ 素材库:命名规范比工具重要
一人公司最贵的浪费不是「做错」,是「做过但找不到了,于是重做一遍」。 治理这件事只需要一条规则,然后强制执行。
# 命名规范:项目_场景_镜号_版本_状态
2026Q4_AI转型_S01C03_v2_ok.mp4
2026Q4_AI转型_S01C03_v2_bad.mp4 # 保留失败版,方便对比"什么提示词不行"
# 目录结构
library/
projects/<项目名>/
script.md 剧本
characters/ 人物圣经(基准图 + 参数)
shots/ 分镜表(csv 或 json)
assets/
images/ 首帧、关键帧、封面
videos/ 生成的镜头片段
audio/ 配音、配乐、音效
exports/ 成片与各平台尺寸
shared/ 跨项目复用的公共素材
shots-templates/ 运镜提示词模板
music/ 按情绪分类的配乐
sfx/ 音效
intro/ 片头片尾工程文件
另一个硬指标:
shared/ 目录里的文件数每周都在增长。不增长的素材库,等于没有素材库。
④ 发布编排:状态机,不是待办清单
发布最容易出错的地方不是「忘了发」,是「以为发了」——草稿存了、尺寸导了、文案写了,但没点发布。 用状态机管,就不会出现这种模糊状态。
草稿 → 待审 → 已排期 → 已发布 → 已复盘
↓
已搁置(附原因)
# 每条内容必须只有一个当前状态,且状态变更要留时间戳
# 关键:没有"差不多做完了"这个状态
做不到说明状态定义有歧义——通常是混用了「做完了」和「排期了」这两件事。
⑤ 数据回流:只记三个数,但要每条都记
| 指标 | 它回答什么问题 | 怎么用它 |
|---|---|---|
| 完播/完读率 | 内容本身抓不抓人(跟粉丝量无关) | 低于均值 → 改开头 15 秒,而不是改选题 |
| 互动率 | 有没有戳中情绪或疑问 | 高互动低完播 → 选题好但节奏拖 |
| 转化 | 有没有人点进主页/私信/下单 | 这是唯一跟钱有关的指标,前两个都是过程指标 |
23.6 系统怎么搭:目录、表、自动化
一人公司的系统不需要「平台」,它需要三个能立刻上手的东西:一个文件目录(资产)、一张任务看板(流程)、几条脚本(自动化)。 太重的东西会在第二周就被放弃。
三张核心表(够用到几百条内容)
projects 项目/成片
id, title, hook, format, status, publish_at, metrics(json)
shots 分镜
id, project_id, seq, duration, camera, desc, prompt, status, asset_path
assets 素材
id, type(image/video/audio), path, tags, source, license, created_at
# 关系:projects 1—N shots 1—N assets
# 这三张表用 Excel / 飞书多维表 / SQLite 都能实现,别一上来就上数据库服务
四条值得自动化的重复动作
| 自动化 | 怎么做(不写代码也行) | 每周省下 |
|---|---|---|
| 素材自动入库 | 监控输出文件夹,新文件按规则改名、生成缩略图、追加到表 | 1–2 小时 |
| 批量生成 | 读 shots 表里 status=待生成 的行,逐条调 API,回写结果与状态 | 2–3 小时(且能夜间跑) |
| 多平台导出 | 一条命令导出竖版/横版/方版 + 自动切封面 | 30 分钟 |
| 周报 | 每周日自动汇总:产量、成本、三指标均值 | 避免「凭感觉判断效果」 |
23.7 先定「系统做多重」,再定工具
技术选型最容易犯的错,是一上来就选框架。正确的顺序是先定「这套系统要做多重」,再在那一档里挑工具。 因为一人公司真正的成本不是软件钱,是你花在搭系统上的时间——那本该用来做内容。
| 档位 | 形态 | 搭建耗时 | 月成本 | 什么时候用 |
|---|---|---|---|---|
| L 轻 | 多维表格(飞书/Notion/Airtable)+ 本地文件夹 + 手动调工具 | 2 天 | 0–100 元 | 第 1–2 个月,默认从这里开始。产量 < 每周 3 条时,它够用 |
| M 中 | Streamlit / Gradio 单页应用 + SQLite + 直接调 API | 1–2 周 | 100–500 元 | 需要批量生成、断点续跑、跨表关联时 |
| H 重 | Next.js + Supabase + 任务队列 + 对象存储 | 3–4 周 | 300–1500 元 | 要给别人用、要多端、要长期运营 |
① 你开始手工重复同一串操作(导出→改名→上传),每周超过 3 次;
② 你需要按条件筛出「该做但没做」的东西,而表格的筛选已经不够用;
③ 你开始因为忘记某条内容做到哪了而返工。
没出现这三个信号就升级,大概率是「工具瘾」发作。
23.8 大脑怎么选:一份路由表,不是「选一个最强的」
一人公司只用一个模型是最贵的做法。正确的做法是按环节分层:动脑的用好模型,搬砖的用便宜模型。
| 模型 | 定位 | 单价量级 | 中文 | 工具调用 | 在内容产线里干什么 |
|---|---|---|---|---|---|
| DeepSeek V4 / V4.1 | 国产性价比旗舰 | 低 | 强 | 支持 | 批量任务主力:分镜拆解、标题生成、素材打标签 |
| Qwen3.8-Max | 国产综合,中文最好之一 | 中低 | 最强 | 支持 | 中文剧本、口播稿、需要语感的文案 |
| Kimi K3 | 长文本 | 中 | 强 | 支持 | 整本小说/长资料一次读完再改编 |
| GLM-5 | 国产均衡 | 低 | 强 | 支持 | 结构化输出(JSON)稳定,适合跑表格化任务 |
| Claude Sonnet 5.5 | 写作与结构感最强 | 高 | 中上 | 强 | 剧本定稿、分镜设计、需要「讲得好看」的环节 |
| GPT-6.1 | 通用强,生态全 | 中高 | 强 | 最强 | 需要复杂工具编排、多步任务时 |
| Gemini 3.8 Flash | 便宜 + 多模态 | 很低 | 中上 | 支持 | 看图打标签、批量粗筛(便宜到可以随便跑) |
路由表(照抄即可):
| 环节 | 用哪类模型 | 为什么 |
|---|---|---|
| 选题发散(一次生成 30 条) | 便宜模型 | 要的是量,不是精;30 条里你自己挑 3 条 |
| 剧本 / 口播稿定稿 | 贵模型 | 这是内容的全部价值所在,一条差稿毁一条视频 |
| 分镜拆解 | 中档 + 结构化输出 | 是格式转换任务,不需要创造力,需要稳定 JSON |
| 素材打标签 / 粗筛 | 最便宜的(含多模态) | 量大、可容错、错了人工一眼能改 |
| 标题 / 封面文案 | 中档,跑 10 个候选 | 靠数量对比出好结果,不靠单次质量 |
要不要上向量库 / RAG?一人公司大多数情况不需要。判断标准很简单:
| 你的资料规模 | 该用什么 | 理由 |
|---|---|---|
| < 200 篇,且结构清晰 | 文件名 + 全文搜索 | 直接塞进上下文就行,建向量库是过度工程 |
| 200–2000 篇,需要语义匹配 | 向量库(Chroma / LanceDB 本地即可) | 关键词搜不到「换个说法的同一个意思」 |
| > 2000 篇,且要多人用 | Milvus / pgvector | 才需要认真考虑索引与并发 |
23.9 生成类工具怎么选:三张表,按预算对号入座
图像:决定「画面能不能用」
| 工具 | 强项 | 弱项 | 成本量级 | 什么时候选它 |
|---|---|---|---|---|
| 即梦 / Seedream | 中文提示词理解好,出图快,模板多 | 风格偏「网感」,写实略塑料 | 低(有免费额度) | 默认首选:日常封面、插图、分镜首帧 |
| Flux | 写实、手部与文字较稳,可本地部署 | 对中文提示词不敏感,需要英文 | 中(本地免费但要显卡) | 要人物写实、要批量可编程 |
| Midjourney | 审美上限最高,风格统一 | 不可精细控制,无 API(历史上) | 高(订阅制) | 做视觉调性、封面定调 |
| Stable Diffusion(本地) | 完全可控:ControlNet、LoRA、固定种子 | 学习成本高,出图慢 | 0(显卡摊销) | 需要角色一致性时几乎是唯一解 |
| Nano Banana 类(原生多模态) | 改图、保持人物一致、按指令编辑 | 精细度不如 SD 工作流 | 低–中 | 已有图要改姿势/换背景/换服装 |
结论:日常用即梦,角色一致性用 SD + LoRA,封面定调用 Midjourney 挑一次风格再复制。 不要试图用一个工具解决全部——这是新手最容易浪费钱的地方。
视频:决定「能不能动起来且不崩」
| 工具 | 强项 | 弱项 | 成本量级 | 适用镜头 |
|---|---|---|---|---|
| 可灵 | 人物动作自然、镜头语言强 | 贵,长镜头易崩 | 中高(按秒计费) | 有人物表演的关键镜头 |
| 即梦(视频) | 图生视频稳定,价格友好 | 复杂运镜弱 | 低 | 批量空镜、氛围镜头(主力) |
| 海螺 / MiniMax | 运动幅度大,创意镜头好 | 一致性一般 | 中 | 转场、冲击镜头 |
| Runway | 可控性强(运镜、笔刷) | 贵,中文支持一般 | 高 | 需要精确运镜时 |
| Veo | 音画同出,物理真实感强 | 贵、额度少 | 很高 | 少量「必须震撼」的镜头 |
| Wan 等开源 | 本地免费,可微调 | 要显卡,出片慢 | 0(硬件摊销) | 高频量产、可控性要求高的团队 |
配音:决定「听起来是不是人」
| 工具 | 强项 | 弱项 | 成本 | 选它的情况 |
|---|---|---|---|---|
| edge-tts | 免费、极快、稳定 | 音色机械,无情感 | 0 | 验证阶段、内部草稿 |
| CosyVoice 2 | 开源、可零样本克隆、中文自然 | 要本地部署 | 0(硬件) | 长期做 IP,要固定音色 |
| Fish Audio / MiniMax | 情感表现好,多音色 | 按字符计费 | 低–中 | 要「有情绪」的口播 |
| ElevenLabs | 英文最强,情感细腻 | 中文一般,贵 | 高 | 做海外内容 |
剪辑:决定最后 20% 的观感,也是最磨人的一段
| 工具 | 强项 | 弱项 | 成本 | 什么时候选它 |
|---|---|---|---|---|
| 剪映 / CapCut | 自动字幕、语音转字幕、模板多、上手快 | 精细控制弱,长工程容易卡 | 免费 / 会员 100–200 元/月 | 默认首选:3 分钟以内、以口播或字幕为主 |
| DaVinci Resolve | 免费版功能完整,调色最强,稳定 | 学习曲线陡,吃显卡 | 0(免费版够用) | 要调色统一、要精细剪辑且不想付费 |
| Premiere | 插件生态全,与 AE 联动 | 订阅制,稳定性一般 | 150–300 元/月 | 已经会 AE、需要做复杂动效 |
| Final Cut Pro | Mac 上极流畅,磁性时间线 | 只有 Mac | 一次性买断 | Mac 用户、追求剪片手感 |
| Shotcut / Kdenlive | 完全免费开源,轻量 | 界面粗糙,字幕功能弱 | 0 | 零预算起步、或跑在低配机器上 |
三档组合,按你的预算直接选:
| 档位 | 组合 | 月成本 | 取舍 |
|---|---|---|---|
| 0 元档 | 免费额度 + edge-tts + 剪映免费版 + 开源 SD/Wan | ≈0 | 能跑通全流程,但产能低(每周 1 条)、质量靠运气 |
| 300 元档 | 即梦(图+视频)+ CosyVoice 本地 + 剪映会员 | 200–400 | 推荐起步:产能 2–3 条/周,质量稳定 |
| 1000 元档 | 可灵 + Flux/SD 本地 + Midjourney 定调 + 商业素材库 | 800–1500 | 能做出「看起来像专业团队」的成片,但需更高判断力 |
23.10 Skills:把「做对一次」变成「每次都能做对」
「Skill」在这里不是某个平台的专有功能,而是一个可复用的能力包: 它把一次成功的做法固定下来,下次换个输入,还能得到同样质量的结果。 对你的产线来说,Skill 就是你的「员工手册」——公司只有你一个人,但它替你记住怎么做。
一个 Skill 由六段组成(缺一段就会不稳定)
| 段 | 写什么 | 缺了会怎样 |
|---|---|---|
| ① 触发条件 | 什么情况下该用它(关键词、输入类型、任务阶段) | 你或模型「想不起来用它」,于是每次重新即兴发挥 |
| ② 输入契约 | 需要哪些字段、什么格式、缺了怎么办 | 输入残缺时硬跑,输出全是幻觉 |
| ③ 步骤 | 分几步、每步做什么、每步的中间产物 | 一步到位的提示词,结果不可控也无法调试 |
| ④ 输出格式 | 结构(JSON / 表格 / 固定段落)与字段含义 | 每次格式不同,下游没法自动化 |
| ⑤ 自检 | 产出后必须过的检查(字数、是否含禁用词、是否引用了资料) | 错误直接流到下一环节,越往后越贵 |
| ⑥ 失败处理 | 不合格时重试几次、换什么策略、什么时候交给人 | 要么死循环烧钱,要么静默产出垃圾 |
完整示例:一个「剧本分场」Skill 的骨架
# skill: script-to-scenes
## 触发
当输入是「完整剧本正文」且需要拆成可拍摄的分场时使用。
## 输入契约
- script: 剧本文本(必填,>=300 字)
- duration: 目标时长秒数(必填)
- characters: 人物名数组(必填,用于校验人名一致)
缺 script 时停止并提示,不要猜测。
## 步骤
1. 通读全文,输出 3 条以内的「核心冲突」摘要(供自检用)
2. 按「场景切换 / 情绪转折」切分,每场 8–20 秒
3. 每场生成:场号、时长、地点、出场人物、动作描述、台词、情绪
4. 校验:总时长与 duration 误差 < 15%;人物名必须来自 characters
## 输出格式(严格 JSON)
[{"scene":1,"dur":12,"place":"...","cast":["..."],"action":"...","lines":"...","mood":"..."}]
## 自检
- 场次时长求和与目标误差 < 15%
- cast 里不得出现 characters 之外的人名
- 不得出现「镜头缓缓推进」这类不可执行的描述
## 失败处理
- 校验不过:把失败项回传给模型,重试 1 次
- 二次失败:输出原文 + 失败原因,标记 needs_human=true
Skill 从哪来:四种来源,优先级从高到低
| 来源 | 怎么拿 | 可靠性 |
|---|---|---|
| 从失败案例反向写 | 每遇到一次「这次为什么不行」,就把约束补进 Skill | 最高——它来自你的真实业务 |
| 自己沉淀 | 某次做得特别好,立刻固化成模板 | 高,但要警惕「只对那一条有效」 |
| 官方 / 平台技能包 | 模型厂商或工具方提供的预设(如各家 Agent 的固定技能目录) | 中——通用但不贴你的业务 |
| 社区分享 | 别人公开的提示词包 | 低——拿来做起点,别直接用 |
怎么判断一个 Skill 值不值得做
三个维度各 1–5 分,相乘超过 40 才值得写:
| 维度 | 怎么打分 | 低分的例子 |
|---|---|---|
| 复用频率 | 每周用几次 | 一年做一次的年度总结,写 Skill 不值 |
| 稳定性 | 输入格式是否固定、规则是否常变 | 「想一个好选题」规则天天变,不适合固化 |
| 可验证性 | 产出能不能被自动检查 | 「这段文案好不好」没法自动判,只能人看 |
① Skill 越多越好——错。技能之间会互相抢触发,20 个以上就开始混乱,控制在 8–12 个核心 Skill;
② 在 Skill 里写死模型名——错。模型三个月换一轮,写死了以后每次换模型都要改一遍所有 Skill。模型名放在配置里,Skill 只管逻辑。
23.11 页面怎么创建:三条路线,五个页面
三条技术路线的对比(这是最容易选错的地方)
| 路线 | 代表 | 上手 | 能做什么 | 做不了什么 |
|---|---|---|---|---|
| A 多维表格 | 飞书多维表格 / Notion / Airtable | 半天 | 列表、看板、表单、简单自动化、多人协作 | 复杂交互(拖拽排序、批量提交、实时进度) |
| B Python 单页 | Streamlit / Gradio | 1–2 天 | 表格编辑、按钮触发 API、进度条、文件上传、图表 | 精细样式、移动端适配、高并发 |
| C 前端应用 | Next.js / Vue + Supabase | 1–3 周 | 任何交互、可部署、可给别人用 | 时间成本高,且你会花大量时间在「非核心」上 |
先用多维表格跑两周,你会非常清楚自己每天点哪几个按钮;然后用 Streamlit 把那几个按钮做成页面—— 这时你是在「优化已知动作」,而不是「猜需要什么功能」。直接上 C 的人,八成像在给未来的自己挖坑。
五个页面,每个页面的区域、组件与验收
页面 1 · 选题看板(最先做,因为它每天都在用)
| 区域 | 放什么 | 交互 |
|---|---|---|
| 顶部 | 四个数字:待做 / 在做 / 本周已发 / 库存周数 | 点数字直接筛选 |
| 左列 | 按状态分组的卡片列表(待做/剧本/分镜/生成/剪辑/已发) | 拖拽换状态(拖完自动写回) |
| 右栏 | 选中项的详情:钩子、参考链接、目标时长 | 就地编辑,失焦自动保存 |
| 底部 | 一个输入框:「记一条新选题」 | 回车即存,不跳页 |
做不到就是设计有问题——记录成本每高一步,你就会少记一半。
页面 2 · 剧本编辑
| 区域 | 放什么 | 交互 |
|---|---|---|
| 左侧 | 分场列表(场号 + 首句 + 时长) | 点击定位,拖拽调整顺序(只改 order,不改场号) |
| 中间 | Markdown 编辑器,一场一块 | 自动保存 + 版本快照(每次保存留一版) |
| 右侧 | AI 辅助:续写 / 改语气 / 压缩到 N 秒 | 选中文本后出现浮动按钮,结果以 diff 形式确认 |
| 底部 | 总时长、字数、预计口播秒数 | 超时标红 |
页面 3 · 分镜表(整个系统的核心,投入产出最高)
| 区域 | 放什么 | 交互 |
|---|---|---|
| 主体 | 表格:镜号 / 时长 / 运镜 / 画面 / 提示词 / 台词 / 状态 / 素材缩略图 | 单元格直接编辑;Tab 到下一格 |
| 行操作 | 生成 / 重生成 / 查看 / 标记废弃 | 按状态显示不同按钮(见 21.11) |
| 工具条 | 「批量生成选中」「按镜号导出 CSV」 | 选中多行后出现,显示「已选 N 条,预计 X 元」 |
| 侧栏 | 人物选择器:选了谁,提示词自动拼上人物圣经 | 避免每次手写角色描述 |
这一条如果做不到,说明页面只是「展示」,不是「工具」。
页面 4 · 素材库
| 区域 | 放什么 | 交互 |
|---|---|---|
| 顶部 | 搜索框 + 标签筛选(类型/项目/场景/情绪) | 输入即筛,支持中文模糊搜 |
| 主体 | 瀑布流缩略图,悬停播放 | 单击预览,双击加入当前项目 |
| 右侧 | 属性:来源、许可证、用过几次 | 「用过几次」决定要不要放进常用 |
页面 5 · 发布队列
| 区域 | 放什么 | 交互 |
|---|---|---|
| 日历视图 | 按日期排的待发内容 | 拖到另一天即改期 |
| 列表视图 | 状态机五态 + 各平台勾选 | 点状态推进;未填文案不允许推进到「已排期」 |
| 导出 | 一键导出竖/横/方三版 + 各平台文案 | 生成到固定目录,文件名带日期与平台 |
| 回填 | 发布 48 小时后填三个指标 | 未填的条目在列表里标黄 |
Streamlit 骨架:五个页面 60 行就能跑起来
# app.py —— pip install streamlit pandas sqlite-utils
import streamlit as st, sqlite3, pandas as pd
st.set_page_config(page_title="内容产线", layout="wide")
con = sqlite3.connect("data.db", check_same_thread=False)
def q(sql, params=()):
return pd.read_sql(sql, con, params=params)
tab1, tab2, tab3, tab4, tab5 = st.tabs(["选题", "剧本", "分镜", "素材", "发布"])
with tab1:
c = st.columns(4)
c[0].metric("待做", len(q("select * from projects where status='idea'")))
c[1].metric("在做", len(q("select * from projects where status in ('script','shot')")))
c[2].metric("本周已发", len(q("select * from projects where status='published'")))
df = q("select id,title,hook,status from projects order by id desc")
st.data_editor(df, num_rows="dynamic", key="proj") # 直接改,回写见下
with tab3:
pid = st.selectbox("项目", q("select id,title from projects")["title"])
shots = q("select seq,dur,camera,desc,status from shots where project_id=?", (pid,))
st.data_editor(shots, num_rows="dynamic", key="shots")
sel = st.multiselect("选择要生成的镜头", shots["seq"].tolist())
if st.button(f"批量生成 {len(sel)} 条(预计 {len(sel)*2.5:.0f} 元)"):
st.progress(0, text="排队中…") # 实际应丢到后台任务
① 每次交互整页重跑——所以把耗时操作放后台线程或外部队列,否则点一个按钮整页等 30 秒;
② 状态要靠
st.session_state 存——直接改 DataFrame 不会持久化,必须显式回写数据库。
23.12 交互怎么做:七条模式,照着抄就行
| 模式 | 怎么实现 | 不这么做会怎样 |
|---|---|---|
| ① 按钮随状态变 | 一个镜头只有四个态:待生成/生成中/成功/失败。每态只显示一个主按钮 | 一排五个按钮,每次都要想点哪个 |
| ② 批量走队列 | 前端只提交「要生成哪些」,后端排队,前端轮询进度 | 点一下同步等 60 秒,页面卡死还可能超时白跑 |
| ③ 乐观更新 | 点完立刻变「生成中」,不等接口返回 | 点了没反应,用户重复点击,重复扣费 |
| ④ 断点续跑 | 每条任务状态落库,失败单独重试,不重跑全部 | 一条失败,整批重来,钱白烧 |
| ⑤ 快捷键 | J/K 上下条、空格 预览、Ctrl+Enter 保存并下一条 | 一小时点 300 次鼠标,手腕先废 |
| ⑥ 三态齐全 | 空(给指引)/ 加载(给进度与预计时间)/ 失败(给原因与重试按钮) | 白屏或转圈,你不知道它在干嘛 |
| ⑦ 自动保存 | 失焦保存 + 每 30 秒快照 + 保留最近 20 版 | 断电一次,写了两小时的剧本没了 |
批量生成的最小实现(并发 2、重试 3 次、指数退避):
import time, asyncio
async def gen_one(shot, sem):
async with sem: # 并发闸门:一次最多 2 个
for attempt in range(3):
try:
url = await call_api(shot["prompt"])
db.update("shots", shot["id"], status="ok", asset=url)
return url
except RateLimit:
await asyncio.sleep(2 ** attempt) # 2s, 4s, 8s
except Exception as e:
db.update("shots", shot["id"], status="fail", err=str(e))
return None
db.update("shots", shot["id"], status="fail", err="retry exhausted")
async def gen_batch(shots):
sem = asyncio.Semaphore(2)
await asyncio.gather(*[gen_one(s, sem) for s in shots])
# 关键三点:
# 1) 先全部写 status=queued 再开跑,刷新页面能接着看
# 2) 单条失败不影响其他条(gather 内部各自 catch)
# 3) 并发不要超过 3,多数 API 会限流,反而更慢
23.13 七天冲刺:每天一个能用的东西
不要「先设计完再做」,那样两周后你还在画图。每天结束时必须有一个能打开、能点、能用的东西—— 哪怕很丑。
| 天 | 今天只做这一件事 | 产出物(文件/命令) | 当天验收 |
|---|---|---|---|
| D1 | 建三张表 + 灌 10 条真实数据 | data.db,init.sql | 能查出「我现在有几条在做」 |
| D2 | 选题页(列表 + 新增 + 改状态) | app.py tab1 | 10 秒内记下一条新选题 |
| D3 | 剧本页(编辑 + 自动保存 + 时长估算) | tab2 | 写 300 字,刷新后还在 |
| D4 | 分镜表(表格编辑 + 存库) | tab3 | 从剧本拆出 8 条分镜并存下 |
| D5 | 接一个生成 API + 单条跑通 | gen.py | 点一次,拿到一张图并回填 |
| D6 | 批量队列 + 断点续跑 | 队列代码 | 跑 5 条,中断后能续 |
| D7 | 素材库 + 发布队列(可先只读) | tab4 / tab5 | 能找到素材;能看到本周排期 |
能 → 继续用它,边用边补;不能 → 找出卡住的那一步,下周只补那一步,不要重做整个系统。
order 字段,
因为素材文件名里带镜号——改了镜号,所有素材的对应关系就全乱了。这个坑几乎所有做分镜工具的人都踩过。
23.14 真实产能与成本:一条 3 分钟成片
| 环节 | 工时(第 1 条) | 工时(第 5 条后) | 怎么降下来的 |
|---|---|---|---|
| 选题 + 资料 | 40 分钟 | 15 分钟 | 选题库提前囤 30 条 |
| 剧本 | 90 分钟 | 45 分钟 | 固定结构模板(钩子-冲突-转折-收束) |
| 分镜 | 70 分钟 | 25 分钟 | 镜头模板库 + 表格化 |
| 图像生成 | 60 分钟 | 20 分钟 | 批量提交、首帧提示词复用 |
| 视频生成 | 90 分钟 | 40 分钟 | 夜间批量跑,失败重试自动化 |
| 配音 | 25 分钟 | 10 分钟 | 固定音色,只重录问题句 |
| 剪辑合成 | 120 分钟 | 50 分钟 | 工程模板 + 素材按镜号自动排序 |
| 发布分发 | 30 分钟 | 15 分钟 | 状态机 + 一键多尺寸导出 |
| 合计 | 约 8.5 小时 | 约 3.7 小时 | — |
这个数字意味着什么:按每天 4 小时有效工作时间算,成熟后约 1 天出 1 条, 但实际要考虑选题枯竭、返工、平台沟通,真实稳态是每周 2–3 条。 如果谁告诉你「一个人日更三条精品」,那是没做过。
| 成本项 | 量级 | 备注 |
|---|---|---|
| 语言模型 | 50–200 元/月 | 剧本、分镜、文案;用按量计费更省 |
| 图像 / 视频生成 | 200–800 元/月 | 最大的变动成本,按条数算,注意失败重试也在烧 |
| 配音 | 0–100 元/月 | 本地 TTS 可接近零成本 |
| 剪辑软件 | 0–200 元/月 | 免费版通常够用 |
| 存储与备份 | 20–50 元/月 | 别省这一项,素材丢了等于几个月白干 |
| 合计 | 300–1300 元/月 | 按每月 10 条算,单条边际成本 30–130 元 |
23.15 90 天日程
| 周次 | 这一周只做一件事 | 周末该有的东西 |
|---|---|---|
| 第 1–2 周 | 写 30 条图文,测 10 个话题 | 一份「哪 3 个话题有人追问」的清单 |
| 第 3 周 | 搭目录 + 三张表(哪怕先在 Excel 里) | 能往里填数据的最小系统 |
| 第 4–5 周 | 做第一条 60 秒成片,记录每段耗时 | 一条成片 + 一张耗时表 |
| 第 6 周 | 补资产:人物圣经、镜头模板、片头模板 | 第二条能复用第一条的 60% |
| 第 7–8 周 | 做第 2、3 条,目标工时降 40% | 单条 ≤ 5 小时 |
| 第 9–10 周 | 定发布节奏,建立发布队列 | 连续 2 周不断更 |
| 第 11 周 | 加一条自动化(批量生成或素材入库) | 每周省下 ≥ 2 小时 |
| 第 12 周 | 复盘:三个指标、成本、产能 | 一份「要不要继续、往哪调」的结论 |
能 → 加大投入(更多选题、更好的工具);不能 → 改形态(换赛道或换变现方式),而不是加时长。 一人公司最贵的错误,是用「更努力」去弥补「方向不对」。
output_1.mp4、final_final_v3.mp4,做第二条时找不到第一条里那段满意的空镜,只好重新生成。23.16 如果这是你的岗位:AIGC 应用工程师
第一位是内容创作者:作品很好,会用四五个工具,但你问她「换一批角色,怎么保证画风不跑」, 她说「多试几次,选好的」。
第二位是算法工程师:能讲清扩散模型的采样过程,但你问他「下个月要出 40 条片子,排得出来吗」, 他说「这个我没算过」。
第三位拿出一张表:一条 3 分钟片子,从选题到成片 6 个环节,每个环节用什么工具、耗时多少、返工率多少、 单条成本多少;另附一份「人物一致性」的三层方案,说明哪一层失效时用哪一层兜底。
这个岗位的位置很微妙,夹在中间:往左是创作者,往右是算法。它的价值恰恰来自「两边都不专精,但能把它接起来」。
| 角色 | 他产出什么 | 他的天花板 |
|---|---|---|
| 内容创作者 | 单条好作品 | 产量受个人状态限制,方法不可复制 |
| 算法工程师 | 更好的模型 / 更好的生成质量 | 不关心排产、成本、验收标准 |
| AIGC 应用工程师 | 一条能稳定出片的产线:可复制、可估成本、可验收 | 不追求单条极致,追求整体可控 |
四项能力:前三项决定你能干,第四项决定别人敢用
- 知道每类工具(图/视频/配音/剪辑)的强项与失效边界,能按预算组三档方案
- 知道哪些环节该自动、哪些必须人工卡点
- 达标:给定预算和产能目标,能在半天内出一份工具组合方案
- 人物一致:参考图 + LoRA / 角色卡 + 固定提示词前缀
- 风格一致:固定种子 + 风格参考 + 负面词
- 达标:同一角色出 20 张图,肉眼判断是同一个人
- 能算清一条成片的工时拆解与单条成本
- 知道瓶颈在审核速度而非生成速度
- 达标:能预测「下周要出 10 条,需不需要加班」
- 能写出可判定的验收标准(不是「好看」,而是「口型对齐、无多指、字幕不超两行」)
- 知道哪些缺陷必须重做、哪些可以后期修
- 达标:别人拿着你的标准,能独立判断一条片子能不能发
一天的活,长什么样
上午:定稿与拆解
把今天要做的两条片子的剧本定稿,拆成分镜表——每个镜头写清:画面、时长、景别、是否需要人物出镜、用哪个工具。
这一步不做完就开生成,等于让后面的返工翻倍。
中午:批量生成
按分镜表批量跑图/跑视频,每个镜头一次出 3–4 个候选。同时跑,不要一个个等。
等待期间做配音和字幕——这是唯一能并行的事。
下午:筛选与修补
从候选里挑,标记「可用 / 需修 / 重做」。需修的(手部、口型、文字)优先用后期补,不轻易重生成。
这一步最耗时,也最需要标准——没有标准就会反复推翻自己。
傍晚:合成与归档
剪辑、配乐、字幕,导出。然后把这次用到的提示词、种子、参数、参考图全部归档——下一条片子要用。
不归档,等于每条片子都从零开始。
| 级别 | 能独立做到什么 | 典型卡点 |
|---|---|---|
| L1 | 用现成工具做出单条可发的片子 | 换角色、换风格就崩,返工率高 |
| L2 | 能建产线:分镜表、素材库、命名规范、验收标准 | 产能到瓶颈,扩不了 |
| L3 | 能设计多线并行 + 外包协作 + 成本模型,管理一个小团队 | —— |
「这条片子按现在的标准能发,但它有三个地方会在投放后被挑出来,我建议先修第 2 个。」
能预判缺陷的人,比能生成好看画面的人稀缺得多。
本 章 小 结
一人公司的内容产线,本质是用系统替代同事:流程替代分工,资产库替代经验,自动化替代体力。
所以它的设计原则不是「功能齐全」,而是三条——一次投入多次复用、状态外置能中断能续、批量而非流水。
而整个 0→1 的顺序不能颠倒:先验证有人要(阶段 0)→ 再跑通一条(阶段 1)→ 再降成本(阶段 2)→ 再谈节奏(阶段 3)→ 最后才变现(阶段 4)。
跳过任何一步,后面的努力都会打折。
行动建议:今天只做一件事——写下 10 个你比身边人懂得多的话题,各写一个一句话钩子。
这份清单就是你第一版「选题库」,也是整个系统的起点。别先打开任何工具。
向量模型完全指南:RAG 的上限,在这一层就定死了
Embedding Model 选型 / 评测 / 微调 / 部署
- 三种向量模型:双塔(召回)、交叉编码器(精排)、多向量(ColBERT)
- 五维选型法:语言领域、长度、部署、维度成本、许可
- 如何用 200 条真实查询实测:Recall@5 / MRR / nDCG
- Matryoshka 降维、池化方式、指令前缀这些参数的坑
第 9 章讲了 RAG 的流程,第 10 章讲了检索的机制,但有一个部件一直只是一笔带过:用哪个向量模型。 而事实是:RAG 系统里,换一个向量模型带来的效果提升,通常大于换一个更大的生成模型—— 因为检索错了,后面的模型再强也只能基于错误材料作答。
24.1 先分清三种「向量模型」
「向量模型」这个词被用得很乱。实际上有三种完全不同的东西,混用会导致架构选错。
| 类型 | 结构 | 速度 | 精度 | 用在哪一步 |
|---|---|---|---|---|
| 双塔 / Bi-Encoder | 查询和文档分别编码成两个向量,最后算距离 | 极快(文档向量可离线预算) | 中 | 召回阶段(从百万级里筛几十条) |
| 交叉编码器 / Cross-Encoder | 查询和文档拼在一起送进模型,输出一个相关性分数 | 慢(无法预计算,每条都要跑一次) | 高 | 重排阶段(对几十条候选精判) |
| 多向量 / ColBERT | 不只输出一个向量,而是每个 token 一个向量,用 MaxSim 做词级匹配 | 中(存储量大几十倍) | 较高 | 召回阶段的高精度替代方案 |
24.2 主流模型全景(2026 年 10 月数据)
下表汇总的是当前主流可选模型。需要注意:不同来源的 MTEB 分数不可直接横比(评测集版本、任务子集、是否用指令前缀都不同)。 这张表的用途是缩小候选范围,不是做最终决策。
| 模型 | 维度 | 最大长度 | 开源 | 中文 | 许可 / 价格 | 适合场景 |
|---|---|---|---|---|---|---|
| BGE-M3 BAAI 智源 |
1024 | 8192 | ✅ | 强 | MIT / 免费 | 中文 RAG 首选,稠密+稀疏+多向量三合一,100+ 语言 |
| Qwen3-Embedding-8B 阿里 |
7168 可配 | 32000 | ✅ | 极强 | Apache 2.0 / 免费 | 追求极致精度;需 A10 级以上显卡 |
| Qwen3-Embedding-0.6B | 1024 | 32000 | ✅ | 极强 | Apache 2.0 | 轻量本地部署,性价比高 |
| bge-large-zh-v1.5 | 1024 | 512 | ✅ | 最强(短文本) | MIT | 纯中文短文本相似度;长度受限是硬伤 |
| gte-Qwen2-7B-instruct 阿里 |
3584 | 32768 | ✅ | 强 | Apache 2.0 | 超长文档检索、整篇报告语义匹配 |
| NV-Embed-v2 NVIDIA |
4096 | 32768 | ✅ | 强 | 开源权重 | 英文任务专项优化,榜单表现靠前 |
| Harrier-OSS-v1 Microsoft |
— | — | ✅ | 中 | MIT | 94 语言多语言检索,开源榜前列 |
| BCEmbedding 网易有道 |
1024 | 512 | ✅ | 强 | Apache 2.0 | 中英双语 RAG 专项优化,跨语言对齐好 |
| m3e-base | 768 | 512 | ✅ | 良 | MIT | 老牌轻量方案,适合快速验证 |
| text-embedding-3-large OpenAI |
3072 可裁剪 | 8191 | ❌ | 中 | $0.13 / 1M tokens | 不想运维、生态成熟;支持降维到 256 省钱 |
| text-embedding-3-small | 1536 | 8191 | ❌ | 中 | $0.02 / 1M tokens | 成本敏感、中文要求不极致的场景 |
| Gemini Embedding 2 |
3072 | 8192 | ❌ | 中 | 按量计费 | 高精度语义匹配,闭源榜前列 |
| Cohere embed-v4 | 1024 | 128000 | ❌ | 强 | $0.10 / 1M | 超长上下文(128K),企业长文档 |
| Voyage 4 Large | 2048 | 32000 | ❌ | 强 | $0.50 / 1M | 检索特化,英文检索榜单常年第一梯队 |
| Jina Embeddings v3 / v5 Jina AI |
1024 可裁剪 | 8192 | 部分 | 强 | $0.018 / 1M | 长文本、多语言、Matryoshka 降维;有开源版 |
24.3 选型的五个维度:按优先级排
① 语言与领域匹配度(权重最高)
中文场景用英文榜第一的模型,效果会断崖式下跌。同理,医疗、法律、代码这些垂直领域,通用模型的表现会明显低于预期。先按语言筛,再按领域筛。中文候选就那五六个:BGE-M3、Qwen3-Embedding、bge-zh、BCE、gte-Qwen2。
② 最大长度是否够用
注意这是模型能吃多长,不是你该喂多长。BGE-M3 支持 8192,但你切块仍然建议 300~800 token——因为块越长,语义越杂,检索精度反而下降。只有「整篇文档匹配」的场景(如合同比对)才需要长窗口模型。
③ 部署方式:API 还是自建
API 省事但有四个隐性成本:数据出境合规、调用延迟、按量计费随规模线性上涨、模型版本被供应商单方面升级。自建要算 GPU 成本,但百万级文档的一次性编码成本通常低于一年的 API 费用。日调用超过 10 万次的场景,自建一般更划算。
④ 维度与存储成本
向量维度直接决定存储和检索成本。100 万条 × 1024 维 × float32 = 约 3.9 GB;3072 维则约 11.7 GB。用 float16 可减半,用 int8 量化可再减到 1/4,但会损失 1~3% 召回。维度不是越高越好,够用即可。
⑤ 许可与商用限制
MIT / Apache 2.0 可商用;有些模型是「开源权重但非商用」或「研究用途」。企业项目上线前必须确认许可证。这一条经常被忽略,但它是法律风险,不是技术选择。
24.4 参数详解:这些数字到底影响什么
(套娃表示)
为这个句子生成表示用于检索相关文章:。加了提升几个点,不加也能跑但效果差。不对称检索(短查询找长文档)尤其依赖这个。24.5 中文场景的四个实测结论
以下结论来自多方评测的交叉验证,但请注意它们只代表「通用中文」,你的垂直领域仍需自测。
它的三合一输出(稠密 + 稀疏 + 多向量)让混合检索变得极简——一个模型出三种表示,不用再单独维护 BM25 索引。对「用户问一句话,文档是一页纸」这种最常见的 RAG 形态,综合性价比最高。
实测中,GTE-Qwen2-7B 在长文档命中率上比 BGE-large-zh 高出约 20 个百分点(92% vs 71%)。原因很直接:7B 参数能理解整段的论证结构,而 1 亿参数的小模型只能抓局部关键词。长文档场景,参数量确实有用。
0.6B 的 Qwen3-Embedding 在多数中文检索任务上已经接近 8B 版本,而速度快 10 倍、显存只要 1/12。除非你的评测明确显示 8B 有显著优势,否则从 0.6B 起步是更理性的选择。
text-embedding-3-large 单次调用很便宜,但如果你有 500 万条文档、且每天增量更新 1 万条,一年下来 API 费用可能超过一张 4090。更关键的是数据出境与版本漂移——供应商升级模型后,旧向量和新查询就不在同一空间了,必须全量重建。
24.6 怎么用自己的数据选出最优模型
这是本节最重要的一节。方法不复杂,但 90% 的团队跳过了它,然后靠猜。
第一步:造 200 条评测查询
- 从真实用户提问里抽样,不要自己编。没有线上数据就用客服记录、群聊、工单。
- 每条查询标注「正确答案在哪些文档块里」(相关文档 ID 列表,可以多个)。
- 分布建议:常见问题 60%、边界情况 25%、已知难点 15%。
- 200 条足够看出 5 个百分点以上的差异;要测 2 个点的差异需要 1000 条以上。
第二步:跑三个指标
| 指标 | 含义 | 怎么算 | 看什么 |
|---|---|---|---|
| Recall@K | 正确答案有没有出现在前 K 条里 | 命中查询数 / 总查询数 | 召回能力,最该先看这个 |
| MRR | 第一条正确结果排在第几位 | 平均 (1 / 首次命中排名) | 排序质量,反映「用户要不要往下翻」 |
| nDCG@K | 考虑排序位置与多相关文档的加权得分 | 折损累计增益 / 理想增益 | 多答案场景(一份问题对应多段材料) |
第三步:控制变量做对比
# 伪代码:一次跑完五个候选模型,输出同一张表
models = [
"BAAI/bge-m3",
"Qwen/Qwen3-Embedding-0.6B",
"BAAI/bge-large-zh-v1.5",
"maidalun1020/bce-embedding-base_v1",
"text-embedding-3-large", # API
]
chunks = load_chunks() # 同一份切块,固定不变
queries = load_eval_set() # 200 条,带标准答案
for m in models:
vecs = embed(chunks, model=m, normalize=True)
index = build_index(vecs, metric="ip")
hits = [index.search(embed(q, model=m), k=10) for q in queries]
print(m, recall_at(hits, 5), mrr(hits), ndcg_at(hits, 10))
# 关键:切块策略、索引类型、K 值全部固定
# 只变模型这一个变量,否则结论无效
第四步:看失败样本,而不只看总分
两个模型 Recall@5 都是 0.82,但失败模式可能完全不同:A 模型败在专有名词,B 模型败在长句。 如果 B 的失败模式恰好是你能用混合检索补上的,那 B 才是更好的选择。总分相同看失败分布,这是选型的最后一步。
24.7 什么时候该微调向量模型
通用模型在你领域上表现不佳时,有两个选择:换更大的模型,或者微调。判断依据是—— 模型是否「理解你的术语」,而不是「是否足够聪明」。
24.8 部署与性能:几个容易踩的坑
100 万条 × 1024 维:
· float32 = 1024×4×1e6 ≈ 3.9 GB
· float16 = 约 2 GB
· int8 = 约 1 GB
再加 HNSW 图结构(约为向量的 1~1.5 倍)。所以「1024 维 100 万条」实际要按 6~8 GB 内存规划,不是 4 GB。
编码要批量(batch 32~128),单条调用会把 GPU 利用率浪费掉 90%。 长文本要先截断到模型最大长度,否则会被静默截断——不报错,但后半段内容丢了,这是最隐蔽的 bug。
索引用的模型和查询用的模型必须完全同版本、同参数。换了模型必须全量重建索引,不能增量更新——两批向量不在同一空间,检索结果等于随机。
中英混排文档(如技术手册)要用多语言模型。用纯中文模型编码英文段落,效果会明显下降,而且不会报错——你只会觉得「检索不太准」。
① 先用 BGE-M3 跑通,别纠结;② 从真实问题里抽 200 条建评测集;③ 在同一份切块上对比 3~5 个模型,记录 Recall@5 与 MRR; ④ 低于 0.7 先改切块与混合检索,不要急着微调;⑤ 上线后固定模型版本,换版本必须全量重建。
本 章 小 结
这一章回答的是 RAG 里最容易被跳过的一步:向量模型怎么选、怎么验证选对了。RAG 的上限在这一层就定死了——检索错了,后面模型再强也只能基于错误材料作答。
结论可以先记:中文 RAG 默认 BGE-M3,追求极致上 Qwen3-Embedding-8B,不想自建用 text-embedding-3-large。但四个都可能不是你的最优解,必须自测。
向量数据库与上下文窗口:外部记忆怎么接进工作台
选型 / 与窗口的四种关联 / 工程模式
- 向量库和上下文窗口是什么关系:一个是档案室,一个是办公桌
- 四条关联:容量、成本、注意力、时效——每一条都决定架构
- 主流向量库的七个流派与各自边界(Milvus / Qdrant / pgvector / Pinecone / Chroma / FAISS / 搜索引擎扩展)
- 七维选型法与决策树:从数据规模倒推方案
- 四种把「检索结果」接进「窗口」的工程模式
上一章讲了「用哪个模型把文本变成向量」,这一章讲「这些向量存哪里、怎么取、取出来怎么塞进模型的上下文」。 第三件事最容易被忽略,但它直接决定成本和效果——因为上下文窗口是按 token 收费的,而向量库只收存储费。
25.1 先建立正确的类比:档案室与办公桌
25.2 与上下文窗口的四条关联:每一条都决定架构
很多人把「向量库」和「上下文窗口」当成两件不相干的事,各调各的。实际上它们的关系非常紧密, 下面四条,任何一条搞错都会导致成本失控或效果崩盘。
· 全塞窗口:每次请求输入 500 万 token。按中等价位 2 元/百万 token 算,一次请求 10 元。一天 1000 次 = 1 万元/天。
· 检索后塞 5 条:每次 2500 token,一次 0.005 元。一天 1000 次 = 5 元/天。加上向量库存储费(几 GB,每月几十元)。
25.3 那为什么还需要大窗口:两者的分工
讲到这里容易走极端——「有向量库就不需要大窗口」。不对。两者的分工取决于任务形态。
| 任务形态 | 该用什么 | 为什么 |
|---|---|---|
| 查一个具体事实 「退款政策第三条是什么」 | 检索 + 短上下文 | 答案在局部,检索精准命中即可,塞满窗口只会引入噪音 |
| 跨多份材料做对比 「这三份合同的违约条款差异」 | 检索(多路)+ 中长上下文 | 需要同时看到多份材料,但每份只需关键段落 |
| 通读一份长文档 「总结这份 80 页报告」 | 长窗口直塞,或分层摘要 | 需要全局结构,检索反而会破坏上下文连贯性 |
| 整库问答 「我们所有产品文档里提到过哪些限制」 | 检索 + 多轮 / 分层汇总 | 答案分散在全库,单次检索必然漏,需要多次召回再归纳 |
| 代码库理解 「这个函数被哪些地方调用」 | 符号索引 + 检索 | 这不是语义相似度问题,是结构关系问题,要用 AST / 调用图,不是向量 |
设知识库总量为 T token,单次任务真正需要的信息量为 R token。
· R / T > 0.6 → 直接塞窗口(检索的收益抵不过出错风险)
· R / T < 0.1 → 必须检索(塞进去纯属浪费)
· 中间地带 → 分层:先检索定位到章节,再把整章塞进去(兼顾精度与连贯)
25.4 向量数据库有哪些:七个流派
「向量数据库」不是一个品类,是七种完全不同的东西被同一个名字盖住了。搞混它们,选型必然出错。
| 流派 | 代表 | 部署 | 适用规模 | 特点与边界 |
|---|---|---|---|---|
| ① 专用向量库 为向量而生 |
Milvus | 自建 / 云 | 千万~百亿 | 分布式架构,支持 GPU 索引;功能最全但组件多(etcd、MinIO、Pulsar),运维重 |
| Qdrant | 自建 / 云 | 十万~亿级 | Rust 实现,单机性能强;元数据过滤做得最好,支持复杂的 payload 条件;部署比 Milvus 轻 | |
| ② 全托管服务 不开运维 |
Pinecone | 纯 SaaS | 十万~亿级 | 零运维,API 简单;数据必须出境,成本随规模线性上升,不适合合规敏感场景 |
| Zilliz Cloud | SaaS | 千万~百亿 | Milvus 的商业托管版,国内可用;省掉运维但仍是按量计费 | |
| ③ 传统数据库扩展 最容易被低估 |
pgvector | 随 PG 部署 | 万~千万 | 如果你已经有 Postgres,这是默认答案。支持事务、JOIN、行级权限,元数据过滤直接用 SQL;千万级以上性能开始吃力 |
| Elasticsearch / OpenSearch | 自建 / 云 | 百万~亿级 | 原生支持 BM25 + 向量,混合检索最省事;资源占用大,向量只是它的附加能力 | |
| ④ 嵌入式 / 库 不是服务,是依赖 |
FAISS | 进程内 | 任意(单机) | Meta 出的算法库,只有索引,没有存储、没有过滤、没有并发;适合离线批处理和研究 |
| LanceDB / Chroma | 嵌入式 | 万~百万 | 像 SQLite 一样用,零运维;Chroma 上手最快,适合原型;LanceDB 支持版本化与多模态 | |
| ⑤ 缓存型 | Redis(RediSearch) | 自建 / 云 | 万~千万 | 向量 + 内存级速度,适合「热数据 + 低延迟」;持久化与成本要权衡 |
| ⑥ 文档型扩展 | MongoDB Atlas | 云 | 万~千万 | 已有 Mongo 生态时顺手;向量检索能力相对基础 |
| ⑦ 搜索引擎型 | Vespa | 自建 / 云 | 亿级以上 | 检索能力最强(排序表达式、实时更新、多阶段排序),学习曲线最陡,适合搜索团队 |
25.5 怎么选:七个维度与决策树
① 数据规模(先看这个,它直接排除 80% 的选项)
< 10 万条:pgvector、Chroma、LanceDB 都够,甚至可以用内存 + FAISS。
10 万~1000 万:Qdrant、pgvector(加索引)、Elasticsearch。
> 1000 万:Milvus、Vespa、Zilliz Cloud,或分片方案。
② 元数据过滤能力(RAG 最容易被忽略的一项)
真实业务里,检索几乎永远带条件:「只查这个部门的」「只要 2025 年之后的」「排除无权限的」。 如果数据库不支持「先过滤再检索」,你只能检索完再筛——top-k 会被无关结果占满,召回率断崖下跌。 Qdrant 的 payload filter 和 pgvector 的 SQL WHERE 在这块最强。
③ 混合检索支持
能不能同时做向量和关键词(BM25/稀疏向量)检索?Elasticsearch、Vespa、Milvus(2.4+)、Qdrant(1.10+)都支持。 如果数据库不支持,你就要自己维护两套索引再融合,工程量翻倍。
④ 部署与运维成本
Milvus 分布式版本要维护 etcd、对象存储、消息队列三个依赖,没有专职运维不要碰集群版。 pgvector 的优势在这里:你已经有的 Postgres,不用多养一个系统。托管服务(Pinecone / Zilliz)省运维,但按量计费且数据在别人那里。
⑤ 一致性要求
向量库大多是「最终一致」的——写入后要过一会儿才能检索到。如果你的场景要求「刚上传的文档立刻能查到」, 要确认目标库的实时性;pgvector 在这点上最省心(和业务数据同一个事务)。
⑥ 多租户与权限
SaaS 场景必须做隔离。三种方式:物理隔离(每租户一个 collection)、逻辑隔离(元数据过滤)、行级权限(pgvector + RLS)。 逻辑隔离最省资源但最容易出泄露事故——一次 where 条件写漏,就是跨租户数据泄露。
⑦ 成本模型
自建:服务器 + 人力 + 时间。托管:按存储量 + 请求量计费,规模小时便宜、规模大时贵。 算三年 TCO,不要只算第一个月。很多团队因为「托管免费额度」选了 SaaS,一年后账单翻十倍。
25.6 四种把检索结果接进窗口的工程模式
选好数据库只是第一步。更难的是:检索出来的东西,怎么组织进那几千 token 的窗口里。 下面四种模式,从简单到复杂,按需选用。
| 模式 | 做法 | 适合 | 局限 |
|---|---|---|---|
| ① 朴素拼接 | 检索 top-5,按顺序拼进提示词,加编号 | 单轮问答、知识库查询 | 多轮对话里会重复检索、重复塞入,token 快速膨胀 |
| ② 分层记忆 | 窗口里只放「摘要 + 关键原文片段」,完整内容留在库里按需展开 | 长文档、多轮对话 | 摘要会丢细节,需要设计「展开」的触发机制 |
| ③ 会话内缓存 | 同一会话里检索过的片段缓存起来,下一轮直接复用,不重复检索 | 连续追问(「那第二条呢」) | 话题切换时要主动失效,否则会串味 |
| ④ 滑动窗口 + 外置状态 | 近 N 轮保留原文,更早的压缩成要点写进「会话状态」;检索结果按需重新拉取 | 长会话 Agent | 实现复杂,需要外部存储 + 摘要模型 |
# 模式②③ 的组合示意:分层 + 缓存
def build_context(query, session):
# 1. 先看会话里有没有检索过的相关片段(缓存命中)
cached = session.cache.search(query, threshold=0.85)
if cached:
fragments = cached
else:
# 2. 没有才去向量库检索(先过滤后检索)
fragments = vector_db.search(
query_vec=embed(query),
filter={"tenant": session.tenant, "dept": session.dept},
top_k=20,
)
fragments = rerank(query, fragments)[:5]
session.cache.add(query, fragments)
# 3. 按预算裁剪:不超过窗口的 45%
budget = int(WINDOW * 0.45)
fragments = trim_to_budget(fragments, budget)
# 4. 历史对话:近 3 轮原文,更早的用摘要
history = session.recent(3) + session.summary_of_older()
return assemble(system, fragments, history, query, reserve_output=0.2)
25.7 五个必须避开的坑
想要事务、外键、复杂更新?向量库不擅长这些。正确做法是「业务数据在 PG,向量索引在向量库」,用 ID 关联;或者直接用 pgvector,让两者合一。
取 top-50 再筛掉无权限的,可能只剩 3 条有效。正确做法是把过滤条件下推给数据库,让它只在候选集内做相似度计算。这是 Qdrant 与 pgvector 的核心优势。
文档改了、索引没更新,模型读到旧内容还理直气壮。要有增量更新 + 版本号 + 定期一致性校验三件套。
新旧向量不在同一空间,相似度计算毫无意义,但系统不会报错——你只会觉得「检索变差了」。换模型必须全量重建。
tenant_id,就是跨客户数据泄露。
更安全的做法是物理隔离(每租户独立 collection)或数据库行级安全策略(pgvector + RLS),让隔离发生在数据库层而不是应用层。
① 先算清「知识库总量 T」和「单次任务需要量 R」,用它决定「直塞还是检索」;
② 数据量小于 10 万且有 Postgres,直接上 pgvector,别引入新系统;
③ 无论选哪个,先确认三件事:能否先过滤后检索、权限能否隔离、换模型能否全量重建;
④ 检索回窗口的片段控制在 3~5 条、占窗口 45% 以内,多了反而是负收益。
本 章 小 结
向量库是档案室,上下文窗口是办公桌,检索是那个跑腿的人。模型永远只看到桌上的几页纸,看不到档案室。
两者的四条关联——容量差四到六个数量级、成本差上千倍、注意力会被稀释、时效性一个活一个死——共同决定了:只要知识库会增长,就必须有外部存储与检索;只有小库、短任务才适合直塞。
选型顺序:先按数据规模分层,再用三条硬性检查兜底(能否先过滤后检索、权限能否隔离、换模型能否全量重建)。规模小于 10 万且有 Postgres,pgvector 就是默认答案——不要为了「专业」而引入新系统。
大模型的记忆:它其实什么都不记得
无状态本质 / 四种外挂 / 与上下文的关系 / 工程实现
- 模型本身没有记忆:推理时权重冻结,关掉会话一切归零
- 四种外挂记忆:上下文、向量库、结构化存储、提示词/微调
- 记忆与上下文的关系:一个是硬盘,一个是内存;一个是档案柜,一个是白板
- 写入、读取、遗忘三个动作的设计要点
- 记忆与 RAG 的区别:一个是「你的」,一个是「大家的」
- 一个最小可用的记忆系统怎么建
这是全书最反直觉的一章。所有人都在问「怎么让模型记住」,但真相是—— 它从来就没有「记住」这个动作。你以为的记忆,全是你的应用在外面替它记的。 搞清楚这一点,你才能设计出真正可用的记忆系统,而不是把聊天记录一股脑塞进数据库。
26.1 先破除误解:模型是无状态的
输出 = 模型(输入),没有隐藏的内部变量。推论二:记忆系统的复杂度,全部来自「怎么存、什么时候取、取多少」这三个工程问题,和模型能力无关。换再强的模型,这三个问题照样要自己解决。
26.2 记忆是怎么被「造」出来的:四种外挂
既然模型没有记忆,那市面上那些「越用越懂你」的产品是怎么做的?答案是外挂。 一共四种,各有明确的适用边界。
| 类型 | 存什么 | 生命周期 | 怎么取 | 什么时候用它 |
|---|---|---|---|---|
| ① 上下文 工作记忆 |
本轮对话、工具返回、中间结论 | 一次会话 | 自动,无需检索 | 永远在用。它是唯一的「现场」 |
| ② 向量库 语义记忆 |
历史结论、聊过的话题、做过的任务 | 持久 | 按语义相似度召回 | 用户问「上次说的那个方案」,或有大量历史交互需要关联 |
| ③ 结构化存储 事实记忆 |
用户画像、偏好、身份、约束(「我不吃辣」「我是财务」) | 持久,可更新 | 按用户 ID 精确查 | 最该优先做的。少量高价值事实,比海量对话记录有用得多 |
| ④ 提示词/微调 程序记忆 |
行为规范、口吻、固定流程 | 版本化管理 | 每次都带,不检索 | 稳定的行为要求。不要用它存「会变的事实」 |
26.3 记忆与上下文的关系:硬盘与内存
这是本章的核心。很多人把「记忆」和「上下文」混为一谈,导致架构设计错位。 用计算机的类比,两者的分工非常清晰:
| 维度 | 上下文窗口 = 内存 / 白板 | 记忆系统 = 硬盘 / 档案柜 |
|---|---|---|
| 容量 | K token 级(几万字) | GB/TB 级(几乎无限) |
| 速度 | 极快,但每次都要重新「读入」(付 token 费) | 检索有延迟(几十到几百毫秒),但一次只取少量 |
| 生命周期 | 一次请求 / 一次会话,结束即消失 | 持久,直到主动删除 |
| 谁来决定内容 | 你的代码(拼装策略) | 写入策略 + 检索策略 |
| 坏了会怎样 | 答非所问、忘记前文 | 想起错的事、串到别人的记忆 |
26.4 写入:什么时候记、记什么
「把对话全存下来」是最省事也最糟糕的做法。它会导致三个后果:噪音淹没信号、检索变慢、隐私风险扩大。
| 策略 | 做法 | 优点 | 缺点 |
|---|---|---|---|
| 全量落库 | 每轮对话原文都写入向量库 | 实现最简单,不丢信息 | 噪音极大,「嗯」「好的」也会被召回 |
| 摘要落库 | 会话结束时生成摘要,只存摘要 | 省空间,信噪比高 | 丢细节,摘要本身可能失真 |
| 事件落库 | 只存结构化事件:{type:"preference", key:"辣度", value:"不吃辣"} | 精确、可更新、可审计 | 需要设计事件类型,覆盖不全就漏 |
| 触发式写入 | 用户明确说「记住」、或模型判断「这是长期有效信息」时才写 | 信噪比最高 | 依赖判断准确性,可能漏记重要信息 |
推荐的组合:结构化事实(③)用事件落库 + 触发式——「用户是财务」「只看华东区」这类,一确定就写,永久保存; 对话内容(②)用摘要落库——会话结束时压成三五行,存进向量库备用。 两者结合,既有精度又有覆盖面。
需要 → 写。不需要 → 不写。
「用户问了一个问题」通常不需要记;「用户说他们公司用的是 SAP」需要记。 记忆不是日志,不需要完整。
26.5 读取:怎么在正确的时候想起正确的事
写进去只是第一步。更难的是:用户说「还是按上次那个来」时,你怎么知道「上次」是哪次、「那个」是什么。
第一层:按实体锁定范围
先用 user_id、tenant_id、project_id 把范围缩小。这一步不是「优化」,是安全底线——少一个条件就是跨用户泄露。
第二层:按时间排序
同一实体下,时间近的优先。记忆天然有时效性,三个月前的偏好可能已经变了。
第三层:按语义检索
在前两层筛出的候选里做向量相似度排序。注意顺序:先过滤再检索,不是先检索再过滤——后者会让 top-k 被无关结果占满。
第四层:冲突消解
如果召回了两条矛盾的记忆(「不吃辣」和「最近开始吃辣」),以时间新的为准,并在上下文里注明时间,让模型自己判断。
26.6 遗忘:为什么必须设计「删除」
没人愿意做这件事,但它决定了系统能不能长期运行。
记忆越多,检索越容易召回无关内容。一年后,你的向量库里 90% 是过时的、重复的、无用的。信噪比会持续下降。
「被遗忘权」不是可选项。用户要求删除时,你必须能真的删掉——包括向量、日志、备份。设计时就该让删除是可执行的。
存储和检索都按量计费。保留三年的聊天记录,成本是保留三个月的十倍,而价值几乎为零。
| 遗忘方式 | 怎么做 | 适合 |
|---|---|---|
| TTL(过期时间) | 写入时带过期时间,到期自动清理 | 临时上下文、会话摘要 |
| 重要性衰减 | 长期未被召回的记忆,权重逐步降低,低于阈值归档 | 语义记忆(聊过的话题) |
| 显式覆盖 | 同一 key 的新值覆盖旧值,只保留最新 | 结构化事实(偏好、配置) |
| 主动删除 | 用户可查看、可删除自己的记忆 | 所有涉及个人数据的场景 |
26.7 记忆与 RAG:最容易混的一对
两者在技术上几乎一样(都是向量化 + 检索),但语义和设计要求完全不同。混淆它们会导致隐私事故和效果问题。
| 维度 | RAG(知识库) | 记忆(个人记忆) |
|---|---|---|
| 内容是谁的 | 组织的公共知识,所有人共享 | 某个用户的私有信息 |
| 更新方式 | 文档更新时重建索引 | 对话过程中持续写入 |
| 检索范围 | 全库,按权限过滤 | 必须先锁定到单个用户 |
| 错了的后果 | 答错问题 | 数据泄露(想起别人的事) |
| 准确性要求 | 要高,需引用原文 | 可模糊,但要能追溯到时间 |
| 典型实现 | 向量库 + 混合检索 + 重排 | 结构化表(事实)+ 向量库(对话摘要) |
查资料错了是准确性问题;想起你错了是隐私事故。所以记忆系统的第一条设计原则永远是: 检索之前先锁定用户,并且这个锁定要在数据库层做,不能只在应用层拼 where 条件。
26.8 最小可用方案:四张表 + 一次请求
-- ① 会话表:只管会话元信息
sessions(id, user_id, title, created_at, last_active_at)
-- ② 消息表:原文,用于回溯与重建上下文
messages(id, session_id, role, content, tokens, created_at)
-- ③ 记忆表:结构化事实,这是最该先做的
memories(
id, user_id,
kind, -- preference / fact / constraint
key, -- '辣度' / '公司ERP' / '权限范围'
value, -- '不吃辣' / 'SAP' / '仅华东'
confidence, -- 0~1,低于阈值不注入
updated_at, -- 冲突时以新为准
expires_at -- 可空,支持遗忘
)
-- ④ 摘要表:会话级摘要,写入向量库做语义召回
summaries(id, user_id, session_id, text, embedding, created_at)
# 一次请求的完整数据流
def chat(user_id, session_id, question):
# 1. 取结构化事实(精确、必带)
facts = db.query(
"SELECT key, value FROM memories WHERE user_id=? AND (expires_at IS NULL OR expires_at>now())",
user_id)
# 2. 取相关历史摘要(模糊、按需)
related = vector_db.search(
embed(question),
filter={"user_id": user_id}, # 关键:先锁定用户
top_k=5)
# 3. 取近期对话(近 3 轮原文)
recent = db.query(
"SELECT role, content FROM messages WHERE session_id=? ORDER BY id DESC LIMIT 6",
session_id)
# 4. 拼装:事实在前(稳定),历史在后(易变),预留输出预算
context = assemble(facts=facts, related=related, recent=recent,
reserve_output=0.2)
answer = llm(context, question)
# 5. 异步抽取新记忆(不阻塞响应)
async_extract_and_write(user_id, session_id, question, answer)
return answer
26.9 五个坑
全量存对话,结果召回一堆寒暄。记忆要经过提炼,不是原样倒进去。
只在应用层拼 where 条件,一处漏写就是跨用户泄露。要在数据库层做隔离(RLS 或独立 collection)。
没有 TTL、没有覆盖、没有删除入口。半年后系统又慢又乱,还删不掉。
用户说「今天破例吃辣」,系统却用三个月前的「不吃辣」覆盖。要让人工输入优先级高于历史记忆。
本 章 小 结
模型没有记忆,只有上下文。它每次都在「重新读一遍你发过去的内容」,关掉会话就什么都不剩。所有「记忆功能」都是应用层外挂:结构化事实、向量库、会话摘要、提示词。
记忆与上下文的关系,就是硬盘与内存:记忆是上下文的持久化,上下文是记忆的当前工作集,两者的接口是「拼装」。没被拼进去的记忆等于不存在,拼错了策略等于白存。
落地顺序别搞反:先做「结构化事实」(少量、精确、可更新),再做「对话摘要」(大量、模糊、按需召回)。前者决定「它懂不懂你」,后者决定「它记不记得那次」。
45 天 AI Agent 工程师路线:把上面 39 章拆成可执行的日程
学习路径 · 每日任务与产出物
- 45 天的三段设计:建框架 → 动手搭 → 交付表达
- 每一天的产出物要求(这是这条路线的核心)
- 每个主题对应本书的哪一章,可以交叉查阅
- 四个容易走偏的地方
这一节把前面所有知识点重排成一条 45 天的日程。它和普通「学习计划」的区别是:每一天都必须有一个能拿给别人看的东西。 没有产物的那天,等于没学。
27.1 完整日程表
| DAY | 主题 | 具体学什么 | 对应章节 | 当天产出 |
|---|---|---|---|---|
| 1 | AI 行业认知 | 产业链地图:算力 / 模型 / 应用三层,各层的钱从哪来;AIGC 的六种形态 | 第 3、19 章 | 一页纸:你所在行业在 AI 产业链的哪个位置 |
| 2 | Harness 工程 | 模型之外那层运行时:上下文装配、工具网关、权限、循环控制、日志 | 第 15 章 | 画出「一个 Agent 从收到请求到返回结果」的全链路图 |
| 3 | 大模型基础 | Token、参数、上下文、训练三阶段、推理成本 | 第 4、5、6 章 | 算一次成本:你的场景每天 1 万次调用要多少钱 |
| 4 | Transformer 架构 | 自注意力 QKV、多头、位置编码、残差、层数 | 第 5 章 | 手画一遍注意力的数据流(不用背公式,要能讲清谁乘谁) |
| 5–6 | 提示与评测 | Prompt 四要素、CoT、结构化输出、幻觉三型、评测集 | 第 7、18 章 | 20 条提示词 + 50 条评测问题 |
| 7 | RAG 技术精讲 | 索引/查询双链路、切块、检索、重排、拼装 | 第 9、10、25 章 | 用 20 份真实文档搭一个能跑的最小 RAG |
| 8 | 多模态应用开发 | 视觉编码、图像 token、GUI Agent、Stable Diffusion 基础 | 第 13 章 | 做一个「上传截图 → 提取信息 → 结构化输出」的小工具 |
| 9 | AI 产品经理基础 | 需求适配度判断、能力边界、兜底设计、MVP 切法 | 第 22.3 节 | 用评分卡给三个真实需求打分,选一个 |
| 12 | 需求调研与分析 | 如何问出真实需求、如何判断「这个需求不该用 AI 做」 | 第 22.3 节 | 一份需求分析文档(含「不做什么」清单) |
| 15 | Agent 系统开发 | ReAct 循环、Function Calling、记忆、规划、失败模式 | 第 11 章 | 一个只有 2 个工具的 Agent,带最大轮次限制 |
| 17 | Agent 场景识别 | 哪些场景适合 Agent、哪些必须用 Workflow、边界怎么划 | 第 14 章 | 列出你业务里 10 个可 AI 化的环节,标注「Agent / Workflow / 不做」 |
| 19 | 方案设计与搭建 | 架构图、数据流、模块划分、成本估算、里程碑 | 第 22.1 节 | 一份可评审的技术方案(含 WBS 与风险表) |
| 23 | RAG 企业级知识库 | 混合检索、重排、增量更新、权限隔离、版本管理 | 第 10、25 章 | 知识库上线,带评测报告(Recall@5 / MRR) |
| 26 | 企业级数字员工部署 | 权限体系、沙箱、审计日志、成本上限、灰度发布 | 第 15、18 章 | 给系统套上 Harness:白名单、日志、限流、回滚 |
| 30 | 数据分析 Agent | Text-to-SQL、图表生成、指标口径、结果校验 | 第 11、14 章 | 「自然语言问数」Demo,能回答 20 个业务问题 |
| 35 | Vibe Coding 与前端部署 | 用 AI 写页面、组件拆分、状态管理、部署上线 | 第 22.2 节 + 第 28 章 | 把你的工具做成一个能分享链接的网页 |
| 40 | AIGC 项目实操 | 内容产线:选题→剧本→分镜→生成→剪辑→发布 | 第 23 章 | 一条完整的 60~90 秒成片 |
| 43 | 模拟面试与简历优化 | 项目讲述结构、技术追问应对、数据口径辩护 | 第 22.3 / 22.4 节 | 简历改一版 + 三个项目的 STAR 稿 |
| 45 | Agent 工程师面试入职 | 系统设计题、故障排查题、成本估算题 | 全书 | 能白板画出一个完整 Agent 系统并讲清取舍 |
27.2 三个阶段的重心差异
建立框架
- 目标是能画图,不是能背概念
- 每天结束问自己:这一层在解决什么问题?没有它会怎样?
- 不要碰框架源码,先建立「层次感」
- 关键产出:一张自己画的技术全景图
动手搭建
- 目标从「懂」变成「跑通」
- 每个 Demo 都要有评测,不然不知道改进了没有
- 遇到问题先做隔离测试:是检索错还是生成错
- 关键产出:一个带评测报告的内部工具
交付与表达
- 目标从「能用」变成「可交付、可讲述」
- 补 Harness 与安全,这是 demo 和产品的分界
- 把项目写成能讲 5 分钟的故事:问题—方案—取舍—数据
- 关键产出:可演示系统 + 一份技术方案
27.3 几个容易走偏的地方
看完 LangChain 教程不等于会搭 RAG。教程里的数据是干净的、问题是设计好的,真实数据是脏的、问题是模糊的。 每看完一个教程,立刻用你自己的数据重做一遍,这一步不能省。
框架解决的是「少写重复代码」,不解决「想清楚架构」。先把 ReAct 的循环用 50 行原生代码写一遍, 再看框架,你会立刻明白它在封装什么。反过来则容易被抽象层困住。
「感觉效果还行」是 AI 项目最危险的状态。没有评测集,你无法回答「这次改动是变好还是变坏」, 也无法在面试里说清「你的方案为什么有效」。50 条评测集,两天能建完,价值超过两周的调参。
Demo 到产品之间隔着:权限、日志、重试、限流、监控、回滚。这部分工作不性感,但它是 「做过」和「上线过」的分界线,也是面试里区分初级和中级的关键问题。
本 章 小 结
这条路线的设计逻辑不是「学完知识」,是「攒出作品」。
如果时间不够,砍掉学习时间,不要砍掉产出时间——面试官看的是你做出来过什么,不是你看了多少教程。
四个热门项目拆解:从组织架构到实现细节
OpenFilm / Prompt Spider UI / Stable Diffusion / Agent 大屏
- 四个项目的定位差异:生产工具 / 可视化皮肤 / 生成生态 / 叙事界面
- 每个项目的组织架构与核心设计模式
- OpenFilm 的「纯函数渲染」、SD 的「计算图」、大屏的「主题即策略」
- 每个项目的边界条件:哪些是演示形态,哪些能上生产
这一节拆四个你截图里出现的项目。拆法统一按四个维度:它在系统里占哪个位置(组织架构)、用了什么设计模式、 数据怎么流动(实现过程)、哪些设计值得抄(可复用点)。 这四个项目恰好代表了 AI 应用的四种形态:生产工具、可视化皮肤、生成模型生态、叙事界面。
28.1 OpenFilm:把编码 Agent 变成视频 Agent
组织架构:五个模块,一个数据源
设计模式:三个关键选择
| 模式 | 具体做法 | 为什么这么设计 |
|---|---|---|
| 声明式时间轴 | 片子是「轨道 + 片段」的声明,不是一串操作指令 | 声明式可以被 diff、被程序生成、被 Agent 理解。命令式(一步步操作)无法回滚,也无法让第二个编辑者接手。 |
| 纯函数渲染 | 每个镜头是一个 frame(t):给定时间 t,画出那一刻的画面 |
纯函数意味着任意时刻可寻址。要第 3.2 秒的画面?直接调用 frame(3.2),不用从头播放。这是能做到「改一帧只重渲染一帧」的前提。 |
| 预览即导出 | Studio 用 Chromium 预览,导出也用 Chromium 截图 | 消除了「预览和成片不一致」这个传统剪辑软件的经典问题。你看到的每一帧,就是导出时的那一帧。 |
// film.html 的核心结构(简化示意)
<div class="track" data-start="0" data-duration="5">
<div class="clip shot-title"> <!-- 一个轨道上的片段 -->
<h1 class="card">让 AI 写片子</h1>
</div>
</div>
<script>
// 每个镜头用 frame(t) 描述「任意时刻长什么样」
function frame(t) {
const p = clamp(t / 5, 0, 1); // 归一化进度 0→1
title.style.opacity = easeOut(p); // 淡入
title.style.transform = `translateY(${(1-p)*40}px)`; // 上移
}
</script>
// 渲染:t 从 0 到 5 秒,每 1/30 秒截一张图,交给 ffmpeg 合成
for (let t = 0; t < 5; t += 1/30) { frame(t); await screenshot(); }
实现过程:一次完整的迭代
Agent 读手册,生成 film.html
用户说「给我的 CLI 做一支 20 秒发布视频,带配乐」。Agent 通过 skill 拿到 OpenFilm 的规范,写出 HTML 结构、CSS 样式和 frame(t) 函数。它不需要学 Remotion 之类的框架——网页动画它本来就会。
Studio 实时预览
本地起服务,Chromium 打开片子。用户能看到它一步步成形。这里的关键是预览不是截图流,而是直接渲染网页并播放——所以拖时间轴是即时的。
人工微调,写回源文件
拖动文字位置、裁剪片段、改字幕。这些操作被翻译成对 film.html 的修改(改 CSS 值、改 data 属性),而不是生成一段新的视频。改完保存,文件变了。
Agent 读到修改,继续改
这是这个设计最妙的地方:人改完之后,Agent 再读文件,能看到人的修改并在此基础上继续工作。人和 Agent 共享同一个可编辑的工件,而不是各自产出一个版本再人工合并。
逐帧渲染 + ffmpeg 编码
按时间步长逐帧调用 frame(t) 并截图,PNG 序列交给 ffmpeg 编码成 MP4。openfilm look 可以只渲染某几帧做检查——不用整片重渲,这是省钱的关键。
生成「源文件」而不是「最终产物」。这个原则可以迁移到任何 AI 生成场景: 生成 PPT 要生成可编辑的 pptx,生成报告要生成带结构的 md,生成网页要生成源码。 一旦只给最终产物,用户就被锁死了——改一个字都要重来。
① 依赖 Node 22.2+ 与 ffmpeg,环境有一定门槛;② 动画质量取决于 Agent 的网页动效能力,不熟的会做出「飘」的片子; ③ 长片(>5 分钟)逐帧渲染很慢;④ 项目很新,商用前要 pin 版本;⑤ 素材生成需自备各家 API key。
28.2 Prompt Spider UI:把看不见的 AI 过程画出来
组织架构:表现层与数据层彻底分离
| 层 | 模块 | 职责 |
|---|---|---|
| 数据层 | 事件源(Event Source) | 三个来源:本地模拟器、MCP 连接(实时)、JSON 文件(回放)。三者输出同一种事件格式。 |
| 逻辑层 | 事件队列 + 时间轴映射 | 把「第几秒发生了什么」变成「此刻屏幕上该有哪些实体、在什么位置」。这是整个项目的核心。 |
| 表现层 | Canvas 渲染器 | 只读当前状态,画:蛛网、蜘蛛、词条、连线、粒子。不做任何业务判断。 |
| 交互层 | 时间轴拖动 / 搜索 / 主题抽屉 | 改变「当前时刻 t」,渲染器自然跟着变——因为渲染是 t 的函数。 |
| 输出层 | PNG 快照 / 项目导出 | 把当前画布导出,或把整套配置导出成独立项目。 |
设计模式:三个可以复用的套路
Event Sourcing
不存「最终画面」,只存「发生过哪些事件」。画面是事件的投影。 好处:可回放、可拖动时间轴、可换主题重渲染同一份数据。
Spatial Metaphor
把抽象概念映射到空间关系:token → 词条,注意力 → 蛛丝,工具调用 → 分流支线。 隐喻选得好,用户不用读说明就懂。
Theme as Config
布局、配色、动效参数全部外置。同一份事件流可以渲染成蛛网、星轨、六列电路,不用改核心逻辑。
实现过程:一帧是怎么画出来的
收事件
从模拟器 / MCP / JSON 收到一条事件:{ t: 12.4, type: 'tool_call', name: 'search', tokens: ['竞品','定价'] }。所有事件带时间戳,进入队列。
定位时刻
当前播放头 t=13.0。取所有 t ≤ 13.0 的事件,算出「此刻应该存在哪些实体」——哪些词条已飞出、哪些还在网上、哪条支线正在被激活。
求位置
每个词条沿一条贝塞尔曲线运动,位置由「已飞行时间 / 总时长」决定。曲线是预定义的,位置是算出来的——不是逐帧手摆的。
清屏重绘
Canvas 每帧清空,按 z 序画:底色 → 蛛网 → 连线 → 词条 → 蜘蛛 → 粒子 → 扫描线。全部用 Canvas 2D API,没有 WebGL,所以零依赖。
28.3 Stable Diffusion:一套模型,三层生态
组织架构:三层生态,各管一段
| 层 | 组成 | 作用 | 选型建议 |
|---|---|---|---|
| 模型层 | 底模(Checkpoint) | 决定画风与能力上限。SD 1.5 生态最全但分辨率低;SDXL 画质与构图更好;SD 3.5 / Flux 语义理解更强,但对硬件要求高。 | 新手用 SDXL 或 Flux 蒸馏版;追求生态插件用 SD 1.5 |
| 界面层 | A1111 / ComfyUI / Forge / SD.Next | A1111:插件最全、教程最多,但架构老、启动慢。ComfyUI:节点式,把生成过程画成计算图,可复现、可自动化。Forge:A1111 的优化版,显存占用低、速度快。 | 学习用 A1111;生产与批量用 ComfyUI |
| 增强层 | LoRA / ControlNet / IP-Adapter / VAE / Embedding | 不改底模,用小的外挂模块控制风格、人物、构图、姿态、参考图。这是 SD 生态真正的护城河。 | 人物一致性用 LoRA;构图控制用 ControlNet |
关键参数:调这几个就够
| 参数 | 常用值 | 作用 | 调错了会怎样 |
|---|---|---|---|
| 采样步数 Steps | 20–30 | 去噪迭代次数。步数越多越精细,但超过 30 后收益急剧下降。 | 步数太低画面糊;太高只增加时间,不增加质量 |
| CFG Scale | 5–8 | 提示词对生成的控制强度。 | 太低不听提示词;太高色彩过饱和、画面崩坏 |
| 采样器 Sampler | DPM++ 2M Karras | 去噪的数值方法。Euler 快、DPM++ 稳、DDIM 可逆。 | 不同采样器同一 seed 出图不同,换采样器要重新调参 |
| Seed | 固定整数 | 随机种子。固定 seed 才能复现同一张图。 | 不固定就无法复现,也无法做「微调式」重生成 |
| Denoising 强度 | 0.4–0.7 | 图生图时保留原图的程度。 | 太低没变化;太高变成另一张图 |
| 分辨率 | SDXL 1024² | 底模训练时的分辨率。 | 用错分辨率会出现「双头」「肢体重复」等结构性错误 |
ControlNet:构图控制的四种常用方式
从参考图提取骨架关键点,让生成的人物摆出同样姿势。做人物图最常用——姿势可控,脸和服装可以完全换掉。
提取边缘线,保住轮廓。适合把草图变成成品图、把实拍变成插画,或保持建筑/产品的结构不变。
提取深度图,保住空间层次。适合换背景但保留前后景关系,或把照片转成三维感的画面。
分块放大或局部重绘。配合高清修复使用,可以把 1024 的图放大到 4K 而不糊。
一张「真人感」图的实际工作流
选底模
写实类底模(如 SDXL 写实微调版、Flux 写实版)。这一步决定 60% 的成片质感——用二次元底模再怎么写提示词也出不来真人感。
写提示词:主体 → 外观 → 环境 → 光线 → 镜头
顺序很重要,越靠前权重越高。示例结构:28岁女性,东亚面孔,鹅蛋脸,黑色齐肩发 / 米色风衣 / 雨后的街道,霓虹反光 / 侧逆光,柔和 / 85mm 镜头,浅景深。抽象词(「很美的」「高级感」)几乎无效。
负面提示词
常见组合:lowres, bad anatomy, extra fingers, watermark, text, deformed。注意:负面词不是越多越好,堆太多会压制正常特征。
固定 seed,小步迭代
先出 4 张选构图,固定 seed 后微调提示词。每次只改一个变量,否则不知道是哪个改动起的作用——这和调 RAG 是同一个方法论。
高清修复 + 面部修复
低分辨率出图 → 放大 1.5~2 倍重绘(denoise 0.3~0.4)→ ADetailer 单独修脸。直接在 4K 生成既慢又容易崩结构,分两步走才稳。
后期
调色、锐化、加颗粒。这一步决定「像不像照片」——AI 图往往过于干净,加一点噪点和轻微色差反而更真实。
① 肖像权:用真人照片做参考图、或用真人素材训 LoRA,必须获得授权。生成「某个真实存在的人」的写实图,在很多司法辖区是明确违法的。
② 版权:底模的训练数据来源存在争议,商用前需确认模型许可证(部分模型禁止商用)。
③ 平台规则:多数内容平台要求标注 AI 生成,未标注可能限流或下架。
设计模式:为什么 ComfyUI 值得单独说
A1111 是「表单式」的——所有参数排在一页上,你填完点生成。ComfyUI 是「计算图式」的——你把 加载模型 → 编码文本 → 采样 → 解码 → 保存 这些节点连成一张图,数据沿连线流动。
| 维度 | 表单式(A1111) | 计算图式(ComfyUI) |
|---|---|---|
| 上手难度 | 低,填表即可 | 中,要理解数据流 |
| 可复现性 | 靠参数截图 | 整张图就是配置文件,可版本化 |
| 复杂流程 | 靠插件硬编码 | 自由组合,支持分支、批处理、条件判断 |
| 自动化 | 弱 | 强,可被 API 调用、批量跑 |
| 本质 | 一个应用 | 一个可视化编程环境 |
28.4 agent-display 神经星环:把协作变成叙事
十套主题:同一份数据,十种讲法
| 主题 | 视觉隐喻 | 最适合讲什么 |
|---|---|---|
| NEURAL 神经星环 | 巨大圆环 + 彩色神经团 + 连线脉冲 | 角色之间的交接关系。适合介绍页、展厅,科幻感最强 |
| FACTORY 机器人工厂 | 俯瞰车间 + 机器人 + 运输路线 | 任务拆解与工序。哪个子任务在哪个工位、完成到哪一步 |
| FORGE 视界熔炉 | 黑洞 + 吸积环 + 彩色线束 | 多份输入如何汇成一个交付物 |
| WORKS 天工开物 | 机械织机 + 交错光丝 + 逐层成形 | 并行工作合成一个成果,画面感最强 |
| OPS 纸面工程 | 浅色工程图 + 黑白线条 | 整体关系与数据流,最像正经技术图 |
| SPIDER 蛛网战术 | 作战室 + 角色工位 + 任务卡 | 团队分工,最容易被非技术人员理解 |
| ION 离子回路 | 六列节点:状态→提问→决策→执行 | 决策路径,适合讲流程而非讲人 |
| NEBULA 星核蜘蛛 | 星云 + 需求雷达 + 评分面板 | 需求审查:找模糊要求、追问、补齐 |
| PARK 智造园区 | 六座车间的园区,可点进去 | 多工作流并行,可下钻到单条产线 |
| HQ 智能总部 | 经营游戏式:中央办公室 + 八部门 + 员工走动 | 组织与项目流转,可手动派单,互动性最强 |
组织架构:单文件里的四层
| 层 | 实现 | 职责 |
|---|---|---|
| 模拟器 | JS 定时器 + 状态机 | 产生假数据:任务推进、Agent 状态切换、Token/费用累加。这是「能动起来」的来源,也是最该被替换的部分。 |
| 状态仓库 | 单一状态对象 | 存所有 Agent、任务、指标。渲染层只读它,不直接读模拟器——这层解耦是能换主题的前提。 |
| 3D 渲染层 | Three.js 场景图 + 后处理 | 每个主题一套场景构建函数:Neural 建圆环与粒子,Factory 建车间与机器人。共用的只有渲染循环与 bloom 后处理。 |
| UI 叠加层 | DOM + CSS | 侧边面板、日志、指标数字。用 HTML 而不是 3D 文字,因为可读性和排版好得多。 |
设计模式
Strategy
十套主题实现同一个接口:build(state) 建场景、update(state) 每帧更新。切换主题 = 换一个策略对象,核心逻辑不动。
Observer
模拟器 tick 一次,状态变更,所有订阅者更新。渲染层不需要知道数据从哪来——这正好是接真实数据的插入点。
Zero-build
一个 index.html 打开即用,无需构建。代价是 THREE 等依赖要联网 CDN,且代码不易维护。适合演示,不适合长期产品。
要接真实业务,必须补齐这七个字段
这块屏目前是「看起来在跑」。要在真实场景可用,需要把模拟器换成数据源,并保证下列字段能稳定提供—— 这也是所有「Agent 可观测大屏」的最小数据契约。
| 字段 | 示例 | 为什么必须有 |
|---|---|---|
| task_id | T-045 | 任务的唯一标识,用于追踪与去重 |
| owner_agent | scout / copy / code | 当前由谁处理,决定节点高亮 |
| status | queued / running / blocked / done | 状态机驱动的颜色与动画,缺失就会「乱跳」 |
| progress | 0–100 或当前步骤 / 总步骤 | 进度必须单调递增,否则画面会倒流 |
| handoff_from → to | scout → copy | 交接关系,是「光点飞行」动画的唯一依据 |
| cost / tokens | ¥0.012 / 3.7k tok | 成本可视化,也是异常检测的入口 |
| updated_at | 22:26:42 | 超时必须显示「数据已过期」,否则看板会骗人 |
本 章 小 结
拆项目的正确姿势不是「看它用了什么技术」,是「看它做了什么取舍,为什么这么取舍」。
这一章最值得抄的一条设计原则:生成「源文件」而不是「最终产物」——一旦只给最终产物,用户就被锁死了。
工具关系图谱:ChatGPT、Codex、Claude Code、DeepSeek 与 DSH
四层划分 / 六种关系 / 组合场景
- 先分清四种东西:模型、API、Harness、产品——混乱的根源是把它们当成同级
- 五个对象各自站在哪一层:ChatGPT / Codex / Claude Code / DeepSeek / DeepSeek Harness
- 六种关系:同厂绑定、产品包含能力、开源与专有、跨厂调用、模型可换、计费联动
- 四种典型组合场景,以及各自适合谁
- 为什么会出现「DeepSeek 的 harness 去调 Claude Code」这种看似矛盾的设计
这几个名字经常被并列讨论,但它们根本不在同一个层级上——ChatGPT 是产品,Codex 是 Agent, Claude Code 是 Agent 也是 Harness,DeepSeek 是模型厂商,DeepSeek Harness 是运行时。 把它们放在同一层比较,永远比不出结论。这一节先把层级摆正,再讲关系。
29.1 四层划分:混乱的根源
| 层 | 是什么 | 代表 | 换一层会怎样 |
|---|---|---|---|
| ① 模型 | 一堆权重,只会「输入→输出」 | GPT-6 系列、Claude 5.x、DeepSeek-V4、开源 Llama/Qwen | 换模型 = 换大脑。能力上限变,但工具、流程、权限都不变 |
| ② API | 把模型包成 HTTP 服务 | OpenAI API、Anthropic API、DeepSeek API、各类兼容网关 | 换 API = 换供应商。计费、限流、合规、延迟都变 |
| ③ Harness | 驱动模型干活的那层程序:上下文、工具、循环、权限 | Codex CLI、Claude Code、DeepSeek Harness、OpenCode | 换 Harness = 换身体。同样的模型,体验可能天差地别 |
| ④ 产品 | 给人用的界面与订阅体系 | ChatGPT、Claude 应用、各家 IDE 插件 | 换产品 = 换入口。底层模型和 agent 可能没变 |
@openai/codex)、IDE 插件、云端沙箱、ChatGPT 内的 Codex 面板。只能用 OpenAI 的模型。29.2 六种关系:从「谁绑死谁」到「谁都能换」
关系一:同厂绑定——Harness 和模型是锁死的
| Harness | 能用的模型 | 能否换 | 为什么 |
|---|---|---|---|
| Claude Code | Claude 系列 | 不能 | 专有产品,Harness 与模型深度耦合(hooks、skills、agent 行为都针对 Claude 调优) |
| Codex CLI | OpenAI 系列 | 不能(原生) | 开源但设计上只对接 OpenAI;社区有改造成接第三方的,但非官方路径 |
| DeepSeek Harness | DeepSeek + 任意兼容模型 | 能 | 架构上把「模型」抽象成可插拔的 provider,能接 Ollama、vLLM、任意 OpenAI 兼容网关 |
| OpenCode | 任意 | 能 | 社区项目,天生 provider-agnostic |
关系二:产品包含能力——ChatGPT 不是 Codex 的同级对手
很多人把 ChatGPT 和 Claude Code 对比,这是层级错位。正确的对应是:
| 对比 | OpenAI 侧 | Anthropic 侧 |
|---|---|---|
| 对话产品 | ChatGPT | Claude 应用(对话) |
| 编码 Agent | Codex(CLI / IDE / 云端 / ChatGPT 内) | Claude Code(CLI / IDE / 桌面 Code 标签页) |
| 关系 | Codex 是 ChatGPT 订阅里的一项能力,同时有独立 CLI | Claude Code 是 Claude 订阅里的一部分,共用同一个用量池 |
| 计费 | 随 ChatGPT 档位走(Free 也有少量),或用 API key | 需付费档(Pro 起),或 API 计费,与聊天共享额度 |
关系三:开源与专有——决定了能不能自建、能不能审计
Codex CLI、DeepSeek Harness、OpenCode
能读源码、能改、能私有化部署、能审计它到底发了什么请求。企业合规场景几乎是必选项。
Claude Code
深度做得最好(subagents、hooks、skills、MCP、Agent SDK),但你不知道它内部怎么处理你的代码。适合信任厂商、追求开箱即用。
Claude Code 虽闭源,但提供 Agent SDK 和 GitHub Action,可以嵌进自己的流水线——只是核心仍是黑盒。
关系四:跨厂调用——DSH 把对手当成子代理
这是这张图里最反直觉的一条,也是最值得琢磨的设计: DeepSeek Harness 可以启动一个真正的 Claude Code CLI 或 Codex 进程,把它们当作「子代理」来用。
dsh-subagent-claude-code、dsh-subagent-codex),
用官方 Agent SDK 或 app-server 协议,启动对方真实的 CLI 进程,把任务委派过去。关系五:模型可替换——网关层把「绑定」变成「选项」
如果你用的 Harness 支持自定义 endpoint,那么「用哪家模型」就变成了配置项。常见做法:
- 兼容网关:把 OpenAI 格式的请求转发到任意后端(Anthropic、DeepSeek、本地 vLLM),应用层不用改代码。
- 本地模型:通过 Ollama、vLLM、LM Studio 接本地权重,零 API 成本,适合隐私敏感或离线场景。
- 按任务路由:简单任务走便宜模型,复杂任务走旗舰模型——这是成本优化最有效的一招(第 30 章讲过)。
关系六:计费联动——用量池决定你能不能用
| 对象 | 怎么计费 | 对使用的影响 |
|---|---|---|
| ChatGPT / Codex | 按订阅档位给额度,可叠加 API 计费 | 免费档也能用一点;重度使用要升档 |
| Claude / Claude Code | Pro / Max 订阅,与聊天共享用量池 | 白天聊天多,晚上编码额度就紧 |
| DeepSeek API | 按 token 计费,分峰谷价 | 成本可控,适合批量与自动化 |
| DeepSeek Harness | 本体免费(MIT),只付模型 token | 可以完全用本地模型跑,零成本 |
29.3 四种组合场景:你该怎么搭
| 场景 | 组合 | 为什么这么配 |
|---|---|---|
| 个人开发者 | ChatGPT 订阅(含 Codex)+ 一个 Claude 试用期,两边跑同一个任务对比 | 成本最低,还能直观感受差异。编码 agent 的优劣高度依赖你的代码库,别人的评测不算数 |
| 重度编码 | Claude Code(复杂重构、长任务)+ Codex CLI(并行 ticket、云端跑批) | 两者互补:一个强在深度规划与工具生态,一个强在沙箱与并行。用 git worktree 隔离,互不干扰 |
| 成本敏感 / 私有化 | DeepSeek Harness + 本地模型(Ollama/vLLM)或 DeepSeek API | Harness 免费开源,模型可换可本地。数据不出内网,成本可控 |
| 企业多 agent | DSH 做编排层,子代理里挂 Claude Code / Codex,各自用原生配置与授权 | 不用重造编码 agent,直接复用最强的两个;但要接受「黑盒里套黑盒」的调试难度 |
29.4 为什么格局长成这样:三个商业逻辑
模型厂做 Harness,是为了把模型卖出去
Claude Code 和 Codex 的存在,本质是让模型有一个「最佳展示场景」。用户一旦习惯了某个 Harness 的交互方式, 换模型的意愿就会下降——Harness 是模型的护城河。这也解释了为什么它们都只支持自家模型。
开源 Harness 做「中立调度」,是为了不被任何一家绑死
DeepSeek Harness 开源、模型可换、还能调对手的 agent——这不是「大方」,是错位竞争: 既然在编码 agent 的深度上短期追不上,就做「能调度所有 agent 的那一层」。它卖的不是 agent,是编排能力。
订阅制把「工具选择」变成了「额度管理」
当 Codex 包含在 ChatGPT 里、Claude Code 包含在 Claude 里,用户的选择标准就从「哪个工具好」 变成了「我已经付了哪个的钱」。这也是为什么两家都在把编码能力塞进主订阅,而不是单独卖。
ChatGPT 是门面,Codex 是它的手;Claude Code 是另一家的手,做得更细但闭着;DeepSeek 是造脑子的; DeepSeek Harness 是那个「谁的手都能借来用」的调度台。
选工具时先问自己在选哪一层:选脑子(模型)、选手(agent)、还是选调度台(harness)—— 这三个问题的答案往往不一样。
本 章 小 结
这五个名字不在同一层:ChatGPT 是产品,Codex 和 Claude Code 是 Agent(也是 Harness),DeepSeek 是模型厂商,DeepSeek Harness 是开源运行时。把它们并列比较,永远比不出结论。
六种关系里,最该记住的是两条:① 同厂绑定——Claude Code 只能跑 Claude,Codex 只能跑 OpenAI,这决定了你的长期迁移成本;② 跨厂调用——DSH 能把 Claude Code 和 Codex 当子代理,说明「选哪个 agent」正在变成「编排哪几个 agent」。
选型先分层:选脑子、选手、还是选调度台。三个问题的答案往往不一样,混着问就会一直纠结。
市面热门 AI 功能横向对比:十四类,一张选型表
能力 / 适合谁 / 价格量级 / 局限
- 十四类功能的边界:从通用对话到浏览器操作,各自解决什么问题
- 每一类的头部产品对比:能做什么、谁适合、价格量级、主要局限
- 四类最容易被高估的功能,以及它们的真实水平
- 一套「按需求反查产品」的判断顺序
这一节不做排行榜,因为排行榜三个月就过期。它做的是分类 + 边界: 让你知道「这个需求属于哪一类功能」「这一类里谁擅长什么」「它的天花板在哪」。
30.1 十四类功能的全景
| 类别 | 解决什么 | 头部代表 | 成熟度 |
|---|---|---|---|
| ① 通用对话 | 问答、写作、分析、翻译 | ChatGPT、Claude、Gemini、豆包、Kimi、DeepSeek | 成熟(商品化) |
| ② 编码 Agent | 读代码、改代码、跑测试、提 PR | Claude Code、Codex、Cursor、Copilot、Windsurf | 成熟(分化中) |
| ③ 深度研究 | 多源检索、交叉验证、出长篇报告 | Deep Research 类、秘塔、Perplexity | 较成熟 |
| ④ 图像生成 | 文生图、图生图、局部重绘 | Midjourney、Flux、SD 生态、即梦、Ideogram | 成熟 |
| ⑤ 视频生成 | 文生视频、图生视频、口型驱动 | Sora 类、可灵、即梦、Runway、Veo | 快速迭代 |
| ⑥ 语音 | 实时对话、TTS、音色克隆 | 各家语音模式、ElevenLabs、豆包语音 | 成熟(质量分化大) |
| ⑦ 办公文档 | 写文档、做 PPT、表格分析 | Copilot 365、WPS AI、Notion AI、飞书智能伙伴 | 较成熟 |
| ⑧ 会议纪要 | 录音转写、发言人分离、待办提取 | 飞书妙记、通义听悟、Otter、腾讯会议 AI | 成熟 |
| ⑨ AI 搜索 | 带引用的联网问答 | Perplexity、秘塔、天工、各家搜索 AI | 成熟 |
| ⑩ 数据分析 | 自然语言问数、自动出图 | ChatGPT 数据分析、Julius、各家 BI 的 AI | 较成熟 |
| ⑪ 浏览器操作 | 自动点网页、填表、比价 | Operator 类、Comet、各家浏览器 Agent | 早期(易崩) |
| ⑫ 工作流平台 | 把多步骤串成自动化流程 | Dify、Coze、n8n、Langflow | 成熟 |
| ⑬ 数字人/口播 | 虚拟主播、配音视频 | HeyGen、闪剪、剪映数字人 | 较成熟(同质化) |
| ⑭ 翻译 | 文档翻译、网页对照翻译 | DeepL、沉浸式翻译、各家大模型 | 成熟(大模型已追平) |
30.2 逐类对比
① 通用对话:差距在收窄,选择看生态
| 产品 | 强在哪 | 弱在哪 | 适合 |
|---|---|---|---|
| ChatGPT | 生态最全(插件、Codex、图像、语音、数据分析都在一个订阅里);工具调用稳定 | 长文写作偏「正确但平」;中文语感弱于国产 | 想一个订阅解决大部分需求 |
| Claude | 长文写作与代码最强;指令遵循细致;文件理解好 | 生态窄;免费档不含 Code;用量池与聊天共享 | 写长文档、做深度分析、写代码 |
| Gemini | 超长上下文;与 Google 生态(文档、邮箱、搜索)打通 | 中文场景弱于国产;产品线混乱 | 深度使用 Google 全家桶 |
| 豆包 | 中文口语化好;语音自然;免费额度大方 | 复杂推理弱于旗舰;幻觉控制一般 | 日常问答、口语化内容、语音交互 |
| Kimi | 长文档处理与中文阅读体验好 | 复杂 agent 任务弱 | 读论文、读报告、长资料整理 |
| DeepSeek | 性价比极高;代码与数学强;开源可私有化 | 产品化体验不如大厂;多模态较弱 | 成本敏感、需要私有化、批量调用 |
② 编码 Agent:分化最严重的一类
| 产品 | 形态 | 强在哪 | 局限 |
|---|---|---|---|
| Claude Code | 终端 / IDE / 桌面 | 复杂重构、长任务规划;hooks、skills、subagents 生态最深 | 专有、只能用 Claude、贵 |
| Codex | CLI / IDE / 云端沙箱 | 沙箱安全;可并行跑多个任务;开源 | 只能用 OpenAI 模型;深度不如 CC |
| Cursor | 编辑器 | 编辑体验最好;Tab 补全流畅;多模型可选 | 本质是编辑器,长任务 agent 能力弱于 CLI 类 |
| GitHub Copilot | IDE 插件 | 与 GitHub 流程深度集成;企业采购方便 | agent 能力偏保守 |
| Windsurf | 编辑器 | agent 模式流畅,上下文管理有特色 | 生态小于 Cursor |
| OpenCode / Cline | 终端 / 插件 | 任意模型,可用自己的 key,成本可控 | 生态小,配置门槛高 |
小项目(< 5 万行):差异不大,选顺手的就行。
大项目(> 50 万行):上下文管理能力决定一切——能不能只读相关文件、能不能记住跨文件依赖、会不会读了 200 个文件还没找到重点。 这时候 CLI 类(Claude Code / Codex)通常强于编辑器类。
③ 深度研究:差距在「敢不敢说不知道」
- 每条结论都有可点开的来源
- 会主动标注「这点没有找到可靠来源」
- 能区分一手信息和二手转述
- 报告结构有逻辑,不是资料堆砌
- 引用链接打不开或与结论无关
- 把博客当权威来源
- 为了「全面」硬凑章节
- 中文场景下,采集源质量普遍弱于英文
④⑤ 图像与视频:先看「可控性」,再看「画质」
| 方向 | 产品 | 定位 | 关键差异 |
|---|---|---|---|
| 图像 | Midjourney | 审美最强,出图即用 | 可控性弱,不适合精确排版 |
| Flux / SD 生态 | 可控性最强(ControlNet、LoRA) | 需要学习成本,本地部署要显卡 | |
| 即梦 / Ideogram | 中文提示词友好;Ideogram 强在文字渲染 | 复杂构图弱于 SD 生态 | |
| 视频 | Sora 类 | 物理真实感强,镜头语言好 | 时长受限,价格高 |
| 可灵 / 即梦 | 国内可用,中文场景适配好,性价比高 | 复杂运动仍会崩 | |
| Runway / Veo | 专业影视工作流,控制手段多 | 学习曲线陡 |
⑦⑧ 办公与会议:赢在「不用切换工具」
| 产品 | 强在哪 | 局限 |
|---|---|---|
| Copilot 365 | 与 Word/Excel/PPT/Outlook 深度集成,能在文档内直接操作 | 价格高;对中文排版支持一般 |
| WPS AI | 中文办公场景最顺;PPT 生成与排版贴合国内习惯 | 复杂数据处理弱 |
| Notion AI | 知识库内问答,能引用你自己的页面 | 中文长文质量一般 |
| 飞书智能伙伴 | 与飞书文档、消息、日历打通,能跨文档总结 | 强绑定飞书生态 |
| 飞书妙记 / 通义听悟 | 转写准确率高,发言人分离好,能提待办 | 专业术语需自定义词表 |
⑨⑩ 搜索与数据分析:一个看「引用」,一个看「口径」
- AI 搜索:核心差异是引用质量。好的会给你能点开、且真的支持结论的链接;差的给你一堆看似相关实际无关的页面。判断方法:随机点开三条引用,看是否支撑结论。
- 数据分析:核心风险是口径错误。它能把图画得很漂亮,但如果它把「订单数」理解成「订单行数」,结论全错。必须要求它先说明「它怎么理解你的字段」。
⑪ 浏览器操作:最被高估的一类
所以它的正确定位是「人在环上的助手」:它做前 90% 的机械操作,最后一步由人确认。 不要指望它无人值守地跑完整个流程。
⑫⑬⑭ 工作流、数字人、翻译:三个「已经足够好」的类别
Dify(一体化、适合业务团队)、Coze(上手最快)、n8n(集成最多、偏自动化)、Langflow(可视化但可导出代码)。 选择看「你的流程会不会被非技术人员改」——会就用可视化,不会就直接写代码。
已经高度同质化,差异主要在口型准确度、中文语气自然度、以及是否支持定制形象。 批量做口播视频,成本已降到几乎可忽略。
大模型已经追平专用翻译工具,在专业领域(法律、医学)甚至更好,因为能结合上下文。 专用工具的优势只剩:术语库一致性、批量文档格式保留、成本。
30.3 四类最容易被高估的功能
| 功能 | 宣传的样子 | 实际的样子 |
|---|---|---|
| 无人值守的浏览器 Agent | 「帮你自动完成所有网页操作」 | 登录、验证码、弹窗、改版,每一步都可能卡死。目前只能做辅助,不能做替代 |
| 一键生成完整视频 | 「输入一句话,输出一条成片」 | 能做 5~10 秒的素材片段,多镜头叙事和角色一致性仍会崩,成片仍需剪辑 |
| 全自动数据分析 | 「上传表格,自动出结论」 | 字段口径、异常值、统计陷阱都要人把关。它算得快,但不知道你的业务定义 |
| 通用个人助理 | 「记住你的一切,替你处理所有事」 | 记忆是应用层外挂(第 26 章讲过),权限与可靠性都还不成熟。目前是「多个单点工具的组合」,不是「一个全能管家」 |
30.4 按需求反查:五步判断
① 先问:这是「生成」还是「判断」?
生成类(写、画、剪)现在很强,直接选产品即可;判断类(审核、决策、诊断)需要人工兜底,任何产品都不能全自动。
② 再问:错了的代价有多大?
代价低(草稿、灵感)→ 用最顺手的;代价高(对外发布、资金、法律)→ 必须有人在环上,且要能追溯来源。
③ 再问:数据能不能出去?
不能出内网 → 只能选私有化方案(开源模型 + 自建 harness),这会排除掉大部分 SaaS 产品。
④ 再问:是「一次性」还是「每天用」?
一次性 → 用免费额度即可;每天用 → 算订阅成本,并优先选「额度不共享」或「按量计费」的方案(见 26.2 关系六)。
⑤ 最后:拿你自己的真实任务测三个
不要看评测榜单。用你上周真实做过的三个任务,让候选产品各做一遍,比结果。这一步十分钟,比看十篇测评有用。
本 章 小 结
十四类功能里,通用对话、图像、语音、翻译、会议纪要已经「足够好」——差异不在能力,在生态与价格;
编码 Agent 分化最严重,选型要看代码库规模而不是跑分;
浏览器操作、一键成片、全自动分析、通用助理这四类被普遍高估,目前都只能做辅助,不能做替代。
选型顺序:先分「生成 vs 判断」,再看「错了的代价」,再看「数据能否出网」,最后用自己的真实任务测三个。
不要用榜单做决定,用你上周真做过的活做决定。
模型选型:2026 年 10 月的阵容、边界与决策方法
横向对比 / 六个场景 / 五个边界 / 计费陷阱
- 先说方法:四维评估框架,以及三个最常见的选型陷阱
- 2026 年 10 月的阵容全景:闭源旗舰、开源旗舰、快模型、推理专用、多模态
- 六个真实场景的推荐与理由(编码、长文、多模态、中文、私有化、高并发)
- 模型的五个硬边界:不是「弱一点」,是「根本做不到」
- 计费陷阱:分层计价、思考 token、缓存——账单超预算的主因
- 一套可复用的决策流程(型号会变,方法不变)
这一节不写「谁第一」,因为那个答案三个月就作废。 它写的是怎么判断、边界在哪、钱花在哪——这三件事在型号换代时不会变。
31.1 先说方法:四维评估与三个陷阱
| 维度 | 要问的问题 | 怎么测(不要看榜单) | 权重 |
|---|---|---|---|
| ① 能力 | 它能不能完成我这个任务? | 拿 50 条你的真实输入跑一遍,人工判对错。不要用公开 benchmark——它们和你的任务分布不同 | 最高 |
| ② 成本 | 单任务多少钱?规模化后呢? | 按「输入 token × 单价 + 输出 token × 单价 × 重试系数」算,别只算输入 | 高 |
| ③ 延迟 | 首 token 多久?完整响应多久? | 测 P95,不是平均值。流式场景看首 token,批处理看吞吐 | 中高 |
| ④ 约束 | 数据能不能出网?要不要私有化?合规? | 这一条是一票否决:不能出网,闭源 API 全部排除 | 否决项 |
榜单测的是「标准题」,你的任务是「业务题」。而且各厂测的 benchmark 不一样,跨厂的分数根本不可比。
便宜的模型可能输出更长、重试更多、需要更贵的后处理。要看「单任务完成成本」,不是「每百万 token 单价」。
生产系统通常是多模型路由:简单任务走快模型,复杂任务走旗舰。用一个模型打天下,要么贵,要么差。
31.2 2026 年 10 月的阵容:按定位分,不按厂商分
按厂商分类只能看到「谁家出了什么」,按定位分类才能回答「我该用哪一类」。下面四类,覆盖了绝大部分选择。
第一类:闭源旗舰(能力上限最高,价格也最高)
| 型号 | 智能指数 | 价格(输入/输出) | 上下文 | 输出上限 | 最强的地方 |
|---|---|---|---|---|---|
| Claude Opus 5.5 | 58 | $4 / $20 | 1M | 128K | 长时程 agentic 编码;Terminal-Bench 66.4%;思考无法关闭 |
| Gemini 4 Carbon | 59 | 中等 | 1M | — | 综合智能最高;多模态统一 |
| GPT-6 Astra | 57 | $10 / $50 | 1.05M | 128K | computer use 与浏览;Codex 全家桶 |
| GPT-6.1 Sol | 55 | $2 / $10 | 1.05M | 128K | 接近 Astra 但便宜 80%;性价比旗舰 |
| Claude Sonnet 5.5 | 54 | 更低 | 1M | 128K | 速度 135 tok/s,日常编码主力 |
| Gemini 3.8 Flash | — | $0.75 / $3.75 | 1M | 65K | 最便宜的旗舰级;大规模 agent 首选 |
| Claude Fable 5.1 | 50–53 | $10 / $50 | 1M | — | 超难推理;但性价比不如 Opus 5.5 |
第二类:开源旗舰(能力接近,成本可控,可私有化)
| 型号 | 规模 | 许可 | API 价格 | 特点 |
|---|---|---|---|---|
| DeepSeek V4-Pro | 1.6T 总 / 49B 激活 | MIT | $1.32/$3.96(峰) $0.66/$1.98(谷) |
输出上限 38.4 万 token(最宽);峰谷计价;V4-Pro API 不支持图片输入 |
| DeepSeek V4.1 Flash | 较小 | MIT | $0.15~0.30 / $1.2 | 最便宜的开源推理模型;思考可关闭 |
| Qwen3.8-Max | 2.4T / 95B 激活 | Apache-2.0 | $2 / $6 | 中文强;托管版支持图片;可 enable_thinking: false |
| Kimi K3 | 2.8T | 开源权重 | $3 / $15 | 多模态(文/图/视频);长时程编码;可跑在 Codex / Claude Code 里 |
| GLM-5.3 | — | 开源 | $1.40 / M 输入 | 纯文本编码模型;1M 上下文 + 128K 输出;性价比高 |
| Mistral 系列 | — | 开源权重 | $1.5 / $7.5 | 欧洲合规场景;可自托管 |
第三类:推理专用(想得久,答得准,但贵且慢)
| 型号 | 默认思考强度 | 能关掉吗 | 说明 |
|---|---|---|---|
| Claude Opus 5.5 | medium | 不能 | 思考始终开启,只能调 effort(low→max);thinking 按输出计费 |
| GPT-6.1 Sol | medium | 不能 | reasoning.effort 可调,但不接受 none;推理内容不返回 |
| DeepSeek V4.1 Flash | high | 能 | 可显式关闭,适合高并发低成本场景 |
| Qwen3.8-Max | 可配 | 能 | enable_thinking: false |
| Gemini / GLM | 中等 | 部分可调 | 看具体型号与 API 参数 |
「能不能关掉思考」是一个被严重低估的选型指标。如果你的业务里有大量简单调用(抽取、分类、格式转换), 用一个「必须思考」的模型,成本可能是必要值的 3~10 倍,延迟还翻倍。
31.3 六个真实场景:怎么选,为什么
| 场景 | 首选 | 理由 | 备选 / 何时换 |
|---|---|---|---|
| 长时程编码 重构、跨文件改动 |
Claude Opus 5.5 | agentic coding 的公开成绩领先,且思考与工具调用可交错(interleaved thinking),适合长链条任务 | 成本敏感 → Sonnet 5.5 或 GLM-5.3 |
| 计算机操作 点网页、看屏幕 |
GPT-6 Astra | computer use 与浏览是它的差异化能力,其他家在这一项上明显落后 | 预算紧 → Sol;但要接受成功率下降 |
| 长文档 / 多模态 整本年报、图纸、视频 |
Gemini 4 / Kimi K3 | Gemini 原生多模态、1M 上下文;Kimi K3 支持文/图/视频且开源 | 需要开源 → K3;要最便宜 → Gemini Flash |
| 中文业务 客服、公文、本土合规 |
Qwen3.8-Max / DeepSeek V4 | 中文语料占比高、成语与公文语体自然;国内合规与网络延迟都占优 | 要私有化 → DeepSeek(MIT) |
| 私有化 / 数据不出网 | DeepSeek / Qwen / GLM | 许可宽松(MIT / Apache),可自建;但注意旗舰规模自建不划算 | 算力有限 → 7B~70B 档 + 量化 |
| 高并发 / 大批量 百万级调用 |
Gemini Flash / DeepSeek Flash | 单价最低;DeepSeek 谷时价还能再降;两者都支持关闭思考 | 对延迟极敏感 → 更小的专用模型 |
31.4 五个硬边界:不是「弱一点」,是「做不到」
选型时最容易犯的错,是把「能力不足」当成「调一调就能好」。下面五条是结构性限制,再贵的模型也绕不过去。
知识截止
精确计算
上下文容量
输出长度
可靠性与一致性
31.5 计费陷阱:账单超预算的三个真凶
| 陷阱 | 怎么发生的 | 怎么防 |
|---|---|---|
| ① 分层计价 | 很多模型不是单一价格:Gemini 超过 20 万 token 涨价、GPT-6 超过 27.2 万切换长文档档、Haiku 类以 10 万为界。 你以为按低价算,实际跨档后单价翻倍 | 先算清你的典型上下文长度落在哪一档;接近阈值时主动裁剪,而不是硬跨 |
| ② 思考 token | 推理模型的思考过程按输出计费。一次请求输出 2000 token,其中 1500 是思考,你为看不见的内容付了钱 | 简单任务关掉思考(如果模型支持);不支持就换模型或加路由 |
| ③ 重试与轮次 | Agent 每多一轮,就多一次完整的输入计费(历史全带上)。10 轮的 Agent,输入成本大约是 1 轮的 5~8 倍 | 设最大轮次;压缩历史;工具返回只留结论(第 30 章讲过) |
① 缓存——很多厂商对「相同前缀」的输入打折(有的低至 1/10),把系统提示和固定资料放在最前面,能吃到这个折扣。
② 峰谷价——部分厂商(如 DeepSeek)分时段计价,批处理任务挪到谷时能省一半以上。
③ 输出控制——要求「简洁回答」不是礼貌问题,是成本问题。输出单价通常是输入的 3~5 倍。
31.6 一套可复用的决策流程
本 章 小 结
跑分层面没有全能王:编程看 Claude、计算机操作看 GPT-6、多模态长文档看 Gemini、性价比与开源看国产。
而且「最强」和「最贵」不是同一条曲线——旗舰里的次旗舰(如 Sol、Sonnet)往往更划算。
五个硬边界必须先确认:知识截止、精确计算、上下文容量、输出长度、输出一致性。这五条都是架构决定的,不是「模型不够聪明」,
所以解法在外挂和流程,不在换模型。
选型顺序:约束 → 任务类型 → 实测 → 路由。先用「数据能否出网」一票否决,再看任务要不要深想,然后用你自己的 50 条数据测,
最后定分层路由。模型三个月换一轮,这套方法三年不用换。
部署实战:Ollama 与 Dify,从装到能跑通
逐步操作 / 每步验证 / 故障定位
- 两者的关系:Ollama 是「供给方」(模型运行时),Dify 是「消费方」(编排平台),部署顺序不能反
- Ollama 六步:验硬件 → 装 → 配环境变量 → 拉模型 → 四层验证 → 服务化
- 四层验证法:进程活着 → 端口在听 → 模型能答 → 上层能调。绝大多数「连不上」都能用这四层定位到具体一层
- Dify 九步:Docker 前置 → 取代码 → 改 .env → 起容器 → 初始化 → 接 Ollama → 配 embedding → API 验证 → 运维
- 三个决定成败的细节:OLLAMA_HOST 绑 0.0.0.0、num_ctx 要调大、.env 改完必须重启容器
这一章不讲原理,只讲操作。每一步都按三段写:做什么(命令)→ 怎么算成功(验证)→ 失败往哪查(排查)。
如果你赶时间,只记住一句话:部署失败几乎从不是「装错了」,而是「装对了但连不上」。
而连不上,九成出在两个地方——监听地址和网络边界。
32.1 先把两者的关系说清:谁供给、谁消费
很多人以为 Ollama 和 Dify 是「二选一」的同类工具,其实它们解决的是完全不同的问题,而且有明确的上下游关系。
| 对比项 | Ollama | Dify |
|---|---|---|
| 本质 | 模型运行时(推理引擎 + 简易 API 服务) | LLM 应用编排平台(LLMOps) |
| 它有什么 | 权重加载、显存调度、量化推理、HTTP 接口 | 提示编排、知识库、Agent、工作流、日志、权限 |
| 它没有什么 | 没有应用层:没有知识库、没有工作流、没有多用户 | 没有模型:一个权重都不带,全靠外部 API |
| 端口 | 11434 | 80(可改,推荐 8080) |
| 角色 | 供给方:把模型变成一个 HTTP 服务 | 消费方:把这个服务当成「模型供应商」接进来 |
所以顺序是固定的:先让 Ollama 能独立答话,再让 Dify 去调它。 如果你在 Dify 里配了半天连不上,而 Ollama 本身还没用 curl 验证过,那等于在一栋没有地基的楼上贴瓷砖。
32.2 部署前先做三个判断
判断一:你的机器能跑多大的模型
| 显存 | Q4 量化能跑 | 实际体验 | 适合做什么 |
|---|---|---|---|
| 无独显(纯 CPU) | 1.5B–4B | 3–8 token/s,能出字但慢 | 跑通流程、验证接口,别指望好用 |
| 6–8 GB | 7B–8B | 25–45 token/s | 个人助手、RAG 问答、文本分类 |
| 12–16 GB | 14B,或 8B 的 Q8 | 20–35 token/s | 中文写作、结构化抽取 |
| 24 GB | 32B | 12–20 token/s | 接近可用的代码与推理 |
| 48 GB 以上 | 70B | 8–15 token/s | 私有化替代中型闭源模型 |
估算公式(比记表格可靠):显存 ≈ 参数量(B) × 每参数字节 + KV Cache + 额外开销。
Q4_K_M 约 0.55 字节/参数(8B → 4.4 GB),Q5 约 0.68,Q8 约 1.05,F16 约 2.0。
再加 15%–25% 的 KV Cache 与运行时开销。另外两笔账别忘:内存至少是模型大小的 1.2 倍(加载时会有峰值),磁盘至少 2 倍(下载 + 解压临时文件)。
Dify 自身还要额外吃资源:官方最低 2 核 4 GB,实际建议 4 核 8 GB 以上。 它要同时跑 8 个左右的容器(api、worker、web、db、redis、向量库、sandbox、plugin_daemon)。 如果你在同一台机器上又要跑 Ollama 又要跑 Dify,先把 Ollama 的内存算进去再分配,否则会出现「模型加载到一半被 OOM 杀掉」。
判断二:选哪条部署路线
| 路线 | 适合 | 优势 | 代价 |
|---|---|---|---|
| Windows 原生安装(推荐个人) | 自己一台电脑,边用边试 | GPU 直通最省心,装完即用 | 不是系统服务,注销就停 |
| Docker Desktop(Windows) | 要和 Dify 放一起 | 一条命令起停 | WSL2 显存开销、GPU 支持不稳 |
| Linux 原生 + systemd | 团队共享、长期运行 | 稳定、开机自启、好监控 | 需要会一点 Linux |
| 远程 GPU 服务器 | 本地显卡不够 | 算力可租、随时换卡 | 要处理公网暴露与鉴权 |
判断三:给谁用——这决定了要不要改监听地址
127.0.0.1:11434 不动,浏览器和本地脚本都能访问,最安全。但 Dify 在 Docker 里时不行——容器不属于「本机」。OLLAMA_HOST=0.0.0.0:11434 + 防火墙放行 11434。Ollama 没有任何鉴权,同网段任何人都能免费用你的显卡。32.3 Ollama 部署(Windows 原生)六步
打开 PowerShell,先看显卡在不在:
nvidia-smi
正常会输出一张表:右上角是 CUDA Version(不是驱动版本,但能间接反映),中间是进程与显存占用。 如果提示「不是内部或外部命令」,说明驱动没装或没进 PATH——这时候装 Ollama 也能跑,但会退化到 CPU 推理,速度差 10 倍以上。
更干净的查询方式(只取需要的三列):
nvidia-smi --query-gpu=name,memory.total,driver_version --format=csv
8192 MiB)+ 驱动版本(建议 550 以上)。AMD 显卡:改用
rocm-smi,Windows 上支持有限,建议走 Linux。Mac:无需驱动,Metal 开箱可用。
方式 A(推荐):安装包。从官网下 OllamaSetup.exe 双击安装。
默认装到 %LOCALAPPDATA%\Programs\Ollama,不需要管理员权限,装完托盘会出现一个羊驼图标,服务自动启动。
方式 B:包管理器。
winget install --id Ollama.Ollama -e --accept-source-agreements
方式 C:便携 zip。解压后手动执行 ollama serve。适合不想装东西、或要放在移动硬盘上的场景。
①
ollama --version → 返回版本号,说明命令进了 PATH②
where ollama → 返回真实路径,确认不是装了两个版本③
curl.exe http://127.0.0.1:11434 → 返回一行 Ollama is running,说明服务已起
ollama serve 会报
bind: Only one usage of each socket address is normally permitted。这不是错误,是重复启动。
判断方法:curl.exe http://127.0.0.1:11434 有返回就说明已经在跑。PowerShell 里必须写
curl.exe,直接写 curl 会走 Invoke-WebRequest 别名,参数语法完全不同。
Ollama 的默认配置对「本机自己用」够,对「Dify 在 Docker 里调它」完全不够。六个变量值得改:
| 变量 | 默认值 | 建议值 | 不改会怎样 |
|---|---|---|---|
OLLAMA_HOST | 127.0.0.1:11434 | 0.0.0.0:11434 | 容器内访问被拒 → Dify 永远连不上 |
OLLAMA_MODELS | %USERPROFILE%\.ollama\models | D:\ollama\models | 几十 GB 模型全塞 C 盘,系统盘爆红 |
OLLAMA_KEEP_ALIVE | 5m | 30m 或 -1 | 闲置 5 分钟卸载,下次请求重新加载要几十秒 |
OLLAMA_NUM_PARALLEL | 1 | 2–4 | 两个人同时用,第二个请求排队等到超时 |
OLLAMA_MAX_LOADED_MODELS | 1 | 2 | LLM 与 embedding 模型互相踢,知识库索引奇慢 |
OLLAMA_FLASH_ATTENTION | 0 | 1 | 长上下文时显存占用高 30%–50% |
OLLAMA_KV_CACHE_TYPE | f16 | q8_0 | KV Cache 占双倍显存(需先开 flash attention) |
OLLAMA_ORIGINS | 127.0.0.1 | *(仅浏览器直连时需要) | 网页端调 API 报 CORS 错误 |
Windows 设置方法(用户级,不需要管理员):
setx OLLAMA_HOST "0.0.0.0:11434"
setx OLLAMA_MODELS "D:\ollama\models"
setx OLLAMA_KEEP_ALIVE "30m"
setx OLLAMA_FLASH_ATTENTION "1"
setx OLLAMA_KV_CACHE_TYPE "q8_0"
setx OLLAMA_NUM_PARALLEL "2"
关键动作:设置完必须彻底退出 Ollama 再启动。托盘图标右键 → Quit Ollama,然后重新打开。
原因是桌面程序只在启动那一刻读环境变量,改完不重启等于没改。而且 setx 只对新开的终端生效,当前这个窗口里的 echo 还是旧值。
① 新开 PowerShell:
echo $env:OLLAMA_HOST → 应输出 0.0.0.0:11434②
netstat -ano | findstr 11434 → 应看到 0.0.0.0:11434 ... LISTENING如果显示的是
127.0.0.1:11434,说明没重启或变量名拼错③ 从另一台机器测:
Test-NetConnection -ComputerName <你的IP> -Port 11434 → TcpTestSucceeded : True④ 防火墙放行(只在需要局域网访问时做):
netsh advfirewall firewall add rule name="Ollama" dir=in action=allow protocol=TCP localport=11434
先按用途选一个,别一次拉一堆(每个都占几十 GB 磁盘):
# 通用对话 + 中文,8B 是最划算的起步档
ollama pull qwen3:8b
# 推理型(会先想再答),适合数学、逻辑、复杂分析
ollama pull deepseek-r1:7b
# 向量模型,Dify 的知识库必须有它,否则建不了知识库
ollama pull bge-m3
# 多模态(能看图),适合截图理解、单据识别
ollama pull qwen2.5vl:7b
| 量化标签 | 字节/参数 | 8B 模型体积 | 质量 | 什么时候用 |
|---|---|---|---|---|
q4_K_M | ≈0.55 | ≈4.9 GB | 默认,损失可感知但不大 | 绝大多数场景的默认选择 |
q5_K_M | ≈0.68 | ≈5.8 GB | 明显更稳,尤其长文 | 显存还剩 2 GB 以上时升这档 |
q8_0 | ≈1.05 | ≈8.5 GB | 接近无损 | 做评测基线,或显存富余 |
f16 | ≈2.0 | ≈16 GB | 理论最优 | 24 GB 以下基本别想 |
判断标准很简单:模型加载后如果 ollama ps 显示 100% GPU,说明刚好装下;
如果显示 72% GPU / 28% CPU,说明爆显存了,速度会掉到原来的三分之一。这时候要么降一档量化,要么换小一号模型。
①
ollama list → 列出已下载模型与体积②
ollama show qwen3:8b → 看 parameters(参数量)、quantization(量化)、context length(上下文长度)③
ollama run qwen3:8b "用一句话解释什么是RAG" → 能出中文回答
「连不上」是个太模糊的描述。把它拆成四层,每层单独验,就能一步定位到问题在哪。 顺序不能乱——下层不通,上层一定不通。
L1 · 进程层:服务活着吗
ollama list
# 有输出 = 服务在跑;报 "could not connect to ollama server" = 没跑
L2 · 原生 API 层:HTTP 通吗、模型能答吗
# 列出模型
curl.exe http://127.0.0.1:11434/api/tags
# 对话(stream=false 才会一次性返回完整 JSON,便于肉眼检查)
curl.exe http://127.0.0.1:11434/api/chat -d "{\"model\":\"qwen3:8b\",\"messages\":[{\"role\":\"user\",\"content\":\"你好\"}],\"stream\":false}"
# 当前加载了哪些模型、占用多少显存、跑在 GPU 还是 CPU
curl.exe http://127.0.0.1:11434/api/ps
L3 · OpenAI 兼容层:SDK 和 Dify 走的是这条路
curl.exe http://127.0.0.1:11434/v1/models
curl.exe http://127.0.0.1:11434/v1/chat/completions ^
-H "Content-Type: application/json" ^
-H "Authorization: Bearer ollama" ^
-d "{\"model\":\"qwen3:8b\",\"messages\":[{\"role\":\"user\",\"content\":\"你好\"}],\"stream\":false}
Authorization: Bearer ollama?Ollama 根本不校验这个值,写 Bearer 123 也一样能过。
但很多 OpenAI SDK 和框架(包括 Dify 的部分插件)在头部缺失时会直接抛 401,请求根本没发出去。
所以这个看起来没用的头,实际上是兼容性的一部分——凡是要填 Key 的地方,随便填一个字符串,别留空。
L4 · 性能层:跑得对不对
看 L2 返回的 JSON 里有四个数字:eval_count(生成 token 数)、eval_duration(生成耗时,单位纳秒)、
prompt_eval_count、load_duration(模型加载耗时)。换算:
生成速度(tokens/s) = eval_count / (eval_duration / 1e9)
首字延迟(s) = load_duration / 1e9 ← 第一次请求特别慢就是这个
ollama ps 的 GPU 占比。
桌面版 Ollama 是「登录后启动」,用户注销或重启就没了,而且没有开机自启的守护。 要长期提供服务,用 WinSW 包成 Windows 服务(和本机已有的 nginx、MySQL 是同一套做法):
<service>
<id>ollama</id>
<name>Ollama</name>
<description>Ollama LLM runtime</description>
<executable>C:\Users\Administrator\AppData\Local\Programs\Ollama\ollama.exe</executable>
<arguments>serve</arguments>
<env name="OLLAMA_HOST" value="0.0.0.0:11434"/>
<env name="OLLAMA_MODELS" value="D:\ollama\models"/>
<logpath>D:\ollama\logs</logpath>
<onfailure action="restart" delay="10 sec"/>
<onfailure action="restart" delay="30 sec"/>
<onfailure action="restart" delay="60 sec"/>
</service>
① XML 注释里不能出现
--,否则 WinSW 直接拒绝加载,报「注释中不能包含 --」,而且指行号不指字符,很难一眼看出。②
onfailure 的轮次是有限资源:上面三条只覆盖 100 秒,用完就再也不重启,服务会永久停在 Stopped 且没有任何提示。
真实故障窗口更长的,要加到 7 条以上(覆盖 9 分钟)。
反向代理 + 鉴权(因为 Ollama 自己不鉴权):
server {
listen 8443 ssl;
server_name ai.example.com;
location / {
# 简单可用的 Key 校验:没带对 key 直接 403
if ($http_authorization != "Bearer your-secret-key") {
return 403;
}
proxy_pass http://127.0.0.1:11434;
proxy_set_header Host $host;
# 流式输出必须关缓冲,否则前端要等全部生成完才看到字
proxy_buffering off;
proxy_read_timeout 300s;
client_max_body_size 20m;
}
}
curl.exe -k https://ai.example.com:8443/api/tags -H "Authorization: Bearer your-secret-key" 能返回模型列表;
故意写错 key 应返回 403。两个都要测——只测「对的能通」等于没测鉴权。
32.4 Ollama 部署(Linux / 纯 Docker)
Linux 一键安装:
curl -fsSL https://ollama.com/install.sh | sh
# 验证:三个都要看
systemctl status ollama
journalctl -u ollama -n 50 --no-pager # 有 "Listening on 127.0.0.1:11434" 才正常
curl http://127.0.0.1:11434
改监听地址(systemd 覆盖,别直接改 service 文件):
systemctl edit ollama
# 在打开的编辑器里写入:
[Service]
Environment="OLLAMA_HOST=0.0.0.0:11434"
Environment="OLLAMA_MODELS=/data/ollama/models"
Environment="OLLAMA_KEEP_ALIVE=30m"
# 保存后
systemctl daemon-reload
systemctl restart ollama
ss -lntp | grep 11434 # 应显示 0.0.0.0:11434
Docker 运行(带 GPU):
# 前置:nvidia-container-toolkit 已安装,否则 --gpus 会报错
docker run -d --gpus=all \
-v ollama:/root/.ollama \
-p 11434:11434 \
--name ollama \
--restart unless-stopped \
ollama/ollama
# 验证 GPU 真的进去了(这一步最容易被跳过)
docker exec ollama nvidia-smi
docker exec ollama ollama run qwen3:8b "hi"
host.docker.internal,直接写服务名:
http://ollama:11434。同一个自定义网络内,Docker 的内置 DNS 会解析服务名,比跨宿主机绕一圈更快也更稳。
32.5 一个必须调、但 90% 的人没调的参数:num_ctx
这是 Ollama 上最隐蔽的坑,也是 RAG 效果差的常见原因。模型自带 128K 上下文能力,不代表 Ollama 会给你 128K。
Ollama 有一个独立的运行时上下文长度(num_ctx),默认值远小于模型上限(历史版本 2048,新版本按显存自动估算)。
典型症状:RAG 明明检索到了正确段落,模型却说「材料中没有提到」——因为那段正好被截掉了。 你以为在调试检索,实际在调试上下文长度。
三种改法,按作用范围选:
# ① 全局(推荐):改环境变量,所有请求生效
setx OLLAMA_CONTEXT_LENGTH "32768" # Windows
Environment="OLLAMA_CONTEXT_LENGTH=32768" # Linux systemd
# ② 单次请求:在 API 的 options 里传
{"model":"qwen3:8b","messages":[...],"options":{"num_ctx":32768},"stream":false}
# ③ 固化进模型:Modelfile,之后每次用这个自定义名都带默认参数
FROM qwen3:8b
PARAMETER num_ctx 32768
PARAMETER temperature 0.3
SYSTEM "你是一个严谨的技术文档助手,不确定时直接说不知道。"
# 然后: ollama create qwen3-doc -f Modelfile
代价要算清:KV Cache 显存随上下文线性增长。粗略估算
KV 显存 ≈ 2 × 层数 × 头数 × head_dim × 序列长度 × 字节数,
8B 模型从 4K 提到 32K,KV Cache 会从约 0.5 GB 涨到约 4 GB。所以 num_ctx 不是越大越好,是「够用 + 留 20% 余量」。
ollama show qwen3-doc 应显示 context length 32768;
再用一个超过 2K token 的长文本提问,如果答得完整(而不是只答了后半部分),说明生效了。
32.6 Dify 部署(Windows + Docker)九步
compose up 会拉起
api(业务逻辑)、worker(异步任务,知识库索引就跑在这)、web(前端)、db(postgres)、
redis(队列与缓存)、向量库(默认 weaviate)、sandbox(代码执行隔离)、plugin_daemon(模型插件)、ssrf_proxy、nginx。
少任何一个,某个功能就会静默失效——比如 worker 没起来,知识库会一直「排队中」。
winget install --id Docker.DockerDesktop -e
wsl --update
wsl --status # 默认版本应为 2
如果 Docker 起不来,八成是虚拟化没开:任务管理器 → 性能 → CPU,右下角看「虚拟化:已启用」。 没启用要去 BIOS 开 VT-x / SVM。
①
docker version → 同时有 Client 和 Server 两段(只有 Client 说明引擎没起来)②
docker compose version → 返回 v2.x(Dify 用的是 compose v2 语法,v1 的 docker-compose 会报错)③
docker run --rm hello-world → 打印欢迎语
资源分配:Docker Desktop → Settings → Resources,建议 CPU ≥ 4、内存 ≥ 8 GB。
如果 WSL2 抢内存太狠,在 C:\Users\<你>\.wslconfig 里限制:
[wsl2]
memory=10GB
processors=4
swap=2GB
port is already allocated。先确认:
netstat -ano | findstr :80
有输出就说明被占,把 Dify 的端口改成 8080(下一步在 .env 里改)。
git clone https://github.com/langgenius/dify.git
cd dify
# 关键:不要用 main 分支跑生产
git tag --sort=-v:refname | head -5 # 看最近几个稳定 tag
git checkout 1.9.1 # 换成上面查到的最新 tag
为什么不直接用 main:主干随时在合并未完成的功能,可能带着没跑通的数据迁移。 用 tag 才能保证「今天装的和三个月后同事装的是同一个东西」,出问题也能对得上官方 issue。
git describe --tags 返回具体 tag 名(不是 main);ls docker 能看到
docker-compose.yaml 和 .env.example。
cd docker
Copy-Item .env.example .env # PowerShell
# 或: cp .env.example .env # Git Bash / Linux
| 变量 | 默认 | 改成 | 为什么必须改 |
|---|---|---|---|
SECRET_KEY | 一个示例值 | 随机 42 字节 base64 | 用于加密会话与凭据。用默认值等于所有人都能伪造登录态 |
EXPOSE_NGINX_PORT | 80 | 8080 | 本机 80 被 nginx 占用,不改起不来 |
DB_PASSWORD | difyai123456 | 强密码 | 数据库端口一旦被映射出去就是裸奔 |
REDIS_PASSWORD | difyai123456 | 强密码 | 同上;队列里跑的是你的全部对话内容 |
生成 SECRET_KEY(Windows 没有 openssl 也能做):
# 有 Python 的话最省事
python -c "import secrets,base64;print(base64.b64encode(secrets.token_bytes(42)).decode())"
# 纯 PowerShell
-join ((48..57)+(65..90)+(97..122) | Get-Random -Count 42 | ForEach-Object {[char]$_})
① 不要改
DB_USERNAME、不要改服务名 db / redis——compose 里其它容器靠这些名字做 DNS 解析和连接串拼接,改了就连不上。② 改完 .env 必须重建容器:
docker compose down 然后 up -d。
环境变量在容器创建时就固化了,restart 不会重新读取。这是「改了半天没生效」的最常见原因。
docker compose up -d
# 首次会拉 8–10 GB 镜像,10–30 分钟,别以为卡死了
docker compose ps
docker compose logs -f api
①
docker compose ps → 所有服务 Up,且 api / worker 显示 (healthy)②
docker compose logs api | Select-String "migrat|Listening" → 看到数据库迁移完成 + 服务监听③
curl.exe -I http://localhost:8080 → 返回 200 或 307容器 Up 但 unhealthy 是最坑的状态——端口通、页面能开、功能报错。一定要看到 healthy。
浏览器打开 http://localhost:8080/install,设置邮箱和密码(至少 8 位,含字母和数字),提交后自动跳转到登录页。
打不开怎么办:先看
docker compose logs nginx(入口层),再看 logs api(业务层)。
前端静态资源由 nginx 提供,页面能开但白屏 = 后端没起来,别去查前端。
INIT_PASSWORD,/install 向导会被跳过,直接用默认管理员账号 + 该密码登录。
小团队内网部署常用这种方式省一步,但初始化完成后建议清空这个变量。
先选对 Base URL。这一步选错,后面怎么调都没用:
| 部署拓扑 | Base URL 填什么 | 前提条件 |
|---|---|---|
| Ollama 原生 + Dify 在 Docker(本章场景) | http://host.docker.internal:11434 | OLLAMA_HOST 必须绑 0.0.0.0 |
| 两者在同一个 compose 网络 | http://ollama:11434 | 服务名必须是 ollama,且同网络 |
| Ollama 在另一台机器 | http://<内网IP>:11434 | 对方绑 0.0.0.0 + 防火墙放行 |
| Ollama 也跑了容器但独立启动 | http://host.docker.internal:11434 或容器 IP | 端口已 -p 映射到宿主机 |
操作路径:右上角头像 → 设置 → 模型供应商 → 找到 Ollama → 添加模型,填三项:
- 模型名称:必须和
ollama list里的名字完全一致(含 tag,如qwen3:8b,只写qwen3会 404) - Base URL:按上表选
- 模型类型:LLM / Text Embedding / Rerank,选错类型这个模型就不会出现在对应下拉框里
docker compose exec api curl -s http://host.docker.internal:11434/api/tags
返回模型 JSON = 网络通了,问题在配置;返回 Connection refused = 网络不通,问题在 OLLAMA_HOST 或防火墙。宿主机能通、容器不通,就这一种可能:Ollama 还在监听 127.0.0.1。
然后在 Dify 里点「保存」,回到「工作室」建一个空白应用,选这个模型发一句话。
host.docker.internal 在 Docker Desktop 上默认可用,
但如果你用的是 Docker Engine(Linux)或某些精简版,这个域名不存在,要在 compose 里显式加:
extra_hosts:
- "host.docker.internal:host-gateway"
这是最多人卡住的地方:聊天应用能跑,一建知识库就报错,或者文档一直「排队中 / 索引失败」。 原因很简单——知识库需要向量化,而 Ollama 默认只拉了对话模型,没有 embedding 模型。
ollama pull bge-m3 # 1024 维,中英文都不错,首选
# 或
ollama pull nomic-embed-text # 768 维,体积小,英文强
然后在 Dify 的 Ollama 供应商里再添加一次,模型类型选 Text Embedding,名字填 bge-m3。
界面能聊,不代表接口能用。团队集成、批量调用走的都是 API,必须单独验一次。 在应用页左侧「访问 API」→ 右上「API 密钥」→ 创建。
# Dify 原生接口(最稳,推荐集成用这个)
curl.exe -X POST http://localhost:8080/v1/chat-messages ^
-H "Authorization: Bearer app-xxxxxxxxxxxx" ^
-H "Content-Type: application/json" ^
-d "{\"inputs\":{},\"query\":\"你好,用一句话介绍你自己\",\"response_mode\":\"blocking\",\"user\":\"test-user\"}"
# 也提供 OpenAI 兼容接口,方便直接换 base_url
curl.exe -X POST http://localhost:8080/v1/chat/completions ^
-H "Authorization: Bearer app-xxxxxxxxxxxx" ^
-H "Content-Type: application/json" ^
-d "{\"inputs\":{},\"query\":\"你好\",\"response_mode\":\"blocking\",\"user\":\"test-user\"}"
answer 字段且内容非空;metadata.usage 里有 token 统计。401 = Key 错或没带;404 = 应用没发布(未发布的应用 API 不可用);400 =
user 字段缺失(这是必填项,很多人漏)。
备份三件套(缺一不可):
# ① 数据库(应用、对话、配置都在这里)
docker compose exec db pg_dump -U postgres -d dify > dify_db_backup.sql
# ② 上传的文件与插件(compose 目录下)
# docker\volumes\app\storage
# docker\volumes\plugin_daemon
# ③ .env(密钥丢了,数据库备份也解不开)
copy docker\.env dify_env_backup.txt
升级流程(顺序错了会丢数据):
docker compose down # 1. 先停
# 2. 备份数据库和 volumes(见上)
git fetch --tags
git checkout 1.10.0 # 3. 换到新 tag
docker compose pull # 4. 拉新镜像
docker compose up -d # 5. 起,入口脚本会自动跑数据库迁移
docker compose logs -f api # 6. 盯迁移日志,有 ERROR 立刻停下
git checkout 是不够的,必须还原数据库备份。
docker compose exec db psql -U postgres -d dify -c "\dt" 能列出表;
登录后能看到原来的应用和知识库。只验证「能连上」不算恢复成功,要验证「数据在」。
32.7 故障速查表:症状 → 真实原因 → 处理
| 症状 | 真实原因 | 处理 |
|---|---|---|
| Dify 里测试 Ollama 报连接失败,但宿主机 curl 正常 | Ollama 仍监听 127.0.0.1 | 改 OLLAMA_HOST=0.0.0.0,彻底退出重开 Ollama |
Dify 容器起不来,日志报 port is already allocated | 80 端口被占用(本机是 nginx) | 改 EXPOSE_NGINX_PORT=8080 后 down 再 up |
| 改了 .env 但行为没变 | 环境变量在容器创建时固化 | docker compose down 后重新 up -d,restart 无效 |
| 知识库文档一直「排队中」/ 索引失败 | worker 没起来,或没配 embedding 模型 | 看 logs worker;确认已拉 bge-m3 并在供应商里以 Embedding 类型添加 |
| Ollama 回答速度突然掉到个位数 tok/s | 爆显存,部分层退到 CPU | ollama ps 看 GPU 占比;降量化或减小 num_ctx |
| RAG 明明检索到了却说「材料里没有」 | 输入超过 num_ctx 被静默截断 | 把 num_ctx 调到 32768,并确认 ollama show 生效 |
| 上传大文件报 413 | 两处限制:nginx 与 Dify 各有一道 | 同时改 NGINX_CLIENT_MAX_BODY_SIZE 和 UPLOAD_FILE_SIZE_LIMIT,然后重启 |
| Docker 拉镜像卡住或超时 | 网络问题 | Docker Desktop → Settings → Docker Engine 配 registry-mirrors |
| api 容器反复重启 | 数据库没起来 / 密码不匹配 / 磁盘满 | 先 logs db,再核对 .env 里的 DB_PASSWORD 与已有数据卷是否一致 |
| 改了 DB_PASSWORD 后彻底连不上 | 数据卷里的旧密码还在,只改了连接密码 | 要么改回原密码,要么进库改密码;生产环境千万不要靠删卷重来 |
32.8 单机能跑 ≠ 能交付:还差什么
上面这套跑通,你得到的是一个可用的开发环境,不是一个能交给客户的生产系统。差距清单如下,按重要性排序:
| 缺口 | 风险 | 最低成本的补法 |
|---|---|---|
| HTTPS | API Key 与对话内容明文过网 | nginx 反代 + 证书(Let's Encrypt / 内部 CA) |
| 鉴权与限流 | Ollama 无鉴权,任何人可耗你的 GPU | 反代层加 Key 校验 + limit_req |
| 备份 | 一次误删全没 | 数据库每日 pg_dump + volumes 同步到另一块盘 |
| 监控 | 挂了没人知道,用户先发现 | 至少做三件事:容器 healthcheck 告警、磁盘水位、接口存活探测 |
| 资源隔离 | Dify 的批量索引把 Ollama 显存吃满,线上问答全超时 | 分机器部署,或给 Ollama 设并发上限 |
| 外部存储 | 容器重建后上传文件丢 | 把 volumes/app/storage 换成对象存储(S3/MinIO) |
http://127.0.0.1:11434,于是照着填进 Dify,结果一直报连接超时或被拒绝。反复检查 Ollama 明明在跑。host.docker.internal,同 compose 网络用服务名,跨机器用内网 IP。并且一定要在容器内用 curl 验证,而不是在宿主机。q4 与 f16 在长链推理上的差距是真实存在的。docker compose restart 只是重启进程,环境变量还是创建时那份。同理,setx 对当前终端也不生效。down 再 up -d(重建容器)。Windows 侧:setx 后新开终端并彻底退出重开应用。验证方式不是「我觉得应该生效了」,而是打印出来看。本 章 小 结
部署这件事,真正的能力不是「会敲命令」,而是能把一个模糊的失败拆成可验证的层次。
Ollama 四层(进程 → 端口 → 模型 → 上层调用)、Dify 三步(容器健康 → 页面能开 → 接口能通),
这套拆法比记住任何命令都值钱——换一个工具、换一个云厂商,方法还是这套。
行动建议:装完之后别急着建应用,先花十分钟把四层验证各做一遍,并把每层的验证命令抄进项目的 README。
下次别人接手,或者三个月后你自己重装,这十分钟会救回一整天。
Jarvis 拆解:一个本地优先的桌面 AI 助理,怎么在自己机器上跑起来
架构判断 / 源码运行 / 本地改造 / 交付
- 它的核心取舍:能离线的一律离线(唤醒、识别、声纹、合成、界面),只把「文字 + 工具结果」发出去
- 三个值得抄的架构决策:语音服务与 HUD 分离、插件即文件、首次启动才装模型
- 一次交互的十条消息,以及其中最难的三个点:回声消除、打断、尾随追问窗口
- 三条本地落地路线:装安装包验货 / 源码跑起来 / 只跑 HUD 改界面——目标不同,入口不同
- 改造四件事:换成本地模型、换中文音色、写第一个插件、备份
~/.jarvis/ - GPL-3.0 的边界:自己用和给别人用,是完全两回事
截图里那个浮条,是它 HUD 的一角——正在显示当前进度、运行环境(Windows GUI)、字符编码和时刻。
也就是说:它不只是「能对话」,还随时把「我正在做什么」摊在你眼前。
这一章不复述 README,而是回答三个问题:它为什么这么设计、你在自己机器上怎么让它跑起来、跑起来之后怎么改成你要的样子。
shitoudaidi/GDDXX-Jarvis(GPL-3.0,2026-10 已开源),
以下关于能力、目录结构、安装命令、数据目录、许可证的描述来自其公开 README;
关于内部实现细节(进程通信格式、插件函数签名、状态机)属于工程推断,
文中会标注「示意」,实际签名以仓库 docs/extend.md 与源码为准——我不用猜的东西冒充事实。
33.1 它到底是什么:一句话和一个取舍
一句话:一个常驻后台的桌面助理,听「Hey Jarvis」唤醒,用英式管家音色回答,用全息 HUD 显示它在做什么; 听、说、唤醒、声纹、界面全部在本机跑,理解和决策交给你自己选的大模型(云端 API 或本地 Ollama)。
真正值得学的是那个取舍:把任务按「需不需要智商」切了一刀。
| 环节 | 在哪跑 | 为什么这么放 | 代价 |
|---|---|---|---|
| 唤醒词 | 本地 | 要 7×24 一直听,传出音频既费流量又不可接受 | 误唤醒率靠自己调阈值 |
| 语音识别 ASR | 本地 | 录音不出机器,这是它能承诺隐私的前提 | 首次要下约 1 GB 模型 |
| 声纹识别 | 本地 | 生物特征一旦上传就无法撤回 | 换人用要重录 |
| 语音合成 TTS | 本地 | 要低延迟、要能被打断,走云端做不到 | 音色受限于本地模型 |
| 理解与决策 | 云端 / 本地模型 | 这是唯一真正需要大模型的地方,也是唯一值得花钱的地方 | 文字仍会出网 |
| 工具执行 | 本地 | 开灯、查日程、读文件,本来就在你机器上 | 权限要自己管 |
| HUD 界面 | 本地 | 纯前端,随时可换皮肤 | — |
但它也有明确的边界:模型必须支持工具调用(function calling),否则只能聊天——开灯、日程、全息演示这些能力全部用不了。 这句话 README 里写得很直白,实际部署时也是第一大坑。
33.2 三个值得抄的架构决策
决策一:语音服务和 HUD 是两个东西
仓库目录已经说明了一切:jarvis/ 是 Python 语音服务(唤醒、识别、回声消除、合成、大脑、工具),
hud/ 是纯网页(index.html + css/ + js/ + demos/),
app/ 是启动器、首次安装、窗口与模型清单。
| 如果合成一个进程 | 拆开之后 |
|---|---|
| 改一个动画要重启整个语音服务,唤醒模型重载几十秒 | 改界面只需刷新浏览器,语音服务完全不用动 |
| UI 崩溃带走整个助手,用户以为「坏了」 | HUD 崩了语音还在,反过来也一样,可各自重启 |
| 只能用 Qt / WPF 这类桌面框架画界面,做全息效果很痛苦 | 用 HTML/CSS/Canvas 做,动画和皮肤成本低一个量级 |
| 跨平台要维护两套 UI | 一套网页,mac 和 Windows 共用 |
代价是多了一层进程间通信(HUD 与语音服务之间要传状态:聆听中 / 思考中 / 说话中 / 空闲)。 但这是用一点通信复杂度,换掉一整类 UI 迭代的痛苦,很划算。
cd hud && python -m http.server,浏览器打开即可,
没有语音服务时用内置演示回复。这意味着改界面的人不需要麦克风、不需要模型、不需要 API Key。
一个项目能不能被别人接手,往往就看它有没有留这样一条「只跑我关心的那一半」的入口。
决策二:插件就是「放一个文件」
加一个能力,只需要在 jarvis/plugins/ 放一个模块,写一个 provide(),不改主程序。
仓库里已有的插件可以当范本:米家设备控制、高德天气与路线、DeepSeek Harness(做文档和程序)、抖音创作者数据。
这个设计的本质,是把「工具」从代码里抽出来变成可发现、可开关的注册项—— 设置里能一个个关掉,说明每个插件都自带启用状态,而不是硬编码在流程里。这正是第 11 章讲的工具注册表的工程化版本。
(描述, 执行函数) 元组,有的用装饰器注册。动手前先读 docs/extend.md,照抄一个现成插件再改,
比照着我这里的伪代码写要快得多。下面只是一个典型形状,用来说明「一个工具由哪几部分组成」:
# jarvis/plugins/demo_weather.py —— 结构示意,非真实签名
TOOL = {
"name": "get_weather",
"description": "查询指定城市的实时天气。用户问天气、要不要带伞时使用。",
"parameters": { # 给模型看的 JSON Schema
"type": "object",
"properties": {"city": {"type": "string", "description": "城市名,如 杭州"}},
"required": ["city"],
},
}
def run(city: str) -> str:
# 真正的执行逻辑:调 API、读本地文件、控制系统……失败要返回人能看懂的原因
return f"{city} 今天多云,18~24℃,不用带伞。"
def provide():
"""主程序通过这个函数发现能力。"""
return TOOL, run
三个细节决定这个插件好不好用:① description 是写给模型看的,写清「什么时候该用」比写清「它是什么」更重要;
② 参数尽量少、尽量有默认值,模型填错的概率随参数数量上升;③ 失败时返回一句人话而不是抛异常,模型能自己换思路。
决策三:装的时候才下模型,而不是打进安装包
安装包只有几十 MB,第一次打开才在浏览器里显示进度:准备 Python 组件、下载约 1 GB 语音模型(国内镜像优先)。
这不是偷懒,是三个现实约束下的唯一解:① 1 GB 模型塞进安装包,签名、公证、增量更新都会变麻烦; ② 模型有各自的许可证(它的默认管家音色是社区训练的 Piper 模型,仅供个人非商业使用,安装时才从原始地址下载,不在仓库里); ③ 不同平台要不同的模型文件,装的时候才知道该下哪个。
33.3 一次交互的十条消息
从你喊一声到它开口,中间发生了什么。这张图里,只有紫色三条线出网,其余全在你的机器上。
这十条消息里,有三处「看起来简单、实际最难」的地方,也正是自己做同类项目时最容易翻车的点。
33.4 三条本地落地路线:先想清楚你要什么
「装起来」这三个字有三种完全不同的含义。选错入口,会在无关的地方浪费一整天。
| 路线 | 适合谁 | 耗时 | 你最终得到什么 |
|---|---|---|---|
| A · 装安装包 | 只想先看看它值不值得用 | 10 分钟 | 一个能用的助手。不能改代码,但能验证「这个东西对我的日常有没有用」 |
| B · 源码运行 | 要改逻辑、加插件、换模型 | 30–60 分钟 | 可编辑的运行环境。这是「落地」的真正起点 |
| C · 只跑 HUD | 只想改界面 / 做自己的皮肤 | 5 分钟 | 浏览器里的界面,自带演示回复。不需要麦克风、不需要 Key |
建议顺序是 A → B,不要跳过 A。因为 A 能在一刻钟内回答一个问题:这套交互形态在你的生活里到底有没有位置? 如果答案是否定的,B 做得再漂亮也没用。
33.5 路线 A:装安装包,先验货
Windows 用 Jarvis-Setup-*.exe(不需要管理员权限);mac 分 Apple 芯片的 -arm64.dmg 与 Intel 的 -x86_64.dmg,
下错架构会直接闪退。
Windows 提示「已保护你的电脑」→ 点「更多信息」→「仍要运行」;
macOS 被拦 → 在「应用程序」里右键点 Jarvis → 打开 → 打开(双击不行,必须右键走一次)。
会在浏览器里打开一个进度页:准备 Python 组件 → 下载约 1 GB 语音模型(国内镜像优先)。 这一步要联网,且只做一次。
C:\Users\<你>\.jarvis\ 目录被创建,里面有模型与配置。卡住怎么办:进度页上的日志会写明卡在哪个包/哪个模型。国内网络问题优先看是不是模型下载地址走了境外源。
弹窗会让你选服务商、粘 API Key、点「测试连接」。它测试的是两件事:对话 + 工具调用——这个设计很关键, 因为很多「看起来能用」的模型配置,一让它开灯就露馅。
deepseek-chat、
通义 qwen-plus、Kimi、智谱 glm-4-flash;本地用 Ollama 的 qwen2.5:7b。
Windows:设置 → 隐私和安全性 → 麦克风 → 允许桌面应用访问麦克风(这一项常被忽略,允许了「应用」不等于允许「桌面应用」)。 macOS:系统设置 → 隐私与安全性 → 麦克风,勾选 Jarvis。
没反应按顺序查:权限 → 输入设备选错(系统默认设备不是你在用的那个)→ 距离太远(唤醒词对信噪比敏感)。
33.6 路线 B:从源码跑起来(Windows 为主)
python --version # 必须 3.10 及以上
where python # 看是不是 Windows 商店的假 python
git --version
nvidia-smi # 可选:本地跑 Ollama 才需要
①
python 指向 Windows 应用商店的占位程序(敲下去弹商店)。用 py -3.11 或装官方 Python 并勾选 Add to PATH。② 不要把项目放在含中文或空格的路径下(如「桌面/新建文件夹」)。Python 建虚拟环境、编译某些依赖时会对路径敏感,
C:\dev\GDDXX-Jarvis 这种最省事。
python -c "import sys;print(sys.version)" 输出 3.10+,且路径不是 WindowsApps 下的。
cd C:\dev
git clone https://github.com/shitoudaidi/GDDXX-Jarvis
cd GDDXX-Jarvis
# 网络不通时的备选:走镜像前缀(把原地址接在后面)
git clone https://ghproxy.net/https://github.com/shitoudaidi/GDDXX-Jarvis
dir 能看到 jarvis\、hud\、app\、platform\、tests\ 五个目录,
和 README 里的结构对得上。
python app\install.py
这个脚本做三件事:建虚拟环境、装 Python 依赖、下载语音模型(约 1 GB),并自动打开进度页。 它不是「装完就完」的脚本,而是一个有 UI 的安装器——所以别关那个浏览器页面,它是唯一的进度来源。
① 项目目录下出现虚拟环境目录(
.venv 或 venv)② 进度页走到 100%,没有红色报错行
③
C:\Users\<你>\.jarvis\ 下出现模型文件与 config.json
python app\launch.py # 打开窗口;语音服务随窗口启动和退出
如果不想花 API 的钱,用第 32 章装好的 Ollama。在「接入大脑」里选 OpenAI 兼容 / Ollama,填三项:
| 字段 | 填什么 | 注意 |
|---|---|---|
| Base URL | http://127.0.0.1:11434/v1 | 必须带 /v1;客户端自己会拼 /chat/completions |
| API Key | ollama(随便填) | Ollama 不校验,但留空有些 SDK 会直接报错 |
| 模型名 | qwen2.5:7b 或 ollama list 里的原名 | 要带 tag;模型必须会工具调用,否则只能聊天 |
curl.exe http://127.0.0.1:11434/v1/models 有返回,再回界面点「测试连接」。顺序很重要:外部先通,再回界面配。反过来做,你分不清是网络问题还是界面问题。
从底往上,逐级确认。任何一级没过,不要往下走。
| 级别 | 验证动作 | 通过标准 | 没过说明 |
|---|---|---|---|
| L1 | python app\launch.py | 窗口出现 | 启动器或依赖有问题 |
| L2 | 看 HUD 动画 | 空闲态有动画、不卡顿 | 前端资源加载失败 |
| L3 | 说「Hey Jarvis」 | 切到聆听态 | 麦克风 / 唤醒模型 / 权限 |
| L4 | 说「今天有什么安排」 | HUD 出现识别出的文字 | ASR 或设备采样率 |
| L5 | 等它回答 | 有语音 + 中文字幕 | 模型配置或 TTS |
| L6 | 说「打开记事本」 | HUD 出现工具调用,动作真的发生 | 模型不支持 function calling |
33.7 路线 C:只跑 HUD,改界面不用碰语音
cd hud
python -m http.server
浏览器打开终端里提示的地址(默认 http://localhost:8000),就能看到完整界面,
没有语音服务时用内置演示回复。这一条对做界面的人极其友好:
33.8 本地改造:四件最值得做的事
改造一:把大脑换成本地模型
参考 31.6 的 Step 4。要点只有一个:不是所有本地模型都会工具调用。 7B 级别里,Qwen2.5 系列的工具调用相对可靠;更小的模型(3B 以下)经常「说它要调工具,但参数是编的」。
description——
这两件事经常被混为一谈,然后无脑换更大的模型。
改造二:换成你想要的音色
默认的管家音色是社区训练的 Piper 模型,仅供个人非商业使用。如果要商用或想要中文音色, 可以换 Piper 的中文模型,或接到本地 TTS(如 CosyVoice / GPT-SoVITS),也可以接系统语音(Windows SAPI / macOS say)先跑通再说。
判断标准不是「像不像人」,而是三条工程指标:首字延迟(能不能在 500ms 内出声)、可打断性(能否立即停)、 长文本稳定性(念三千字会不会崩)。很多音色好听的方案,第一条就过不了。
改造三:写你自己的第一个插件
最稳的路径不是从零写,而是照抄一个现成插件(比如高德天气那个),把它改成你要做的事。 下面是一个「查本机状态」这类零依赖插件的骨架,用来理解一个工具需要哪几块:
# 结构示意,实际签名以仓库 docs/extend.md 为准
# 目标:让 Jarvis 能回答「我这台机器现在忙不忙」
import shutil, os
TOOL = {
"name": "machine_load",
"description": "查询本机 CPU 核数与磁盘剩余空间。用户问电脑卡不卡、还能不能装东西、磁盘满没满时使用。",
"parameters": {"type": "object", "properties": {}, "required": []},
}
def run():
total, used, free = shutil.disk_usage(os.path.abspath(os.sep))
return (f"CPU 核心 {os.cpu_count()},"
f"磁盘剩余 {free // (1024**3)} GB / 共 {total // (1024**3)} GB")
def provide():
return TOOL, run
① 单独
python -c "import ...; print(run())" 能出结果 → 逻辑对② 启动后问「磁盘还剩多少」→ 能触发 → 注册对
③ 问「今天天气怎么样」→ 不应该触发这个工具 → 描述没写宽
第三条最容易被跳过,但它决定了工具多了以后会不会互相抢活。
改造四:管好 ~/.jarvis/
| 里面有什么 | 为什么值得单独管 | 建议 |
|---|---|---|
| API Key 与配置 | 泄露等于别人替你花钱 | 只本机保存,不要提交到 git;换机时单独拷 |
| 长期记忆 | 它是「懂你」的来源,也是隐私最重的地方 | 定期导出看一眼,删掉不该记的 |
| 日程 | 丢了比模型不可用更烦 | 跟着系统日历或笔记同步一份 |
| 声纹 | 生物特征,无法更换 | 不外传、不上传网盘 |
| 自定义全息模型 | ~/.jarvis/holo/ 放你自己的 3D 资产 | 体积大,备份时排除 |
33.9 打包与开机自启
# Windows(需要 Inno Setup 6)
powershell -File platform\win\build.ps1
# macOS
bash platform/mac/build.sh
打包这件事,开源项目最容易在三个地方被卡住:代码签名(没有证书,用户每次安装都要手动放行)、 模型分发(体积与许可证双重限制,所以它选择运行时下载)、依赖体积(Python 打包动辄几百 MB)。
开机自启三种做法,按侵入性排序:① 启动文件夹放快捷方式(最简单,用户可见可删); ② 注册表 Run 键(隐蔽,容易被安全软件盯上);③ Windows 服务(最稳,但没法交互、拿不到麦克风)。 语音助手适合第 ① 种——它需要麦克风和界面,本质上是个「用户会话内的程序」,不是服务。
33.10 落地前必须想清楚的三件事
本 章 小 结
这个项目最值钱的不是「贾维斯」这个壳,而是三个工程判断:把 7×24 常驻的部分全部放本地(否则隐私和成本都撑不住)、
把界面和语音拆成两个进程(否则改一次动画要重启整个系统)、
把能力做成可插拔的文件(否则加一个功能就要动主程序)。
而「本地落地」这件事,真正的分水岭不在装没装上,而在你有没有走完那条六级验证链——
能跑到 L4 只是「能听」,跑到 L6 才叫「能做」。
行动建议:先按路线 A 用一周,记下你真正说过的每一条指令。如果两周后你还在用它,
再按路线 B 拉源码,把你最高频的那一条做成插件——一条自己写的插件,比装十个现成的更能让你理解这套系统。
GitHub 20 个 AI 工程系统性分析:从推理内核到应用外壳
五层架构 · 核心抽象 · 可复用设计
- 五层模型:推理内核 / 接入协议 / 编排框架 / 执行体 / 质量观测
- 每层的代表项目、核心抽象、适用边界
- 从这七个 Agent 产品里提炼的四条 Harness 设计共识
- 三套可直接采用的组合:个人 / 团队 / 企业私有化
这一节不按 star 数从高到低罗列——那样得到的是一张「收藏夹」,不是一张「架构图」。 我按它在系统里所处的位置分成五层:越往下越接近硬件与协议,越往上越接近用户。 看懂这五层的关系,你就能判断一个新项目到底属于哪一层、能不能和你现有的东西拼起来。
34.1 五层模型:一个 AI 应用到底由什么组成
模型怎么跑起来:Ollama / vLLM / llama.cpp
解决「把一个权重文件变成能接受请求的服务」。核心指标是吞吐、显存利用率、首 token 延迟。这一层不关心业务,只关心算力效率。
模型怎么接外部世界:MCP / LiteLLM / Firecrawl
解决「统一接口」和「拿到数据」。前者让 M 个模型和 N 个工具不再需要 M×N 套适配,后者让模型能读到网页、文档、数据库。
流程怎么组织:LangChain / Dify / Langflow / n8n
解决「多步骤、多模型、多工具怎么串」。核心抽象是 Chain / Node / Graph,差异在于偏代码还是偏可视化、偏开发还是偏运营。
谁来干活:Claude Code / Codex CLI / OpenClaw / Superpowers / Hermes
解决「让模型在真实环境里完成长任务」。这一层的竞争不在模型,在 Harness:上下文管理、工具设计、权限、循环控制。
怎么证明它对:Langfuse / Promptfoo / garak
解决「不可调试、不可验证」。没有这一层,前四层都是黑盒——能跑,但不敢改,也不敢上线。
34.2 L1 推理内核:三个项目,三种取舍
| 项目 | star | 核心抽象 | 关键设计 | 什么时候选它 |
|---|---|---|---|---|
| Ollama | ~182k | Model + Modelfile | 把「下载权重、量化、起服务、暴露 OpenAI 兼容 API」打包成一条命令。Modelfile 类似 Dockerfile,可固化系统提示词与参数。 | 本地开发、个人使用、快速验证。不适合高并发生产 |
| vLLM | ~93k | PagedAttention + Continuous Batching | PagedAttention 把 KV Cache 像操作系统管理内存页一样分块管理,显存碎片大幅减少;连续批处理让不同长度的请求混在一批里跑,吞吐提升数倍。 | 自建推理服务的生产环境,多用户并发 |
| llama.cpp | — | GGUF 格式 + 量化 | 纯 C/C++ 实现,CPU 也能跑;GGUF 把权重和元数据打包,支持 Q4_K_M 等量化档位。Ollama 底层就是它。 | 边缘设备、无 GPU 环境、嵌入式 |
细节点:为什么 vLLM 的吞吐能高出普通实现数倍?两个原因—— ① 传统批处理要等最长的那条请求跑完才能释放整批,短请求被拖死;连续批处理让完成的请求立刻退出、新请求立刻补位。 ② KV Cache 按固定长度预分配会浪费大量显存(实际对话长度远小于上限),PagedAttention 按需分配 16 个 token 一页,显存利用率从 20~40% 提升到 90% 以上。
34.3 L2 接入与协议:把 M×N 变成 M+N
star ~90k(参考实现合集)
核心抽象:Tools / Resources / Prompts 三类原语。
设计要点:Server 只描述能力,不决定何时调用——调度权在客户端。这是它能跨厂商通用的原因。
可复用:给内部系统写一个 MCP Server,比给每个 AI 工具写适配器便宜一个数量级。
star ~60k
核心抽象:统一的 OpenAI 格式请求 + 路由策略。
设计要点:把 100+ 供应商的差异(参数名、返回结构、错误码)全部磨平;支持重试、降级、按 key 计费、限流。
可复用:任何「不想被单一模型供应商绑定」的系统,都该加这一层。
star ~193k
核心抽象:scrape / crawl / search / extract。
设计要点:把网页转成 LLM 友好的 Markdown,处理 JS 渲染、反爬、分页、结构化抽取。这是 AI 读网页的事实标准入口。
可复用:RAG 的文档来源里,网页部分不要自己写爬虫。
34.4 L3 编排框架:四个流派
| 项目 | star | 流派 | 核心抽象与设计 | 适合谁 |
|---|---|---|---|---|
| LangChain | ~148k | 代码优先的 SDK | Chain / Runnable / Tool / Memory。核心价值是抽象层:换模型、换向量库只改一行。代价是抽象层厚,出问题难定位。 | 工程师,需要灵活控制每个环节 |
| Dify | ~159k | 一体化平台 | 应用 / 工作流 / 知识库 / 模型供应商四大模块。带可视化编排、API 发布、运营后台。设计取向是「让非工程师也能交付」。 | 业务团队、需要快速上线内部工具 |
| Langflow | ~156k | 可视化 + 可导出代码 | 节点图即程序。与 Dify 的差别在于它更接近「开发工具」——每个节点可查看底层代码,可导出成 Python 服务。 | 想可视化但不想被平台锁定的团队 |
| n8n | ~208k | 自动化平台(AI 是新增能力) | 触发器 + 节点 + 400+ 集成。它本质上不是 AI 框架,是工作流自动化工具,近几年加了 AI 节点。 | 已有大量 SaaS 系统需要串联的场景 |
| ComfyUI | ~141k | 生成式计算图 | 节点是纯函数,边是数据流,整张图可序列化。与上面四个不同:它编排的是张量,不是 API 调用。 | 图像/视频生成流水线 |
34.5 L4 执行体:七个 Agent 产品,拼的是 Harness
这一层是 2026 年最拥挤的赛道。它们的模型能力都来自少数几家供应商,真正的差异全在 Harness—— 怎么给上下文、怎么设计工具、怎么控制循环、怎么让人介入。
| 项目 | star | 形态 | Harness 上的关键设计 |
|---|---|---|---|
| OpenClaw | ~392k | 跨平台通用执行体 | 跨操作系统、跨应用执行。核心难点是不同环境的动作抽象——同一个「打开文件」在三个系统里是三种实现,它做了一层归一化。 |
| Superpowers | ~303k | 技能框架 + 方法论 | 把「怎么做一类任务」固化成技能包(skill),Agent 按需加载。设计价值在于:能力可以像插件一样增量扩展,而不用重训模型。 |
| Hermes Agent | ~256k | 会成长的个人 Agent | 持久记忆 + 偏好学习。核心是记忆的写入策略:什么值得记、什么时候忘、怎么检索——这决定它「越用越懂你」还是「越用越乱」。 |
| AutoGPT | ~188k | 自主任务分解 | 最早把「给目标,自己拆」做成产品的项目。它的历史价值大于当前价值:证明了纯自主 Agent 在长任务上不可靠,从而催生了后来的 Harness 思路。 |
| Claude Code | ~153k | 终端编码 Agent | 四个关键机制:权限模式(哪些命令要批准)、Hooks(工具调用前后跑你自己的检查)、MCP 接入、插件市场。它是「Harness 决定体验」的最好例证。 |
| Codex CLI | ~126k | 本地编码 Agent | 本地执行 + 沙箱。设计取向是「尽量少打扰」——默认自动执行低风险操作,只在危险动作前询问。 |
| Gemini CLI | ~107k | 终端 Agent | 把 Gemini 直接搬进命令行。差异化在于超长上下文——可以把整个仓库塞进去,减少检索环节。 |
34.6 L5 质量与观测:被严重低估的一层
| 项目 | star | 解决什么 | 核心能力 |
|---|---|---|---|
| Langfuse | ~35k | 追踪 + 评测 + 提示管理 | 记录每次调用的完整链路(输入、输出、token、耗时、工具调用),支持按 trace 回放、按版本对比提示词效果、跑数据集评测。开源可自托管。 |
| Promptfoo | ~25k | 提示词与 Agent 的回归测试 | 声明式配置:给一组测试用例 + 断言,命令行跑,进 CI。支持红队测试(自动生成攻击用例)。把 AI 测试变成工程流程,这是它最大的价值。 |
| garak | ~9k | 模型漏洞扫描 | NVIDIA 开源,内置大量探针(越狱、泄露、偏见、注入),扫描模型输出并给出风险报告。相当于模型层面的漏洞扫描器。 |
| NeMo Guardrails | ~7k | 可编程的输入输出护栏 | 用类似 DSL 的方式定义「什么能进、什么能出、什么话题要拒答」,在模型之外加一层确定性规则。 |
为什么这一层的 star 普遍不高?因为它不产生「惊艳的 demo」。但没有它,你的项目会停在「演示能用、上线不敢」的状态。 这一层的投入回报不在前期,在第一次出事的时候。
34.7 三套可直接采用的组合
| 场景 | 技术栈组合 | 为什么这么配 |
|---|---|---|
| 个人 / 学习 | Ollama(本地跑模型) + Claude Code 或 Codex CLI(写代码) + Dify(搭小应用) + Promptfoo(简单回归) | 全部零成本或低成本,能在笔记本上跑通全链路。目标是理解每一层在干什么,不是追求性能。 |
| 中小团队产品 | LiteLLM(统一网关) + LangChain 或 Langflow(编排) + Qdrant / pgvector(向量) + Langfuse(观测) + Promptfoo(CI 回归) | 保留代码控制力,同时有观测和回归。避免被单一平台锁定,也不至于从零造轮子。 |
| 企业私有化 | vLLM(自建推理) + MCP Servers(接内部系统) + 自研 Workflow 或 Dify 私有部署 + NeMo Guardrails(护栏) + Langfuse 自托管 | 数据不出内网是硬约束。代价是运维成本高,需要专人维护推理集群与模型版本。 |
本 章 小 结
按层选型,不按 star 选型。star 反映关注度,不反映工程质量。
如果只能读一个项目的源码,读 vLLM 的 PagedAttention——它把「显存管理」用「操作系统分页」类比解释得非常干净,理解后你对「推理为什么贵」会有量化直觉。
2026 前沿 AI 二十项:正在改变工程判断的东西
模型 / Agent / 世界模型 / 协议 / 应用
- 2026 年五个方向:模型能力、Agent 架构、世界模型、协议、应用形态
- 哪些是真变化,哪些只是榜单刷新
- 三个判断:模型商品化、权限设计重构、评测能力升值
- 「宣称」与「已验证」的区分方法
这一节只收录会改变你技术判断的东西,不收录单纯的榜单刷新。 判断标准是:它是否让「以前做不到的事」变得可做,或者让「以前的做法」变得过时。
35.1 模型能力:从「更大」转向「更长、更稳、更省」
| # | 方向 | 是什么 | 为什么重要 |
|---|---|---|---|
| 1 | 长链路任务稳定性 GPT-6 Astra Pro 等 |
不再只比拼单轮回答质量,而是比「连续 50 步操作后仍不跑偏」。 | 这是 Agent 能否落地的核心指标。单轮准确率 95% 的模型,50 步连乘后只剩 7.7%——长链路的错误累积才是真瓶颈。 |
| 2 | 超长上下文常态化 百万级 token 成为主流配置 |
整仓库、整本年报可以直接放进上下文,不再强依赖检索。 | 会削弱「RAG 必须做」的论断,但不取消它——成本与中段丢失问题仍在。正确姿势是「长上下文兜底 + 检索优先」。 |
| 3 | 端侧小模型 MoE + 2bit 量化,24GB 显存可跑 |
把可用模型压到消费级 AI PC 上本地运行,覆盖问答、轻量代码、视觉理解。 | 隐私敏感场景(医疗、法务、个人助理)出现新的可行解。「必须上云」不再是默认假设。 |
| 4 | 原生多模态基座 通义 / 文心 / 智谱 / DeepSeek 等 |
从预训练阶段就用图文音视频混合数据,而不是「视觉编码器 + 语言模型」的拼接方案。 | 跨模态推理更自然(能直接比较「这段音频的情绪」和「这张图的气氛」)。拼接式方案在复杂跨模态任务上会显出天花板。 |
| 5 | 推理成本持续下探 | MoE 稀疏化 + 量化 + 推理引擎优化,同能力价格一年降一个数量级。 | 改变了 ROI 计算:去年算不过账的场景,今年可能就成立。做技术方案时要按「明年价格」规划,不是按今天。 |
35.2 Agent 架构:从「会用工具」到「会造工具」
| # | 方向 | 是什么 | 对工程的影响 |
|---|---|---|---|
| 6 | Agent 团队 / 多智能体产品化 | ChatGPT 等产品上线「AI 团队」:按角色分工执行调研、撰写、分析、编码,用户统一管控进度并合并结果。 | 多智能体从「框架能力」变成「产品形态」。但成本与一致性问题没消失,个人用户会先感受到账单。 |
| 7 | Harness² · 运行时自改工具 | 模型在运行过程中自主改写、优化外挂工具的代码,动态适配任务,不再只能调固定工具。 | 从「工具使用者」变成「工具开发者」。这是安全边界的重大变化——模型能写代码并执行,权限设计必须重做。 |
| 8 | Self-Harness · 元认知 | Agent 观察自己的执行过程,自行优化约束规则(提示、工具集、循环策略)。 | 从「人调 Agent」到「Agent 调自己」。风险是优化目标可能偏离人的意图——需要外部评测兜底。 |
| 9 | Agentic Cloud | 云厂商把存储、数据库、消息队列等能力升级为「Agent-Ready」:接口、权限、计费都按 Agent 调用设计。 | 基础设施层开始为 Agent 重构。选型时要问:这套云服务是给人用的,还是给 Agent 用的? |
| 10 | Agentic Streaming 如 Flink 3.0 的事件驱动 Agent |
把 Agent 嵌进实时流处理:视频、音频、图像、文本统一流式处理并实时响应。 | Agent 从「请求-响应」走向「持续在线」。 监控、直播、工业质检这类场景出现新解法。 |
| 11 | Agent 原生评测基准 如 AgentWorldBench |
不再只测问答准确率,而是在模拟环境中测多步任务完成率。 | 终于有了一把能衡量「Agent 到底行不行」的尺子。自己建评测时也应照这个思路:测任务完成,不测回答相似度。 |
35.3 世界模型与具身:AI 开始理解物理世界
| # | 方向 | 进展 | 意义 |
|---|---|---|---|
| 12 | 实时世界模型 | 字节等团队公开演示端到端约 50ms 延迟、约 20fps 的实时场景生成与物理推演。 | 可用于开放世界游戏、数字孪生、机器人仿真——这些场景以前只能靠游戏引擎手工建模。 |
| 13 | 统一全模态架构 | 用一套架构(如 UiT)同时处理文本、图像、视频、3D,而非多个专用模型拼接。 | 跨模态一致性更好,训练与部署成本更低。这是「一个模型干所有事」路线的重要验证。 |
| 14 | 语言世界模型 / Agent 仿真环境 | 在语言空间里模拟智能体交互环境,用于训练与评测 Agent。 | 解决「Agent 训练缺少真实环境」的问题。相当于给 Agent 造了一个飞行模拟器。 |
| 15 | 具身智能落地 | 头部厂商入局人形机器人;世界模型与机器人训练数据生成结合。 | 软件侧的进展开始向硬件迁移。短期内真正的瓶颈在数据采集与安全性,不在模型。 |
35.4 协议与工程:让系统能拼起来
工具接入从「每家写一套适配器」变成「实现一次 Server」。生态成熟后,「有没有 MCP Server」会成为评估一个 SaaS 是否能被 AI 使用的标准。 对企业来说,这意味着采购决策多了一条:这个系统能不能被 Agent 接进去。
Agent 之间的任务委派开始有标准(Agent Card + Task)。短期价值有限,长期影响很大: 当每个部门都有自己的 Agent,没有统一协议就会形成新的烟囱。
ColBERT 式多向量检索(token 级匹配)与 Matryoshka 降维(一个向量可截断使用)同时成熟。 前者提精度,后者降成本——这让「高精度检索」第一次在成本上可接受。
从 CoT(线性)→ ToT(树)→ DoT(图)的演进,配合 test-time compute 的工程化(多想几步再回答)。 代价是 token 消耗成倍增长,所以正确的用法是路由:简单任务走快模型,难题才付这个钱。
35.5 应用形态:内容生产被彻底重构
| # | 形态 | 变化 | 对从业者的影响 |
|---|---|---|---|
| 20 | AI 视频智能体 | 从「文生视频片段」走向「全流程智能体」:选题、剧本、分镜、生成、剪辑、发布串成一条产线,且成片可继续编辑(见 25.1 OpenFilm)。 | 剪辑师的工作重心从「操作软件」转向「判断与审美」。会写提示词不够,得懂叙事结构。 |
| — | 无限时长内容创作 | 不是把视频拉长,而是把创作流程拆成多个可执行环节,由多个 Agent 协同完成(理解需求 → 规划故事线 → 分镜 → 素材 → 长视频输出)。 | 「一个人做一个团队的事」从口号变成可交付。但质量稳定性仍是主要瓶颈。 |
| — | 过程可视化产品 | 把 Agent 的检索、决策、交接渲染成可看的动画(见 25.2 / 25.4)。 | 解决「AI 不可信」的一种非技术路径:不是让它更准,而是让它更可理解。 |
35.6 三个我建议你重点关注的判断
「模型能力」正在变成商品,「系统能力」才是壁垒
当所有厂商都能调用同一批模型时,差异只能来自:你的数据、你的流程、你的评测集、你的 Harness。这四样都无法从外部买到,只能自己积累。所以别把精力全花在追新模型上。
「能写代码的 Agent」会重定义权限设计
当 Agent 能自己写工具并执行,传统的「工具白名单」就失效了——因为它写的代码本身就是一个新工具。接下来的关键问题是:如何给「会写代码的执行体」划边界。这会是未来两年最难的工程问题之一。
评测能力会比提示词能力更值钱
提示词技巧正在被模型进步抹平(新模型对烂提示词的容忍度越来越高),但「如何证明系统有效」这件事不会自动解决。会建评测集、会设计指标、会做归因分析的人,在团队里的不可替代性更高。
本 章 小 结
这一章的价值不在「知道有哪些新东西」,在「知道哪些新东西会改变你的技术判断」。
我的判断是:模型能力正在变成商品,系统能力才是壁垒——你的数据、流程、评测集、Harness,这四样买不到。
Agent 开发工程师:这个岗位到底要会什么
能力模型 / 九项核心技能 / 分级 / 面试
- 能力模型六块二十一项,每一项的达标标准
- 九项核心技能的具体做法:上下文、工具、循环、记忆、评测、可观测、成本、安全、协作
- 三级能力(L1 集成 / L2 设计 / L3 平台)的标志
- 十二个真会问的面试题与答法
先说清楚一个事实:Agent 开发工程师不是「会调 API 的后端」。 这个岗位真正难的地方,是「让一个概率系统在真实世界里稳定交付」——它横跨工程、数据、产品和运维四块, 但又不需要你在任何一块做到专家。
36.1 能力模型:六块,二十一项
下面这张表可以直接拿去对照自己的水平,也可以拿去写 JD。每一条都给了「达标」的具体标准—— 判断一个人会不会,不要问「你了解 ReAct 吗」,要问他「你怎么防止 Agent 死循环」。
| 能力块 | 具体技能 | 达标标准(能做到才算会) |
|---|---|---|
| ① 工程基础 | 一门后端语言 | Python 或 TypeScript 熟练;能写异步、能处理并发、能读懂别人的框架源码 |
| API 与异步 | 能处理流式响应、超时、重试、限流;知道 SSE 和 WebSocket 的区别与选型 | |
| 数据存储 | 能设计会话表、任务表、状态表;理解幂等键的作用 | |
| 部署运维 | 能容器化、配环境变量、看日志、定位 OOM 与超时 | |
| ② 模型理解 | 能力边界 | 能判断一个需求「模型能不能做」,并说清失败模式 |
| 上下文机制 | 能算 token 预算、知道中段丢失、会做上下文压缩 | |
| 采样参数 | 知道温度、top-p 对任务的影响,能针对任务给出参数建议 | |
| 成本模型 | 能算出「每个请求多少钱」,并说清成本结构(输入/输出/重试) | |
| ③ 上下文工程 | 装配 | 能给不同来源分配 token 预算,知道什么该放首尾、什么该裁掉 |
| 压缩 | 会做对话摘要、工具返回摘要、状态外置 | |
| 检索集成 | 能接 RAG,并判断「检索问题还是生成问题」 | |
| 提示结构 | 能写出稳定、可测试、可版本化的提示模板 | |
| ④ 工具与循环 | 工具设计 | 能写出模型「用得对」的工具描述与参数 schema |
| 循环控制 | 能实现 ReAct 并加终止条件、重复检测、异常兜底 | |
| 错误处理 | 能区分「可重试」「需换策略」「必须人工」三类失败 | |
| 多步编排 | 能判断何时该拆 Agent、何时该用 Workflow | |
| ⑤ 质量保障 | 评测集 | 能从真实数据建 50~200 条评测集,定义指标 |
| 可观测 | 能记录完整 trace,出问题能回放定位 | |
| 回归 | 能把评测接进 CI,改动前后有对比 | |
| ⑥ 安全与协作 | 权限设计 | 能设计白名单、沙箱、人工闸门;知道注入怎么防 |
| 跨职能沟通 | 能向产品解释「为什么做不到 100%」,向运维解释「为什么需要这个权限」 |
36.2 九项核心技能:每一项的具体做法
上面是「有什么」,下面是「怎么做」。这九项是拉开差距的地方,也是面试真正会问的地方。
① 上下文工程:不是「塞满」,是「取舍」
新手把所有东西都塞进去,然后抱怨「模型记不住」。正确的做法是把它当成有限预算的排版问题。
| 上下文来源 | 建议预算 | 取舍规则 |
|---|---|---|
| 系统提示(身份+约束) | 8%~12% | 固定不变,放最前。超过这个比例说明你在用提示词写业务逻辑,应该挪到代码里 |
| 当前任务与用户输入 | 10% | 放最前或最后,不要埋中间 |
| 检索到的资料 | 40%~50% | 只留最相关的 3~5 段;每段标注来源编号 |
| 历史对话 | 15%~20% | 近 3 轮保留原文,更早的压缩成要点 |
| 工具返回 | 10%~15% | 只留结论,不留原始 JSON——这是最容易被浪费的一块 |
| 输出预留 | 15%~20% | 必须留。不留就会出现「回答被截断」 |
改法:工具返回后先用代码做一次字段裁剪,只保留 3~5 个关键字段,格式化成一行文本。
结果:上下文从 8000 token 降到 1200 token,成本降 85%,准确率反而上升——因为噪音少了。
② 工具设计:模型用得对不对,取决于描述
工具调用失败,八成不是模型笨,是描述写得像给人看的文档,不像给模型看的指令。
name: search
description: 搜索信息
问题:什么时候用?搜什么范围?返回什么?模型只能猜。结果是要么不调,要么乱调。
name: search_orders
description: 当用户询问订单状态、物流进度、退款进度,
且已提供订单号时使用。若缺少订单号,
先向用户索取,不要调用本工具。
关键是条件式描述:什么情况用、什么情况不用。
- 命名要动词开头、范围明确:
get_user_profile优于user。 - 参数要给类型、范围和示例:
date: "YYYY-MM-DD,如 2026-11-01",比date: string有效得多。 - 写操作要幂等:带
idempotency_key,否则重试会造成重复下单。 - 错误要返回可行动的信息:「参数 city 不在支持列表内,可选:北京、上海」比「400 Bad Request」有用一个量级。
- 工具数量控制在 20 个以内,超过就分层:先给 5 个粗粒度工具,需要时再展开。
③ 循环控制:三道闸,缺一不可
for step in range(MAX_STEPS): # 闸一:最大轮次
if cost_used > BUDGET: break # 闸二:成本上限
action = model.decide(context)
if action.type == "final": return action.answer
result = execute(action)
if is_repeat(action, history): # 闸三:无进展检测
context.append("你已重复相同操作,请换策略或直接给出结论")
context.append(result)
return fallback_answer(context) # 兜底:给出已获得的部分结论
三个细节值得单独说:无进展检测不能只比对工具名,要比「工具名 + 参数」;兜底不能返回空, 要返回「已完成什么、卡在哪」——这比「任务失败」对用户有用得多;第 2 次重复就该干预,不要等到第 5 次。
④ 记忆:写入策略比存储方案更重要
| 问题 | 常见做法 | 更好的做法 |
|---|---|---|
| 记什么 | 把所有对话存进向量库 | 只记「结论、偏好、约束」三类。过程性内容不记——它会污染检索 |
| 什么时候记 | 每轮都写 | 会话结束时批量写;或用户明确说「记住这个」时立即写 |
| 怎么取 | 按相似度取 top-5 | 按「人物 + 时间 + 主题」三重过滤后再取,避免取到别人的记忆 |
| 什么时候忘 | 永不删除 | 设 TTL;冲突时以时间新的为准;用户可主动删除 |
⑤ 评测:Agent 要测「轨迹」,不只是「答案」
普通问答测「输出对不对」就够了。Agent 不行——它可能结论对了但过程错了(比如误删了文件又恢复), 也可能过程对但结论错。所以要测三层:
任务完成率、答案正确率、格式合规率。最直观,但掩盖过程问题。
步数、工具调用序列、是否走了无效路径、是否触发人工接管。这一层最容易被跳过,但最能定位问题。
token 消耗、耗时、重试次数。同一个任务,别人 8 步你 30 步,就是设计问题。
⑥ 可观测:出问题时要能回答「它当时看到了什么」
- 每条 trace 必须包含:完整上下文快照(不是摘要)、模型输出、工具调用参数与返回、耗时、token 数。
- 支持按 session 回放:能像看录像一样重看整个执行过程。
- 关键节点打标签:
retrieval_failed、tool_error、loop_detected,方便聚合分析。 - 敏感信息脱敏后再存——日志本身也是数据泄露的高危点。
⑦ 成本:三个杠杆,按效果排序
杠杆一:上下文裁剪(效果最大)
大多数 Agent 的输入有 50% 是浪费的:重复的系统提示、冗长的工具返回、无关的历史。裁掉这些,成本直接砍半,准确率通常还上升。
杠杆二:模型路由(效果第二)
分类、抽取、格式转换用便宜的小模型;只有需要多步推理的环节才用大模型。80% 的调用其实不需要最强的模型。
杠杆三:缓存(效果第三但最省事)
系统提示固定前缀可缓存(多数厂商支持 prompt caching,费用降 50%~90%);相同查询的结果可缓存;检索结果可缓存。
⑧ 安全:三道防线,按层布
| 层 | 防什么 | 怎么防 |
|---|---|---|
| 输入层 | 提示注入 | 外部内容标记为「不可信数据」;用分隔符隔离;对明显指令性内容做检测与剥离 |
| 执行层 | 越权操作 | 默认拒绝 + 白名单;沙箱隔离;写操作二次确认 |
| 输出层 | 敏感信息泄露 | 正则 + 模型双重过滤(身份证、手机号、密钥);外发前人工确认 |
⑨ 协作:三个必须能讲清楚的事
「为什么做不到 100%」——用基线数据说话:人工准确率是 92%,我们做到 89%,接管率 20%。不要说「AI 有幻觉」,要说数字。
「为什么要这个权限」——说清最小必要范围与失效影响,并给出可审计方案(日志、限流、可随时收回)。
「这要花多少钱」——按「单任务成本 × 日调用量 × 1.3 重试系数」给区间,并说明随规模下降的路径。
36.3 三级能力:你现在在哪一级
能把东西拼起来
- 能用 SDK 调模型、接向量库、写工具
- 能跑通一个端到端的 Demo
- 知道常见参数的含义
- 标志:给他一个明确需求,能做出可演示的东西
能让它稳定跑
- 能设计上下文预算、工具边界、循环控制
- 能建评测集并用数据驱动迭代
- 能定位「效果不好」的根因(检索?提示?工具?)
- 标志:给他一个模糊需求,能定义清楚并交付
能让一群人跑
- 能抽象出可复用的 Agent 框架与工具协议
- 能设计多租户、权限、配额、审计体系
- 能制定评测标准与发布流程
- 标志:他不在,团队也能持续交付
36.4 一天长什么样
09:30–10:30 看数据
打开昨天的 trace 面板,看失败样本。挑 5 条最典型的,判断是检索问题、工具问题还是提示问题。这一步决定今天干什么。
10:30–12:00 改设计
通常不是改代码,是改设计:工具描述重写、上下文裁剪规则调整、提示结构重排。改完先在 50 条评测集上跑一遍。
13:30–16:00 写代码 + 补评测
实现改动,同时补 3~5 条新的评测样本——把今天发现的 badcase 变成永久回归项。
16:00–17:30 联调与沟通
和产品对边界、和运维对权限、和前端对流式接口。这部分时间占比通常被低估,但它决定项目能不能推进。
17:30–18:00 看成本
检查今天有没有异常调用(某条路径 token 暴涨、某个工具被反复调用)。成本异常往往是 bug 的第一信号。
36.5 面试题:十二个真会问的
你怎么防止 Agent 死循环?
工具描述怎么写才能让模型调用准确?
用户说「回答不准」,你怎么定位?
· 塞了就对了 → 检索问题(切块、embedding、召回、重排)
· 塞了还是错 → 生成问题(提示模板、上下文过长、指令冲突、模型能力)
五分钟能做完,能省几天瞎调。
什么情况该用 Agent,什么情况该用 Workflow?
你怎么评估一个 Agent 系统的好坏?
成本怎么降?
提示注入怎么防?
多 Agent 什么时候值得?
你怎么做上下文的 token 预算?
线上突然变慢,怎么排查?
你怎么保证改了提示词之后没变差?
如果模型 API 明天涨价 3 倍,你的系统怎么办?
36.6 90 天成长路径
| 阶段 | 做什么 | 交付物(没有就不算完成) |
|---|---|---|
| 第 1–30 天 | 用原生代码(不用框架)实现一个 ReAct Agent,带 3 个工具、循环控制、日志 | 一个能跑的项目 + 一份「它在哪里失败」的分析 |
| 第 31–60 天 | 给它加上 RAG、评测集、trace 面板;做一次成本优化 | 50 条评测集 + 优化前后的数据对比 |
| 第 61–90 天 | 加上权限、沙箱、人工闸门;做一次提示注入的红队测试 | 一份安全评估报告 + 一个可交付的系统 |
本 章 小 结
判断一个 Agent 工程师的水平,看他谈「失败」谈得多细——只谈能力不谈失败的,通常是 L1。
这个岗位的本质:你不是在「用 AI」,你是在给一个不可靠的大脑装一套可靠的身体。模型负责聪明,你负责让它不出事。
FDE:把 AI 装进别人公司的那个人
Forward Deployed Engineer · 能力模型 / 六个动作 / 失败模式
- FDE 与售前 / 解决方案架构师 / 实施 / 客户成功的区别
- 能力四维:技术深度、业务理解、客户沟通、交付管理(缺一维掉一个坑)
- 六个核心动作:场景发现 → 可行性判断 → 72 小时原型 → 价值量化 → 交付变更 → 反馈闭环
- 三种失败模式与四种背景的转型路径
FDE 全称 Forward Deployed Engineer(前置交付工程师),最早由 Palantir 大规模使用, 2024 年后随着企业 AI 落地潮被 OpenAI、Anthropic 等公司重新推到台前。 用一句话说:他是坐在客户办公室里写代码的工程师。
37.1 与五个相近岗位的区别
这个岗位最容易被误解成「售前」或「实施」。区别在于他是否真的动手写代码、是否对结果负责。
| 岗位 | 核心动作 | 是否写代码 | 对什么负责 |
|---|---|---|---|
| 售前工程师 | 讲方案、做演示、赢单 | 偶尔做 Demo | 签单 |
| 解决方案架构师 | 画架构、定技术选型 | 很少 | 方案可行性 |
| 实施顾问 | 配置系统、培训用户 | 偶尔写脚本 | 系统上线 |
| 客户成功 | 维护关系、推动续费 | 不写 | 留存与续约 |
| FDE | 判断场景 → 写原型 → 上线 → 量化价值 | 主力写 | 业务结果 |
| 内部 AI 工程师 | 服务自家业务 | 写 | 内部指标 |
一句话记住差别:售前卖的是「能做什么」,FDE 交的是「已经做到了,这是数字」。
37.2 能力四维:缺一维就会掉进对应的坑
- 能独立写出可用的原型(前端 + 后端 + 模型调用)
- 懂 RAG / Agent / Workflow 的边界,能选对方案
- 能处理脏数据:OCR、格式清洗、字段对齐
- 能部署、能看日志、能算成本
- 缺这一维 → 变成只会做 PPT 的售前
- 能看懂客户的流程:谁发起、谁审批、卡在哪
- 能算清成本结构:这个环节一个人一天做多少
- 知道行业术语与合规红线
- 能判断「这个痛点是不是真痛」
- 缺这一维 → 做出来的东西没人用
- 能对一线员工问到真话(他们最怕被 AI 替代)
- 能对中层讲清边界(不承诺 100% 准确)
- 能对高层讲清钱(投入多少、省多少、多久回本)
- 能管理预期:第一周就演示「它做不到什么」
- 缺这一维 → 项目死于期望落差
- 能在 2~6 周内做出可用版本
- 能拆阶段、设验收点、控范围蔓延
- 能培训、能写文档、能交接
- 能把现场问题提炼成产品需求
- 缺这一维 → 永远在救火,项目无限延期
37.3 六个核心动作:一个 FDE 项目的完整流程
动作一:场景发现(第 1 周)
不要从「我们想做什么 AI」开始,要从「他们每天在哪卡住」开始。 最好的方法是坐在那个人旁边看他干一小时的活,而不是开会问「你有什么痛点」。
| 要问的 | 具体问题 | 判断信号 |
|---|---|---|
| 频次 | 这件事一天做几次?一次多久? | 一天不到一次的,优先级往后放 |
| 卡点 | 哪一步最烦?为什么会卡? | 回答里出现「要翻好几个系统」「要手抄」→ 强信号 |
| 容错 | 做错了会怎样?谁来兜? | 「错了要重做一遍」→ 好场景;「错了要赔钱」→ 高风险 |
| 数据 | 这些资料在哪?能不能导出? | 「在系统里」→ 好;「在个人微信里」→ 先解决数据 |
| 判断标准 | 怎么算做对了? | 能说清 → 可评测;「看情况」→ 先定义标准 |
「这件事你一般做到几点?哪一步最费时间?」
问时间点,不要问感受。时间点会暴露真实流程,感受只会得到礼貌回答。
动作二:可行性判断(第 1 周内)
发现场景之后,FDE 最重要的价值是敢说「这个不做」。判断用四条硬标准,任何一条不过就换场景:
- 高频重复(每天 ≥ 10 次或每周 ≥ 3 小时)
- 错了能被人复核兜住
- 有历史样本可参考
- 「做对了」能被明确判定
- 要求 100% 准确,且错了后果不可逆
- 数据拿不到,或数据在纸质档案里
- 连专家都吵不出对错标准
- 一年只做几次(不如直接请专家)
动作三:72 小时原型
FDE 的原型不是「技术验证」,是让客户看见自己的业务被处理了。 所以原型的标准是:用他们自己的真实数据,跑通一条完整链路,哪怕后面三步是人工补的。
Day 1:拿到 20 份真实样本
不要用脱敏数据,不要用示例数据。真实数据里的脏东西才是难点:扫描件歪了、表格跨页、字段名不一致。
Day 2:跑通主链路
只做一条路径。中间可以有人工补位(Wizard of Oz),但要能端到端演示。
Day 3:加上兜底与失败展示
主动演示三个失败案例,并说明为什么会失败、怎么兜。这一步是建立信任的关键——比演示十个成功案例有效。
动作四:价值量化(最容易被跳过,也最致命)
没有数字,项目到期就会被砍。量化要在原型之前测基线,否则事后没法证明。
| 指标 | 怎么测基线 | 怎么算收益 |
|---|---|---|
| 时间 | 跟 3 个人各计一次时,取中位数 | (基线耗时 − 新耗时)× 日处理量 × 人天成本 |
| 准确率 | 抽 50 份历史件,人工判对错 | 错误率下降 × 单次纠错成本 |
| 吞吐 | 峰值时段能处理多少件 | 多处理的量 × 单件毛利(或避免的外包费用) |
| 体验 | 客户投诉率、返工率 | 较难折算,作为辅助指标 |
动作五:交付与变更管理
- 先给一个人用,再给一个组用。不要一次性铺开——出了问题收不回来。
- 培训要教「什么时候别用它」。只教怎么用,用户会在不合适的场景硬用,然后失望。
- 留人工通道。系统出错时用户能一键回到原流程,这决定他们敢不敢用。
- 设一个「使用者代表」。他替你收集反馈、替你说话,比你自己去问有效十倍。
动作六:反馈闭环
FDE 是唯一同时掌握「客户真实痛点」和「产品能力边界」的人。他的第三个交付物不是系统,是 一份能变成产品需求的结构化反馈:哪些功能被反复要求(说明是通用需求)、哪些定制只此一家(说明该用配置而非开发)。
37.4 一个 8 周项目的节奏
| 周次 | 目标 | 关键动作 | 交付物 |
|---|---|---|---|
| W1 | 选定场景 | 驻场观察、访谈 5 人、测基线 | 场景评估一页纸 + 基线数据 |
| W2 | 原型跑通 | 20 份真实样本,端到端 Demo | 可演示原型 + 失败案例清单 |
| W3–4 | 工程化 | 补权限、日志、重试、人工闸门 | 可试点版本 |
| W5–6 | 试点 | 1 个小组使用,每周收 badcase | badcase 库 + 迭代记录 |
| W7 | 量化 | 对比基线,算 ROI(含隐性成本) | 价值评估报告 |
| W8 | 推广与交接 | 培训、文档、推广计划 | 运营手册 + 产品反馈 |
37.5 三种失败模式
客户说什么就做什么,不做判断。结果做了一堆没人用的功能,项目验收即终点。
病根:不敢说「这个不该做」。
只做 Demo、只讲方案,从不碰真实数据。Demo 很漂亮,一上真实数据就崩。
病根:怕暴露问题,不敢用脏数据。
上线后天天处理用户提问,没有精力做产品化。一个人服务十个客户就到头了。
病根:没把重复问题沉淀成配置或产品能力。
37.6 谁能转 FDE,要补什么
| 背景 | 优势 | 要补的 | 难度 |
|---|---|---|---|
| 后端工程师 | 能写、能部署、能排障 | 业务理解 + 客户沟通;学会「先问值不值得做」 | 低 |
| 前端工程师 | 能快速做出可看的界面 | 后端与数据处理;补模型能力边界 | 低 |
| 数据分析师 | 懂业务口径、会算指标 | 工程能力(部署、接口、权限);这一块最难补 | 中 |
| 实施 / 咨询顾问 | 懂客户、懂流程 | 动手写代码;从「配置」转向「开发」 | 中高 |
| 算法工程师 | 懂模型、懂评测 | 工程化与产品化;从「追求指标」转向「交付结果」 | 中 |
① 「讲一个你判断『这个需求不该做』的例子」——看有没有判断力。
② 「客户说效果不好,你怎么定位」——看有没有工程方法,而不是只会换模型。
③ 「你怎么算这个项目的 ROI」——看会不会算隐性成本。
三个都答得具体的,基本可以用。
本 章 小 结
一句话定义 FDE:坐在客户办公室里写代码的工程师,对结果负责,不只是对功能负责。
这个岗位最值钱的能力不是写代码,是敢说「这个不做」。判断力比技术力更稀缺。
AI 项目经理:从 0 到 1 把不确定的事交付掉
五阶段门 / 五个工具 / 排期与成本 / 三种失败
- 先认清四个不可控源:模型能力、数据质量、用户容忍度、成本曲线——管理动作全是围绕它们设计的
- 五个阶段各有明确的放行条件,不满足就不进下一阶段;这是 AI 项目唯一有效的止损机制
- 五个工具必须会填:能力里程碑 / 风险登记 / 验收三段式 / 干系人地图 / 范围翻译
- AI 项目不能按人天估:不确定性锥在 POC 阶段是 ±200%,排期要用时间盒而不是工作量
- 成本是项目的一等公民:单次成本模型 + 三条止损线,比任何甘特图都重要
- 三种典型失败,以及每种失败在第一个月就能看到的早期信号
传统项目管理的核心假设是:范围可以定清、工作量可以估准、验收可以写死。
AI 项目把这三条全部推翻——范围要靠试才能知道、工作量取决于模型行不行、验收只能写成「达标率」。
所以 AI 项目经理的能力不是「排期更细」,而是在信息不足时做出一连串可回退的决策。
这一章讲的就是这套决策怎么落地成动作。
38.1 先建立判断:AI 项目的四个不可控源
普通软件项目里,不确定性主要来自「人」和「需求」。AI 项目多出来四个技术性的不确定性, 它们不会因为你加班而消失,只能被管理。先把它们认出来,后面的所有工具才有针对性。
| 不可控源 | 它的真实表现 | 对应的管理动作 | 什么时候暴露 |
|---|---|---|---|
| ① 模型能力 | 同一个需求,模型能做到 85%,剩下 15% 不是靠工程能补的——它就是做不到,或者需要换更贵的模型 | POC 先验能力上限,用真实数据测,不用 demo 判断 | POC 阶段;越晚发现代价越大 |
| ② 数据质量 | 文档缺页、表格是图片、同一事实三个版本、历史数据没有标注 | 把数据清洗列为独立工作项,并给它单独的工期与验收 | 总是比你预计的晚两周出现 |
| ③ 用户容忍度 | 90% 准确率在演示时是惊艳,在日常使用中是折磨——用户记住的是那 10% | 设计失败态,并明确「出错时用户能不能自己发现」 | 内测第一周,用户流失时 |
| ④ 成本曲线 | 按调用量线性涨,且 Agent 类应用随轮次指数涨——功能加得越多,单次越贵 | 上线前算清单次成本,设三条止损线 | 上线后第一个完整月 |
38.2 五个阶段:每个阶段做什么、什么条件才能放行
阶段划分的价值不在于「分了几段」,而在于每一段都有一个明确的、可以说不的决策点。 没有放行条件的阶段划分,只是换了个说法的进度汇报。
目标:判断这件事值不值得做。这个阶段花 2–3 天,能省掉后面两个月。
| 问题 | 怎么答(不是拍脑袋) | 不合格的信号 |
|---|---|---|
| ① 痛不痛 | 现在这件事谁在做、一周做几次、每次多久、做错了谁承担 | 「老板觉得应该做」——找不到具体的人和时间 |
| ② 数据在不在 | 做这件事需要的资料,现在存在哪、格式是什么、能不能拿到 | 需要「先把数据整理一下」才能开始时 |
| ③ 错了会怎样 | 如果它答错一次,用户会骂一句还是会造成损失 | 答错即事故,且没有人工复核环节 |
交付物:一页纸的机会说明(痛点、现状、预期收益、不做的理由)。没有这一页,不要进入阶段 1。
目标:用真实数据回答「这件事模型到底能不能做到 85 分」。不做界面、不做权限、不做部署。
关键动作(按顺序):
- 收集 50 条真实样本,覆盖典型场景 + 你认为最难的 10 条
- 人工标出标准答案(这一步不能省,没有它后面全是感觉)
- 选两个模型跑对比(一个便宜的、一个强的),同一个提示词
- 人工逐条判对错,算出准确率,并把错的归成三类
① 最好模型在 50 条样本上准确率 ≥ 80%(低于 70% 基本要换思路,不是换模型)
② 错误可归类,且至少一类错误有工程解(比如「漏了长文档后半段」→ 改切块,能解)
③ 换个更贵的模型能把准确率拉上去(说明是能力问题而不是任务定义问题)
目标:让一件真实任务从头跑到尾,哪怕中间有一步是人做的。 注意是「垂直切片」不是「水平分层」——不做完所有功能的 20%,而是做通一个场景的 100%。
关键动作:
- 选定一条最高频的主路径,其他分支明确写「暂不支持」
- 中间任何环节搞不定,就用 Wizard of Oz:后台人工补位,先把体验跑通
- 做好三个界面:等待中、出错、不确定——这三个占了用户体验的 80%
① 一个真实用户能在不看说明书的情况下完成一次完整任务
② 全程有可观测记录(每一步输入输出能查),否则后面没法调
③ 出错时用户能自己发现并纠正,而不是默默接受错误结果
目标:把「能跑」变成「敢用」,并且建立评测基线。
| 要建立的 | 具体做法 | 为什么现在做 |
|---|---|---|
| 评测集 | 从内测反馈里收集失败案例,扩到 100–200 条,固化成回归测试 | 上线后每次改提示词/换模型,靠它判断有没有退步 |
| 埋点 | 至少三条:任务发起数、完成数、结果被采纳数 | 没有「采纳」这一条,你永远不知道它是被用了还是被无视了 |
| 投诉通路 | 一个按钮:这个结果不对(带上下文) | 这是你唯一低成本获取高质量失败样本的方式 |
目标:在模型抽风、接口超时、成本超标这三种必然会发生的情况下,业务不中断。
上线前必须准备好的四件事:
| 预案 | 具体到可执行 |
|---|---|
| 模型降级 | 主模型不可用时切备用模型,并接受质量下降;提前测过备用模型的分数,写进文档 |
| 功能降级 | AI 不可用时退回到「人工流程」或「上一版界面」,而不是报错白屏 |
| 成本闸门 | 日成本超过阈值自动限流或降级到小模型;这条不做,一次异常流量就是一张超额账单 |
| 灰度 | 先 5% 流量,观察 48 小时的成本、延迟、报错率三条曲线再放量 |
目标:AI 系统有一个反直觉特性——不动的系统会自己变差。用户输入在变、业务规则在变、模型版本在变, 而你的提示词和评测集是去年写的。
三条固定节奏:
- 每月:把新增的失败样本补进评测集,跑一次全量回归
- 每季度:重新评估模型选型(新旧模型价格与能力变化很快)
- 每次变更(提示词、模型、检索策略):必须先跑评测集,分数不降才允许上线
38.3 五个工具:怎么填,填成什么样算合格
工具一:能力里程碑——替代「完成 80%」
「开发完成 80%」在 AI 项目里是没有意义的进度——因为剩下 20% 可能是「永远做不到」。 要用能力而不是工作量来描述进度。
三列法:能力(能做什么)→ 达标标准(多少分算过)→ 验证方式(怎么测出来)。三列缺一不可,缺「验证方式」的那一行就是口号。
| 能力 | 达标标准 | 验证方式 |
|---|---|---|
| 识别合同里的风险条款 | 在 100 份历史合同中,召回率 ≥ 90%,误报率 ≤ 15% | 用已标注的 100 份样本跑,人工复核误报 |
| 每条结论能指回原文 | 定位准确率 ≥ 95%(能指到具体条款而不是整篇) | 抽样 50 条,人工核对位置 |
| 遇到没见过的合同类型不瞎猜 | 越界输入 20 条,100% 输出「建议人工审阅」而非编造 | 构造 20 条越界样本(外文、手写、非合同) |
| 响应速度 | P95 端到端 ≤ 25 秒(50 页合同) | 压测 50 次取 P95,不是平均值 |
工具二:风险登记表——AI 项目专属的五条
通用风险(人员流失、需求变更)不用在这里重复。下面五条是 AI 项目特有的,几乎每个项目都会中至少两条。
| 风险 | 触发信号(早期) | 应对类型 | 具体动作 |
|---|---|---|---|
| 模型能力不达标 | POC 准确率在 70% 附近徘徊,加提示词只涨 1–2 个点 | 缓解 → 可能需要转移 | 换任务定义(缩小范围)、换模型、或改成「人机协同」形态 |
| 数据不合规 | 客户问「我们的数据会不会被用来训练」 | 规避 | 改为私有化部署 / 脱敏 / 只发必要字段;这一条不能靠「承诺」解决 |
| 成本超支 | 内测期 token 消耗是你估算的 2 倍以上 | 缓解 | 上缓存、分层路由、限制上下文长度、设日成本闸门 |
| 供应商锁定 | 代码里模型名硬编码在十几个地方 | 缓解 | 统一走一层网关/适配器;评测集保证换模型时能快速验证 |
| 用户误用 | 用户开始直接采纳输出、跳过复核 | 接受 + 缓解 | 界面上保留「需人工确认」的强制步骤;关键结论必须带出处 |
工具三:验收标准——三段式,而不是一句话
传统验收写「功能符合需求文档」。AI 项目的验收必须写三段,第三段是多数人漏掉的,也是上线后扯皮的根源。
| 段 | 写什么 | 示例(合同审阅助手) |
|---|---|---|
| ① 边界内 | 能力范围内的典型场景,要求做到什么程度 | 10 类常见合同条款,每类 10 份样本,≥ 9 份识别正确,共 100 份 |
| ② 边界外 | 超出能力时,必须怎么表现 | 外文合同、手写扫描件、非合同文档 20 份,100% 输出「建议人工审阅」,0 次编造 |
| ③ 失败时 | 系统异常时的行为与文案 | 超时 / 解析失败 / 模型不可用三种情况:不得白屏、不得返回空结果,需给出原因和下一步建议 |
工具四:干系人地图——四类人,四种说法
AI 项目最常见的沟通事故,是用同一套话对四类人讲。他们对「这个系统好不好」的判断标准完全不同。
| 角色 | 他真正关心的 | 你该给他的东西 | 别跟他说 |
|---|---|---|---|
| 业务负责人 | 省了几个人、快了多少、客户有没有投诉 | 业务指标前后对比(人天、时长、投诉率) | 准确率 92.3% 这种数字,他无感 |
| 技术负责人 | 架构是否可维护、模型换了怎么办、出事能不能查 | 架构图、降级方案、评测与可观测方案 | 「业务方很满意」 |
| 一线使用者 | 会不会给我添活、错了算谁的、我要多点几下 | 出错时他能一键纠正,以及一句「最终由你确认」 | 「这是 AI,很智能」——他关心的是责任 |
| 合规/法务 | 数据去哪了、能不能删、出了问题谁负责 | 数据流向图、留存策略、供应商协议条款 | 「我们很安全」这种形容词 |
工具五:范围控制——把「再准一点」翻译成数字
AI 项目最典型的范围蔓延不是加功能,而是一句形容词:「能不能再准一点」「能不能像人一样」。 这类要求必须被翻译,否则它会无限期吸走资源。翻译分四步,一步都不能跳:
| 步骤 | 问什么 | 示例(对方说「再准一点」) |
|---|---|---|
| 1 定位 | 具体是哪一类问题不准? | 「是金额算错,还是条款漏检?」→ 对方答:漏检 |
| 2 量化现状 | 现在是多少? | 漏检率 22%(100 份里漏 22 条) |
| 3 定目标 | 到多少算够? | 「降到 10% 以下就能接受」 |
| 4 交代价 | 用什么换?三选一:时间 / 数据 / 人工 | 加 2 周做重排 + 需要 50 份已标注样本;或换更强模型,单次成本 +40% |
四步走完,一句模糊的抱怨就变成了一个有代价、可验收、可拒绝的变更请求。 如果对方在第四步说「那算了」,说明这件事本来就不重要——这正是翻译的价值:让不重要的需求自己消失。
38.4 排期:为什么 AI 项目不能按人天估
软件工程里有个概念叫不确定性锥:项目早期的工作量估算误差极大,随着信息增加才收敛。 AI 项目把这个锥体拉长并且抬高了——因为最大的未知不是「要做多少」,而是「能不能做到」。
| 阶段 | 估算误差范围 | 这个阶段该给什么承诺 |
|---|---|---|
| POC 前 | ±200% | 只承诺「两周后告诉你行不行」,不承诺交付日期 |
| POC 后 | ±80% | 可以承诺「一个月内出一个能用的版本」,附能力边界 |
| Beta 后 | ±30% | 可以承诺具体上线日期与验收指标 |
| GA 后 | ±10% | 正常迭代排期 |
三种排法,按场景选:
- 时间盒(推荐用于 POC / MVP):固定 2–4 周,范围可砍,时间不延。到期拿结果做决策:继续、转向、停止。这是对抗 AI 不确定性的最有效排法。
- 固定范围 + 浮动时间(慎用):只在能力已被 POC 验证过之后才可用。POC 之前用它,等于承诺一个你不知道能否兑现的日期。
- 阶段门:每个阶段独立立项、独立评审、独立预算。好处是可以在任何一道门停下来,而不显得项目失败——这对组织心理很重要。
在 AI 项目里,「不难」通常意味着「我没试过」。正确回应不是反驳,而是:「给我三天做个 POC,回来给你一个准确的数。」 三天换一个可信的排期,永远划算。
38.5 成本管理:把账单算在需求之前
成本在传统项目里是「资源」,在 AI 项目里是随功能增长的运行时变量。 它的可怕之处在于:功能上线那天不花钱,花钱是从用户开始用的时候起,每天发生。
单次调用成本模型(背下来):
单次成本 = 输入 token 数 × 输入单价
+ 输出 token 数 × 输出单价
+ 检索 / 工具调用成本
+ (Agent 场景)× 平均轮次
月成本 = 日活用户 × 人均次数 × 单次成本 × 30
# 例:RAG 问答
# 输入:检索 5 段 ≈ 3000 token;输出 ≈ 500 token
# 单价按某中端模型 $0.5/M 输入、$2/M 输出
# 单次 = 3000×0.5/1e6 + 500×2/1e6 ≈ $0.0025 ≈ 0.018 元
# 1000 人 × 5 次/天 × 0.018 × 30 ≈ 2700 元/月 ← 可以接受
#
# 同样的逻辑算 Agent:5 轮 → 单次 ×5,且每轮都重发上下文 → 实际约 ×8
# 1000 人 × 5 次 × 0.14 × 30 ≈ 2.1 万元/月 ← 需要重新设计
三条止损线(上线前必须写进文档):
| 止损线 | 怎么定 | 触发后做什么 |
|---|---|---|
| 单次成本上限 | 按业务价值反推:一次问答带来的价值 × 10% | 超了就降级(小模型 / 减少检索段数 / 限制上下文) |
| 日成本上限 | 月预算 ÷ 30 × 1.5(留缓冲) | 自动限流 + 告警;不要靠人盯着 |
| 成本/价值比 | 每月成本 ÷ 每月节省的人力成本 | 大于 1 就要重新论证这个功能该不该存在 |
38.6 三种典型失败:第一个月就能看到的信号
38.7 30-60-90 天:空降到 AI 项目的第一季度
| 阶段 | 目标 | 具体动作 |
|---|---|---|
| 第 1 个月 | 摸清三件事,不做任何承诺 | ① 跟一线使用者坐半天,看他实际怎么做这件事(不是听汇报) ② 找到数据在哪、谁管、能不能拿到 ③ 搞清楚谁拍板、谁会被这个项目影响、谁有否决权 |
| 第 2 个月 | 交付一个垂直切片 | 选一条最高频路径,做通端到端(允许人工兜底);同步建立第一批 50 条评测样本 |
| 第 3 个月 | 建立节奏,而不是交付更多功能 | 把评测集固化成回归测试;定下成本止损线;跑通一次「变更 → 评测 → 上线」的完整循环 |
38.8 面试题:六个高频,附答法要点
| 问题 | 答法要点(面试官在听什么) |
|---|---|
| 「AI 项目和普通项目最大的区别是什么?」 | 听你有没有具体到管理动作:不能按人天估 → 用时间盒;验收不能写死 → 用三段式;成本和用量挂钩 → 设止损线 |
| 「模型效果不达标,你怎么处理?」 | 先分类:是任务定义太宽、数据不够、还是模型能力不够。三类对应三种解法,别一上来就换模型 |
| 「怎么给一个从没做过的 AI 功能排期?」 | 先说「不排」,用 3 天 POC 换一个可信估算;然后按时间盒而不是按工作量 |
| 「怎么说服业务方接受 90% 而不是 100%?」 | 不讲准确率,讲「错了能不能被发现」:给出处、给复核步骤、给一键纠正。可发现 + 可纠正 > 高准确率 |
| 「上线后成本超了怎么办?」 | 三层:立刻(限流/降级)→ 一周(缓存、路由、缩上下文)→ 一月(重新论证功能价值) |
| 「你怎么判断这个项目该停?」 | 给明确的停损条件:POC 准确率连续两轮低于 70%、或错误无法归类、或成本/价值比 > 1 且无优化空间 |
本 章 小 结
AI 项目经理管的核心不是进度,是四件不可控的事:模型行不行、数据够不够、用户受不受得了、成本撑不撑得住。
五个阶段的意义在于每段都有一道可以说不的门;五个工具的意义在于把「我觉得差不多」变成「数字上够不够」。
一句话记住:普通项目怕延期,AI 项目怕「做到了但不能用」。
行动建议:接手任何一个 AI 项目,先做三件事——建一个 50 条的评测集、写一张能力里程碑、算一次单次成本。
这三件事加起来不超过三天,但它们决定了你后面三个月是在管理,还是在救火。
AI 产品经理:从 0 到 1 定义一个「不完美但有用」的产品
六步法 / 能力边界表 / 评测体系 / 协作与成长
- 三个思维转换:从「功能」到「概率」、从「验收」到「达标率」、从「用户说好」到「用户复用」
- 六步法每一步都要有产出物和判定线,否则就是走过场
- 能力边界表是 AI 产品经理最重要的产出——它决定了用户什么时候会原谅你
- 评测集不是算法团队的事:50 条真实样本,从三处来,产品经理必须自己动手
- Prompt 是产品资产:要版本管理、要回归测试、要灰度
- L1–L3 成长路径,以及五个让项目白做的误判
传统产品经理的核心产出是「需求文档」——把要做的功能描述清楚。
AI 产品经理的核心产出是「能力边界 + 评测标准」——因为 AI 产品不是一个确定的功能,它是一个有概率分布的能力。
你要回答的不再是「它做什么」,而是「它做到什么程度算够、达不到时怎么办、用户怎么知道它这次靠不靠谱」。
39.1 三个思维转换:先换脑子,再换方法
| 维度 | 传统产品思维 | AI 产品思维 | 不转换会怎样 |
|---|---|---|---|
| 确定性 | 同样输入 → 同样输出。测一遍通过就永远通过 | 同样输入 → 可能不同输出。要通过「多次运行的达标率」来判定 | 验收时好用,上线后「时好时坏」,被当成 bug 修三个月 |
| 需求单位 | 以「功能」为单位:有或没有 | 以「能力 + 边界」为单位:在什么范围内多准,范围外怎么办 | 写出「支持合同审阅」这种需求,开发无从下手,验收无从谈起 |
| 成功标准 | 用户说好用、留存上升 | 采纳率:它的输出被用户直接采用的比例 | 做出一堆「用了但每次都要改」的功能,数据好看,价值为零 |
39.2 六步法:每一步的产出物与判定线
目的:找到「值得用 AI 做」的场景。注意顺序——先有摩擦,再看能不能用 AI,而不是反过来。
摩擦只有四个来源,逐个扫:
| 摩擦类型 | 识别特征 | 典型例子 |
|---|---|---|
| 重复劳动 | 同一个人每周做 3 次以上,每次流程一样 | 每周整理周报、批量改文案、逐份填表 |
| 信息搬运 | 在多个系统间复制粘贴、格式转换 | 从 PDF 抠数据进 Excel、把会议记录整理成任务 |
| 经验判断 | 只有老员工会,新人要跟三个月 | 看合同找风险、判断工单该派给谁、初筛简历 |
| 长尾请求 | 20% 的请求占了 80% 的处理时间,且每次都不一样 | 客服的疑难问题、定制的分析需求 |
产出物:机会清单(六列,缺一列就不要往下走)
| 场景 | 谁在痛 | 现在怎么做 | 频次 | 错了会怎样 | 数据在哪 |
|---|---|---|---|---|---|
| 合同风险初筛 | 法务 3 人 | 人工逐条读,40 分钟/份 | 15 份/周 | 漏检可能造成赔付 | 历史合同库(PDF) |
目的:在投入之前,判断这个场景「适不适合用大模型做」。六维评分,每维 1–5 分,总分 30。
| 维度 | 5 分(很适合) | 1 分(很不适合) |
|---|---|---|
| 任务可描述性 | 能一句话说清输入输出,如「给一段话,判断情绪」 | 「做得像资深专家一样」,说不清标准 |
| 容错度 | 错了用户能一眼发现并改 | 错了没人知道,事后才爆 |
| 数据可得性 | 现成的、结构化的、能拿到的 | 要先去各个部门要,还得清洗 |
| 频次与规模 | 每天几百次以上 | 每月几次 |
| 现有方案满意度 | 现在做得痛苦、抱怨多 | 现在做得挺好,只是「可以更酷」 |
| 验证成本 | 两天能测出好坏 | 要跑三个月才知道有没有用 |
用法要点:六维里只要有一维是 1 分,总分再高也要谨慎——尤其是「容错度」和「验证成本」这两维,它们决定你会不会陷进去。
目的:把「想法」变成「可开发、可验收、可回退」的东西。AI 产品需要三份,缺一份都会在后面某个环节爆炸。
文档一:一页纸 PRD(只写四件事)
- 问题:谁的哪个环节痛,现在怎么解决,成本多少
- 用户:具体到岗位和人数量级,不是「所有人」
- 成功指标:一个业务指标 + 一个产品指标(如「审阅时长从 40 分钟降到 15 分钟」+「采纳率 ≥ 60%」)
- 明确不做什么:这一条最容易被省略,也最能防止范围蔓延
文档二:PRD 与传统的六处差异(这是最容易写错的地方)
| 章节 | 传统写法 | AI 产品写法 |
|---|---|---|
| 功能描述 | 用户点击 A,系统返回 B | 行为描述:给什么输入,它应该产出什么,什么情况下应该拒绝 |
| 验收标准 | 功能可用、无报错 | 达标率:在 N 条样本上 ≥ X%,且误报 ≤ Y% |
| 异常流程 | 网络错误提示重试 | 兜底策略:模型不确定时说什么、转人工的条件是什么 |
| 性能指标 | 响应 < 200ms | 延迟 + 成本:P95 延迟、单次调用成本上限 |
| 边界 | 不涉及 | 能力边界表(见 37.3),独立成节 |
| 迭代 | 版本功能列表 | 模型换版 / 提示词变更时的回归要求 |
文档三:评测方案(50 条样本 + 指标 + 通过线,详见第五步)
目的:用最小成本验证「这个闭环在真实工作流里跑得通」。 注意是闭环——很多团队做了一堆功能,但每一环都不完整,结果用户还是没法完成一次任务。
闭环的四个环,缺一不可:
| 环 | 要回答的问题 | 缺了会怎样 |
|---|---|---|
| 输入 | 用户从哪进来、要给什么、格式多脏 | 做成网页上传,但用户实际用的是微信里的文件 |
| 处理 | 中间哪一步最不可靠,怎么兜 | 失败时无提示,用户以为在跑 |
| 输出 | 结果长什么样、能不能直接用、要不要带出处 | 输出一大段话,用户还得自己整理,等于没省事 |
| 反馈 | 用户怎么告诉你「这次错了」 | 你永远拿不到失败样本,迭代无从下手 |
人工兜底的三个层级,按阶段选:
- 全人工(Wizard of Oz):界面做出来,背后全是人。用来验证「用户到底要不要这个东西」,成本最低
- 人机协同:AI 出初稿,人改。这是绝大多数 AI 产品的长期正确形态,不是过渡态
- 自动 + 抽检:只在高置信度场景放开,其余仍走人工
注意最后半句——「愿意用第二次」比「能用」重要得多。第一版不需要好看,但必须省事。
目的:建立一套能反复用的判断标准。这件事产品经理必须自己做,不能外包给算法团队—— 因为「什么算对」是产品定义,不是技术问题。
① 评测集怎么建(50 条起步,三个来源)
| 来源 | 怎么取 | 占比建议 |
|---|---|---|
| 真实历史数据 | 从系统里随机抽,必须是随机的,不能挑好的 | 60% |
| 客服 / 工单 | 用户真实抱怨过的问题,天然是难例 | 25% |
| 极端构造 | 你自己想的边界情况:空输入、超长、错别字、多语言、恶意诱导 | 15% |
② 三条指标,缺一不可
- 任务完成率:能不能把这件事做完(不是答得漂亮,是能交付)
- 采纳率:输出被直接使用的比例——这是唯一能反映真实价值的指标
- 放弃率:中途退出或改回人工的比例,它比差评更早预警
③ 迭代优先级:影响面 × 修复成本
| 类型 | 例子 | 先做什么 |
|---|---|---|
| 高频 × 低成本 | 输出格式总是不对 | 立刻改提示词,一天见效 |
| 高频 × 高成本 | 长文档漏检 | 排期做,可能要改切块或换模型 |
| 低频 × 低成本 | 某个生僻格式解析失败 | 攒着,一起改 |
| 低频 × 高成本 | 极少见的专业领域 | 不做,写进能力边界表,明确不支持 |
目的:判断能不能从 10 个人用到 1000 个人。四个条件同时满足才推,缺一个都会在推广后爆炸。
| 条件 | 达标线(示例) | 不达标的后果 |
|---|---|---|
| 成本可承受 | 单次成本 ≤ 业务价值的 10% | 用户越多亏越多,最后被迫下线 |
| 延迟可接受 | P95 ≤ 用户等待耐心的 1.5 倍(对话类约 3–5 秒,后台类可到 30 秒) | 用户点一次就再也不来 |
| 稳定性达标 | 可用性 ≥ 99%,且有降级方案 | 一次故障,口碑归零 |
| 可解释 | 关键结论能给出依据(出处 / 推理步骤) | 用户不敢用,尤其在 B 端 |
39.3 能力边界表:AI 产品经理最重要的产出
这张表回答三个问题:它能做什么、它不能做什么、边界模糊时怎么办。 它的价值不在文档里,在于它是产品、开发、用户三方对「预期」的唯一共识。
| 分层 | 内容(示例:合同审阅助手) | 产品上怎么体现 |
|---|---|---|
| ① 能做 (承诺) |
中文 PDF 商务合同的 5 类风险条款识别;每条附原文位置;单份 ≤ 50 页 | 正常流程,输出带出处,可直接采纳 |
| ② 不能做 (明确拒绝) |
手写件、扫描歪斜件、外文合同、非合同文档、法律意见(它只标风险不下结论) | 入口就拦:上传时检测并提示「暂不支持扫描件」,而不是处理完给个烂结果 |
| ③ 边界模糊 (降级处理) |
条款表述非常规、跨页表格、带修订痕迹的合同 | 照常输出,但顶部加一条黄色提示:「本文档格式较特殊,建议重点复核第 3、7 条」 |
| ④ 出错时 (兜底) |
解析失败 / 超时 / 模型不可用 | 给出明确原因 + 下一步建议 + 一键转人工;绝不返回空结果或白屏 |
39.4 Prompt 是产品资产,不是配置
很多团队把提示词放在代码里随手改,改完直接上线。这在 AI 产品里等同于改完数据库结构不跑测试—— 因为提示词会实质影响输出分布。
| 要求 | 具体做法 | 不做会怎样 |
|---|---|---|
| 版本管理 | 提示词独立文件、有版本号、变更写清原因 | 出问题无法回滚,也说不清是哪次改动导致的 |
| 回归测试 | 每次改动跑一遍 100 条评测集,分数不降才能上 | 修好 A 场景,悄悄弄坏 B 场景(最常见的隐性退化) |
| 灰度 | 新提示词先 10% 流量,对比采纳率 | 全量上线后才发现变差,只能紧急回滚 |
| 可读性 | 分块 + 注释,让非技术同事能看懂 | 只有一个人敢改,他休假就没人能救 |
39.5 ROI 与成本测算:怎么算清这笔账
AI 产品最容易死的地方不是效果,是账算不过来。 而算错的地方往往不是模型费用——是把「省下的时间」当成「省下的钱」,以及漏掉人工复核这块最大的成本。
成本三块,收益两块
| 科目 | 怎么算 | 最容易出错的地方 |
|---|---|---|
| 调用成本 | 日调用数 × 单次成本 × 30 | 只按成功调用算,忽略重试与失败重跑 |
| 人工复核 | 需复核比例 × 单条复核分钟 × 时薪 | 直接漏掉——这块通常是调用费的 5–10 倍 |
| 工程维护 | 迭代人力 + 工具订阅,按月摊销 | 低估评测、监控、修 bad case 的持续投入 |
| 收益:省工时 | 单次节省分钟 × 月次数 ÷ 60 × 时薪 | 把「节省的时间」直接当「省下的人」,人没裁就不会体现在账上 |
| 收益:增量 | 吞吐提升带来的额外收入或避免的损失 | 算不清就写「暂不计入」,别硬编数字 |
一个算例(诚实地算,包括不划算的结论)
场景:合同审阅,法务 3 人,每周 15 份,单份人工 40 分钟
目标:AI 初筛把单份压到 15 分钟,但必须 30% 抽检复核
【省下的时间】
节省 = (40 - 15) 分钟 × 60 份/月 = 1500 分钟 = 25 小时/月
折算 = 25 小时 × 80 元/小时 = 2000 元/月
(注意:这是「释放出的产能」,不是「省下的工资」)
【新增成本】
调用 = 60 份 × 0.8 元 ≈ 48 元
复核 = 25 小时 × 30% 抽检 × 80 元 ≈ 600 元 ← 很多人漏掉这块
维护 = 300 元/月
合计 ≈ 948 元
【净收益】2000 - 948 ≈ 1052 元/月
【ROI】 1052 / 948 ≈ 1.1
结论:只算「工时折算」时,这个项目刚过盈亏线,说服力很弱。
真正的价值在另一栏:漏检风险下降 + 审阅吞吐翻倍。
如果这两条无法量化,就应该老实说「这是一个风险控制项目,不是降本项」。
三个最常见的算错
| 错误 | 为什么会犯 | 正确做法 |
|---|---|---|
| 只算 token 不算复核 | 调用费有账单,复核没有账单 | 把复核工时按比例折算进成本,通常占总成本 60% 以上 |
| 用峰值算平均 | 拿最忙那天的用量乘以 30 | 用过去 4 周的真实日均,并给 1.5 倍缓冲 |
| 忽略返工 | 默认 AI 输出一次就对 | 按「可接受率」折算:60% 可用 → 剩下 40% 要重做或人工补 |
① 这笔钱花在哪(三块成本,写数字);
② 它换回了什么(省工时 / 增量收入 / 风险下降,三者选其一为主,不要都说);
③ 什么情况下不划算(给出阈值,比如月调用超过 5 万次就该改架构)。
39.6 协作边界:和四种角色怎么分工
| 角色 | 他负责 | 你负责 | 交界处的争议点 |
|---|---|---|---|
| 算法 / 数据 | 模型选型、微调、检索策略、评测工具链 | 什么算对、评测集、达标线、边界定义 | 「准确率上不去」到底是模型问题还是任务定义问题 |
| 工程 | 接口、性能、降级、可观测 | 等待态/失败态的体验设计、成本上限 | 延迟与体验的取舍:是该优化还是该改交互 |
| 设计 | 交互、视觉、信息层级 | 如何建立信任:出处、置信提示、纠正入口 | 要不要显示「不确定」——露出会显得产品弱,藏起来会失去信任 |
| 业务 | 场景、验收、推广 | 把它翻译成指标与排期 | 「再准一点」的翻译(见 PM 章的工具五) |
39.7 成长路径:L1 到 L3 分别能干什么
| 级别 | 一句话 | 能独立完成 | 典型产出物 |
|---|---|---|---|
| L1 执行 |
能把需求写清楚 | 写一页纸 PRD;跑评测、整理失败样本;跟进一个已有功能的迭代 | 需求文档、评测报告、失败案例归类 |
| L2 定义 |
能判断该不该做 | 独立走完六步法;做适配评估并给结论;设计能力边界表与评测方案;能对需求说「不」 | 机会清单、评分卡、能力边界表、评测体系 |
| L3 定方向 |
能定义产品形态 | 判断技术拐点(什么时候该换方案);设计人机协同的组织流程;影响资源分配与优先级 | 产品路线图、能力演进规划、组织协作机制 |
L2 → L3 的分水岭:能不能判断「现在不该做」并说服别人等一等——技术不到位时硬做,是最常见的资源浪费。
39.8 五个常见误判
39.9 面试题:五个必问,附答法要点
| 问题 | 面试官在听什么 |
|---|---|
| 「AI 产品经理和普通产品经理的区别?」 | 有没有具体到产出物:能力边界表、评测集、达标率,而不是「要懂技术」 |
| 「模型只有 85% 准确率,你怎么让它上线?」 | 能不能说出降低错误的后果:加出处、加复核、限场景、人机协同——而不是硬等 95% |
| 「你怎么衡量一个 AI 功能有没有用?」 | 必须提到采纳率或「节省的时长」,只答 DAU / 调用量说明没想过 |
| 「需求方说『再准一点』,你怎么办?」 | 四步翻译:定位哪类问题 → 量化现状 → 定目标 → 交代价。能说出第四步的才是真做过 |
| 「你怎么判断一个场景不该用 AI?」 | 给出可操作的判据:频次太低、容错度太低、无法验证、数据拿不到——四条里任一条成立就该慎做 |
本 章 小 结
AI 产品经理的活,本质是在一片概率里划出一块可承诺的地:这块地上我保证好用(能力边界表的第一层),
这块地我不接(第二层),中间那块我做了但你要小心(第三层),出事了我这样兜(第四层)。
这四层划清楚,产品才敢交付,用户才敢使用。
一句话记住:传统产品经理交付「功能」,AI 产品经理交付「预期」。
行动建议:下次拿到一个 AI 需求,先别写 PRD,先做三件事——建 50 条评测样本、填一张能力边界表、
算一次单次成本。这三样东西写不出来,说明这个需求还没想清楚,写再多 PRD 也只是把模糊写得更长。
大话 AI:老王和小柯的十二次对话
对话体番外 · 用生活讲清全书
- 用「接龙」这个比喻理解模型的本质
- RAG 与 Agent 是同一条思路的两个分支:给资料、给工具
- 为什么权限、循环、评测这些「不 AI」的东西最值钱
- 「聪明但不可靠的实习生」这个心智模型
前面三十一章都是正襟危坐地讲。这一章换个讲法——两个人,一间办公室,一杯凉了的茶。 如果你觉得前面太硬,从这里开始读也行;读完再回去看技术细节,会顺很多。
这十二次对话基本都发生在下午三点,老王的工位旁边。
第一杯茶:模型到底是个什么东西
第二杯茶:一本正经地胡说
第三杯茶:图书馆管理员
第四杯茶:它开始动手了
第五杯茶:写死还是放手
第六杯茶:安全绳
第七杯茶:怎么证明它行
第八杯茶:给它一双眼睛
第九杯茶:开会的代价
第十杯茶:项目怎么落地
第十一杯茶:这行的门槛在哪
第十二杯茶:最后一句话
本 章 小 结
这一章是把全书压缩成十二杯茶。
如果只带走一句:你所有的工程工作,都是在给一个聪明但不可靠的实习生配制度。等他犯错你能马上知道、能马上退回去的时候,才算真正上线。
术语总表:103 个词,每个都用一句话讲明白
可搜索 · 按类别筛选
- 103 条术语的检索方式:关键词搜索 + 六类筛选
- 重点查这几组容易混的:双塔 / 交叉编码器 / ColBERT、CoT / ToT / DoT、MCP / A2A
- 每个词条只保留「是什么 + 为什么要它」,细节回正文
这一节是索引,不是正文。遇到看不懂的词,回来搜一下。 每条都刻意压到一两句,只保留「是什么 + 为什么要它」,细节回正文看。
Token · 词元
TOKEN模型处理文本的最小单位。由分词器按词频切出,可能是一个字、半个词或一个标点。计费、上下文长度都按它算。
BPE · 字节对编码
BYTE PAIR ENCODING训练分词器的算法:反复把最常一起出现的两个片段合并成新片段。只看频率,不看语法,所以切分结果常常反直觉。
上下文窗口
CONTEXT WINDOW模型一次能读取的 token 上限。像书桌,桌子再大也不等于你都读进去了——信息越多,每条的注意力越被稀释。
Embedding · 嵌入
EMBEDDING把文本映射成一串数字(向量),让意思相近的内容在空间里也靠得近。检索、聚类、去重的数学基础。
余弦相似度
COSINE SIMILARITY衡量两个向量方向是否一致,值域 −1 到 1。向量归一化后等于内积,所以向量库普遍用内积算,更快。
Transformer
TRANSFORMER当前所有大模型的骨架。核心是自注意力 + 前馈网络,能一步连接任意两个位置,且支持整句并行计算。
自注意力
SELF-ATTENTION让句中每个位置都去看所有其他位置,按相关性加权吸收信息。用 Q(我在找什么)、K(我是什么)、V(我能给什么)实现。
多头注意力
MULTI-HEAD ATTENTION同时开几十组注意力,各自关注不同关系(语法、指代、时序)。拼起来,模型就能同时处理多种语言现象。
位置编码 / RoPE
POSITIONAL ENCODING注意力本身无序,必须额外告诉模型谁在前谁在后。RoPE 用旋转方式编码相对位置,是长上下文外推的关键。
KV Cache · 键值缓存
KV CACHE缓存已算过的 Key/Value,生成下一个词时不用重算前文。没有它长文本慢到不可用;有它显存随对话长度线性上涨。
Logits
LOGITS模型最后一层输出的原始分数,词表里每个 token 一个,可以是负数。经 softmax 之后才变成概率。
幻觉
HALLUCINATION生成流畅、自信但错误或无依据的内容。不是 bug,是「预测下一个词」机制的必然产物——它优化的是像不像,不是真不真。
参数 / 权重
PARAMETERS模型里可被训练调整的数字。「7B」= 70 亿个。像神经元连接强度,概念是几百万个连接的组合模式,不在单个参数里。
MoE · 混合专家
MIXTURE OF EXPERTS前馈层拆成很多专家,每个 token 只激活少数几个。总参数巨大但单次计算量小,代价是显存要装下全部专家。
预训练
PRE-TRAINING用海量文本做「预测下一个词」的自监督学习。烧掉 95% 的算力,产出一个什么都懂一点、但不太听话的基座模型。
SFT · 监督微调
SUPERVISED FINE-TUNING用「问题 → 标准答案」的样本继续训,教模型按指令回应而不是接龙。是岗前培训,不教新知识。
RLHF
RL FROM HUMAN FEEDBACK让人给多个回答排序,训一个奖励模型,再用强化学习把主模型往高分方向推。决定模型的安全性和好用程度。
DPO
DIRECT PREFERENCE OPTIMIZATIONRLHF 的简化替代:跳过奖励模型和强化学习,直接用偏好对训练。更稳更省,已成主流,但对数据分布更敏感。
LoRA
LOW-RANK ADAPTATION冻结原权重,只训练旁边挂的一小块低秩矩阵。显存降到几十分之一,效果接近全参微调,是目前最常用的微调方式。
QLoRA
QUANTIZED LORA把基座量化到 4bit 冻住,再挂 LoRA 训练。单张 24G 消费卡就能微调 7B~13B 模型。
量化
QUANTIZATION把权重从 16 位压到 8/4 位,体积小 2~4 倍、速度快。像音乐转低码率:日常听不出,但代码和数学最先掉。
蒸馏
DISTILLATION用大模型的输出当教材,训练一个小模型。小模型学的是「大模型的判断倾向」,不只是答案,所以常比直接训小模型强。
温度
TEMPERATURE控制随机性的旋钮。调低更确定(抽取值 0~0.2),调高更发散(创意 0.7~1.0)。本质是 softmax 里的除数。
Top-p · 核采样
NUCLEUS SAMPLING只保留累计概率达到 p 的那一小撮候选再采样。候选集大小随模型把握程度自适应,比固定 top-k 更合理。
自回归
AUTOREGRESSIVE每次只生成一个 token,接到末尾再预测下一个。所以生成长内容要跑 N 次前向——输出比输入慢且贵的原因。
Scaling Law
SCALING LAW损失随参数量、数据量、算力按幂律平滑下降。Chinchilla 补充:参数量与训练 token 数应大致同比,否则是「欠训练」。
涌现能力
EMERGENT ABILITIES某些能力在小模型上几乎为零,规模过阈值后突然出现。争议在于:换连续指标后,提升可能是平滑的。
灾难性遗忘
CATASTROPHIC FORGETTING微调新任务时,把原有能力覆盖掉。表现是「新学的会了,原来会的不会了」。LoRA 与数据混合是主要缓解手段。
RAG
RETRIEVAL-AUGMENTED GENERATION回答前先检索相关原文,拼进上下文再生成。不改参数就能更新知识、支持引用,是私有知识落地的主流方案。
切块 / Chunking
CHUNKING把长文档切成几百 token 的片段。切得好每块能独立看懂,切得差一句话被拦腰截断,检索出来也没法用。
向量数据库
VECTOR DATABASE专门存向量并支持相似度检索的数据库。除向量外还存原文和元数据,方便过滤(按部门、时间、权限)。
ANN · 近似最近邻
APPROXIMATE NEAREST NEIGHBOR不保证找到绝对最近的那条,但保证毫秒内找到足够近的一批。召回率通常 95%~99%,用极小精度换巨大速度。
HNSW
HIERARCHICAL NAVIGABLE SMALL WORLD多层图索引。像先坐飞机到省、再开车到市、再步行到街道。参数 efSearch 越大越准越慢,是线上最常调的旋钮。
BM25
BM25经典关键词打分算法,看词频、词稀有度、文档长度。对型号、错误码、人名极强,不需要 GPU,是稀疏检索的事实标准。
混合检索
HYBRID SEARCH向量检索 + 关键词检索同时跑,再融合排序。向量懂意思但漏字面,BM25 认字面但不懂同义,两者互补。
RRF · 倒数排名融合
RECIPROCAL RANK FUSION融合两路检索结果的方法:只看排名不看分数,Σ 1/(k+rank)。好处是不用把不可比的分数归一化。
Rerank · 重排
RERANK先粗筛 20~50 条,再用更准的模型逐条判断「能不能回答这个问题」,取前 3~8 条。RAG 里性价比最高的单点优化。
Cross-Encoder · 交叉编码器
CROSS-ENCODER把问题和文档拼在一起送进模型,逐词比对,精度高但无法预计算。重排阶段用它,粗筛阶段用双塔。
Top-K
TOP-K取相似度最高的 K 条。K 太小漏答案,K 太大噪音多、上下文被挤占。常见起点 K=20 粗筛、精排后留 5。
GraphRAG
GRAPH RAG先抽实体关系建知识图谱,再沿边多跳检索。擅长「A 的负责人所在部门的预算」这类多跳问题,建图成本高。
Agentic RAG
AGENTIC RAG把「要不要再查一次、改写查询」交给 Agent 决定。收益明显,但必须设最大轮次,否则会陷入「一直查不够」。
Grounding · 依据落地
GROUNDING要求模型的每句结论都能对应到给定材料的具体段落。是降低幻觉、满足合规溯源的核心手段。
Agent · 智能体
AGENT模型 + 工具 + 循环 + 记忆。在循环里想一步、做一步、看结果、再决定。从「会说」变成「会做」,也从「说错」变成「做错」。
ReAct
REASONING + ACTING思考与行动交替:Thought → Action → Observation → 判断。每次观察结果回到上下文,成为下一轮思考的依据。
Function Calling
FUNCTION CALLING模型输出「要调哪个函数、参数是什么」,由外部程序执行再回传。模型只决策不执行,这层隔离就是安全边界。
工具 / Tool
TOOLAgent 能操作的外部能力:查库、发邮件、跑代码。描述写得好不好,直接决定调用准不准——要写成条件式。
记忆
MEMORY短期(上下文)、长期(向量库)、情景(日志)、程序(提示词/技能)。不做记忆的 Agent 会重复劳动、忘记约束。
Plan-and-Execute
PLAN AND EXECUTE先列完整子任务清单,再逐个执行。可控、易并行,但计划一旦错了会系统性错到底。
Reflexion · 反思
REFLEXION失败后先写「为什么失败」,把反思存进记忆再重试。适合有明确成败判定的任务,如写代码过测试。
Multi-Agent · 多智能体
MULTI-AGENT多个角色分工协作。收益来自上下文隔离与并行,成本是沟通开销随人数平方增长,且责任容易扩散。
多模态
MULTIMODAL同时处理文本、图像、音频、视频,把它们编码到同一语义空间。让模型从「只读字」变成「看得见」。
GUI Agent / Computer Use
COMPUTER USE看屏幕截图、输出点击坐标来操作软件。有 API 就不要用界面操作——后者的不确定性高一个数量级。
任务完成率
TASK SUCCESS RATEAgent 类系统最核心的指标:在评测任务里真正办成的比例。比「回答准确率」更贴近实际价值。
Workflow · 工作流
WORKFLOW把步骤和条件写死成图,按图执行。牺牲灵活性换确定性、可审计、可单步重试。生产中 80% 场景的正确答案。
DAG · 有向无环图
DIRECTED ACYCLIC GRAPH边有方向、且不能绕回形成环。这两条保证流程一定能终止——这是 Workflow 比 Agent 可靠的根本原因。
Human in the Loop
HUMAN IN THE LOOP在高风险节点插入人工审批。不是能力不足的妥协,而是可靠性设计——省掉它,一次误判可能抵掉全年收益。
Harness · 运行时外壳
AGENT HARNESS模型之外驱动并约束它的那套代码:上下文装配、工具网关、权限、沙箱、循环控制、日志、成本。模型决定上限,它决定实际发挥多少。
沙箱
SANDBOX把代码执行关进隔离环境,限制 CPU、内存、时长、网络。即便被提示注入操纵,破坏范围也可控。
可观测性 / Trace
OBSERVABILITY记录每轮的上下文、输出、工具参数、耗时、token。没有它,Agent 就是不可调试的黑盒,出事只能整体下线。
提示注入
PROMPT INJECTION在模型会读到的内容里埋指令,诱导它做不该做的事。间接注入(藏在网页、PDF 里)最危险,用户毫不知情。
评测集 / 黄金集
EVAL SET一批「输入 + 期望输出」的真实样本,用来量化效果并做回归。没有它的项目,每次改动都是赌博。
LLM-as-a-Judge
LLM AS A JUDGE用模型当裁判打分或做 A/B。快但有三类偏差:位置、长度、自我偏好。只能用于筛选,不能用于验收。
采纳率 / 接管率
ADOPTION / TAKEOVER RATEAI 结果被直接接受的比例 / 用户转人工修改的比例。这两个数比 DAU 更能说明 AI 是否真的有用。
灰度发布
CANARY RELEASE先对一小部分用户开放,观察指标再全量。AI 产品的输出不稳定,灰度是唯一能控制风险的上线方式。
P95 延迟
P95 LATENCY95% 的请求在这个时间内完成。比平均延迟更能反映真实体验——用户记住的永远是最慢的那几次。
提示词工程
PROMPT ENGINEERING设计输入以获得期望输出。有效手段是给示例、拆步骤、定格式、给退路,而不是堆形容词。
上下文工程
CONTEXT ENGINEERING系统性决定「这次请求该放哪些信息、什么顺序、多少预算」。当系统接入检索和工具后,它比提示词工程更关键。
MCP
MODEL CONTEXT PROTOCOLAI 应用连接外部工具/数据的标准协议。工具方实现一次 Server,所有支持 MCP 的客户端都能用,把 M×N 变成 M+N。
MCP 三类原语
TOOLS / RESOURCES / PROMPTSTools 是模型决定何时调的动作;Resources 是应用决定何时注入的数据;Prompts 是用户主动选的模板。分清这三者是理解 MCP 的关键。
A2A
AGENT2AGENTAgent 与 Agent 之间委派任务的协议。MCP 是纵向连工具,A2A 是横向连同事。企业级多 Agent 平台才会用到。
Agent Card
AGENT CARDAgent 的能力名片:会什么、支持什么格式、怎么认证、地址在哪。让调用方不读文档就能对接。
CoT · 思维链
CHAIN OF THOUGHT让模型把推理步骤写出来,下一步能用到上一步的结果。显著提升多步推理,但一条道走到黑,不会回头。
推理模型
REASONING MODEL回答前先产生长串内部推理,用「想更久」换正确率。延迟和成本是普通模型的 5~30 倍,只该用于难题。
Test-time Compute
TEST-TIME COMPUTE不在训练时加算力,而在推理时加:多采样几条路径、自我验证、再选最好的。相当于考试时多给草稿纸和时间。
ToT · 思维树
TREE OF THOUGHTS把推理展开成树,探索多条路径并评估剪枝。比 CoT 灵活,但没有评估信号时,分叉只是把错误放大。
GoT · 思维图
GRAPH OF THOUGHTS允许节点合并的图结构推理。中间结论可以复用,不必每条分支重算。是 ToT 的进一步泛化。
DoT · 思维图(本教材用法)
DIAGRAM OF THOUGHT把推理表示成有向无环图:节点是命题,边是推理关系。可分支、可合并、可回溯,用拓扑序保证不出现循环论证。
拓扑排序
TOPOLOGICAL SORT给 DAG 的节点排一个顺序,保证每个节点在被使用前,它的所有前提都已成立。DoT 用它避免「用结论证明自己」。
Wizard of Oz · 绿野仙踪法
WIZARD OF OZ后台用人工冒充 AI,先验证需求是否真实存在,再投入开发。成本最低的需求验证手段,很多团队忘了它。
MTEB / C-MTEB
MASSIVE TEXT EMBEDDING BENCHMARK向量模型的公开评测基准。MTEB 偏英文多任务,C-MTEB 是中文版。用它做初筛可以,但不能代替你自己的数据实测——榜单任务分布和你的业务不同。
Matryoshka 表示
MATRYOSHKA REPRESENTATION像俄罗斯套娃:一个 3072 维向量,前 1024 维本身就能用,前 256 维也能用。训练时让不同前缀都具备检索能力,所以可以直接截断降维,存储省 3 倍、召回只掉 1~2%。
池化方式
POOLING (CLS / MEAN / LAST)把 token 级输出汇总成一个句向量的方法。用错池化效果会明显下降,而且不报错。必须看模型卡怎么写的——这是最容易被忽略的配置项。
双塔 / Bi-Encoder
BI-ENCODER查询和文档分别编码成两个向量,只比距离。文档向量可离线预算,所以能做百万级召回。缺点是信息已被压缩,细粒度匹配能力弱。
交叉编码器 / Cross-Encoder
CROSS-ENCODER查询和文档拼在一起送进模型,输出相关性分数。精度高,但无法预计算,只能对少量候选做。这就是「粗排用双塔、精排用交叉编码器」的算力原因。
ColBERT / 多向量检索
LATE INTERACTION每个 token 存一个向量,用 MaxSim 做词级匹配。精度接近交叉编码器,但存储是双塔的几十倍。适合对精度极敏感、数据量可控的场景。
Recall@K
RECALL AT K正确答案有没有出现在前 K 条结果里。RAG 最该先看的指标——Recall@5 低于 0.7,就不要去优化生成端了,问题在检索。
MRR
MEAN RECIPROCAL RANK第一条正确结果排在第几位的平均值。反映「用户要不要往下翻」,比 Recall 更贴近实际体验。
nDCG@K
NORMALIZED DISCOUNTED CUMULATIVE GAIN考虑排序位置与多相关文档的加权得分。一个问题对应多段材料时,它比 Recall 更能反映排序质量。
难负样本
HARD NEGATIVE主题相近但不能回答问题的文档块。微调向量模型时,难负样本的质量决定成败——从现有模型 top-20 但不在标准答案里的候选中挖,效果最好。
潜空间 / Latent Space
LATENT SPACE把 512×512 的图压成 64×64×4 的表示,数据量小 48 倍。扩散过程在这个小空间里进行,所以消费级显卡也能出图。
VAE
VARIATIONAL AUTOENCODER负责「图像 ↔ 潜变量」的双向转换。编码器压,解码器还原。它决定细节还原能力——VAE 不好,图会发灰、人脸糊。
UNet
UNET扩散模型里去噪的主力网络。每一轮预测「当前图里哪些是噪声」,然后减掉一点。重复 20~30 次,噪声被逐步擦成图像。
CLIP
CONTRASTIVE LANGUAGE-IMAGE PRETRAINING把文本和图像映射到同一空间的编码器。Stable Diffusion 用它把提示词变成条件向量,再注入 UNet 引导生成方向。
ControlNet
CONTROLNET不改底模,额外塞一个「结构条件」进去:姿态骨架、边缘线、深度图。让生成结果服从你给的结构,是构图控制的核心工具。
CFG Scale
CLASSIFIER-FREE GUIDANCE提示词对生成的控制强度。常用 5~8。太低不听提示词,太高色彩过饱和、画面崩坏。
PagedAttention
PAGED ATTENTIONvLLM 的核心创新:把 KV Cache 像操作系统管理内存页一样按需分块,显存利用率从 20~40% 提升到 90% 以上,吞吐随之数倍提升。
连续批处理
CONTINUOUS BATCHING一条请求跑完就立刻退出、新请求立刻补位,不必等整批最慢的那条。这是高并发推理吞吐的关键机制。
GGUF
GPT-GENERATED UNIFIED FORMATllama.cpp 生态的模型文件格式,把权重和元数据打包,支持 Q4_K_M 等量化档位。CPU 或混合推理的首选格式,Ollama 底层就用它。
事件溯源
EVENT SOURCING不存最终状态,只存「发生过哪些事件」,状态由事件重放得出。好处是可回放、可拖时间轴、可换主题重渲染——可视化大屏都用这个模式。
计算图
COMPUTATION GRAPH节点是纯函数,边是数据流。整张图可序列化、可复现、可被程序生成。ComfyUI 是它在生成领域的典型实现。
世界模型
WORLD MODEL不只预测下一个词,而是预测「采取某个动作后世界会变成什么样」。需要理解物理规律与因果,是具身智能与实时仿真的基础。关键指标是端到端延迟与帧率。
Harness²
HARNESS SQUARED让 Agent 在运行中自主改写、优化外挂工具代码,从「工具使用者」变成「工具开发者」。能力提升明显,但也让「工具白名单」这类传统权限设计失效。
Agentic Cloud
AGENTIC CLOUD云厂商把存储、数据库、消息队列等能力按「Agent 调用」重新设计:接口、权限、计费都适配智能体。判断标准是「这套服务是给人用的,还是给 Agent 用的」。
本 章 小 结
这一节是索引,不是正文。遇到看不懂的词,回来搜一下,比往前翻二十章快。
如果某个词你搜完还是不懂,说明它所在的那一章值得重读——术语解释只能解决「叫什么」,解决不了「为什么需要它」。