mcpField
E
exploring-ai-failures

exploring-ai-failures

github.com/posthog测试与质量95155 次安装今天更新
代码仓库

关于 exploring-ai-failures

用于分析 PostHog 生产环境 AI 追踪记录的技能,可发现并归类失败,包括未报错但输出错误的情况。它引导逐条阅读追踪并排列失败模式,便于团队确定修复、优先级或在线评估方向。

主要功能

  1. 01按错误或指标异常筛选追踪
  2. 02阅读完整追踪以发现静默失败
  3. 03将观察结果归纳为失败模式
  4. 04根据已读样本排列模式优先级
  5. 05提供代表性追踪链接以便跟进

适用场景

  1. 01发现 AI 流量中的指令遵循问题
  2. 02调查工具误用或答案不完整
  3. 03确定反复出现的失败模式优先级
  4. 04选择失败模式创建在线评估

MCP 相关

使用 PostHog MCP 工具列出和检查 LLM 追踪、查询数据、查找评估,并生成应用链接。

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/posthog/ai-plugin --skill exploring-ai-failures

安装后在 Claude Code 中输入/exploring-ai-failures确认已加载。

附带文件references/finding-traces.md

详细介绍

探索 AI 失败

对于生产环境中的 AI 流量,最有价值的做法是找出它在哪些地方失败,并总结出模式。问题在于:**大多数失败都是静默的。**模型返回了干净的响应——HTTP 200,没有异常——但内容错误、偏离主题、忽略指令或错误使用工具。这些情况不会引发错误,而它们往往才是最值得关注的失败。

因此,这项技能旨在找出失败(明显的 和 静默的),读懂它们,并将其归纳为一组按优先级排序的失败模式,以便采取行动:修复提示词、提交 Bug、确定工作优先级,或将最突出的问题模式转化为自动化评估(creating-online-evaluations)。

**以下所有内容都服务于一项不可或缺的活动:阅读真实轨迹。**查询只会告诉你该打开_哪些_轨迹——查询本身绝不是答案。如果你没有打开轨迹就报告问题列表,那你描述的只是少数明显的问题(会抛出错误的问题),却漏掉了真正要做的事。

这是自下而上的过程:失败模式从真实轨迹中浮现,而不是预先根据一份通用指标列表来确定。要深入阅读单条轨迹,请参考 exploring-llm-traces;要在大量数据中发现自然形成的分组,请参考 exploring-llm-clusters。

工具

工具用途
posthog:query-llm-traces-list列出候选轨迹——按错误筛选、按指标排序、按类型限定范围
posthog:query-llm-trace完整阅读一条轨迹,了解实际出了什么问题
posthog:execute-sql查找指标异常值、发现轨迹分类、统计失败模式
posthog:llma-evaluation-list查找现有评估,看看其中的失败是否揭示了新的问题模式
posthog:generate-app-url生成包含区域和项目信息、可直达某条轨迹或列表的深层链接

以下各策略的详细查询见 references/finding-traces.md。该文件还说明了 events 与 ai_events 的区别:$ai_input / $ai_output_choices 等大型内容不在 events 中。如需了解完整的 $ai_* 事件架构,请加载 exploring-llm-traces 技能。

与用户协作

与用户协商的是_范围和优先级_,而不是是否要开展工作。开始时就与用户缩小范围:针对哪个功能或用例?他们是否已经发现过问题?是否有可追踪的信号(踩、工单、异常指标)?确定范围后,直接阅读轨迹,并整理出分类后的失败模式——不要停下来征求是否可以开始阅读;阅读是核心工作,不是可有可无的后续选项。如果用户不知道该看什么,就按照下面的流程推进,并随时解释原因;是否需要讲解,由用户决定。

第 1 步——限定一个用例

