基于LangGraph构建可控制日志分析系统:子图组合与状态管理详解

使用 LangGraph 构建生产级 AI Agent LangGraph 是一个用于构建有状态和多角色的LLM Apps 的开源库,常用于 创建单代理和多代理的工作流。与其他LLM 框架相比,LangGraph 具备以下核心优势和特性:• 循环与分支:允许实现循环和条件逻辑,适用于大多数代理架构,区别于以有向无环图(DAG)为基础的解决方案。• 持久化:内置自动状态保存功能,支持在任何时刻暂停和恢复执行,便于错 误恢复、人类参与、时光回溯等复杂工作流。• 人类参与:在执行过程中可以中断,允许人类审核或编辑下一步操作,支持。 阅读详情

基于LangGraph构建可控制日志分析系统:子图组合与状态管理详解

在现代AI应用开发中,日志分析和故障处理是保证系统稳定运行的重要环节。本文将详细介绍如何使用LangGraph框架构建一个可控制的日志分析系统,该系统能够自动分析日志、识别故障并生成报告。系统采用模块化设计,通过多个子图的组合实现复杂的业务逻辑。

系统整体架构

本文介绍的日志分析系统采用三层图结构设计:

  1. 故障分析子图(Failure Analysis):负责识别和分析失败的日志记录
  2. 问题总结子图(Question Summarization):负责生成问题摘要和报告
  3. 主入口图(Entry Graph):协调各个子图的执行流程

数据结构定义

日志数据结构

首先,我们定义了日志的基本数据结构:

from typing import TypedDict, Annotated, Optional, List, Dict, Any, get_type_hints
from operator import add
from langgraph.graph import StateGraph, START, END

class Logs(TypedDict):
    id: str  # 日志的唯一标识符
    question: str  # 问题文本
    docs: Optional[List]  # 可选的相关文档列表
    answer: str  # 回答文本
    grade: Optional[int]  # 可选的评分
    grader: Optional[str]  # 可选的评分者
    feedback: Optional[str]  # 可选的反馈信息

这个数据结构包含了日志分析所需的所有关键信息:

  • id:用于唯一标识每条日志记录
  • question和answer:记录问答对信息
  • grade、grader、feedback:用于质量评估和反馈

故障分析子图

状态定义

class FailureAnalysisState(TypedDict):
    docs: List[Logs]
    failures: List[Logs]
    fa_summary: str

核心功能实现

故障分析子图包含两个主要节点:

1. 获取失败日志
def get_failures(state):
    doce = state['docs']
    failures = [doc for doc in doce if "grade" in doc]
    return {"failures": failures}

这个函数通过检查日志中是否存在grade字段来识别失败的记录。在实际应用中,可能需要根据具体的业务逻辑调整失败识别条件。

2. 生成故障摘要
def generate_summary(state):
    failures = state["failures"]
    # 在实际应用中,这里会调用LLM进行智能分析
    fa_summary = "错误信息分析结果"
    return {"fa_summary": fa_summary}

子图构建

fa_builder = StateGraph(FailureAnalysisState)
fa_builder.add_node("get_failures", get_failures)
fa_builder.add_node("generate_summary", generate_summary)
fa_builder.add_edge(START, "get_failures")
fa_builder.add_edge("get_failures", "generate_summary")
fa_builder.add_edge("generate_summary", END)

问题总结子图

状态定义

class QuestionSummarizationState(TypedDict):
    docs: List[Logs]  # 日志列表
    qs_summary: str  # 问题总结
    report: str  # 报告

功能模块

问题总结子图包含三个处理节点:

1. 生成问题总结
def generate_summary(state):
    docs = state["docs"]
    # 实际应用中会调用summarize函数进行智能总结
    summary = "问题汇总"
    return {"qs_summary": summary}
2. 发送到Slack
def send_to_slack(state):
    qs_summary = state["qs_summary"]
    # 实际应用中会调用report_generation函数
    report = "foo bar baz"
    return {"report": report}
3. 格式化报告
def format_report_for_slack(state):
    report = state["report"]
    # 实际应用中会调用report_format函数
    formatted_report = "固定的格式化报告内容"
    return {"report": formatted_report}

子图构建

