跳到主要内容

项目二:天机 — 同一个问题,四条路各走一遍

这一章讲三件事: 一件没有标准答案的事怎么交给模型;同一件事有哪四条做法; 以及这四条各要付出什么。

它在全书链条里的位置: 这是第三部分的第二篇,也是全书最后一章。 它的价值不在教新东西,在于把前面所有做法摆成一张可比较的表。

本章主走查:一句提问——「如何给长辈敬酒?」 这一句会被四条路各处理一遍。 说清楚一件事:书只在第二条路上真的跑了这一句并打印了调用代码; 第一条路书给的是同一场景、不同参数的另一个具体例子;第三、四条路书只给了做法,没有输出。 下面每一处我们都标明了它属于哪一种。

1. 这件事没有标准答案

这一节先说清这个项目要解决的问题,以及它为什么特别。

书的开场是这样的:在中国,餐桌敬酒不仅仅是简单的举杯祝酒,它更是一种深刻的社交艺术; 但对许多人来说,餐桌敬酒的繁琐礼节和难以把握的度,往往让人感到既苦恼又头疼1

这个项目由一家叫来事儿 AI 的团队做,免费、非商业用途, 用来处理如何敬酒、如何说好话、如何会来事儿这类任务2

注意这类问题和前十二章那些问题的根本差别:

前十二章的问题这一章的问题
例子「什么是南瓜书?」「如何给长辈敬酒?」
有没有标准答案有,写在知识库那份 PDF 里没有
怎么算答对和资料对得上得体、真诚、适合场合

所以第 11 章那五种打分办法在这里基本都不适用—— 没有标准答案,就没有客观题可构造,也没有参考答案可算相似度。 这也正是这个项目值得当对照实验读的原因:它逼你换一套思路。

2. 第一条路:只用一段写好的话

这一节是主走查的第 1 步,也是四条路里最省的一条。

书对这条路的定位是一句话:主要通过内置的系统提示词,基于大模型自身能力进行对话3不建库、不训练、不加任何组件,只有那段话。

书把这段话拆成四个部件4:

第几步干什么书给的例子
① 设置场景告诉它现在模拟的是什么情景「对长辈敬酒」
② 定义角色给一个具体角色,并用形容词描述这个角色的特点「一个精通言语表达、具有同理心、热爱他人、尊重长辈、情绪稳定的中国晚辈」
③ 明确要求规定输出的格式和要求「简洁、简短、真诚、有趣、适合场合、礼貌,可以加入中国酒文化词汇」
④ 提供示例给出输入与预期输出的样例见下面那一组

第 ② 步那句「用形容词描述角色特点」是书特意点出来的,理由是: 可以显著提高模型回应的相关性和适当性4

第 ④ 步就是第 03 章那个少样本,只是换了个场合。 书给的一组是5:

输入:称谓:妈妈,长辈特点:节约,具体场景:家宴结束,演讲时间:10 秒以内

输出:妈妈,
家宴结束,我想对您说,您一直都是我们家的节俭大师。
感谢您的精打细算,让我们的生活更加美好。干杯,妈妈!我爱您!

图说:注意输入那一行的形状——四个格子:称谓、长辈特点、具体场景、演讲时间。
这四个格子就是那段系统提示词末尾留的空,由用户填。
(这是书给的一组示例,不是本章走查那句「如何给长辈敬酒?」的输出。)

这条路的全部成本就是写好这段话。 每条数据的结构是:场景名称、系统提示词、输入输出示例5

3. 同一条路的另一种玩法:把它做成游戏

这一节是本章唯一的另起走查,它展示了同一条路能走多远。

书在角色扮演的基础上又做了一个互动游戏,叫哄哄模拟器—— 玩家扮演男朋友,任务是通过对话把生气的女朋友哄开心6

做法和上一节一模一样,只是多了一套规则。 书列的四个设计步骤是: 设置游戏场景和角色、制定游戏规则、明确输出要求、提供游戏示例6

