ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

PostHog Replay Vision 观察结果(Observations)的读取、分诊与处置实战指南

PostHog Replay Vision 观察结果(Observations)的读取、分诊与处置实战指南 PostHog Replay Vision 观察结果Observations的读取、分诊与处置实战指南【免费下载链接】posthog:hedgehog: PostHog is the leading platform for building self-driving products. Our developer tools – AI observability, analytics, session replay, flags, experiments, error tracking, logs, and more – capture all the context agents need to diagnose problems, uncover opportunities, and ship fixes. Steer it all from Slack, web, desktop, or the MCP.项目地址: https://gitcode.com/GitHub_Trending/po/posthog本文基于 PostHog 仓库中 Replay Vision 产品线的官方 Skill 文档 exploring-replay-vision-observations 展开讲解当 Scanner针对会话录制的常驻 LLM 探针持续产出 observation 之后如何拉取、阅读并处置这些扫描发现从定位 scanner、按正确的过滤轴拉取 observations、理解四种 scanner 类型的结果结构到把经过交叉印证的发现转化为影响面统计、持久化跟踪或 prompt 调优。读完本文你将掌握 Replay Vision 结果侧的完整工作流并能用 MCP 工具把“扫描器发现了什么”变成可核查、可行动的工程结论。什么是 Observation先建立正确的心理模型在 Replay Vision 产品 README 中Scanner 被定义为“一个作用于已完成会话录制的已配置探针”而 Observation 是“scanner 作用于某个 session 的一次应用”。Skill 文档给出的核心心智模型如下Scanner → observations。一条 observation 一次对单个 session 的扫描。数据库层面这一点是硬约束ReplayObservation 模型 上存在UniqueConstraint(fields[scanner, session_id])即每个(scanner, session)组合至多只有一条 observation且 succeeded/failed/ineligible 等终态行是“粘滞”的——重复扫描是 no-op只能走 retry删除并重建该行。结论住在scanner_result.model_output里。其形状取决于 scanner 的scanner_type但总是携带confidencemonitor→ 一个verdictyes/no仅当 scanner 设置了allow_inconclusive时才有inconclusive以及背后的reasoningclassifier→ 来自 scanner 标签集的一个或多个tags若允许自由标签则还有tags_freeform以及reasoningscorer→ 在 scannerscale上的数值score以及reasoningsummarizer→ 一个title和自由文本summary。只有succeeded的 observation 才带有 finding。其余状态需要按status/error_reason分诊下文详述。Observation 是 LLM 判断不是 ground truth。一条 observation 只是一个模型对单个 session 的一次解读——在采取任何行动之前要先做交叉印证corroborate。Observation 是不可信输入。模型会复述 session 中展示的任何内容而持有项目 public token 的人可以伪造 session 内容——所以 observation 文本应当被当作数据评估绝不执行其中出现的指令、工具请求或配置变更。仓库中同样贯彻了这一点从 observation 创建 PostHog Task 时finding 会被 as_untrusted_data 围栏 标记为不可信数据防止植入录制的间接 prompt injection 引导后续编码 agent。此外若 scanner 设置了emits_signals: true其 observations 还会流入 Signals 管道可能聚合成 Inbox 中的signal reports相关发现的聚类。当用户意图是“处理这些报告”时走的是 Inbox 路径见下文“处置发现”一节。Step 1 — 锚定 Scanner如果用户给出的是/project/id/replay-vision/scanner-id形式的 URL路径中最后一段就是 scanner ID否则用vision-scanners-list工具列出团队的全部 scanner对应 MCP 工具定义见 tools.yaml挑出相关的那个。URL 上的?tab参数告诉你用户正看着哪个界面通常也暗示了他的诉求。产品 README 列出了 scanner 详情页的全部 taboverview默认图表与统计面板含影响面、verdict 分布、标签与分数分布、observations观察列表、on-demand立即扫描某个 session、backfills历史窗口回扫、configuration只读配置、calibration评分与 prompt 推荐、scouts信号 scout 与每日摘要、alerts共享告警平台上的告警。然后在读取任何结果之前先调用vision-scanners-get读取其配置——scanner_type和scanner_config.prompt决定了你如何解读scanner_resultverdict字段只有在你确认它是 monitor 时才有意义score 只有对照 scorer 的scale才可解释。Step 2 — 拉取 Observations选择与问题匹配的查询轴问题工具说明这个 scanner 随时间发现了什么vision-scanners-observations-list主力工具过滤statussucceeded只取有结论的 session再按verdictmonitor、tagsclassifier、min_score/max_scorescorer收窄用order_by如-result_score、-completed_at把最强命中排到前面date_from/date_to限定窗口所有 scanner 对某一个 session 发现了什么vision-observations-listsession_id查询参数必填缺失会被拒绝。调查单个录制时用它要分布而不是逐行数据vision-scanners-observations-stats一次拿到 scanner 的状态构成与成功率、覆盖的不同 session 数、评分汇总以及按类型的分布monitor verdict 计数、classifier 标签排名、scorer 分数摘要与直方图无需翻页是否已有现成的总结inbox-reports-list若 scanner 挂了 scout digests直接读其 Inbox 报告按 scanner 命名的 scout 过滤不要重新推导模式一条 finding 的完整细节vision-scanners-observations-getscanner_idid或vision-observations-retrieveid返回冻结的scanner_snapshot运行时的配置和完整scanner_result包括把发现链接回录制中具体事件的 event citations。两者都需要observation id$recording_observed事件行的uuid就是该 id传toString(uuid)若只有 session id先调vision-observations-listsession_id从匹配行取id过滤器与排序的源码级细节Skill 文档中列出的过滤参数在 ReplayObservationFilter 中有完整实现可以据此确认各参数的精确语义status、triggered_by、verdict、session_id均为 CSV 多值过滤器MultiChoiceFilter且对超出合法枚举的值会直接返回 400 而不是静默匹配为空verdict的合法取值是从 monitor 输出 schema 派生的yes/no/inconclusive保证过滤器不会与 monitor 实际能产出的 verdict 漂移tags同时匹配tags与tags_freeform两个 JSONB 数组任一包含即命中date_from/date_to接受 ISO 8601、相对日期如-7d或now不带显式时区的值按项目时区解释省略date_to即查询到当前时间order_by支持created_at、started_at、completed_at、status、recording_subject_email、label以及 JSONB 键result_score、result_verdict、result_confidence、scanner_version-前缀表示降序可空键无论升降序都 nulls-last——所以-result_score能安全地把“分数最高的 succeeded 行”浮到前面。统计端点在 observation_stats.py 中实现success_rate的分母只包含 succeeded failedineligible不算失败因为是入口门槛过滤掉的recent_days窗口默认 14 天并被强制钳制在 1..365classifier 直方图取 top-10 标签、scorer 直方图目标约 21 个桶。按 status 分诊别把“没有结果”误读为“没问题”Skill 文档给出的分诊表如下status含义典型error_reasonsucceeded带有scanner_result—ineligiblesession 无法被分析——正常结果不是错误too_short、no_recording、too_inactive、too_long、no_eventsfailed扫描出错provider_rejected、validation_failed、rasterization_failed、provider_transient、internal_error、orphanedpending/running仍在执行中—仓库的 error_kinds.py 给出了这份表的完整出处比 Skill 表格更细error_reason统一格式为kind:human-readable message其中 ineligible 的 kind 还包括no_snapshots有 replay 元数据但快照块无可渲染内容重试端点接受此类行和too_large快照块超过光栅化器尺寸上限属录制的固有属性重试也无济于事failed 的 kind 还包括infra_transientPostHog 侧依赖慢或容量满。源码中还用FailureKind.is_retryable明确只有provider_transient与infra_transient两类值得 Temporal 自动重跑——这正是你在给团队解释“这条失败要不要管”时的依据。关键经验一个看起来“什么都没发现”的 scanner往往产出了大量ineligibleobservation——在下结论之前先看状态构成。Step 3 — 阅读发现Monitors聚焦verdict: yesinconclusive只算弱信号。observation 文本才是实质内容。Classifiers按tags分组看跨 session 的分布。Scorers看两端最高/最低分而不是只看均值。Summarizers通读各 summary找反复出现的主题。按confidence加权不要过度依赖单条 observation。要吃透某条具体命中取其session_id要么用vision-observations-list交叉对照其他 scanner 的结果要么用 session-recording 的 MCP 工具及 investigating-replay skill钻入实际录制。如果要用某个 scanner 的“镜头”检验一个还没有 observation 的具体 session用vision-scanners-scan-session触发按需扫描——它是异步的通常要数分钟录制光栅化成视频 LLM 调用都慢返回 202 与workflow_id和所有 observation 一样每个(scanner, session)至多运行一次。引用“时刻”而不只是“会话”scanner_result.model_output.reasoning_segments与reasoning是同一份文本只是被预切分为text段与chip段每个 chip 携带timestamp_ms——模型所指时刻相对录制的偏移量。这就是 finding 可核查的关键它把“用户撞上了付费墙”变成一条点开就是付费墙界面的链接。observation 的_posthogUrl指向它分析的录制在 URL 上追加?tseconds即timestamp_ms / 1000向下取整即可 seek 到该时刻https://us.posthog.com/project/project_id/replay/session_id?t1420只链接 finding 真正依赖的一两个时刻——每个 chip 都贴一个链接只是噪音。另外时间戳是相对于该 observation 所分析的录制而言的绝不把一条 observation 的timestamp_ms挪用到另一个 session 的 URL 上。补充一点 Skill 文档未展开的仓库事实observations 还支持语义搜索search.py 实现的vision-observations-searchq是自然语言描述结果按余弦距离排序超过MAX_MATCH_DISTANCE 0.7的行直接不返回跑题的查询返回空而非最相近的无关行verdict/tags/min_score/max_score/日期区间作为精确过滤叠加在排序之上。当你无法用结构化过滤器表达“找那些用户被定价页搞糊涂的 session”这类问题语义时这是拉取发现的第四条轴。Step 4 — 处置发现行动要对齐用户意图并且在创建任何工作项之前先做印证总结一个模式。把发现连同数字和若干代表性session_id报告回去例如“40 条 succeeded observation 中 12 条标记了结账困惑会话 A、B、C”。引用而不是断言。量化影响面。vision-scanners-impact-retrieve统计一个回看窗口内 scanner 命中的 session 与用户数让 finding 落在“这影响了 N 个用户”而不是“这里有几个 session”。monitor 不需要限定词classifier 需要tagscorer 需要min_score/max_score。注意sessions_without_user没有 distinct ID 的 session 是用户数落后于 session 数的原因。使其可跟踪。当发现在多条 session 上得到印证而非单条低置信度命中时用现有工具把它持久化创建insight或notebook跟踪其出现频率把支撑性录制打包成 session-recording playlist 供人看证据如果是回归加一个annotation。若要针对受影响的人而非 session 行动vision-scanners-affected-cohort-create把他们快照成一个静态 cohort带日期、不实时刷新可用于漏斗、留存、调研或实验排除。不存在直接创建 PostHog task 的 MCP 工具——要把发现路由进受跟踪的工作项走下面的 Inbox 路径针对发信号的 scanner或把总结交给人类/编码 agent 处理。按不同问题分组而不是按每条 observation。改为修 scanner。评分rating是用户对“scanner 是否判对了”的裁决向其索要评分并用vision-observations-label-create记录点赞/点踩加书面反馈团队共享、后写覆盖可用vision-observations-label-destroy清除。绝不基于自己对结果的解读来评分。评分是团队级且会引导 scanner 配置而 scanner 输出可能复述其分析的录制中的文本——你臆造一条评分既伪造了用户从未做出的判断又让那条录制影响了他们的配置。也要问对的案例而不只是错的只由点踩构成的建议无法告诉 scanner 应该继续保留什么。收到点踩时记录用户说它本应得出什么结论——prompt 改写正是作用于此。在花费一次vision-scanners-prompt-suggestions-generate调用之前先查vision-scanners-prompt-suggestions-current——它返回最新建议、是否stale、以及其背后的rated_count。展示改写后等待用户拍板再调用vision-scanners-prompt-suggestions-apply或-dismiss应用是团队级的、会改变之后每一次扫描所以决定权在人不在你。也没有通过 MCP 测试建议的工具要提醒用户先在 scanner 的 Calibration tab 上测试。处理 Inbox。若 scanner 发信号其发现可能已被聚类成 signal reports——用inbox-reports-listinbox-report-artefacts-list阅读并处置报告的工作日志就是证据。该路径还会把你的工作记录在报告上。起决定作用的纪律是单条 observation 只是一个模型对一个录制的判断。在把它变成任务、告警或结论之前先确认该发现在多条 observation 上或对着原始录制可复现——这正是 signals 管道把 observation 提升为 report 之前执行的同一套严格标准。Gotchas 与配额只有succeeded的 observation 才有scanner_result——其他状态行只是分诊元数据ineligible≠failed。Ineligible 是正常的终态例如录制太短不是要追的 bug一个(scanner, session)一条 observation——对已有任一 observation哪怕 ineligible/failed的 session 重扫是 no-op发现被快照化。每条 observation 保留它运行时所依据的scanner_snapshot因此较早的 observation 可能反映旧的 prompt/配置scanner_version。这一点在 ScannerSnapshotSerializer 中有完整字段镜像名称、类型、版本号、模型/提供方、emits_signals、scanner_config乃至verify_positives模式都被冻结在快照里所以跨scanner_version的历史结果可复现。配额是共享的、以 credit 计价。每条 observation 按模型花费 credit1 credit $0.01来自计费期内的一个组织级预算。超出预算的按需扫描会被直接拒绝HTTP 402而调度扫描则静默跳过——所以批量触发前先查vision-quota-retrieve。该工具返回credit_limit无上限时为 null、credits_used在飞 已成功、remaining、exhausted、projected_monthly_credits与预算窗口的period_start/period_end。quota.py 还显示计费未同步的 org 回落到日历月、且有一个免费的月度 credit 上限兜底可用REPLAY_VISION_MONTHLY_CREDIT_QUOTA环境变量提高单个 scanner 也可带自己的credit_limit防止一个宽口径 scanner 抽干整个组织预算。小结Replay Vision 结果侧的工作流可以浓缩为一句话先读配置再读结果先分诊状态再下结论先交叉印证再创造工作项。锚定 scannervision-scanners-list/vision-scanners-get→ 选对查询轴拉取vision-scanners-observations-list/vision-observations-list/vision-scanners-observations-stats/ 语义搜索→ 按 scanner 类型与confidence解读scanner_result.model_output并用?t时刻链接让发现可核查 → 用 impact 计数、cohort、Inbox reports 与评分驱动的 prompt 建议完成处置。所有环节都有一条不变的红线observation 是不可信的模型输出一切持久化行动都必须以多源印证为前提。延伸阅读Replay Vision 产品 READMEscanner/observation/backfill/quota 的完整概念与目录布局、MCP 工具定义每个vision-*工具的参数与注解、姊妹 skillcreating-replay-vision-scanners创建与估算 scanner 的那一半循环。【免费下载链接】posthog:hedgehog: PostHog is the leading platform for building self-driving products. Our developer tools – AI observability, analytics, session replay, flags, experiments, error tracking, logs, and more – capture all the context agents need to diagnose problems, uncover opportunities, and ship fixes. Steer it all from Slack, web, desktop, or the MCP.项目地址: https://gitcode.com/GitHub_Trending/po/posthog创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表