qs_builder = StateGraph(QuestionSummarizationState)
qs_builder.add_node("generate_summary", generate_summary)
qs_builder.add_node("send_to_slack", send_to_slack)
qs_builder.add_node("format_report_for_slack", format_report_for_slack)
qs_builder.add_edge(START, "generate_summary")
qs_builder.add_edge("generate_summary", "send_to_slack")
qs_builder.add_edge("send_to_slack", "format_report_for_slack")
qs_builder.add_edge("format_report_for_slack", END)

主入口图

状态定义

主入口图的状态设计使用了Annotated类型注解,支持状态合并:

class EntryGraphState(TypedDict):
    raw_logs: Annotated[List[Dict], add]
    docs: Annotated[List[Logs], add]
    fa_summary: str
    report: str

使用add操作符意味着在状态更新时,列表类型的字段会进行合并操作。

数据转换

def convert_logs_to_docs(state):
    raw_logs = state["raw_logs"]
    docs = raw_logs
    return {"docs": docs}

这个函数负责将原始日志数据转换为标准的Logs格式。

主图构建

entry_builder = StateGraph(EntryGraphState)
entry_builder.add_node("convert_logs_to_docs", convert_logs_to_docs)
entry_builder.add_node("question_summarization", qs_builder.compile())
entry_builder.add_node("failure_analysis", fa_builder.compile())

entry_builder.add_edge(START, "convert_logs_to_docs")
entry_builder.add_edge("convert_logs_to_docs", "question_summarization")
entry_builder.add_edge("convert_logs_to_docs", "failure_analysis")
entry_builder.add_edge("question_summarization", END)
entry_builder.add_edge("failure_analysis", END)

系统执行与测试

测试数据

raw_logs = [{
    "id": "1",
    "question": "如何导入ChatOpenAI?",
    "answer": "要导入ChatOpenAI, 使用: 'from langchain_openai import ChatOpenAI.'",
}, {
    "id": "2",
    "question": "如何使用Chroma向量存储?",
    "answer": "要使用Chroma,请定义: rag_chain = create_retrieval_chain(retriever, question_answer_chain).",
    "grade": 0,
    "grader": "文档相似性回顾",
    "feedback": "检索到的文档一般讨论了向量存储,但没有专门讨论Chroma",
}]

系统执行

app = entry_builder.compile()
result = app.invoke({"raw_logs": raw_logs}, debug=False)
print(result)

可视化

系统还支持生成流程图,便于理解和调试:

graph_png = app.get_graph(xray=1).draw_mermaid_png()
with open("子图可控性.png", "wb") as f:
    f.write(graph_png)

设计优势

1. 模块化设计

每个子图都有独立的状态和功能,便于维护和扩展。

2. 并行处理

故障分析和问题总结可以并行执行,提高系统效率。

3. 状态管理

通过Annotated和add操作符实现智能的状态合并机制。

4. 可扩展性

可以轻松添加新的子图或修改现有流程,不影响其他模块。

实际应用建议

1. 集成LLM

在实际部署时,应该将示例中的固定字符串替换为真实的LLM调用,实现智能分析。

2. 错误处理

添加异常处理机制,确保系统在遇到错误时能够优雅处理。

3. 监控和日志

增加系统运行监控和详细的执行日志,便于问题排查。

4. 性能优化

对于大量日志的处理,可以考虑批处理和异步执行。

总结

本文介绍的基于LangGraph的日志分析系统展示了如何通过子图组合实现复杂的业务逻辑。系统具有良好的模块化设计、并行处理能力和可扩展性,为构建AI驱动的智能运维系统提供了有效的解决方案。通过合理的状态管理和流程控制,可以轻松应对各种复杂的日志分析需求。

LangGraph教程7:LangGraph子图可控性 本文介绍了LangGraph中子图可控性的实现方法。通过状态共享机制,主图与子图可以交互并维护全局状态一致性,适用于多代理协作场景。文章提供了两个子图示例:故障分析子图(获取失败日志并生成总结)和问题总结子图(生成报告并格式化发送)。每个子图拥有独立状态(FailureAnalysisState和QuestionSummarizationState),同时共享父图状态中的关键数据(如docs)。代码示例展示了如何构建子图工作流,包括节点添加、状态转移和最终组合,实现了日志处理系统的模块化设计。 阅读详情

相关推荐

openeuler 系统—— 集成大模型分析日志中的错误信息生成故障原因报告

根据RFC 7231,502表示"Bad Gateway",即网关从上游服务器收到无效响应。

weixin_46282323的博客 1605

