Files

2.8 KiB
Raw Permalink Blame History

内容提取流程

本文说明处理流水线如何把 FreshRSS 条目转换为可供摘要使用的文章文本。

核心规则:FreshRSS 条目不重新抓取原文 URL

FreshRSS 是仅提供 RSS 内容的上游。 对于 FreshRSS 条目,流水线不会向文章原始 URL 发起 HTTP 请求。该行为由 pipeline.py 中的 RSS_ONLY_UPSTREAMS = {"freshrss"} 强制保证。

唯一例外是非 FreshRSS 上游。未来未设置 upstream: freshrss 的其他来源,可以在必要时使用 fetch_html() 作为回退。

内容来源优先级

content_loader.py 按以下顺序检查内容,并使用第一个包含 至少 500 个可读字符 的来源:

优先级 来源 含义
1 raw_html 通过 ExtractionInput.raw_html 预先注入的 HTML;常规 FreshRSS 运行中很少使用。
2 item.raw_content RSS <content:encoded> 中的文章正文;部分订阅源提供,部分不提供。
3 item.raw_summary RSS <description> 中的摘要或片段;这是当前运行中最常见的来源。
4 rss_content 来自非条目字段的独立 RSS 内容。
— none 没有可用内容;FreshRSS 不允许回源抓取,因此抛出 RSS_CONTENT_MISSING。

content_source 与文本质量的关系

每个 item-XX.extracted.json 中的 content_source 字段表示流水线实际使用的内容来源:

  • item.raw_content:RSS <content:encoded> 提供的文章正文,通常质量最好,接近直接阅读原文。
  • item.raw_summary:只有 RSS 摘要或描述,并非完整正文。不同来源长度差异较大,通常为 300-2000 个字符;AI 摘要基于该片段,而不是完整文章。
  • rss_content:来自独立 RSS 内容,质量取决于订阅源。
  • fetched_html:从原始 URL 抓取的 HTML。FreshRSS 条目不会出现该来源,只适用于非 FreshRSS 上游。

对日报质量的影响

如果提取结果文件中出现 content_source: item.raw_summary,说明 AI 使用的是订阅源摘要或片段,而不是完整正文。日报内容显得较浅时,原因可能只是 RSS 描述过短。

提高质量可以选择提供完整 <content:encoded> 的订阅源,或者把内容来源切换到支持全文 RSS 的系统,例如具备全文提取能力的 RSS 代理或 FiveFilters 等服务。

快速检查

先调用 list_run_artifacts(run_id),再读取返回的提取结果产物路径,检查 content_source 和 article.plain_text。不要按 run_id 或“最新目录”手拼路径。

相关代码路径

  • src/summary_mcp/core/pipeline.py:RSS_ONLY_UPSTREAMS、_should_skip_fetch()、extract_content()。
  • src/summary_mcp/core/content_loader.py:choose_inline_content() 的优先级链和 fetch_html();FreshRSS 条目不会调用后者。