用 CloudFormation 构建可观测的企业级 Agentic Retrieval

2026-09-01 41 预计阅读时间: 1 分钟
来源: aws.amazon.com AI 摘要 Original link

Disclaimer: This article is an AI-assisted summary. Read it together with the original source when precision matters. The summary may omit context, version differences, or edge cases and is not official documentation.

预计阅读时间:13 分钟

企业知识库问答真正进入生产环境后,难点通常不在“能不能检索到文档”,而在于能否回答这些问题:请求被路由到了哪个知识库?检索用了什么过滤条件?最终答案引用了哪些来源?一次失败发生在 Agent、检索、模型还是基础设施?系统上线后,答案质量又如何持续评估?

这套方案围绕 Amazon Bedrock Managed Knowledge Base 与 Amazon Bedrock AgentCore 构建一个企业级 agentic retrieval 系统。Agent 负责理解问题、选择知识库并组织答案,系统同时提供引用信息、分层可观测性,以及按需和持续评估能力。所有组件通过一条 AWS CloudFormation 部署链交付,适合需要重复部署、审计和环境隔离的团队。

从单一检索升级为智能路由

传统 RAG 往往只有一条固定链路:接收问题、查询一个知识库、把结果交给模型生成答案。当企业知识分散在员工手册、产品文档、合同、工单和运维记录中时,单一知识库会带来两个问题:检索范围过大,或者不同类型文档之间缺少清晰边界。

Agentic retrieval 把“选择检索路径”交给 Agent。一个问题可能被路由到 HR 知识库、产品知识库或运维知识库;复杂问题也可以拆解后访问多个知识库,再合并结果。路由过程至少需要明确以下约束:

  • 每个知识库有清晰的用途、描述和访问边界。
  • Agent 必须知道何时只查询一个知识库,何时需要跨库查询。
  • 返回答案必须携带可追溯的引用,而不是只输出一段看似合理的文本。
  • 无法找到证据时,应明确返回“不确定”或要求补充信息。

这里的核心不是让 Agent 自由发挥,而是把路由决策变成可观察、可评估的执行步骤。每次调用都应记录问题、路由目标、检索结果摘要、模型响应和引用信息,同时避免把敏感原文无控制地写入日志。

七层可观测性如何落地

来源方案强调七层可观测性。实际落地时,可以把它拆成从请求入口到质量评估的完整链路:

  1. 请求层:记录请求 ID、租户、调用方、区域和时间。
  2. Agent 决策层:记录 Agent 选择的知识库、工具调用、重试和终止原因。
  3. 检索层:记录查询文本、过滤条件、召回数量、相关性分数或排序结果摘要。
  4. 模型层:记录模型调用耗时、输入输出 token、错误类型和延迟分布。
  5. 引用层:记录答案中的引用是否来自实际检索结果,以及引用覆盖了哪些关键结论。
  6. 基础设施层:观察 Lambda、AgentCore、CloudFormation、权限和依赖服务的健康状态。
  7. 评估层:记录事实性、相关性、引用完整性、拒答质量和端到端延迟等指标。

这七层不等于“所有数据都写进一张日志表”。生产系统应区分指标、日志和追踪:延迟与错误率适合指标;路由决策和引用映射适合结构化日志;一次用户请求跨越多个服务时,使用统一 trace ID 连接调用链。原始文档内容和用户输入可能包含个人信息或商业机密,必须通过脱敏、访问控制、保留周期和加密策略限制暴露面。

CloudFormation 让部署链可重复

知识库、数据源、Agent、权限、监控和评估资源通常分属不同生命周期。将它们拆成嵌套堆栈或串联堆栈,可以让每个阶段拥有清晰的输入输出:

基础设施堆栈
  -> IAM 与加密配置
  -> Knowledge Base 与 Data Source
  -> AgentCore 运行时与路由配置
  -> 观测、告警与评估资源

下面是一个可以改造成实际项目入口的 CloudFormation 根模板。示例中的子模板路径、资源参数和 AgentCore 资源类型需要替换成团队实际维护的模板;根模板本身展示的是部署顺序和参数传递方式。

AWSTemplateFormatVersion: '2010-09-09'
Description: Enterprise agentic retrieval deployment chain

Parameters:
  Environment:
    Type: String
    AllowedValues: [dev, staging, prod]
  DataBucketName:
    Type: String
  KmsKeyArn:
    Type: String
  ModelId:
    Type: String
    Default: anthropic.claude-3-5-sonnet-20240620-v1:0

Resources:
  Foundation:
    Type: AWS::CloudFormation::Stack
    Properties:
      TemplateURL: https://example-bucket.s3.amazonaws.com/templates/foundation.yaml
      Parameters:
        Environment: !Ref Environment
        KmsKeyArn: !Ref KmsKeyArn

  KnowledgeBases:
    Type: AWS::CloudFormation::Stack
    DependsOn: Foundation
    Properties:
      TemplateURL: https://example-bucket.s3.amazonaws.com/templates/knowledge-bases.yaml
      Parameters:
        Environment: !Ref Environment
        DataBucketName: !Ref DataBucketName
        KmsKeyArn: !Ref KmsKeyArn

  AgentRuntime:
    Type: AWS::CloudFormation::Stack
    DependsOn: KnowledgeBases
    Properties:
      TemplateURL: https://example-bucket.s3.amazonaws.com/templates/agent-runtime.yaml
      Parameters:
        Environment: !Ref Environment
        ModelId: !Ref ModelId
        KnowledgeBaseIds: !GetAtt KnowledgeBases.Outputs.KnowledgeBaseIds

  Observability:
    Type: AWS::CloudFormation::Stack
    DependsOn: AgentRuntime
    Properties:
      TemplateURL: https://example-bucket.s3.amazonaws.com/templates/observability.yaml
      Parameters:
        Environment: !Ref Environment
        AgentEndpoint: !GetAtt AgentRuntime.Outputs.AgentEndpoint