基于大模型智能体Agent的LangGraph入门与实战

基于大模型智能体Agent的LangGraph入门与实战课程目标:本课程旨在为LangGraph的初学者提供深入的理论知识和实践技能,使其能够独立构建和部署基于LangGraph的应用程序。课程形式:理论讲解 + 实战演练第1课 LangGraph基础架构与环境配置-LangGraph的概念解析第2课 LangGraph基础架构与环境配置-LangGraph的环境搭建与依赖管理第3课 LangGraph的基础原理与应用入门-构建基本聊天机器人及使用工具增强第4课 LangGraph的基础原理与应用入门-内存管理、人在回路、状态更新第5课 LangGraph高级图控制技术-并行节点扇出和扇入、增加额外步骤、条件分支第6课 LangGraph高级图控制技术-稳定排序、Map-Reduce并行执行、图递归控制第7课 LangGraph持久化机制与状态管理-线程级持久化、子图持久化、跨线程持久化第8课 LangGraph Human-in-the-loop-断点设置、动态设置断点、编辑更新状态第9课 LangGraph Human-in-the-loop-等待用户输入、时间旅行、工具评审第10课 LangGraph在具有长期记忆的有状态Agent中的应用-长期记忆及短期记忆、过滤信息、删掉信息第11课 LangGraph在具有长期记忆的有状态Agent中的应用-摘要总结、跨线程持久化、代理语义搜索第12课 LangGraph工具集成与调用-直接调用ToolNode、大模型使用工具第13课 LangGraph工具集成与调用-工具调用报错处理、运行时值传递给工具、注入参数第14课 LangGraph工具集成与调用-配置传入工具、从工具更新图状态、管理大量工具第15课 LangGraph子图设计与实现-添加及使用子图、父图及子图状态管理第16课 LangGraph子图设计与实现-子图状态的查看与更新、子图输入输出的转换与处理第17课 LangGraph项目实战演练-多智能体系统主管委托各个代理第18课 LangGraph课程复习与答疑 自我反思案例及论文案例讲解

Ubuntu环境下rknn-toolkit2的安装与兼容性解析

本文详细解析了在Ubuntu系统上安装瑞芯微rknn-toolkit2工具链的完整流程与关键注意事项。文章重点剖析了rknn-toolkit2与旧版rknn-toolkit的核心兼容性问题,强调两者在API、模型格式及运行时库上互不兼容,并推荐使用Conda虚拟环境进行隔离管理,为RK3566、RK3588等开发板的AI模型部署提供清晰的实践指南。

weixin_29041767的博客 375

【LangGraph】使用 LangGraph 的 Pregel 运行时日志

使用 LangGraph 时,Pregel 作为其底层计算模型,驱动图的执行,而运行时日志(Runtime Logging)是调试和监控 LangGraph 工作流的重要工具。通过 Python logging 和 LangChain 回调机制,记录超步、节点执行、状态更新和条件跳转。配置方法:使用 logging.basicConfig 设置日志级别和输出。自定义 BaseCallbackHandler 捕获节点和图的生命周期事件。关键信息:超步执行、节点输入/输出、状态变化、条件跳转、错误。优化技巧:调

彬彬侠的博客 1956

自动控制原理之控制系统的数学模型(类比神经网络学习数学模型)

控制系统的数学模型背景建模方法常用的数学模型时域数学模型的建立建立微分方程的步骤复数域模型的建立传递函数的性质系统的典型环节及传递函数比例环节惯性环节积分环节微分环节理想微分环节一阶微分环节二阶微分环节振荡环节延时环节(时滞环节) 背景 数学模型就像是真实世界的写照,它就像一个虚拟的世界,我们可以通过建模的方式了解这个真实世界的运作规律。 这一点很像强化学习,强化学习需要一个供智能体探索、学习的环境,于是,我们通常会事先建立一个虚拟的仿真环境。举个例子,对于人类来说,可能需要经过不断地尝试,甚至是生命的代价

zbp_12138的博客 6577

QMT中ContextInfo的使用注意

QMT中ContextInfo下声明的全局变量的使用注意事项

路在何方 2807

LangGraph--基础学习(Subgraphs 子图)

