AI Agent設計模式三:Routing

概念 :動態路徑選擇器

  • ? 優點:靈活處理不同類型輸入
  • ? 缺點:路由邏輯復雜度高

在這里插入圖片描述

from typing import TypedDict
from langchain_core.messages import SystemMessage, HumanMessage
from langchain_openai import ChatOpenAI
from langgraph.graph import StateGraph, START, END
from typing_extensions import Literal
import osfrom langchain_core.pydantic_v1 import BaseModel,Field# 初始化模型
llm = ChatOpenAI(model="gpt-3.5-turbo",openai_api_key=os.environ["GPT_API_KEY"],openai_api_base="https://api.chatanywhere.tech/v1",streaming=False  # 禁用流式傳輸
)class Route(BaseModel):step: Literal["議論文", "記敘文", "散文"] = Field(description="寫作風格類型,必須是以下之一:議論文、記敘文、散文")class State(TypedDict):input: strdecision: stroutput: str# 定義提示詞映射表
PROMPT_TEMPLATES = {"議論文": "請以嚴謹的邏輯結構闡述觀點,包含明確的論點、論據和結論。","記敘文": "請用生動形象的語言講述一個完整的故事,包含時間、地點、人物和事件發展。","散文": "請以抒情或敘議結合的方式表達主題思想,注重語言美感和意境營造。"
}def llm_call_1(state: State):prompt = f"{PROMPT_TEMPLATES['議論文']} \n 主題如下:{state['input']}"result = llm.invoke(prompt)return {'output': result.content}def llm_call_2(state: State):prompt = f"{PROMPT_TEMPLATES['記敘文']} \n 主題如下:{state['input']}"result = llm.invoke(prompt)return {'output': result.content}def llm_call_3(state: State):prompt = f"{PROMPT_TEMPLATES['散文']} \n 主題如下:{state['input']}"result = llm.invoke(prompt)return {'output': result.content}def llm_call_router(state: State):# 結構化輸出router = llm.with_structured_output(Route, method="function_calling")print(f"state:{state}")decision = router.invoke([SystemMessage(content="你是一個寫作風格分類器。請根據輸入的主題判斷最適合的寫作風格。"),HumanMessage(content=state['input'])])print(f"decision:{decision}")return {'decision': decision.step}# 條件邊
def router_decision(state: State):if state['decision'] == '議論文':return "llm_call_1"elif state['decision'] == '記敘文':return "llm_call_2"elif state['decision'] == '散文':return "llm_call_3"workflow = StateGraph(State)# 添加節點
workflow.add_node("llm_call_1", llm_call_1)
workflow.add_node("llm_call_2", llm_call_2)
workflow.add_node("llm_call_3", llm_call_3)
workflow.add_node("llm_call_router", llm_call_router)# 添加邊
workflow.add_edge(START, "llm_call_router")
workflow.add_conditional_edges("llm_call_router",router_decision,{"llm_call_1": "llm_call_1","llm_call_2": "llm_call_2","llm_call_3": "llm_call_3"})
workflow.add_edge("llm_call_1", END)
workflow.add_edge("llm_call_2", END)
workflow.add_edge("llm_call_3", END)graph = workflow.compile()response = graph.invoke({"input": "天邊的云"})
print(f"選擇的文體為:{response['decision']}")
print(f"文章:{response['output']}")

執行結果
在這里插入圖片描述

常見問題

遇到的問題如下:

結構化輸出這里太難用了 每次都報結構化輸出失敗。。。
router = llm.with_structured_output(Route)

openai.BadRequestError: Error code: 400 - {‘error’: {‘code’: ‘invalid_parameter_error’, ‘param’: None, ‘message’: ‘<400> InternalError.Algo.InvalidParameter: The tool call is not supported.’, ‘type’: ‘invalid_request_error’}, ‘id’: ‘chatcmpl-a711b580-58af-9286-bad1-ddc36b8a44d2’, ‘request_id’: ‘a711b580-58af-9286-bad1-ddc36b8a44d2’}
During task with name ‘llm_call_router’ and id ‘3437df04-e2bc-aac5-f29b-c3417070c369’