应用中的轨迹类型有其_分类体系_,不同类型的失败方式也各不相同——客服聊天可能会编造政策内容,摘要器可能遗漏要点,Agent 可能陷入循环或错误使用工具。将它们放在一起评估或分析会稀释信号。选定一种,然后找到对应的筛选条件($ai_trace_id 前缀、功能属性或模型)。如果用户不确定流量是如何划分的,请先发现其分类体系(查询见 references/finding-traces.md)。

第 2 步 — 选择要阅读的跟踪记录

以下方法用于_选择要打开的跟踪记录_,本身并不能给出答案。可查询的数据(错误计数、指标聚合值)会告诉你_该去哪里查找_,但绝不是最终结果。根据你掌握的上下文和信号进行选择,并结合使用:

  • 代码错误($ai_is_error) — 成本最低的扫描方式,也是_最_不具代表性的信号:它只能捕获异常和 API 失败,无法捕获最重要的无声质量问题。用它来挑几条跟踪记录阅读,而不是统计“问题”数量。对于结构化输出或工具调用流水线,它会稍微有用一些,因为部分失败确实会以解析或架构错误的形式显现。
  • 指标异常值 — 按输出/输入 token 数、消息长度、成本或延迟排序,然后打开极端值。长度失控、截断、上下文膨胀和循环通常集中在两端。
  • 一种跟踪类型的切片 — 缩小范围,只关注一种请求类型,这样阅读的跟踪记录就采用相同的分类体系。
  • 分层抽样 — 没有特定信号时(这是常见情况),从不同切片和结果中抽取一批混合样本并阅读。这是默认做法,而不是备用方案。
  • 现有评估中的峰值 — 如果已经在运行评估,某项评估的失败次数突然上升,就能帮助你找到要阅读的跟踪记录(对 $ai_evaluation 事件使用 llma-evaluation-list + execute-sql)。
  • 聚类 — 数据量很大时,让分组自然形成,以便挑选有代表性的跟踪记录来阅读;请参阅 exploring-llm-clusters。

陷阱。 很容易就想用 GROUP BY 对错误消息分组,生成一张排名表,然后就此打住。但这张表呈现的只是显眼的少数——会引发异常的失败。对大多数 AI 产品而言,真正重要的失败会以 HTTP 200 完成,只有人阅读跟踪记录时才会显现。如果你根据从未打开过的错误或指标计数生成排名,那就不是交付成果——它只是提示你接下来该阅读什么。如果查询无声失败的结果为空或难以处理,这意味着你应该_阅读跟踪记录_,而不是放弃并报告那些显眼的失败。

第 3 步 — 阅读一批跟踪记录(这才是要做的事)

打开并实际阅读你选出的跟踪记录——针对一个用例,计划阅读大约 20–30 条。使用 query-llm-trace 逐条阅读,它唯一必需的参数是 traceId;传入的值是 query-llm-traces-list 结果中的跟踪记录 id。这一步不能省略,也没有任何东西可以替代它。你无法通过 GROUP BY 或在输出中搜索“refusal”/“sorry”之类的措辞来找出无声失败,因为你还不知道该搜索哪些模式——阅读才能让你发现这些模式。某个巧妙的 SQL 代理查询什么都没返回,并不能证明这些失败不存在;这说明你必须阅读。

对于每条跟踪记录,用通俗语言记录出了什么问题,并在旁边记下该跟踪记录最早事件的时间戳(就在你刚读过的跟踪记录中,以及 query-llm-traces-list 的 createdAt 字段中)。有了这个时间戳和跟踪记录 ID,就足以在第 4 步构建可解析的深层链接,因此现在记录下来可以省去之后再查一次。

如果某条跟踪记录在调用链中失败,请记录_最先出问题的环节_——根本原因通常会导致下游症状,修复它也能一并消除这些症状。将记录归纳为几个命名的失败模式(“忽略日期筛选条件”“捏造政策”“漏掉第二个问题”);之后可以再整理这些分组,但要自行检查。持续阅读,直到新跟踪记录不再带来新的失败模式(几十条,而不是几千条——没有新发现时就停止)。

