最新n1n v2.0.1 正式上线!企业级大模型接口聚合平台 (LLM API Gateway),为您接入 500+ AI Models,价格低至 1 折, 立即尝试

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

作者
  • avatar
    姓名
    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聚合平台相结合时,始终保持活跃的成本异常警报至关重要。

经验总结

  1. OpenSearch无服务器版的最低成本是最大的意外。 在索引任何文档之前,2个OCU每月就需要350美元。
  2. 切块策略比模型选择更重要。 糟糕的文档分块会导致检索效果不佳,无论使用多么强大的总结模型。
  3. Bedrock知识库处理了80%的基础架构工作。 不要从头开始重新发明标准的摄入流水线。

行动清单检查表

  • 为文档创建S3存储桶
  • 部署包含加密、网络和访问策略的OpenSearch无服务器集合
  • 部署带有Titan Embed v2的Bedrock知识库
  • 配置Lambda查询处理程序和API Gateway
  • 设置CloudWatch仪表盘和告警

Get a free API key at n1n.ai