Datawhale Jev Cookbook 202610 笔记1
第一章笔记:认识 Jev
课程:Datawhale《jev-cookbook》第一章「认识 Jev」
作业:
学完要能说清「有限选项判断」和「自由写文字」的区别,
完成一次多问题调用并用代码分流,会判断任务适不适合 Jev,
能写出不泄露答案的 state,并把模型输出交给代码策略处理。
打比方
想象你的班里有两个同学:
- 小明(聊天大模型 LLM):作文写得特别好,你问他什么,他都回你一大段话。
但你想要的是一句"要"或"不要",他却写了一篇小作文,你还得自己从里面找答案,
找错了就出事。 - 小裁(Jev,裁判模型):他不写作文,他只当裁判。
你把"案发现场"(材料)给他,再递上一张出好的题目卷(选择题、打分题、判断题),
他秒回你答案,而且每个答案后面还跟着一个"有多大把握"的数字(概率)。
Jev 就是这个"裁判"。它叫System One(系统 1),
名字来自一本书《思考,快与慢》:系统 1 就是那种不假思索、凭直觉快速判断的脑力——
看到蛇马上跳开,不需要写一篇《论蛇的危险性》。
1. 作业①:说清 Jev 和聊天大模型的区别
| 对比 | 聊天大模型(小明) | Jev(小裁) |
|---|---|---|
| 训练目标 | 学会把话说得讨人喜欢 | 学会把概率报得和真实结果对得上 |
| 输出 | 一大段自由文字 | 你问什么,他答什么:选项 + 概率 |
| 会干什么 | 写作文、写代码、解释问题 | 只做判断,不写文章、不解释 |
| 谁来用他 | 人(读他的话) | 程序(直接拿数字去做决定) |
为什么要这么设计?程序读不懂"我觉得可能大概需要转人工吧"这种话,
但一眼就能读懂0.93。Jev 把"判断"直接变成数字,程序拿来就能用,
不用再从一大段话里"猜"答案——又慢又容易坏的那一步就没啦。
两个小边界(要记住):
- Jev 目前只吃文字,图片、声音、视频都不行。
- 他不取代大模型:写作文、开放聊天还是找小明;要"快、准、带概率的判断"才找小裁。
一条工单的两种走法(课程里的例子):
工单:「充电器冒烟,刚买两天」 小明路线:工单 + 提示词 → 生成一段话"这可能涉及安全问题,建议转人工……" → 程序还要从这段话里解析出结论 → 才能做动作 小裁路线:工单 + 选择题{安全问题, 退款, 普通咨询} → 概率{安全问题: 0.93, 退款: 0.05, 普通咨询: 0.02} → 代码看一眼 0.93 超过红线 → 立刻转人工(注意:这组数字是课程里举的示意例子,不是每次真实调用都会得到一模一样的数。)
2. 作业②:认识三种原语——裁判的三种题型
Jev 的全部词汇就是三种题型,课程里叫三种原语:
| 原语 | 像哪种题 | 例子 | 答案长什么样 |
|---|---|---|---|
Choice | 选择题(从选项里选一个) | “用户的主要诉求是什么?A 排修 B 退款 C 咨询” | 选中项 + 每个选项的概率 |
Score | 打分题(按程度打分) | “用户有多生气?0 平静 → 1 不满 → 2 非常不满” | 一个分数(如 1.4)+ 各档概率 |
Noul | 判断题(这话是真的吗) | “这条消息紧急吗?” | 0~1 之间的一个数(如 0.94) |
最爽的一点:一次考试可以同时发三种题!
三个题互相独立、并行批改,加题目几乎不拖时间。
这就是课程说的"一次调用,三种原语"。
关键纪律:原子问题(一题只问一件事)
好的题目:专家看几秒就能下结论的事,才配单独成题。
反面例子:“这个工单严重吗?你们能自动处理吗?”——一题塞了两件事,答案就"串味"了。
复杂的判断要拆成多道题,最后在代码里用自己的规则合起来算。
3. 作业③:发出第一次调用(三分钟上手)
最快的玩法是去官方 Playground 网页上直接试。(简化版):
state="我连续三天连不上 Stripe,一直在丢订单,尽快处理!"questions={"urgency":Noul(instructions="这条消息紧急吗?"),# 判断题"intent":Choice(instructions="用户主要想要什么?",# 选择题criteria={"troubleshoot":"修好它","refund":"退款赔钱","inquiry":"只是问问"}),"frustration":Score(instructions="用户有多受挫?",# 打分题criteria=["平静","有些不满","强烈不满"]),}resp=client.system_one(state,questions)# 一次调用,三份带概率的答案state 是什么?就是把"案发现场"原样递给裁判的证据材料。
用户的话、订单信息、聊天记录……都塞进去。
裁判只根据证据答题,所以材料要给够、要真实。
重要规矩:state 里不许提前泄露答案。
如果你把"这是一个愤怒客户的紧急投诉"写进 state,再问"紧急吗?"——
那裁判就不是在判题,是在抄答案了,概率也就没意义了。
写 state 的口诀:给证据,不给结论。
由于没有免费额度,改为离线版。
浏览器打开 Notebook,从上往下 Shift+Enter 逐格运行。
在这里插入图片描述
进阶玩法:把赛事指挥台那格的>= 0.7改成>= 0.1再重跑,看看哪些消息会被转人工
改成>=0.1后,
- 改之前(阈值 0.7):
water_station → 补给组(优先处理) - 改之后(阈值 0.1):
water_station → 补给组(优先处理)**(转人工)**← 多了这四个字
补水站那条消息模型给的「需要人工」概率是 0.22,旧规则 0.22 < 0.7 不转人工;
把代码里的阈值降到 0.1 后,0.22 ≥ 0.1 就转了。
模型一次都没重新调用,决策行为却变了——因为规则在代码里,改代码就行。 这就是「模型管语义,代码管规则」的亲手体验。
4. 作业④:判断什么活儿适合交给 Jev(场景地图)
五大类适合的活儿:
- 软件里的自动判断:代码管流程,Jev 出判断,后台可以跑上百万次不用人盯。
- 实时应用:大约 0.15 秒出答案,快到能进游戏和界面。
- 海量批量判断:同一个判断跑一百万次,成本约是大模型调用的百分之一。
- 万能校验员:查大模型有没有胡说(幻觉)、引用能不能支撑结论、有没有违规话术。
- 给大模型当管家:决定哪条请求发给哪个模型,拦住坏人捣乱。
七种常见"问法",都能落到三种题型上:
- 是哪一类?(意图、主题、风险)→ Choice
- 有没有?(垃圾、欺诈、紧急、敏感)→ Noul
- 打几分?(严重度、相关性、质量)→ Score
- 该走哪条路?(派给谁、转不转人工)→ Choice + 代码分支
- 找最相关的?(搜索排序)→ 组合使用
- 核对有没有错?(逐条校验)→ Noul
- 抽个特征?(回填表单)→ Score / Choice
不适合交给 Jev 的:写作文、开放问答、创作——这些还是大模型的活儿。
Jev 常在前面先把"该走哪条路"快速定下来。
还有一条铁律:法务、理赔、开除员工这种高风险终审,
最多让 Jev 当参谋,拍板的必须是人(“不确定就转人工”)。
一句话判断法:答案是不是已经有一小盒选项了?
是 → 适合 Jev;答案要现编一大段话 → 找大模型。
5. 作业⑤:概率为什么可信——天气预报的道理
Jev 训练时走了一条特别的路(课程叫 RLCD):
别的模型练习"把话说好听",它练习"把概率报准"。
什么叫"报准"(校准)?想天气预报:
- 预报"80% 下雨"的那些日子里,长期看大约 80% 的日子真下了雨 → 这预报就"校准"。
- 它不保证今天一定下雨!单看某一天,预报 80% 也可能放晴。
课程用 20 条数据做了个小实验:
预测 0.2 那组实际发生了 10%,预测 0.8 那组实际发生了 80%——两组整体都准,
但组里单独某一条仍然会错。
所以正确的用法是:
- 用概率做一群东西的决定:排序、分流、抽检(看整体频率)。
- 单次高风险动作:设阈值(比如 ≥0.7 就转人工)+ 人工复核。
- 记住两句咒语:校准好 ≠ 次次对;置信度高 ≠ 一定对。
顺便记个价格:输入约 $0.042 / 百万 token,输出免费,
一次判断几百毫秒——便宜到可以"投机式多问":
拿不准用不用得上的问题,也可以一并塞进同一次调用里问。
6. 综合实验:赛事指挥台(把上面全部串起来)
一场夜跑比赛,指挥台同时收到三条现场消息:
- “2.4 公里处有跑者脚踝扭伤,无法前进”(受伤)
- “7 号补水站纸杯用完了,请补送两箱”(补给)
- “完赛 T 恤明天早上还能领吗?”(咨询)
做法:每条消息发一次调用,同时问三道题——
- 哪类事件?(Choice:医疗 / 补给 / 咨询)
- 多快处理?(Score:可赛后 / 30 分钟内 / 10 分钟内 / 立即)
- 需要人工到场吗?(Noul)
然后 Python 代码按规则分流(这就是"代码策略"):
t=r.choices["incident_type"].choice# 模型给的类型human=r.nouls["requires_human"].noul>=0.7# 阈值是应用自己定的政策print(ROUTES[t],"(转人工)"ifhumanelse"")结果:受伤消息 → 医疗人员(转人工);缺纸杯 → 补给组;T 恤问题 → 自动回 FAQ。
这一实验最重要的一句话:模型管语义,代码管规则。
"≥0.7 转人工"这条规则完全写在代码里——想改阈值?改代码就行,不用重问模型、不用改提示词。
不可妥协的规则(比如医疗类永远转人工)更要写死在代码里。
7. 本章自带的练习(先自己做,再看答案)
题目:把"该不该给这条工单升级到人工?"设计成一个合格的问题。该用哪种原语?哪种写法违反了原子性?
参考思路(课程给的)"升级到人工"其实混了两个判断:
① 问题严不严重(可以用 Score 或 Noul);
② 当前自动流程能不能处理(另一个 Noul 或 Choice)。
合格写法是拆成两个独立问题,最后让代码把它们组合起来。
如果一个 Noul 同时问两件事,任何一个因素变了都会污染概率,答案就不可信了。
8. 表格
| 概念 | 一句话(小学生版) |
|---|---|
| System One / Jev | 状态 + 出好的题 → 带概率的答案,不写作文 |
| 三原语 | Choice 选一选、Score 打个分、Noul 判断真假 |
| 原子问题 | 一题只问一件事,组合的事交给代码 |
| state | 给裁判看证据,但不许把答案写进证据 |
| 校准 | 预报 80% 的日子里约 80% 真下雨;但今天未必下雨 |
| 分工 | 模型管判断,代码管规则,高风险的事人拍板 |
10. 动手作业(课程强烈建议:亲手改、亲手跑)
改着玩:
- 把工单从"充电器冒烟"改成"想问发票怎么开",看概率怎么挪。
改动前:
修改如下:
EXP_STATE=("用户:想问一下发票怎么开?")EXP_QUESTIONS={"urgency":Noul(instructions="这条消息是否表达了紧迫性?"),"intent":Choice(instructions="用户的主要诉求是什么?",criteria={"troubleshoot":"希望排查或修复连接问题","refund":"要求退款或赔偿","inquiry":"只是咨询,不要求立即处理"}),"frustration":Score(instructions="用户的受挫程度如何?",criteria=["平静,仅陈述事实","有些不满","强烈不满,有流失风险"]),}EXP_OFFLINE={"urgency":_FakeAnswer("noul",noul=0.94),"intent":fake_choice({"troubleshoot":0.82,"refund":0.03,"inquiry":0.15},0.8),"frustration":fake_score({0:0.05,1:0.35,2:0.6},["平静","有些不满","强烈不满"],0.87),}resp_a=ts.call(EXP_STATE,EXP_QUESTIONS,EXP_OFFLINE,"实验A·三原语一次调用")show(resp_a)输出:
在离线模式下, 概率数字是代码里写死的人工示例,改什么文字它都不会动 —— intent 还是troubleshoot、概率还是 0.82,一模一样。这不是改错了,是离线模式的设计本意:只演示代码路径,不反映真模型反应。
- 把"urgency"的问题措辞改三遍,看答案稳不稳。
方法:将下面代码修改:
"urgency":Noul(instructions="这条消息是否表达了紧迫性?"),1"这条消息紧急吗?"
2"用户是不是在催我们加急处理?"
3"这条消息是不是十万火急?"
离线模式下你会看到 三遍全是 0.94,纹丝不动 ——和上次一样,因为答案是写死的假数据。所以「答案稳不稳」这个问题,离线模式下测不出来,它的「稳」是假稳。
- 在指挥台实验里把 0.7 的阈值改成 0.5,看哪些消息会被转人工。
三次实验结果对比(模型给的概率固定:0.93 / 0.22 / 0.04)
| 消息 | 需要人工的概率 | 阈值 0.7(原版) | 阈值 0.5(刚跑的) | 阈值 0.1(上次) |
|---|---|---|---|---|
| runner_injury 受伤 | 0.93 | 转人工 | 转人工 | 转人工 |
| water_station 缺纸杯 | 0.22 | 不转 | 不转 | 转人工 |
| shirt_pickup T恤咨询 | 0.04 | 不转 | 不转 | 不转 |
读表
判断规则就一条:概率 ≥ 阈值 → 转人工。阈值是一道门槛:
- 0.5 和 0.7 结果相同——因为 0.5 和 0.7 都落在 0.22 到 0.93 这段「空档」里,没有概率值恰好夹在中间,所以转人工的人一样多
- 0.1 独不一样——门槛降到 0.22 之下,water_station(0.22)刚好迈过了门槛,被拦去人工
背后的工程含义
阈值是「灵敏度旋钮」:
- 调低(0.1)→ 更多消息转人工 → 保守、稳妥,但人工成本高
- 调高(0.9)→ 更少转人工 → 激进、省钱,但容易漏掉真问题
而且改这个旋钮只需要改代码里的一个数字,模型一次都不用重新调用、提示词一个字都不用动——这就是「模型管语义,代码管规则」的全部含义。