LangGraph 怎么控制递归次数

这一节我们讲讲langgraph图的递归限制 Recursion Limit,递归限制设置了图在单次执行过程中可以执行的最大超级步骤数。一旦达到该限制,LangGraph 将引发 GraphRecursionError 错误。默认情况下,此值设置为 25 步。递归限制可以在运行时为任何图进行设置,并通过配置字典传递给 .invoke 或 .stream 方法。需要注意的是,recursion_limit 是一个独立的配置键,不应像其他用户定义的配置那样放在 configurable 键内部。下面是一个示例:

graph.invoke(inputs, config={"recursion_limit": 5, "configurable":{"llm": "anthropic"}})

设置图形递归限制可以帮助您控制图形运行的时间长度,但如果达到递归限制,图形将返回一个错误——这可能并不适用于所有使用场景。相反,我们可能希望在达到递归限制之前返回状态值。下面我们将展示如何做到这一点。
我们将定义一个虚拟图,它总是会达到递归限制。首先,我们将在不返回状态的情况下实现它,并展示它确实达到了递归限制。这个图基于ReAct架构,但实际上并不进行决策和采取行动,而是永远循环下去。

from typing_extensions import TypedDict
from langgraph.graph import StateGraph
from langgraph.graph import START, ENDclass State(TypedDict):value: straction_result: strdef router(state: State):if state["value"] == "end":return ENDelse:return "action"def decision_node(state):return {"value": "keep going!"}def action_node(state: State):# Do your action here ...return {"action_result": "what a great result!"}workflow = StateGraph(State)workflow.add_node("decision", decision_node)
workflow.add_node("action", action_node)
workflow.add_edge(START, "decision")
workflow.add_conditional_edges("decision", router, ["action", END])
workflow.add_edge("action", "decision")
app = workflow.compile()
from IPython.display import Image, displaydisplay(Image(app.get_graph().draw_mermaid_png()))

下面这是我们的图形
在这里插入图片描述
这里我们验证一下是否能到达默认的递归限制

from langgraph.errors import GraphRecursionErrortry:app.invoke({"value": "hi!"})
except GraphRecursionError:print("Recursion Error")

到达了递归限制25次,成功了返回了错

Recursion Error

带回状态

为了避免达到递归限制,我们可以在状态中引入一个新的键,称为 remaining_steps 。它将跟踪到达递归限制前剩余的步骤数。然后,我们可以检查 remaining_steps 的值来决定是否应终止图执行,并在不引发递归错误的情况下将状态返回给用户。
为了实现这一点,我们将使用一个特殊的 RemainingSteps 注解。实际上,它创建了一个特殊的 ManagedValue 通道——这是一个状态通道,仅在图运行期间存在,并在其结束后消失。
由于我们的动作节点(action node)总是会至少向图中引入两个额外的步骤(因为动作节点总是在之后调用决策节点),我们将使用这个通道来检查我们是否距离限制仅剩两步之内。

from typing_extensions import TypedDict
from langgraph.graph import StateGraph
from typing import Annotatedfrom langgraph.managed.is_last_step import RemainingStepsclass State(TypedDict):value: straction_result: strremaining_steps: RemainingStepsdef router(state: State):# Force the agent to endif state["remaining_steps"] <= 2:return ENDif state["value"] == "end":return ENDelse:return "action"def decision_node(state):return {"value": "keep going!"}def action_node(state: State):# Do your action here ...return {"action_result": "what a great result!"}workflow = StateGraph(State)
workflow.add_node("decision", decision_node)
workflow.add_node("action", action_node)
workflow.add_edge(START, "decision")
workflow.add_conditional_edges("decision", router, ["action", END])
workflow.add_edge("action", "decision")
app = workflow.compile()

图形还是那个图形,现在,当我们运行这个 graph 时,应该不会收到任何错误,而是会在达到递归限制之前获取状态的最后一个值。

app.invoke({"value": "hi!"})

得到结果

{'value': 'keep going!', 'action_result': 'what a great result!'}