规则本身写进了系统提示词,而它的核心是一个数7:

初始原谅值:20
每次交互增减原谅值:
-20 非常生气(回复要打很多感叹号且简短)
-10 生气
0 正常
+5 开心
+10 非常开心(发很多可爱的表情)
特别规则:如果玩家敷衍(比如只回「哦」「嗯」),直接 -30

原谅值到 60 → 通关
原谅值到 0 或负数 → 游戏结束,你被甩了

图说:20 起步、60 通关,意味着至少要净赚 40 分。
按 +10 一次算,理想情况也要连续说对四次;
而一次敷衍就 -30,等于把三次说对的成绩全抹掉。

这个设计值得看清楚:它把一个没有标准答案的问题,变成了一个有明确输赢的问题。 分数不是评估用的,是玩法本身。 书给的输出格式是固定的四行: 对象心情 + 对象说的话、得分、当前原谅值 / 60,以及通关或失败时的固定台词7

4. 第二条路:建一个本地跑的知识库

这一节是主走查的第 2 步。

书对这条路的定位是:使用向量数据库,直接检索人情世故法则(比如餐桌上一般怎么喝酒)3做法和第 06 章一样,但三个参数都换了。

先看数据预处理。 原始资料是 .txt.docx 两种, 要先统一转成 .txt8;另外还有一步是把每一份 md 文档转成结构化格式, 转成一份带固定格子的结构化数据9:

格子装什么
id / name编号与场景名(比如「对长辈敬酒」)
test_system那一段系统提示词
input / output一组输入与预期输出的示例

书还提了一句很实在的细节:统一文档格式时要把英文冒号换成中文冒号9

再看建库那三个参数,和第 06 章逐个对照10:

参数第 06 章(教程版)这一章(天机)
向量模型智谱的远程接口paraphrase-multilingual-MiniLM-L12-v2,下载到本地跑
一块多长500 字符3000 字符
重叠多少50150

这两处改动都值得解释。

本地模型那一条,书给的说明是:它是一个多语言的、用于句子级别语义表示的轻量模型, 适用于处理多种语言的文本,并能够捕捉到句子间的语义相似性11「轻量」和「本地」合起来的意思是:建库不花钱、不受限速—— 和第 12 章那个 m3e 是同一条思路。

块从 500 涨到 3000 这一条书没有解释,但从资料的性质能推出来: 礼仪规则是成段的(「敬酒时先给对方斟酒,然后再给自己斟酒。右手拿酒杯,左手托杯底……」), 切在中间就没法用了。 3000 字大约能装下一整套完整的流程说明。

建库与落盘和第 06 章完全一样:Chroma.from_documentspersist(); 书对最后那一步的说明是确保数据库可以在系统重启后仍然可用,不需要重新构建10

走查这一步的调用是这样的12:

from tianji.knowledges.RAG.demo import model_center

model = model_center()
question = "如何给长辈敬酒?"
chat_history = []
_, response = model.qa_chain_self_answer(question, chat_history)
print(response)

注意那个方法名 qa_chain_self_answer 和第二个参数 chat_history—— 它就是第 12 章那两个类的同款设计:一个问答链方法,外加一份可传可不传的历史。

书没有打印这一次的回答,也没有说这次取回了几块。 项目里另一处查询(查「春节」)用的取回数是 5,而敬酒这一次书没有给这个数13

但取回来的块长什么样,书里有现成的材料可以照出来。 项目把原始资料整理成知识点时用的那段提示词里贴了一份示范材料,讲的正是商务宴请怎么敬酒—— 库里那些 3000 字的块,就是这个形状14:

一块的内容形状(照书里那份用来教模型怎么整理知识点的示范材料概括,不是这次检索的真实输出):

