engineering whiteprint / tech sharing

从诊断工具到
可协作 Agent

MQTT 智能诊断平台的使用、架构与 Agent 开发经验

00 / route map

目录

01 使用演示

完整流程演示 / 知识沉淀

02 整体架构

架构总览 / Agent 拓扑 / 多 Agent 排查 / 数据源与工具层 / 前端可观测性

03 设计经验

有效上下文 / 工具设计 / 确定性输出 / 评估与进化路径

01 / demo / full flow

完整流程演示:
从错误前提出发,收敛到可验证结论

raw user input

帮我诊断这个集群 mqtt-a822z7oq 下的客户端 LE4LG4GB1RZ020010,为什么 3 月 12 日 服务端没有给客户端发送 keep alive response,导致客户端掉线

01输入适配

把“服务端没回 keep alive”视为待验证假设,而不是直接采信。

02上下文补全

Triage 解析时间,发现短 clientId,要求确认完整 ID。

03证据调度

先查相似历史,再让 LogAgent 验证当前日志;单客户端问题不把 Metrics 当主证据。

04诊断结论

不是服务端漏发 PINGRESP,而是客户端停止 PINGREQ;服务端按 90s 阈值触发超时。

02 / demo / knowledge sedimentation

知识沉淀:
Good Case 复用经验,Bad Case 指导优化

德赛西威上下行消息数不符合业务预期 Conversation Summary v1 Instance Diagnosis ~1.1M tokens
good case / 复用经验

75 个 topic filter -> Too many incoming subscriptions

整批订阅被拒绝;后续同类问题可直接复用排查路径和业务建议。

  • wildcard 合并订阅
  • 拆批订阅
  • 提高 maxSubscriptionPerSession
  • 监控 SUBACK 失败码
bad case / 反面教材

用户给错 clientId:im_client_19

真实日志客户端是 sim_client_19;“查不到”不能直接变成结论。

  • topic/time 明确时要反查真实 client
  • 订阅拒绝不能直接归因 ACL
  • 错误路径要沉淀成下一版约束
diagnosis reportfeedbackstructured summarysearch / reuse / improve

03 / architecture / overview

整体架构:
多智能体协同 + 多数据源整合

Presentation

React / Chat UI / Sidebar / Charts / Feedback

Application

FastAPI /agent SSE / proxy APIs / conversation / summary

Orchestration

LangGraph + Deep Agents / Orchestrator / Expert Agents

Data & Knowledge

GraphQL / CLS / Prometheus / PostgreSQL / LLM APIs

diagnosis flow
用户提问

自然语言问题进入诊断系统

Triage Agent(分诊)
  • 意图分类:实例诊断 / 全局发现 / 快速查询 / 通用问答
  • 实体校验:实例 -> 客户端 -> 消息
  • 时间解析:自然语言 -> ISO 8601
  • 智能路由:目标智能体
DiagnosisManager(编排)
  • 搜索历史相似案例,避免重复排查
  • 动态委派子智能体(并行执行)
  • MQTTAgent -> GraphQL
  • LogAgent -> CLS 日志
  • MetricsAgent -> Prometheus
  • 综合分析,生成结构化诊断报告
问题分诊编排结论评价沉淀

04 / architecture / agent topology

Triage:
先补全 Context,再分诊

01 获取问题实体

从用户输入中抽取实例、客户端、消息、时间范围等诊断对象。

02 总结核心问题

把自然语言问题整理成可执行上下文;补全缺失信息,过滤用户因果假设。

03 调度目标 Agent

根据已验证上下文进入 Orchestrator、单专家 Agent,或直接回答快速查询。

context outputvalidated facts

instance / client / message / time

problem summarydiagnosis intent

症状、范围、用户假设、待验证问题

routing decisiontarget agent

Orchestrator / MQTTAgent / LogAgent / MetricsAgent / Direct answer

05 / architecture / investigation

多 Agent 排查:
把复杂问题拆成可验证子问题

用户假设服务端没回 keep alive

自然语言里可能已经包含错误因果。

可验证子问题
  • 客户端是否持续发送 PINGREQ?
  • 服务端是否收到心跳?
  • 断连原因和 Pod 时间线是什么?
  • 是否存在同 Client ID 接入?
证据来源
  • LogAgent:心跳日志、断连原因
  • MQTTAgent:会话、连接事件、配置
  • MetricsAgent:仅用于实例级异常
  • Summary Search:历史模式
多 Agent 的价值不是“多查”,而是把复杂诊断变成有边界的调查过程。

06 / architecture / data & tools

数据源与工具层:
Agent 查证据,不替代数据源

GraphQL

实例元数据、客户端会话、连接事件

MQTTAgent / set_context
CLS

Proxy/Audit 日志、断连原因、订阅拒绝、消息链路

LogAgent / set_context
Prometheus

趋势、聚合指标、Fleet TopK

MetricsAgent
PostgreSQL

conversation、summary、全文检索、历史经验

Summary Search / Admin
LLM APIs

推理、报告、结构化 summary

Triage / Orchestrator / Summary Generator
原则:LLM 负责判断路径和解释证据,事实必须来自可查询系统。

07 / architecture / observable ui

前端可观测性:
为后续可评估性做铺垫

