一个面向开发、测试与运维的多智能体协作系统
多 Agent 协作 · 可观测数据 · 工程实践|架构解读,接口与配置以实际部署为准
一、能力全景:它能做什么?
核心能力:用一句人话描述你的故障或分析目标,系统自动完成「理解意图 → 调度合适的专家 → 查询各类数据源 → 输出带证据的结论」这一整条链路。
1.1 它能帮我们做哪些事?
| 能做什么 | 怎么做的 | 优先级 |
|---|---|---|
| Apdex 下降 / 性能退化根因分析 | 自动串联链路追踪 + 指标数据,定位是哪个服务、哪个接口、哪条 SQL 变慢了 | P0 核心能力 |
| 值班告警快速分析(RCA) | 收到告警后自动关联错误日志、异常 Trace、相关指标,给出可能根因和排查建议 | P0 核心能力 |
| 多源指标联合查询 | 同时对接 Prometheus 和 AWS CloudWatch,按需查询 CPU、内存、延迟、连接数等 | P0 核心能力 |
| Kubernetes 集群诊断 | 查看 Pod 状态、容器事件、重启原因、资源水位等(需要 K8s 环境支持) | P1 |
| MySQL 数据库分析 | 查看表结构、索引情况,结合链路中的慢查询定位缺索引或锁等待问题 | P1 |
| OpenSearch 索引健康度 | 检查日志/链路索引的体量分布、Top 服务、字段基数等 | P1 |
| 日志检索与告警解析 | 按服务名、TraceID、关键词搜索日志;解析告警内容并联动其他数据源 | P1 |
| IM / ChatOps 对接 | 通过 HTTP API 一问一答,可接入飞书、钉钉、Slack 等 IM 机器人或定时巡检任务 | P1 |
| Web UI 多轮对话 | 浏览器里直接聊天式交互,支持会话历史、标题自动生成 | P1 |
1.2 有哪些使用入口?
| 入口方式 | 适合什么场景 | 特点 |
|---|---|---|
| 命令行(CLI) | SRE 本地排障、脚本化批量查询 | 启动快、单次提问或交互模式,适合开发调试 |
| Web UI(HTTP 服务) | 日常使用、多人共享、产品化界面 | 长驻进程、流式输出、支持多轮对话与会话管理 |
| 无状态 HTTP API | IM 机器人、定时任务、工单系统回调 | 一问一答 JSON 格式,无需维护服务端会话状态 |
- CLI:
python main.py "分析过去30分钟 svc-a 的 Apdex 与错误率趋势" - API:
POST /api/v1/ask,Body 为{"query":"...", "thread_id":null} - UI:浏览器打开 Web 服务监听的地址与端口(由部署配置或环境变量指定),在对话框中直接输入问题
先看一张全局图,了解「谁指挥谁、数据从哪来」:
二、三种入口方式:同一套大脑,不同门铃
不管你从哪个入口进来,背后都是同一套「Supervisor + 专家 Agent」。区别只在于:有没有浏览器界面、要不要保存会话历史。
| 对比维度 | CLI 终端 | Web UI(HTTP 服务) | 无状态 API |
|---|---|---|---|
| 对话记忆 | 内存暂存(进程退出即丢失) | PostgreSQL 持久化,跨重启保留 | 无(每次独立) |
| 适用对象 | 开发者、SRE 排障 | 普通用户、日常使用 | 机器人、自动化流水线 |
| 输出格式 | 终端文本 | 流式富文本 + 会话列表 | JSON 结构化响应 |
| 会话管理 | 无 | 列表 / 创建 / 标题生成 / 删除 | 可选返回 thread_id 关联 |
三、技术栈一览
下面列出这套系统用到的关键技术选型——不需要背,了解大致方向即可。若你对「LangChain / LangGraph」完全陌生,建议先看下一小节再用表。
3.0 读表前先懂:LangChain、LangGraph、MCP 都是什么?
这些名字听起来像「框架全家桶」,可以先用生活里的比喻理解,再对照下表:
- LangChain:可以理解为一套搭 LLM 应用的积木库。它帮你把「接大模型、接工具、拼 Prompt、跑多步对话」这些重复劳动封装好,避免事事自己写 HTTP、自己解析返回。本系统中的主管、各位专家,本质上就是用这类库拼出来的「会调工具的对话代理」。
- LangGraph:是在 LangChain 生态里偏流程与状态的一层——把一次用户请求想成一张有向图:节点里做事(例如调用 Supervisor),边上决定下一步,并且能把多轮对话、checkpoint(检查点)存进数据库,服务重启还能接着聊。简单说:LangChain 偏「零件怎么拼」,LangGraph 偏「拼好的流水线怎么长期跑、怎么记会话」。表里写「LangChain + LangGraph」,就是指底层用 LangChain 建 Agent,部署形态上用 LangGraph 管编排与持久化(和「只在命令行跑一单」的用法侧重点不同)。
- MCP(Model Context Protocol):可以理解为给外部工具准备的「标准 USB 口」。Prometheus、Kubernetes、云监控等只要提供符合 MCP 的服务端,应用就能用同一套发现与调用方式去用这些工具,而不必为每个系统各写一套专用适配代码(具体仍要部署和配置 MCP Server)。
- CopilotKit 与 AG-UI:浏览器里聊天界面常用的一层——AG-UI约定流式事件(例如「正在推理」「正在调工具」),CopilotKit提供前端组件/适配,让页面像聊天产品一样逐字流出,而不是干等一整块 JSON 返回。
- ReAct:一种行为模式,不是单独产品——Reasoning(想一步)+ Acting(动一手,例如调工具),看结果再决定要不要继续,循环直到能回答用户。
| 层级 | 技术方案 | 在这套系统里的角色 |
|---|---|---|
| AI 编排框架 | LangChain + LangGraph | 构建多 Agent 协作流程(Supervisor 模式) |
| 工具协议 | MCP(Model Context Protocol) | 标准化连接 Prometheus / K8s / CloudWatch |
| 状态管理 | LangGraph Checkpoint | 多轮对话记忆(优先 PostgreSQL,可回退内存) |
| 配置管理 | Pydantic Settings | 从环境变量读取;本地开发可用 .env,生产敏感项建议由 AWS Secrets Manager 托管后再注入 |
| 可观测性 | Langfuse | 记录每次 Agent 决策和工具调用,方便事后复盘 |
| 链路数据源 | OpenSearch(原生 SDK 直连) | 分布式追踪、日志检索 |
| 指标数据源 | Prometheus / CloudWatch(经 MCP) | 时序指标查询 |
| 集群数据源 | Kubernetes API(经 MCP) | Pod / Event / 日志 |
| 数据库元数据 | MySQL(原生 SDK 直连) | 表结构、索引信息 |
| Web 服务 | FastAPI + CopilotKit(AG-UI) | 流式对话前端 + REST API 后端 |
四、核心架构展开:Supervisor 如何指挥专家
4.1 什么是 Supervisor 模式?
在多 Agent 架构里有几种主流的组织方式。这里采用的是 Supervisor(主管)模式——你可以把它类比成一个项目经理:
- 主管自己不干活——不直接查数据库、不写 PromQL、不调 K8s API
- 主管的职责只有三件事:听懂你的问题 → 决定叫哪位专家 → 把各位专家的答案汇总成报告
- 每位专家都是「独立的大脑 + 自己的工具箱」,互不干扰
为什么选这种模式?有三个关键优势:
- 上下文隔离:每个专家有自己的「人设」和工具集,不会互相污染思维窗口
- 防溢出:专家返回的结果超过长度上限时自动截断,不会撑爆主管的上下文
- 好扩展:新增一种专家 = 新增一个 Agent + 几个工具函数,主管的路由规则几乎不用改
4.2 Supervisor 的工作流程(ReAct 循环)
Supervisor 采用业界常见的 ReAct 模式(Reasoning + Acting):先推理再行动——模型先想「该派谁」,再真正去调专家工具,看到结果再决定要不要继续派别人。上面第三节里说的 LangChain,在这里就是支撑这种循环的常用运行时之一。下面用一张图把循环画清楚:
- 调用次数上限:防止死循环(比如专家A调专家B再调回A)
- 结果截断:单个专家回复超过约 8000 字符时自动精简
- 可观测性透传:Langfuse 追踪 ID 随请求向下传递,整条链路可在平台复现
五、六大专家 Agent 各司其职
目前系统内有六位专家 Agent。它们的关系可以这样理解:
5.1 链路专家的分层查询策略(设计精华)
这是整个系统中最值得讲的设计。核心理念:别一次性把所有数据塞给 AI,而是像剥洋葱一样一层层深入:
为什么要这样分层?因为 LLM 的「注意力窗口」(Context Window)是有限的。如果第一层就把几百条原始 Trace 全扔进去,不仅费 Token 还容易迷失重点。先看统计找到方向,再按需取样本,最后才拉详情——整个过程 Token 消耗可控且精准。
六、工具层:两种「武器」的区别
专家们手上的工具分为两大类,理解它们的区别很重要:
一句话区分:Native 工具是自己写的代码,想怎么处理数据就怎么处理;MCP 工具是别人提供的服务端点,只能按它的接口规范来调用。两者可以共存互补。
七、渐进式知识库:不是「查库」,是「翻手册」
7.1 用大白话理解 load_skill
很多人看到架构图里有个 load_skill,会以为它是某种数据库查询。不是的。它做的事情非常简单:
load_skill("http_latency") = 去技能目录里找到
http_latency.md这个文件,把里面的全文内容原样返回,塞进当前对话上下文。
为什么需要这个东西?因为如果直接把所有运维知识(PromQL 模板、K8s 排障步骤、告警类型说明……)全部写进 System Prompt,Token 窗口瞬间就爆了;但如果不写,AI 写出的查询又经常不靠谱。
所以采用三阶段渐进加载策略:
7.2 谁身上挂了哪些"手册"?
| 角色 | 能翻开的手册目录 | 什么时候用 |
|---|---|---|
| Supervisor 主管 | architecture/(组织架构、团队边界、平台说明) | 需要交代背景信息的时候 |
| MetricsAgent 指标专家 | promql/(各种指标的查询模板和约束) | 写 PromQL 查询之前 |
| KubernetesAgent K8s 专家 | kubernetes/(集群排查套路、注意事项) | 查 K8s 问题之前 |
| LogAgent 日志专家 | log/(告警类型说明、日志字段约定) | 解析告警或搜索日志之前 |
.md 文件,写好标题和正文,系统启动时会自动发现它。不需要改任何 Python 代码。这就是「知识库驱动」的好处——运营同学也能参与维护 AI 的「专业知识」。
八、Prompt 工程:每个 Agent 的「人设」
每个专家 Agent 都有一份自己的「人设文件」(System Prompt),里面规定了:
- 你是谁(角色定位)
- 你应该先调用哪个工具、后调用哪个(工作流约束)
- 输出应该是什么格式(结构化要求)
- 什么事情绝对不能做(禁止行为)
特别设计:时间补全规则
当用户只说了一个时间点(比如「10:00 出的问题」)而不是一个时间段时,Supervisor 会强制将其转换为 [T-10分钟, T+5分钟] 的时间区间再去查询。这避免了 AI 用模糊的「大约在那附近」去碰运气,保证查询结果的准确性。
九、配置与安全
9.1 配置从哪来?
系统采用环境变量优先、配置文件兜底的策略。应用侧只认「环境变量里有什么」,生产环境下敏感取值宜放在 AWS Secrets Manager(或你所在云上的等价密钥服务),由 CI/CD 或 Sidecar/CSI 等在运行时注入,避免进镜像与代码仓库。主要配置分组:
| 配置组 | 管什么 | 典型例子 |
|---|---|---|
| 大模型 | API 地址、鉴权信息、模型选择、温度、超时 | OPENAI_BASE_URL、OPENAI_API_KEY、MODEL_NAME |
| OpenSearch | 主机、端口、访问凭据/TLS | OPENSEARCH_HOST、OPENSEARCH_PORT、OPENSEARCH_USER |
| MCP 端点 | 各 MCP 是否启用、地址、认证 | MCP_PROMETHEUS_ENABLED=true、MCP_KUBERNETES_URL=... |
| 关系型数据库 | MySQL 元数据查询、PG 用于 checkpoint | MYSQL_HOST、DATABASE_URL(PostgreSQL 连接串) |
| 可观测性 | 是否启用 Langfuse 及连接信息 | LANGFUSE_ENABLED=true、LANGFUSE_SECRET_KEY |
9.2 安全:敏感信息脱敏
系统在日志输出前会对敏感子串做遮蔽或哈希处理——覆盖常见敏感字段名与模式。生产环境务必开启,避免凭据随排障日志外泄到采集系统或 IM。
十、部署架构:从 Docker 到 Kubernetes
典型的云原生部署路径:CI 构建 → 推送到镜像仓库 → 滚动发布到 K8s。
关键实践:
- 依赖层与业务层分离:Dockerfile 中先安装依赖再拷贝应用代码,利用缓存加速构建
- 密钥不入镜像:敏感项在生产环境建议统一进 AWS Secrets Manager(或等价密钥服务),由工作负载在运行时拉取或经同步机制映射为环境变量;禁止硬编码进代码或打进镜像。本地开发可用
.env等,勿提交版本库。 - MCP 端点可插拔:某个数据源暂时不需要?关掉对应的 MCP 启用开关即可,不影响其他功能
十一、可观测性:全链路追踪
如果开启了 Langfuse(在 Secrets Manager 或安全渠道配置好连接信息即可),可以看到一次完整的用户请求经过的所有环节:
🔭 一次 RCA 分析的全链路追踪示例
用户输入 → Supervisor 推理决策 → 调用 TraceExpert(工具: get_trace_error_summary ×1, get_trace_samples ×1)→ 调用 MetricsExpert(工具: execute_range_query ×2)→ 综合输出报告
↑ 每一步的 Token 消耗、耗时、中间结果都可在 Langfuse 平台查看,便于事后复盘和成本核算
十二、设计原则与演进路线
12.1 五大设计原则
| 原则 | 在系统中如何体现 |
|---|---|
| 减少上下文消耗 | 分层查询、结果截断、技能按需加载、聚合优先于原始数据 |
| 安全第一 | 日志脱敏、K8s 只读工具、凭据不进 Prompt、危险操作需人工确认 |
| 证据驱动 | 要求「不猜、用数据说话」,必须附带 TraceID / 指标名等证据 |
| 易扩展 | 新增 Agent = 加文件 + 注册工具;新技能 = 加 .md 文件;新 MCP = 配置地址 |
| 优雅降级 | 某路 MCP 不可用时尽量不影响其他功能;未启用 Prometheus 时不加载 PromQL 技能 |
12.2 演进路线图
从 Step 1 到 Step 2 的最大变化是引入 LangGraph StateGraph,带来几个关键能力提升:
- Human-in-the-loop:危险操作(如删除资源)前暂停等待人工确认
- Plan 模式:复杂 RCA 先制定计划再逐步执行,过程透明可控
- 持久化 Checkpoint:Postgres 存储,服务重启后对话不断
十三、实战演示:一次完整的 RCA 分析
让我们用一个具体的例子把前面所有组件串起来。假设你在值班时收到一条告警:"svc-a 在 prod 环境 Apdex 从 99% 骤降到 84%"。
十四、总结
这类多智能体可观测助手的核心价值可以用一句话概括:让 AI 的推理能力与可观测性工具链结合,关键在于「工具契约清晰、上下文可控、证据可追溯」。
| 🏗️ 多智能体协作 | Supervisor 模式让各专家各司其职,上下文隔离,Token 可控 |
| 🧅 分层查询 | 从宏观到微观逐层深入,避免上下文爆炸 |
| 📚 渐进式知识库 | Prompt 只列技能目录,正文按需加载,新技能只需加 .md 文件 |
| 🔗 MCP 标准化集成 | 通过统一协议接入 Prometheus/K8s/CloudWatch,工具可插拔可开关 |
| 🛡️ 生产级工程实践 | Pydantic 配置、日志脱敏、链路追踪、K8s 部署、CI/CD |
🎯 上线前建议:结合实际数据模型和安全边界做评审,持续审计 Prompt、工具权限和日志处理规则。先用内部数据跑通全链路,再逐步放开使用范围。
说明:本文为架构与实践解读,文中工具名、环境变量与部署路径仅供对照思路;以你方代码仓库与运行环境为准。
📜 版权声明
本文作者:王梓 | 原文链接:https://www.bthlt.com/note/369957528-Teg一个面向开发、测试与运维的多智能体协作系统
出处:葫芦的运维日志 | 转载请注明出处并保留原文链接


📜 留言板
留言提交后需管理员审核通过才会显示