一整段陈述句,不分点、不提问,按流程从头讲到尾——
先给对方斟酒,再给自己斟 → 右手持杯、左手托底 →
自己的杯口比对方低一点,对方放得更低时用左手把它托起来 →
喝完把杯子微微倾斜、杯口朝对方,不要直接倒过来。
书对这种写法的要求是一句话:把相关的知识都划分成一个段落就好。

图说:注意它没有 1、2、3,整段在讲同一套顺序。
这就是块要开到 3000 字的理由——这一整套「先斟谁 → 手怎么放 → 杯口朝哪」,
切开任何一刀,剩下的半块都没法回答「怎么敬酒」。
(那 5 块是另一次查询的数;敬酒这一次书没有给块数,我们也不替它编。)

5. 第三条路和第四条路:一个改流程,一个改模型

这一节是主走查的第 3、4 步,而这两步书给的信息最少。

这两条路和前两条的差别,一句话摆得清:

这条路改的是什么具体动了哪里
第三条:改流程模型一个没换,换的是「一件事拆给几个角色分别做」
第四条:改模型流程一步没换,换的是模型内部那些数

第三条路:多个模型分工协作。 书的原话只有一句: 利用 Agent 架构得到更丰富、更定制化详细的回答3

智能体在第 10 章已经讲过——一个专管理解指令、决定调什么工具的模型; 多个这样的角色互相配合、分工完成一件事,行话叫多智能体。 书没有给这条路的任何代码或输出。

第四条路:训一个自己的模型。 书的原话是: 基于不同优秀的模型基座,在积累大量数据的情况下进行 Lora 微调或全量微调3

这里有两个词要说清:

全量微调是把模型里全部的参数都动一遍;而 LoRA 就是只给模型挂上一小片新参数、 训练时只调这一小片,原来那一大堆全部冻住不动—— 这样要调的数少了几个数量级,一块普通显卡也能训。

书对这条路的完成度非常坦白:目前天机只有送祝福功能3—— 也就是说四条路里,这一条只做出了一个功能。

关于「大量数据」到底是多少,书一个数都没给,只有这五个字。 本组拆解不替它编一个数。

6. 四条路的成本对照

这一节是这一章最值得带走的一张表。

书给了一张配置要求表,而它有一格是空的15:

技术路线书写的电脑配置
只用一段写好的话只需要配置大模型密钥
多个模型协作只需要配置大模型密钥
知识库/(空着)
训一个自己的模型基于 InternLM2 进行

书对前两条路给了一句总结:它们只需要配置大模型密钥,不需要显卡,使用常规笔记本电脑即可运行16

判断(我们的,不是书里的): 知识库那一格空着,但按书自己给的信息可以推出来—— 它用的是本地的轻量模型,而这类模型在普通笔记本上用处理器就能跑, 所以这一行大概率也不需要显卡,只是需要装模型的磁盘空间和一点内存。 如果错,会错在: 如果资料量很大(比如几十万块),本地算向量会慢到不能忍,那时就需要显卡了。 判据是:自己拿一份小资料跑一遍,看建库花了多久。 无论如何,书那一格是空的,不是写着「不需要显卡」——这个区别要记住。

把这张表和前面所有章合起来看,全书的成本阶梯就出来了:

只写一段话 → 一个密钥 (第 03 章、本章第 2 节)
加一个知识库 → 一个密钥 + 一台普通电脑 + 建库那一次的时间 (第 04–07 章)
加多个模型协作 → 一个密钥 + 更多次调用(每一步都要花钱) (第 10 章、本章第 5 节)
训一个自己的模型 → 显卡 + 大量数据 + 会训练的人 (本章第 5 节)

图说:从上到下,每一层都比上一层贵一个量级,而不是贵一点。
这就是为什么第 01 章说这门课整本走「不动模型」那条路。
(这张梯度图是我们排的,书没有把四条路的成本这样并排比较过。)

7. 边界:这一章有三个数不能当书里的数用

这一节按三类来源把这一章的数字分清楚。