是不是跟我们预料的一模一样。其实上面这段代码本质上创建了一个循环工作流,可以根据剩余步骤数或特定条件动态决定何时终止,完整的演示了 LangGraph 的递归限制。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/899040.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

08-项目中不可控的任务如何安排和验收

项目中有时会有一些任务的时间是不可控的&#xff0c;不可控的原因在于该工作完全受制于他人。意思就是如果其他人没有做好&#xff0c;比如前后端同步开发&#xff0c;前端通常可能会快一些&#xff0c;然后要等后端提供接口&#xff0c;这个时候联调工作是没办法开展的&#…

【Git】git cherry-pick(将某个分支的 commit 改动复制到当前分支)

文章目录 ‌一、基础用法1.1、‌应用单个提交1.2、‌应用多个非连续提交1.3、‌应用多个连续提交 ‌二、高级用法‌2.1、冲突处理‌2.2、放弃操作‌2.3、‌不自动提交2.4、应用分支的最新提交 ‌一、基础用法 1.1、‌应用单个提交 使用提交的哈希值&#xff08;可通过 git lo…

Milvus WeightedRanker 对比 RRF 重排机制

省流:优先选择WeightedRanker 以rag为例,优先选择bm25全文检索,其次选择向量检索 Milvus混合搜索中的重排机制 Milvus通过hybrid_search() API启用混合搜索功能&#xff0c;结合复杂的重排策略来优化多个AnnSearchRequest实例的搜索结果。本主题涵盖了重排过程&#xff0c;…

C++手撕共享指针、多线程交替、LRU缓存

1. 共享指针 #include <atomic> #include <iostream>template <typename T> class sharedptr { private:T *ptr;std::atomic<size_t> *count;public:sharedptr(T *p) : ptr(p), count(new std::atomic<size_t>(1)) {}sharedptr(const sharedptr…

新版 eslintrc 文件弃用 .eslintignore已弃用 替代方案

