[{"data":1,"prerenderedAt":431},["ShallowReactive",2],{"post:\u002Fblog\u002Fobservable-ai-systems":3,"surroundings:\u002Fblog\u002Fobservable-ai-systems":420},{"id":4,"title":5,"accent":6,"body":7,"description":399,"draft":400,"experience":401,"extension":402,"featured":400,"image":403,"meta":409,"navigation":410,"path":411,"publishedAt":412,"readingTime":178,"seo":413,"stem":414,"tags":415,"updatedAt":401,"__hash__":419},"posts\u002Fblog\u002Fobservable-ai-systems.md","AI 系统的可观测性，不只是 Token 账单","violet",{"type":8,"value":9,"toc":386},"minimark",[10,14,20,23,27,30,35,38,42,45,49,52,56,59,62,66,74,214,217,220,239,242,245,248,308,311,314,317,335,338,341,344,347,361,364,368,371,379,382],[11,12,13],"p",{},"传统服务出问题时，我们习惯查看状态码、延迟和错误堆栈。AI 应用出问题时，这些指标仍然重要，却经常不足以回答最关键的问题：",[11,15,16],{},[17,18,19],"strong",{},"模型为什么做出了这个选择？",[11,21,22],{},"答案不在某一条日志里，而在从用户目标、上下文组装、模型决策、工具执行到最终结果的整条链路中。",[24,25,26],"h2",{"id":26},"先区分四种失败",[11,28,29],{},"把所有失败都记成“模型效果不好”，团队就无法采取具体行动。至少应该区分：",[31,32,34],"h3",{"id":33},"_1-输入失败","1. 输入失败",[11,36,37],{},"用户目标不完整，或系统没有拿到完成任务所需的上下文。此时升级模型通常没有帮助。",[31,39,41],{"id":40},"_2-推理失败","2. 推理失败",[11,43,44],{},"上下文正确，但模型选择了错误路径、遗漏约束或过早得出结论。",[31,46,48],{"id":47},"_3-工具失败","3. 工具失败",[11,50,51],{},"模型选择正确，实际执行却因为权限、网络、参数或外部状态失败。",[31,53,55],{"id":54},"_4-交付失败","4. 交付失败",[11,57,58],{},"内部工作已经完成，但最终回答没有把结果、限制和下一步说清楚。",[11,60,61],{},"这四类问题需要不同的修复者：产品、提示设计、平台工程或交互设计。可观测性的第一份价值，是让问题回到正确的人手里。",[24,63,65],{"id":64},"一次运行需要共同的-trace","一次运行需要共同的 Trace",[11,67,68,69,73],{},"每个用户请求都应该有稳定的 ",[70,71,72],"code",{},"trace_id","，贯穿模型调用和工具执行：",[75,76,81],"pre",{"className":77,"code":78,"language":79,"meta":80,"style":80},"language-ts shiki shiki-themes github-dark github-dark","type AgentEvent = {\n  traceId: string\n  spanId: string\n  parentSpanId?: string\n  type: 'model' | 'tool' | 'handoff' | 'result'\n  startedAt: string\n  durationMs?: number\n  status: 'running' | 'ok' | 'error'\n}\n","ts","",[70,82,83,103,117,127,138,166,176,187,208],{"__ignoreMap":80},[84,85,88,92,96,99],"span",{"class":86,"line":87},"line",1,[84,89,91],{"class":90},"sOPea","type",[84,93,95],{"class":94},"sFR8T"," AgentEvent",[84,97,98],{"class":90}," =",[84,100,102],{"class":101},"suv1-"," {\n",[84,104,106,110,113],{"class":86,"line":105},2,[84,107,109],{"class":108},"s-3mD","  traceId",[84,111,112],{"class":90},":",[84,114,116],{"class":115},"s8ozJ"," string\n",[84,118,120,123,125],{"class":86,"line":119},3,[84,121,122],{"class":108},"  spanId",[84,124,112],{"class":90},[84,126,116],{"class":115},[84,128,130,133,136],{"class":86,"line":129},4,[84,131,132],{"class":108},"  parentSpanId",[84,134,135],{"class":90},"?:",[84,137,116],{"class":115},[84,139,141,144,146,150,153,156,158,161,163],{"class":86,"line":140},5,[84,142,143],{"class":108},"  type",[84,145,112],{"class":90},[84,147,149],{"class":148},"s4wv1"," 'model'",[84,151,152],{"class":90}," |",[84,154,155],{"class":148}," 'tool'",[84,157,152],{"class":90},[84,159,160],{"class":148}," 'handoff'",[84,162,152],{"class":90},[84,164,165],{"class":148}," 'result'\n",[84,167,169,172,174],{"class":86,"line":168},6,[84,170,171],{"class":108},"  startedAt",[84,173,112],{"class":90},[84,175,116],{"class":115},[84,177,179,182,184],{"class":86,"line":178},7,[84,180,181],{"class":108},"  durationMs",[84,183,135],{"class":90},[84,185,186],{"class":115}," number\n",[84,188,190,193,195,198,200,203,205],{"class":86,"line":189},8,[84,191,192],{"class":108},"  status",[84,194,112],{"class":90},[84,196,197],{"class":148}," 'running'",[84,199,152],{"class":90},[84,201,202],{"class":148}," 'ok'",[84,204,152],{"class":90},[84,206,207],{"class":148}," 'error'\n",[84,209,211],{"class":86,"line":210},9,[84,212,213],{"class":101},"}\n",[11,215,216],{},"工具调用是模型决策的外部表现。只记录工具返回值而不记录调用原因，会失去决策上下文；只保存提示词而不保存工具结果，又无法判断执行是否符合预期。",[11,218,219],{},"需要注意的是，观测并不意味着无限制收集。原始提示词可能包含个人信息、凭据或业务数据。更稳妥的做法是：",[221,222,223,227,230,233,236],"ul",{},[224,225,226],"li",{},"默认记录结构化元数据；",[224,228,229],{},"对正文做字段级脱敏；",[224,231,232],{},"为调试样本设置短保留期；",[224,234,235],{},"允许用户和业务明确选择不进入训练或分析；",[224,237,238],{},"不在日志中保存密钥与完整身份信息。",[24,240,241],{"id":241},"质量指标必须贴近任务",[11,243,244],{},"Token、延迟和模型错误率是平台指标，但它们不能代表用户是否得到结果。",[11,246,247],{},"一个代码修复 Agent 更有意义的指标可能是：",[249,250,251,264],"table",{},[252,253,254],"thead",{},[255,256,257,261],"tr",{},[258,259,260],"th",{},"层级",[258,262,263],{},"指标示例",[265,266,267,276,284,292,300],"tbody",{},[255,268,269,273],{},[270,271,272],"td",{},"结果",[270,274,275],{},"受影响测试是否通过",[255,277,278,281],{},[270,279,280],{},"过程",[270,282,283],{},"是否读取了相关约束文件",[255,285,286,289],{},[270,287,288],{},"安全",[270,290,291],{},"是否修改了任务范围外文件",[255,293,294,297],{},[270,295,296],{},"效率",[270,298,299],{},"有效工具调用 \u002F 总工具调用",[255,301,302,305],{},[270,303,304],{},"交付",[270,306,307],{},"是否提供可验证的文件或提交",[11,309,310],{},"“有效工具调用”比单纯调用次数更有价值。一次准确的搜索可能替代十次猜测式读取。",[24,312,313],{"id":313},"把评估变成日常反馈",[11,315,316],{},"离线 benchmark 能比较模型版本，却不能覆盖你的真实工作流。更可持续的评估集来自生产中的高价值样本：",[318,319,320,323,326,329,332],"ol",{},[224,321,322],{},"收集明确成功与明确失败的运行；",[224,324,325],{},"删除隐私信息，保留决策结构；",[224,327,328],{},"为失败标注类型，而不是只打一个总分；",[224,330,331],{},"在提示、模型或工具变化时重新运行；",[224,333,334],{},"同时比较结果质量、成本和延迟。",[11,336,337],{},"评估集不需要一开始就很大。二十个边界清楚、能稳定复现的案例，通常比两千个来源模糊的样本更能指导工程。",[24,339,340],{"id":340},"面向人的可观测性",[11,342,343],{},"最后一层观测不在仪表盘，而在产品界面。",[11,345,346],{},"当 Agent 正在读取文件、等待授权或执行部署时，用户需要知道它处于什么阶段。好的状态更新不是倾倒内部思维，而是给出：",[221,348,349,352,355,358],{},[224,350,351],{},"当前正在完成什么；",[224,353,354],{},"已经确认了什么；",[224,356,357],{},"是否需要用户采取行动；",[224,359,360],{},"哪些风险仍未关闭。",[11,362,363],{},"这类可见性会直接改变用户对系统可靠性的判断。一个需要几十秒完成的任务，如果过程清楚，往往比十秒后突然返回不透明结果更让人放心。",[24,365,367],{"id":366},"可解释不等于暴露全部过程","可解释，不等于暴露全部过程",[11,369,370],{},"AI 系统不需要把每一个内部 token 展示给用户，也不应该把敏感上下文原样写入日志。真正需要的是一条足够清楚的因果链：",[75,372,377],{"className":373,"code":375,"language":376,"meta":80},[374],"language-text","用户目标\n  → 使用了哪些上下文\n  → 选择了什么工具\n  → 工具返回了什么状态\n  → 最终交付了什么结果\n","text",[70,378,375],{"__ignoreMap":80},[11,380,381],{},"当这条链路可以被查询、比较和复现时，团队才有能力把“偶尔很聪明”变成“长期可信赖”。",[383,384,385],"style",{},"html pre.shiki code .sOPea, html code.shiki .sOPea{--shiki-default:#F97583;--shiki-dark:#F97583}html pre.shiki code .sFR8T, html code.shiki .sFR8T{--shiki-default:#B392F0;--shiki-dark:#B392F0}html pre.shiki code .suv1-, html code.shiki .suv1-{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8}html pre.shiki code .s-3mD, html code.shiki .s-3mD{--shiki-default:#FFAB70;--shiki-dark:#FFAB70}html pre.shiki code .s8ozJ, html code.shiki .s8ozJ{--shiki-default:#79B8FF;--shiki-dark:#79B8FF}html pre.shiki code .s4wv1, html code.shiki .s4wv1{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":80,"searchDepth":119,"depth":119,"links":387},[388,394,395,396,397,398],{"id":26,"depth":105,"text":26,"children":389},[390,391,392,393],{"id":33,"depth":119,"text":34},{"id":40,"depth":119,"text":41},{"id":47,"depth":119,"text":48},{"id":54,"depth":119,"text":55},{"id":64,"depth":105,"text":65},{"id":241,"depth":105,"text":241},{"id":313,"depth":105,"text":313},{"id":340,"depth":105,"text":340},{"id":366,"depth":105,"text":367},"从提示词到工具调用，再到用户可见结果，AI 应用需要一条能解释“为什么”的观测链路。",false,null,"md",{"src":404,"alt":405,"caption":406,"width":407,"height":408},"\u002Fmedia\u002Fposts\u002Fobservable-ai-systems\u002Fcover-v1.webp","AI 请求从输入经过模型和工具节点形成完整观测链路","从提示词到结果的可解释 Trace",1600,900,{},true,"\u002Fblog\u002Fobservable-ai-systems","2026-07-09",{"title":5,"description":399},"blog\u002Fobservable-ai-systems",[416,417,418],"AI","可观测性","工程","38fR6dgXWRrU_24Zye-8Fgu9kmY9Urv0ucmeiPbyneo",[421,426],{"title":422,"path":423,"stem":424,"description":425,"children":-1},"Nuxt 4 的架构减法","\u002Fblog\u002Fnuxt-4-architecture-subtraction","blog\u002Fnuxt-4-architecture-subtraction","一个内容型站点不需要复杂前端状态。让路由、服务端渲染和内容查询各自回到最擅长的位置。",{"title":427,"path":428,"stem":429,"description":430,"children":-1},"Vue 3.6 RC 升级全景：从 3.5 到 Vapor Mode 与 alien-signals","\u002Fblog\u002Fvue-3-6-rc-upgrade-guide","blog\u002Fvue-3-6-rc-upgrade-guide","截至 Vue 3.6.0-rc.2，系统对比 Vue 3.5 与 3.6 的响应式内核、Vapor Mode、事件委托、互操作边界和渐进升级策略。",1785034337223]