LangGraph 模拟简单的多模型编排

假设这三个节点是不同的模型,处理不同的问题,在用户输入后使用模型判断下一步要调用哪个节点回答问题

  • node1: 讲短笑话
  • node2: 李白风格写诗
  • node3: 其他问题

路由节点返回的就是下一步要走的节点,最后并实现打字效果,使用stream优化响应等待时间

python 复制代码
from langchain_core.messages import AIMessageChunk
from langchain.messages import AIMessage,HumanMessage,SystemMessage
from langgraph.graph import StateGraph,START,END
from langgraph.graph.message import add_messages,MessagesState
from langchain.chat_models import init_chat_model
from dotenv import load_dotenv
from rich import print as rprint
from IPython.display import display
from typing import Literal
load_dotenv()
llm=init_chat_model(
  model="deepseek-chat"
)
class overAllState(MessagesState):
  userValue: str
  nodeName: str
def node1(state:overAllState):
  res1=llm.invoke([HumanMessage(state["userValue"])])
  return {
    "messages": [res1]
  }
def node2(state:overAllState):
  res2=llm.invoke([HumanMessage(state["userValue"])])
  return {
    "messages": [res2]
  }
def node3(state:overAllState):
  res3=llm.invoke([HumanMessage(state["userValue"])])
  return {
    "messages": [res3]
  }
def route(state:overAllState) -> Literal["node1","node2","node3"]:
  userValue=state["userValue"]
  prompt=f"""
    用户的提示词:{userValue},
    判断分类,**只输出下面其中一个单词,不要多余文字**
    node1: 讲短笑话
    node2: 李白风格写诗
    node3: 其他问题
    只返回:node1 / node2 / node3
  """
  res=llm.invoke(prompt)
  route_name = res.content.strip()
  return route_name

builder=StateGraph(overAllState)
builder.add_node(node1)
builder.add_node(node2)
builder.add_node(node3)
builder.add_conditional_edges(
  source=START,
  path=route,
  path_map={
    "node1": "node1",
    "node2": "node2",
    "node3": "node3"
  }
)
builder.add_edge("node1", END)
builder.add_edge("node2", END)
builder.add_edge("node3", END)
graph=builder.compile()
display(graph)
# res=graph.invoke({"userValue":"给我讲个笑话吧"})
# rprint(res["messages"][-1].content)


for chunk in graph.stream({"userValue":"爱因斯坦终年多少岁"},stream_mode="messages"):
    mes, meta = chunk
    target_nodes = {"node1","node2","node3"}
    if meta.get("langgraph_node") in target_nodes:
        if isinstance(mes, AIMessageChunk) and mes.content:
            print(mes.content, end="", flush=True)
相关推荐
罗西的思考29 分钟前
AI 时代的 “房谋杜断”:如何培养能力、品味与判断力
人工智能·算法·机器学习
字节跳动视频云技术团队1 小时前
720P 直升 8K,解密 2026 抖音美好奇妙夜巨幕超分黑科技
人工智能·音视频开发
打工仔折腾 AI1 小时前
在 Ubuntu ARM64 部署 Q1 V3.0 MuJoCo 模型:加载、单步推理与执行器响应解析
linux·运维·人工智能·python·深度学习·ubuntu·性能优化
逐米时代2 小时前
从试点验证到协同深化:制造业AI转型三年路线图设计方法
人工智能
GlobalInfo2 小时前
全球及中国风电叶片检测机器人行业研究报告(2026版):市场现状、行业前景与占有率分析
运维·网络·人工智能·机器人
stormzhangV2 小时前
AI 越强,失业越严重
人工智能·aigc
夏文强3 小时前
Rerank 与混合检索:怎么让 RAG 从「能用」变成「好用」
人工智能·大模型·向量数据库·rag·检索增强生成
救救孩子把3 小时前
AI面试八股文-23_23-Agent可观测性与生产监控面试题
人工智能·面试·职场和发展·agent·langsmith·langfuase
IT_陈寒3 小时前
Java静态变量初始化坑得我头皮发麻
前端·人工智能·后端
知行产研3 小时前
白马山领跑、南山矿扩编 31 台,安徽露天矿无人驾驶进入规模化阶段
人工智能