1.进入eslint.config.mjs文件 2.import { defineConfig, globalIgnores } from "eslint/config"; 引入globalIgnores 3.配置 defineConfig([ ... globalIgnores([ "config/*", ".husky", ".local", "public/*", ".…

基于ngnix配置本地代理到对应服务器

遇到的问题&#xff1a;服务器可以访问到的地址&#xff0c;我本地代码无法访问到 在服务器上装好nginx&#xff0c;在nginx配置文件nginx.conf中配置本地想要链接对应的服务器端口信息 server {listen 8101;location / {proxy_http_version 1.1;proxy_set_header Upgrade $h…

Go 语言 fmt 模块的完整方法详解及示例

以下是 Go 语言 fmt 模块的完整方法详解及示例&#xff0c;涵盖所有核心功能&#xff1a; 一、输出函数 将数据写入标准输出、文件或字符串。 1. Print / Println / Printf 功能 Print: 写入标准输出&#xff0c;不换行。Println: 写入标准输出并换行。Printf: 格式化写入标…

在K8S中使用ArgoCD做持续部署

一、了解argocd ArgoCD是一个基于Kubernetes的GitOps持续交付工具&#xff0c;应用的部署和更新都可以在Git仓库上同步实现&#xff0c;并自带一个可视化界面。本文介绍如何使用GitArgocd方式来实现在k8s中部署和更新应用服务。关于ci这一块这里不多介绍。主要讲解argocd如何实…

可视化图解算法:删除有序(排序)链表中重复的元素

1. 题目 描述 删除给出链表中的重复元素&#xff08;链表中元素从小到大有序&#xff09;&#xff0c;使链表中的所有元素都只出现一次 例如&#xff1a; 给出的链表为1→1→2,返回1→2. 给出的链表为1→1→2→3→3返回1→2→3. 数据范围&#xff1a;链表长度满足 0≤n≤100…

ETL:数据清洗、规范化和聚合的重要性

在当今这个数据呈爆炸式增长的时代&#xff0c;数据已成为企业最为宝贵的资产之一。然而&#xff0c;数据的海量增长也伴随着诸多问题&#xff0c;如数据来源多样、结构复杂以及质量问题等&#xff0c;这些问题严重阻碍了数据的有效处理与深度分析。在此背景下&#xff0c;ETL&…

spring boot jwt生成token

1、引入jwt依赖 <!--jwt的依赖--> <dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId><version>3.18.3</version> </dependency> 2、创建TokenUtils工具类 package com.pn.utils;import com.…

豪越科技:融合低空经济的消防一体化安全管控解决方案

在科技飞速发展的当下&#xff0c;2025 年低空经济正处于规模化商用的关键节点&#xff0c;其在应急救援、物流配送等多领域展现出巨大潜力。豪越科技凭借其先进的消防一体化安全管控方案&#xff0c;与低空经济深度融合&#xff0c;打造出一套更为高效、智能的消防解决方案&am…

清华大学 | DeepSeek第十版!《DeepSeek政务应用场景及解决方案》

清华大学发布的《DeepSeek政务应用场景及解决方案》研究报告&#xff0c;聚焦人工智能技术DeepSeek在政府治理与公共服务中的创新实践&#xff0c;系统阐述了其如何通过智能化技术赋能政务数字化转型&#xff0c;推动治理能力现代化。报告指出&#xff0c;DeepSeek作为融合大数…

R语言双Y轴折线图+相关性注释

目录 包和数据 作图代码及详解 包和数据 rm(list ls()) library(ggpubr) library(scales) library(ggplot2)data <- iris##鸢尾花数据集 data1 <- data[1:30,c(1,2,3)] > head(data1)Sepal.Length Sepal.Width Petal.Length 1 5.1 3.5 …

Android Compose 框架隐式动画之过渡动画深入剖析(二十六)

Android Compose 框架隐式动画之过渡动画深入剖析 一、引言 在移动应用开发领域&#xff0c;用户体验始终是至关重要的。动画效果作为提升用户体验的关键元素&#xff0c;能够为应用增添生动性和交互性。Android Compose 作为现代 Android UI 工具包&#xff0c;为开发者提供…

sql server如何提高索引命中率

#新星杯14天创作挑战营第9期# 前言 近期发现以前开发的系统运行缓慢&#xff0c;经排查&#xff0c;发现有很大的优化空间。数据库版本使用的是sql server&#xff0c;主要有以下一些问题点&#xff1a;数据表无索引、一些不规范的写法&#xff08;例如in、大表关联&#xff0…

Qt进程间通信:QSharedMemory 使用详解

1. 什么是 QSharedMemory&#xff1f; QSharedMemory 是 Qt 中用于进程间共享内存的类。它允许多个进程共享一块内存区域&#xff0c;从而避免数据传输时的 IO 操作&#xff0c;提高通信速度。通过共享内存&#xff0c;多个进程可以直接读写这块内存&#xff0c;而无需经过文件…

2024年3月全国计算机等级考试真题(二级C语言)

&#x1f600; 第1题 下列叙述中正确的是 A. 矩阵是非线性结构 B. 数组是长度固定的线性表 C. 对线性表只能作插入与删除运算 D. 线性表中各元素的数据类型可以不同 题目解析&#xff1a; A. 矩阵是非线性结构 错误。矩阵通常是二维数组&#xff0c;属…

基于Ebay拍卖网站成交价格的影响因素分析

摘要:近些年来网上拍卖的不断地发展&#xff0c;网上购物慢慢变成了大家普遍接受的购物方式。因此关于网上拍卖的研究日益成为很多人研究的重点。 影响拍卖网站价格的因素很多&#xff0c;但很少有人分得清楚哪些因素才是比较重要的因素&#xff0c;因此对价格因素分析&#x…

Langchain中的表格解析:RAG 和表格的爱恨情仇

实现 RAG(Retrieval-Augmented Generation)是一个挑战,尤其是在有效解析和理解非结构化文档中的表格时。这在处理扫描文档或图像格式的文档时尤为困难。这些挑战至少包括以下三个方面: 1.表格的“叛逆期”:不准确的解析可能会破坏表格结构: 表格在文档里就像个叛逆的青少…