这几个章节,但是我觉得这些都是调试使用的,使用技巧也是中断的概念,所以大家去官网自己学习,我这边直接进入子图学习,为后续的多智能体学习做准备。子图允许您构建具有多个组件的复杂系统,这些组件本身就是图。该函数需要在调用子图之前将输入(父)状态转换为子图状态,并在从节点返回状态更新之前将结果转换回父状态。对于更复杂的系统,您可能希望定义与父图具有。如果您的应用程序是这种情况,则需要定义一个。中的共享状态键(通道)进行通信。的子图(没有共享键)。恢复图形后,将无法访问子图形状态。这将从父图和任何子图流输出。

进击的菜鸟 7772

FTPClient使用中,碰到SocketTimeoutException 坑

ftpclient设置soTimeout无效

u010379794的博客 1951

LangGraph系列9 :调试、日志与可观测性 —— 当你的 AI 智能体突然精神分裂,如何 5 分钟定位故障?

去年某券商的量化交易 Agent 在凌晨 3 点突然买入垃圾股,造成 2000 万损失——事后发现是状态机在条件边跳转时丢失了风险阈值。2025 年,随着 LangGraph 驱动的智能体承担核心业务(医疗诊断、金融决策、工业控制),**可观测性已从加分项变为安全红线**。据 Gartner 2025 预测,缺乏完善调试能力的 AI 系统故障恢复时间将比传统应用长 47 倍。本章将揭示生产级 LangGraph 应用的诊断工具箱,让你在智能体行为异常时,像老中医把脉般精准定位病灶。

沛哥儿的专栏 1520

华为OD机试双机位A卷 - VLAN资源池 (C++ & Python & JAVA & JS & GO)

华为OD机试2025双机位A卷 VLAN资源池,提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解

qq_45776114的博客 879

YOLOv5算法改进(22)— 更换主干网络MobileNetv3 + 添加CA注意力机制

本节课就让我们结合论文来对YOLOv5进行组合改进(更换主干网络MobileNetv3 + 添加CA注意力机制),小白必学~!🌈

小哥谈 2816

从零部署Qwen大模型:vLLM实战指南,零基础小白收藏这一篇就够了!

本文将手把手教你使用高性能推理引擎vLLM部署Qwen大模型,并提供Python和Java两种语言的实现代码,帮助不同技术背景的开发者快速上手。

2401_82469710的博客 1397

UWB芯片DW3000之PDOA测向实现源码

本文详细介绍如何基于UWB芯片DW3000之PDOA测向的源码实现。

DT程序员的博客 2615

【大模型系列篇】使用LangGraph-Studio搭建本地深度研究工具:ollama-deep-researcher

Local Deep Researcher 是一款完全本地的网络研究助手,它可以使用由 Ollama 或 LMStudio 托管的任何大型语言模型 (LLM)。用户只需提供一个主题,它将生成一个网络搜索查询,收集相关的网页搜索结果(默认情况下通过),总结搜索结果,并反思总结以检查知识差距,发掘知识空白。接着,生成新的搜索查询,并重复用户定义的循环次数,继续深入研究以解决差距改进总结。最终它将为用户提供一个markdown 格式总结,其中包含用于生成总结的所有资源。

木亦汐丫 2114

华为非AI方向0603笔试真题-爆破小游戏(详细思路+多语言题解)

华为非AI方向0603笔试第二题【爆破小游戏】,提供详细思路讲解以及代码实现。

qq_45776114的博客 358

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

LangGraph 实战:用 Python 打造有状态智能体

状态驱动与有向图:LangGraph 通过State(通常用TypedDict定义)贯穿整个执行流程,所有节点读取并更新状态局部;有向图(Graph)则定义了节点之间的控制流 ([LangChain AI][1])。节点与边:每个Node表示一个执行单元(如 LLM 调用、工具函数、决策逻辑),Edge则可携带条件实现分支或循环,使流程更灵活可控 ([DEV Community][2])。可循环的工作流:区别于传统的 DAG(有向无环图),LangGraph 支持循环。

m0_59235245的博客 1709

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

记忆功能(langgraph)

True AIMessage(content=‘你好!有什么我可以帮忙的吗?’, additional_kwargs={}, response_metadata={‘token_usage’: {‘prompt_tokens’: 6, ‘total_tokens’: 23, ‘completion_tokens’: 17}, ‘model’: ‘mistral-large-latest’, ‘finish_reason’: ‘stop’}, id=‘run-2407a420-512d-494c-9738-c

weixin_52002907的博客 2233

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Prompt工程之LangGraph 8):LangGraph 的可视化与调试

