AI Agent开发学习系列 - LangGraph(10): 带有循环的Looping Graph(练习解答)

在AI Agent开发学习系列 - LangGraph(9): 带有循环的Looping Graph中,我们学习了如何创建带有循环的Looping Graph。为了巩固学习,我们来做一个练习。

用LangGraph创建如下图的一个Agent:
在这里插入图片描述
要求:

  1. 输入玩家姓名
  2. 通过输入的上限值和下限值之间,随机出一个目标值,该目标值对玩家不可见。
  3. 大模型通过不断的猜目标值直到猜中
  4. 每猜一次目标值如果没猜中,给出猜大了还是猜小了,并且调整上限或者下限值
  5. 记录尝试次数

解答:

from typing import TypedDict, List
from langgraph.graph import StateGraph, END
import randomclass AgentState(TypedDict):player_name: strtarget_number: intguesses: List[int]attempts: intlower_bound: intupper_bound: intdef setup_node(state: AgentState) -> AgentState:"""Setup the game state"""state["target_number"] = random.randint(state["lower_bound"], state["upper_bound"])state["guesses"] = []state["attempts"] = 0state["lower_bound"] = state["lower_bound"]state["upper_bound"] = state["upper_bound"]state["player_name"] = f"Hi, {state["player_name"]}. Please start the game. Guess a number between {state["lower_bound"]} and {state["upper_bound"]}.\n================================================"print(state["player_name"])return statedef guess_node(state: AgentState) -> AgentState:"""Guess the number"""state["attempts"] += 1print(f"Guess attempts: {state['attempts']}")state["guesses"].append(random.randint(state["lower_bound"], state["upper_bound"]))print(f"I guess: {state['guesses'][-1]}")return statedef hint_node(state: AgentState) -> AgentState:"""Give a hint based on the guess"""if state["guesses"][-1] == state["target_number"]:print("Your guess is correct!")elif state["guesses"][-1] < state["target_number"]:state["lower_bound"] = state["guesses"][-1]print(f"Your guess is lower than the target number. Please guess a number between {state['lower_bound']} and {state['upper_bound']}.")else:state["upper_bound"] = state["guesses"][-1]print(f"Your guess is higher than the target number. Please guess a number between {state['lower_bound']} and {state['upper_bound']}.")return statedef should_continue(state: AgentState) -> AgentState:"""Function to decide what to do next"""if state["attempts"] < 7 and state["guesses"][-1] != state["target_number"]:print("Please guess again.")print("\n--------------------------------\n")return "loop"elif state["attempts"] >= 7 and state["guesses"][-1] != state["target_number"]:print(f"Game over! The target number is {state['target_number']}.")return "exit"else:return "exit"graph = StateGraph(AgentState)graph.add_node("setup", setup_node)
graph.add_node("guess", guess_node)
graph.add_node("hint", hint_node)graph.set_entry_point("setup")
graph.add_edge("setup", "guess")
graph.add_edge("guess", "hint")graph.add_conditional_edges("hint",should_continue,{"loop": "guess","exit": END,}
)app = graph.compile()from IPython.display import Image, display
display(Image(app.get_graph().draw_mermaid_png()))result = app.invoke({"player_name": "Alex", "lower_bound": 1, "upper_bound": 20})
# print(result)

运行结果(每一次运行结果有随机性,可能都不一样):
在这里插入图片描述

Hi, Alex. Please start the game. Guess a number between 1 and 20.
================================================
Guess attempts: 1
I guess: 10
Your guess is lower than the target number. Please guess a number between 10 and 20.
Please guess again.--------------------------------Guess attempts: 2
I guess: 16
Your guess is lower than the target number. Please guess a number between 16 and 20.
Please guess again.--------------------------------Guess attempts: 3
I guess: 18
Your guess is correct!

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

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

相关文章

【保姆级 - 大模型应用开发】DeepSeek R1 本地部署全攻略:Ollama + vLLM + PyTorch 多选方案

