披露:我是 kapa.ai(http://kapa.ai)的创始人之一(YC S23)。我们基于技术文档、Slack、支持工单、wiki 和代码构建 AI 智能体。我们托管着数千个知识索引,其中几乎每一个都有每天都会变化的来源。

大约一年前,我们不再做周期性重新摄取,而是把所有东西都改成了增量同步。这里大多数关于「怎么让索引保持新鲜」的帖子最后都落到「每晚重建索引」,所以我觉得分享一下我们实际在跑的东西会挺有意思,包括那些到现在也还不怎么样的部分。

1. 每个数据源对「变更」的定义都不一样

没有通用的连接器。

有些工具,比如 Zendesk 或 Confluence,提供了 API,你可以直接问「从 10:00 之后改了什么?」有些工具只给每个条目一个「最后修改」时间戳。还有些工具什么都不给,你只能把全部内容拉下来自己比对。

这决定了你能以多高的频率检查每个数据源:

Zendesk 帮助中心 + 工单 → 每 5-10 分钟 Confluence、Jira、Notion、GitHub → 每约 10 分钟 Slack → 每 6 小时(重扫最近 7 天) YouTube → 每天 网页抓取 → 每天、每周或手动

有可靠「变更内容」API 的数据源,每隔几分钟检查一次。没有这类 API、或者限流严格的数据源,检查频率就低一些。

2. 网页抓取本身就是个难题

对我们大多数客户来说,最重要的数据源是他们的公开网站(文档、帮助中心、营销材料)。这类内容没有 API 可用。我们的做法是抓取:逐页访问,提取出实际内容,再与已经建好索引的内容做比对。

每天要处理这么多页面,而且就算内容没有任何实质变化,原始 HTML 也一直在变:

crawl 1:build=a81f  footer="© 2025"  nav=v12
crawl 2:build=c93e  footer="© 2026"  nav=v13

→ HTML 变了,内容没变

只要 HTML 一变就重新处理该页面,你实际上等于每天都在做一次全量重建索引,只是自己没意识到。

所以我们比对的是抽取出来的内容,而不是 HTML,并且忽略那些不影响含义的变动,比如日期变化或链接目标地址变了。只有内容真正发生变化的页面才会被重新处理。

3. 元数据会骗人(!!),所以要比较实际内容

同样的问题不只出现在网页抓取上。我们遇到过一个数据源,「最后修改时间」字段一直在变,但文件内容其实没变:

guide.pdf 最后修改时间 → 变了 guide.pdf 内容 → 没变 → 白白重新入库了一遍

放到几千个文件上,这就是大量白费的处理。

所以只要条件允许,我们就会检查内容本身有没有变,而不只是看元数据。

4. 删除才是最棘手的部分

大多数 API 都能让你查询「从昨天到现在改了什么?」

几乎没有哪个能让你问出「删掉了什么?」

被删除的页面不会以变更的形式出现,它只是不再存在了。要想发现这一点,你得把源端的全部内容列出来,再和索引里的全部内容逐一比对。这种做法又慢又贵,所以跑得比检查编辑的频率更低:

新增和更新的内容 → 几分钟内 删除,大多数数据源 → 24-48 小时内 删除,Jira Service Mgmt → 12 小时内

在这项检查跑起来之前,助手仍可能引用客户已经删掉的页面,这确实不太理想。但总比让它一直留在那里(或者干脆全量重建索引!)要好。

5. 重大变更先交人工处理

这一条同样来自爬取,它能防住最糟糕的那类失败:

客户重新设计了文档站点 → 所有旧 URL 都返回 404 → 爬虫据此判断:“所有页面都已删除” → 索引被清空 → 助手:“我不知道”

同样的情况也可能发生:预发布构建被误上线,或者返回的是机器人防护页面而不是文档页面。

所以,如果一次抓取中某个站点有 45% 或更多页面发生变更或消失,那么在用户审核之前不会应用任何改动(用户会收到通知)。

我们学到了两点:

  • 404 表示页面已经不存在了。503 或超时则说明服务器当时出了点状况。只有前一种情况才应该算作删除。
  • 大多数被标记的抓取结果最后都没问题。这个检查我们还是保留着。误报只让人多花一分钟,索引被清空却是客户事故。

6. 只为发生变化的部分付费

并不是每个处理步骤的成本都一样。把文本转成向量很便宜。把 PDF 转成干净的文本,或者让模型去描述页面上的截图,就不便宜了。

如果只是有人改了某个页面上的一处错别字,而这个页面有 40 张截图,那我们就不该把 40 张截图全部重新描述一遍。

所以,只有内容确实发生了改动,才会执行那些开销大的步骤,而且这些步骤的结果会被缓存下来。


接下来我们要做的是:MCP 工具,让 agent 自己就能添加和管理数据源。

希望这些内容对正在规模化搭建 RAG 流水线的各位有所帮助。:)

我很好奇,其他人是怎么处理那些 API 不会告知删除了哪些内容的源数据的删除问题的?

附:我们刚开放了自助注册,14 天免费,不用绑卡。如果你有某个源老是同步出问题,把它接进来,然后告诉我我们哪里做错了:https://app.kapa.ai/auth/signup