第 16 章 · AI Agent 共享状态:AgentState 与 Channels

LangGraph智能体设计模式实战:构建可调度、有记忆、可运维的AI工作流 智能体(Agent)是大模型从对话工具迈向自主执行系统的关键范式,其核心在于状态管理、条件控制与人机协同能力。LangGraph通过StateGraph将工作流建模为带状态的有向图,以checkpointer实现持久化记忆,以conditional edge支持动态决策,以interrupt机制原生集成人工审核,显著提升AI系统的可靠性、可观测性与生产就绪度。相比传统Chain线性编排,LangGraph在多步骤任务准确率、错误恢复MTTR和混合人机流程接入效率上具备工程级优势,已成为构建客服工单处理、金融 阅读详情

版本:LangGraph4j 1.8.25

目标:弄清节点返回的部分 Map 如何按键合并进共享状态。

本章不接模型、不跑整张图;合并规则用 AgentState.updateState 直接演示。

上图两列对应两种工厂:Channels.base 后写覆盖;Channels.appender 往列表末尾追加。每个状态键在 schema 里绑一种策略。


16.1 节点只交部分更新

节点返回的是要改的键,不是整份新状态:

return Map.of(
        "intent", "book",
        "messages", List.of("user: 帮我订票")
);

合并时要定两件事:

  1. intent 这类标量:新值盖旧值。

  2. messages 这类列表:本轮消息追加到已有列表。

Channel 就是某个键的合并策略,可选地带默认值。schema 把键名绑到 Channel 上:

Map<String, Channel<?>> schema = Map.of(
        "intent", Channels.base(() -> ""),
        "messages", Channels.appender(ArrayList::new),
        "logs", Channels.appenderWithDuplicate(ArrayList::new)
);

图构造时把 schema 和状态工厂一起传入:

new StateGraph<>(schema, ChatState::new);

没有 schema 的构造内部是空 Channel 表:没声明的键按覆盖写入。对话列表这种键,要显式绑 appender。


16.2 状态类怎么写

AgentState 持有一份 Map。子类负责读起来顺手:

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
​
import org.bsc.langgraph4j.state.AgentState;
import org.bsc.langgraph4j.state.Channel;
import org.bsc.langgraph4j.state.Channels;
​
public class ChatState extends AgentState {
​
    public static final String INTENT = "intent";
    public static final String MESSAGES = "messages";
    public static final String LOGS = "logs";
​
    public static final Map<String, Channel<?>> SCHEMA = Map.of(
            INTENT, Channels.base(() -> ""),
            MESSAGES, Channels.appender(ArrayList::new),
            LOGS, Channels.appenderWithDuplicate(ArrayList::new)
    );
​
    public ChatState(Map<String, Object> initData) {
        super(initData);
    }
​
    public Optional<String> intent() {
        return value(INTENT);
    }
​
    public List<String> messages() {
        return this.<List<String>>value(MESSAGES).orElseGet(List::of);
    }
}

data() 返回不可变视图。节点里不要对 data() 拿到的 List 做 add;要改就返回新的 partial Map,交给 Channel 合并。

框架里还有两个标记对象:

标记作用
AgentState.MARK_FOR_RESET该键回到 Channel 的默认值(Supplier 再调一次)
AgentState.MARK_FOR_REMOVAL从状态里删掉该键

MARK_FOR_RESET 要求默认 Supplier 产出可变结构。列表用 ArrayList::new;不要用 List::of 当默认。


16.3 合并怎么算:对着跑一遍

下面不建图,直接调用 AgentState.updateState,看两次节点更新叠在同一份状态上的结果:

import java.util.List;
import java.util.Map;
​
import org.bsc.langgraph4j.state.AgentState;
import org.bsc.langgraph4j.state.AppenderChannel;
import org.bsc.langgraph4j.state.RemoveByHash;
​
public class ChannelMergeDemo {
​
    public static void main(String[] args) {
        Map<String, Object> state = Map.of(
                ChatState.INTENT, "ask",
                ChatState.MESSAGES, List.of("user: 你好"),
                ChatState.LOGS, List.of("n1")
        );
​
        // 第一次:改 intent,追加一条 message,追加一条 log
        state = AgentState.updateState(state, Map.of(
                ChatState.INTENT, "book",
                ChatState.MESSAGES, List.of("user: 帮我订票"),
                ChatState.LOGS, List.of("n2")
        ), ChatState.SCHEMA);
​
        System.out.println(state.get(ChatState.INTENT));
        // → book
        System.out.println(state.get(ChatState.MESSAGES));
        // → [user: 你好, user: 帮我订票]
        System.out.println(state.get(ChatState.LOGS));
        // → [n1, n2]
​
        // 第二次:appender 下返回 List 仍是追加;整表替换要用 ReplaceAllWith
        state = AgentState.updateState(state, Map.of(
                ChatState.MESSAGES,
                AppenderChannel.ReplaceAllWith.of(List.of("system: 只保留这条"))
        ), ChatState.SCHEMA);
​
        System.out.println(state.get(ChatState.MESSAGES));
        // → [system: 只保留这条]
​
        // 按 hash 删掉某一条(也可混在 List 里:List.of("新消息", RemoveByHash.of(...)))
        state = AgentState.updateState(state, Map.of(
                ChatState.MESSAGES,
                RemoveByHash.of("system: 只保留这条")
        ), ChatState.SCHEMA);
​
        System.out.println(state.get(ChatState.MESSAGES));
        // → []
​
        // 清空 logs:RESET 回到默认空 ArrayList
        state = AgentState.updateState(state, Map.of(
                ChatState.LOGS, AgentState.MARK_FOR_RESET
        ), ChatState.SCHEMA);
​
        System.out.println(state.get(ChatState.LOGS));
        // → []
    }
}

读这段时对照上图:intent 从 ask 变成 book;messages 先追加再被 ReplaceAllWith 整表换掉。


16.4 Channels 工厂(1.8.25)

包:org.bsc.langgraph4j.state.Channels。

工厂合并语义典型用途
base(Supplier)后写覆盖前写intent、status、标量
base(Reducer) / base(Reducer, Supplier)自定义折叠分数取 max、计数累加
appender(listSupplier)追加,按 Objects.hash 去重对话 messages
appenderWithDuplicate(listSupplier)追加,允许重复审计日志、调试轨迹

自定义 Reducer 要对 null 宽容。默认 Supplier 每次新建可变容器,不要共享同一个 List 实例。

1.8.25 没有 MessageChannel。消息列表用 Channels.appender。

库里还带了现成的消息状态:

import java.util.HashMap;
​
import org.bsc.langgraph4j.prebuilt.MessagesState;
import org.bsc.langgraph4j.prebuilt.MessagesStateGraph;
import org.bsc.langgraph4j.state.Channels;
​
// MessagesState.SCHEMA → "messages" : Channels.appender(ArrayList::new)
var graph = new MessagesStateGraph<String>();
​
// 要加业务键:复制一份再 put(SCHEMA 本身是不可变 Map)
var schema = new HashMap<>(MessagesState.SCHEMA);
schema.put("intent", Channels.base(() -> ""));

每个键只绑一种 Channel。


16.5 Appender 的几种写入形态

对 appender / appenderWithDuplicate 键,节点返回值按类型处理:

返回值效果
List(普通)追加到已有列表
ReplaceAllWith.of(list)整表替换
RemoveByHash.of(element) 或自定义 RemoveIdentifier按标识删元素
MARK_FOR_RESET回到默认空列表
MARK_FOR_REMOVAL删掉该键

常见写错:

写法结果
把「本轮拿到的全量 messages」当普通 List 返回appender 会再追加一遍,列表膨胀
Channels.appender(List::of)默认不可变,MARK_FOR_RESET 容易出问题
继续用旧资料里的 MessageChannel1.8.25 已无此类,改用 Channels.appender

本轮只返回新增的那几条;要换整表就显式包 ReplaceAllWith。


16.6 键怎么分、并行时怎么合

状态键可以按用途选 Channel:

用途选什么
累积证据(对话、审计)appender / appenderWithDuplicate
当前控制量(意图、阶段)base
聚合指标(最高分、计数)base(Reducer)

多个分支同时写同一个键时:

Channel合并结果
appender*列表拼接,再按是否去重处理
base 无 reducer后写覆盖,谁先谁后会影响结果
base 有 reducer按 reducer 折叠

并行分支尽量写不同键,收尾再由汇总节点合成;同一标量键留给单个节点写。

「文智助手」全场景办公AI助理AI+OPC全流程实践方案(大赛作品) 阅读详情

相关推荐

AI学习-langgraph-1

