8.1 状态设计与请求纪律


8.1 状态设计与请求纪律

本节摘要:判断质量的一半在喂给 Jev 什么。状态设计四规则:优先用对象(字段可被 instructions 用反引号路径引用,比揉成一段话稳且可维护);字段名自解释只放相关状态——独立实测把"塞满无关内容的臃肿 state"列为 Jev 主要失效模式,无关信息稀释判断;守容量红线(state + 最长问题 ≤ ~32K token / 约 15 万字符,整请求 ≤ ~64K)。请求纪律三条:问题 ID 当变量名管(稳定、有意义);instructions 写判别标准;相同 (state, questions) 直接缓存——Jev 是无状态纯函数,缓存语义干净,高频场景能再砍一半成本。

学习目标

阅读完本节,你应当能够:

  1. 把一份"揉成一段话"的 state 重构成对象化 state 并配上路径引用。
  2. 审出 state 里的无关内容并裁剪到容量红线内。
  3. 建立带缓存与稳定问题 ID 的请求封装。

一、状态设计四规则

规则一:优先用对象

{ "state": { "ticket": { "subject": "Stripe 连接失败", "body": "试了三天,客户付不了款", "tier": "paid" }, "account": { "churn_risk": 0.82 } }, "questions": { "vip_escalate": { "type": "noul", "instructions": "`customer_tier` 为付费用户且 `body` 表达了强烈不满" } } }

反引号路径引用(如 `ticket.body`)让每个问题精确锚定它要看的字段——比"在这段文字里判断"少了定位歧义,也让 state 的演进(加字段、改结构)不破坏既有问题。

规则二:字段名自解释

churn_risk 一眼可读;c_rf3 迫使模型猜语义。字段名是写给 Jev 看的 prompt 的一部分

规则三:只放相关状态

独立深度评测的失败模式清单(完整版见第 10.1 节)里,"臃肿/无关的 state"(整段数据库 dump、无关日志、超长上下文)直接导致判断质量下降——不是超限报错,而是悄悄变差。纪律:每个字段都应该至少被一个问题引用;没有任何问题看它的字段,删掉。

💡 相关性审计法:把 questions 里所有反引号路径收集起来,与 state 的字段集合做差集——差集里的字段就是"没人看"的候选删减项。

规则四:容量红线

红线
state + 最长问题 ≤ ~32K token(约 15 万字符)
整个请求(state + 所有问题) ≤ ~64K token

超线的处理:在代码里裁剪(截断旧日志、摘要长文、只带最近 N 轮对话)——宁可少而相关,不要多而稀释。超线不是"报错那么简单"与"没超就没事"的二值问题,接近红线时质量已在下滑。

二、请求纪律三条

  1. 问题 ID 当变量名管:稳定(不改名——它是日志与回归集的主键)、有意义(is_urgent 而非 q1)。ID 不发给模型,改名只影响你的代码与历史数据的对齐成本——所以从第一天就起好。
  2. instructions 写判别标准:复述第 3 章的总原则——"包含威胁性言辞或人身攻击" 优于 "判断是否违规"。所有 instructions 集中定义为模块级常量(如各模式脚本里的 QUESTIONS),随代码走版本控制。
  3. 缓存相同请求:Jev 调用是纯函数(无状态、无副作用、同输入同分布输出),缓存语义干净:
import hashlib, json def jev_cached(state, questions, ttl=86400): key = "jev:" + hashlib.sha256( json.dumps({"s": state, "q": questions}, sort_keys=True, ensure_ascii=False).encode() ).hexdigest() if (hit := cache.get(key)) is not None: return hit result = _jev_call(state, questions) cache.set(key, result, ttl=ttl) return result

分类、审核这类输入高度重复的场景(同一商品描述被百万次审核),缓存命中率可观;排序场景(query×候选 组合爆炸)则慎用,TTL 取短。

三、一个重构示例

# ❌ 前:揉成一段话 state = f"客户 {name},等级 {tier},流失风险 {risk},说:{message}" # ✅ 后:对象化 + 路径引用 + 裁掉无关字段 state = { "customer": {"tier": tier, "churn_risk": risk}, # 两个字段都有问题引用 "message": message, } questions = { "vip_escalate": {"type": "noul", "instructions": "`customer.tier` 为 paid 且 `message` 表达强烈不满或流失意向"}, }

差异不只是可读性:前者的"流失风险 0.82"混在文本里,问题的措辞被迫依赖模型 parsing;后者的判断锚点显式、可回归测试(第 9 章)。

本节要点回顾

  1. 四规则:对象化(路径引用)、字段自解释、只放相关(差集审计)、守红线(32K/64K,近线即裁)。
  2. 三纪律:ID 稳定如变量名、instructions 是判别标准、纯函数语义放心缓存。
  3. 原则:判断质量的一半在输入设计——喂什么、怎么问,比调什么都重要。

输入设计好了,怎么安全地让真实流量用上它?下一节给出影子模式四步法——先当"旁听生",再当"值班员"。


作者与出处
原作者: 灏天文库
整理: 灏天文库整理
本站整理收录,版权归原作者/开源协议所有;欢迎通过原文链接访问源仓库。
发布者: 作者: 灏天文库 转发
评论区 (0)
U