原因:
with_structured_output方法對很多大模型沒有適配,原本用的deepseek一直報錯,換成chatgpt之后就沒問題了

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/900290.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/900290.shtml
英文地址,請注明出處:http://en.pswp.cn/news/900290.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

制造裝備物聯及生產管理ERP系統設計與實現(代碼+數據庫+LW)

摘 要 傳統辦法管理信息首先需要花費的時間比較多&#xff0c;其次數據出錯率比較高&#xff0c;而且對錯誤的數據進行更改也比較困難&#xff0c;最后&#xff0c;檢索數據費事費力。因此&#xff0c;在計算機上安裝制造裝備物聯及生產管理ERP系統軟件來發揮其高效地信息處理…

`use_tempaddr` 和 `temp_valid_lft ` 和 `temp_prefered_lft ` 筆記250405

use_tempaddr 和 temp_valid_lft 和 temp_prefered_lft 筆記250405 以下是 Linux 系統中與 IPv6 臨時隱私地址相關的三個關鍵參數 use_tempaddr、temp_valid_lft 和 temp_prefered_lft 的詳細說明及協作關系&#xff1a; &#x1f4dc; 參數定義與功能 參數作用默認值依賴關…

基于Spark的嗶哩嗶哩輿情數據分析系統

【Spark】基于Spark的嗶哩嗶哩輿情數據分析系統 &#xff08;完整系統源碼開發筆記詳細部署教程&#xff09;? 目錄 一、項目簡介二、項目界面展示三、項目視頻展示 一、項目簡介 本項目基于Python和Django框架進行開發&#xff0c;為了便于廣大用戶針對輿情進行個性化分析處…

南京大學與阿里云聯合啟動人工智能人才培養合作計劃,已將通義靈碼引入軟件學院課程體系

近日&#xff0c;南京大學與阿里云宣布啟動人工智能人才培養合作計劃&#xff0c;共同培養適應未來技術變革、具備跨學科思維的AI創新人才。 基于阿里云在云計算和AI大模型領域的技術優勢和南京大學在人工智能領域的學科優勢&#xff0c;雙方將共同設計兼具前瞻性和應用性的人…

用于解決個人使用的公網ip動態變化問題的解決方案

解決方案 靜態ip&#xff08;放棄&#xff09; 申請一個靜態ip價格較貴&#xff0c;只有公司可以申請 使用DDNS&#xff08;放棄&#xff09; 通過域名解析到公網ip通過域名訪問設備官方光貓不支持DDNS 使用腳本&#xff08;采用&#xff09; 通過腳本獲取公網ip通過腳本發送到…

Spring / Spring Boot 的@MapperScan 和 @Repository

MapperScan 和 Repository 是兩個與數據訪問層相關的注解&#xff0c;它們在功能上有一定的聯系&#xff0c;但也有明顯的區別。 一、相同點 1. 都與數據訪問層相關 MapperScan&#xff1a;用于掃描 MyBatis 的 Mapper 接口。MyBatis 是一個流行的持久層框架&#xff0c;Mapp…

全星 研發項目管理APQP 軟件:驅動汽車及制造業研發升級的數字化引擎

全星 APQP 軟件&#xff1a;驅動汽車及制造業研發升級的數字化引擎 在汽車及制造業競爭白熱化的當下&#xff0c;如何高效推進研發項目&#xff0c;同時確保嚴格合規&#xff0c;成為企業亟待解決的難題。 全星研發項目管理 APQP 軟件系統&#xff0c;憑借卓越的功能與顯著優勢…

cadence17.4和16.6同時安裝無法使用的問題

最近在搞這個兩個版本的軟件安裝,針對網上的一些說法: 方法一:先裝17.4再裝16.6,文件放在一個文件夾,打不開,兩個版本都無法使用 方法二:分別安裝,文件路徑放在不同的文件 方案三:修改環境變量,直接使用17.4的 License Manager 這個也無法解決問題。 經過對報錯的問…

(三)鏈式工作流構建——打造智能對話的強大引擎

