基于 LangGraph 的 Agentic RAG 核心架构
核心摘要:当资深运维专家离场,留下的往往不仅是空荡荡的工位,更是无数无法被Wiki捕捉的“隐性知识”。本文将摒弃空洞的概念炒作,基于 Agentic RAG 架构,利用 LangGraph 与 Qwen2.5,从零构建一个具备“反思-迭代”能力的“火电运维专家Agent”。这不仅是一份代码实录,更是企业核心经验实现数字永生的技术宣言。
1. 逝去的“老法师”与沉默的知识断层
在火电厂的集控室里,最可怕的不是报警灯的闪烁,而是当那个总是端着茶杯的“老张”离开后,面对同样的故障报警,一群硕博工程师却面面相觑。
隐性知识——那些写在故障处理规程之外的经验、直觉和手速——往往随着人员的流动而彻底消失。传统的企业Wiki或静态知识库(Confluence, SharePoint)只能存储“显性知识”,即已经被文档化的信息。而真正的运维核心,往往存在于“汽温波动与煤质特性的非线性关系”这种即时的判断中。
同事被优化了,但他的经验必须留下。
我们需要构建的不仅仅是一个问答机器人,而是一个能够模拟专家思维链的 Agent(智能体)。它不应只是简单的检索增强生成(RAG),而必须是具备 Agentic(代理)特性 的:能够规划、执行、反思和纠错。
2. 技术选型:拒绝玩具级架构
市面上大多数“知识库搭建”教程仅停留在“文档切片 -> 向量化 -> 召回”的初级阶段。这种线性流程在工业场景下是致命的——一旦召回的上下文偏差,大模型(LLM)极易产生幻觉,误导运维人员导致停机事故。
为此,我们确立了基于 LangGraph 的 Agentic RAG 架构,并选用了 Qwen2.5-72B-Instruct 作为基座模型。
2.1 核心组件选型逻辑
| 组件 | 选型方案 | 选型理由 (工业级考量) | 替代方案对比 |
|---|---|---|---|
| 基座模型 | Qwen2.5-72B | 1. 中文理解力:在CMMLU榜单上对中文工业术语理解极佳。 2. Tool Calling:原生支持Function Calling,格式稳定。 3. 长文本:支持128k上下文,足以吞下整份《锅炉运行规程》。 |
Llama 3.1 (中文逻辑略弱) GPT-4o (私有化部署成本高/合规风险) |
| 向量数据库 | Milvus 2.4 | 1. Hybrid Search:支持稀疏+稠密向量混合检索,精准匹配设备编号。 2. 标量过滤:支持按“机组编号”、“时间”等元数据精准过滤。 |
Pinecone (SaaS不可控) FAISS (无元数据过滤,不适合生产) |
| 编排框架 | LangGraph | 1. 循环图:原生支持“反思-重试”的循环逻辑,而非LangChain的DAG。 2. Stateful:维护对话状态,适合多轮故障排查。 |
LangChain Chain (线性死板,无法回头) |
| Rerank模型 | BGE-Reranker-v2-m3 | 在召回后进行精细排序,解决“语义相似但逻辑相反”的问题(如“开启阀门”vs“禁止开启阀门”)。 | 无Rerank (准确率下降20%+) |
3. 架构设计:构建“会思考”的闭环
传统的RAG是“一锤子买卖”,问一次,查一次,答一次。而我们的目标是模拟人类专家的思维过程:
- 分析问题:是设备故障还是操作失误?
- 查阅资料:先看规程,再看历史工单。
- 自我评估:找到的信息够吗?能不能解释通?
- 生成答案:给出带有置信度的操作建议。
以下是基于 LangGraph 的 Agentic RAG 核心架构图:
4. 硬核实战:代码实现
环境准备:确保你已经部署了 Milvus 和 Ollama (或 vLLM) 服务。
开源依赖:langchain, langgraph, pymilvus, langchain-community
4.1 定义状态与工具
首先,我们需要定义 Agent 的“大脑”状态。在 LangGraph 中,State 是在节点间流转的记忆。
from typing import TypedDict, Annotated, List, Union
from langchain_core.messages import HumanMessage, AIMessage, SystemMessage
import operator
# 定义Agent的状态,messages会自动累加
class AgentState(TypedDict):
messages: Annotated[list, operator.add] # 对话历史
query: str # 用户原始问题
context: List[str] # 检索到的上下文
confidence: float # 置信度评分
iterations: int # 迭代次数,防止死循环
# 模拟:连接 Milvus 进行混合检索
def search_fault_records(query: str, unit_id: str = "3"):
"""
在向量库中检索故障记录和运行规程。
实际生产中应使用 Milvus Client 进行 search。
"""
# 伪代码演示:这里应当是 collection.search(...)
print(f"-> [Tool Call] 正在检索机组 {unit_id} 关于 '{query}' 的记录...")
# 模拟返回的文档片段
docs = [
"《锅炉运行规程 4.2.1》:当主汽温度超过额定值5℃时,应立即检查减温水门开度。",
"历史工单 #2023-1102:3号炉发生过热器爆管,前兆为减温水流量异常波动。"
]
return docs
# 模拟:查询结构化数据(如D CS历史数据库)
def query_dcs_data(parameter: str):
print(f"-> [Tool Call] 正在查询 DCS 实时数据: {parameter}...")
return f"当前 {parameter} 数值为 545℃ (报警限 540℃)"
4.2 构建核心节点:评估与反思
这是区分“玩具”和“专家”的关键。如果检索到的信息是垃圾,Agent 必须有能力拒绝回答并重新检索。
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
# 假设我们使用本地部署的 Qwen2.5 接口
llm = ChatOpenAI(base_url="http://localhost:8000/v1", model="Qwen2.5-72B-Instruct", api_key="empty")
# 节点:检索
def retrieve_node(state: AgentState):
query = state['query']
# 实际这里应该由LLM提取参数
docs = search_fault_records(query)
return {"context": docs}
# 节点:评估 - 决定是否需要重新检索或利用外部工具
def grade_documents_node(state: AgentState):
"""
使用LLM作为评判官,判断检索到的上下文是否足以回答问题。
"""
print("--> [Node] 正在评估文档相关性...")
question = state['query']
documents = state['context']
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个严谨的火电运维专家助手。请判断以下文档片段是否包含回答用户问题所需的关键信息。"),
("user", "问题: {question}\n\n文档片段: {docs}\n\n如果信息足够,回复 'YES',否则回复 'NO'。")
])
chain = prompt | llm
response = chain.invoke({"question": question, "docs": "\n".join(documents)})
if "YES" in response.content:
return {"confidence": 0.9} # 足够高,可以生成
else:
print("--> [Warning] 文档相关性不足,准备触发重试机制...")
return {"confidence": 0.3, "iterations": state['iterations'] + 1}
# 节点:生成答案
def generate_node(state: AgentState):
print("--> [Node] 正在生成最终回答...")
# 调用LLM生成,包含 System Prompt 防止幻觉
pass
4.3 编排 LangGraph:让逻辑闭环
这是最激动人心的部分。我们将定义图的边,实现“如果不满意就重来”的逻辑。
from langgraph.graph import StateGraph, END
workflow = StateGraph(AgentState)
# 1. 添加节点
workflow.add_node("retrieve", retrieve_node)
workflow.add_node("grade", grade_documents_node)
workflow.add_node("generate", generate_node)
# 2. 设置入口
workflow.set_entry_point("retrieve")
# 3. 添加边
workflow.add_edge("retrieve", "grade")
# 4. 添加条件边 - 核心逻辑
def decide_to_generate(state: AgentState):
# 如果迭代次数超过3次,强制退出,避免死循环
if state['iterations'] > 3:
return "abort"
if state['confidence'] > 0.7:
return "generate"
else:
# 这里可以加入改写Query的逻辑,为了演示简洁直接重试
return "retry"
# 从 grade 节点出来,根据条件决定去向
workflow.add_conditional_edges(
"grade",
decide_to_generate,
{
"generate": "generate",
"retry": "retrieve", # 置信度不够,回头重新检索!
"abort": END
}
)
workflow.add_edge("generate", END)
# 5. 编译图
app = workflow.compile()
5. 实战演练:一个复杂的故障排查 Case
为了验证效果,我们模拟一个复杂的输入。用户并没有直接说“故障”,而是描述了现象。
输入:
“3号机组的给水流量突然掉了10%,但负荷没变,主汽压力还在涨,这是什么鬼?”
Agent 运行日志(模拟):
- [Agent Reasoning]:分析问题关键词
给水流量,负荷,主汽压力。初步判断可能是给水泵故障或阀门误关。 - [Tool Call]:
search_fault_records("给水流量下降 主汽压力上升")。 - [Retrieval]:召回文档《给水系统故障处理》。
- [Evaluation]:文档只提到了泵跳闸,但用户说负荷没变,置信度评分:0.4 (FAIL)。
- [Re-Plan]:Agent 决定改写查询词,增加
负荷不变条件,并查询历史工单。 - [Tool Call]:
search_fault_records("给水流量下降 负荷不变")ANDquery_dcs_data("主汽压力")。 - [Retrieval]:召回工单 #2021-0405:“高压旁路阀误开导致虚假水位及流量异常”。
- [Evaluation]:逻辑自洽,置信度:0.85 (PASS)。
- [Generation]:
“根据《高压旁路运行导则》及历史工单 #2021-0405,建议立即检查 高压旁路阀 状态。虽然给水流量显示下降,但主汽压力上升且负荷不变,极有可能是旁路阀误开导致蒸汽短路,引起给水测量偏差。请就地核对旁路阀位。”
效果分析:
普通的 RAG 在第 3 步就会基于“给水流量”检索到“检查给水泵”的错误建议,导致运维人员走弯路。而 Agentic RAG 通过第 5 步的“反思-重试”,成功定位了更深层的逻辑关联。
6. 总结与展望:经验的各种数字永生
我们刚刚做的,不仅仅是写了一个 Python 脚本,而是完成了一次 知识建模。
- 从数据层面:我们将非结构化的规程、离散的工单,通过向量化和图谱技术变成了机器可理解的“记忆”。
- 从逻辑层面:我们通过
Evaluator和Re-plan赋予了 AI “怀疑精神”。
在“同事被优化”的叙事背景下,这套系统的价值显得尤为残酷而珍贵。当一个拥有 20 年经验的老师傅离开,他留下的不仅是几本手写笔记,更是一个能够 24 小时秒回、不知疲倦、且能随着新数据不断自我进化的 数字分身。
这,才是技术对人类经验最大的尊重。
附录:参考资源与延伸阅读
- LangGraph Documentation: https://langchain-ai.github.io/langgraph/ (构建循环Agent的最佳框架)
- Qwen2.5 Technical Report: https://arxiv.org/abs/2309.16609 (通义千问开源模型,国产之光)
- Milvus Hybrid Search: https://milvus.io/docs/hybridsearch.md (多路召回的关键)
- BGE Re-ranker Model: https://huggingface.co/BAAI/bge-reranker-v2-m3 (提升检索精度的神器)
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)