它是什么
取回 5 块是项目另一处查询(查「春节」)用的取回数;敬酒这一次书没给
「大量数据」书的原话就是这五个字,没有任何具体数量;别替它填一个
知识库那条路不需要显卡我们的推断;书那一格是空的,不是写着「不需要」

另外三件事也要交代:

第一,这一篇有六张功能截图,全部没有内容。 原文里那六处只剩下「图 1:化解尴尬」「图 2:敬酒」这类图注,图本身没有进入我们手上这一版17

第二,数据预处理那部分给的是工具位置,不是完整流程。 书说项目的 tools/get_data 下存放了一些获取数据的小工具, 主要用于把视频或图片转化为文字,并让读者自行查看参考8

第三,书给的收尾建议是「换个领域照做」: 大家可参考此项目在新的垂直领域中进行应用,例如生活指南(知识库)、聊天助手(提示词)等等18注意括号里那两个标注——它其实是在说:先判断你的问题属于哪一条路。

8. 可带走的

  1. 这个项目的问题没有标准答案:「怎么敬酒」得体与否没法和资料对答案,所以第 11 章那套评估基本用不上;
  2. 同一件事有四条路:只写一段话、建知识库、多个模型协作、训一个自己的模型;
  3. 第一条路只用一段系统提示词,拆成四个部件:设场景、定角色(要用形容词描述特点)、明确要求、给示例;
  4. 给示例就是第 03 章那个少样本,只是换了场合;
  5. 同一条路能做成游戏:哄哄模拟器把「怎么哄人」变成一个 20 起步、60 通关的数;一次敷衍 -30,抹掉三次说对的成绩;
  6. 这是一个通用手法:把没有标准答案的问题,变成一个有明确输赢的问题;
  7. 第二条路和第 06 章同形,三个参数都换了:本地轻量向量模型、块 3000 字、重叠 150;
  8. 块涨到 3000 是因为礼仪规则是成段的(这条理由是我们推的,书没说);
  9. 本地向量模型的意义:建库不花钱、不受限速——和第 12 章那个 m3e 同一条思路;
  10. 第三条路书只有一句话,没有代码也没有输出;
  11. 第四条路是 LoRA 或全量微调;LoRA 是只挂一小片新参数、把原来那一大堆冻住,所以便宜得多;
  12. 书对第四条路的完成度很坦白:目前只有送祝福功能;
  13. 成本阶梯是一层贵一个量级,不是贵一点——这就是第 01 章那条路线选择的全部理由;
  14. 书那张配置表里知识库那一格是空的,「不需要显卡」是我们的推断,不是书的说法。

9. 原文地图