在实际项目中,良好的日志记录能帮助你快速定位问题。LangGraph 与 Python 的标准日志库兼容,因此你可以轻松记录节点执行的日志。这个方法生成一个图形化的节点及连接,可帮助你在调试或设计阶段快速验证工作流逻辑。LangGraph 的节点可以返回状态信息,借此你可以追踪每次执行时的状态变化,帮助理解流程中数据是如何流动的。对于一个完整的 LangGraph 工作流,端到端测试确保整个流程的逻辑与状态流畅。模拟输入并检查最终结果。在处理复杂项目时,LangGraph 的调试可能会变得更加困难。

qq_42540492的博客 3145

langchain系列(九)- LangGraph 子图详解

本文主要说明LangGraph的子图代码实现以及原理简介,涉及到子图通信、人机交互、历史回溯、子图更改state、更改节点、更改子图等内容,本文也是作为多智能体的铺垫。多智能体结束后,本系列文章也就结束了。

forevercui的博客 3654

Langgraph 子图调用

理解一下就是嵌套,我比较倾向于分别做多个图实现简单的内容,然后再把他们串起来,这样更清晰。而他们之间通过state通信完成沟通。通过嵌套完成多任务的运行。

lilsyoss的博客 712

【LangGraph】Agent Supervisor:多代理监督者(Multi-agent supervisor)示例

教程展示了如何构建一个多代理系统,其中监督者代理协调专门的研究和数学代理,通过交接机制实现任务分配和通信。核心步骤:工作代理创建:研究代理使用 TavilySearch 工具进行网络搜索,专注于研究任务。数学代理使用简单的 Python 数学函数(add、multiply、divide),专注于数学计算。监督者实现:使用 langgraph-supervisor 的 create_supervisor 快速构建监督者,协调代理并管理任务流。从头构建监督者,使用自定义交接工具和 StateGraph,实现更灵

彬彬侠的博客 3322

langGraph从入门到精通(一)——langgraph概念解析

LangGraph是一种基于图计算的有状态Agent框架,旨在提供强大的编程模型,用于构建智能、自适应和可扩展的计算系统,以应对复杂计算挑战(如多轮对话、长期任务执行、多智能体协作)。功能:智能体对复杂信息(如长文档、多轮对话历史)进行汇总,提取关键要点,形成简明摘要;价值:帮助智能体快速理解复杂情境,减少后续节点的信息处理量(如将“1000字的会议记录”总结为“100字核心要点”)。子图是LangGraph中用于表示局部计算逻辑的基本单元,通过定义子图,可将复杂的图结构拆分为多个简单、可管理的模块。

swpucwf的博客 3908

LangGraph - Hierarchical Agent Teams

LangGraph - Hierarchical Agent Teams 一、前言 二、设置 三、创建工具 四、Helper Utilities 五、定义代理 Team 研究 Team 文档写作Team 六、添加图层

AI工程化、开源分享、文档翻译、代码笔记 1441

【数据结构-5】单链表的实现

单链表,具体来说是单向的、不带头的、不循环的链表。链表由一个一个节点组成,每个节点分为数据域和指针域,数据域存放数据,指针域存放下一节点的地址。这样,就可以根据指针域中的地址找到下一个节点,节点就串起来了构成了单链表。

weixin_44218929的博客 177

C# 数据结构和特殊类型

.NET Core(现称.NET)提供丰富数据结构,优化性能与开发效率。日常开发首选List<T>和Dictionary<TKey,TValue>;高性能场景推荐Span<T>与Memory<T>减少内存分配;并发环境使用ConcurrentDictionary等线程安全集合;避免非泛型集合如ArrayList。

cccloveforever的博客 673

工厂设备接MES为什么慢:协议识别与点表配置自动化的技术拆解

工业现场设备接 MES 的周期主要消耗在协议识别与点表配置。本文拆解这条链路的四层结构,给出点表映射的数据模型、两种部署架构的对比,以及可直接落地的三项验收口径与校验代码。适合工控集成、MES 实施、设备联网方向的工程师。

emfuture的博客 375
上一篇: LangGraph实现人机交互:基于中断机制的智能流程控制
下一篇: 使用LangGraph构建具备记忆功能的智能对话Agent
AI航海家(Ethan)
博客等级 码龄7年 477粉丝 91原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值