上一篇&#xff1a;&#xff08;二&#xff09;輸入輸出處理——打造智能對話的靈魂 在前兩個階段&#xff0c;我們已經搭建了一個基礎的智能對話&#xff0c;并深入探討了輸入輸出處理的細節。今天&#xff0c;我們將進入智能對話的高級階段——鏈式工作流構建。這一階段的目…

【MATLAB定位例程】TDOA(到達時間差)的chan-tylor,三維環境,附完整代碼

該代碼實現了基于三維空間的動態目標TDOA定位,結合了Chan算法(解析解)與Taylor級數展開法(迭代優化)的雙重優勢。 文章目錄 運行結果MATLAB代碼代碼講解代碼功能概述核心算法原理代碼結構解析可視化與結果分析運行結果 定位示意圖: 三軸狀態曲線: 三軸誤差曲線: MA…

Golang的文件同步與備份

Golang的文件同步與備份 一、Golang介紹 也稱為Go語言&#xff0c;是谷歌開發的一種編程語言&#xff0c;具有高效的并發編程能力和出色的內存管理。由于其快速的編譯速度和強大的標準庫&#xff0c;Golang在網絡應用、云平臺和大數據等領域得到了廣泛應用。 二、文件同步與備份…

ARXML文件解析-2

目錄 1 摘要2 常見ARXML文件注意事項以及常見問題2.1 注意事項2.2 常見問題2.3 答疑 3 ARXML解讀/編輯指南3.1 解讀ARXML文件的步驟3.2 編輯ARXML文件的方法3.3 驗證與調試 4 總結 1 摘要 本文主要對ARXML文件的注意事項、常見問題以及解讀與編輯進行詳細介紹。 上文回顧&…

3535 數組分割

3535 數組分割 ??難度&#xff1a;困難 &#x1f31f;考點&#xff1a;2023、省賽、動態規劃 &#x1f4d6; &#x1f4da; import java.util.*;public class Main {static int MOD 1000000007;static int N 1005;public static void main(String[] args) {Scanner sc …

Git操作指南

Git操作指南 1.安裝并配置Git Git官網&#xff1a;https://git-scm.com/downloads 安裝完成后&#xff0c;打開Git Bash&#xff0c;配置Git&#xff1a; git config --global user.email "emailexample.com" git config --global user.name "Your Name&quo…

Linux常用基礎命令應用

目錄 一、文件與目錄操作&#xff08;12個核心命令&#xff09;?? ??1. pwd - 顯示當前路徑?? ??2. ls - 查看目錄內容?? ??3. cd - 切換目錄?? ??4. mkdir - 創建目錄?? ??5. touch - 創建文件?? ??6. cp - 復制文件/目錄?? ??7. mv - 移動…

zookeeper基本概念和核心作用

圖片來源&#xff1a; 02-Zookeeper概念_嗶哩嗶哩_bilibili02-Zookeeper概念是黑馬程序員Zookeeper視頻教程&#xff0c;快速入門zookeeper技術的第2集視頻&#xff0c;該合集共計24集&#xff0c;視頻收藏或關注UP主&#xff0c;及時了解更多相關視頻內容。https://www.bilib…

關于HikariDataSource (null)的誤解,順帶提出一種mybaits-Plus mapper映射失敗的容易被忽視的原因

首先探究此問題并無什么實際意義&#xff0c;純屬是個人好奇使然&#xff0c;也順帶熟悉了一下Springboot 數據庫連接的相關問題&#xff0c;本人純小白說的不對的地方懇請大佬指正&#xff01;&#xff01; 關于HikariDataSource (null)的誤解 問題的發現 Value("${myba…

Centos7上安裝docker - yum在線的方式

步驟一 &#xff1a; 安裝 yum-utils yum install -y yum-utils步驟二 &#xff1a; 替換docker 的國內的源 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo執行完成后&#xff0c;會在 /etc/yum.repos.d/ 目錄下 新增 doc…

250405-VSCode編輯launch.json實現Debug調試Open-WebUI

A. 最終效果 根據__init__.py配置launch.json 根據中utils/chat.py中form_data的messages [{role: user, content: 唐老鴨}],可以找到用戶輸入&#xff0c;進而通過關鍵詞或模型調用的方式&#xff0c;對敏感問題進行特殊處理。 B. 文件配置 launch.json // { // /…