如何在AWS Bedrock的CSV知识库中获取准确回答?
AWS Bedrock知识库RAG优化:CSV数据自然语言查询准确性问题
背景
正在开展一项概念验证(POC),目标是让业务开发人员通过自然语言查询客户数据库。采用AWS Bedrock知识库结合S3存储的CSV文件实现检索增强生成(RAG)方案——因无法直接访问数据库,排除了Redshift结构化数据存储知识库,选择上传CSV快照(约1万条记录、数十列,已匿名化PII数据)。但初次搭建后,模型频繁返回错误答案,影响用户信任,遂开展简化测试定位问题。
测试流程
- 上传模拟
myclients.csv至S3存储桶,数据如下:
Client ID,Client Registration Date,Total Purchases,Service Subscription Start Date,Service Subscription End Date,Support Contact Date,Priority Sales Flag 3556854361,2023-04-27,1065,2025-04-23,2027-04-30,,on 7356544614,2023-03-13,1845,2023-03-13,2024-03-31,2024-07-06,off 3929885536,2022-12-02,982,2022-12-02,2024-12-31,,on 8291623426,2022-12-02,2201,2025-02-21,2027-02-28,,off 6785192202,2022-03-10,1166,2024-03-08,2026-03-31,2025-01-16,off 2802241472,2022-01-11,822,2023-08-10,2025-08-31,,off
- 创建带向量存储的Bedrock知识库,数据源选择Amazon S3
- 指向目标S3 URI,采用Bedrock默认解析器,设置无分块
- 选用Amazon Titan Text Embeddings V2(按需)作为嵌入模型
- 新建Amazon OpenSearch Serverless向量存储
- 同步数据源,无警告信息
测试结果
- Cohere Command R查询「有多少客户?」:返回正确(6个)
- Cohere Command R+查询「有多少客户拥有活跃服务订阅?」(当前日期2025-04-24,实际应为4个):返回错误(5个)
- Cohere Command R+查询「有多少客户的服务订阅结束日期在2025年4月24日之后?」:返回错误(5个)
- Anthropic Claude 3 Sonnet查询同一日期问题:返回错误(3个)
- Anthropic Claude 3 Sonnet查询「最后一个服务订阅何时到期?」:返回正确(2027-04-30)
- Amazon Titan Text G1 - Premier查询「2023年注册客户的平均服务订阅时长(按开始到结束的天数计算)是多少?」:未给出正确结果,仅返回注册日期
优化建议
1. 调整CSV分块与解析策略
- 取消「无分块」设置:将整个CSV作为单一文档嵌入会导致检索无法精准定位单条记录,建议按单条记录分块,或按固定行数(如100条)分块,让每条记录的字段与值形成独立嵌入单元。
- 自定义解析提示:给解析器添加指令,要求将每条记录格式化为结构化文本(如
Client ID: 3556854361, Client Registration Date: 2023-04-27...),强化字段与值的对应关系,提升嵌入模型的理解精度。
2. 优化向量检索配置
- 调整检索返回数量:设置返回所有相关记录,避免计数、统计类查询因缺失数据导致错误计算。
- 加入前置过滤:在
RetrieveAndGenerate调用中,针对日期类查询利用Bedrock过滤功能提前筛选符合时间范围的记录,减少模型处理的数据量。
3. 强化Prompt工程
- 强制基于检索数据计算:在Prompt中明确指令,如「请严格基于检索到的所有客户记录统计,先列出符合条件的记录再计算数量/平均值」,避免模型脑补数据。
- 结构化引导复杂计算:针对时长统计类查询,设计分步式Prompt,如「第一步:筛选2023年注册的客户;第二步:计算每个客户的服务订阅时长(结束日期-开始日期的天数);第三步:求平均值」,引导模型按逻辑执行。
4. 适配结构化数据的模型选择
- 优先选用结构化推理能力强的模型:如Cohere Command R+,并将温度参数设为0,减少随机性;尝试Amazon Titan Text G1 - Express(针对结构化数据优化)或Claude 3 Opus(强推理能力)处理复杂统计查询。
5. 验证嵌入与检索准确性
- 单独测试检索结果:调用
Retrieve接口查看返回文档是否包含所有符合条件的记录(如日期查询应返回4条正确记录),若检索结果缺失,需调整分块或嵌入模型。 - 切换嵌入模型:尝试Cohere Embed English V3,验证是否能提升结构化数据的检索精准度。
6. 预处理结构化数据
- 转换为JSON Lines格式:将CSV转为每条记录对应一个JSON对象的格式,Bedrock解析器对JSON结构的处理更友好,能更好保留字段关系。
- 预计算衍生字段:在CSV中提前计算「服务订阅时长(天数)」等字段,避免模型生成阶段因日期计算出错。
内容的提问来源于stack exchange,提问作者dave thompson
相关产品推荐
相关产品推荐