第 4 步 — 排名、添加链接并交还给用户

根据你阅读的内容,按大致出现频率为找到的模式排名——通常少数几种模式占主导。给出一份简短的失败模式排名列表。每种模式都要主动附上 一两个示例跟踪记录深层链接——不要等用户开口,也不要让用户提出请求。

你读过这些跟踪记录,但仍可能误读——看起来像幻觉的跟踪记录在上下文中可能是正确的,而你标记的一些内容可能是你误解了跟踪记录,并非真正的失败。因此,不要把列表说成定论。每种模式给用户几个带链接的示例,让他们打开链接,然后询问他们接下来想重点关注哪种模式。

(根据你从未阅读过的错误消息或指标计数整理出来的列表,只是最显眼的一部分,并非这里要做的事——请回到第 3 步。)

可供查看的内容较少时

如果用例较新或流量较低,找不到足够的失败案例:先扩大时间范围或放宽筛选条件;然后用刻意探测你关心的限制条件的输入进行压力测试(边缘情况、较长或含糊的输入、对抗性措辞);或者针对重要维度(请求类型 × 用户场景)生成一小批合成数据,通过系统运行并阅读这些跟踪记录。将合成结果视为初步参考,而非真实情况——对于高风险或小众领域,这些结果并不可靠。

构造 UI 链接

query-llm-trace 会返回其读取的跟踪记录对应的 _posthogUrl,因此请直接将该链接交给用户,而不是自行拼接。只有当你知道跟踪记录的 id、但尚未打开它时,才自行构造链接,并且只能使用 posthog:generate-app-url——绝不要手动填写主机名或 /project/<id>/ 前缀。url 必须是规范的目录模板;请通过 params 传入具体 id,绝不要将其直接写入路径。

  • 跟踪记录列表: generate-app-url {url: "/ai-observability/traces"}(然后筛选到你的用例)
  • 单条跟踪记录: generate-app-url {url: "/ai-observability/traces/{id}", params: {id: "<trace_id>"}}

跟踪记录链接不包含时间戳,因此请在要交给用户的 URL 后附加 ?timestamp=<url_encoded_timestamp>——跟踪记录页面会读取它以定位较早的记录,而两个工具都无法表达这一信息。

生成的链接会解析到正确的区域主机和项目路径前缀(例如 https://us.posthog.com/project/<id>/ai-observability/traces/<trace_id>),因此,即使用户当前不在目标项目中,也会进入正确的位置。

提示

  • 阅读就是工作本身,不是最后一步。 聚合数据、错误计数和评分只能帮助判断_应打开哪些跟踪记录_,绝不能替代阅读。汇报任何内容前,先阅读第一批跟踪记录,不要征求用户许可。
  • 不要过度关注错误。 $ai_is_error 是最显眼、但最没意思的信号;值得花时间查看的失败通常不会触发它。
  • 这些发现策略是用于挑选跟踪记录阅读的菜单,不是流水线,也不是答案。根据上下文选择,可自由组合,不必强行遵循固定顺序。
  • 一次只处理一个用例。 不同类型的跟踪记录有不同的失败分类,混在一起会模糊结果。
  • 频率优先于完整性。 目标是找出最常发生的模式,而不是列出所有可以想象到的失败。
  • 输出应是根据你读过的跟踪记录整理出的、按名称列出的失败模式排名——这份成果能让下一步(修复、确定优先级或评估)一目了然。
  • 提供带链接的示例,然后让用户决定方向。 不要止步于分类表格。主动为每种模式提供一两个可打开的跟踪记录链接,并请用户查看几个示例。

相关技能

  • creating-online-evaluations — 将排名靠前的失败模式转化为持续运行的评估
  • exploring-llm-clusters — 对比不同集群的行为,而非逐条阅读跟踪记录
  • exploring-llm-traces — 本技能所依赖的跟踪记录阅读方法

评论

支持 Markdown