01 / 工具调用
参数、结果、耗时与状态可复核
Expanded execute_log_query tool call with parameters, result, duration and status
02 / Agent 任务列表
任务拆解、执行状态、token 与缓存成本可见
Agent task list with subtasks, status and token usage
03 / 查询实体
实例、客户、规格、集群和 client 等诊断上下文可核对
Queried instance and client entity panel
04 / 用户反馈
用户可以对具体结论点赞、点踩、标注和反馈
User feedback highlight and thumbs controls
可见过程 + 可见证据 + 可见成本 + 可反馈结果

08 / lesson / context

Context is all you need:
有效上下文,而不是更多上下文

有效上下文 不是把窗口塞满,而是让进入窗口的每个 token 都能改变下一步判断。
01 / most focused 行为上下文:Prompt

角色、边界、停止条件、工具策略;直接约束 Agent 如何行动、何时停止、哪些事实必须验证。

02 / domain directory 领域上下文:Skills

catalog / SOP / query template;不塞全量知识,只提供“该查什么、怎么查”的目录。

03 / reusable memory 历史上下文:Summary Search

good case 作为可复用经验,bad case 作为反面教材和行为修正信号。

多 Agent 切分

让子 Agent 只携带与任务相关的局部上下文。

工具结果压缩

长结果先结构化摘要,保留可追溯证据。

文件承载中间产物

大段日志、查询结果不直接挤占主上下文。

上下文保序

稳定消息顺序,降低重复推理成本并适配 KV cache。

09 / lesson / tool design

工具设计:
给原子能力,不给僵硬 SOP

not recommended

业务 SOP 工具

诊断订阅失败() 判断 keepalive 根因()

工具越细,选择越困难;SOP 固化在工具里,边界场景难调整;结论被黑盒化。

recommended

原子事实工具 + skill 目录 + Agent 判断

GraphQL 查询 CLS 查询 Prometheus 查询 Summary search

工具负责事实,skill 负责方法,Agent 负责判断。

10 / lesson / tool design

工具设计:
用 Skill Catalog 引导正确查询

catalog skill

query-catalog

入口只给目录和触发条件:写 custom SQL、execute_log_query、断连分析、错误分布、客户端查找、消息消费、投递延迟等。

proxy-log-queries断连 / 错误 / client 解析 / Packet / 线程池
auth-log-queries认证失败 / 限流 / 授权拒绝 / ACL
audit-log-queries消息消费 / fanout / 延迟 / 流量 / 重试
1. 先按症状选 reference

Client disconnects → proxy;Message loss → audit;Auth failures → auth。

2. 再读场景模板

例如 keepalive timeout:用 proxy log 的 Top disconnecting clients 模板。

3. 最后替换变量执行

填入 instance、client_prefix、topic、时间窗;由 execute_log_query 查询 CLS。

bad query message LIKE '%disconnect%'

只做模糊文本搜索,缺少 topic_type、实例过滤、原因提取和聚合,容易把无关日志混进来。

good query __TAG__.namespace:"$instance" AND message:"keepalive_timeout" | select count(*) as count, regexp_extract(message, 'client-id=([^,]+)', 1) as client_id group by client_id order by count desc

直接复用 catalog 中的 keepalive timeout 模板:先限定实例和原因,再提取 client_id 并按次数排序。

11 / lesson / deterministic output

确定性输出:
用 Spec 约束 AI,用前端拿真实数据

LLM emits spec
```metrics-chart
query: sum(rate(...))
time: 2026-03-12
unit: ops
```
API fetches real data

Prometheus / GraphQL proxy 根据 spec 重新取数。

React renders

确定性组件渲染图表、排名和建议块。

Markdown wall of text -> Generative UI: generativeui.github.io

12 / lesson / deterministic output

确定性输出:
把图表交给前端组件

确保无数据幻觉

点位、排名、趋势来自真实接口。

节约 token

大量数据输出由前端直接渲染。

一致、可预期

同一份 spec 输出稳定结构。

表达能力更强

标注、缩放、hover、跳转交给前端。

Rendered online connection trend chart with annotated drop and recovery points

13 / lesson / evaluation

Agent 不会一次搭好:
需要明确的评估与进化路径

Observe

不可量化的东西,不可优化。

通过 Agent Middleware 与 LangGraph 事件流记录每一次 tool call、LLM 调用、Agent 调度和 token 成本,结构化追踪诊断流程。用户可以展开工具、查看任务列表和成本;团队获得可复盘的执行数据。

tool traceagent timelinetoken usage
Evaluate

让用户给出评价,而不是靠评估 LLM 猜测。

支持 thumbs、文本高亮和 review comment。用户直接标出“这句有用”“这段错误”“这里应该怎么改”;系统记录真实用户判断,避免再引入一个模型去猜好坏。

thumbshighlightreview comment
Summarize

把一次诊断转成可检索经验。

系统把对话、工具证据、用户反馈整理成 summary。good case 成为历史参考,bad case 保留失败原因和修正建议;后续相似问题可以先检索经验再排查。

good casebad casesimilar search
Improve

从下层上下文精炼通用策略到上层。

把单次 bad case、工具调用和用户修正,精炼成更通用的 prompt 约束、skill 目录或工具边界。这个过程类似训练:不是记住一次错误,而是把局部反馈提炼成未来决策的先验。

prompt ruleskill updatetool boundary

14 / closing

Thank You

感谢聆听

Q&A
S 演讲者视图 · T 切换主题 · ← → 翻页 · F 全屏 · O 总览