RAG的优化
让知识库成为可更新、可演进的知识库
在第一次构建 RAG 的时候,做的比较简单,将单个文件的所有内容,计算成 MD5,这样会导致一个问题,如果我后续想要更新文件中的部分内容,那么文件的MD5也会变,会让向量数据库中的内容产生冗余和知识错误。
示例说明:文件内容 ABCD 后续需要改成 ABCE。
解决方案:
推荐设计思路(核心:稳定文档 ID + 先删后写或幂等写入)
- 给每条知识一个稳定的「逻辑文档 ID」
- 不能用文档内容MD5值作为Id
- 再更新文章的时
doc_id不能发生改变 - 每次chunk时中的 metadata 里至少要有
doc_id可选 version update_at auth
- 更新流程:对同一
doc_id先删再灌- Delete + Add:按 metadata 过滤删除该文档下的所有旧 chunk(例如 where={“doc_id”: “xxx”}),再对最新全文重新切分、add_texts。
- 去重 / 跳过策略要分层
- 文档级:若上游传来「与上次相同的全文 hash」,可以跳过(省 embedding 钱)。库内一致性:仍以 doc_id 为准做删除/覆盖;不把「全局 md5 列表」当成唯一真相,否则无法表达「同一条目多次修订」。
后续
跟随着项目实际遇到的问题,持续更新