用途:许多团队从未配置路径清理,导致 Web 分析的分组被成千上万条近似 URL 打散。该功能为 Web 分析预计算队列主动生成路径清理规则建议:每周对每个团队采样真实路径,请求 LLM 返回 {regex, alias} 规则,用团队自身路径校验后存储待审。它只建议,绝不自动应用——应用会改写所有已清理图表的历史数字,必须由人决定。手工编写或直接应用规则请用 managing-path-cleaning-rules 技能。
主要能力:核心逻辑位于 products/web_analytics/backend/path_cleaning_suggestions/service.py。sample_pathnames / count_distinct_pathnames 通过 HogQL 取访问量最高的 $pathname;call_llm_for_rules 经 LLM 网关一次性调用(get_llm_client(product="web_analytics", team_id=...),模型 WEB_ANALYTICS_PATH_CLEANING_SUGGESTIONS_MODEL,默认 claude-haiku-4-5);validate_and_annotate_rules 用 re2(ClickHouse replaceRegexpAll 所用引擎)编译每条正则并试用于采样路径,无法编译或无匹配的规则被丢弃,保留者获得密集顺序、match_count 及内存中的前后对比示例(仅由管理命令打印,绝不存储,避免泄露真实路径);generate_suggestions_for_team 负责编排与门控,纯生成不存储;apply_suggestions_to_team 将规则合并进 path_cleaning_filters,按正则去重、延续顺序,绝不覆盖。
存储与调度:以 path_cleaning_suggestions 健康问题(HealthIssue,severity info)存储,无专用模型;每团队一个活跃问题(hash_keys=[]),payload 含 rules、model、sampled_path_count、distinct_path_count。应用或手工配置后,下次检查运行即解决该问题;忽略即健康问题的 dismissed 标志。调度为 PathCleaningSuggestionsCheck(products/web_analytics/backend/temporal/health_checks/path_cleaning_suggestions.py),基于共享健康检查框架,每周一 06:23 UTC 运行,因每个合格团队消耗一次 LLM 调用而采用小批量顺序执行;已有活跃建议的团队直接重发,不再调用 LLM。队列由 WEB_ANALYTICS_PATH_CLEANING_SUGGESTIONS_TEAM_IDS 控制,默认取预计算注册列表 WEB_ANALYTICS_LAZY_PRECOMPUTE_TEAM_IDS。
门控(团队被跳过的原因):generate_suggestions_for_team 返回状态——skipped_inactive(visited_within_days 默认 30 天内无 $pageview,可用 --ignore-visit-gate 绕过);skipped_configured(已有路径清理规则,可用 include_configured 覆盖);skipped_low_cardinality(不同路径少于 min_distinct_paths 默认 50,清理无价值,不消耗 token);skipped_no_paths(窗口内无 pageview);generated(已生成规则,路径本就干净时可能为空列表,空结果不存储,以免遮蔽可操作建议);error(采样或 LLM 失败,按团队捕获,不中断整批扫描)。
用户查看与应用:设置横幅 PathCleaningSuggestionsBanner 位于 /settings/project#path_cleaning,以 regex → alias 预览展示最新建议行及匹配数,“Apply all”(仅项目管理员)合并规则,关闭按钮忽略,由 pathCleaningSuggestionsLogic 驱动。引导步骤 OnboardingWebAnalyticsPathCleaningStep(stepKey path_cleaning)在 Web 分析引导中展示同一横幅。API(products/web_analytics/backend/api/web_analytics_path_cleaning_suggestions.py):POST /api/projects/:id/web_analytics_path_cleaning_suggestions/generate/ 按需生成并存储新建议;GET .../{issue_id}/preview/ 将规则应用于团队热门路径的新样本并返回前后对比(读权限,按需计算、绝不存储,支撑横幅的“Preview on your paths”弹窗);POST .../{issue_id}/apply/ 合并规则并解决该问题(仅项目管理员,与团队 API 对 path_cleaning_filters 的门控一致)。列出与忽略走通用健康问题 API(GET /api/projects/:id/health_issues/?kind=path_cleaning_suggestions&status=active&dismissed=false,PATCH .../health_issues/{id}/ 传 {"dismissed": true})。健康页在 /web/health 与其他 Web 分析检查一同渲染,并提供面向人和代理的修复指引。PostHog AI(Max)将 generate/apply 暴露为 MCP 工具(products/web_analytics/mcp/tools.yaml 中的 web-analytics-path-cleaning-suggestions-{generate,apply}),可对话式建议并应用;应用具破坏性(改变历史图表数字),故受 MCP 确认门控。
运行方式:
默认队列,打印建议并存储健康问题:
python manage.py suggest_path_cleaning_rules
指定团队,试运行(不存储):
python manage.py suggest_path_cleaning_rules --teams 2,19279 --no-store
对已审核的单个团队生成并应用(合并,绝不覆盖):
python manage.py suggest_path_cleaning_rules --teams 2 --apply 可用标志:--days(回看)、--limit(采样前 N 条路径)、--min-distinct-paths、--include-configured、--no-store、--apply。健康检查也可像其他检查一样,通过健康问题刷新端点或管理界面按团队触发。
审核建议:读取团队活跃建议:HealthIssue.objects.filter(team_id=team_id, kind="path_cleaning_suggestions", status="active").first()。payload["rules"] 中每条规则含 regex、alias、order、reason、match_count,供人决定是否应用;真实路径的前后示例仅在生成时由管理命令打印,刻意不进入存储 payload。
扩展:新增展示渠道(应用内通知、设置横幅、引导向导步骤)时,读取团队活跃的 path_cleaning_suggestions 健康问题并渲染 payload["rules"],应用保持手动。更换模型须在 services/llm-gateway/src/llm_gateway/products/config.py 中为 web_analytics 产品加入允许列表。设计笔记中另有 signals-scout-web-analytics-path-cleaning 侦察器方案,但预计算队列更倾向使用专用任务,因为它精确针对该队列并输出结构化、已校验的行,而非 Signals 收件箱发现。