DeepSeek R1 本地部署全攻略&#xff1a;Ollama vLLM PyTorch 多选方案 想部署 DeepSeek-R1 模型到本地&#xff0c;开启高性能推理体验&#xff1f;本文汇总了 Ollama、vLLM 及原生 PyTorch 的部署方法&#xff0c;适合不同开发者需求。 &#x1f3af; 下载模型 (必做) ----…

使用 Vive Tracker 替代 T265 实现位姿获取(基于 Ubuntu + SteamVR)

在Dexcap这篇工作列出第二版硬件清单时&#xff0c;我注意到其使用 Vive Tracker 替代 Intel T265 来获取位姿数据&#xff0c;对这个东西的性能感到好奇&#xff0c;最近因为需要跟进相关工作&#xff0c;参与了一部分实现&#xff0c;由于这方面的中文资料相对较少&#xff0…

博物馆 VR 导览:图形渲染算法+智能讲解技术算法实现及优化

本文面向博物馆数字化开发技术员、VR 系统工程师等技术同仁们&#xff0c;聚焦图形渲染算法在博物馆 VR 导览中的核心应用&#xff0c;解决虚拟展馆还原精度不足、多终端适配卡顿、智能讲解触发延迟等实际技术问题。如有项目合作及技术交流欢迎私信作者~一、VR导览技术痛点1.3D…

zset 中特殊的操作

