外观
第 20 章 综合实战,从零到生产级智能体
本章取第 19 章五件东西里的三件,映射表、失败模式审查和选型纪律,从头到尾做一个完整项目,一个此前没出现过的中文制造场景,从需求起步,选型、实现、评测、上线、运营全程走完,每一步借的都是前面章节立好的机制与判据,不另发明新的做法;方法搁着不用只是纸面资产,全书的机制到这一章收口,二十章铺开的能力最后落到一份具体需求上,一次性兑现。场景是一家生产汽车空调压缩机的制造企业,底下两个工厂、十二条产线,每周一早上九点开经营管理会,会前要两个厂各出一份经营分析周报;做周报听起来平淡,可越是这种不起眼的场景越能检验方法是否有效,这份周报没有一处靠灵感决定,架构由一串问句推导出来,代码从第 2 章那几十行回路扩展开,上线靠评测与观测托着。全章按选型、实现和运营切成三节,20.1 先把值不值得做算清楚,再拿 19.2 的映射表从头走到尾,十二行问完产出一份架构决策记录;20.2 按回路、工具、上下文、评测的顺序把系统搭起来,顺带讲清楚顺序为什么非得是这样;20.3 讲上线之后的事,监控、成本与迭代节奏都在内,并把什么时候该重构写成一份条条可判定的信号清单。
20.1 需求分析与架构选型
经营分析周报要两个厂各出各的。每一份得覆盖产量与订单达成、良品率、停机时长、能耗和准时交付这几项,再附带一段异常归因,把上周最要紧的两三个异常分别是什么原因说清楚。
眼下是一名数据分析师在负责这份周报。每周一凌晨,得先从制造执行系统、ERP、能源表计和车间交接班记录四个地方把数据取齐,再制表、写稿,大半天耗在取数和排版上,真正用来分析的功夫不到两成。管理层把需求提得很朴素,周一六点系统出初稿,分析师只做核对与修改,九点开会时定稿已经发到每位与会者的邮箱。案例本身是为教学编出来的,企业隐去了名字,时间线与数字都是虚构场景里的工程记录,机制则逐条有出处。
动手做技术以前,先做一个更粗的估算,看值不值得做。风险有个直观的衡量口径,叫损害乘以发生概率。服务器做备份,防的是硬盘故障而不是陨石,真来一颗陨石,损害当然大得多,可概率低到不用理会。把这个口径搬过来判断做不做,算式要换一换,附加价值减去损害乘发生概率,再减去缓解措施的花费,粗略算出的数该明显大于零。要是算出来不为正,先别改方案,按顺序问四个问题,这个流程该用模型自动化,还是常规方案更合适;风险压不压得下去;附加价值提不提得上去;这个应用未来的全部潜在价值是不是都算进来了,比如再往后继续开发,或者挪到别的场景去用。
算式里缓解措施的花费这一项,背后还该有一套处置办法。风险定了性,出路不止消除一条,加上消除一共四式。最小化把它压到能接受的水平;转移交给另一方承担,买网络安全险是常见形态,只是保险公司如今也要求客户自己先有基本防护,光靠转移并不聪明;接受也是正当的一式,风险本身小,或者措施贵过损失,明确记录下来接受它;四式还可以叠着用,压一层、保一层、留一层给将来的替换。做安全容易犯的错误,是把每个风险都往消除上推,推不动就心里不安;只要是有意识算过之后的取舍,接受和转移同样是负责任的答案。四式落到眼前这个案例也直白,初稿写错的风险,靠分析师核对那道闸最小化,余下的小概率差错,靠“初稿只是初稿”接受下来,四式里用两式就够。
周报这个案例,算起来干脆。附加价值很明显,分析师每周大半天耗在取数和排版上,省下来的时间全都还给分析本身。损害最大也就是初稿写错一处,而需求里本来就设了分析师核对这道闸,损害和概率都有限,缓解措施也花不了多少。算下来明显为正,这件事值得做,再往下才轮到怎么搭的问题。
值不值得做,算成本之外还有三条更快的判据,任务本身有价值,产出易于验证,回路里有一个积极的人。编程能成为生成式 AI 的招牌用例,三条全占是最根本的原因,写代码贵、值得省,产出能编译、能跑、能过质量工具,验证的途径很多,用代码的人有动力盯着产出、不满意当场改掉。拿周报对照,三条也全占。大半天的人力是实实在在的价值,指标跟 BI 报表对得上是硬验证,分析师那道核对闸就是回路里积极的人。手头用例不止一个时,再拿一张四象限图排次序,业务价值一根轴、实施难度一根轴,好实施又有价值的那个角先做。从那里起步不是挑容易的做,第一个项目做成,能力攒下了,信任也赢下了,排在后头难做的项目才轮得到排期。搜索、摘要、问答这类任务,正是常在那个角里的类型。
需求整份只有一页纸。接下来的动作次序,第 19 章早就定好了,先问任务,再动技术。把 19.2 的映射表取出来,十二行自上而下,一行接一行问过去。
档位问句走完前五行,档位就定下来了。第一行问,只靠生成文本能不能完成任务,答案是不能。上周的停机时长在制造执行系统里,订单在 ERP 里,模型参数里没有这些数,直连模型这一档出局,判据是第 9 章的问题一。
第二行问的是,答案会不会本来就在模型参数里,答案是不会,那就得给回路挂上工具,去内部系统取数。交接班记录是做归因的素材,按第 6 章的方法做成检索。第三行问解法能不能写成固定流程,答案是能,取数、算指标、筛异常、归因、成稿五步,每周顺序都一样,伪代码能覆盖八成以上情况。架构就定在工作流这一档,控制权留在开发者手里,判据是第 9 章问题二加第 10 章的顺序式。
第四行问的是,各步骤的专长拉不拉得开。指标计算归 SQL 与 Python,异常筛选靠阈值规则,真正非模型不可的只有归因与成稿两处语言节点,专长分化不够,第 9 章第一道闸不放行,多智能体编排就用不上。第五行问子任务之间独立不独立,答案是不独立,指标没算完谈不上筛异常,异常没筛出谈不上归因,只能顺序执行,并行与监督者都用不上。档位到这里定下来,工作流形态,中间嵌两处语言节点。
第六行往下问的是另外几件事,第一件是记忆。一份上下文装不装得下,答案是装得下,单周指标汇总几千 token、异常明细几十条;装不下的是全年明细和全部交接班记录,这两类不进常驻上下文,归因节点按需检索、即时进窗口,第 7 章即时检索用的就是这个。任务要不要跨会话延续,答案是不要,每周独立成报,上周结论作为对比基线写进本周数据快照,那是数据不是记忆,第 8 章的长期记忆第一版不启用。第 19 章转述过的那条反向提醒,在这儿正好用上,无状态更简单,也更快。
权限这件事在第八、第九两行。用 Rule of Two 逐条套,交接班记录是一线员工随手写的文本,占不可信输入一条,经营数据算敏感数据,再占一条,第一版系统只读数据、只出报告,不自动发送,也不改任何业务状态,第三条不占。占两条、空一条,硬线不触发,报告就能无人值守生成。
占到不可信输入这条,不是说数完就结束了,第 13 章的防线还得接着装。交接班记录是流进上下文的自由文本,13.1 说过,这类文本天生就能夹带指令,往记录里埋一句“停机都记成设备老化”,归因就会跟着跑偏。污染本身就在叙事里,肉眼审稿未必看得出来。
落到具体做法上是两件事。检索结果进入上下文时,用定界符包住并标明来源,归因结论则必须引原文片段作证据。分析师核对时,每条归因都要能对回原始记录,对不上就当成疑点。这套做法从第 6 章“只依据材料”那条纪律变过来,差别只在材料的用法,问答里材料直接当答案念,归因里材料只当证据用,结论能对得回记录才算数。
第九行问到这儿反而轻松。动作不可逆吗?第一版没有不可逆动作,审批门一扇都不用装。发送始终握在人手里,分析师按发送键那一下,就是确认。
往细里说,这跟 15.1 的里程碑确认不是一回事。那边是先批方案、再做阶段验收的闸门,这边走得更彻底,不可逆动作干脆交给人亲手执行。15.1 开头讲过,demo 阶段的群消息一直由人手动点按钮,而这个案例把这个做法原样保留进了生产,这是设计,不是妥协。
成本与延迟,轮到第十、十一两行来把关。第一问,交互要不要秒级在场,答案是不要。周报是周级长任务,周一凌晨定时触发,走第 15 章的 worker 形态,跑完落盘等人来取。后一问,流量大到需要计较成本吗,答案是,一周两次任务谈不上流量,绝对金额预计很小;可单次任务要过几千条记录,第 14 章的 token 成本记录第一天就开始记。防的不是超支,是回路行为漂移,这种漂移留到 20.3 展开。
第十二行收尾,问成败能不能判定,答案是能,指标数值跟 BI 报表逐项核对属于硬比对,历史异常有复盘记录当标注,成稿质量写成判定要点交给裁判,第 12 章的回归闭环就建得起来。
十二行问完,方案就成形了,没什么可再争的。整体长这样,五步确定性工作流,两处语言节点走模型,交接班记录加定界符挂检索,不上长期记忆,无人值守生成,发送留给人,worker 定时部署,历史周报与复盘记录就拿来当任务集。评审会上过这份方案,过的正是这十二行答案以及每行的出处。十二行的答案全往同一边倒,是这个案例碰上的运气,不是方法的常态。19.2 讲过,知识记忆、权限和成本延迟这三件事随时可能推翻档位的答案,换成自己的项目,别指望也能这么顺。
市面上有个现成系统能对照。它是个智能报告产品,用户说一句想去上海玩三天,一队专项智能体就分头搜行程、配图、给提示,最后排成一份 PDF,调度走监督者式。报告类任务拆成取材、生成和排版,这个拆法值得借用。
拿映射表一问,结论就不同了。各步骤调用顺序基本固定,专长分化也不明显,第三、四行问下来,停在工作流已经足够。监督者做运行时调度,在这任务上换不来对等收益,还要多花几十倍 token,第 9 章那组实验里,多智能体编排的用量是直连模型的四十多倍。再说这个系统只演示了跑得起来,没拿评测证明调度带来了收益。
两侧各有值得参照的示范。流水线这一侧,那个分析上千家公司描述的系统,6.1 算过它的代价,关键词匹配作粗筛,漏掉相当一部分。它最终做成加载、预筛、结构化分析、汇总的四步流水线,每一步都能独立测试。自主那一侧,第 9 章第四级那类任务,下一步做什么要看上一步跑出什么,点哪个按钮要看了上一屏才知道,答案靠探索才浮现出来,只有这种任务,才值得把控制权交给模型。周报的答案是算出来的,不是探索出来的,落点跟流水线那侧相同。
模型与外部依赖这块,照 19.5 的三个动作走。第一个动作是查时效,第一版统一用 DeepSeek 的 deepseek-v4-flash,端点和模型名都看官方文档,核实日期记进决策记录。
第二个动作算锁入面。任务集起步时备下二十六份历史周报和四十条复盘记录,不依赖任何厂商。这份任务集不是一次定死的,分析师每周的改稿会不断补进新案例,这条回流留到 20.3 展开。接入走 OpenAI 兼容端点,业务代码只认第 2 章那两行 client 定义,锁入面很小。
第三个动作是退出方案。真要换厂商,要改的只有 base_url 与 model 两处,代价是照第 12 章 12.1 的规矩重跑一遍任务集验收,跑不过就回退。
19.4 的设计期四句,也该顺一遍,其中最关键的是第二句。它要答的是,起步不用最重的模型档,那降本走哪条路,验收又由谁来把关。答法定成这样,归因与成稿要的语言能力,沿用第 2 章客服场景那套判断来定档,轻量模型起步,首轮评测立即验收。验收线正是第十二行立的那三条,指标数值全对、复盘标注上的归因判定要点达标和成稿要点过关。三条中能算的两项再各配一条数值线,异常召回不低于 90%,成稿必备字段缺失不超过 5%。这两个数只是示意起点,真正的线要拿首批案例来校准。哪条不过就往上升到 V4-Pro,路线事先写死,不等到出了事再议。
十二行问句走完,产出收拢进一份文档。架构决策记录的骨架,长下面这个样子。
text
架构决策记录 weekly-report-01(2026-08)
背景:两厂十二线,周一 06:00 出周报初稿,09:00 经营会使用,
现状为分析师凌晨手工取数成稿。
决策:五步确定性工作流,取数、指标计算、规则筛异常、模型归因、模型成稿;
两处语言节点走 deepseek-v4-flash;交接班记录按需检索;无长期记忆;
无人值守生成,发送动作留给人;worker 定时触发,跑完落盘。
依据:19.2 映射表十二行逐行结论见同日评审纪要,档位定在工作流;
19.4 设计期四句审查通过,轻量模型起步的验收线已写明。
风险:交接班记录属不可信输入,注入可污染归因叙事(13.1);
缓解:检索结果定界入窗、归因结论引证原文可核对,发送留人复核。
退出方案:换模型只改 base_url 与 model 两处;任务集随迁;
重跑全量评测验收,未过即回退。
时效:模型与端点信息截至 2026-08,以 DeepSeek 官方文档为准。决策记录要进版本库,跟着代码一起评审。风险那行哪怕结论是“无”也照写,留的是这一问答过的痕迹。它的价值一半在当下,评审会里有据可依;另一半在半年后,模型换代、需求扩围,新一轮决策从这份记录起步,而不是从记忆起步。这份方案上线也不直接切到正式触发,先拿历史周报离线回放两周,与分析师的人工稿并排核对,影子期过了,才把周一凌晨的定时任务交给它。哪一行答不上也不要紧,19.2 说过,答不上的那一行,正是动手前要先补的作业。
20.2 实现的次序
架构定了之后,第一个工程问题是先写哪一段。同一套架构,搭建的先后次序不一样,中间返工的量可以差出很多。这一节排定的次序是回路、工具、上下文、评测,四步各有明确产物,后一步总是踩在前一步的产物上。
先把周报线的骨架看清。外层五步串成确定性工作流,只有归因与成稿两处过模型,归因这一步内部,还嵌着第 2 章那个循环。
第一步先把回路立起来。第 2 章讲过,几十行 while 循环就是智能体的全部骨架。工具先用假实现顶上,数据先用写死的值填上,半天之内让五步流程端到端跑通一遍。这一步要验证两件事,机制跑不跑得通,产品假设成不成立。2.4 说过,这正是 demo 的价值,任何清单都替代不了。落到周报线上,外层五步先用普通函数串起来,取数和指标计算两步直接写确定性代码,归因一步把第 2 章的循环原样搬过来,成稿一步先返回一段写死的 JSON。半天跑完,周一六点出初稿这个承诺,第一次有了实实在在的依据。分析师看到的第一版粗糙,但胜在完整,比起对着任何架构图去想象,它更能让人一眼明白系统最终交付出来的东西长什么样。
第二步,把假工具换成真工具。回路一跑通,模型缺什么数据、一次要多少,轨迹里看得一清二楚,工具清单就照这个来定。这一步交出的产物是工具定义,本质是一份契约。第 4 章 4.5 的设计法逐条用上,描述写清用途和边界,参数收窄到最小够用,结果一律用 JSON 返回。归因节点挂两个工具就够,一个查交接班记录,一个查指标逐日明细。实现先用假数据占位,形状照着真实接口设计,进生产时替换成内部系统调用就行。
python
import json
import os
from openai import OpenAI
# client 与 MODEL 沿第 2 章的定义,换厂商只改这两处
client = OpenAI(
api_key=os.environ["DEEPSEEK_API_KEY"],
base_url="<DeepSeek 兼容端点,见官方文档>",
)
MODEL = "deepseek-v4-flash"
# 假数据模拟一周交接班记录,生产中替换为内部系统的检索接口
SHIFT_LOGS = {
("一厂", "W33"): [
{"shift": "8月11日中班", "line": "5号线",
"text": "5号线换新模具后首件检验反复,停线约40分钟,工艺员到场调参数。"},
{"shift": "8月13日夜班", "line": "3号线",
"text": "3号线例行保养顺延,夜间产能略降,交班时已恢复。"},
],
}
DAILY_METRICS = {
("一厂", "W33", "良品率"): [98.2, 97.1, 93.8, 98.0, 98.3, 98.1, 98.2],
}
def query_shift_log(week: str, factory: str, keyword: str) -> str:
"""按关键词检索某工厂某周的交接班记录。"""
records = SHIFT_LOGS.get((factory, week), [])
hits = [r for r in records if keyword in r["text"]]
return json.dumps({"count": len(hits), "records": hits[:20]},
ensure_ascii=False)
def query_metric_detail(week: str, factory: str, metric: str) -> str:
"""查询单个指标的逐日数值,用于核对异常幅度。"""
days = DAILY_METRICS.get((factory, week, metric), [])
return json.dumps({"factory": factory, "week": week,
"metric": metric, "days": days}, ensure_ascii=False)
tools = [
{
"type": "function",
"function": {
"name": "query_shift_log",
"description": "按关键词检索交接班记录,用于异常归因。"
"keyword 用产线号、设备名或故障现象等短词",
"parameters": {
"type": "object",
"properties": {
"week": {"type": "string", "description": "周次,例如 W33"},
"factory": {"type": "string", "description": "工厂名,一厂或二厂"},
"keyword": {"type": "string", "description": "检索关键词"},
},
"required": ["week", "factory", "keyword"],
},
},
},
{
"type": "function",
"function": {
"name": "query_metric_detail",
"description": "查询单个指标的逐日数值,用于核对异常幅度",
"parameters": {
"type": "object",
"properties": {
"week": {"type": "string"},
"factory": {"type": "string"},
"metric": {"type": "string", "description": "指标名,如 良品率"},
},
"required": ["week", "factory", "metric"],
},
},
},
]
tool_map = {
"query_shift_log": query_shift_log,
"query_metric_detail": query_metric_detail,
}第三个工具是故意不做的,就是那个往 ERP 写数据的工具。第一版只读不写,20.1 第八、第九行的结论在这里落进代码。工具清单里没有写操作,权限问题先少一大半,这正是架构决策直接管住实现的地方。归因节点的循环本体,就是第 2 章的 run_agent 换个名字,系统提示与工具清单换掉,循环结构一行都不用动。
不做写工具,权限之外还有一层更硬的理由。模型是非确定系统,同样的输入跑两遍,产物不保证一样;ERP、制造执行系统那一头是确定性系统,靠的是给定输入、可预期结果的契约,下游组件和人全按这个约定工作。把概率系统的产物直接灌进确定性系统,契约当场就破,依赖可预期性的一方再也依赖不上。所以写侧有一条铁律,模型的输出不直接写回确定性 IT 系统。确实避不开要写,也让产物先过一道确定性校验,结构对不对、值在不在边界内,校验不过就拦下,模型原文不直接进对方系统。周报把发送按钮留在分析师手里,正是落实这条铁律最简便的做法,模型交初稿,按键交给人。
python
ROOT_CAUSE_PROMPT = (
"你是制造企业的经营分析师。输入是上周筛出的异常清单,"
"逐条给出归因结论,标注证据来自哪次工具调用;"
"证据不足就写证据不足,不要编造原因。"
)
def attribute_anomalies(anomalies: list, week: str, factory: str,
max_turns: int = 8) -> str:
messages = [
{"role": "system", "content": ROOT_CAUSE_PROMPT},
{"role": "user", "content": json.dumps(anomalies, ensure_ascii=False)},
]
for _ in range(max_turns):
response = client.chat.completions.create(
model=MODEL, messages=messages, tools=tools,
)
message = response.choices[0].message
messages.append(message) # 模型的决定原样进历史
if not message.tool_calls:
return message.content # 归因完成,交出结论文本
for tool_call in message.tool_calls:
fn = tool_map[tool_call.function.name]
args = json.loads(tool_call.function.arguments)
result = fn(**args)
messages.append(
{"role": "tool", "tool_call_id": tool_call.id,
"content": result},
)
# 兜底文案会随 findings 进成稿,由分析师核对这道闸接住
return "归因未在轮数上限内完成,以下仅有部分证据,发送前需人工复核。"第三步轮到上下文。工具返回的数据已经带着真实形状,窗口里放什么、不放什么,到这一步才看得清。这一步的产物是一份组装规则,规则一共三条。
排在最前的永远是固定前缀,系统提示加工具描述,第 14 章前缀缓存命中的就是这一段。数据快照每周在任务启动时组装一次,指标汇总整段进窗口,明细只放异常相关的,正常部分用一条计数带过。
归因结论进成稿节点时,只递一份摘要,逐条证据留在轨迹里。第 7 章的隔离策略下放到单条回路内部,最省的用法就是这样,主上下文只收结论,证据要用再查。成稿节点按第 3 章 3.1 的 JSON mode 收口,提示里写明 json 字样、给出格式示例,满足接口使用条件。下面代码里的 compute_metrics 与 detect_anomalies 都是确定性代码,前者取数算指标,后者阈值筛异常,实现从略。
python
def draft_report(metrics: dict, anomalies: list, findings: str) -> dict:
response = client.chat.completions.create(
model=MODEL,
max_tokens=4000,
messages=[
{"role": "system",
"content": "你是周报撰写助手,输出 json。格式示例:"
'{"标题": "…", "指标概览": "…", '
'"异常与归因": "…", "本周关注": "…"}。'
"归因部分只使用 findings 给出的结论,不得新增原因。"},
{"role": "user",
"content": json.dumps({"metrics": metrics,
"anomalies": anomalies,
"findings": findings},
ensure_ascii=False)},
],
response_format={"type": "json_object"},
)
return json.loads(response.choices[0].message.content)
def build_weekly_report(week: str, factory: str) -> dict:
metrics = compute_metrics(week, factory) # 确定性代码,取数与指标计算
anomalies = detect_anomalies(metrics) # 确定性代码,阈值规则筛异常
findings = attribute_anomalies(anomalies, week, factory)
return draft_report(metrics, anomalies, findings)第四步做评测。评测不是拖到最后才想起来的事。第 12 章 12.1 要求写代码前先答五个评测问题,其中四个在 20.1 走映射表时就有了答案,成功标准就是第十二行立下的验收三条;任务集拿二十六份历史周报和四十条复盘记录打底;指标就是验收那三条,一半硬比对、一半交裁判;基线照分析师现成的手工周报来定。只剩迭代节奏一问,留给 20.3 用两档任务集和定期回归补上。成功标准在写代码之前就锁定了,评测驱动开发的前半段,到这里就走完了。
评测的前半段已完成,这里补的是后半段。任务集要等前三步稳定跑起来,才有案例可收。第一批案例从历史里来,二十六份周报各成一条,输入是当周数据快照,判定要点照当周复盘结论写。归因节点单独成一组,四十条复盘记录一条一张卡。案例卡凑齐三项,输入、期望行为和来源日期,归因节点的一张,长下面这个样子。
text
案例 rc-017(归因节点)
输入:W33 一厂数据快照,异常清单含良品率周三 93.8%、5 号线停机 40 分钟
期望行为:良品率异常归因到换模调试,停机与良品率同源的合并归因;
能耗异常若证据不足,标注待查,不得强行归因
来源日期:2026-08-17,取自当周复盘纪要首轮跑分不理想,异常召回只有 83%,漏掉的两处都是多因叠加的停机。评测这一侧先把判定要点校准,给多因叠加补一句期望行为,要求归因时区分主因和次因。拿新要点重判首轮的结果,这两处还是漏,说明问题出在系统身上,不是判定要点定错了。成稿必备字段缺失率 12%,两处问题的根源在同一个地方,都是系统提示。归因指引跟着补上主次因的区分,格式示例也把字段名补齐。第二轮召回到 91%,过了 90% 的召回线;再给查交接班记录的工具描述补上跨周查询,第三轮升到 94%,字段缺失也清零,回到 5% 的线内。三轮修复动的是判定要点、系统提示和工具描述,模型一行没改。19.4 的修复次序,先系统层、后模型层,就这样先在小范围内跑了一遍。
评测管的是智能体的行为,确定性代码那一半还得有自己的测试,而最简便的方式是让智能体自己补。跟它说给 compute_metrics 和 detect_anomalies 加上测试,它写着写着就会发现取数那步没法测,网络调用混在计算里,于是动手改结构,能测的内核抽出来,取数变成从外面注入的参数,测试喂假数据、生产接真接口,连接外围和内核的那层胶水压到最薄。请智能体加测试,多半会自然长出这么一次重构,把什么是要紧的逻辑、什么是环境依赖拆干净,这一般是好事。另一个方向也值得一记,演示是最贵也最不可靠的验证方式,它证明的只是有人盯着的那一次能跑,边界情况和失败模式都没碰;测试没人盯着也自动跑,拿已知结果对答案。第一步那个半天跑通的 demo,管的是产品假设成不成立;每次跑得对不对,得交给便宜的测试,不能靠一遍遍手动重跑。
把四步的产物串起来看,回路给出骨架,工具给出契约,上下文给出预算规则,评测给出验收线,每一份产物同时又是下一步的输入。
有的团队先设计工具再搭回路,这个错我也犯过:清单照想象先配了十几个,回路真转起来,天天有人调的就那三四个,剩下的白白占用上下文。第 14 章 14.4 那条宁少而精的纪律,没有回路压着就维持不了。反过来,先写上下文规则、再去看真实数据的做法,预算只能凭空估计,工具真返回一页两百条记录时,预想的窗口立刻超限,规则只好推倒重写。这个次序不是走过场,它让每一步决策都踩在真实产物上面。
全书另外几条案例线的搭建次序,也可以拉来对照。快递客服线是回路先跑、功课后补,第 2 章那几十行循环先转起来,评测到第 12 章才接上,观测到第 14 章才补齐。连锁品牌线则是 demo 先行,第 4 章的运营助手和第 6 章的制度问答助手先跑起来,到 15.6 用十九周把权限、状态、评测、部署和放权一样样补全。
两条线说明的是同一件事,回路、工具、上下文和评测,四件早晚都得备齐,差的只是先想后做还是先做后想。周报线把它们排成事先定好的工序,赶在写代码前把次序定死,仅此而已。
20.3 上线与持续运营
上线不是工程的终点。生产环境要跑得顺,本身就有前提,第 2 章 2.4 点过名,网络要稳、并发要为一、数据要挑过,这三条在生产里一条都靠不住。周报系统上线后的样子是这样的,周一凌晨两点定时触发一个 worker 任务,套第 15 章 15.4 的长任务形态,跑完落盘,六点前等分析师来取稿。上线后要处理的事归成三件,状态看得见,成本算得清,出问题改得动。
周一凌晨两点这个触发点,还把周报归进了另一族系统。第 2 章点过名的主动式智能体,把等人问换成等事件,那一边讲的是概念;真要做定时报告、运维巡检这类产品,得把一条常驻回路从零串起来。
骨架有四件。调度器管什么时候启动,到点把到期的任务取出来。任务队列管排队,任务落库而不是留在谁的终端里,重试、续跑和看积压,查的都是这张表;周报一周两次任务的量级用不上看积压,这一件照样搭,为的是换到别的场景,骨架一个字不用改。并行执行管同时跑几路,各占一个 worker,用并发上限压住资源,两厂两单就各自领走、互不等待。沉淀管持续改进,每轮的结果和教训攒下来,该成的案例进任务集,该守的规矩固化成规则,下一轮带上。周报是这套骨架最小的一个实例,定时触发当调度器,队列和检查点托住断点续跑,两厂并行,改稿回流当沉淀。调度器、队列、并行执行和沉淀四件备齐,常驻回路才算成立;缺了队列,任务一多就压在一个 worker 上,缺了沉淀,跑上半年还是第一周的水平。这几件讲的都是上线后的日常。
上线这道门前,还有一次检查要过。生产就绪不是一种感觉,是一张特征清单,峰值压力下会不会垮,组件失效后能不能转移,安全边界建没建好,错误有没有人处理,日志落在哪里,重试怎么退,跟周边系统怎么集成。逐项答一句,答不上的要么补齐,要么明写进风险记录,两边都不做就是带病上线。这道检查答的是备没备齐,接下来三件,是备齐之后每天的运营。
第 14 章的链路追踪,把看得见落了地。埋点就照 14.1 原样搬,根 span 罩住整次运行,模型调用、工具执行各占一个子 span,字段走 gen_ai 语义约定那一套,会话标识填周次和工厂。一次运行,就是一棵树。
周任务一周只有两棵树,量小到不需要采样,全量落档。告警设两条,一条看任务成败,凌晨两点半还没见完成 span,就把值班的人叫醒,另一条盯 span 里的 error.type,同一工具报错连续两周排第一,正是 14.4 第四条说的工具质量问题早期信号。
检查点按 14.6 的规矩布,五步每完成一步落一份,带结构版本号。上线第三周就碰上一次故障。算指标时发现能源表计缺三天读数,补取数时接口又超时,任务卡在第二步。检查点是每完成一步才落一份的,第二步没跑完就落不下这一步的检查点,值班的人重启后,只能从第一步末接着续跑,五点五十出稿,分析师六点来取稿时毫无察觉。这是检查点机制第一次在生产里起作用,接住的不是崩溃,是凌晨三点没人盯的等待。
值班的人半夜处置得了,靠的不是临场聪明,是两份早就备好的文档。一份是运行手册,短到事故当中翻得完,系统是干什么的、批了哪些环境和用户、怎么启动、怎么确认它活着、日志在哪、常见故障第一个查什么、出了事找谁、怎么安全地停掉。手册不必写成文章,一张表就够,标准只有一条,值班的人不读源码也回答得了这些基本问题。另一份是交接包,面向下一位接手的工程师,环境变量配一份模板,要哪些变量、占位值怎么填,一行注释说清;依赖版本钉死在依赖清单里;再留一份已知良好基线(known-good baseline),记下上次验证通过是哪天、用的哪个版本、哪个模型名,这一小块元数据能省掉好几小时的排障。交接的验收标准也现成,第二位工程师克隆仓库、配好环境、装上依赖、跑通验证脚本和评测,全程不用找原作者问一句。做得到,这套系统才算交接合格;做不到,打包和文档要先补齐,功能往后排。这套验收标准本是给原型交接立的,上了线的系统,交接时照样按原型的标准验,交付物不是给人看一眼的演示,是一份经得起复验的证据。
算得清靠的是第 14 章那套成本记录。归因节点单次平均输入约 2.5 万 token,输出约 3000,折进低价档模型,单次成本不到一美分,一个月也就几美分量级。这些数字按官方定价页折算,峰时段是工作日 09:00 到 12:00 与 14:00 到 18:00,北京时间。周一定时任务排在凌晨,不在峰时段里,谷时价只有峰时一半。
金额小到这种程度,专门优化不值得,可成本还得继续记,因为成本是回路行为最灵敏的信号,跑在别的指标前面。第十周,单次成本从不到一美分直接跳到了四美分。翻轨迹看一眼,归因多跑了六轮,原来当周投产的新品在交接班记录里留下大量工艺参数,关键词检索一页装不下,模型只能换着关键词连查六次才凑齐证据。
要解决这个问题,光在成本上想办法没用,得动工具。把检索工具每页条数从 20 加到 50,归因这一步五回内就收敛,成本落回原位。这类漂移要是只盯结果质量,得等召回率掉了才看得见;可成本曲线三周前就先变了。14.2 说统计监控盯漂移,这里正好碰上一例。
降低成本的做法同样有两个。第一个是先规则后模型的预筛,交接班记录先过关键词规则,命中的才放进归因节点。量级可参照 20.1 那条流水线,它把上千条公司描述先用规则压掉一半以上再上模型,成本大幅下降。这数字来自单个案例。第二个是把固定前缀的缓存命中率做成面板指标,也就是 14.3 的 cache_read 比例。系统提示一改,它就往下掉;掉下来先查最近谁动了前缀。
改得动,靠第 12 章的回流。周报场景有一个天然的有利条件,每周一分析师的改稿,本身就是免费标注。改稿差异大的周次,系统会自动生成一条候选案例卡,原始快照当输入,改后的结论当判定要点,人工确认后收进任务集。第 12 章讲过,一号案例有三个来路,这里又多出一路,属于运营附带产出的副产品。
任务集分两档来配,mini 每类一条,换模型当天先跑,full 跑全量,当周跑完才许下结论。12.5 讲的两档用法就是这个。
定期要做的事,节奏上再叠两件。每季度跑一次全量回归,同时抽二三十条人工复判,看裁判打的分跟人打的分对不对得上。照 12.3 的规矩,裁判模型一换版本,旧的一致率就作废,校准得重来。周度这档轻一些,从当周轨迹抽一批人工过目,看质量分布漂没漂,12.2 把这条定成两条日常动作之一。
口径一旦变更,要照 12.1 的提醒把案例过一遍。十月初良品率的口径把返修品剔出统计,三张旧卡的期望行为就得同步修订,不然评测罚掉的正是正确行为。三个季度下来,任务集从六十六条涨到七十八条,每一条都带着来源日期。第 19 章 19.5 说资产可带走,指的正是这七十八条,以及它们背后的轨迹。
运营走到某个阶段,一个绕不开的问题就会冒出来,这套系统什么时候该重构?空泛的答案没有用,逐条可判定的信号才管用。下面每一条信号,都对着前面章节立过的判据。
| 信号 | 判据出处 | 动作 |
|---|---|---|
| 系统提示连补十几条规则,同类失败仍在出现 | 19.4 设计期第一条、14.4 第一条 | 把判断从提示挪进确定性代码,不是换模型 |
| 归因平均轮数爬升,上限触发占比抬头 | 14.4 第五条 | 对齐终止条件与指令,用生产数据校准阈值 |
| 同一工具的报错占比连续两周居首 | 14.4 第四条 | 修工具或收窄参数面,宁少而精 |
| 换模型后同类失败成批出现 | 14.4 第三条 | 按模型维护指令并重跑任务集,不是重构架构 |
| 系统层调优到头,评测分数仍卡在目标线下 | 14.4 优先级框架,系统层调优后表现常到九成五以上 | 此时才动模型层,升档或蒸馏 |
| 新需求写不成固定流程,伪代码覆盖不住八成 | 19.2 表第三行的前提失效 | 档位上移评估自主编排,先拿评测背书 |
| 单次成本持续上涨,输入大头是重复内容 | 14.3 三步 | 先路由、预筛、缓存,仍超线再动架构 |
这张表最要紧的是次序。重构排在最后,前五条都指向比重构便宜的动作,最重也只到模型层。第六条档位上移等于动架构,表里要求先拿评测背书。第七条同理,路由、预筛和缓存压不住成本,才轮到动架构。19.4 立的次序是先系统层、后模型层,这张表再往后排一层,把架构押到最后。周报系统跑了一年,一次架构级重构都没发生,动过的只有工具参数、提示规则和检索粒度。这不全是运气,十二行问句在最前面把档位问对了,后面才有条件只做小改动。
本章小结
- 20.1 需求分析与架构选型。值不值得做用算式判,附加价值减去损害乘发生概率、再减缓解措施花费,明显大于零再做;映射表十二行问完,得出五步确定性工作流加两处语言节点(归因与成稿)、交接班记录定界挂检索、不上长期记忆、无人值守生成、发送留给人、worker 定时部署,写成一份架构决策记录进版本库。
- 20.2 实现的次序。回路(半天端到端跑通)、工具(契约式定义、故意不做写工具)、上下文(三条组装规则)、评测(案例卡打底),每步踩在前一步产物上;三轮修复只动判定要点、系统提示和工具描述,异常召回从 83% 升到 94%,模型一行没改;模型的输出不直接写回确定性 IT 系统,要写先过确定性校验。
- 20.3 上线与持续运营。常驻回路四件,调度器、任务队列、并行执行和沉淀;上线前过一遍生产就绪特征清单;看得见靠 trace 与检查点,算得清靠成本记录与预筛(成本是行为漂移最灵敏的信号),改得动靠分析师改稿回流;重构时机列成七条各带出处的信号,架构动作押到最后;本案例跑了一年,一次架构级重构都没发生。
- 三段读下来没有一处新机制,架构拿映射表问出来,设计有失败模式审查把守,选型走查时效、算锁入、写退出方案三个动作,用的全是第 19 章的旧判据,方法早已备齐,拿来用就是。
参考资料
- DeepSeek 官方定价页(V4-Flash 峰时输入未命中 0.44 美元、输出 1.32 美元每百万 token,谷时减半;峰时段为工作日 09:00-12:00 与 14:00-18:00 北京时间),https://api-docs.deepseek.com/quick_start/pricing ,核实于 2026-08。
- DeepSeek API 文档(OpenAI 兼容端点与模型名;JSON mode 使用条件转引第 3 章核实条目),https://api-docs.deepseek.com/ ,核实于 2026-08。
- OpenTelemetry GenAI 语义约定仓库(gen_ai 命名空间与 span 约定,转引第 14 章已核实条目),https://github.com/open-telemetry/semantic-conventions-genai ,核实于 2026-08。
- 《AI Agent 开发实战》第 8 章(智能报告系统,行程搜索、配图、PDF 排版与中介者调度;框架用法系 2025 年面貌,机制可借鉴、版本不照搬)。见 txt-ref/ai-agent开发实战/。
- Victor Dibia《Designing Multi-Agent Systems》(2025)第 14 章(四步流水线、预筛把 5,622 条压到 1,795 条、分步测试与检查点)、第 15 章(自主模式的适用边界)。见 txt-ref-zh/designing-multi-agent-systems/。
- 《GenAI Security》(Paul Zenker,CRC Press 2026)第 3 章(风险为损害乘发生概率的口径;附加价值减去损害乘概率再减缓解措施的权衡算式,粗略算出的数应显著大于零;算不为正时的四问;风险处置四式消除、最小化、转移、接受与多层并举)。见 txt-ref-zh/genai-security/(转引第 13 章已核实条目)。
- Ben O'Mahony、Fabian Nonnenmacher《Building AI Agent Platforms》(O'Reilly Early Release,2027 年抢先版)第 1 章(用例三判据:任务有价值、产出易于验证、回路里有积极的人,编程用例的拆解),见 txt-ref-zh/building-agent-platforms/。
- 《GenAI on Google Cloud》(Ayo Adedeji 等,O'Reilly 2026)第 8 章(业务价值对实施难度的四象限排用例次序,好实施又有价值者先做、攒能力赢信任),见 txt/genai-google-cloud.txt(英文原文)。
- Julian Soh、John Tidwell、Priyanshi Singh《Building and Distributing Agentic AI Solutions》(Apress 2026)第 3 章(原型交接包:环境变量模板、钉定依赖、已知良好基线,第二位工程师克隆即跑的交接判据),见 txt-ref-zh/building-distributing-agentic-ai/。
- Sif Baksh《Building AI Agents for Network Operations》(Packt 2026)第 9 章(运行手册:启动、健康检查、日志、常见故障、升级与安全停机,值班的人不读源码也能操作),见 txt/netops-agents.txt(英文原文)。
- Stefanos Drakos《The Bible of Agentic AI Systems》(自出版 2026)第 30 章(自主守护进程:调度器、任务队列、并发上限下的并行执行、经验沉淀成规则,常驻回路的完整走法),见 txt-ref-zh/agentic-ai-bible/。
- Tim O'Brien《Building Complex Multi-Agent Systems Using Pattern Prompting》(Packt 2026)第 4 章(生产就绪是一张特征清单:伸缩、失效转移、安全、错误处理、日志、重试、集成,上线前逐项核对)、第 7 章(模型输出不写回确定性 IT 系统:非确定产物破坏下游契约),见 txt/pattern-prompting-mas.txt(英文原文)。
- 《Claude Code: Up and Running》(Ken Kousen,O'Reilly 抢先版 2026)第 4 章(请智能体加测试自然触发可测试内核、依赖注入与薄胶水层的重构;演示是最贵也最不可靠的验证方式),见 txt-ref-zh/claude-code-up-running/。