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
英文地址,請注明出處:http://en.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;能夠輕松化解各種超大流量的網…