AI News HubLIVE
站内改写3 分钟阅读

AI可观测性的四个信号

通过实际案例,介绍AI应用可观测性的四个关键信号:版本化提示词、trace记录、用户评分和模型评分。

来源Hacker News AI作者: iroha1203

几个月前,我们团队将一个聊天功能上线到生产环境。用户提问,应用通过LLM模型路由问题,模型调用几个内部工具,然后返回答案。它勉强能工作,但当我们不知道模型为何回答得好或差时,唯一的调试工具就是阅读日志和猜测。我们意识到应用无法回答一个最基本的问题:显示所有用户反馈差的聊天记录,按系统提示词的版本分组,并让我们查看完整对话,包括模型调用了哪些工具。这相当于AI版“显示部署X后此端点的所有500错误”,但我们的应用做不到。

这促使我们放弃寻找更聪明的模型,转而寻求添加可观测性层。我们最终使用了Langfuse,但具体供应商并不重要,Helicone、Arize Phoenix、LangSmith和Braintrust都能解决类似问题。经过几个月的迭代,我们发现需要的功能有四种,我称之为每个AI功能必须发出的四个信号:每个提示词都有版本(模型今天看到了哪些确切词汇?);trace形状符合实际工作(模型调用了什么、顺序如何、参数是什么?);来自用户的评分(用户喜欢结果吗?);来自另一个模型的评分(当用户沉默时,谁来打分?)。当然,没有这四个信号也能构建AI功能,只是无法有目的地改进它。

我们做的第一件事是把每个提示词从代码中移出,放入一个版本化存储,应用在运行时获取。代码从不引用版本,只请求标签。例如,PromptRepo.compile(name: "classify_question", label: "production")。通过Langfuse UI,人类可以点击按钮将“production”标签移动不同版本之间,回滚也只需点击,无需部署。第一次通过点击按钮回滚糟糕提示词,而不是撤销PR并等待CI时,我们就知道这是正确的方向。一旦提示词成为内容,最接近问题的人就成为编写提示词的人,反馈循环大大缩短,质量提升。

一个聊天不是单次调用,而是一个小程序:分类问题、加载正确提示词、调用一两个工具,然后组合答案。如果你的trace只有一行,你只知道发生了某事;而trace树告诉你实际发生了什么。如果trace是调用树,你就有了模型决策数据库。例如,原始日志只有一行[INFO] chat_completed user_id=123 duration_ms=4200 tokens=1840,而改进后trace树包含:span: load-prompt (version=production:v12), generation: classify-question (model=haiku, category="billing"), generation: compose-answer, span: tool-call.lookup_invoice (200ms), span: tool-call.lookup_customer (180ms), generation: final-response (model=sonnet, 1.2k tokens)。每个节点都携带提示词名称和版本、模型ID、token用量以及我们控制的元数据字段,比如运行客户、问题分类类别、调用了哪些工具、是否为新对话。这些元数据最终被证明最重要。当我们第一次过滤出“范围内所有聊天记录,其中特定工具运行且用户反馈差”时,我们意识到trace列表不再是日志,而是模型决策的可查询数据库。经验法则:用将来可能筛选的维度标记trace,前期成本很低,但事后添加几乎不可能。

用户界面中每条助手消息都有点赞和点踩按钮。用户点击时,我们保存一行并作为评分post回可观测性工具。单独的点踩没有可操作性,但关联到trace的点踩告诉你模型看到了什么、调用了什么、哪个提示词版本产生了它、问题属于哪个类别。现在你可以问:点踩是否集中在某个类别?某个提示词版本?某个特定工具调用之后?应该审查点踩的trace,虽然有时是噪音,但十分之一可能是真实信号,会转化为提示词更改、新工具或bug修复。所有这些管道的目的是一个查询:显示所有用户标记为差的trace。一旦能运行该查询并阅读产生它的完整对话(提示词版本、工具调用、模型、延迟等),你就停止了猜谜游戏。

人类反馈有用但稀少,大多数用户不点击任何东西。所以我们添加了第二个模型来评判第一个模型。后台任务拉取完成的聊天,通过独立的“评判”提示词(与生产提示词在同一个版本化仓库中)运行,并将结果写回同一trace作为评分。现在trace携带两路评判数据。当用户和评委一致时,评委与真实用户同步;当不一致时,那就是系统中最有趣的trace。无论哪种情况,评委在每次聊天上运行,因此回归会在发布导致它的提示词当天显现,而不是一周后有人抱怨时。我们的评委评估事实性、指令遵循、完整性、幻觉、以及助手是否使用了正确的内部上下文。我们低估了这一信号:一个能在发布前捕捉回归的评委比更快或更聪明的模型更有价值,它是当没人点击点赞时唯一可扩展的信号。我们学到的教训:评委只是一个提示词,可能出错,它需要版本化、Playground和回滚按钮,就像面向用户的提示词一样。每个信号都写回同一个trace,这就是全部技巧。

四个信号重叠,这是有意的。提示词版本显示在trace上,用户评分附加到trace,评委评分也附加到trace。它们不是四个独立的东西,而是从四个不同视角观察同一个思想:让AI功能可观测,然后你就能有目的地改变它。过去我对待AI功能像一类不同的软件:更难调试、更难测试、更难控制。但AI功能就是软件,有输入、做决策、产生输出,并且可以像其他事物一样被观测。四个信号有意重叠,它们是一个想法——使系统可观测——从四个角度展现。一旦拥有了它们,变化不在于模型变得更聪明,而在于你停止猜测。你发布一个提示词更改,知道评委会在回归时告知;你阅读一个点踩,知道可以重放产生它的精确对话;你将新提示词提升到生产,知道可以一键回滚。模型是引擎,可观测性层是仪表盘。没有仪表盘你也能开车,只是不能有目的地驾驶。