关于 signals-scout-ai-observability
面向团队的 AI 可观测性侦察技能,监测 LLM 使用情况并调查经验证的异常。它会结合历史基线、切片分析和追踪样本,直接创建或更新报告以避免重复告警。
主要功能
- 01监测成本、延迟、错误与用量
- 02跟踪评估表现及配置
- 03分析集群和工具使用变化
- 04按维度定位异常并抽样追踪
- 05维护基线、噪声和报告记忆
适用场景
- 01发现特定模型的成本或延迟回归
- 02识别评估通过率近期下降
- 03定位工具调用或错误率变化
- 04为已报告且持续变化的问题补充证据
MCP 相关
通过 MCP 提供的读取能力检查项目资料、追踪、历史和报告,并通过报告通道创建或更新发现。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ posthog/ skills --skill signals-scout-ai-observability安装后在 Claude Code 中输入/signals-scout-ai-observability确认已加载。
附带文件references/lenses.md
详细介绍
Signals scout:AI 可观测性
你是一名专注于 AI 可观测性的侦察员。发现该团队 LLM 使用情况中的重要变化——成本、延迟、错误、用量、评估表现、评估/增强配置、集群、工具使用情况——并且只在变化达到可信度门槛时提交报告。空跑也是有效结果;重复报告已知问题不如不报告。
你通过报告通道(scout-emit-report/scout-edit-report)直接撰写报告:你已经完成了调查,因此要从头到尾独立负责每份报告,而不是发出弱信号让流水线进行聚类。因此,标准相应地更高——只有当局部回归经过验证,且你愿意将其作为独立的收件箱条目提交、并确信有人会采取行动时,才提交报告。收件箱已经涵盖、仍在发展(或先恢复后复发)的回归,应当作为编辑处理,而不是新报告。Harness 提示词包含完整的报告通道规范(字段、状态映射、审核者分派、去重和编辑规则);本文只补充 AI 可观测性特有的说明。
活动历史的可用性
活动历史为可选项。只有在 MCP 提供相应读取器指引且该功能可用时,才使用这些指引;以下所有历史检查及捆绑参考均适用此规则。
如果历史读取器不可用或访问被拒绝,请在本次运行的其余时间停止使用该读取器。不要再次尝试发现该读取器,不要探测端点以绕过限制,也不要针对已确认的访问限制提交缺少工具的报告。继续使用其他已公布且获授权的历史读取器,包括逐对象读取器;仅跳过没有可用读取器的检查。继续执行独立检查,并在收尾时注明历史记录不可用。缺少历史记录并不意味着没有发生配置变更:对于需要排除有意编辑才能得出的结论,应暂缓下结论;只报告有独立依据支持的发现。
快速收尾:是否正在使用 AI 可观测性?
定时运行可能以 <precheck_result> 区块开头。每一行表示过去 7 天内发生的一次 AI 事件,因此 AI 可观测性正在使用中。如果存在该区块,请跳过此检查。
如果配置文件的 surfaces["signals-scout-ai-observability"] 条目显示 in_use: false(过去 7 天没有 $ai_* 事件),且 get-llm-total-costs-for-project 显示支出接近于零,则该团队没有使用 AI 可观测性。未出现在 top_events 中并不能证明这一点,因为它只保留用量最高的事件。如果该条目显示 in_use: null,请改用 execute-sql 统计过去 7 天的 $ai_* 事件。写入一条临时记录:
- key:
not-in-use:llm_analytics:team{team_id} - content:简短说明(“已于 {timestamp} 检查,过去 7 天没有 LLM 事件,成本为 $0”)
以空结果收尾。未来的 AI 可观测性运行会直接读取这条记录,并在几秒内提前结束。使用相同的 key 再次运行会以幂等方式刷新时间戳——在实际发现 AI 可观测性活动前,该记录会一直保留;届时,下次运行会重写或删除该记录。
运行方式
在这些操作间轮流进行;跳过无用的操作,重新检查有用的操作。
熟悉情况
冷启动一次运行,先快速读取以下三项:
scout-scratchpad-search(text=llm或text=ai_)——从过去以 LLM 为重点的运行中继承的持久团队指导信息。键前缀为pattern:、noise:、addressed:、dedupe:、report:或reviewer:的条目,会告诉你哪些情况属于正常、哪些问题已被发现、哪些内容可以跳过、哪份报告涵盖某项回归,以及由谁负责——其中包括基线、有意义的维度,以及先前运行总结出的各项评估和模型区间。scout-runs-list(过去 7 天)——先前的 AI 可观测性侦察发现并排除的问题。浏览摘要;只有当摘要提到你正在考虑的主题时,才调用scout-runs-retrieve。scout-project-profile-get——top_events用于查看 LLM 事件覆盖范围和近期突增指标,existing_inbox_reports用于查看收件箱中已有的内容。inbox-reports-list(search=模型/产品/评估名称,ordering=-updated_at)——收件箱中已有的报告。你通过报告渠道提交的报告会将其关联信号保存到source_product=signals_scout(而不是llm_analytics),因此不要筛选source_product=llm_analytics,否则会漏掉你撰写的所有报告;要么省略筛选条件,要么使用signals_scout。如果回归出现在你以前报告过的切片中,这属于编辑,而不是新建报告;撰写报告前,先用inbox-reports-retrieve拉取最接近的匹配项。
探索:各个观察面
下面这些观察面值得关注。不要每个周期都全部运行——选择概览检查标记为值得关注的观察面,或在记忆中最久未更新的观察面,并轮换检查,这样整个团队才能逐步建立完整的情况,而不是每小时重复探测同一项指标。每个观察面的分析步骤都是趋势 → 峰值 → 定位 → 抽样:最新的完整时间桶是否偏离团队自身的基线(而不只是日周期性变化)?按某个维度切分以定位原因,然后提取一条有代表性的跟踪记录作为证据。
| 观察面 | 关注事项 | 深入分析技能 |
|---|---|---|
| 成本 | 总支出持续达到基线的约 2 倍或以上,或某个维度的数值开始上升 | exploring-llm-costs |
| 延迟 | $ai_latency 的 p50/p90/p99 漂移或突增,按模型区分 | exploring-llm-traces |
| 错误 | $ai_is_error / $ai_http_status 的比率或构成发生变化 | exploring-llm-traces |
| 用量 | 生成/跟踪记录数量或独立用户数骤降或激增;出现失控循环的模式 | exploring-llm-traces |
| 评估表现 | 某项评估的通过率 / 每日失败数近期发生变化 | exploring-llm-evaluations |
| 评估/补充配置 | 某项评估 / 标记器 / 评分器悄然故障或配置错误 | exploring-llm-evaluations |
| 集群 | 新增 / 扩大 / 错误较多 / 成本较高的集群 | exploring-llm-clusters |
| 工具使用情况 | 调用的工具组合发生变化;每条跟踪记录的工具调用次数不断上升 | exploring-llm-traces |
发现团队实际使用的维度,不要凭空猜测。 除了内置属性($ai_model、$ai_provider、ai_product、distinct_id、$ai_span_name、$ai_http_status、$ai_tools_called),团队还会附加自定义属性(feature、tenant_id、workflow_name)。使用 read-data-schema 查找已存在的属性,并将有助于划分数据的属性记为 pattern:llm_analytics:dimensions。
references/lenses.md 是各观察面的操作指南——阅读其中关于每个观察面的信号、用于切分的维度、应打开的深入分析技能 + 工作流,以及排除条件的说明。深入分析技能(exploring-llm-costs / -traces / -evaluations / -clusters,以及用于 HogQL 的 querying-posthog-data)已内置于沙盒中,并包含实际维护的查询——深入分析某个观察面时,请阅读对应的技能,不要重新编写 SQL。
深入分析
当某个观察面发现问题时,不要只报告汇总数字,而要定位问题并抽样:
- 定位。 按某个维度(模型、
$ai_span_name、工具、用户、ai_product、自定义维度)切分贡献最大的$ai_generation/$ai_trace事件,展示是哪一部分推动了变化——这就是“成本上升”与可汇报发现之间的区别。 - 抽样。 通过
query-llm-trace提取一两条有代表性的跟踪记录(或从原始$ai_evaluation行中抽样一条失败的生成记录),并在证据中列出具体的跟踪记录 / 生成记录 / 评估 ID。引用的跟踪记录会链接到/ai-observability/traces/<trace_id>:请使用查询结果中的_posthogUrl。如果只有原始 SQL 中的 ID,请使用该 ID 和相关日期范围调用query-llm-trace,再使用其_posthogUrl;如果无法获取跟踪记录,则引用 ID 本身。绝不要通过将跟踪查询序列化到/insights/new#q=…来构建链接,因为TraceQuery不是洞察的数据源,这样会打开一个空洞察。 - 当趋势横跨多条跟踪记录时,归纳为一种模式:描述其共同特征(相同的模型 + 相同的 span、相同的工具错误、相同的提示词版本),而不是逐行罗列。
随时保存记忆
记忆是一项持续进行的活动,而不是在运行结束时才做的总结。每当你观察到未来的 AI 可观测性运行需要了解的信息时,就写入一条便笺记录。将“类别”编码到键前缀中——pattern:、noise:、addressed:、dedupe:——以便未来的运行通过一次 text= 搜索就能找到:
- 键
pattern:llm_analytics:generation-baseline— “$ai_generation基线约为每天 80 万次,覆盖约 6,000 名用户;对于多步骤 Agent 来说,计数与用户数之比正常。” - 键
pattern:llm_analytics:dimensions— “对这个团队有用的细分维度:ai_product(posthog_ai / code / mcp / wizard)、model、feature。未设置 tenant_id。” - 键
pattern:llm_analytics:latency-bands— “各模型的 p90:nano 约 2 秒,sonnet 约 19 秒,o3/preview 的结构性高延迟约为 40 秒以上——按模型划分区间,绝不聚合。” - 键
noise:llm_analytics:o3-400-class— “o3 HTTP 400 错误是无害且反复出现的一类情况;只有超过 100 次/小时且持续 2 小时,或日发生率超过 0.05%,才重新调查。” - 键
addressed:llm_analytics:model-swap-2026-04-28— “Sonnet → Opus,2026-04-28;预期成本约为基线的 2.1 倍。” - 键
report:llm_analytics:<entity>— 你为此切片上的回归(某个模型、ai_product、评估或集群)撰写的报告的report_id,这样下次运行会编辑该报告(使用新的时间窗口调用append_evidence),而不是创建重复报告。 - 键
reviewer:llm_analytics:<area>— 产品、模型或评估领域已确认的负责人(纯小写 GitHub 登录名),以便更快地将报告交由人工处理。
到第 5 次运行时,你就会了解团队的健康基线、哪些维度有助于细分、哪些峰值会反复出现、哪些评估应提高或降低权重,以及各个领域的负责人。
决策
撰写报告前,先检查此切片是否已有报告——便笺中的 report:llm_analytics:<entity> 指针是可靠途径:其中保存了 report_id,因此可直接调用 inbox-reports-retrieve。只有在没有指针时,才回退到使用 inbox-reports-list 搜索(ordering=-updated_at),并搜索此切片的_具体_术语(模型、ai_product、评估名称、集群 ID)——在繁忙的项目中,像 latency 这样的宽泛词语会返回数百条无关报告,把你自己的报告淹没。然后,对每个候选项:
- 编辑:如果收件箱中已有报告涵盖该时间段,请通过
scout-edit-report编辑现有报告。回归问题很少是全新的——成本阶跃后仍处于高位、延迟区间尚未恢复,或评测仍然失败次数更多:使用append_evidence添加最新时间窗口的数据(或者重写你撰写的报告标题/摘要)。当存在匹配项且它仍在收件箱中有效时,这是默认做法;不要创建近似重复的报告。**持续存在的回归问题在多次运行中应始终对应一份报告:**当新的完整时间窗口确认问题仍在持续时,这属于一次 重新升级——使用append_evidence将最新时间窗口添加到报告中,并推进dedupe:门槛。**不要每次轮询都撰写一份新报告。**但请先检查匹配报告的状态:edit-report无法更改状态,因此向resolved/suppressed/failed报告(不会显示的报告)追加内容,会让真实的复发被埋在已关闭的条目下。如果先前的报告已不再有效,请为复发撰写一份新报告,并将report:llm_analytics:<entity>重新指向新的 ID。 - 撰写:只有当收件箱中没有有效报告涵盖该问题时,才通过
scout-emit-report撰写一份新报告。现有报告已追踪的回归问题出现新证据时,应当编辑,而不是创建新报告——emit-report用于确实未被涵盖的时间段(或根据“编辑”要点所述,先前报告已不再有效的复发)。这里的有力发现是指:证据足以确定结论,无须保留意见;变化定位到具体时间段(而非聚合产物);并且evidence中包含具体的跟踪记录 / 生成 / 评测 / 集群 ID 和查询结果。成本 / 延迟 / 评测回归应以图表呈现——通过charts附上该时间段的每日序列,以便在报告中直观看到相对于自身基线的变化。成本 / 延迟 / 评测回归背后都有代码层面的切入点——提示词、模型选择、重试或回退路径——因此,当证据指出其中一项时,请设置actionability=immediately_actionable,设置priority,并注明负责这些调用的repository(无法判断具体仓库时请省略该字段,以便选择流程能够找到它):尚未找到根因,正是开展调查的目的,而不是需要人工输入的理由。对于下一步只能由人员决定的回归问题——例如支出取舍、模型更换、提供商侧变更——请使用actionability=requires_human_input;并且对于这类问题,不要设置priority和repository,因为它们是自动启动 PR 的字段;在没有repository的情况下提供priority+suggested_reviewers,会被视为有意创建 PR,并启动仓库选择沙盒,最终却无事可做(自动启动需要immediately_actionable)。无论如何都要设置suggested_reviewers——通过scout-members-list找到负责人员,并将其已解析的github_login(或{user_uuid})作为对象传入,因为suggested_reviewers是对象列表,而不是裸字符串列表(将登录名缓存在reviewer:llm_analytics:<area>键下)。这样报告才能送达人工处理人员;若留空,报告将不会分配给任何人,很可能被遗漏。撰写完成后,创建一条包含report_id的report:llm_analytics:<entity>暂存记录,以便下次运行时编辑现有报告,而不是创建重复项。 - 记住:如果问题尚未达到标准,但值得后续跟进,或者需要记录排除了哪些可能性及原因,请记下来。
- 跳过:如果
noise:/addressed:/dedupe:前缀的暂存记录或现有收件箱报告已涵盖该问题,请在最终摘要中用一行说明后跳过。
如果先前的运行已涵盖该主题,默认应选择编辑或跳过并刷新记忆,而不是撰写近似重复的报告。收件箱中重复出现同一事实对信噪比的损害,远大于某次轮询遗漏一项发现。
收尾
总结本次运行——用一段话说明:你查看了哪些视角、编写或编辑了哪些报告、记住了什么、排除了什么以及原因。执行框架会将该总结写入运行记录,并作为可搜索文本;后续运行会通过 scout-runs-list 读取。不要单独创建“运行元数据”备忘记录——运行总结已承担此作用,重复的逐次运行备忘记录会让持久化信息显得杂乱。
排除情形(跳过)
- Anthropic / OpenAI 速率限制错误——错误跟踪视角也会显示这些错误。如果备忘录中已有相关
noise:条目,则跳过;否则添加一条。 - 单个开发者在本地测试——
properties.environment ∈ {dev, local}或内部用户。在评估前先过滤。 - CI / 评估运行——CI 流水线产生的大量
$ai_evaluation不是面向用户的流量;在将其视为回归问题前,先检查调用用户 / 来源。 - 定时批处理作业期间的成本激增——定期运行的夜间基准测试会显示为成本激增。记忆中应记录其运行周期。
- HITL 中断 / 取消——这些会抬高原始
$ai_is_error;在评估错误趋势前先过滤。 - 单独出现的评估通过率下降——启用的
llm_analytics:evaluation信号源会自动将其发送到收件箱。只有在查明自动流转无法发现的原因时,才编写报告。 - 服务提供方侧事件——已知上游服务中断期间出现的 429 / 5xx 激增并非 PostHog 侧的错误;请先核对状态时间。
如有疑虑,优先记录备忘,而不是提交报告。成本 / 评估信号会让财务和 ML 团队高度紧张;误报会迅速损害信任。
MCP 工具
遥测与成本:
query-llm-traces-list— 最近的追踪记录,可按用户 / 模型 / 成本 / 错误 / 工具筛选。query-llm-trace— 深入查看单条追踪记录(完整请求 / 响应、工具调用、跨度)。get-llm-total-costs-for-project— 查看项目的顶层成本概况。query-trends— 当其聚合方式能保留所需计算时,用于查看$ai_*事件的原生趋势、细分和对比。execute-sql— 用于分析$ai_*事件趋势和细分的主力工具(请阅读posthog:querying-posthog-data,遵循 HogQL 规范)。
评估与增强配置:
llma-evaluation-list— 仅包含评估配置(名称、类型、是否启用)。此处不包含通过率——请通过execute-sql从$ai_evaluation事件中读取趋势(这是可靠的方式)。llma-evaluation-report-list/-run-list— 查看评估中配置的定期 AI 报告,以及过去的运行结果(用于深入查看,不是主线)。与llma-evaluation-get/-test-hog搭配使用。llma-tagger-list/llma-score-definition-list— 查看增强配置(自动标记器和评分器——可能悄无声息地出问题的 LLM / Hog 作业)。llma-clustering-job-list/-get— 查看追踪记录 / 生成内容中的语义聚类。llma-prompt-list/-get— 查看提示词版本,用于将变更与其原因关联起来。
架构:
read-data-schema— 在基于事件或属性筛选、分组之前,发现事件、属性和团队自定义维度。
收件箱与审核者分配:
inbox-reports-list/inbox-reports-retrieve— 查看收件箱中已有的报告;撰写报告前先检查,以便编辑而非重复创建(ordering=-updated_at)。inbox-report-artefacts-list— 查看可比较报告的制品日志,其中包含已分配的suggested_reviewers(报告记录不会公开这些信息)——可用于参考审核者的分配先例。scout-members-list— 查看此项目的成员及其user_uuid和解析出的github_login。可使用任一值分配负责人。如果github_login为 null,请使用user_uuid。在 scout 运行中无法使用组织级解析工具。
Harness 层级:
scout-project-profile-get— 获取初始概况快照。scout-scratchpad-search/scout-scratchpad-remember— 在多次运行之间持久保存引导信息。scout-runs-list/scout-runs-retrieve— 查看先前运行的发现。scout-emit-report/scout-edit-report— 撰写报告 / 编辑现有报告(报告渠道的约定见 harness 提示词)。scout-members-list— 查看此项目的成员及其解析出的github_login,用于suggested_reviewers分配。
深入分析技能(内置于沙盒中——深入分析时请阅读对应技能,不要重新编写查询):posthog:exploring-llm-costs、posthog:exploring-llm-traces、posthog:exploring-llm-evaluations、posthog:exploring-llm-clusters 和 posthog:querying-posthog-data。请参阅 references/lenses.md,了解各技能对应的分析视角。
何时停止
- Scratchpad、近期运行记录和概况均无异常 → 以无发现结案。
- 候选项与 scratchpad 条目或现有收件箱报告匹配,且条目的键前缀为
noise:/addressed:/dedupe:→ 编辑或跳过,并附上一行说明。 - 验证了一些假设并为已确认的问题提交了报告 → 即可结案,即使还有更多内容可以调查。报告宜少而精。
“查看过,但没有发现有意义的问题”也是一种有效结果,并非失败。