趋近智
对于大规模运行的检索增强生成系统,基础知识库的新鲜度不仅仅是“锦上添花”;它是回答质量和用户信任的基本决定因素。随着数据源的演变,新信息被添加,现有事实被更新,过时内容被移除,您的RAG系统必须及时反映这些变化。批量更新虽然实现起来更简单,但会引入明显延迟,导致基于陈旧或不完整信息的响应。变更数据捕获 (CDC) 为此提供了方案,使您的RAG系统能够准实时摄取和处理更新。
CDC 是一组软件设计模式,用于确定和追踪已更改的数据,以便可以利用这些更改的数据采取行动。CDC系统无需定期轮询整个数据集以检查修改,而是通常在底层监控源数据存储,捕获发生的单个更改事件(插入、更新、删除)。这种方法最大限度地减少了对源系统的影响,并允许下游消费者(例如您的RAG数据管道)以明显更低的延迟响应变化。
实施CDC有多种方法,每种方法都有其权衡。对于大规模、对性能敏感的RAG系统,基于日志的CDC通常是首选方法。
基于日志的CDC:大多数生产数据库维护事务日志(例如,PostgreSQL中的预写日志 (WAL)、MySQL中的二进制日志 (binlog) 或MongoDB中的oplog),用于复制、恢复和时间点还原。基于日志的CDC工具使用这些原生日志,非侵入性地读取已提交更改的流。此方法提供高保真度、对源数据库的开销低,并捕获所有更改,包括删除和模式修改。Debezium等工具在此方面很常见,为各种数据库提供连接器,可以将更改事件流式传输到Apache Kafka等平台。
基于触发器的CDC:这种技术涉及在您希望监控的表上创建数据库触发器(例如,AFTER INSERT、AFTER UPDATE、AFTER DELETE)。这些触发器执行自定义代码,通常将有关更改的信息(例如,新行、旧行、操作类型)写入一个单独的“影子”或“审计”表。独立进程随后轮询此审计表。虽然对于简单场景而言,这很直接,但触发器可能会对源数据库造成明显的性能开销,尤其是在高写入负载下,因为它们与原始DML语句在同一事务中执行。
基于查询的CDC(或基于时间戳的):此方法依赖于源表中的列,这些列指示行上次修改时间(例如,last_updated_timestamp)或单调递增的版本号。CDC进程定期查询源表,查找自上次检查以来已更改的行。此方法通常对源数据库模式影响最小,但有几个缺点:它无法可靠地捕获删除(除非使用软删除),如果轮询不频繁,可能会遗漏中间更新,并给源系统带来重复的查询负载。对于要求低延迟和高准确性的系统,基于查询的CDC通常不足。
考虑到分布式RAG的可伸缩性、可靠性和准实时更新需求,基于日志的CDC(通常与流平台结合使用)提供了最坚实的基础。
将CDC集成到您的RAG数据管道中,涉及多个组件共同作用,以将更改从源系统传播到您的向量数据库和文档存储。
在一个启用CDC的RAG更新管道中的数据流,从源数据库事务日志到向量数据库更新。
典型架构包括:
op: 'c'表示创建,op: 'u'表示更新,op: 'd'表示删除)。来自CDC管道的更改事件启动一系列操作,以更新您的RAG系统:
文档预处理:
c):从事件负载中获取新文档数据(如果未完全包含),并通过您的标准分块和元数据提取管道进行处理。u):RAG更新处理器必须确定更新的范围。如果一个小字段更改,它可能只影响一个块。如果文档的很大一部分被修改,则可能需要使多个现有块失效并生成新块。这通常需要检索完整文档,重新分块,然后与现有块进行比较,以在块级别识别修改、添加或删除。d):必须移除与已删除文档ID相关联的所有块和相应的嵌入。嵌入生成:
向量数据库更新:这是更改在检索组件中体现的地方。
辅助文档存储(如果适用):如果您的RAG系统单独存储块或文档的完整文本(例如,在S3存储桶、Elasticsearch或关系数据库中),以便稍后检索显示给用户或作为LLM的最终上下文,则此存储也必须与CDC事件同步更新。
为实时RAG更新实施CDC涉及处理多项复杂性:
通过周全地处理这些考量,您可以构建一个CDC管道,使您的大规模分布式RAG系统与数据源保持同步,确保其检索的信息和生成的回答尽可能地最新和准确。这种新鲜数据的持续流动,将静态知识库转换为动态、响应迅速的信息资源。
简洁的语法。内置调试功能。从第一天起就可投入生产。
为 ApX 背后的 AI 系统而构建
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造