随笔分类 - LangGrpah
摘要:核心模块 使用 langsmith 部署 langgraph 应用的时候,需要提供以下信息: langgraph.json:这是一个配置文件,用于指定应用所需的依赖、graph 和环境变量。相当于告诉系统: 这个应用需要哪些依赖 有哪些graph graph对应的映射关系 环境变量 实现应用逻辑的一
阅读全文
摘要:在写普通函数的时候,测试其实是一件很自然的事情:给输入,看输出,对不对,一跑就知道。 但在 langgraph 里,情况会复杂一些。因为这里测试的对象,已经不只是一个函数了,而是: 多个节点组成的流程 带状态流转 可能中断、可能恢复 还可能依赖 checkpoint 也就是说,在 langgraph
阅读全文
摘要:在 langgraph 中,其实有两套写流程的方式: Graph API Functional API Functional API 把工作流从画流程图变成写业务函数,但依然保留可恢复、可中断、可追踪的能力。 传统 Graph API 的思路:先设计一张图,再往图里塞节点 Function API
阅读全文
摘要:1. 不要用try/catch包裹interrupt调用 我们在写带 interrupt 的节点函数时,有一个很隐蔽但非常关键的陷阱: interrupt的暂停机制,其实是通过“抛出一个专门的异常”来实现的,也就是说,langgraph在内部让代码“假装抛错”,从而中止执行,把控制权交还给运行时的图
阅读全文
摘要:外界获取中断的值 用户编辑图状态 工具内的中断 验证用户输入 外界获取中断的值 result.__interrupt__ 就是中断时,langgraph 暴露给外界的数据。外界(UI / CLI / 后端系统)就是靠它拿到 interrupt 里传出的内容的。 interrupt({ // 配置要传
阅读全文
摘要:基本介绍 一句话定义:静态断点,是在编译图时就确定好的中断点,用于保证某个节点在执行前或执行后一定会暂停。 静态断点的两种形式 LangGraph 提供了两种静态断点配置方式: interrupt_before:在指定节点 开始执行之前 暂停。 interruptBefore: ["node_nam
阅读全文
摘要:基本介绍 langgraph中的中断分为两种: 静态断点 动态中断 1. 静态断点 在编译图时配置。适用于“在某个节点执行前或后必须暂停”的场景。 interrupt_before=["node_name"]: 在指定节点开始执行前暂停。 interrupt_after=["node_name"]:
阅读全文
摘要:中断指的就是允许图在执行的过程中暂停,等待外部输入。这种机制提供了一种“人类参与”的交互模式,某些场景下某些决策非常重要,需要人类来做出最终抉择,这个时候就可以使用中断。 场景案例 下面我们先来看一下,如果不使用中断,是否能够实现下面的场景: 需求:让大模型帮我们书写邮件,人类给出反馈 approv
阅读全文
摘要:前面我们已经知道:长期记忆的核心作用,是存储用户的长期信息,例如用户画像、偏好、背景事实等。 但如果长期记忆只支持“精确匹配”,那它的价值其实是有限的。 真正让长期记忆“变聪明”的能力,那就是语义搜索。 为什么长期记忆一定要配合语义搜索? 用户之前说过:我很喜欢吃披萨 那么当他之后说:我有点饿了 A
阅读全文
摘要:长期记忆是需要长久保持的,长期记忆通常用于存储: 用户画像 偏好 历史习惯 长期事实(不会频繁变) 例如: 用户是前端工程师 用户更喜欢中文回答 用户不需要基础解释 用户常问某一类问题 凡是“不应该被时间旅行影响的事实”,就应该放进长期记忆,而非短期记忆。下面是短期记忆和长期记忆两者之间的对比: 维
阅读全文
摘要:随着对话会随着轮数不断增长。 这时候,一个非常现实的问题就会出现:对话越聊越长,最终可能会超出大模型的上下文窗口限制。 这并不是 langgraph 独有的问题,而是所有基于大模型的长对话系统都会遇到的限制。 为了解决这个问题,通常有几种常见的处理思路。 裁剪消息 永久删除消息 总结消息 自定义策略
阅读全文
摘要:在入门和演示阶段,我们使用的是: new MemorySaver() 它足够简单,也非常适合理解机制。但一旦进入真实工程环境,就会立刻遇到一个问题:内存是靠不住的。 服务重启,短期记忆就没了 多实例部署,内存无法共享 无法支持稳定的时间旅行和恢复 这也是为什么官方在生产环境示例中,直接给出了 Pos
阅读全文
摘要:这节课我们来介绍一下记忆。在 langgraph 中,记忆分为两种: 短期记忆:Short-term Memory 长期记忆:Long-term Memory 基本概念 所谓短期记忆,指的就是在某一个 thread 内持续演化的 State。只要 State 在同一个 thread_id 下被反复传
阅读全文
摘要:所谓时间旅行(时间回溯),指的就是可以从先前的检查点恢复执行。 这个特性核心就是利用 checkpoint 来实现的。 如下图所示: 假设我们执行一张图,要经历 A -> B -> C -> D -> E 在执行 C 节点的时候,状态还可以有 C' 的可能性,但是又不想从头开始执行整张图,因为 A
阅读全文
摘要:getState:可以获取最后的检查点快照,如果传了checkpoint_id,那么就获取对应checkpoint_id的快照。 获取所有的检查点快照 list:不是graph上面的方法,而是checkpointer上面的方法 getStateHistory:是graph上面的方法 1. 获取最新状
阅读全文
摘要:元数据标记,就是在创建模型时附加tag,这些tag会出现在流式输出或metadata中,从而用于标记、归类不同模型调用。 举个例子,假设一个节点里调用了两个模型: 一个模型负责写笑话 一个模型负责写诗 它们都是流式输出token。 这个时候就会遇到一个问题: 如果前端想“只显示笑话模型的 token
阅读全文
摘要:LangGraph中将流式处理列为了核心功能之一,可以通过 stream() 方法来获取流式内容。 在获取流式内容的同时,还可以通过 streamMode 来指定不同的类型: 这节课我们先来看前面2种流类型: 值流 更新流 值流和更新流 值流 每次节点执行后,直接把整个 state(完整对象)流给你
阅读全文
摘要:核心概念 子图直接“嵌入”到父图内,成为父图的一部分,与父图共享 state 的 key。 示意图: 父图节点 > { 子图内部的很多节点 } > 父图下一个节点 看起来像父图的一个 node,但内部却是一个完整的 graph。 也正因为如此: 子图与父图使用同一个 state(共享部分或全部 ke
阅读全文
摘要:所谓子图,顾名思义,就是在一张图里面还嵌套了另外一张图。 子图常见的应用场景: 构建多智能体系统 在多个图中复用一组节点 分布式开发 当希望不同团队独立开发图的不同部分时,可以将每个部分定义为一个子图。 只要子图的接口(输入输出 schema)保持一致,父图就可以在无需了解子图内部细节的情况下进行构
阅读全文
摘要:Overview A small demo, using LangGrpah to calling real tool to write an artical about the topic user defined. Project structure tool-calls ├── output
阅读全文

浙公网安备 33010602011771号