从 .NET 代码到可搜索架构图:用 Amazon Bedrock AgentCore 构建自动化文档流水线

2026-09-03 37 预计阅读时间: 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.

预计阅读时间:12 分钟

架构文档最容易在代码变更之后失效。全球银行间经纪商面对的是规模较大的 .NET 代码库、多个团队和持续交付流程,手工维护系统上下文、组件关系和设计说明很快就会变成负担。

一种更可持续的做法,是把架构文档当成软件交付产物:从代码仓库读取事实,用 Amazon Bedrock AgentCore 承载分析代理,生成架构图和说明文档,再通过 Amazon Bedrock Knowledge Bases 建立可搜索入口,并由 AWS CodePipeline 触发更新。

把文档更新放进交付链路

这类方案的关键不只是让大模型“画一张图”,而是把代码、分析结果、文档和索引串成一个可重复执行的流程:

  1. 代码提交触发 AWS CodePipeline。
  2. 构建任务扫描 .NET 项目、配置文件和基础设施描述。
  3. AgentCore 中的代理根据扫描结果识别服务、依赖、入口、数据访问和外部集成。
  4. 代理输出结构化架构事实,以及 Mermaid 或其他格式的图表定义。
  5. 生成的 Markdown、JSON 和图表文件写入文档目录或对象存储。
  6. Knowledge Bases 对新的文档执行摄取,让工程师可以用自然语言检索架构信息。

这里有一个重要边界:模型应该负责归纳和解释,代码扫描器应该负责提供可验证的事实。不要把整个仓库直接丢给模型并期待它永远正确。项目文件、命名空间、依赖声明和调用关系应尽量先转换为结构化输入,再交给代理分析。

AgentCore 适合放在哪里

AgentCore 可以作为架构分析代理的运行环境。代理可以接收代码清单、依赖图、配置摘要和历史文档,然后执行几个相对清晰的任务:

  • 识别应用边界,例如 Web API、后台任务、消息消费者和共享类库。
  • 归纳组件之间的调用、发布订阅或数据访问关系。
  • 标记外部系统,例如数据库、消息队列、身份服务和第三方 API。
  • 生成架构决策记录、上下文说明和变更摘要。
  • 输出适合渲染的 Mermaid 图表,而不是只返回一段难以验证的自然语言。

代理提示词可以要求输出固定 JSON 结构,例如 servicesdependenciesexternal_systemsevidence。其中 evidence 用来记录结论来自哪个文件或项目,方便审查人员回到源代码核对。

一个可实践的提示词骨架如下:

你是架构分析代理。请根据输入的 .NET 项目清单和依赖事实生成架构文档。

约束:
1. 只能把输入中存在的类型、项目和依赖声明作为事实。
2. 不确定的关系放入 unknown_relations,不要猜测。
3. 每个服务和依赖都必须包含 evidence 文件路径。
4. 输出合法 JSON,不要输出 Markdown 围栏。

输出结构:
{
  "services": [],
  "dependencies": [],
  "external_systems": [],
  "unknown_relations": [],
  "mermaid": "..."
}

先提取事实,再生成图表

下面的脚本是一个最小可运行示例。它扫描当前目录下的 .csproj 文件,提取项目名称、目标框架和项目引用,生成 architecture-inventory.json。这不是完整的 C# 语义分析器,但足以作为 CodeBuild 阶段的起点,也能作为 AgentCore 代理的结构化输入。

运行前请把脚本放在 .NET 仓库根目录下,并确认 Python 3.9 或更高版本可用:

#!/usr/bin/env python3
import json
import sys
from pathlib import Path
import xml.etree.ElementTree as ET


def text_without_namespace(element, tag):
    for child in element.iter():
        if child.tag.rsplit("}", 1)[-1] == tag:
            return child.text or ""
    return ""


def scan_project(path: Path):
    root = ET.parse(path).getroot()
    project_name = path.stem
    target_frameworks = []
    references = []

    for child in root.iter():
        tag = child.tag.rsplit("}", 1)[-1]
        if tag in {"TargetFramework", "TargetFrameworks"} and child.text:
            target_frameworks.extend(
                value.strip() for value in child.text.split(";") if value.strip()
            )
        elif tag == "ProjectReference":
            include = child.attrib.get("Include")
            if include:
                references.append(str((path.parent / include).resolve()))

    return {
        "name": project_name,
        "path": str(path),
        "target_frameworks": target_frameworks,
        "project_references": sorted(references),
    }


def main():
    root = Path(sys.argv[1] if len(sys.argv) > 1 else ".").resolve()
    projects = [scan_project(path) for path in sorted(root.rglob("*.csproj"))]
    result = {"repository": root.name, "projects": projects}
    output = root / "architecture-inventory.json"
    output.write_text(json.dumps(result, indent=2), encoding="utf-8")
    print(f"wrote {output} with {len(projects)} projects")


