# langchain-react-aiops-agent **Repository Path**: ye-liangjun/langchain-react-aiops-agent ## Basic Information - **Project Name**: langchain-react-aiops-agent - **Description**: 基于 LangChain ReAct Agent 的 AIOps 智能运维助手,集成 RAG 知识库与多种运维工具 - **Primary Language**: Python - **License**: MIT - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-09-08 - **Last Updated**: 2026-09-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 🚀 LangChain ReAct Agent 企业 AIOps 运维智能体 基于 **LangChain + ReAct Agent + RAG + Tool Calling** 构建的企业 AIOps 智能运维项目,面向服务异常分析、日志辅助诊断、监控指标解读、依赖关系梳理与运行报告生成等场景。 当前项目已经从早期的“问答示例”演进为 **AIOps 运维分析 Agent**:主提示词与报告提示词均围绕企业运维场景设计,工具层提供告警、指标、日志、拓扑与报告聚合能力,支持对 `order-service`、`payment-service`、`inventory-service` 等服务进行分析。 ## 效果预览 ### 1. 聊天界面展示 - 展示用户在前端输入问题后,系统返回问答结果的整体效果。左侧是历史记录 ### 2. Agent 工具调用过程 - 展示 Agent 在任务处理中调用外部工具或执行中间推理的过程。 ### 3. 报告生成示例 - 展示系统根据用户数据生成个性化分析报告的结果页面。 --- ## 1. 项目定位 本项目的目标不是做一个通用聊天机器人,而是构建一个具备 **运维分析能力** 的智能体系统,让模型能够: - 理解用户的运维问题 - 在必要时自动调用工具获取结构化数据 - 结合知识库完成补充分析 - 在普通问答与报告生成之间自动切换提示词 - 输出专业、简洁、可执行的运维结论 从当前主提示词可以看出,系统已经明确面向以下任务:运维知识问答、告警分析、监控指标分析、日志辅助诊断、根因推测与运行报告生成。 --- ## 2. 核心能力 ### 2.1 ReAct Agent 多工具协同 项目使用 `create_agent(...)` 构建 ReAct 智能体,统一注册 RAG、服务识别、时间范围识别、告警查询、指标查询、日志摘要、拓扑查询和报告聚合等工具,使模型可以根据任务自动选择调用路径。 ### 2.2 RAG 检索增强 项目通过 `Chroma` 构建本地向量库,支持从 `txt / pdf` 文档中加载知识,并通过 `RagSummarizeService` 完成“检索 + 总结”式问答,适合承载 SOP、排障经验、系统说明等运维资料。 ### 2.3 动态提示词切换 项目通过中间件在普通问答与报告模式之间切换: - 普通场景:使用 AIOps 运维助手提示词 - 报告场景:使用结构化报告生成提示词 这让同一个 Agent 同时具备“即时分析”和“正式报告输出”两种能力。 ### 2.4 面向运维的结构化工具集 当前工具层已包含: - `fetch_alert_data`:告警信息 - `fetch_metric_data`:监控指标 - `fetch_log_summary`:日志摘要与高频错误 - `fetch_service_topology`:上下游依赖与中间件拓扑 - `fetch_report_data`:运行报告数据聚合 - `fill_context_for_report`:报告上下文注入 ### 2.5 可扩展的数据接入方式 当前仓库内使用的是 mock 数据,便于快速演示 Agent 工作流;同时代码中也预留了后续接入真实系统的扩展位置,可进一步对接 Prometheus、Elasticsearch、告警平台、CMDB 或服务拓扑平台。 --- ## 3. 适用场景 本项目适合以下典型场景: - 分析某个服务最近 1 小时 / 24 小时的异常情况 - 结合告警、指标、日志进行初步根因推测 - 输出服务运行日报 / 周报 / 月报 - 基于知识库回答运维 SOP 与常见故障处理问题 - 对系统上下游依赖关系进行影响面分析 示例问题: ```text 分析一下 order-service 最近1小时的异常情况 生成 inventory-service 本月运行报告 payment-service 今天有哪些高频异常 order-service 的问题可能会影响哪些下游服务 ``` --- ## 4. 项目架构 ```bash . ├── agent/ # Agent 核心逻辑 │ ├── react_agent.py # ReAct Agent 主入口 │ └── tools/ │ ├── agent_tools.py # 工具定义:告警 / 指标 / 日志 / 拓扑 / 报告 / RAG │ └── middleware.py # 中间件:工具监控、日志、动态提示词切换 ├── config/ # YAML 配置 │ ├── agent.yml │ ├── chroma.yml │ ├── prompts.yml │ └── rag.yml ├── data/ # 知识库文档目录 ├── model/ │ └── factory.py # 聊天模型与嵌入模型工厂 ├── prompts/ │ ├── main_prompt.txt # 普通问答提示词 │ ├── report_prompt.txt # 报告模式提示词 │ └── rag_summarize.txt # RAG 总结提示词 ├── rag/ │ ├── rag_service.py # 检索总结服务 │ └── vector_store.py # 向量库加载与检索 ├── utils/ │ ├── config_handler.py # 配置读取 │ ├── file_handler.py # 文件加载与 MD5 去重辅助 │ ├── logger_handler.py # 日志模块 │ ├── path_tool.py # 路径工具 │ └── prompt_loader.py # 提示词加载器 ├── app.py # 交互入口 ├── requirements.txt └── README.md ``` --- ## 5. 工作流程 ### 5.1 普通分析流程 1. 用户输入服务分析问题 2. Agent 解析是否已包含服务名与时间范围 3. 如信息不足,则调用 `get_target_service` / `get_time_range` 4. 调用告警、指标、日志、拓扑等工具补充上下文 5. 根据主提示词输出结构化分析结果 建议输出结构通常包括: - 问题分析 - 可能原因 - 排查步骤 - 解决建议 ### 5.2 报告生成流程 当用户请求“生成报告 / 今日运行情况 / 本周分析 / 本月分析 / 系统健康度分析”等内容时,Agent 会进入报告模式: 1. 必要时补全服务名与时间范围 2. 先调用 `fill_context_for_report` 3. 优先调用 `fetch_report_data` 4. 如数据不足,再补充调用告警 / 指标 / 日志 / 拓扑 / RAG 工具 5. 按报告提示词输出正式结构化报告 报告结构包括: - 报告概览 - 核心指标表现 - 告警与异常情况 - 日志与根因分析 - 依赖与影响分析 - 综合判断 - 运维建议 --- ## 6. 技术栈 - **Agent 框架**:LangChain、LangGraph - **模型接入**:Tongyi / DashScope - **向量数据库**:Chroma - **文档处理**:PyPDFLoader、TextLoader - **文本切分**:RecursiveCharacterTextSplitter - **工程能力**:YAML 配置管理、日志系统、模块化结构设计 --- ## 7. 当前项目中的关键设计 ### 7.1 主提示词与报告提示词分离 项目将普通问答与报告生成拆成两套提示词: - `main_prompt.txt`:聚焦 AIOps 分析、异常排查、工具调用规范 - `report_prompt.txt`:聚焦正式报告生成、章节结构与语言风格约束 这样可以避免“问答场景写成报告”或“报告场景写成闲聊回复”的问题。 ### 7.2 知识库加载支持去重 向量库加载逻辑会对知识文件计算 MD5,并记录已处理文件,避免重复导入同一批资料。 ### 7.3 模拟数据与真实接入解耦 当前仓库中的告警、指标、日志和拓扑数据使用 mock 数据,便于快速演示;后续只需要替换工具内部的数据获取逻辑,无需改动 Agent 主体流程。 --- ## 8. 关于“流式输出”的建议 如果你使用的是 **Tongyi + Tool Calling + Agent 流式** 组合,需要注意兼容性问题。实践中更稳的方式通常是: ### 方案 A:推荐 - Agent 主流程使用非流式调用 - 拿到完整结果后,在应用层分段输出 - 对前端或控制台来说,仍然是“流式展示” 这种方式最稳,尤其适合带工具调用的复杂 Agent。 ### 方案 B:两阶段流式 - 第一阶段:Agent 非流式完成工具调用与数据聚合 - 第二阶段:使用纯文本流式模型,对最终结果进行流式生成 如果你当前已经遇到 `KeyError: 'name'` 一类与流式工具调用相关的问题,优先建议采用 **方案 A**。 --- ## 9. 快速开始 ### 9.1 环境要求 - Python 3.10+ - 可用的 DashScope / Tongyi API Key - 已安装并可正常使用的依赖环境 ### 9.2 安装依赖 ```bash git clone https://github.com/Ye1510/langchain-react-aiops-agent.git cd langchain-react-aiops-agent pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple ``` ### 9.3 配置 API Key Linux / macOS: ```bash export DASHSCOPE_API_KEY="your-api-key" ``` Windows PowerShell: ```powershell $env:DASHSCOPE_API_KEY="your-api-key" ``` Windows CMD: ```cmd set DASHSCOPE_API_KEY=your-api-key ``` ### 9.4 检查配置文件 首次运行前建议确认: - `config/rag.yml` - `config/chroma.yml` - `config/prompts.yml` - `config/agent.yml` 其中需要特别关注: - 模型名称 - 向量库存储目录 - 知识库数据目录 - 提示词文件路径 ### 9.5 准备知识库文档 将你的运维文档、SOP、系统说明、故障案例等放入 `data/` 目录,支持 `txt / pdf` 等文件类型。 ### 9.6 初始化向量库 如果项目尚未完成知识库入库,可先执行相应加载逻辑,将 `data/` 中的资料写入 Chroma。 ### 9.7 启动项目 根据你的 `app.py` 实现方式启动入口程序,例如: ```bash python app.py ``` 如果你的本地入口仍然是 Streamlit,则使用: ```bash streamlit run app.py ``` --- ## 10. 最小化验证 启动后可优先测试以下输入: ### 普通分析 ```text 分析一下 order-service 最近1小时的异常情况 ``` ```text payment-service 今天有哪些异常 ``` ### 报告生成 ```text 生成 inventory-service 本月运行报告 ``` ```text 请给我一份 order-service 今日系统健康度分析 ``` 如果以上问题能够返回结构化结果,说明基础链路已经跑通。 --- ## 11. 后续可扩展方向 可以继续把这个项目往更真实的企业 AIOps 方向扩展: - 接入 Prometheus 获取实时指标 - 接入 Elasticsearch / Loki 获取真实日志摘要 - 接入告警平台实现实时告警分析 - 接入服务拓扑平台或 CMDB - 支持多服务联合分析与影响扩散判断 - 支持工单生成、故障升级、自动化修复建议 - 增加 FastAPI / Web 前端 / Streamlit 可视化界面 --- ## 12. 常见问题 ### Q1:为什么建议不要直接打开 Agent 原生流式? 因为带工具调用的流式链路在部分模型接入下兼容性不稳定,容易在工具调用增量解析阶段报错。对当前项目而言,更稳的选择是“非流式执行 + 应用层伪流式输出”。 ### Q2:当前数据为什么看起来是固定的? 因为当前工具层使用 mock 数据做演示,这是为了先把 Agent 工作流跑通。后续只需要替换工具内部的数据来源即可对接真实系统。 --- ## 13. 致谢 - LangChain - LangGraph - Chroma - Alibaba Cloud DashScope / Tongyi --- ## 14. License 本项目适合作为 Agent / AIOps / RAG / Tool Calling 学习与实践项目使用。 如果这个项目对你有帮助,欢迎点个 Star。