主题原书章原文位置
敬酒这件事、项目背景天机text/09-p161-180.txt:202(搜「餐桌敬酒不仅仅是简单的举杯祝酒」) · text/09-p161-180.txt:212(搜「来事⼉AI」)
四条路天机text/09-p161-180.txt:250(搜「内置 system prompt」) · text/09-p161-180.txt:252(搜「利⽤ Agent 架构得到更丰富」) · text/09-p161-180.txt:254(搜「直接检索⼈情世故法则」) · text/09-p161-180.txt:256(搜「在积累⼤量数据的情况下」)
角色扮演四个部件天机text/09-p161-180.txt:382(搜「设置场景」) · text/09-p161-180.txt:385(搜「定义⾓⾊」) · text/09-p161-180.txt:392(搜「提供⽰例」)
敬酒的那组示例天机text/09-p161-180.txt:409(搜「称谓:妈妈」) · text/09-p161-180.txt:411(搜「节俭⼤师」)
哄哄模拟器与规则天机text/09-p161-180.txt:433(搜「哄哄模拟器」) · text/09-p161-180.txt:436(搜「制定游戏规则」) · text/09-p161-180.txt:456(搜「原谅值为20」)
数据预处理与统一格式天机text/09-p161-180.txt:349(搜「视频或图片转」) · text/09-p161-180.txt:351(搜「转换成json格式」) · text/09-p161-180.txt:356(搜「替换为中文冒号」)
知识库那条路的做法天机text/09-p161-180.txt:600(搜「使⽤Sentence-Transformer模型来处理」) · text/10-p181-188.txt:31(搜「chunk_size=3000」) · text/10-p181-188.txt:58(搜「持久化存储」)
那个本地向量模型天机text/10-p181-188.txt:2(搜「paraphrase-multilingual-MiniLM-L12-v2」) · text/10-p181-188.txt:10(搜「多语⾔的、」)
敬酒那一次的调用天机text/10-p181-188.txt:305(搜「如何给⻓辈敬酒」) · text/10-p181-188.txt:307(搜「qa_chain_self_answer」)
另一处查询用的取回数 5天机text/10-p181-188.txt:279(搜「k_num=5」) · text/10-p181-188.txt:292(搜「期望返回的文档数量」)
配置表与「不需要显卡」天机text/09-p161-180.txt:263(搜「不需要显卡」) · text/09-p161-180.txt:272(搜「知识库」) · text/09-p161-180.txt:274(搜「InternLM2」)
只有送祝福功能天机text/09-p161-180.txt:257(搜「只有送祝福功能」)
六张没有内容的截图天机text/09-p161-180.txt:235(搜「化解尴尬」)
换个领域照做天机text/10-p181-188.txt:320(搜「⽣活指南」)

