大模型应用开发工程师培训材料#
面向对象:备考"AI大模型应用开发工程师"认证的学员 材料特点:理论+实操,覆盖大纲全部11个模块,每章包含知识要点、代码示例和考试要点 更新日期:2026年7月
目录#
- 大模型前沿技术发展与实践
- 大模型部署与应用
- TokenHub
- RAG原理与企业知识库建设基础
- Dify进阶Agent系统开发
- VibeCoding工具使用
- 大模型开发工具链实战(LangChain)
- 大模型开发工具链实战(LangGraph与DeepAgent)
- MCP与Skills开发实战
- 企业级数字员工开发基础实操
- 进阶实操-多智能体数字员工运维场景
第一章 大模型前沿技术发展与实践#
1.1 大模型发展历程与里程碑#
1.1.1 技术演进时间线#
| 时间 | 里程碑事件 | 意义 |
|---|---|---|
| 2017 | Google发表Transformer论文 | 奠定大模型架构基础 |
| 2018 | OpenAI发布GPT-1 | 预训练+微调范式确立 |
| 2020 | GPT-3发布(1750亿参数) | 规模化突破,涌现能力显现 |
| 2022 | ChatGPT发布 | 生成式AI大众化,全球引爆 |
| 2023 | GPT-4发布 | 多模态能力,推理显著提升 |
| 2024 | Claude 3、Gemini 1.5发布 | 超长上下文(200K-1M token) |
| 2025 | DeepSeek-R1、Claude Code发布 | 推理模型和Agent范式成熟 |
| 2026 | GPT-5.6、Claude Sonnet 5发布 | 开源追平闭源,Agent规模化商用 |
1.1.2 范式跃迁:从ChatBot到Agent#
| 阶段 | 核心特征 | 代表产品 | 用户日Token消耗 |
|---|---|---|---|
| ChatBot(2023) | 你问我答,知识库 | ChatGPT | 10万-100万 |
| Copilot(2024) | 代码补全,单文件辅助 | GitHub Copilot | 100万-500万 |
| Agent(2025-2026) | 自主规划,全链路执行 | Claude Code、OpenClaw | 1000万-1亿 |
1.1.3 成本革命#
GPT-4级别的模型每百万Token价格从2022年末的20美元跌至2025年12月的0.40美元,36个月内下降至五十分之一。开源模型成本更低,DeepSeek V4在特定任务上成本仅为闭源竞品的1/40。
1.2 主流大模型对比#
1.2.1 国外主流模型#
| 模型 | 开发者 | 核心优势 | 参数规模 | 上下文窗口 |
|---|---|---|---|---|
| GPT-5.6 | OpenAI | 多模态集成,推理最强 | 未公开 | 128K-2M |
| Claude Sonnet 5 | Anthropic | 安全对齐,编程能力突出 | 未公开 | 200K |
| Gemini 3.1 Pro | 原生多模态,超长上下文 | 未公开 | 1M-2M | |
| Llama 4 | Meta | 开源旗舰,可本地部署 | 405B | 128K |
| Grok 4.5 | xAI | 实时信息,社交媒体整合 | 未公开 | 128K |
1.2.2 国内主流模型#
| 模型 | 开发者 | 核心优势 | 开源情况 |
|---|---|---|---|
| DeepSeek V4 | 深度求索 | 极致性价比,推理能力强 | 完全开源 |
| 通义千问 Qwen3 | 阿里巴巴 | 全尺寸开源,多模态 | 开源(7B-110B) |
| 混元 Hy3 | 腾讯 | 中文理解强,企业级部署 | 部分开源 |
| 文心 ERNIE 4.5 | 百度 | 知识增强,中文生态 | 部分开源 |
| GLM-5 | 智谱AI | 学术背景,Agent能力强 | 开源 |
| Kimi K2 | 月之暗面 | 超长文本(200万字) | 闭源 |
1.2.3 开源vs闭源格局#
2026年全球开源模型市场份额已从2024年的4.5%飙升至46%。DeepSeek V4 Flash以18.4T Tokens的月调用量登顶全球开源模型第一。开源模型在多数基准测试中已追平GPT-4水平。
1.3 推理模型与思维链#
1.3.1 什么是推理模型#
推理模型(Reasoning Model)在生成回答前先进行内部"思考",通过思维链(Chain-of-Thought)逐步推理,显著提升数学、编程、逻辑等复杂任务的正确率。
| 类型 | 代表模型 | 特点 | 适用场景 |
|---|---|---|---|
| 快速模型 | GPT-4o、Claude Haiku | 直接输出,速度快 | 日常对话、简单任务 |
| 推理模型 | DeepSeek-R1、o3 | 内部推理链,准确率高 | 数学、编程、逻辑推理 |
| 混合模型 | Claude Sonnet 5 | 可切换思考模式 | 通用场景 |
1.3.2 思维链提示技术#
# 标准思维链提示
问题:一个电信基站每天消耗200度电,电费每度0.8元。升级AI节能模式后可节省30%电力。
请逐步计算:
1. 升级前每月电费
2. 升级后每月电费
3. 每年节省金额
请展示完整计算过程。
# ReAct模式(推理+行动)
Thought: 我需要查询数据...
Action: web_search("2026年基站平均功耗")
Observation: 查询结果是...
Thought: 基于结果,我可以计算...
Final Answer: 最终回答1.4 多模态大模型#
1.4.1 多模态能力矩阵#
| 能力 | 输入 | 输出 | 代表应用 |
|---|---|---|---|
| 文本理解与生成 | 文本 | 文本 | 对话、写作、翻译 |
| 视觉理解 | 图像 | 文本描述 | 图像描述、OCR、图表分析 |
| 图像生成 | 文本/图像 | 图像 | AI绘图、风格转换 |
| 语音交互 | 音频 | 文本/音频 | 语音助手、会议转写 |
| 视频理解 | 视频 | 文本 | 视频摘要、内容审核 |
| 跨模态生成 | 文本 | 图+文+音 | 多模态内容创作 |
1.4.2 实践:多模态API调用#
import openai
client = openai.OpenAI(api_key="your-api-key")
# 文本对话
response = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": "解释什么是Transformer架构"}]
)
print(response.choices[0].message.content)
# 图像理解
response = client.chat.completions.create(
model="gpt-4o",
messages=[{
"role": "user",
"content": [
{"type": "text", "text": "分析这张网络架构图"},
{"type": "image_url", "image_url": {"url": "data:image/png;base64,..."}}
]
}]
)
print(response.choices[0].message.content)考试要点#
- 理解大模型发展的三个范式阶段(ChatBot→Copilot→Agent)
- 掌握国内外主流模型的定位和核心优势
- 理解推理模型与快速模型的区别
- 掌握思维链(CoT)和ReAct模式的概念
- 了解多模态大模型的能力边界
第二章 大模型部署与应用#
2.1 部署方案分类#
2.1.1 部署方式对比#
| 部署方式 | 代表工具 | 适合场景 | 优点 | 缺点 |
|---|---|---|---|---|
| 云端API | OpenAI/百度/阿里 | 快速验证、低频使用 | 零部署成本,弹性扩缩 | 数据出域,按量付费 |
| 本地轻量部署 | Ollama、LM Studio | 个人开发、隐私场景 | 数据不出域,零费用 | 受限于本地硬件 |
| 本地高性能部署 | vLLM、SGLang | 团队/企业级API服务 | 高并发,OpenAI兼容 | 需GPU服务器 |
| 端侧部署 | llama.cpp | 移动设备、嵌入式 | 极致轻量 | 模型规模受限 |
| 私有云部署 | Kubernetes+vLLM | 大型企业 | 可控可扩展 | 运维成本高 |
2.2 Ollama本地部署#
2.2.1 安装与使用#
# Windows安装(下载安装包或winget)
winget install Ollama.Ollama
# 拉取模型
ollama pull qwen2.5:7b
ollama pull deepseek-r1:7b
ollama pull llama3.1:8b
# 运行模型
ollama run qwen2.5:7b
# 查看已安装模型
ollama list
# 启动API服务(默认11434端口)
ollama serve2.2.2 Ollama API调用#
import requests
# 调用Ollama的OpenAI兼容API
response = requests.post(
"http://localhost:11434/v1/chat/completions",
json={
"model": "qwen2.5:7b",
"messages": [{"role": "user", "content": "什么是5G-A?"}],
"temperature": 0.7
}
)
print(response.json()["choices"][0]["message"]["content"])2.2.3 自定义Modelfile#
# Modelfile - 自定义模型配置
FROM qwen2.5:7b
# 系统提示词
SYSTEM """
你是江苏电信的智能助手,专门回答电信业务相关问题。
回答要准确、简洁、专业。
"""
# 参数设置
PARAMETER temperature 0.3
PARAMETER top_p 0.9
PARAMETER num_ctx 4096# 构建自定义模型
ollama create telecom-bot -f Modelfile
# 运行
ollama run telecom-bot2.3 LM Studio图形化部署#
2.3.1 核心功能#
| 功能 | 说明 |
|---|---|
| 模型市场 | 内置Hugging Face模型搜索和下载 |
| 对话界面 | 类ChatGPT的图形界面 |
| API服务 | 一键启动OpenAI兼容API |
| 模型量化 | 支持GGUF格式自动量化 |
| 多GPU支持 | 支持GPU加速推理 |
2.3.2 操作步骤#
- 下载安装LM Studio → 搜索模型(如Qwen2.5-7B-Instruct-GGUF)→ 选择量化版本(推荐Q4_K_M)
- 下载完成后在Chat页面加载模型 → 开始对话
- 启动API服务:Developer → Start Server → 端口默认1234
2.4 vLLM企业级部署#
2.4.1 vLLM核心技术#
| 技术 | 说明 |
|---|---|
| PagedAttention | 分页注意力机制,减少KV Cache内存碎片 |
| Continuous Batching | 动态批处理,提高GPU利用率 |
| Tensor Parallelism | 张量并行,多GPU协同 |
| 量化推理 | 支持AWQ、GPTQ等量化方案 |
| OpenAI兼容API | 直接替换OpenAI API |
2.4.2 vLLM部署实战#
# 安装vLLM
pip install vllm
# 启动API服务(单GPU)
python -m vllm.entrypoints.openai.api_server \
--model Qwen/Qwen2.5-7B-Instruct \
--port 8000 \
--max-model-len 32768
# 多GPU张量并行
python -m vllm.entrypoints.openai.api_server \
--model Qwen/Qwen2.5-72B-Instruct \
--tensor-parallel-size 4 \
--port 8000# 使用vLLM的Python SDK
from vllm import LLM, SamplingParams
llm = LLM(model="Qwen/Qwen2.5-7B-Instruct")
sampling = SamplingParams(temperature=0.7, max_tokens=500)
prompts = ["解释什么是RAG技术", "用Python写一个快速排序"]
outputs = llm.generate(prompts, sampling)
for output in outputs:
print(output.outputs[0].text)2.5 模型量化技术#
2.5.1 量化方案对比#
| 量化方法 | 精度损失 | 内存节省 | 代表格式 | 适用场景 |
|---|---|---|---|---|
| FP16 | 基准 | 1x | 原始 | 服务器推理 |
| INT8 | ~1% | 2x | GPTQ, AWQ | 生产部署 |
| INT4 (Q4) | ~2-3% | 4x | GGUF Q4_K_M | 本地部署 |
| INT4 (Q4_0) | ~3-5% | 4x+ | GGUF Q4_0 | 端侧设备 |
2.5.2 选择建议#
- 服务器/A100/H100:FP16或INT8,精度优先
- 消费级GPU(RTX 4090):INT4(AWQ/GPTQ),兼顾速度和精度
- CPU/边缘设备:GGUF Q4_K_M,最大化压缩
考试要点#
- 掌握Ollama的安装、模型拉取、API调用
- 理解vLLM的PagedAttention和Continuous Batching原理
- 掌握模型量化的概念和常见格式(GGUF、AWQ、GPTQ)
- 理解不同部署方案的适用场景
- 能编写Modelfile自定义模型配置
第三章 TokenHub#
3.1 TokenHub概述#
3.1.1 什么是TokenHub#
TokenHub是腾讯云推出的一站式大模型API聚合网关平台。它将多家厂商的大模型(腾讯混元、DeepSeek、智谱GLM、Kimi、MiniMax、通义千问Qwen等)聚合在统一接口下,用户使用一个API Key即可访问所有模型。
3.1.2 核心价值#
| 价值点 | 说明 |
|---|---|
| 统一接入 | 一个API Key访问所有主流模型,无需分别申请 |
| 协议兼容 | 同时支持OpenAI Chat Completions API和Anthropic Messages API |
| 成本管控 | Token级精确计量,支持分账和预算控制 |
| 模型切换 | 无需改代码,修改model参数即可切换模型 |
| 负载均衡 | 自动故障转移,保障服务可用性 |
3.1.3 从MaaS到TokenHub的演进#
腾讯云从传统的MaaS(Model as a Service)模式升级为TokenHub,核心变化是从"卖模型"转向"卖Token+工程化能力"。企业比拼的重点从单纯模型能力转向工程化能力——工具调用、上下文管理、工作流设计。
3.2 TokenHub使用方法#
3.2.1 获取API Key#
- 注册腾讯云账号并开通TokenHub服务
- 进入TokenHub控制台 → API Key管理页面
- 点击"创建API Key" → 获取密钥
3.2.2 API调用实践#
import openai
# 使用TokenHub作为网关
client = openai.OpenAI(
api_key="your-tokenhub-api-key",
base_url="https://tokenhub.tencentmaas.com/v1"
)
# 调用混元模型
response = client.chat.completions.create(
model="hy3", # 腾讯混元Hy3
messages=[{"role": "user", "content": "解释什么是大模型Agent"}],
temperature=0.7
)
print(response.choices[0].message.content)
# 切换到DeepSeek模型(只需改model参数)
response = client.chat.completions.create(
model="deepseek-v3", # DeepSeek V3
messages=[{"role": "user", "content": "解释什么是大模型Agent"}],
)
print(response.choices[0].message.content)
# 切换到通义千问
response = client.chat.completions.create(
model="qwen-max",
messages=[{"role": "user", "content": "解释什么是大模型Agent"}],
)
print(response.choices[0].message.content)3.2.3 Anthropic协议兼容#
import anthropic
# 使用Anthropic SDK通过TokenHub调用
client = anthropic.Anthropic(
api_key="your-tokenhub-api-key",
base_url="https://tokenhub.tencentmaas.com/anthropic"
)
message = client.messages.create(
model="hy3",
max_tokens=1024,
messages=[{"role": "user", "content": "用Python写一个二分查找"}]
)
print(message.content[0].text)3.2.4 接入Claude Code#
TokenHub支持将混元等模型接入Claude Code使用:
# 配置环境变量
export ANTHROPIC_API_KEY="your-tokenhub-api-key"
export ANTHROPIC_BASE_URL="https://tokenhub.tencentmaas.com/anthropic"
# 启动Claude Code,使用TokenHub网关的模型
claude --model hy33.3 Token管理与成本优化#
3.3.1 Token计量原理#
| 概念 | 说明 | 示例 |
|---|---|---|
| Input Token | 输入消耗的Token | 用户问题+上下文+系统提示 |
| Output Token | 输出消耗的Token | 模型生成的回答 |
| 计费单位 | 通常每百万Token | 如¥1/百万Input Token |
| 上下文累积 | 多轮对话中历史消息累加 | 第5轮对话包含前4轮所有内容 |
3.3.2 成本优化策略#
| 策略 | 方法 | 节省效果 |
|---|---|---|
| 模型分级 | 简单任务用小模型,复杂任务用大模型 | 50-80% |
| 上下文裁剪 | 截断或摘要历史对话 | 30-60% |
| 缓存复用 | 对相同问题缓存回答 | 视命中率而定 |
| 批量处理 | 使用Batch API(半价) | 50% |
| 停用词优化 | 精简系统提示词 | 10-20% |
3.3.3 Token用量监控#
# 监控每次调用的Token使用量
response = client.chat.completions.create(
model="deepseek-v3",
messages=[{"role": "user", "content": "你好"}]
)
# 查看Token使用统计
usage = response.usage
print(f"输入Token: {usage.prompt_tokens}")
print(f"输出Token: {usage.completion_tokens}")
print(f"总Token: {usage.total_tokens}")考试要点#
- 理解TokenHub作为API聚合网关的核心价值
- 掌握通过TokenHub调用不同模型的方法(仅改model参数)
- 理解Token计量原理(输入Token + 输出Token)
- 掌握成本优化的常见策略
- 了解TokenHub同时兼容OpenAI和Anthropic两种API协议
第四章 RAG原理与企业知识库建设基础#
4.1 RAG技术原理#
4.1.1 什么是RAG#
RAG(Retrieval-Augmented Generation,检索增强生成)是一种让大语言模型"先查阅文档再作答"的技术。通过将外部知识检索与LLM生成相结合,突破模型训练数据的局限,生成更准确、更可靠的回答。
4.1.2 RAG工作流程#
用户提问
│
▼
┌─────────────┐ ┌─────────────────┐
│ 问题向量化 │────→│ 向量数据库检索 │
│ (Embedding) │ │ (相似度搜索Top-K) │
└─────────────┘ └────────┬────────┘
│
检索到相关文档块
│
▼
┌─────────────────────────────────────┐
│ 构造增强Prompt │
│ "基于以下参考资料回答问题: │
│ [检索到的文档块] │
│ 问题:[用户问题]" │
└─────────────────────────────────────┘
│
▼
┌─────────────┐
│ LLM生成回答 │
└─────────────┘4.1.3 RAG的演进路线#
| 阶段 | 名称 | 特点 | 局限 |
|---|---|---|---|
| Naive RAG | 朴素RAG | 切片→向量化→检索→生成 | 检索质量不稳定 |
| Advanced RAG | 高级RAG | 增加查询重写、重排序、混合检索 | 架构复杂 |
| Modular RAG | 模块化RAG | 检索模块可插拔,支持多路召回 | 工程门槛高 |
| Agentic RAG | 智能体RAG | Agent自主决策检索策略 | 成本较高 |
| GraphRAG | 图增强RAG | 构建知识图谱,跨文档关联 | 构建成本高 |
4.2 Embedding与向量数据库#
4.2.1 Embedding模型#
Embedding(嵌入)将文本转换为高维向量,使语义相近的文本在向量空间中距离更近。
from langchain_openai import OpenAIEmbeddings
# 使用Embedding模型
embeddings = OpenAIEmbeddings(
model="text-embedding-3-small",
api_key="your-api-key"
)
# 将文本转为向量
vector = embeddings.embed_query("5G-A技术有什么特点?")
print(f"向量维度: {len(vector)}") # 通常1536维
# 批量嵌入
texts = ["5G-A介绍", "6G展望", "光纤通信"]
vectors = embeddings.embed_documents(texts)4.2.2 主流向量数据库对比#
| 数据库 | 类型 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| Chroma | 轻量级 | 安装简单,Python原生 | 不适合大规模 | 原型开发 |
| FAISS | 库 | Meta开源,速度快 | 无持久化,无API | 研究实验 |
| Milvus | 分布式 | 支持亿级向量,高可用 | 部署复杂 | 企业生产 |
| Qdrant | Rust | 高性能,支持过滤 | 生态较小 | 中型项目 |
| Pinecone | 云服务 | 全托管,零运维 | 按量付费,数据出境 | 快速上线 |
| Weaviate | 全功能 | 内置多模态,GraphQL | 资源占用大 | 复杂场景 |
4.2.3 Chroma向量库实践#
import chromadb
# 创建Chroma客户端
client = chromadb.PersistentClient(path="./vector_db")
# 创建集合
collection = client.create_collection(
name="telecom_kb",
metadata={"hnsw:space": "cosine"} # 使用余弦相似度
)
# 添加文档
collection.add(
documents=[
"5G-A是5G的增强版,下行峰值速率可达10Gbps",
"5G-A新增了通感一体能力,可实现低空通信",
"千兆宽带套餐月费128元,包含500分钟通话"
],
metadatas=[
{"source": "5ga-brochure.pdf", "page": 1},
{"source": "5ga-brochure.pdf", "page": 3},
{"source": "broadband-pricing.xlsx", "page": 1}
],
ids=["doc1", "doc2", "doc3"]
)
# 查询
results = collection.query(
query_texts=["5G-A的速率是多少"],
n_results=2
)
print(results["documents"])4.3 文档处理与分块策略#
4.3.1 文档加载#
from langchain_community.document_loaders import (
PyPDFLoader, TextLoader, Docx2txtLoader, CSVLoader
)
# 加载PDF
pdf_loader = PyPDFLoader("product_manual.pdf")
pdf_docs = pdf_loader.load()
# 加载Word
docx_loader = Docx2txtLoader("report.docx")
docx_docs = docx_loader.load()
# 加载CSV
csv_loader = CSVLoader("data.csv")
csv_docs = csv_loader.load()
# 合并所有文档
all_docs = pdf_docs + docx_docs + csv_docs
print(f"总文档数: {len(all_docs)}")4.3.2 文本分块策略#
| 策略 | 说明 | 适用场景 |
|---|---|---|
| 固定长度 | 按字符数切分 | 通用场景 |
| 递归字符 | 按段落→句子→字符层级切分 | 大多数文档 |
| 语义分块 | 按语义边界切分 | 高质量要求 |
| Markdown分块 | 按标题层级切分 | Markdown文档 |
| 代码分块 | 按函数/类切分 | 代码文件 |
from langchain.text_splitter import RecursiveCharacterTextSplitter
# 递归字符分块
splitter = RecursiveCharacterTextSplitter(
chunk_size=500, # 每块最大500字符
chunk_overlap=50, # 块间重叠50字符(保持上下文)
separators=["\n\n", "\n", "。", "!", "?", ",", " ", ""] # 中文优先
)
chunks = splitter.split_documents(all_docs)
print(f"分块数: {len(chunks)}")
print(f"第一块内容: {chunks[0].page_content[:100]}")4.3.3 分块参数调优#
| 参数 | 推荐值 | 说明 |
|---|---|---|
| chunk_size | 300-800 | 太小丢失上下文,太大检索不精确 |
| chunk_overlap | 50-150 | 保证块间语义连续性 |
| 分隔符优先级 | 句号>换行>空格 | 中文场景优先按句分割 |
4.4 企业知识库建设实战#
4.4.1 完整RAG系统构建#
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_community.vectorstores import Chroma
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.document_loaders import PyPDFLoader
from langchain.chains import RetrievalQA
from langchain.prompts import PromptTemplate
# 第一步:加载文档
loader = PyPDFLoader("telecom_products.pdf")
docs = loader.load()
# 第二步:文本分块
splitter = RecursiveCharacterTextSplitter(
chunk_size=500, chunk_overlap=50
)
chunks = splitter.split_documents(docs)
# 第三步:向量化并存储
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vectorstore = Chroma.from_documents(
documents=chunks,
embedding=embeddings,
persist_directory="./chroma_db"
)
# 第四步:创建检索器
retriever = vectorstore.as_retriever(
search_type="similarity",
search_kwargs={"k": 4} # 检索Top-4相关块
)
# 第五步:构造RAG链
prompt_template = """
你是一个电信业务知识助手。请基于以下参考资料回答用户问题。
如果参考资料中没有相关信息,请说"根据现有资料无法回答该问题"。
参考资料:
{context}
用户问题:{question}
回答:
"""
PROMPT = PromptTemplate(
template=prompt_template,
input_variables=["context", "question"]
)
llm = ChatOpenAI(model="gpt-4o", temperature=0.3)
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=retriever,
chain_type_kwargs={"prompt": PROMPT},
return_source_documents=True
)
# 第六步:问答
result = qa_chain({"query": "5G-A套餐有哪些?"})
print(f"回答: {result['result']}")
print(f"引用来源: {[doc.metadata for doc in result['source_documents']]}")4.4.2 RAG质量优化技巧#
| 优化方向 | 方法 | 效果 |
|---|---|---|
| 查询重写 | LLM将用户问题改写为更易检索的形式 | 提高召回率 |
| 混合检索 | 向量检索+关键词检索(BM25)结合 | 兼顾语义和精确匹配 |
| 重排序 | 对检索结果用Cross-Encoder重新排序 | 提高精确率 |
| 元数据过滤 | 按来源/时间/类型过滤检索范围 | 减少噪声 |
| 多查询融合 | 生成多个查询变体,合并检索结果 | 提高覆盖率 |
4.4.3 查询重写示例#
from langchain.retrievers import MultiQueryRetriever
# 多查询检索器:自动生成多个查询变体
multi_retriever = MultiQueryRetriever.from_llm(
retriever=vectorstore.as_retriever(),
llm=llm
)
# 用户提问"5G-A快吗" → 自动生成:
# "5G-A的传输速率是多少"
# "5G-A相比5G速度提升多少"
# "5G-A峰值速率"
# 分别检索后合并去重考试要点#
- 理解RAG的核心流程:加载→分块→向量化→检索→生成
- 掌握Embedding的概念和作用
- 了解主流向量数据库的选型
- 掌握文本分块策略和参数调优
- 能用LangChain构建完整的RAG系统
- 了解RAG质量优化的常见方法(查询重写、混合检索、重排序)
第五章 Dify进阶Agent系统开发#
5.1 Dify平台概述#
5.1.1 什么是Dify#
Dify是一个开源的大模型应用开发平台(LLMOps),名字来源于"Do It For You"。它将"接大模型、写提示词、挂工具、配知识库、发布成API"这些工作可视化,开发者只需拖拽连线,无需写框架代码即可构建AI应用。
5.1.2 四类应用类型#
| 类型 | 说明 | 适用场景 |
|---|---|---|
| 聊天助手 | 多轮对话机器人 | 客服、问答 |
| 文本生成 | 单次输入→输出 | 翻译、摘要、文案 |
| 工作流(Workflow) | 可视化流程编排 | 复杂任务自动化 |
| 智能体(Agent) | 自主规划+工具调用 | 多步骤复杂任务 |
5.1.3 Dify Agent与普通聊天机器人的区别#
| 维度 | 普通聊天机器人 | Dify Agent |
|---|---|---|
| 工作模式 | 被动回答 | 自主规划执行 |
| 工具使用 | 不能 | 可调用搜索、API、代码等 |
| 任务拆解 | 不能 | 自动拆解多步骤任务 |
| 记忆能力 | 有限 | 短期+长期记忆 |
| 推理范式 | 无 | ReAct/CoT等推理模式 |
5.2 Dify安装部署#
5.2.1 Docker部署#
# 克隆Dify仓库
git clone https://github.com/langgenius/dify.git
cd dify/docker
# 复制环境变量
cp .env.example .env
# 启动Docker Compose
docker compose up -d
# 访问 http://localhost:805.2.2 配置模型提供商#
在Dify后台 → 设置 → 模型供应商:
- OpenAI:填入API Key
- 通义千问:填入DashScope API Key
- DeepSeek:填入DeepSeek API Key
- Ollama本地模型:填入本地Ollama地址
http://host.docker.internal:11434
5.3 Agent智能体开发#
5.3.1 创建Agent#
- 进入Dify → 创建应用 → 选择"Agent"
- 填写应用名称和描述
- 配置以下核心要素
5.3.2 Agent核心配置#
系统提示词设计#
你是江苏电信的智能客服助手。
## 能力范围
1. 解答套餐、宽带、5G相关业务问题
2. 处理用户报障和投诉
3. 推荐适合的套餐和增值业务
## 工作规范
1. 回答基于知识库内容,不编造信息
2. 无法回答时引导用户转人工(拨10000号)
3. 保持礼貌专业的语气
4. 涉及费用的问题,提醒以实际账单为准
## 回答格式
- 简单问题:直接回答
- 复杂问题:分步骤说明
- 办理类问题:给出具体操作步骤工具配置#
| 工具类型 | 说明 | 实例 |
|---|---|---|
| 知识库 | 上传业务文档供检索 | FAQ文档、产品手册 |
| 搜索引擎 | 联网搜索最新信息 | DuckDuckGo、Google |
| 计算器 | 数学计算 | 套餐费用计算 |
| 代码执行 | 运行Python代码 | 数据处理、格式转换 |
| 自定义API | 调用外部接口 | 查询用户信息、工单系统 |
| DALL·E | 图像生成 | 生成宣传图(如需) |
Agent推理模式#
| 模式 | 说明 | 适用场景 |
|---|---|---|
| ReAct | 推理+行动交替执行 | 通用场景(推荐) |
| Function Calling | 模型原生函数调用 | 支持FC的模型 |
| 自定义 | 自定义推理逻辑 | 特殊需求 |
5.3.3 工作流(Workflow)开发#
工作流是可视化的任务流水线,适合处理确定性流程:
[开始节点]
↓
[LLM节点:理解用户意图]
↓
[条件分支]
├── 套餐咨询 → [知识库检索] → [LLM生成回答] → [输出]
├── 故障报修 → [创建工单API] → [LLM生成确认] → [输出]
└── 投诉建议 → [记录到数据库] → [LLM安抚回复] → [输出]工作流节点类型#
| 节点 | 功能 | 配置要点 |
|---|---|---|
| 开始 | 接收输入 | 定义输入参数 |
| LLM | 大模型推理 | 选择模型、设计Prompt |
| 知识库 | 检索文档 | 选择知识库、设置Top-K |
| 代码 | 执行Python/JS | 注意安全沙箱限制 |
| 条件分支 | if-else逻辑 | 设置判断条件 |
| HTTP请求 | 调用外部API | 配置URL、Header、Body |
| 模板转换 | 变量替换 | Jinja2模板语法 |
| 变量赋值 | 存储中间结果 | 定义变量类型 |
| 循环 | 遍历列表 | 设置循环体 |
| 参数提取 | 从文本提取结构化数据 | 定义提取字段 |
5.3.4 实战:搭建电信客服Agent#
步骤1:创建Agent应用,编写系统提示词
步骤2:上传知识库
- 上传产品手册PDF → 自动分块向量化
- 上传FAQ Excel → 结构化知识
步骤3:添加工具
- 搜索工具:处理超出知识库范围的问题
- 计算器:套餐费用对比
- 自定义API:查询用户套餐信息
步骤4:调试与优化
- 在预览界面测试多轮对话
- 调整提示词,覆盖边界情况
- 设置推荐问题引导用户
步骤5:发布应用
- 发布为Web应用
- 生成API接口供第三方调用
- 嵌入到企业微信/飞书
5.4 Dify进阶功能#
5.4.1 多智能体协同#
Dify支持多个Agent协同工作,常见编排模式:
| 模式 | 说明 | 适用场景 |
|---|---|---|
| 管道模式 | Agent A→B→C线性执行 | 流水线处理 |
| 路由模式 | 根据意图分发到不同Agent | 智能客服 |
| 并行模式 | 多个Agent同时执行 | 多角度分析 |
| 协商模式 | Agent间相互校验 | 质量控制 |
| 层级模式 | 主Agent管理子Agent | 复杂任务 |
| 竞争模式 | 多个Agent给出方案,择优 | 创意生成 |
| 反馈模式 | Agent输出→另一个Agent评审 | 迭代优化 |
5.4.2 知识库高级配置#
| 配置项 | 说明 | 推荐值 |
|---|---|---|
| 分段方式 | 自动/自定义 | 自定义(更精确) |
| 分段长度 | 每块字符数 | 300-500 |
| 分段重叠 | 块间重叠字符 | 50-100 |
| Top-K | 检索返回数量 | 3-5 |
| Score阈值 | 相似度过滤阈值 | 0.5-0.7 |
| 重排序 | 启用Cross-Encoder | 开启(提升精度) |
考试要点#
- 掌握Dify四种应用类型的区别
- 理解Agent与普通聊天机器人的区别
- 能设计系统提示词并配置工具
- 掌握工作流节点类型和编排方法
- 了解多智能体协同的常见模式
- 能独立搭建一个完整的行业Agent应用
第六章 VibeCoding工具使用#
6.1 VibeCoding概念与起源#
6.1.1 什么是VibeCoding#
VibeCoding(氛围编程/感觉编程)是由Andrej Karpathy(OpenAI联合创始人、前特斯拉AI负责人)于2025年2月提出的AI驱动开发范式。核心思想:开发者用自然语言描述需求,由大模型自动生成代码,人类只负责验收效果和迭代需求。
Karpathy原话:“There’s a new kind of coding I call vibe coding, where you fully give in to the vibes, embrace exponentials, and forget that the code even exists.”
6.1.2 核心口诀#
“See → Say → Run”
- See(看):查看AI生成的代码和运行效果
- Say(说):用自然语言描述修改需求
- Run(跑):运行并验证结果
6.1.3 VibeCoding vs传统编程#
| 维度 | 传统编程 | VibeCoding |
|---|---|---|
| 编写方式 | 手动编写每一行代码 | 自然语言描述需求 |
| 技能要求 | 需要掌握语法和API | 主要是需求表达和验收 |
| 开发速度 | 较慢 | 提升5-10倍 |
| 适用人群 | 程序员 | 所有人(包括非技术人员) |
| 代码理解 | 完全理解 | 可能不完全理解(“vibe”) |
| 调试方式 | 断点调试、日志 | 自然语言描述问题 |
6.2 主流VibeCoding工具#
6.2.1 工具对比#
| 工具 | 类型 | 特点 | 价格 |
|---|---|---|---|
| Cursor | AI原生IDE | 最强VibeCoding体验 | $20/月 |
| Claude Code | 终端Agent | 全库理解,自主执行 | 按API计费 |
| TRAE | AI IDE(字节) | 国内首款,中文友好 | 基础版免费 |
| Windsurf | AI IDE | Cascade多文件编辑 | $15/月 |
| GitHub Copilot | IDE插件 | 代码补全为主 | $10/月 |
| bolt.new | 网页工具 | 浏览器中全栈开发 | 免费/付费 |
| v0.dev | 网页工具 | Vercel出品,专注前端 | 免费/付费 |
6.2.2 Cursor使用指南#
基本操作#
# Cursor核心功能
1. Cmd+K (Ctrl+K) → 行内代码生成
2. Cmd+L (Ctrl+L) → 打开AI对话侧栏
3. Cmd+I (Ctrl+I) → Composer多文件编辑
4. @file / @folder / @web → 引用上下文
5. @docs → 引用文档VibeCoding实践流程#
步骤1:创建项目
"创建一个React + Tailwind的电信套餐对比页面"
步骤2:迭代需求
"把对比表格改为卡片式布局,每个套餐一张卡片"
"在卡片右上角加一个'推荐'标签,仅推荐套餐显示"
步骤3:修复问题
"页面在手机上显示错位,请修复响应式布局"
步骤4:添加功能
"加一个筛选器,用户可以按月费范围筛选套餐"6.2.3 Claude Code VibeCoding#
# 在项目目录启动Claude Code
claude
# VibeCoding对话
> 帮我创建一个Express.js API,提供以下接口:
- GET /api/users 获取用户列表
- POST /api/users 创建用户
- GET /api/users/:id 获取用户详情
- PUT /api/users/:id 更新用户
- DELETE /api/users/:id 删除用户
使用SQLite,包含输入验证和错误处理
# Claude Code会自动:
# 1. 规划文件结构
# 2. 创建所有代码文件
# 3. 安装依赖
# 4. 运行测试
# 5. 生成README6.3 VibeCoding工程化最佳实践#
6.3.1 五步标准化流程#
阿里云开发者社区总结的Vibe Coding五步法,可提升开发效率42%:
| 步骤 | 说明 | 实践要点 |
|---|---|---|
| 1.需求结构化 | 将模糊需求转为结构化描述 | 明确功能点、技术栈、约束条件 |
| 2.上下文构建 | 提供充分的项目上下文 | 用@file引用现有代码和规范 |
| 3.增量生成 | 分步骤生成代码 | 每次聚焦一个功能模块 |
| 4.验收测试 | 运行并验证结果 | 描述预期行为,让AI对比 |
| 5.迭代优化 | 根据结果反馈调整 | 明确描述问题现象 |
6.3.2 VibeCoding提示词技巧#
# 差的提示词
"帮我写一个网站"
# 好的提示词
"创建一个电信产品展示网站,技术栈React+Tailwind+Vite。
要求:
1. 首页:Hero区域 + 4个产品卡片(5G套餐、宽带、云存储、智能组网)
2. 每个产品卡片包含:图标、名称、简介、价格、'了解更多'按钮
3. 响应式设计,手机端卡片单列,桌面端四列
4. 配色方案:主色#0066CC(电信蓝),背景白色
5. 添加导航栏和页脚"6.3.3 常见问题与解决#
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 生成代码不符合项目规范 | 缺少上下文 | 用@file引用规范文件和现有代码 |
| 大量代码一次性生成出错 | 任务太大 | 拆分为小步骤,增量生成 |
| AI修改了不该改的文件 | 缺少约束 | 明确指定"只修改xxx文件" |
| 生成代码有依赖冲突 | 未检查环境 | 先让AI检查package.json |
| 前端样式与设计稿不符 | 描述不够具体 | 提供精确的颜色值、尺寸、间距 |
6.4 VibeCoding + 智能体融合#
2026年,VibeCoding与AI智能体深度融合,形成完整的AI开发闭环:
用户口头描述需求
↓
[Agent智能体] → 需求拆解 → 架构设计
↓
[VibeCoding] → 代码生成 → 自动调试
↓
[Agent智能体] → 测试部署 → 迭代运维考试要点#
- 理解VibeCoding的概念和核心口诀(See→Say→Run)
- 了解主流VibeCoding工具及其特点
- 掌握VibeCoding五步标准化流程
- 理解VibeCoding与传统编程的区别
- 掌握VibeCoding提示词技巧
第七章 大模型开发工具链实战(LangChain)#
7.1 LangChain框架概述#
7.1.1 什么是LangChain#
LangChain是一个用于构建大语言模型应用的开源框架,由Harrison Chase团队开发。它将复杂的LLM应用开发标准化,提供模块化组件,让开发者能快速搭建问答系统、文档分析工具、智能Agent等应用。
LangChain是90%大模型应用开发岗位要求掌握的框架。
7.1.2 核心架构(三层)#
┌─────────────────────────────────────────┐
│ 应用层 │
│ (QA系统、聊天机器人、Agent应用) │
├─────────────────────────────────────────┤
│ 编排层 │
│ (Chain、Agent、Memory、Callback) │
├─────────────────────────────────────────┤
│ 集成层 │
│ (LLM接口、文档加载器、向量库、工具) │
└─────────────────────────────────────────┘7.1.3 核心组件#
| 组件 | 功能 | 常用类 |
|---|---|---|
| LLM/ChatModel | 大模型接口 | OpenAI, ChatOpenAI |
| Prompt Template | 提示词模板 | PromptTemplate, ChatPromptTemplate |
| Output Parser | 输出解析 | StrOutputParser, JsonOutputParser |
| Chain | 链式调用 | LLMChain, SequentialChain |
| Memory | 对话记忆 | ConversationBufferMemory |
| Retriever | 检索器 | VectorStoreRetriever |
| Agent | 智能体 | AgentExecutor |
| Tool | 工具 | Tool, @tool装饰器 |
7.2 LangChain基础实战#
7.2.1 环境搭建#
pip install langchain langchain-openai langchain-community
pip install chromadb pypdf docx2txt # 文档处理和向量库7.2.2 LLM调用#
from langchain_openai import ChatOpenAI
# 初始化模型
llm = ChatOpenAI(
model="gpt-4o",
temperature=0.7,
api_key="your-api-key"
)
# 基本调用
response = llm.invoke("什么是大模型?")
print(response.content)
# 流式输出
for chunk in llm.stream("讲一个关于AI的笑话"):
print(chunk.content, end="", flush=True)7.2.3 Prompt模板#
from langchain.prompts import ChatPromptTemplate
# 创建提示词模板
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个{role},请用{style}的风格回答问题。"),
("human", "{question}")
])
# 格式化
messages = prompt.invoke({
"role": "电信技术专家",
"style": "通俗易懂",
"question": "什么是5G网络切片?"
})
response = llm.invoke(messages)
print(response.content)7.2.4 Output Parser#
from langchain.output_parsers import PydanticOutputParser
from pydantic import BaseModel, Field
# 定义输出结构
class ProductInfo(BaseModel):
name: str = Field(description="产品名称")
price: float = Field(description="月费(元)")
features: list = Field(description="主要特性")
# 创建解析器
parser = PydanticOutputParser(pydantic_object=ProductInfo)
# 在提示词中使用
prompt = ChatPromptTemplate.from_messages([
("system", "根据用户描述提取产品信息。\n{format_instructions}"),
("human", "{product_description}")
]).partial(format_instructions=parser.get_format_instructions())
chain = prompt | llm | parser
result = chain.invoke({
"product_description": "5G尊享套餐,月费199元,包含100GB流量、1000分钟通话、千兆宽带"
})
print(f"产品: {result.name}, 价格: {result.price}, 特性: {result.features}")7.3 Chain(链式调用)#
7.3.1 LCEL表达式语法#
LangChain使用LCEL(LangChain Expression Language)语法,通过管道符 | 连接组件:
# 基础链:Prompt → LLM → Parser
chain = prompt | llm | StrOutputParser()
result = chain.invoke({"question": "什么是RAG?"})7.3.2 顺序链#
from langchain.chains import LLMChain
# 链1:生成技术概念解释
prompt1 = ChatPromptTemplate.from_template(
"简要解释什么是{concept},50字以内。"
)
chain1 = prompt1 | llm | StrOutputParser()
# 链2:基于解释生成示例
prompt2 = ChatPromptTemplate.from_template(
"基于以下解释,给出一个{concept}的实际应用示例:\n{explanation}"
)
chain2 = prompt2 | llm | StrOutputParser()
# 组合成顺序链
from langchain.chains import SimpleSequentialChain
overall_chain = SimpleSequentialChain(
chains=[chain1, chain2],
verbose=True
)
# 注意:SimpleSequentialChain是旧版API,新版推荐用LCEL7.3.3 LCEL方式实现顺序链#
# 新版LCEL方式
from langchain_core.runnables import RunnablePassthrough
concept_chain = (
{"explanation": prompt1 | llm | StrOutputParser(),
"concept": RunnablePassthrough()}
| prompt2
| llm
| StrOutputParser()
)
result = concept_chain.invoke("网络切片")
print(result)7.4 Memory(对话记忆)#
7.4.1 记忆类型#
| 类型 | 说明 | 适用场景 |
|---|---|---|
| Buffer Memory | 保存全部对话历史 | 短对话 |
| Buffer Window Memory | 只保留最近N轮 | 长对话,控制Token |
| Summary Memory | 自动摘要历史 | 超长对话 |
| Summary Buffer Memory | 混合模式(缓冲+摘要) | 最佳实践 |
| Token Buffer Memory | 按Token数限制 | 精确控制成本 |
| Entity Memory | 提取实体关系记忆 | 需要记住用户信息 |
7.4.2 使用记忆#
from langchain.chains import ConversationChain
from langchain.memory import ConversationBufferWindowMemory
# 创建带记忆的对话链
memory = ConversationBufferWindowMemory(k=5) # 保留最近5轮
conversation = ConversationChain(
llm=llm,
memory=memory,
verbose=True
)
# 多轮对话
print(conversation.predict(input="我叫张三,我是电信工程师"))
print(conversation.predict(input="我负责5G基站的维护"))
print(conversation.predict(input="我刚才说我是做什么的?")) # 能回忆起7.5 Tool与Agent#
7.5.1 定义工具#
from langchain.tools import tool
@tool
def search_telecom_info(query: str) -> str:
"""搜索电信业务信息。输入搜索关键词。"""
# 实际实现调用搜索API
return f"搜索结果:关于'{query}'的电信信息..."
@tool
def calculate_plan_cost(monthly_fee: float, months: int) -> str:
"""计算套餐总费用。输入月费和月数。"""
total = monthly_fee * months
return f"套餐{monthly_fee}元/月,{months}个月总费用:{total}元"
@tool
def create_trouble_ticket(issue: str, phone: str) -> str:
"""创建故障工单。输入问题描述和联系电话。"""
return f"工单已创建,问题描述:{issue},联系电话:{phone},工单号:T20260723001"
tools = [search_telecom_info, calculate_plan_cost, create_trouble_ticket]7.5.2 创建Agent#
from langchain.agents import create_tool_calling_agent, AgentExecutor
# 创建Agent
prompt = ChatPromptTemplate.from_messages([
("system", "你是电信客服助手,使用提供的工具帮助用户解决问题。"),
("human", "{input}"),
("placeholder", "{agent_scratchpad}")
])
agent = create_tool_calling_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
# 运行Agent
result = agent_executor.invoke({
"input": "199元套餐用一年多少钱?另外我家里宽带断了,帮我报修,电话13800138000"
})
print(result["output"])7.5.3 RAG + Agent组合#
from langchain_community.vectorstores import Chroma
from langchain_openai import OpenAIEmbeddings
# RAG检索工具
@tool
def search_knowledge_base(query: str) -> str:
"""从电信知识库中检索信息。输入问题关键词。"""
docs = retriever.invoke(query)
return "\n".join([doc.page_content for doc in docs])
# 组合RAG + 其他工具的Agent
all_tools = [search_knowledge_base, calculate_plan_cost, create_trouble_ticket]
rag_agent = create_tool_calling_agent(llm, all_tools, prompt)考试要点#
- 掌握LangChain三层架构和核心组件
- 能使用LCEL语法构建Chain(prompt | llm | parser)
- 掌握Prompt模板和Output Parser的使用
- 理解不同Memory类型的适用场景
- 能定义自定义Tool并创建Agent
- 能将RAG检索与Agent工具组合使用
第八章 大模型开发工具链实战(LangGraph与DeepAgent)#
8.1 LangGraph概述#
8.1.1 从LangChain到LangGraph#
8.1.1 从LangChain到LangGraph#
| 维度 | LangChain Agent | LangGraph |
|---|---|---|
| 流程模型 | 线性链 | 有向图(支持循环) |
| 状态管理 | 隐式、分散 | 显式、集中(State对象) |
| 流程控制 | 固定顺序 | 条件分支、循环、停顿 |
| 人工干预 | 困难 | 内置Human-in-the-loop |
| 持久化 | 不支持 | 内置Checkpoint |
| 适用复杂度 | 简单任务 | 复杂多步骤任务 |
8.1.2 LangGraph核心概念#
| 概念 | 说明 | 类比 |
|---|---|---|
| State(状态) | 在图中流转的全局数据 | 函数参数 |
| Node(节点) | 执行具体逻辑的函数 | 函数体 |
| Edge(边) | 节点间的连接和流转条件 | 函数调用 |
| Conditional Edge | 条件分支边 | if-else |
| Checkpoint | 状态快照(持久化) | 存档 |
| Subgraph | 子图(嵌套图) | 子函数 |
8.1.3 技术演进路线#
LangChain(基础框架)
→ LangGraph(图编排引擎)
→ DeepAgent(企业级Agent脚手架)8.2 LangGraph实战#
8.2.1 基础示例:ReAct Agent#
from langgraph.graph import StateGraph, END
from langgraph.prebuilt import ToolNode
from langchain_openai import ChatOpenAI
from langchain.tools import tool
from typing import Annotated
from typing_extensions import TypedDict
from langgraph.graph.message import add_messages
# 定义状态
class AgentState(TypedDict):
messages: Annotated[list, add_messages]
# 定义工具
@tool
def search_web(query: str) -> str:
"""搜索网络信息"""
return f"搜索结果:{query}的相关信息..."
@tool
def calculate(expression: str) -> str:
"""数学计算"""
try:
return str(eval(expression))
except:
return "计算失败"
tools = [search_web, calculate]
llm = ChatOpenAI(model="gpt-4o").bind_tools(tools)
# 定义节点函数
def agent_node(state: AgentState):
"""Agent决策节点:决定下一步做什么"""
response = llm.invoke(state["messages"])
return {"messages": [response]}
def should_continue(state: AgentState):
"""条件判断:是否调用工具"""
last_message = state["messages"][-1]
if last_message.tool_calls:
return "tools"
return END
# 构建图
workflow = StateGraph(AgentState)
workflow.add_node("agent", agent_node)
workflow.add_node("tools", ToolNode(tools))
# 设置边
workflow.set_entry_point("agent")
workflow.add_conditional_edges("agent", should_continue)
workflow.add_edge("tools", "agent") # 工具执行后回到Agent
# 编译并运行
app = workflow.compile()
# 调用
result = app.invoke({
"messages": [("user", "搜索5G-A的速度,然后计算10Gbps等于多少Mbps")]
})
for msg in result["messages"]:
print(f"{msg.type}: {msg.content}")8.2.2 多Agent协作示例#
from langgraph.graph import StateGraph, END
class TeamState(TypedDict):
task: str
research_result: str
analysis_result: str
report: str
next: str
# 研究Agent
def research_agent(state: TeamState):
"""负责信息收集和研究"""
result = llm.invoke(f"作为研究员,请收集关于'{state['task']}'的信息")
return {"research_result": result.content, "next": "analyst"}
# 分析Agent
def analysis_agent(state: TeamState):
"""负责数据分析和洞察"""
result = llm.invoke(
f"作为分析师,请分析以下研究内容并给出洞察:\n{state['research_result']}"
)
return {"analysis_result": result.content, "next": "writer"}
# 报告Agent
def writer_agent(state: TeamState):
"""负责生成最终报告"""
result = llm.invoke(
f"作为报告撰写者,基于以下研究和分析,撰写一份报告:\n"
f"研究:{state['research_result']}\n"
f"分析:{state['analysis_result']}"
)
return {"report": result.content, "next": END}
# 构建多Agent图
workflow = StateGraph(TeamState)
workflow.add_node("researcher", research_agent)
workflow.add_node("analyst", analysis_agent)
workflow.add_node("writer", writer_agent)
workflow.set_entry_point("researcher")
workflow.add_edge("researcher", "analyst")
workflow.add_edge("analyst", "writer")
workflow.add_edge("writer", END)
team_app = workflow.compile()
result = team_app.invoke({"task": "2026年AI对电信行业的影响"})
print(result["report"])8.2.3 Human-in-the-Loop(人工干预)#
# 在关键决策点加入人工审核
from langgraph.checkpoint.memory import MemorySaver
def human_review(state: AgentState):
"""人工审核节点 - 暂停等待人工确认"""
pass # 实际执行时会暂停
workflow = StateGraph(AgentState)
workflow.add_node("agent", agent_node)
workflow.add_node("review", human_review)
workflow.add_node("tools", ToolNode(tools))
workflow.set_entry_point("agent")
workflow.add_edge("agent", "review") # Agent决策后审核
workflow.add_conditional_edges("review", lambda x: "tools" if x.get("approve") else "agent")
workflow.add_edge("tools", "agent")
# 编译时启用中断
app = workflow.compile(
checkpointer=MemorySaver(),
interrupt_before=["review"] # 在review前暂停
)8.2.4 状态持久化与断点续跑#
from langgraph.checkpoint.sqlite import SqliteSaver
# 使用SQLite持久化状态
config = {"configurable": {"thread_id": "conversation-1"}}
app_with_checkpoint = workflow.compile(
checkpointer=SqliteSaver.from_conn_string("checkpoints.db")
)
# 第一次执行(可能中断)
result = app_with_checkpoint.invoke(
{"messages": [("user", "帮我分析网络故障")]},
config=config
)
# 恢复执行(从断点继续)
result = app_with_checkpoint.invoke(
{"messages": [("user", "继续")]},
config=config # 相同thread_id恢复状态
)8.3 DeepAgent框架#
8.3.1 什么是DeepAgent#
DeepAgent是2026年初LangChain团队推出的基于LangGraph的企业级Agent脚手架。它自带规划、文件上下文、子Agent、长期记忆等能力,开箱即用做长任务。
8.3.2 DeepAgent核心能力#
| 能力 | 说明 | 对比普通Agent |
|---|---|---|
| 自主规划 | 自动拆解复杂任务为子步骤 | 需手动设计流程 |
| 文件上下文 | 维护文件状态作为工作记忆 | 通常只有对话记忆 |
| 子Agent调度 | 自动创建和管理子Agent | 需手动编排 |
| 长期记忆 | 跨会话保持上下文 | 通常会话结束即丢失 |
| 断点续跑 | 任务中断后可恢复 | 通常需要从头开始 |
| 人工协作 | 关键节点可暂停等待人工 | 需额外实现 |
8.3.3 DeepAgent使用示例#
from deepagents import DeepAgent
from langchain_openai import ChatOpenAI
# 创建DeepAgent
agent = DeepAgent(
llm=ChatOpenAI(model="gpt-4o"),
tools=[search_web, calculate, create_trouble_ticket],
system_prompt="""
你是电信运维智能助手。你可以:
1. 查询网络设备状态
2. 分析告警日志
3. 创建和管理工单
4. 生成运维报告
对于复杂任务,请先制定计划,然后逐步执行。
""",
max_steps=20, # 最大执行步数
enable_memory=True, # 启用长期记忆
enable_file_context=True # 启用文件上下文
)
# 执行复杂任务
result = agent.run(
"检查昨晚所有5G基站的告警,分析根因,为重大告警创建工单,"
"最后生成运维分析报告"
)
print(result.output)
print(f"执行步骤: {result.steps}")
print(f"使用工具: {result.tools_used}")8.3.4 LangGraph + DeepAgent选择指南#
| 场景 | 推荐方案 | 理由 |
|---|---|---|
| 简单工具调用Agent | LangChain Agent | 快速上手,代码少 |
| 多步骤工作流 | LangGraph | 精确控制流程 |
| 多Agent协作 | LangGraph | 图结构编排 |
| 需要断点续跑 | LangGraph + Checkpoint | 持久化支持 |
| 长任务自治执行 | DeepAgent | 开箱即用 |
| 企业生产部署 | DeepAgent + LangGraph | 完整工程能力 |
考试要点#
- 理解LangGraph与LangChain Agent的核心区别(图vs链、状态管理)
- 掌握State、Node、Edge三个核心概念
- 能用LangGraph构建ReAct Agent
- 理解多Agent协作的编排方法
- 了解Human-in-the-Loop和断点续跑的概念
- 理解DeepAgent的企业级能力(规划、记忆、子Agent)
- 能根据场景选择合适的开发方案> AI生成
AI生成
第九章 MCP与Skills开发实战#
9.1 MCP(Model Context Protocol)协议概述#
9.1.1 什么是MCP#
MCP(Model Context Protocol,模型上下文协议)是 Anthropic 于2024年11月开源的一套标准化协议,旨在统一大模型与外部世界的交互方式。可以将其理解为**“AI世界的USB-C接口”**——只要AI应用支持MCP,就能像插U盘一样一键接入任何MCP Server提供的能力。
| 特性 | 说明 |
|---|---|
| 提出者 | Anthropic(2024年11月) |
| 协议基础 | JSON-RPC 2.0 |
| 传输方式 | stdio(本地)、Streamable HTTP(远程) |
| 行业支持 | OpenAI、Google、Microsoft、AWS全部官宣支持(2026年) |
| 核心价值 | 解决N×M集成地狱,一次开发处处可用 |
9.1.2 为什么需要MCP#
传统方式的痛点:
# 没有MCP之前:N个模型 × M个工具 = N×M个适配器
模型A → 适配器 → 数据库
模型A → 适配器 → 文件系统
模型A → 适配器 → API服务
模型B → 适配器 → 数据库 # 重复开发!
模型B → 适配器 → 文件系统 # 重复开发!
...
# 有MCP之后:N个模型 + M个MCP Server = N+M个组件
模型A ─┐
模型B ─┤── MCP协议 ──→ MCP Server(数据库)
模型C ─┘ MCP Server(文件系统)
MCP Server(API服务)9.1.3 MCP核心架构#
┌─────────────────────────────────────────────────┐
│ MCP架构 │
│ │
│ ┌──────────┐ MCP协议 ┌──────────────┐ │
│ │ MCP │ (JSON-RPC) │ MCP Server │ │
│ │ Client │ ←───────────→ │ │ │
│ │ (Claude/ │ │ - Tools │ │
│ │ Cursor/ │ │ - Resources │ │
│ │ Agent) │ │ - Prompts │ │
│ └──────────┘ └──────────────┘ │
│ │ │ │
│ ▼ ▼ │
│ 大模型决策 外部系统 │
│ (DB/FS/API) │
└─────────────────────────────────────────────────┘9.1.4 MCP三大核心抽象#
| 抽象 | 说明 | 类比 | 示例 |
|---|---|---|---|
| Tools | 可被模型调用的函数 | 函数调用 | 查询数据库、发送邮件 |
| Resources | 可被模型读取的数据源 | 文件系统 | 配置文件、日志文件 |
| Prompts | 预定义的提示词模板 | 代码模板 | 代码审查模板、分析模板 |
9.2 MCP Server开发实战#
9.2.1 环境准备#
# 安装FastMCP(2025-2026年最流行的MCP开发框架)
pip install fastmcp
# FastMCP理念类似FastAPI
# 自动分析Python函数的类型注解和文档字符串
# 编译为大模型可识别的JSON Schema9.2.2 使用FastMCP创建第一个MCP Server#
from fastmcp import FastMCP
# 创建MCP Server实例
mcp = FastMCP("电信运维助手")
# 使用装饰器注册Tool
@mcp.tool()
def query_alarm(device_id: str, hours: int = 24) -> dict:
"""查询指定设备的告警信息
Args:
device_id: 设备ID,如"SW-001"
hours: 查询最近多少小时的告警,默认24小时
Returns:
包含告警列表的字典
"""
# 模拟查询告警
alarms = [
{"time": "2026-07-22 08:30", "level": "critical", "msg": "光功率异常"},
{"time": "2026-07-22 09:15", "level": "warning", "msg": "CPU使用率>80%"},
]
return {"device_id": device_id, "count": len(alarms), "alarms": alarms}
# 注册Resource
@mcp.resource("config://device/{device_id}")
def get_device_config(device_id: str) -> str:
"""获取设备配置文件"""
return f"# 设备 {device_id} 配置\ninterface eth0\n ip address 192.168.1.1/24"
# 注册Prompt模板
@mcp.prompt()
def alarm_analysis_prompt(device_id: str) -> str:
"""生成告警分析提示词"""
return f"""请分析设备 {device_id} 的告警信息:
1. 查询最近24小时的告警
2. 按严重程度排序
3. 分析可能的根因
4. 给出处理建议"""
# 启动Server
if __name__ == "__main__":
mcp.run(transport="stdio") # 本地使用stdio传输9.2.3 FastMCP工具开发进阶#
from fastmcp import FastMCP
from pydantic import BaseModel, Field
import asyncio
mcp = FastMCP("进阶运维工具")
# 使用Pydantic模型定义复杂参数
class TroubleTicket(BaseModel):
"""工单创建参数"""
device_id: str = Field(description="故障设备ID")
alarm_type: str = Field(description="告警类型:critical/warning/info")
description: str = Field(description="故障描述")
priority: int = Field(default=3, ge=1, le=5, description="优先级1-5")
@mcp.tool()
async def create_trouble_ticket(ticket: TroubleTicket) -> dict:
"""创建运维工单
根据告警信息自动创建工单,并通知相关负责人。
"""
ticket_id = f"TKT-{ticket.device_id}-{hash(ticket.description) % 10000:04d}"
return {
"ticket_id": ticket_id,
"status": "created",
"priority": ticket.priority,
"message": f"工单已创建,优先级{ticket.priority}"
}
@mcp.tool()
async def batch_check_devices(device_ids: list[str]) -> dict:
"""批量检查设备状态
Args:
device_ids: 设备ID列表
"""
results = {}
for did in device_ids:
await asyncio.sleep(0.1)
results[did] = {"status": "online", "latency_ms": 12}
return {"total": len(device_ids), "results": results}
# 远程传输模式(生产环境推荐)
if __name__ == "__main__":
mcp.run(transport="streamable-http", host="0.0.0.0", port=8080)9.2.4 MCP Server配置与注册#
Claude Desktop配置(claude_desktop_config.json):
{
"mcpServers": {
"telecom-ops": {
"command": "python",
"args": ["path/to/telecom_mcp_server.py"],
"env": {
"DB_HOST": "192.168.1.100",
"DB_PORT": "5432"
}
},
"web-search": {
"command": "npx",
"args": ["-y", "@anthropic/mcp-web-search"]
}
}
}Cursor / VS Code配置(.mcp.json):
{
"mcpServers": {
"telecom-ops": {
"url": "http://localhost:8080/mcp",
"transport": "http"
}
}
}9.2.5 常用MCP Server一览#
| MCP Server | 功能 | 安装方式 |
|---|---|---|
| filesystem | 文件系统读写 | npx @anthropic/mcp-filesystem |
| sqlite | SQLite数据库操作 | npx @anthropic/mcp-sqlite |
| postgres | PostgreSQL数据库 | npx @anthropic/mcp-postgres |
| web-search | 网页搜索 | npx @anthropic/mcp-web-search |
| git | Git版本控制 | npx @anthropic/mcp-git |
| fetch | URL内容抓取 | npx @anthropic/mcp-fetch |
| puppeteer | 浏览器自动化 | npx @anthropic/mcp-puppeteer |
9.3 MCP Client集成#
9.3.1 Python中调用MCP Server#
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
import asyncio
async def main():
# 配置MCP Server连接
server_params = StdioServerParameters(
command="python",
args=["telecom_mcp_server.py"],
env={"DB_HOST": "192.168.1.100"}
)
# 建立连接
async with stdio_client(server_params) as (read, write):
async with ClientSession(read, write) as session:
# 初始化连接
await session.initialize()
# 列出可用工具
tools = await session.list_tools()
print("可用工具:", [t.name for t in tools.tools])
# 调用工具
result = await session.call_tool(
"query_alarm",
arguments={"device_id": "SW-001", "hours": 48}
)
print("查询结果:", result.content)
# 读取资源
resource = await session.read_resource("config://device/SW-001")
print("设备配置:", resource.contents[0].text)
# 获取提示词模板
prompt = await session.get_prompt(
"alarm_analysis_prompt",
arguments={"device_id": "SW-001"}
)
print("分析提示词:", prompt.messages)
asyncio.run(main())9.3.2 在LangChain中集成MCP#
from langchain_mcp_adapters import create_mcp_tools
from langchain_openai import ChatOpenAI
from langchain.agents import create_tool_calling_agent
import asyncio
async def create_agent_with_mcp():
# 从MCP Server加载工具
tools = await create_mcp_tools(
command="python",
args=["telecom_mcp_server.py"]
)
# 创建Agent
llm = ChatOpenAI(model="gpt-4o", temperature=0)
agent = create_tool_calling_agent(llm, tools,
system_prompt="你是电信运维助手,可以查询设备告警和管理工单。")
# 执行任务
result = await agent.ainvoke(
"查询设备SW-001最近24小时的告警,如果有关键告警请创建工单"
)
print(result)
return result
asyncio.run(create_agent_with_mcp())AI生成
9.4 Agent Skills开发#
9.4.1 什么是Agent Skills#
Agent Skills是Anthropic于2025年10月正式发布的能力扩展系统,2025年12月18日发布为开放标准。Skills本质上是文件夹形式的指令、脚本和资源集合,让大模型能够像"刚入职的专家"一样,不仅拥有通用智能,还预装了特定业务场景的专项知识与操作规范。
| 特性 | 说明 |
|---|---|
| 发布时间 | 2025年10月(Anthropic),12月开放标准 |
| 本质 | 可复用的指令包(文件夹形式) |
| 核心文件 | SKILL.md(技能定义) |
| 加载方式 | 渐进式加载(按需读取) |
| 设计原则 | 可组合、可移植、渐进式 |
9.4.2 Skills的文件结构#
my-skill/
├── SKILL.md # 核心技能定义文件(必须)
├── scripts/ # 辅助脚本
│ ├── analyze.py # 分析脚本
│ └── report.py # 报告生成脚本
├── resources/ # 资源文件
│ ├── template.xlsx # 模板文件
│ └── config.json # 配置文件
├── references/ # 参考文档
│ └── api_spec.md # API规范
└── examples/ # 示例
└── example_output.md # 输出示例9.4.3 SKILL.md结构详解#
---
name: telecom-ops-analyst
version: 1.0.0
description: 电信运维分析技能,支持告警分析、故障诊断和工单管理
author: Telecom Team
tags: [telecom, ops, alarm, troubleshooting]
tools:
- query_alarm
- create_trouble_ticket
- get_device_config
---
# 电信运维分析技能
## 概述
本技能提供电信网络运维分析能力,包括告警查询、故障根因分析、
工单创建和运维报告生成。
## 使用场景
- 设备告警批量分析
- 故障根因定位
- 自动化工单创建
- 运维报告生成
## 工作流程
### 步骤1:告警查询
1. 使用 `query_alarm` 工具查询设备告警
2. 按严重程度排序:critical > warning > info
3. 统计告警数量和类型分布
### 步骤2:根因分析
1. 分析告警关联性
2. 查询设备配置(`get_device_config`)
3. 结合网络拓扑判断故障范围
4. 参考 `references/troubleshooting_guide.md`
### 步骤3:工单创建
- 仅对critical级别告警创建工单
- 工单优先级规则:
- 核心网设备故障 → 优先级1
- 接入网设备故障 → 优先级2
- 一般告警 → 优先级3
### 步骤4:报告生成
- 使用 `scripts/report.py` 生成运维报告
- 报告模板见 `resources/template.xlsx`
- 包含:告警概览、根因分析、处理建议、工单列表
## 约束
- 不修改任何设备配置
- 仅查询和分析,不执行变更操作
- 工单创建前需确认告警真实性9.4.4 开发一个完整的Skill#
目录结构:
alarm-analysis-skill/
├── SKILL.md
├── scripts/
│ └── analyze_alarms.py
├── references/
│ └── alarm_codes.md
└── examples/
└── sample_report.mdscripts/analyze_alarms.py:
#!/usr/bin/env python3
"""告警分析脚本 - Skills辅助工具"""
import json
from datetime import datetime
from collections import Counter
def analyze_alarm_patterns(alarms: list[dict]) -> dict:
"""分析告警模式"""
level_dist = Counter(a["level"] for a in alarms)
hour_dist = Counter(
datetime.fromisoformat(a["time"]).hour for a in alarms
)
type_dist = Counter(a.get("type", "unknown") for a in alarms)
return {
"total": len(alarms),
"by_level": dict(level_dist),
"by_hour": dict(sorted(hour_dist.items())),
"by_type": dict(type_dist),
"critical_count": level_dist.get("critical", 0),
"recommendation": "建议优先处理critical告警"
if level_dist.get("critical", 0) > 0
else "当前无关键告警"
}
def generate_summary(analysis: dict) -> str:
"""生成告警摘要"""
return f"""
告警分析摘要
============
总告警数: {analysis['total']}
关键告警: {analysis['critical_count']}
告警级别分布: {analysis['by_level']}
建议: {analysis['recommendation']}
"""
if __name__ == "__main__":
sample_alarms = [
{"time": "2026-07-22T08:30:00", "level": "critical", "type": "光功率异常"},
{"time": "2026-07-22T09:15:00", "level": "warning", "type": "CPU高"},
{"time": "2026-07-22T10:00:00", "level": "warning", "type": "CPU高"},
]
analysis = analyze_alarm_patterns(sample_alarms)
print(generate_summary(analysis))9.4.5 在Claude Code中使用Skills#
# 将Skill放入项目目录
mkdir -p .claude/skills/alarm-analysis
cp -r alarm-analysis-skill/* .claude/skills/alarm-analysis/
# Claude Code会自动发现并加载SKILL.md
# 在对话中直接使用:
# "帮我分析SW-001设备的告警"
# Claude会自动加载alarm-analysis技能,按SKILL.md中定义的流程执行9.5 MCP与Skills对比与协同#
9.5.1 核心区别#
| 维度 | MCP | Skills |
|---|---|---|
| 本质 | 通信协议 | 能力模块 |
| 角色 | 标准化连接 | 领域知识封装 |
| 类比 | USB-C接口 | U盘里的软件 |
| 提供方 | MCP Server | Skill文件夹 |
| 加载时机 | 运行时连接 | 按需渐进加载 |
| 可移植性 | 跨平台协议 | 文件夹可拷贝 |
| 开发语言 | 任意(Python/TS等) | Markdown + 任意脚本 |
9.5.2 三层协同架构#
┌──────────────────────────────────────────────┐
│ 2026年AI自动化三层架构 │
│ │
│ ┌─────────┐ ┌─────────┐ ┌──────────┐ │
│ │ Agent │───→│ MCP │───→│ Skills │ │
│ │ (决策) │ │ (连接) │ │ (执行) │ │
│ └─────────┘ └─────────┘ └──────────┘ │
│ │
│ 大模型做出 MCP协议连接 Skills提供 │
│ 决策和规划 外部工具和 领域知识和 │
│ 数据源 执行脚本 │
└──────────────────────────────────────────────┘9.5.3 完整协同示例#
"""
场景:电信运维数字员工
- Agent:基于Claude Code的决策大脑
- MCP:连接监控系统、工单系统、配置数据库
- Skills:封装运维分析流程和诊断知识
"""
# 1. MCP Server提供工具能力
from fastmcp import FastMCP
mcp = FastMCP("电信运维")
@mcp.tool()
def query_alarms(area: str, level: str = "all") -> dict:
"""查询区域告警"""
return {"area": area, "alarms": [...]}
@mcp.tool()
def get_topology(device_id: str) -> dict:
"""获取网络拓扑"""
return {"device": device_id, "upstream": "...", "downstream": "..."}
@mcp.tool()
def create_ticket(device_id: str, desc: str, priority: int) -> dict:
"""创建工单"""
return {"ticket_id": "TKT-001", "status": "created"}
# 2. Skills定义工作流程(.claude/skills/ops-diagnosis/SKILL.md)
# SKILL.md中定义:
# - 告警分类规则
# - 根因分析步骤
# - 工单创建标准
# - 报告生成模板
# 3. Agent整体协调
# Claude Code加载Skills -> 连接MCP Server -> 按Skills流程执行
# 用户:"分析北京区域所有critical告警,创建工单并生成报告"
# Agent自动:
# 1. 加载ops-diagnosis技能
# 2. 调用MCP的query_alarms查询告警
# 3. 按Skills定义的分类规则分析
# 4. 调用MCP的create_ticket创建工单
# 5. 按Skills模板生成报告9.6 实操练习:构建运维MCP Server + Skill#
练习目标#
构建一个完整的"网络设备巡检"系统:
- 开发MCP Server提供设备查询、巡检、报告工具
- 开发Skill定义巡检流程和判断标准
- 在Agent中组合使用
参考实现#
MCP Server(inspect_server.py):
from fastmcp import FastMCP
from datetime import datetime
import random
mcp = FastMCP("设备巡检系统")
DEVICES = {
"SW-001": {"name": "核心交换机-A", "ip": "10.0.0.1", "area": "北京"},
"SW-002": {"name": "汇聚交换机-B", "ip": "10.0.0.2", "area": "北京"},
"RT-001": {"name": "核心路由器-A", "ip": "10.0.1.1", "area": "上海"},
}
@mcp.tool()
def list_devices(area: str = "all") -> list[dict]:
"""列出所有设备或指定区域的设备"""
if area == "all":
return [{"id": k, **v} for k, v in DEVICES.items()]
return [{"id": k, **v} for k, v in DEVICES.items() if v["area"] == area]
@mcp.tool()
def inspect_device(device_id: str) -> dict:
"""巡检指定设备,返回设备健康状态"""
if device_id not in DEVICES:
return {"error": f"设备{device_id}不存在"}
return {
"device_id": device_id,
"timestamp": datetime.now().isoformat(),
"cpu_usage": random.uniform(10, 85),
"memory_usage": random.uniform(20, 90),
"interfaces": {
"eth0": {"status": "up", "traffic_in": random.randint(100, 1000)},
"eth1": {"status": "up", "traffic_in": random.randint(100, 1000)},
"eth2": {"status": "down", "traffic_in": 0},
},
"temperature": random.uniform(25, 55),
}
@mcp.tool()
def check_connectivity(source: str, target: str) -> dict:
"""检查两台设备之间的连通性"""
return {
"source": source,
"target": target,
"reachable": random.choice([True, True, False]),
"latency_ms": random.randint(1, 100),
"packet_loss": random.uniform(0, 5),
}
@mcp.tool()
def generate_inspection_report(results: list[dict]) -> str:
"""生成巡检报告(Markdown格式)"""
report = f"# 设备巡检报告\n\n"
report += f"巡检时间: {datetime.now().strftime('%Y-%m-%d %H:%M')}\n\n"
report += f"巡检设备数: {len(results)}\n\n"
report += "| 设备ID | CPU | 内存 | 接口状态 | 温度 | 状态 |\n"
report += "|--------|-----|------|---------|------|------|\n"
for r in results:
cpu = f"{r.get('cpu_usage', 0):.1f}%"
mem = f"{r.get('memory_usage', 0):.1f}%"
ifaces = r.get('interfaces', {})
up_count = sum(1 for v in ifaces.values() if v['status'] == 'up')
total = len(ifaces)
temp = f"{r.get('temperature', 0):.1f}C"
status = "正常" if float(cpu[:-1]) < 80 and float(mem[:-1]) < 85 else "告警"
report += f"| {r.get('device_id', '?')} | {cpu} | {mem} | {up_count}/{total} | {temp} | {status} |\n"
return report
if __name__ == "__main__":
mcp.run(transport="stdio")Skill定义(SKILL.md):
---
name: device-inspection
version: 1.0.0
description: 网络设备巡检技能
---
# 网络设备巡检
## 工作流程
### 1. 获取设备列表
- 使用 `list_devices` 获取指定区域所有设备
- 记录设备ID、名称、IP地址
### 2. 逐设备巡检
- 对每台设备调用 `inspect_device`
- 判断标准:
- CPU > 80% → 告警
- 内存 > 85% → 告警
- 温度 > 50°C → 告警
- 接口down → 告警
### 3. 连通性检查
- 对核心设备之间调用 `check_connectivity`
- 丢包率 > 1% → 告警
### 4. 生成报告
- 使用 `generate_inspection_report` 汇总结果
- 报告包含:巡检概览、异常设备列表、处理建议考试要点#
- 理解MCP协议的核心概念:统一大模型与外部世界的交互标准
- 掌握MCP三大抽象:Tools(工具调用)、Resources(数据读取)、Prompts(提示模板)
- 能用FastMCP框架开发MCP Server,包括工具定义、资源注册、提示模板
- 理解MCP的传输方式:stdio(本地)和Streamable HTTP(远程)
- 掌握Agent Skills的概念:文件夹形式的可复用指令包
- 能编写SKILL.md定义技能流程,使用scripts和resources组织辅助文件
- 理解MCP与Skills的区别:MCP是通信协议,Skills是能力模块
- 掌握Agent + MCP + Skills三层协同架构:决策-连接-执行
- 能构建完整的MCP Server + Skill组合解决方案
AI生成
第十章 企业级数字员工开发基础实操#
10.1 数字员工概述#
10.1.1 什么是数字员工#
数字员工(Digital Employee)是基于大模型和Agent技术构建的AI智能体,能够像人类员工一样自主理解任务目标、制定执行计划、调用工具系统、交付工作成果。2025年被业界称为"Agent爆发元年",2026年超过85%的500强企业已在核心业务流程中部署了数字员工。
| 特征 | 传统RPA | 数字员工(AI Agent) |
|---|---|---|
| 驱动方式 | 流程驱动(固定规则) | 智能驱动(自主决策) |
| 适应性 | 流程变化需重新编程 | 自然语言理解,自适应 |
| 异常处理 | 遇异常即停止 | 自主判断并处理异常 |
| 协作方式 | 人操作RPA | 人机协同,自然语言交互 |
| 开发周期 | 数周至数月 | 数天至数周 |
| 典型代表 | UiPath、Blue Prism | 基于Dify/LangChain构建的Agent |
10.1.2 数字员工的核心能力#
┌─────────────────────────────────────────────┐
│ 数字员工核心能力模型 │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 感知能力 │ │ 认知能力 │ │ 执行能力 │ │
│ │ │ │ │ │ │ │
│ │ ·自然语言│ │ ·任务规划│ │ ·工具调用│ │
│ │ 理解 │ │ ·推理判断│ │ ·系统操作│ │
│ │ ·文档识别│ │ ·知识检索│ │ ·数据加工│ │
│ │ ·图像理解│ │ ·记忆学习│ │ ·报告生成│ │
│ └──────────┘ └──────────┘ └──────────┘ │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 协作能力 │ │ 安全能力 │ │ 进化能力 │ │
│ │ │ │ │ │ │ │
│ │ ·人机交互│ │ ·权限控制│ │ ·经验积累│ │
│ │ ·多Agent │ │ ·审计日志│ │ ·自我优化│ │
│ │ 协作 │ │ ·数据脱敏│ │ ·知识更新│ │
│ └──────────┘ └──────────┘ └──────────┘ │
└─────────────────────────────────────────────┘10.1.3 企业级数字员工应用场景#
| 场景 | 描述 | 效率提升 | 典型案例 |
|---|---|---|---|
| 智能客服 | 7×24小时客户咨询应答 | 70-85% | Klarna AI替代700名客服 |
| 运维助手 | 告警分析、故障诊断、工单管理 | 60-80% | 电信网络智能运维 |
| 数据分析 | 自动取数、报表生成、趋势洞察 | 80-90% | 经营分析报告自动化 |
| 流程审批 | 智能审核、风险评估、决策建议 | 50-70% | 财务报销自动审核 |
| 知识管理 | 知识库构建、智能问答、文档整理 | 60-75% | 企业内部知识助手 |
| 营销助手 | 内容生成、客户画像、精准推荐 | 70-85% | 个性化营销方案生成 |
10.2 数字员工技术架构#
10.2.1 整体架构#
┌──────────────────────────────────────────────────────┐
│ 企业级数字员工架构 │
│ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ 交互层 │ │
│ │ Web界面 │ API接口 │ 企微/钉钉 │ 语音/邮件 │ │
│ └──────────────────────┬──────────────────────────┘ │
│ │ │
│ ┌──────────────────────▼──────────────────────────┐ │
│ │ Agent编排层 │ │
│ │ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ │ │
│ │ │任务规划│ │工具调用│ │记忆管理│ │安全管控│ │ │
│ │ └────────┘ └────────┘ └────────┘ └────────┘ │ │
│ └──────────────────────┬──────────────────────────┘ │
│ │ │
│ ┌──────────────────────▼──────────────────────────┐ │
│ │ 能力层 │ │
│ │ RAG引擎 │ MCP工具 │ 外部API │ 数据库 │ 脚本 │ │
│ └──────────────────────┬──────────────────────────┘ │
│ │ │
│ ┌──────────────────────▼──────────────────────────┐ │
│ │ 模型层 │ │
│ │ GPT-4o │ Claude │ DeepSeek │ Qwen │ 本地模型 │ │
│ └─────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ 基础设施层 │ │
│ │ 向量数据库 │ 对象存储 │ 消息队列 │ 监控告警 │ │
│ └─────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────┘10.2.2 ReAct认知循环#
数字员工的"智能"核心来自ReAct(Reason + Act)认知循环:
用户输入: "查询北京区域所有critical告警,创建工单并通知值班人员"
┌──────────────────────────────────────────┐
│ ReAct认知循环 │
│ │
│ Thought: 我需要先查询北京区域的告警 │
│ ↓ │
│ Action: query_alarms(area="北京", │
│ level="critical") │
│ ↓ │
│ Observation: 返回3条critical告警 │
│ ↓ │
│ Thought: 有3条关键告警,需要创建工单 │
│ ↓ │
│ Action: create_ticket(device_id="SW-001",│
│ desc="光功率异常", priority=1) │
│ ↓ │
│ Observation: 工单TKT-001已创建 │
│ ↓ │
│ Thought: 需要通知值班人员 │
│ ↓ │
│ Action: send_notification( │
│ channel="企微", │
│ message="3条关键告警已建工单") │
│ ↓ │
│ Observation: 通知已发送 │
│ ↓ │
│ Answer: 已查询到3条关键告警,创建了3张 │
│ 工单并通知了值班人员。 │
└──────────────────────────────────────────┘10.2.3 企业级设计原则#
| 原则 | 说明 | 实现要点 |
|---|---|---|
| 可靠性 | 产出稳定、结果可信赖 | 工具调用重试机制、结果校验、兜底策略 |
| 安全性 | 权限管控、数据保护 | RBAC角色控制、敏感数据脱敏、操作审计 |
| 可观测 | 全链路可追踪 | 调用日志、性能监控、异常告警 |
| 可集成 | 融入现有系统 | 标准API、MCP协议、企微/钉钉对接 |
| 可进化 | 持续优化能力 | 反馈收集、知识更新、模型迭代 |
10.3 基于Dify开发数字员工#
10.3.1 Dify数字员工开发流程#
┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
│ 1.定义角色│→│ 2.配置工具│→│ 3.设计流程│→│ 4.测试部署│
│ │ │ │ │ │ │ │
│ ·角色定位 │ │ ·API工具 │ │ ·工作流 │ │ ·对话测试│
│ ·系统提示词│ │ ·数据库 │ │ ·知识库 │ │ ·压力测试│
│ ·能力边界 │ │ ·外部服务 │ │ ·条件分支 │ │ ·上线发布│
└──────────┘ └──────────┘ └──────────┘ └──────────┘10.3.2 定义数字员工角色#
在Dify中创建Agent应用,编写系统提示词:
# 数字员工:电信运维助手
name: "运维管家小智"
description: "7x24小时电信网络运维智能助手"
system_prompt: |
你是"运维管家小智",一位专业的电信网络运维数字员工。
## 你的职责
1. 监控网络设备告警,实时响应
2. 分析告警根因,提供诊断建议
3. 自动创建和跟踪运维工单
4. 生成运维分析报告
5. 协助值班人员进行故障处理
## 工作规范
- critical告警:5分钟内响应,立即创建工单并通知
- warning告警:15分钟内响应,分析原因并记录
- info告警:汇总分析,定期报告
- 所有操作需记录日志,确保可追溯
## 语言风格
- 专业简洁,使用标准运维术语
- 重要信息用【】标注
- 数字数据精确到小数点后1位
## 安全约束
- 不执行任何设备配置变更操作
- 不泄露客户隐私数据
- 工单创建前需二次确认
tools:
- query_alarms # 查询告警
- analyze_root_cause # 根因分析
- create_ticket # 创建工单
- send_notification # 发送通知
- generate_report # 生成报告
- search_kb # 知识库检索
knowledge_base:
- "运维知识库" # 故障处理手册、设备文档
- "告警代码库" # 告警代码对照表10.3.3 配置工具与知识库#
# Dify自定义工具配置示例(通过API扩展)
# 工具1:查询告警
{
"name": "query_alarms",
"description": "查询指定区域和级别的网络告警",
"parameters": {
"type": "object",
"properties": {
"area": {"type": "string", "description": "区域:北京/上海/广州"},
"level": {"type": "string", "enum": ["critical", "warning", "info", "all"]}
},
"required": ["area"]
},
"api": {
"url": "http://monitor-api.internal/alarms",
"method": "GET",
"headers": {"Authorization": "Bearer ${API_KEY}"}
}
}
# 工具2:创建工单
{
"name": "create_ticket",
"description": "创建运维工单",
"parameters": {
"type": "object",
"properties": {
"device_id": {"type": "string"},
"description": {"type": "string"},
"priority": {"type": "integer", "minimum": 1, "maximum": 5}
},
"required": ["device_id", "description"]
}
}10.3.4 Dify工作流编排#
# Dify工作流:告警自动处理流程
[触发器: 告警webhook]
│
▼
[节点1: 告警分类] ──→ LLM判断告警级别
│
├──critical──→ [节点2: 创建工单] ──→ [节点3: 通知值班] ──→ [节点4: 记录日志]
│
├──warning───→ [节点5: 分析原因] ──→ [节点6: 记录日志]
│
└──info──────→ [节点7: 汇总统计] ──→ [节点8: 日报生成]10.4 基于LangChain开发数字员工#
10.4.1 基础Agent数字员工#
from langchain_openai import ChatOpenAI
from langchain.agents import create_tool_calling_agent, AgentExecutor
from langchain.tools import Tool
from langchain.prompts import ChatPromptTemplate
# 1. 定义工具
def query_alarms(area: str, level: str = "all") -> str:
"""查询指定区域的网络告警"""
# 模拟查询
return f"区域{area}共有{level}级别告警3条:\n1. [critical] SW-001 光功率异常\n2. [warning] SW-002 CPU>80%\n3. [warning] RT-001 温度偏高"
def create_ticket(device_id: str, description: str, priority: int = 3) -> str:
"""创建运维工单"""
return f"工单已创建:TKT-{device_id}-{priority},描述:{description},优先级:{priority}"
def search_kb(query: str) -> str:
"""检索运维知识库"""
return f"知识库匹配结果:光功率异常通常由光纤连接松动或光模块故障引起,建议:1.检查光纤接头 2.更换光模块 3.联系线路维护"
def send_notification(channel: str, message: str) -> str:
"""发送通知"""
return f"通知已发送至{channel}:{message}"
tools = [
Tool(name="query_alarms", func=lambda **kw: query_alarms(**kw), description="查询网络告警"),
Tool(name="create_ticket", func=lambda **kw: create_ticket(**kw), description="创建运维工单"),
Tool(name="search_kb", func=lambda **kw: search_kb(**kw), description="检索知识库"),
Tool(name="send_notification", func=lambda **kw: send_notification(**kw), description="发送通知"),
]
# 2. 创建Agent
llm = ChatOpenAI(model="gpt-4o", temperature=0)
prompt = ChatPromptTemplate.from_messages([
("system", """你是"运维管家小智",电信网络运维数字员工。
工作规范:
- critical告警:立即创建优先级1的工单并通知值班人员
- 工单创建前查阅知识库获取处理建议
- 所有操作简洁专业
可用工具:{tool_names}
{tools}"""),
("human", "{input}"),
("assistant", "{agent_scratchpad}"),
])
agent = create_tool_calling_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True, max_iterations=10)
# 3. 执行任务
result = agent_executor.invoke({
"input": "查询北京区域所有告警,critical级别的创建工单并通知值班人员"
})
print(result["output"])10.4.2 添加记忆与个性化#
from langchain.memory import ConversationSummaryMemory
from langchain_community.vectorstores import Chroma
from langchain_openai import OpenAIEmbeddings
# 对话记忆(摘要式)
memory = ConversationSummaryMemory(
llm=llm,
memory_key="chat_history",
return_messages=True
)
# 长期记忆(向量检索)
vectorstore = Chroma(
collection_name="employee_memory",
embedding_function=OpenAIEmbeddings()
)
# 存储经验
def save_experience(task: str, solution: str, outcome: str):
"""保存处理经验到长期记忆"""
vectorstore.add_texts([
f"任务: {task}\n方案: {solution}\n结果: {outcome}"
], metadatas=[{"type": "experience", "date": "2026-07-22"}])
# 检索经验
def recall_experience(query: str, k: int = 3) -> str:
"""从长期记忆中检索相关经验"""
docs = vectorstore.similarity_search(query, k=k)
return "\n---\n".join(d.page_content for d in docs)
# 将记忆工具加入Agent
memory_tools = tools + [
Tool(name="recall_experience", func=recall_experience,
description="检索过往处理经验"),
Tool(name="save_experience", func=lambda **kw: (save_experience(**kw), "经验已保存")[1],
description="保存处理经验")
]10.4.3 添加安全管控#
from functools import wraps
import logging
# 操作审计日志
audit_logger = logging.getLogger("digital_employee_audit")
audit_logger.setLevel(logging.INFO)
handler = logging.FileHandler("audit.log", encoding="utf-8")
audit_logger.addHandler(handler)
def audit_log(action: str):
"""操作审计装饰器"""
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
audit_logger.info(f"[{action}] 参数: {kwargs}")
result = func(*args, **kwargs)
audit_logger.info(f"[{action}] 结果: {result[:100]}")
return result
return wrapper
return decorator
# 权限控制
class PermissionManager:
def __init__(self):
self.permissions = {
"viewer": ["query_alarms", "search_kb", "recall_experience"],
"operator": ["query_alarms", "search_kb", "create_ticket", "send_notification", "recall_experience"],
"admin": ["*"] # 全部权限
}
def check_permission(self, role: str, action: str) -> bool:
allowed = self.permissions.get(role, [])
return "*" in allowed or action in allowed
# 敏感数据脱敏
import re
def mask_sensitive(text: str) -> str:
"""脱敏处理"""
text = re.sub(r'\b\d{11}\b', '***-****-****', text) # 手机号
text = re.sub(r'\b\d{18}\b', '******************', text) # 身份证
text = re.sub(r'\b\d{16,19}\b', '****-****-****-****', text) # 银行卡
return text
# 应用安全包装
permission_mgr = PermissionManager()
@audit_log("create_ticket")
def secure_create_ticket(device_id: str, description: str, priority: int = 3,
operator_role: str = "operator") -> str:
if not permission_mgr.check_permission(operator_role, "create_ticket"):
return "权限不足:当前角色无法创建工单"
description = mask_sensitive(description)
return create_ticket(device_id, description, priority)10.5 数字员工开发实操:运维报告助手#
10.5.1 需求分析#
| 需求项 | 描述 |
|---|---|
| 输入 | 时间范围、区域、设备类型 |
| 输出 | Markdown格式运维报告 |
| 功能 | 告警统计、趋势分析、TOP问题、处理建议 |
| 部署 | Dify或LangChain部署,支持企微调用 |
10.5.2 完整实现#
from langchain_openai import ChatOpenAI
from langchain.agents import create_tool_calling_agent, AgentExecutor
from langchain.tools import Tool
from langchain.prompts import ChatPromptTemplate
from datetime import datetime, timedelta
import json
# ===== 数据层(模拟) =====
MOCK_DATA = {
"alarms": [
{"time": "2026-07-22 08:30", "device": "SW-001", "area": "北京",
"level": "critical", "type": "光功率异常", "status": "已处理"},
{"time": "2026-07-22 09:15", "device": "SW-002", "area": "北京",
"level": "warning", "type": "CPU高", "status": "处理中"},
{"time": "2026-07-22 10:00", "device": "RT-001", "area": "上海",
"level": "critical", "type": "链路中断", "status": "已处理"},
{"time": "2026-07-22 14:30", "device": "SW-003", "area": "北京",
"level": "warning", "type": "内存高", "status": "已处理"},
{"time": "2026-07-22 16:00", "device": "RT-002", "area": "广州",
"level": "info", "type": "配置变更", "status": "已记录"},
]
}
# ===== 工具层 =====
def get_alarm_stats(area: str = "all", days: int = 1) -> str:
"""获取告警统计数据"""
alarms = [a for a in MOCK_DATA["alarms"] if area == "all" or a["area"] == area]
stats = {
"total": len(alarms),
"critical": sum(1 for a in alarms if a["level"] == "critical"),
"warning": sum(1 for a in alarms if a["level"] == "warning"),
"info": sum(1 for a in alarms if a["level"] == "info"),
"resolved": sum(1 for a in alarms if a["status"] == "已处理"),
"pending": sum(1 for a in alarms if a["status"] != "已处理"),
}
return json.dumps(stats, ensure_ascii=False)
def get_top_issues(area: str = "all", top_n: int = 5) -> str:
"""获取TOP问题列表"""
alarms = [a for a in MOCK_DATA["alarms"] if area == "all" or a["area"] == area]
from collections import Counter
type_counter = Counter(a["type"] for a in alarms)
top = type_counter.most_common(top_n)
return json.dumps([{"type": t, "count": c} for t, c in top], ensure_ascii=False)
def get_device_list(area: str = "all") -> str:
"""获取设备列表"""
devices = list(set(a["device"] for a in MOCK_DATA["alarms"]
if area == "all" or a["area"] == area))
return json.dumps(devices, ensure_ascii=False)
# ===== Agent层 =====
llm = ChatOpenAI(model="gpt-4o", temperature=0)
tools = [
Tool(name="get_alarm_stats", func=lambda **kw: get_alarm_stats(**kw),
description="获取告警统计数据,参数:area(区域), days(天数)"),
Tool(name="get_top_issues", func=lambda **kw: get_top_issues(**kw),
description="获取TOP问题列表,参数:area(区域), top_n(数量)"),
Tool(name="get_device_list", func=lambda **kw: get_device_list(**kw),
description="获取设备列表,参数:area(区域)"),
]
prompt = ChatPromptTemplate.from_messages([
("system", """你是运维报告生成助手。请根据查询到的数据,生成规范的运维报告。
报告格式:
# 运维分析报告
## 一、告警概览
(统计表格)
## 二、TOP问题分析
(问题列表和分析)
## 三、处理情况
(已处理/未处理统计)
## 四、改进建议
(针对性建议)
要求:数据准确,分析有深度,建议可操作。使用Markdown格式。"),
("human", "{input}"),
("assistant", "{agent_scratchpad}"),
])
agent = create_tool_calling_agent(llm, tools, prompt)
executor = AgentExecutor(agent=agent, tools=tools, verbose=True, max_iterations=10)
# ===== 执行 =====
result = executor.invoke({
"input": "生成北京区域今天的运维分析报告"
})
print(result["output"])10.5.3 部署与集成#
# 通过FastAPI部署为Web服务
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI(title="运维数字员工API")
class ReportRequest(BaseModel):
area: str = "all"
days: int = 1
template: str = "standard"
@app.post("/api/report/generate")
async def generate_report(req: ReportRequest):
result = executor.invoke({
"input": f"生成{req.area}区域最近{req.days}天的运维报告"
})
return {"status": "success", "report": result["output"]}
@app.post("/api/alarm/query")
async def query_alarm_api(area: str = "all", level: str = "all"):
stats = get_alarm_stats(area=area)
return {"status": "success", "data": json.loads(stats)}
# 企微/钉钉webhook对接
@app.post("/api/webhook/wechat")
async def wechat_webhook(message: str):
"""企业微信消息回调"""
result = executor.invoke({"input": message})
return {"msgtype": "text", "text": {"content": result["output"]}}考试要点#
- 理解数字员工的定义:基于大模型和Agent技术的自主AI智能体
- 掌握数字员工与传统RPA的核心区别(智能驱动vs流程驱动)
- 理解数字员工六大核心能力(感知、认知、执行、协作、安全、进化)
- 掌握ReAct认知循环的工作原理(Thought→Action→Observation→Answer)
- 能用Dify创建数字员工(定义角色、配置工具、编排工作流)
- 能用LangChain开发数字员工(工具定义、Agent创建、记忆管理)
- 理解企业级设计原则(可靠性、安全性、可观测、可集成、可进化)
- 掌握安全管控实现(审计日志、权限控制、数据脱敏)
- 能开发完整的数字员工应用(需求分析→工具开发→Agent编排→部署上线)
AI生成
第十一章 进阶实操-多智能体数字员工运维场景#
11.1 多智能体系统概述#
11.1.1 为什么需要多智能体#
单个Agent在处理简单任务时表现出色,但面对复杂的企业级运维场景时存在明显局限性:
| 维度 | 单Agent | 多Agent系统 |
|---|---|---|
| 任务复杂度 | 适合线性、单步任务 | 适合并行、多领域协作任务 |
| 专业性 | 一个Agent处理所有领域 | 每个Agent专注一个领域 |
| 可扩展性 | 工具增多时Prompt膨胀 | 按需添加新Agent |
| 容错性 | 单点失败 | Agent间可互补 |
| 执行效率 | 串行执行 | 可并行执行 |
| 上下文管理 | 上下文易溢出 | 各Agent独立上下文 |
11.1.2 多智能体系统的定义#
多智能体系统(Multi-Agent System, MAS)是由多个自主智能体组成的系统,每个智能体具备独立的目标、能力和知识,通过协作、协商或竞争完成单个智能体无法完成的复杂任务。
┌────────────────────────────────────────────────────┐
│ 多智能体运维系统 │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 监控Agent │ │ 诊断Agent │ │ 修复Agent │ │
│ │ │ │ │ │ │ │
│ │·告警监控 │ │·根因分析 │ │·自动修复 │ │
│ │·异常检测 │ │·影响评估 │ │·变更执行 │ │
│ └─────┬────┘ └─────┬────┘ └─────┬────┘ │
│ │ │ │ │
│ └─────────────┼─────────────┘ │
│ ▼ │
│ ┌──────────────┐ │
│ │ 协调者Agent │ │
│ │ │ │
│ │ ·任务分发 │ │
│ │ ·结果汇总 │ │
│ │ ·冲突调解 │ │
│ └──────┬───────┘ │
│ ▼ │
│ ┌──────────────┐ │
│ │ 报告Agent │ │
│ │ ·分析报告生成 │ │
│ │ ·趋势预测 │ │
│ └──────────────┘ │
└────────────────────────────────────────────────────┘11.1.3 运维场景中的多智能体价值#
| 场景 | 涉及Agent | 价值 |
|---|---|---|
| 网络故障诊断 | 监控+诊断+知识库 | 从发现到定位缩短80%时间 |
| 自动巡检 | 巡检+分析+报告 | 7×24无人值守巡检 |
| 容量预警 | 监控+预测+规划 | 提前7天预警容量瓶颈 |
| 安全审计 | 检测+分析+处置 | 实时威胁发现与阻断 |
| 变更审核 | 评估+验证+执行 | 降低变更风险50%+ |
11.2 多智能体架构模式#
11.2.1 常见编排模式#
模式1:协调者模式(Orchestrator)
┌──────────┐
│ 协调者 │
│ Agent │
└──┬───┬───┘
│ │
┌───────┤ ├───────┐
▼ ▼ ▼ ▼
┌──────┐┌──────┐┌──────┐┌──────┐
│Agent1││Agent2││Agent3││Agent4│
└──────┘└──────┘└──────┘└──────┘
# 特点:中心化控制,协调者负责任务分发和结果汇总
# 适用:流程明确的场景模式2:流水线模式(Pipeline)
┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐
│Agent1│───→│Agent2│───→│Agent3│───→│Agent4│
│监控 │ │诊断 │ │决策 │ │执行 │
└──────┘ └──────┘ └──────┘ └──────┘
# 特点:串行流转,每个Agent处理特定阶段
# 适用:有明确处理流程的场景模式3:对等协作模式(Peer-to-Peer)
┌──────┐
│Agent1│←──→┌──────┐
└──┬───┘ │Agent2│
│ └──┬───┘
▼ ▼
┌──────┐ ┌──────┐
│Agent3│←──→│Agent4│
└──────┘ └──────┘
# 特点:Agent间直接通信,无中心控制
# 适用:需要即时协商的场景模式4:层级模式(Hierarchical)
┌──────────┐
│ 主管Agent │
└──┬───┬───┘
│ │
┌──────┘ └──────┐
▼ ▼
┌──────────┐ ┌──────────┐
│ 团队Leader│ │ 团队Leader│
│ Agent A │ │ Agent B │
└──┬───┬───┘ └──┬───┬───┘
│ │ │ │
▼ ▼ ▼ ▼
┌───┐┌───┐ ┌───┐┌───┐
│A1 ││A2 │ │B1 ││B2 │
└───┘└───┘ └───┘└───┘
# 特点:分层管理,上级Agent可调度下级
# 适用:大型复杂组织场景11.2.2 模式选择指南#
| 场景特征 | 推荐模式 | 理由 |
|---|---|---|
| 流程明确、步骤固定 | 流水线 | 清晰可控 |
| 需要统一决策 | 协调者 | 中心化管理 |
| Agent间需即时协商 | 对等协作 | 低延迟通信 |
| 大规模、多层级 | 层级模式 | 分而治之 |
| 混合场景 | 协调者+流水线 | 灵活组合 |
11.3 运维场景中的多智能体设计#
11.3.1 网络故障自动诊断系统设计#
┌─────────────────────────────────────────────────────────┐
│ 网络故障自动诊断多Agent系统 │
│ │
│ ┌─────────────┐ │
│ │ 监控Agent │ ← 告警Webhook / 定时轮询 │
│ │ │ │
│ │ ·接收告警 │ │
│ │ ·初步分类 │ │
│ │ ·去重过滤 │ │
│ └──────┬───────┘ │
│ │ │
│ ▼ │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ 诊断Agent A │ │ 诊断Agent B │ │
│ │ (传输专家) │ │ (设备专家) │ │
│ │ │ │ │ │
│ │ ·光路分析 │ │ ·硬件诊断 │ │
│ │ ·链路状态 │ │ ·性能分析 │ │
│ │ ·拓扑排查 │ │ ·日志分析 │ │
│ └──────┬───────┘ └──────┬───────┘ │
│ │ │ │
│ └──────────┬──────────┘ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ 知识库Agent │ │
│ │ │ │
│ │ ·检索历史案例 │ │
│ │ ·匹配处理方案 │ │
│ │ ·更新知识库 │ │
│ └────────┬────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────┐ ┌─────────────────┐ │
│ │ 决策Agent │────→│ 执行Agent │ │
│ │ │ │ │ │
│ │ ·方案选择 │ │ ·工单创建 │ │
│ │ ·风险评估 │ │ ·通知发送 │ │
│ │ ·人工审核请求 │ │ ·自动修复 │ │
│ └─────────────────┘ └─────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ 报告Agent │ │
│ │ │ │
│ │ ·处理报告生成 │ │
│ │ ·经验存档 │ │
│ └─────────────────┘ │
└─────────────────────────────────────────────────────────┘11.3.2 Agent职责定义#
| Agent名称 | 职责 | 输入 | 输出 | 可用工具 |
|---|---|---|---|---|
| 监控Agent | 告警接收、分类、去重 | 告警Webhook | 分类后的告警 | query_alarm, classify_alarm |
| 诊断Agent-A | 传输层故障诊断 | 传输相关告警 | 诊断报告 | check_link, get_topology |
| 诊断Agent-B | 设备层故障诊断 | 设备相关告警 | 诊断报告 | check_hardware, get_logs |
| 知识库Agent | 历史案例检索 | 诊断信息 | 匹配方案 | search_kb, get_history |
| 决策Agent | 方案选择与风险评估 | 诊断报告+历史方案 | 执行方案 | risk_assess |
| 执行Agent | 方案执行 | 执行方案 | 执行结果 | create_ticket, auto_fix |
| 报告Agent | 报告生成与经验存档 | 全流程数据 | 运维报告 | generate_report, save_case |
AI生成
11.4 基于LangGraph的多智能体实现#
11.4.1 状态定义#
from typing import TypedDict, Annotated, Literal
from langgraph.graph import StateGraph, END
from langchain_openai import ChatOpenAI
from langchain.tools import Tool
import operator
class OpsState(TypedDict):
"""运维多Agent系统共享状态"""
# 输入
alarm: dict # 原始告警信息
alarm_type: str # 告警分类
# 诊断结果
diag_link: str # 传输诊断结果
diag_device: str # 设备诊断结果
# 知识库匹配
similar_cases: str # 历史相似案例
recommended_fix: str # 推荐修复方案
# 决策
action_plan: str # 执行方案
risk_level: str # 风险等级
need_human: bool # 是否需要人工
# 执行
execution_result: str # 执行结果
# 报告
final_report: str # 最终报告11.4.2 各Agent节点实现#
from langchain_openai import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
llm = ChatOpenAI(model="gpt-4o", temperature=0)
# ===== 1. 监控Agent =====
def monitor_agent(state: OpsState) -> dict:
"""接收告警,进行分类和去重"""
alarm = state["alarm"]
prompt = ChatPromptTemplate.from_template("""
你是网络监控Agent。请对以下告警进行分类:
告警信息:{alarm}
分类标准:
- "link": 传输链路类(光功率、链路中断、带宽异常等)
- "device": 设备硬件类(CPU、内存、温度、硬件故障等)
- "security": 安全类(异常访问、攻击等)
- "other": 其他
只返回分类结果(link/device/security/other)。
""")
result = (prompt | llm).invoke({"alarm": str(alarm)})
return {"alarm_type": result.content.strip()}
# ===== 2. 传输诊断Agent =====
def link_diagnostic_agent(state: OpsState) -> dict:
"""传输层故障诊断"""
alarm = state["alarm"]
prompt = ChatPromptTemplate.from_template("""
你是传输网络诊断专家。请分析以下告警:
告警:{alarm}
诊断步骤:
1. 分析告警特征
2. 判断可能的故障点(光路、光模块、链路质量)
3. 给出初步诊断结论
请输出诊断报告(200字内)。
""")
result = (prompt | llm).invoke({"alarm": str(alarm)})
return {"diag_link": result.content}
# ===== 3. 设备诊断Agent =====
def device_diagnostic_agent(state: OpsState) -> dict:
"""设备层故障诊断"""
alarm = state["alarm"]
prompt = ChatPromptTemplate.from_template("""
你是设备硬件诊断专家。请分析以下告警:
告警:{alarm}
诊断步骤:
1. 分析设备类型和告警指标
2. 判断硬件健康状态
3. 检查性能瓶颈
4. 给出诊断结论
请输出诊断报告(200字内)。
""")
result = (prompt | llm).invoke({"alarm": str(alarm)})
return {"diag_device": result.content}
# ===== 4. 知识库Agent =====
def knowledge_agent(state: OpsState) -> dict:
"""历史案例检索和方案推荐"""
alarm = state["alarm"]
diag = state.get("diag_link", "") + "\n" + state.get("diag_device", "")
prompt = ChatPromptTemplate.from_template("""
你是运维知识库Agent。基于以下信息检索匹配的处理方案:
告警:{alarm}
诊断结果:{diag}
请模拟检索知识库,提供:
1. 最可能的2个历史案例
2. 推荐的处理方案
3. 预计恢复时间
""")
result = (prompt | llm).invoke({"alarm": str(alarm), "diag": diag})
return {
"similar_cases": result.content,
"recommended_fix": result.content
}
# ===== 5. 决策Agent =====
def decision_agent(state: OpsState) -> dict:
"""方案选择与风险评估"""
prompt = ChatPromptTemplate.from_template("""
你是运维决策Agent。基于以下信息制定执行方案:
诊断结果-传输:{diag_link}
诊断结果-设备:{diag_device}
推荐方案:{recommended_fix}
请制定执行方案:
1. 选择最优处理方案
2. 评估风险(low/medium/high)
3. 是否需要人工介入(true/false)
4. 具体执行步骤
格式:
风险等级:[low/medium/high]
需要人工:[true/false]
执行方案:...
""")
result = (prompt | llm).invoke({
"diag_link": state.get("diag_link", ""),
"diag_device": state.get("diag_device", ""),
"recommended_fix": state.get("recommended_fix", "")
})
content = result.content
risk = "low"
need_human = False
if "high" in content.lower():
risk = "high"
need_human = True
elif "medium" in content.lower():
risk = "medium"
return {
"action_plan": content,
"risk_level": risk,
"need_human": need_human
}
# ===== 6. 执行Agent =====
def execution_agent(state: OpsState) -> dict:
"""执行处理方案"""
plan = state["action_plan"]
need_human = state.get("need_human", False)
if need_human:
return {"execution_result": "已通知值班人员,等待人工处理。方案已发送至企微群。"}
prompt = ChatPromptTemplate.from_template("""
你是执行Agent。请执行以下方案(模拟执行):
方案:{plan}
请模拟执行并返回执行结果,包括:
1. 创建的工单号
2. 发送的通知
3. 执行的操作
4. 执行结果(成功/失败)
""")
result = (prompt | llm).invoke({"plan": plan})
return {"execution_result": result.content}
# ===== 7. 报告Agent =====
def report_agent(state: OpsState) -> dict:
"""生成运维报告"""
prompt = ChatPromptTemplate.from_template("""
你是报告Agent。请基于以下信息生成运维处理报告:
原始告警:{alarm}
诊断结果-传输:{diag_link}
诊断结果-设备:{diag_device}
历史案例:{similar_cases}
执行方案:{action_plan}
执行结果:{execution_result}
生成Markdown格式报告,包含:
# 故障处理报告
## 一、故障概述
## 二、诊断过程
## 三、处理方案
## 四、执行结果
## 五、经验总结
""")
result = (prompt | llm).invoke({
"alarm": str(state["alarm"]),
"diag_link": state.get("diag_link", ""),
"diag_device": state.get("diag_device", ""),
"similar_cases": state.get("similar_cases", ""),
"action_plan": state.get("action_plan", ""),
"execution_result": state.get("execution_result", "")
})
return {"final_report": result.content}11.4.3 工作流编排#
from langgraph.graph import StateGraph, END
# 构建工作流图
workflow = StateGraph(OpsState)
# 添加所有Agent节点
workflow.add_node("monitor", monitor_agent)
workflow.add_node("diag_link", link_diagnostic_agent)
workflow.add_node("diag_device", device_diagnostic_agent)
workflow.add_node("knowledge", knowledge_agent)
workflow.add_node("decision", decision_agent)
workflow.add_node("execution", execution_agent)
workflow.add_node("report", report_agent)
# 设置入口
workflow.set_entry_point("monitor")
# 监控Agent根据告警类型路由到不同诊断Agent
def route_by_alarm_type(state: OpsState) -> str:
alarm_type = state.get("alarm_type", "other")
if alarm_type == "link":
return "diag_link"
elif alarm_type == "device":
return "diag_device"
else:
return "diag_link" # 默认都诊断
workflow.add_conditional_edges(
"monitor",
route_by_alarm_type,
{
"diag_link": "diag_link",
"diag_device": "diag_device",
}
)
# 诊断完成后进入知识库检索
# 注意:两个诊断Agent可能有不同的路由,需要汇聚到knowledge
workflow.add_edge("diag_link", "knowledge")
workflow.add_edge("diag_device", "knowledge")
# 知识库 -> 决策 -> 执行 -> 报告
workflow.add_edge("knowledge", "decision")
workflow.add_edge("decision", "execution")
workflow.add_edge("execution", "report")
workflow.add_edge("report", END)
# 编译
ops_app = workflow.compile()11.4.4 执行多Agent系统#
# 模拟告警
alarm = {
"time": "2026-07-22 08:30:00",
"device_id": "SW-001",
"area": "北京",
"level": "critical",
"type": "光功率异常",
"value": "-28.5dBm",
"threshold": "-25.0dBm",
"description": "核心交换机SW-001光口功率低于阈值"
}
# 执行多Agent工作流
result = ops_app.invoke({"alarm": alarm})
# 输出最终报告
print("=" * 60)
print("多Agent协作执行完成")
print("=" * 60)
print(f"告警类型: {result.get('alarm_type', 'N/A')}")
print(f"风险等级: {result.get('risk_level', 'N/A')}")
print(f"需要人工: {result.get('need_human', 'N/A')}")
print("\n" + "=" * 60)
print("处理报告:")
print("=" * 60)
print(result.get("final_report", "无报告"))11.4.5 添加Human-in-the-Loop#
from langgraph.checkpoint.memory import MemorySaver
# 在决策节点前暂停,等待人工确认
workflow_with_hitl = StateGraph(OpsState)
# ... 添加所有节点 ...
# 决策后暂停,等待人工审核
workflow_with_hitl.add_edge("decision", "human_review")
workflow_with_hitl.add_node("human_review", lambda state: state) # 占位
workflow_with_hitl.add_conditional_edges(
"human_review",
lambda state: "execution" if not state.get("need_human") or state.get("approved") else END
)
# 编译时启用中断
app_with_hitl = workflow_with_hitl.compile(
checkpointer=MemorySaver(),
interrupt_before=["human_review"]
)
# 第一次执行(在human_review前暂停)
config = {"configurable": {"thread_id": "alarm-001"}}
result = app_with_hitl.invoke({"alarm": alarm}, config=config)
# 人工审核结果
print("决策方案:", result.get("action_plan"))
print("风险等级:", result.get("risk_level"))
# 人工确认后继续执行
result = app_with_hitl.invoke(
{"approved": True}, # 人工批准
config=config
)
print("最终报告:", result.get("final_report"))11.5 实操案例:网络故障自动诊断与自愈系统#
11.5.1 系统架构#
┌────────────────────────────────────────────────────────────┐
│ 网络故障自动诊断与自愈系统 │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 告警 │→│ 分诊 │→│ 诊断团队 │→│ 决策 │ │
│ │ 接收 │ │ Agent │ │ │ │ Agent │ │
│ │ Agent │ │ │ │ ┌────────┐│ │ │ │
│ │ │ │ ·分类 │ │ │传输诊断││ │ ·方案选择│ │
│ │ ·监听 │ │ ·去重 │ │ │ Agent ││ │ ·风险评估│ │
│ │ ·解析 │ │ ·升级 │ │ ├────────┤│ │ ·人工请求│ │
│ │ │ │ │ │ │设备诊断││ │ │ │
│ └──────────┘ └──────────┘ │ │ Agent ││ └────┬─────┘ │
│ │ ├────────┤│ │ │
│ │ │知识库 ││ ▼ │
│ │ │ Agent ││ ┌──────────┐ │
│ │ └────────┘│ │ 执行 │ │
│ └───────────┘ │ Agent │ │
│ │ │ │
│ │ ·自动修复│ │
│ │ ·工单创建│ │
│ │ ·通知发送│ │
│ └────┬─────┘ │
│ │ │
│ ▼ │
│ ┌──────────┐ │
│ │ 报告 │ │
│ │ Agent │ │
│ │ ·报告生成│ │
│ │ ·经验存档│ │
│ └──────────┘ │
└────────────────────────────────────────────────────────────┘11.5.2 完整实现#
"""
网络故障自动诊断与自愈系统
基于LangGraph的多智能体协作实现
"""
from typing import TypedDict
from langgraph.graph import StateGraph, END
from langchain_openai import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
from langchain.tools import Tool
from langgraph.checkpoint.memory import MemorySaver
import json
import time
# ===== 状态定义 =====
class SelfHealingState(TypedDict):
alarm: dict
alarm_type: str
diagnosis: str
similar_cases: str
action_plan: str
risk_level: str
need_human: bool
approved: bool
execution_result: str
final_report: str
steps: list
# ===== 模拟工具 =====
def check_link_status(device_id: str) -> str:
"""检查链路状态"""
return json.dumps({"device": device_id, "link": "down", "optical_power": "-28.5dBm"})
def check_device_hardware(device_id: str) -> str:
"""检查设备硬件"""
return json.dumps({"device": device_id, "cpu": "45%", "memory": "62%", "temp": "38C"})
def check_topology(device_id: str) -> str:
"""检查网络拓扑"""
return json.dumps({"device": device_id, "upstream": "SW-CORE-01", "downstream": ["SW-ACC-01", "SW-ACC-02"]})
def search_history_cases(symptom: str) -> str:
"""搜索历史案例"""
cases = [
{"case_id": "CASE-2026-0315", "symptom": "光功率异常", "solution": "更换光模块", "result": "成功"},
{"case_id": "CASE-2026-0421", "symptom": "光功率异常", "solution": "清洁光纤接头", "result": "成功"},
]
return json.dumps(cases, ensure_ascii=False)
def auto_restart_port(device_id: str, port: str) -> str:
"""自动重启端口(模拟)"""
return f"设备{device_id}端口{port}已重启,光功率恢复至-20dBm"
def create_ticket(device_id: str, desc: str, priority: int) -> str:
"""创建工单"""
return f"工单TKT-{device_id}-{int(time.time())%10000}已创建"
def send_notification(channel: str, msg: str) -> str:
"""发送通知"""
return f"通知已发送至{channel}:{msg}"
# ===== LLM =====
llm = ChatOpenAI(model="gpt-4o", temperature=0)
# ===== Agent节点 =====
def triage_agent(state: SelfHealingState) -> dict:
"""分诊Agent:告警分类和去重"""
alarm = state["alarm"]
prompt = ChatPromptTemplate.from_template("""
你是网络告警分诊Agent。分析以下告警并分类:
告警:{alarm}
分类:link(传输类)/ device(设备类)/ security(安全类)
只返回分类英文单词。
""")
result = (prompt | llm).invoke({"alarm": json.dumps(alarm, ensure_ascii=False)})
steps = state.get("steps", [])
steps.append(f"[分诊] 告警分类为: {result.content.strip()}")
return {"alarm_type": result.content.strip(), "steps": steps}
def diagnostic_agent(state: SelfHealingState) -> dict:
"""诊断Agent:综合诊断"""
alarm = state["alarm"]
alarm_type = state.get("alarm_type", "link")
# 调用工具获取诊断数据
if alarm_type == "link":
link_data = check_link_status(alarm["device_id"])
topo_data = check_topology(alarm["device_id"])
diag_input = f"链路状态: {link_data}\n拓扑信息: {topo_data}"
else:
hw_data = check_device_hardware(alarm["device_id"])
diag_input = f"硬件状态: {hw_data}"
prompt = ChatPromptTemplate.from_template("""
你是网络诊断专家。基于以下信息进行诊断:
告警:{alarm}
诊断数据:{diag_data}
请给出:
1. 故障定位
2. 根因分析
3. 影响范围评估
""")
result = (prompt | llm).invoke({
"alarm": json.dumps(alarm, ensure_ascii=False),
"diag_data": diag_input
})
steps = state.get("steps", [])
steps.append(f"[诊断] {result.content[:100]}...")
return {"diagnosis": result.content, "steps": steps}
def knowledge_agent(state: SelfHealingState) -> dict:
"""知识库Agent:检索历史案例"""
diag = state.get("diagnosis", "")
cases = search_history_cases(diag[:50])
prompt = ChatPromptTemplate.from_template("""
你是知识库Agent。基于诊断结果和历史案例,推荐处理方案:
诊断结果:{diag}
历史案例:{cases}
请输出:
1. 最匹配的案例
2. 推荐处理方案
3. 预计恢复时间
""")
result = (prompt | llm).invoke({"diag": diag, "cases": cases})
steps = state.get("steps", [])
steps.append("[知识库] 已匹配历史案例并生成推荐方案")
return {"similar_cases": result.content, "steps": steps}
def decision_agent(state: SelfHealingState) -> dict:
"""决策Agent:方案选择和风险评估"""
prompt = ChatPromptTemplate.from_template("""
你是运维决策Agent。基于以下信息制定执行方案:
诊断结果:{diag}
推荐方案:{cases}
请评估:
1. 最优处理方案
2. 风险等级(low/medium/high)
3. 是否需要人工介入
格式:
RISK: [low/medium/high]
HUMAN: [yes/no]
PLAN: [具体方案]
""")
result = (prompt | llm).invoke({
"diag": state.get("diagnosis", ""),
"cases": state.get("similar_cases", "")
})
content = result.content
risk = "high" if "high" in content.lower() else "medium" if "medium" in content.lower() else "low"
need_human = "yes" in content.lower()
steps = state.get("steps", [])
steps.append(f"[决策] 风险:{risk}, 需人工:{need_human}")
return {
"action_plan": content,
"risk_level": risk,
"need_human": need_human,
"steps": steps
}
def execution_agent(state: SelfHealingState) -> dict:
"""执行Agent:执行处理方案"""
plan = state.get("action_plan", "")
alarm = state["alarm"]
if state.get("need_human") and not state.get("approved"):
ticket = create_ticket(alarm["device_id"], plan[:200], 1)
notify = send_notification("企微", f"告警需人工处理:{alarm['device_id']} {alarm['type']}")
result = f"已创建工单({ticket})并通知值班人员({notify})"
else:
if "光" in alarm.get("type", "") or "link" in alarm.get("type", "").lower():
exec_result = auto_restart_port(alarm["device_id"], "eth0")
result = f"自动修复执行:{exec_result}"
else:
ticket = create_ticket(alarm["device_id"], plan[:200], 2)
result = f"已创建工单:{ticket}"
steps = state.get("steps", [])
steps.append(f"[执行] {result[:80]}...")
return {"execution_result": result, "steps": steps}
def report_agent(state: SelfHealingState) -> dict:
"""报告Agent:生成报告"""
prompt = ChatPromptTemplate.from_template("""
你是报告Agent。生成故障处理报告:
告警:{alarm}
诊断:{diag}
方案:{plan}
执行:{exec}
生成Markdown格式报告。
""")
result = (prompt | llm).invoke({
"alarm": json.dumps(state["alarm"], ensure_ascii=False),
"diag": state.get("diagnosis", ""),
"plan": state.get("action_plan", ""),
"exec": state.get("execution_result", "")
})
steps = state.get("steps", [])
steps.append("[报告] 报告已生成")
return {"final_report": result.content, "steps": steps}
# ===== 构建工作流 =====
workflow = StateGraph(SelfHealingState)
workflow.add_node("triage", triage_agent)
workflow.add_node("diagnostic", diagnostic_agent)
workflow.add_node("knowledge", knowledge_agent)
workflow.add_node("decision", decision_agent)
workflow.add_node("execution", execution_agent)
workflow.add_node("report", report_agent)
workflow.set_entry_point("triage")
workflow.add_edge("triage", "diagnostic")
workflow.add_edge("diagnostic", "knowledge")
workflow.add_edge("knowledge", "decision")
workflow.add_edge("decision", "execution")
workflow.add_edge("execution", "report")
workflow.add_edge("report", END)
# 编译(可选中断点)
self_healing_app = workflow.compile(
checkpointer=MemorySaver(),
interrupt_before=["execution"] # 执行前暂停确认
)
# ===== 运行系统 =====
if __name__ == "__main__":
alarm = {
"time": "2026-07-22 08:30:00",
"device_id": "SW-001",
"area": "北京",
"level": "critical",
"type": "光功率异常",
"value": "-28.5dBm",
"threshold": "-25.0dBm",
"description": "核心交换机SW-001光口功率低于阈值"
}
config = {"configurable": {"thread_id": "alarm-001"}}
# 第一次执行(到execution前暂停)
result = self_healing_app.invoke({"alarm": alarm, "steps": []}, config=config)
print("=== 执行步骤 ===")
for step in result.get("steps", []):
print(step)
print(f"\n=== 风险等级: {result.get('risk_level')} ===")
print(f"=== 需要人工: {result.get('need_human')} ===")
print(f"\n=== 执行方案 ===")
print(result.get("action_plan", ""))
# 人工确认后继续
# result = self_healing_app.invoke({"approved": True}, config=config)
# print(result.get("final_report", ""))11.6 生产环境最佳实践#
11.6.1 性能优化#
| 优化方向 | 策略 | 效果 |
|---|---|---|
| 并行化 | 无依赖的Agent并行执行 | 减少总耗时50%+ |
| 缓存 | 相同告警的诊断结果缓存 | 减少LLM调用 |
| 模型分级 | 简单分类用小模型,复杂分析用大模型 | 降低成本60% |
| 上下文压缩 | 传递给下游Agent的信息做摘要 | 避免Token溢出 |
| 流式输出 | 报告Agent流式生成 | 用户体验提升 |
# 并行诊断示例
from langgraph.graph import StateGraph
# 在工作流中加入并行节点
workflow = StateGraph(SelfHealingState)
workflow.add_node("triage", triage_agent)
workflow.add_node("diag_link", link_diagnostic_agent) # 并行
workflow.add_node("diag_device", device_diagnostic_agent) # 并行
workflow.add_node("merge", merge_results_agent) # 汇聚
workflow.set_entry_point("triage")
# triage后同时分发到两个诊断Agent
workflow.add_edge("triage", "diag_link")
workflow.add_edge("triage", "diag_device")
# 两个诊断完成后汇聚
workflow.add_edge("diag_link", "merge")
workflow.add_edge("diag_device", "merge")11.6.2 监控与可观测#
import logging
from datetime import datetime
# Agent执行链路追踪
class AgentTracer:
"""多Agent执行链路追踪"""
def __init__(self):
self.traces = []
def trace(self, agent_name: str, input_data: dict, output_data: dict, duration: float):
self.traces.append({
"timestamp": datetime.now().isoformat(),
"agent": agent_name,
"input": str(input_data)[:200],
"output": str(output_data)[:200],
"duration_sec": duration
})
def get_trace_report(self) -> str:
report = "# Agent执行链路\n\n"
total_time = 0
for t in self.traces:
report += f"## {t['agent']} ({t['duration_sec']:.2f}s)\n"
report += f" 时间: {t['timestamp']}\n"
report += f" 输入: {t['input'][:100]}...\n"
report += f" 输出: {t['output'][:100]}...\n\n"
total_time += t['duration_sec']
report += f"\n**总耗时: {total_time:.2f}s**\n"
return report
tracer = AgentTracer()
# 包装Agent节点加入追踪
def traced_agent(name: str, agent_fn):
"""装饰器:为Agent添加执行追踪"""
def wrapper(state):
start = time.time()
result = agent_fn(state)
duration = time.time() - start
tracer.trace(name, state, result, duration)
return result
return wrapper
# 使用追踪包装
workflow.add_node("triage", traced_agent("分诊Agent", triage_agent))
workflow.add_node("diagnostic", traced_agent("诊断Agent", diagnostic_agent))11.6.3 生产部署检查清单#
| 检查项 | 要求 | 状态 |
|---|---|---|
| Agent超时控制 | 每个Agent设置最大执行时间 | □ |
| 重试机制 | 工具调用失败自动重试3次 | □ |
| 降级策略 | LLM不可用时降级到规则引擎 | □ |
| 日志审计 | 全链路操作日志可追溯 | □ |
| 权限控制 | 不同角色可执行的操作不同 | □ |
| 知识库更新 | 每次处理结果自动入库 | □ |
| 告警去重 | 相同告警5分钟内不重复处理 | □ |
| 人工兜底 | 高风险操作必须人工确认 | □ |
| 性能监控 | P99响应时间 < 60秒 | □ |
| 灾备方案 | Agent服务可快速切换到备用节点 | □ |
11.6.4 成本控制#
# 多模型分级策略
from langchain_openai import ChatOpenAI
# 简单任务用小模型
fast_llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
# 复杂分析用大模型
smart_llm = ChatOpenAI(model="gpt-4o", temperature=0)
# Agent模型分级配置
AGENT_MODEL_MAP = {
"triage": fast_llm, # 分类用小模型
"diagnostic": smart_llm, # 诊断用大模型
"knowledge": fast_llm, # 检索用小模型
"decision": smart_llm, # 决策用大模型
"execution": fast_llm, # 执行用小模型
"report": smart_llm, # 报告用大模型
}
# Token使用统计
class TokenTracker:
def __init__(self):
self.usage = {"total_tokens": 0, "by_agent": {}}
def track(self, agent: str, tokens: int):
self.usage["total_tokens"] += tokens
self.usage["by_agent"][agent] = \
self.usage["by_agent"].get(agent, 0) + tokens
def report(self) -> str:
return json.dumps(self.usage, indent=2, ensure_ascii=False)考试要点#
- 理解多智能体系统的定义:多个自主智能体通过协作完成复杂任务
- 掌握单Agent与多Agent系统的区别和各自适用场景
- 理解四种编排模式:协调者、流水线、对等协作、层级模式
- 能根据场景选择合适的编排模式
- 掌握运维场景中多Agent的角色划分(监控→诊断→知识库→决策→执行→报告)
- 能用LangGraph构建多Agent工作流(状态定义、节点实现、边编排、条件路由)
- 理解Human-in-the-Loop在多Agent系统中的应用
- 掌握网络故障自动诊断与自愈系统的完整架构
- 了解生产环境最佳实践:性能优化、监控追踪、部署检查、成本控制
- 能构建端到端的多智能体运维系统
AI生成