首先 zset 与我们常规的 redis 操作有所不同, 这里的时间复杂度基本都是 O(log N) 起步的 目录 1. zcount 2. zpopmax 1. zcount zcount key min max : 这里求的是 key 中下标在 min 和 max 之间的 元素的数量, 这里是比区间 我们要是想排除端点, 就需要加上 ( , 无论是…

KSP与ASM深度对比:原理、性能与使用场景

一、核心目的差异1. KSP&#xff08;Kotlin Symbol Processing&#xff09;核心目的&#xff1a;在编译时生成新代码&#xff0c;解决样板代码问题(操作对象:.kt源文件编译过程中的中间表示)主要场景&#xff1a;自动生成DI&#xff08;依赖注入&#xff09;配置代码创建路由映…

【LLM】如何在Cursor中调用Dify工作流

这篇文章将通过一个接口文档知识库示例&#xff0c;带你了解如何在 Cursor 中通过 Mcp Server 调用 Dify 平台配置的工作流。 1. 准备工作 需要准备文本生成模型、向量模型、Rerank 模型&#xff08;可选&#xff09;&#xff0c;这些都可以在 阿里云百炼平台 申请免费使用额度…

L1、L2正则化的几何解释

L2正则化: 图中用几何方式形象地解释了 Ridge 回归&#xff08;L2正则化&#xff09;的原理。 ① 阴影圆&#xff1a;可以理解为&#xff08;w1^2 w2^2&#xff09;​≤R^2&#xff0c;圆周表示目标函数的约束线&#xff0c;这个圆表示了我们的参数 (w1,w2)可以活动的范围。 …

【学习笔记】Java并发编程的艺术——第1章 并发编程的挑战

第1章 并发编程的挑战 1.1 上下文切换 即使是单核处理器也支持多线程执行代码&#xff0c;CPU给每个线程分配CPU时间片实现多线程&#xff0c;而每个时间片一般是几十毫秒&#xff0c;所以多个线程感觉是同时执行的 但同一个核切换线程执行时会保存运行状态&#xff0c;以便下次…

leecode3 无重复元素的最长子串

我的思路 原始代码 我发现我虽然解决问题了&#xff0c;但是我的思路不简洁&#xff0c;不明白。 这个题本质上还是滑动窗口的问题。 具体思路为先定义两个指针&#xff0c;对应滑动窗口的两个边界关键是&#xff1a;定义一个集合&#xff0c;来判断这个窗口中的元素是否存在重…

【嵌入式汇编基础】-ARM架构基础(三)

ARM架构基础(三) 文章目录 ARM架构基础(三) 7、AArch64 执行状态 7.3 程序计数器 7.4 堆栈指针 7.5 零寄存器 7.6 链接寄存器 7.7 帧指针 7.8 平台寄存器 (x18) 7.9 过程内调用寄存器 7.10 SIMD 和浮点寄存器 7.11 系统寄存器 7.13 PSTATE 7、AArch64 执行状态 7.3 程序计…

[buuctf-misc]喵喵喵

m题目在线评测BUUCTF 是一个 CTF 竞赛和训练平台&#xff0c;为各位 CTF 选手提供真实赛题在线复现等服务。https://buuoj.cn/challenges#%E5%96%B5%E5%96%B5%E5%96%B5BUUCTF 是一个 CTF 竞赛和训练平台&#xff0c;为各位 CTF 选手提供真实赛题在线复现等服务。https://buuoj.…

Vue 详情模块 2

Vue 渐进式JavaScript 框架 基于Vue2的移动端项目&#xff1a;详情基础内容&#xff0c;日期及电影描述 目录 详情 详情基础内容 初始化与赋值 渲染基础内容 详情样式 日期处理 安装moment 定义过滤器 使用过滤器 电影描述 总结 详情 详情基础内容 初始化与赋值 …

【MODIS数据】MYD03

&#x1f30d; 遥感数据的“导航仪”&#xff1a;深入解析MYD03地理定位产品 在卫星遥感领域&#xff0c;精确的地理定位是数据应用的基础。作为Aqua卫星中分辨率成像光谱仪&#xff08;MODIS&#xff09;的核心支撑产品&#xff0c;MYD03虽不如地表温度或植被指数产品知名&am…

如何填写PDF表格的例子

实际应用场景中&#xff0c;我们会遇到需要根据会话内容自动填写表格的情况&#xff0c;比如&#xff1a;pdf 表格。假设根据会话内容已经获得相关信息&#xff0c;下面以填写个人信息为例来说明。个人信息表格.pdf填写后的效果&#xff1a;填写代码如下&#xff1a;from pdfrw…

2023年影响重大的网络安全典型案例

以下是2023年影响重大的网络安全典型案例&#xff0c;按时间顺序梳理事件经过及技术细节&#xff1a;---一、DeFi协议攻击&#xff1a;dForce借贷协议遭入侵&#xff08;2023年4月&#xff09;** - 时间线&#xff1a; - 4月19日08:58&#xff1a;黑客开始攻击Lendf.Me合约&…

Vue 响应式基础全解析2

DOM更新时机 修改响应式状态后,DOM更新不是同步的。Vue会缓冲所有修改,在"next tick"周期中统一更新,确保每个组件只更新一次。 如需在DOM更新后执行代码,可使用nextTick(): import {nextTick } from vueasync function increment() {count.value++

【黑马SpringCloud微服务开发与实战】(九)elasticsearch基础

1. 认识elasticsearch2. 认识和安装ES主播这里之前已经安装好了&#xff0c;资料包里面有镜像 docker run -d \--name es \-e "ES_JAVA_OPTS-Xms512m -Xmx512m" \-e "discovery.typesingle-node" \-v es-data:/usr/share/elasticsearch/data \-v es-plugin…

由浅入深地讲清楚浏览器缓存

一、什么是浏览器缓存&#xff1f;&#xff08;入门级&#xff09; 1. 浏览器缓存的定义浏览器缓存就是&#xff1a;浏览器把之前请求过的资源保存起来&#xff0c;下次访问同样的资源时可以直接用本地副本&#xff0c;而不是重新请求服务器。举个生活例子&#xff1a; 你第一次…

Linux I/O 多路复用机制对比分析:poll/ppoll/epoll/select

Linux I/O 多路复用机制对比分析&#xff1a;poll/ppoll/epoll/select 1. 概述 I/O 多路复用是现代高性能网络编程的核心技术&#xff0c;它允许单个线程同时监视多个文件描述符的状态变化&#xff0c;从而实现高效的并发处理。Linux 提供了多种 I/O 多路复用机制&#xff0c…

高防服务器租用:保障数据安全

您的网络速度是否卡顿&#xff0c;业务是否经常受到网络攻击的威胁呢&#xff1f;别担心&#xff0c;高防服务器租用能够帮助你解决这些困扰&#xff01;高防服务器租用拥有着卓越的防御能力&#xff0c;可以帮助企业抵御各种网络攻击&#xff0c;能够轻松化解各种超大流量的网…