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)
相关推荐
中年阿甘1 小时前
对AI结对编程的反思
人工智能·结对编程
用户721746588261 小时前
64个音色、¥1/万字符、语音输出贵5倍:TTS/ASR/Omni四层链路的参数细节与两个真实报错
人工智能
人工智能AI技术1 小时前
给LLM装上长期记忆!用Milvus向量数据库解决AI金鱼记忆问题
人工智能
Evand J2 小时前
【MATLAB例程,图像滤波降噪12】加权中值滑动窗口滤波(WMF)图像降噪,包含滤波质量评价。附代码下载链接
开发语言·图像处理·人工智能·计算机视觉·matlab·滑动窗口·滤波
智行合一科技2 小时前
肖利华博士受邀参加第九届OTC品牌与科普宣传月暨全民健康嘉年华启动大会
人工智能
七灵微2 小时前
【AI】代码实战- 基于时间序列的轴承检测1
人工智能·机器学习·ai·pandas·matplotlib
OFIRM碳基硅基2 小时前
西游金蝉劫 IP · 之 《金蝉子前传渡缘劫》电影 20 亿票房触发 · 项目专项扶持协议 总览 拉格朗日光影动画-西游金蝉劫项目组
大数据·人工智能·西游金蝉劫·蝎子精·蝎子精女妖王·金蝉子前传渡缘劫
银空飞羽2 小时前
职型求职工具实测:把简历分析、岗位匹配和定向优化串成一条求职链路
人工智能·经验分享·面试·职场和发展·跳槽·求职招聘·创业创新
ChaITSimpleLove2 小时前
AI时代 “本体” 的 “标准化” 定义
人工智能·dsl·rdf·ontology·ai本体·json-ld