节点路由
LangGraph 支持节点路由,即可以根据函数返回的节点名进行路由。
- 路由还是通过add_conditional_edges实现的,即通过方法返回下一个节点的名字
下面是一个简单的示例
from typing import Any, Literal
from langchain_openai import ChatOpenAI
from langgraph.graph import StateGraph, MessagesState, START, END
from dotenv import load_dotenv
from langgraph.checkpoint.memory import MemorySaver
from langgraph.store.base import Item, NotProvided, NOT_PROVIDED
from langgraph.store.memory import InMemoryStore
from langgraph.prebuilt import ToolNode, tools_condition
import uuid
import os
# 1. 加载环境变量
load_dotenv()
base_url = os.getenv("BASE_URL")
openai_api_key = os.getenv("OPENAI_API_KEY")
model_name = "qwen-max"
# 2. 定义模型
llm = ChatOpenAI(model=model_name, base_url=base_url, api_key=openai_api_key)
def weather_node(state: MessagesState):
# 天气查询节点
return {'messages': ["晴天25度"]}
def calculator_node(state: MessagesState):
# 计算节点
user_query = state["messages"][-1].content.lower()
if "计算" in user_query:
numbers = [int(s) for s in user_query.split() if s.isdigit()]
result = sum(numbers)
return {'messages': [f'计算结果是 {result}.']}
return {'messages': ['I can only perform addition for now.']}
def default_node(state: MessagesState):
# 默认节点
return {'messages': ["不能处理该问题"]}
def routing_function(state: MessagesState):
last_message = state['messages'][-1].content.lower()
if '天气' in last_message:
return 'weather_node'
elif '计算' in last_message or 'calculate' in last_message:
return 'calculator_node'
return 'default_node'
# START -> tool_calling_llm -> tools_condition
# tools->END
builder = StateGraph(MessagesState)
builder.add_node('weather_node', weather_node)
builder.add_node('calculator_node', calculator_node)
builder.add_node('default_node', default_node)
builder.add_node('routing_function', routing_function)
# 路由函数
builder.add_conditional_edges(START, routing_function)
builder.add_edge('weather_node', END)
builder.add_edge('calculator_node', END)
builder.add_edge('default_node', END)
#
app = builder.compile()
#
def simulate_interaction():
user_input = "天气如何"
input_message = {"messages": [('human', user_input)]}
for result in app.stream(input_message, stream_mode='values'):
result['messages'][-1].pretty_print()
user_input = "计算 1 2 3"
input_message = {"messages": [('human', user_input)]}
for result in app.stream(input_message, stream_mode='values'):
result['messages'][-1].pretty_print()
simulate_interaction()
演示结果如下
"""
================================ Human Message =================================
天气如何
================================ Human Message =================================
晴天25度
================================ Human Message =================================
计算 1 2 3
================================ Human Message =================================
计算结果是 6.
"""