在AWS上构建生产级RAG流水线:Bedrock知识库、OpenSearch无服务器版与Terraform
- 作者

- 姓名
- Nino
- 职业
- Senior Tech Editor
每个工程团队都面临着同样的痛点。新员工入职后询问:部署流水线是如何处理数据库迁移的?答案其实存在——但被埋没在2023年的Confluence页面、去年4月的Slack讨论串以及只有三个人记得阅读的事故复盘中。没有人能找到它。于是这个问题被一遍又一遍地提出。
为了彻底解决这个问题,我在AWS上构建了一个生产级的RAG(检索增强生成)流水线。这不是Jupyter笔记本里的演示,也不是简单的API调用教程,而是一个真正的生产系统:包含来自S3的文档摄入、通过Amazon Titan生成的向量嵌入、OpenSearch无服务器版的检索、通过Bedrock的Claude 3.5 Sonnet进行生成、API Gateway背后的Lambda查询API,以及贯穿整个技术栈的CloudWatch可观测性。全部使用Terraform部署,实现零控制台点击。
最终目标是:任何工程师都可以通过自然语言向API端点(或接入的Slack机器人)提问,并获得附带源文档引用的准确答案。
+------------------------------------------------------------------+
| PRODUCTION RAG PIPELINE |
+----------------------------------+-------------------------------+
| Metric | Value |
+----------------------------------+-------------------------------+
| Documents indexed | 2,400+ (Confluence, runbooks, |
| | post-mortems, ADRs) |
| Avg query latency (p50) | 1.8 seconds |
| Avg query latency (p99) | 4.2 seconds |
| Monthly AWS cost | ~$380 (at ~500 queries/day) |
| Embedding model | Amazon Titan Text Embed v2 |
| Generation model | Claude 3.5 Sonnet via Bedrock |
| Infrastructure | 100% Terraform, zero console |
+----------------------------------+-------------------------------+
为什么选择RAG而不是微调
在编写任何Terraform代码之前,我必须回答第一个核心问题:为什么选择RAG而不是针对内部文档对模型进行微调?
| 因素 | RAG方案 | 微调方案 |
|---|---|---|
| 数据时效性 | 实时更新(重新摄入) | 陈旧(依赖重新训练周期) |
| 引用支持 | 原生支持(直达源文档) | 无原生支持 |
| 更新成本 | 接近0美元(S3同步) | 数百至数千美元/次训练 |
| 幻觉控制 | 根植于源头数据 | 无法完全保证 |
| 设置复杂度 | 中等 | 高 |
| 延迟 | 较高(约2秒) | 较低(约500毫秒) |
| 领域特定语言 | 依赖检索效果 | 强关联 |
| 数据隐私 | 数据保留在VPC内部 | 需发送至训练API |
当文档频繁变化时,RAG是最佳选择。内部操作手册、架构决策记录和事故复盘每周都在更新。微调意味着每次文档更改时都要重新训练,而RAG只需要把新文件丢进S3即可。同时,通过像 n1n.ai 这样先进的LLM聚合服务,您可以轻松调度多模型组合,确保系统的稳定与高效。
架构总览
+-----------------------------------------------------------------------------+
| PRODUCTION RAG PIPELINE |
| |
| +----------+ +-----------------+ +--------------+ |
| | | | Bedrock Data | | Amazon | |
| | S3 |--->| Source |--->| Titan | |
| | (docs) | | (chunking) | | Embed v2 | |
| +----------+ +-----------------+ +------+-------+ |
| | |
| v |
| +--------------------+ |
| | OpenSearch | |
| | Serverless | |
| | (vector store) | |
| +------+-------------+ |
| | |
| +----------+ +-----------------+ | |
| | API | | Lambda | | |
| | Gateway |--->| (query API) |---> Bedrock KB ---> Claude 3.5 |
| +----------+ +-----------------+ (retrieve + Sonnet |
| generate) (answer) |
| |
| +-------------------------------------------------------------+ |
| | CloudWatch: latency, tokens, errors, cost anomaly alarms | |
| +-------------------------------------------------------------+ |
+-----------------------------------------------------------------------------+
为什么选择OpenSearch无服务器版而不是其他替代方案?
- Pinecone:产品优秀,但增加了第三方依赖和出口流量成本。Bedrock知识库原生集成AOSS,无需编写自定义检索代码。
- pgvector (Aurora/RDS):适合小型数据集。但在规模扩大时落后——没有内置的ANN索引调优,并且你需要为完整的数据库实例付费。
- OpenSearch Serverless:原生Bedrock集成、托管扩展,无需维护集群。虽然最低成本有些令人肉痛(2个OCU每月约350美元),但你用金钱换取了极低的运维负担。
组件成本明细
- OpenSearch无服务器版 (2个OCU):约350美元
- Bedrock - Titan Embed v2:约4美元(摄入阶段)
- Bedrock - Claude 3.5 Sonnet:约18美元(每天约500次查询)
- Lambda:约2美元
- API Gateway:约2美元
- S3(文档存储):小于1美元
- CloudWatch:约3美元
- 总计:约380美元/月
是的,OpenSearch无服务器版占了总账单的92%。当您通过 n1n.ai 接入各类优化模型时,可以进一步实现更灵活的成本分摊和多供应商架构设计。
配置OpenSearch无服务器集合
用于向量搜索的OpenSearch无服务器版需要三项核心配置:加密策略、网络策略和数据访问策略。缺少任何一个,集合都将无法创建。
resource "aws_opensearchserverless_security_policy" "encryption" {
name = "rag-kb-encryption"
type = "encryption"
policy = jsonencode({
Rules = [
{
Resource = ["collection/rag-knowledge-base"]
ResourceType = "collection"
}
]
AWSOwnedKey = true
})
}
resource "aws_opensearchserverless_security_policy" "network" {
name = "rag-kb-network"
type = "network"
policy = jsonencode([
{
Rules = [
{
Resource = ["collection/rag-knowledge-base"]
ResourceType = "collection"
},
{
Resource = ["collection/rag-knowledge-base"]
ResourceType = "dashboard"
}
]
AllowFromPublic = true
}
])
}
resource "aws_opensearchserverless_collection" "kb" {
name = "rag-knowledge-base"
description = "Vector store for RAG knowledge base"
type = "VECTORSEARCH"
depends_on = [
aws_opensearchserverless_security_policy.encryption,
aws_opensearchserverless_security_policy.network,
]
}
Bedrock知识库配置
知识库将所有组件有机结合:它连接了S3(文档源)、嵌入模型(Titan)以及向量存储(OpenSearch无服务器版)。
resource "aws_bedrockagent_knowledge_base" "main" {
name = "internal-knowledge-base"
role_arn = aws_iam_role.bedrock_kb.arn
knowledge_base_configuration {
type = "VECTOR"
vector_knowledge_base_configuration {
embedding_model_arn = "arn:aws:bedrock:us-east-1::foundation-model/amazon.titan-embed-text-v2:0"
}
}
storage_configuration {
type = "OPENSEARCH_SERVERLESS"
opensearch_serverless_configuration {
collection_arn = aws_opensearchserverless_collection.kb.arn
vector_index_name = "bedrock-knowledge-base-default-index"
field_mapping {
vector_field = "bedrock-knowledge-base-default-vector"
text_field = "AMAZON_BEDROCK_TEXT_CHUNK"
metadata_field = "AMAZON_BEDROCK_METADATA"
}
}
}
}
使用Lambda构建查询API
查询层是API Gateway背后的一个Lambda函数。它接收自然语言问题,调用Bedrock的RetrieveAndGenerate API,并返回带引用的结构化响应。
import json
import os
import logging
import boto3
logger = logging.getLogger()
logger.setLevel(logging.INFO)
bedrock_agent = boto3.client("bedrock-agent-runtime")
KNOWLEDGE_BASE_ID = os.environ["KNOWLEDGE_BASE_ID"]
def handler(event, context):
body = json.loads(event.get("body", "{}"))
question = body.get("question", "").strip()
result = bedrock_agent.retrieve_and_generate(
input={"text": question},
retrieveAndGenerateConfiguration={
"type": "KNOWLEDGE_BASE",
"knowledgeBaseConfiguration": {
"knowledgeBaseId": KNOWLEDGE_BASE_ID,
"modelArn": "arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-3-5-sonnet-20241022-v2:0"
}
}
}
return {
"statusCode": 200,
"body": json.dumps({"answer": result["output"]["text"]})
}
可观测性与成本控制
通过配置CloudWatch仪表盘和指标告警,您可以及时发现Token消耗激增和延迟回归。当把企业级工作负载与像 n1n.ai 这样强大的API聚合平台相结合时,始终保持活跃的成本异常警报至关重要。
经验总结
- OpenSearch无服务器版的最低成本是最大的意外。 在索引任何文档之前,2个OCU每月就需要350美元。
- 切块策略比模型选择更重要。 糟糕的文档分块会导致检索效果不佳,无论使用多么强大的总结模型。
- Bedrock知识库处理了80%的基础架构工作。 不要从头开始重新发明标准的摄入流水线。
行动清单检查表
- 为文档创建S3存储桶
- 部署包含加密、网络和访问策略的OpenSearch无服务器集合
- 部署带有Titan Embed v2的Bedrock知识库
- 配置Lambda查询处理程序和API Gateway
- 设置CloudWatch仪表盘和告警
Get a free API key at n1n.ai