知识库中的文档更新

📅 发布时间:2026/8/31 4:51:34
知识库中的文档更新 1. 问题知识库刚开始做的时候会很自然地想到一种更新方式文档发生变化 → 重新解析 → 切块 → 计算 Hash → 找到发生变化的 Chunk → 更新索引。如果原来的文件被直接修改这套方法确实比较好用。文件、版本和 Chunk 之间的关系都是明确的系统也可以记录文件版本、Hash、导入时间等信息。但实际情况并不总是这样。比如原来的知识库里有一份员工管理制度 ├── A规则 ├── B规则 └── C规则后来又新增了一份2026年员工管理补充规定 ├── A规则新 ├── B规则新 └── C规则新新文件并没有修改原来的文件从文件管理的角度看它就是一份新的文件。但从知识的角度看新的 A、B、C 很可能已经覆盖了旧的 A、B、C。如果直接把新文件加入知识库两个版本都会存在。用户搜索 A 规则时就可能同时召回旧内容和新内容。这时候问题就不是“这个文件有没有更新”而是新文件中的知识到底和知识库里哪些旧内容存在覆盖关系这个关系很难单纯靠文件名或者 Hash 解决。2. 不强行做跨文件映射理论上可以给新旧知识建立映射例如新文件 A ↓ 旧文件 A ↓ 旧 Chunk然后判断哪些 Chunk 被修改、哪些被删除。但实际文件比较复杂的时候这个工作很容易失控。一个新文件可能覆盖多个旧文件的一部分也可能只是补充其中一部分内容。甚至几个旧文件的内容最后被重新整理成一个新文件。这时候即使两个文件都在系统内部也不代表系统知道它们之间的知识关系。如果最后还需要用户自己维护这个文件对应哪个旧文件 修改了哪些内容 哪些内容需要删除维护成本反而会转移到用户身上。所以没有必要为了追求完全的增量更新把这套映射做得特别复杂。3. 小规模新增怎么处理如果只是新增一两个文件可以直接导入不需要动原来的索引。文件进入知识库时记录一些基本信息例如document_id file_name version import_time effective_timeChunk 在召回时把这些信息一起带出来。例如内容员工迟到处理规则…… 来源2026年员工管理补充规定.docx 版本v1 导入时间2026-08-29这样如果一次召回了新旧两份内容模型至少知道它们不是同一个版本。Prompt 中可以明确要求相同主题存在多个版本时优先参考当前有效、较新的版本新旧内容冲突时不要直接把旧版本当成当前规则无法确定哪个版本有效时不要自己强行判断。这里模型需要做的其实不是判断“新增还是修改”而是判断这些内容哪个应该作为当前有效信息。4. 知识库积累到一定程度后重新整理如果知识库一直采用新增的方式维护时间长了还是会积累不少重复和过期内容。例如旧文件 新文件 补充文件 旧版本文件 临时文件这些内容长期混在一起继续做增量维护的收益会越来越低。这种时候可以直接做一次整理。先备份当前知识库然后重新确定现在真正需要保留的文件再重新解析、切块和建立索引。这个过程不需要频繁进行也不一定要规定“多少个文件就必须重建”。更实际的方式是平时小规模新增直接导入等知识库积累到一定程度、开始出现比较明显的重复和版本混乱时再统一整理一次。这样做的好处是平时不用为了一个新增文件去分析整个知识库的关系需要整理的时候也可以一次把过期内容、重复内容一起处理掉。5. 重建不会影响线上使用如果知识库是线上使用的也没必要因为重新建立索引就直接让原来的知识库停止服务。可以在后台重新建立一套索引当前线上索引 ↓ 正常提供检索 后台建立新索引 ↓ 解析文件 ↓ 切块 ↓ Embedding ↓ 建立完成 新索引准备好 ↓ 切换切换之前旧索引仍然可以正常使用。新的索引完全建立完成后再切换即可。所以“重新建立索引”和“线上知识库不可用”并不是一回事。6. 最后采用的方式这套方案最终比较简单小规模变化直接新增或者做增量更新同时记录版本号、导入时间等信息。出现新文件覆盖旧知识的情况不强行分析两个文件之间的 Chunk 映射先让新旧内容都保留通过版本信息辅助召回后的判断。知识库积累到一定程度再备份并重新整理一次把当前真正需要的知识重新建立索引。这样做的核心不是追求所有文档都能自动完成精确更新而是控制知识库长期维护的复杂度。毕竟实际的文档并不一定按照“修改原文件”的方式变化。很多时候一份新文件就可能重新描述一批已经存在的规则。与其花大量精力判断新旧内容到底怎么对应不如在合适的时候直接重新整理一次。