我在 Aurora 中的不同表中有一些数据,我想对其执行 RAG。 为此,我创建了一个微服务(Lambda),它可以生成不同表的嵌入并将该数据存储在 Aurora 中。但是矢量更新插入应该基于某些数据库流集合。 例如:如果有 5 个以上的数据库更新,那么我应该重新生成嵌入,并且应该有一个端点,我可以在其中发送用户 ID 以与后端同步数据(重新生成嵌入)。 我该怎么做。
我最初尝试使用 Faiss 和 dynamoDB,但问题是后端正在转移到 Aurora,而 Faiss 增加了延迟。
以下是使用 pgvector、Lambda 和 Aurora 构建近似最近邻搜索 (ANN) 服务的架构,该服务可以根据数据库更改进行扩展和重新索引。
架构:
- 数据源: 的 Aurora 数据库,包含需要生成嵌入的各种表。
- 更改数据捕获 (CDC): 为的用例捕获数据库更改的最有效方法是使用 Aurora 流。Aurora 流捕获对数据库所做的更改并将这些更改作为流记录提供。
-
流处理器(Lambda):
Lambda 函数订阅的 Aurora 流。
- 批处理更新: Lambda 函数会累积来自 Aurora 流的数据库更新。配置函数以在累积一定数量的更新(例如,的 5 个更新阈值)或经过一定时间后触发。
-
嵌入生成:
对于每个更新,Lambda 函数都会使用 Bedrock 生成嵌入。
- 从 Aurora 中检索更新的记录。
- 使用 Bedrock 生成嵌入向量。
- 将嵌入向量和相关元数据(例如,记录 ID、表名)存储在 Aurora 中的专用表中。可以使用 pgvector 扩展来有效地存储和查询这些向量。
- 向量存储(Aurora with pgvector): 使用 pgvector 扩展程序存储生成的嵌入。pgvector 使能够直接在 Aurora 中执行高效的相似性搜索。
-
同步端点(API Gateway + Lambda):
- 创建一个 API Gateway 端点,用户可以通过该端点发送其 ID 以同步其数据。
-
此端点将触发另一个 Lambda 函数,该函数将:
- 识别与用户 ID 关联的相关记录。
- 为这些记录生成新的嵌入(使用 Bedrock)。
- 更新 Aurora 中的向量存储,并使用新的嵌入。
工作流程:
- 对 Aurora 数据库表进行更改。
- Aurora 流会捕获这些更改并将其流式传输到 Lambda 函数。
- Lambda 函数会批处理更新。
- 一旦达到批处理条件(更新数量或时间),Lambda 函数就会使用 Bedrock 为每个更新的记录生成新的嵌入。
- 生成的嵌入和相关元数据存储在 Aurora 的向量存储中。
- 用户可以通过调用同步端点来请求同步其数据。
- 同步端点触发 Lambda 函数以使用更新后的信息重新生成并存储用户的嵌入。
优势:
- 可扩展性: Lambda 函数可以根据数据库更新量自动扩展。
- 成本效益: 只需在生成嵌入时为实际使用的计算资源付费。
- 实时更新: Aurora 流可确保在数据库更改时近乎实时地生成和存储新的嵌入。
- 高效的相似性搜索: pgvector 允许直接在 Aurora 中执行快速且可扩展的相似性搜索。
实现提示:
- 批处理优化: 尝试不同的批处理大小和时间间隔,以找到性能和新鲜度之间的最佳平衡点。
- 嵌入存储: 使用 pgvector 的索引功能来优化向量相似性搜索查询。
- 并发: 实现适当的并发控制机制,以处理可能同时更新向量存储的多个 Lambda 函数。
- 监控和日志记录: 实现监控和日志记录以跟踪性能并解决任何潜在问题。
通过遵循此架构,可以构建一个强大且可扩展的 ANN 服务,该服务可以随着的数据量的增长而增长,并且可以通过 Bedrock 和 Aurora 提供近乎实时的嵌入更新。
标签:python,amazon-web-services,aws-lambda,aws-aurora-serverless,amazon-bedrock From: 78805491