1. 定义全局状态定义整个运行图共享的全局状态(实际上,除了全局状态,LangGraph还支持其它类型的状态,下文详述)2. 创建状态图创建 StateGraph实例,将状态和状态图绑定3. 定义图结构定义节点和边并添加到状态图中全局状态是 LangGraph 运行图每个节点都可以访问的公共对象。return {"logs": ["node_1 运行完毕"],return {"logs": ["node_2 运行完毕"],状态的定义实际上是在声明状态的Schema,后者是状态字段的完整描述。

qq_62408075的博客 363

LangGraph Channels 深入解析:状态管理与通信系统的底层原理与实战

> 本文为 LangGraph 系列教程的第 3 章,完整系列见 [docs/LangGraph/index.md](https://link.gitcode.com/i/0f26436ee2346a0f3e8293f4e1f23eca)。此前我们已在 [第 1 章:Graph / StateGraph](https://link.gitcode.com/i/affa763a5ed2a97aa81

gitblog_00816的博客 166

手把手教你用XC7A35T FPGA搭建低成本机器视觉系统(含开发板选型指南)

本文详细介绍了如何利用AMD(原Xilinx)Artix-7系列中的XC7A35T FPGA芯片,搭建一套低成本的机器视觉系统。内容涵盖从芯片选型深度剖析、开发板(如黑金AX7035B)对比指南,到使用Vivado创建工程、编写图像处理模块(如RGB转灰度),以及资源优化和与上位机(如OpenCV)协同工作的完整流程,旨在为开发者提供一套可实践的高性价比硬件加速视觉解决方案。

beta5的博客 353

从零构建商超AI Agent:基于ROS 2与多模态大模型的技术实践

AI Agent(智能体)作为人工智能技术的重要分支,其核心在于通过感知、决策与执行的闭环,模拟人类在特定环境中的智能行为。其技术原理通常基于多模态感知(如计算机视觉与语音识别)、大语言模型驱动的任务规划以及知识库融合。在工程实践中,这种架构能够显著提升垂直行业的自动化水平与交互体验,尤其在零售、服务等线下场景中展现出巨大潜力。本文以商超导购为典型应用场景,深入探讨如何利用ROS 2(机器人操作系统)框架整合视觉识别、语音对话与任务规划模块,并基于开源技术栈(如LangChain、本地化LLM)实现一个可部

weixin_30603633的博客 308

AI编程助手Cursor如何革新经济学研究:从计量模型到可视化全流程实战

在数据科学和人工智能技术蓬勃发展的今天,如何高效地将前沿AI工具融入专业领域的研究工作流,成为提升科研效率的关键。其核心原理在于通过自然语言交互,将研究者的专业问题转化为机器可执行的指令,从而实现人机协作的范式转移。这一技术的核心价值在于大幅降低非计算机背景研究者的编程门槛,将精力从繁琐的代码实现中解放出来,更聚焦于学科本身的思想与逻辑。尤其在经济学、金融学等高度依赖数据分析和计量建模的领域,AI编程助手能够快速处理数据清洗、模型估计、可视化及结果解释等任务。具体到应用场景,研究者可以利用结构化提示词工程,

weixin_42531579的博客 296

R | 提取文件夹内栅格数据的最小值、最大值、标准差和平均值

各位同学好,我们长需要用长时间序列栅格数据的平均值做变量的时间变化分析,用代码能够帮助我们省下很多时间。

qq_48539301的博客 449

DeerFlow 2.0 架构全景:四服务拓扑、Harness/App 分层、中间件链与沙箱隔离模型

本文以 [docs/ARCHITECTURE.md](https://link.gitcode.com/i/31aa4e07933cebfe681557da8f15298f) 为骨架,系统梳理 DeerFlow 2.0 的整体架构:Nginx 统一入口的服务拓扑、后端 Harness/App 单向依赖分层、`make_lead_agent` 组装的中间件链、`ThreadState` 与虚拟路径沙

gitblog_00459的博客 229

从 SAP ABAP 到 S/4HANA,SAML 2.0 单点登录到底是怎么跑起来的

在很多 SAP 项目里,SSO 不是一个锦上添花的功能,而是系统能不能顺利上线的基本门槛。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1050

大模型系统开发能力体系

本文系统梳理了大模型开发的核心知识体系,分为底层认知层和模型演进层。底层认知层涵盖机器学习基础概念(张量、梯度、链式法则、概率分布)和LLM关键参数(Token、上下文窗口、温度等控制参数)。模型演进层分析主流架构发展:CNN通过局部感受野处理图像,RNN/LSTM用于序列建模但存在并行性差等问题,Transformer凭借自注意力机制实现全局依赖建模成为当前主流。全文提供了参数组合策略等技术细节,为开发者构建了从理论基础到实践应用的能力框架。

weixin_45130169的博客 1275

家人们,谁懂啊,dify又报错了:[models] Bad Request Error, 500 Server Error:Internal Server Error for url: http://

本来今天下班,坐在地铁上,一身劳累。一起上班的小兄弟儿,突然甩来一张截图:老大!dify又报错了。没办法,一到家就打开电脑,开始排查。

xiezhipu的博客 882

boost::circular_buffer缓行缓冲区

1、circular_buffer实现了一个环形缓冲区,空间大小是固定的,当到达容器末尾时,将自动利用容器另一端的位置空间。 2、当程序需要容纳大量的元素,但多数情况下仅保存较少数量元素时可以使用circular_buffer_space_optimized,他可以有效的减少内存的占用,提高程序的运行效率。 3、主要接口: 4、实现一个生产者---消费者模式示例: #inc...

小米的修行之路 791

视频隐私脱敏工程化:CSRT/KCF追踪算法在本地推理中的实现与边界

在短视频内容合规审查中,动态遮挡(Dynamic Masking)是高频且高耗时的环节。传统手动关键帧打码不仅效率低下,且在目标快速移动或遮挡时极易出现遮罩漂移。本文从计算机视觉工程角度,解析基于CSRT与KCF算法的目标追踪方案在视频隐私处理中的技术路径、性能权衡及落地实践。

Mysssone的博客 224

6 款电商 AI 图片生成软件实测|国内 + 跨境卖家工具清单

电商 AI 作图工具已经从 "能不能用" 进入了 "好不好用" 的阶段。对于绝大多数卖家而言,现在的 AI 工具已经可以覆盖 60%-80% 的基础商品图需求,显著降低拍摄和设计成本。选择工具的核心逻辑不是 "哪款最强",而是 "哪款最适配你的品类、平台规模和团队能力"。垂直电商工具胜在工作流效率,通用生图工具强在创意上限,模板类工具赢在上手速度。建议根据自身业务阶段,搭配 1-2 款主力工具 + 1 款辅助工具,形成适合自己的视觉生产流程。

Mardi_Ladin的博客 398

【100%通过率】华为OD机试真题 C++ 实现【水库蓄水问题】【2022.11 Q4 新题】

给定一个长度为 n 的整数数组height。数组的元素表示山的高度,选择两个元素作为水库的边界,求蓄水量的最大值并输出蓄水量最大时的边界下标(蓄水量相同时输出下标较近的)。

MISAYAONE的博客 1万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

我用 GPUWorks 在 M1 Pro 上搭了个发票识别原型

公司里经常要看电子发票。我想先做个小原型:把 PDF 发给一个自己部署的图文模型,让它提取发票类型、日期、交易双方和金额,再把结果交给同事核对。这个原型不用先接财务系统,先看看从部署到调用要走多少步,模型返回的内容能不能帮上忙。

鸽芷咕的博客 2万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

您您这可以把问小白的多个会话比如说。左侧的多个会话一次性导出吗?不是单条会话里面的多次会对话。AI导出鸭

第三层是格式编译层。这个决策背后的判断很清晰:一个批量导出工具的价值,不在于“试三次”,而在于你真正用它处理了几十份技术文档、访谈记录或课程讲义之后,它是否值得留在你的工作流里。问小白的会话列表通过分页接口加载,AI导出鸭 在页面运行时建立旁路监听,捕获每一次分页请求返回的完整对话清单,包括会话 ID、标题、时间戳和隐藏的元数据字段。让AI导出回归优雅——这句话说的是:导出不该是体力活,而应该是一次完整的、可预期的文件交付。注意:这里的“批量”指的是左侧列表里的多个独立会话,不是一条会话内的多轮对话。

laoyunsi的博客 246

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

【从零理解 Spring AI · 12】MCP 的两种角色:做客户端还是做服务端

上一篇讲了 MCP 的概念:标准协议、三大角色、M+N 替代 M×N。

nice_lcj520的博客 501

河道漂浮物目标检测数据集

目标检测,yolo,河道漂浮物目标检测数据集

DL_data_set的博客 201

AI Agent之核心框架

A: 显式 Thought 有三类价值:可解释性(便于人类审计)、可调试性(定位哪一步选错工具)、学习信号(可做监督微调或评估中间步骤质量)。ReAct 把推理与 可执行行动 绑定,每一步行动后都有 真实 Observation 反馈,从而用工具结果约束生成,降低闭卷幻觉。做完不等于结束——还要 评估做得好不好,把 教训 记下来,下次 带着教训重试,反思作为 记忆,影响后续尝试的策略。工作流程:Action → Evaluation → Reflection → Retry。A: 普通 CoT 只在。

剑雨巍巍的博客 199

AI 应用开发工程师技术实践:大模型接入、通用组件封装与性能优化

本文提出AI应用从PoC到生产的核心挑战:模型调用的持续可用、可控与可优化。通过构建统一LLM网关实现多供应商路由与故障转移,封装对话、工具调用与RAG组件以解耦业务逻辑,结合前缀缓存、批处理与流式背压治理等性能优化手段,形成“接通→接稳→接快”的工程路径,最终以工程化能力决定AI应用的生产可用性。

2301_79189962的博客 558

AI前沿日报 · 2026-11-04 | 祛魅时刻:Astra“纯读权重“神话的崩塌

①Astra"裸权重通吃"被spaCy创始人Honnibal精准祛魅——仅1/3实验真裸读,数学能力提升依赖Python+50次迭代;②Simon Willison用Qwen 3.8-27B端侧复现权重空间编程;③Nvidia开源Auto-Ontology自动知识图谱;④$800开源全域抓取机器人Stringman;⑤OpenAI悄然重开Codex训练开关引信任危机;⑥DeepMind发布Gemini 4 Argon机器人基础模型;⑦美国科技巨头隐性AI债务达3.2万亿美元,6个月增90%。

johnsong2009的博客 574

大模型 Embedding 与向量相似度详解

Embedding 解决的问题:计算机不懂文字,但懂数字│▼文本 → 向量(1024维浮点数数组)│▼相似度解决的问题:怎么判断两个向量(文本)有多接近│▼余弦相似度:看向量方向的夹角,越接近0°越相似│▼最终效果:语义搜索——理解意思,而非字面匹配一句话总结:Embedding 把文字变成数字,余弦相似度比较数字的方向,两者结合实现了"理解语义"的搜索。

T3165919332的博客 90

GPT-1 架构和计算细节

下面配合框图,对 GPT-1 的每个组件做公式展开 + 数值实例(配置:12 层 × 768,12 头,FFN 3072,词表 40478,共 117M 参数)。GPT-1 把翻译模型的编码器-解码器砍掉一半,只留解码器,然后以"预测下一个词"为目标在 BooksCorpus 上预训练。与 2017 原版的四个架构差异(框图中标 ★):h0=E[token]+Epos[position],E∈R40478×768, Epos∈R512×768h^0 = E[\text{token}] + E_{pos}[\

eloudy的专栏 278

终端 AI 审计与 “龙虾” 类智能体风险治理:从可见性到闭环溯源

生成式 AI 办公普及之后,数据泄露风险逐步下沉到终端。员工将合同、源代码、客户资料粘贴至公有大模型,以及龙虾(OpenClaw)这类本地开源 AI 智能体的滥用,成为企业安全新挑战。传统网络边界防护存在审计盲区,本文从风险链路拆解、核心能力模型、分级治理策略、落地踩坑点以及技术局限性多角度,分享终端侧 AI 安全治理的实践思路。

2401_86491085的博客 640

2.53 基于极稀疏指纹的室内定位注意力图元学习

该论文发表于IEEE Transactions on Mobile Computing(TMC)2026年6月,面向极稀疏指纹条件下的WiFi室内定位,针对指纹采集人力成本高、标记指纹稀缺时定位精度大幅下降的痛点,提出注意力图元学习模型AGML(Attentional Graph Meta‑Learning),结合图神经网络、元学习、两种指纹数据增强与分布对齐技术,在标记指纹极少的场景实现高精度室内定位,同时公开了多套真实+仿真定位数据集用于基准测试。场景:二维室内空间,障碍物造成信号遮挡,

weixin_42963026的博客 338
上一篇: 第 15 章 · 第一个 AI 工作流:Hello Graph 从 START 跑到 END
下一篇: 第 17 章 · 编排 AI 流程:StateGraph 节点、条件边与意图路由
AI深栈
博客等级 码龄14年 1粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值