Outputs:
  AgentEndpoint:
    Value: !GetAtt AgentRuntime.Outputs.AgentEndpoint
  KnowledgeBaseIds:
    Value: !GetAtt KnowledgeBases.Outputs.KnowledgeBaseIds

部署前,先将子模板上传到版本化的 S3 前缀,并确保 CloudFormation 执行角色拥有创建相关 Bedrock、IAM、日志和评估资源的权限。部署命令可以这样执行:

aws cloudformation deploy \
  --template-file root.yaml \
  --stack-name enterprise-agentic-retrieval-dev \
  --parameter-overrides \
    Environment=dev \
    DataBucketName=company-kb-dev \
    KmsKeyArn=arn:aws:kms:us-east-1:123456789012:key/REPLACE_ME \
    ModelId=anthropic.claude-3-5-sonnet-20240620-v1:0 \
  --capabilities CAPABILITY_NAMED_IAM \
  --region us-east-1

实际模板中应把资源的输出显式传递给下一层,避免通过命名约定或人工复制 ID。生产环境还应固定模板版本、启用变更集,并将数据源同步和索引构建纳入可追踪的发布流程。

让答案带着证据返回

Agent 的系统提示词可以明确路由和引用协议。下面是一段可作为起点的提示词示例,具体工具名称和输入格式需要根据 AgentCore 的运行时契约调整:

你是企业知识助手。

路由规则:
- HR、假期、福利和员工政策问题只查询 HR_KB。
- 产品配置、API 和功能问题只查询 PRODUCT_KB。
- 事故、告警、部署和故障排查问题只查询 OPS_KB。
- 如果一个问题跨越多个领域,先拆分问题,再按需查询多个知识库。

回答规则:
- 只使用检索结果中的事实,不要补写没有证据的细节。
- 每个关键结论后附引用,引用必须指向实际返回的文档和片段。
- 没有足够证据时,明确说明无法确认,并列出需要补充的信息。
- 不要输出检索结果中的访问令牌、个人信息或内部凭据。

可以用一个最小的 Python 客户端验证端到端响应。这里假设运行时提供一个 HTTPS Agent endpoint,并返回 answercitationstrace_id 字段;字段名若不同,应按实际 API 契约修改。

import os
import requests

endpoint = os.environ["AGENT_ENDPOINT"]
token = os.environ["AGENT_TOKEN"]
question = "生产环境 API 返回 5xx 时,应该查看哪些指标?"

response = requests.post(
    endpoint,
    headers={
        "Authorization": f"Bearer {token}",
        "Content-Type": "application/json",
    },
    json={"input": question, "tenant_id": "demo"},
    timeout=60,
)
response.raise_for_status()
result = response.json()

print("trace:", result.get("trace_id"))
print("answer:", result.get("answer"))
for citation in result.get("citations", []):
    print("-", citation.get("title"), citation.get("location"))

验证时不要只检查 HTTP 200。至少应测试错误路由、跨库问题、无结果问题、权限隔离、引用缺失和模型超时。对相同测试集运行多次,还要观察路由是否稳定、引用是否变化过大,以及答案质量是否随着知识库更新而退化。

按需评估与持续评估

按需评估适合发布前和重大配置变更后执行:固定一组带参考答案和参考来源的问题,比较不同路由提示词、切分策略、嵌入模型或生成模型的结果。持续评估则适合在系统运行期间采样真实请求,监控质量趋势和异常变化。

建议把评估结果至少分成四类:

  • 检索质量:相关文档是否被召回,噪声文档是否过多。
  • 生成质量:答案是否完整、准确、符合问题范围。
  • 引用质量:引用是否存在、是否支持对应结论、是否覆盖关键事实。
  • 运行质量:端到端延迟、失败率、成本和重试次数。

持续评估不应把用户反馈简单等同于事实标签。可以组合人工抽检、规则检查、模型评审和业务指标,并保留评估数据集版本。这样才能区分“检索没有找到证据”和“模型找到了证据但生成错误”这两类完全不同的问题。

上线前检查清单

  • 每个知识库都有明确的领域描述、数据所有者和访问策略。
  • CloudFormation 堆栈之间通过 Outputs 传递资源 ID,部署可以重复执行。
  • Agent 路由、工具调用、检索和模型调用拥有统一 trace ID。
  • 日志经过脱敏,原始文档和用户输入受到最小权限与保留策略保护。
  • 答案引用可回溯到真实文档位置,而不是由模型自由生成。
  • 同时准备发布前的按需评估和上线后的持续评估。
  • 为无证据、跨租户访问、依赖超时和权限拒绝设计明确的失败行为。

Managed Knowledge Base 降低了知识检索基础设施的维护负担,AgentCore 则为路由和执行提供了更灵活的编排空间。真正决定企业方案能否长期运行的,是资源可重复部署、决策可解释、答案可引用、质量可量化。把这些能力从演示阶段就纳入 CloudFormation 和观测体系,后续扩展知识库和模型时,系统才不会重新变成一条难以排查的黑盒链路。


相关推荐