3.5.2 数据接入

知识库的文档不一定都要手动上传:外部源让知识库自己从远端拉内容并保持更新。平台内置两类数据源——飞书源(同步飞书文档,详见 3.5.5 飞书同步)与网页爬虫(抓取网站,详见 3.5.6 网页抓取)。本章介绍两类源共享的接入机制:怎么建源、怎么同步、怎么增量。

入口在知识库详情的「外部源」页:

知识库外部源列表

列表展示每个源的名称、类型、抓取目标、抓取频率、定时同步、已同步文档数与最近同步时间,行操作可手动同步、编辑与停用。

同步机制

每个外部源有一套统一的同步语义:

  • 手动同步:随时在行操作里触发,立即执行一轮抓取/拉取;
  • 定时同步:开启后按 cron 表达式在后台自动执行(表达式按 UTC 时区解释,与知识库所属时区无关);
  • 增量比对:同步按内容哈希逐页比对——没有变化的跳过,有变化的更新,新出现的入库;必要时可强制全量重抓;
  • 覆盖已变更页面:源上有一个同名开关——开启后,已抓取但内容变化的页面会被重新覆盖并再次触发工作流;关闭则已入库页面直接跳过,只收新页面;
  • 自动加工:抓取到的新文档与变更文档,会按知识库「设置」中的默认工作流自动执行切割、元数据生成与向量化,不需要人工再处理一遍。

这套机制意味着:配好一个源 + 定时同步后,知识库可以长期自动跟随内容源演进,运维成本接近零。

网页爬虫源

点击「新建爬虫」,从起始地址出发抓取整站或指定路径:

新建爬虫:基础与抓取范围

字段说明
起始地址抓取入口页,必须为 http/https 绝对地址
路径前缀限定只抓取以该前缀开头的同域名地址;留空限定为起始地址所在目录,防止爬出目标站
链接遍历深度1 表示仅抓起始页;建议不超过 3,避免抓取失控
单轮页数上限单轮抓取的页面数量上限,达到即停

新建爬虫:限速与同步

第二屏是礼貌抓取与同步策略:

  • 请求间隔:串行抓取,每抓一页等待设定间隔(快捷档位 1s / 3s / 10s / 30s),间隔越大对目标站点越友好;
  • 单次请求超时:超时的页面记为失败并继续下一页,不会卡住整轮;
  • 正文选择器:CSS 选择器(如 article、.markdown-body),只抽取页面正文区域,过滤导航、页脚等噪音;
  • UserAgent:默认 MoAI-Crawler/1.0,站点管理员可据此识别;
  • 覆盖已变更页面 与 定时同步:见上文同步机制。

数据接入与文档管线的关系

外部源只负责「把内容拿进来」,入库后的处理与手动上传完全一致:同样的切割、元数据、向量化,文档同样出现在「文件列表」中(来源标记为外部源),召回测试、应用绑定等能力全部通用。源停用后不再同步,已入库文档保留。

案例:让帮助中心知识库自动跟随官网更新

以「云途网盘帮助中心」为例(见 3.5.1),产品文档托管在官网 docs 站点,希望知识库自动保持同步:

  1. 建源:在知识库「外部源」新建爬虫,起始地址填 https://docs.example.com/help/,路径前缀限定 /help/,遍历深度 2、单轮上限 200;
  2. 降噪:正文选择器填 article.markdown-body,只抽正文;请求间隔选推荐档 3s;
  3. 自动化:开启定时同步(如每天凌晨 2 点),开启「覆盖已变更页面」;
  4. 验证:先手动同步一轮,到「文件列表」确认文档数量与内容,再到召回测试抽查新章节能否命中。

此后官网文档每次更新,知识库在下一轮定时同步后自动跟上,全程无需人工干预。

常见问题

爬虫抓到的页面很乱、带导航和页脚?
用正文选择器圈定正文区域;选择器需要在目标页面的 DOM 结构上核对(浏览器 F12 查一下正文容器的 class)。

定时同步没有按时执行?
cron 表达式按 UTC 时区执行,换算成本地时间核对;另外确认源处于「启用」状态。

源内容更新了,知识库里的文档没变?
检查「覆盖已变更页面」是否开启——关闭状态下已入库页面一律跳过;确认方式是看该页面的最近同步时间与文档版本。

同步会覆盖我在平台上对文档的手工修改吗?
外部源同步的文档以上游内容为准;但更新挡板会保护正在编辑的文档,避免同步覆盖未完成的修改。对入库文档做人工修订前,先确认该文档与源的同步关系。