if __name__ == "__main__":
    main()

生成的 JSON 可以继续交给 AgentCore 代理。代理输出的 Mermaid 内容则可以存成 docs/architecture.mmd,例如:

flowchart LR
    Web[Trading Web API] --> Core[Brokerage Core]
    Worker[Settlement Worker] --> Core
    Core --> DB[(Relational Database)]
    Core --> Bus[Message Broker]
    Bus --> Worker

生产环境中还可以加入 Roslyn 分析、依赖包解析、ASP.NET 路由提取和数据库访问识别。不过每增加一种分析能力,都应该同时增加证据字段和测试样例,避免图表看起来完整却无法追溯。

用 CodePipeline 触发生成和索引

可以把构建任务拆成三个阶段:分析、文档生成、发布与索引。下面是一个可改造的 buildspec.yml 示例。AgentCore 调用方式和 Knowledge Bases 的资源标识取决于具体部署方式,因此示例通过环境变量保留这些配置,并明确标记了需要替换的命令。

version: 0.2

phases:
  install:
    runtime-versions:
      python: 3.11
  build:
    commands:
      - python scripts/scan_dotnet.py .
      - mkdir -p generated-docs
      - cp architecture-inventory.json generated-docs/
      - python scripts/invoke_architecture_agent.py architecture-inventory.json generated-docs/architecture.md
      - test -s generated-docs/architecture.md
  post_build:
    commands:
      - aws s3 sync generated-docs/ "s3://${DOCS_BUCKET}/architecture/" --delete
      - >-
        aws bedrock-agent start-ingestion-job
        --knowledge-base-id "${KNOWLEDGE_BASE_ID}"
        --data-source-id "${DATA_SOURCE_ID}"
        --region "${AWS_REGION}"
artifacts:
  files:
    - generated-docs/**/*

部署时需要重点处理以下配置:

  • DOCS_BUCKET 指向文档源数据存储位置,并限制写入权限。
  • KNOWLEDGE_BASE_IDDATA_SOURCE_ID 指向已经配置好的 Knowledge Bases 数据源。
  • CodeBuild 或 AgentCore 执行角色只授予读取代码、写入指定前缀和启动摄取任务所需的权限。
  • 文档生成失败时让构建失败,避免把半成品索引成正式架构信息。
  • 对生成结果进行格式校验,例如检查 JSON Schema、Mermaid 语法和必需的证据字段。

invoke_architecture_agent.py 可以实现为调用团队已经部署的 AgentCore 入口。调用协议取决于所使用的 AgentCore 运行方式,推荐让它接收一个小型 JSON 文档,并返回同样可校验的结构化结果,而不是直接处理整个 Git 工作区。

搜索体验取决于文档结构

把 Markdown 上传到 Knowledge Bases 并不等于自动得到好的架构搜索。文档需要具有稳定的标题、清晰的实体名称和足够的上下文。可以为每个服务生成一份独立文档,至少包含:

  • 服务职责和不负责的范围。
  • 入口,例如 HTTP 路由、消息主题或定时任务。
  • 上游、下游和外部系统。
  • 数据存储及访问方式。
  • 最近一次生成时间和代码版本。
  • 每个关键结论对应的文件路径和行号范围。

这样,工程师询问“结算任务由哪个服务消费消息”时,检索结果不只是返回一张图片,而是返回服务说明、消息关系和源代码证据。架构图适合快速建立全局视野,文本证据适合排查和审计,两者需要同时保留。

还要注意文档版本和权限问题。代码库可能包含内部系统名称、数据库表名或敏感配置线索。进入 Knowledge Bases 的内容应先经过密钥过滤、敏感信息检测和访问控制,不能因为文档生成自动化就跳过原有的数据治理流程。

落地时检查这几件事

这类自动化管道的价值在于持续更新,而不是一次性生成一套漂亮图片。落地前可以检查:

  • 代码事实是否与模型推断分开保存?
  • 每条架构结论是否能追溯到仓库文件?
  • 生成失败是否会阻止错误文档发布?
  • CodePipeline 是否覆盖主干和需要文档更新的分支策略?
  • Knowledge Bases 是否有明确的数据源、权限和删除策略?
  • 文档是否同时服务于架构师、开发者和运维人员?
  • 是否为常见项目类型准备了回归样例,例如 API、Worker、类库和消息消费者?

采用 Amazon Bedrock AgentCore 的合理切入点,是先选择一个边界清楚的 .NET 系统,建立“扫描事实、生成文档、审查差异、更新索引”的闭环,再逐步扩大代码覆盖范围。模型可以显著减少整理和解释成本,但最终的架构可信度仍来自可验证的代码证据、稳定的流水线和明确的人工审查边界。


相关推荐