Footnotes

  1. 出处:「天机」第 202 至 205 段(text/09-p161-180.txt:202,搜「餐桌敬酒不仅仅是简单的举杯祝酒」)。那张三行对照表是我们排的,书没有把这个项目和前面那个知识库项目做过比较。

  2. 出处:「天机」第 212 至 215 段(text/09-p161-180.txt:212,搜「来事⼉AI」)。原文还有一句口号式的话:只有人情世故才是未来 AI 的核心技术。项目本身在第一部分的检索增强简介那一章就被提到过一次(text/01-p1-20.txt:502,搜「天机是 SocialAI」)。

  3. 出处:「天机」第 246 至 257 段(四条路依次见 text/09-p161-180.txt:250,搜「内置 system prompt」;text/09-p161-180.txt:252,搜「利⽤ Agent 架构得到更丰富」;text/09-p161-180.txt:254,搜「直接检索⼈情世故法则」;text/09-p161-180.txt:256,搜「在积累⼤量数据的情况下」;完成度那句见 text/09-p161-180.txt:257,搜「只有送祝福功能」)。原文说这四种「任何一种皆可实现」。 2 3 4 5

  4. 出处:「天机」第 380 至 393 段(text/09-p161-180.txt:382,搜「设置场景」;第二步见 text/09-p161-180.txt:385,搜「定义⾓⾊」;第四步见 text/09-p161-180.txt:392,搜「提供⽰例」)。表里那几个例子取自原文第 ② 步的说明和第 ④ 步那条数据。 2

  5. 出处:「天机」第 398 至 423 段(text/09-p161-180.txt:409,搜「称谓:妈妈」;输出见 text/09-p161-180.txt:411,搜「节俭⼤师」)。同一条数据里还有第二组示例(奶奶、身体不大好、家宴开场、半分钟以内)。系统提示词末尾那四个格子的原文是「称谓:,长辈特点:,具体场景:,演讲时间:____」。 2

  6. 出处:「天机」第 425 至 443 段(text/09-p161-180.txt:433,搜「哄哄模拟器」;四个设计步骤见 text/09-p161-180.txt:436,搜「制定游戏规则」)。 2

  7. 出处:「天机」第 448 至 478 段(规则见 text/09-p161-180.txt:456,搜「原谅值为20」)。规则、分值、输出格式全部照录原文。图说里那两笔账(至少要净赚 40 分、一次敷衍抹掉三次)是我们算的,书没有算过。 2

  8. 出处:「天机」第 346 至 350 段(text/09-p161-180.txt:349,搜「视频或图片转」)与第 604 至 721 段那段转换代码(text/09-p161-180.txt:606,搜「转换成统⼀格式的.txt数据」)。 2

  9. 出处:「天机」第 351 至 363 段(text/09-p161-180.txt:351,搜「转换成json格式」;冒号那一句见 text/09-p161-180.txt:356,搜「替换为中文冒号」)。原文列的格子是 id、name、test_system、input、output。 2

  10. 出处:「天机」第 597 至 602 段(text/09-p161-180.txt:600,搜「使⽤Sentence-Transformer模型来处理」)与第 26 至 59 段(text/10-p181-188.txt:31,搜「chunk_size=3000」;落盘那句见 text/10-p181-188.txt:58,搜「持久化存储」)。那张三行对照表是我们排的,书没有和教程版比较过参数。 2

  11. 出处:「天机」第 9 至 12 段(text/10-p181-188.txt:10,搜「多语⾔的、」;模型名见 text/10-p181-188.txt:2,搜「paraphrase-multilingual-MiniLM-L12-v2」)。「建库不花钱、不受限速」是我们的推论,书只说它是轻量模型,没有算过成本。「块涨到 3000 是因为礼仪规则是成段的」同样是我们的推断;书对这个参数一个字都没解释。方框里那段敬酒礼仪原文见 text/10-p181-188.txt:141(搜「右⼿拿酒杯」)。

  12. 出处:「天机」第 301 至 311 段(text/10-p181-188.txt:305,搜「如何给⻓辈敬酒」;方法名见 text/10-p181-188.txt:307,搜「qa_chain_self_answer」)。原文只印了这段调用代码和一句「打印出回答」,没有把回答本身印出来。

  13. 出处:「天机」第 275 至 292 段(text/10-p181-188.txt:279,搜「k_num=5」;那个参数的说明见 text/10-p181-188.txt:292,搜「期望返回的文档数量」)。那一次查的是「春节」,不是敬酒。 本组拆解把这个数写在这里,是为了让你知道这个项目取几块的量级,不是说敬酒那次也取了 5 块。

  14. 出处:「天机」第 133 至 149 段(那段整理知识点用的提示词见 text/10-p181-188.txt:135,搜「信息抽取的知识库语料准备」;敬酒那份示范材料见 text/10-p181-188.txt:141,搜「右⼿拿酒杯」;书对写法的要求见 text/10-p181-188.txt:137,搜「只需要把相关的知识都划分成⼀个段落」)。方框里那段是我们照原文概括的,不是照抄;「这就是块要开到 3000 字的理由」也是我们的推断,书对那个参数一个字都没解释(同脚注 11)。这份材料在原书里是「准备语料时喂给模型的示范」,不是某一次检索打印出来的块——书从头到尾没有印过天机这个库的任何一次检索输出。

  15. 出处:「天机」第 265 至 274 段(空着那一格见 text/09-p161-180.txt:272,搜「知识库」;最后一行见 text/09-p161-180.txt:274,搜「InternLM2」)。表里知识库那一行在原文里是一个斜杠,不是任何文字说明。

  16. 出处:「天机」第 262 至 263 段(text/09-p161-180.txt:263,搜「不需要显卡」)。注意这句话的主语只有前两条路,原文写的是「其中,Prompt 和 Agent 只需要配置大模型秘钥,不需要显卡」。

  17. 出处:「天机」第 234 至 243 段(text/09-p161-180.txt:235,搜「化解尴尬」)。六处图注依次是:化解尴尬、敬酒、请客、人际交流、送礼、送祝福。

  18. 出处:「天机」第 318 至 320 段(text/10-p181-188.txt:320,搜「⽣活指南」)。这是全书正文的最后一段实质内容,后面只剩致谢。