当前位置: 首页 > news >正文

LangGraph--Agent常见的模式2(并行、数据路由)

并行

子任务可以并行化

例如,当您希望一个任务的多视角 RAG 的多查询时)。

例如,当可以使用不同的提示执行独立任务时。

例子:选择一个主题,创建一个笑话、故事和诗歌

# 状态定义,其实就是数据定义
class State(TypedDict):topic:strjoke:strstroy:strpoem:strcombined_output:str# 节点定义
def call_llm_1(state:State):""" 第一个大模型生成笑话"""msg = llm.invoke(f"写一个关于{state["topic"]}的笑话")return {"joke":msg.content}def call_llm_2(state:State):"""第二个大模型生成故事"""msg = llm.invoke(f"写一个关于{state["topic"]}的故事")return {"stroy":msg.content}def call_llm_3(state:State):""" 第三个大模型生成诗歌"""msg = llm.invoke(f"写一个关于{state["topic"]}的诗歌")return{"poem":msg.content}# 数据聚合
def aggregator(state:State):""" 合并笑话、故事和诗歌为单个输出"""combinde = f"这是一个关于{state["topic"]}的笑话、故事和诗歌\n\n"combinde+=f"故事:\n{state["stroy"]}\n\n"combinde +=f"笑话:\n{state["joke"]}\n\n"combinde +=f"诗歌:\n{state["poem"]}\n\n"return {"combined_output":combinde}
# 构建工作流
parallel_builder = StateGraph(State)
parallel_builder.add_node("call_llm_1",call_llm_1)
parallel_builder.add_node("call_llm_2",call_llm_2)
parallel_builder.add_node("call_llm_3",call_llm_3)
parallel_builder.add_node("aggregator",aggregator)# 添加边
parallel_builder.add_edge(START, "call_llm_1")
parallel_builder.add_edge(START, "call_llm_2")
parallel_builder.add_edge(START, "call_llm_3")
parallel_builder.add_edge("call_llm_1","aggregator")
parallel_builder.add_edge("call_llm_2","aggregator")
parallel_builder.add_edge("call_llm_3","aggregator")
parallel_builder.add_edge("aggregator",END)parallel_workflow = parallel_builder.compile()
display(Image(parallel_workflow.get_graph().draw_mermaid_png()))

state = parallel_workflow.invoke({"topic": "狗"})
print(state["combined_output"])

这是一个关于狗的笑话、故事和诗歌故事:
好的,我将按照您的要求创作一个关于狗狗忠诚与守护的感人故事。这是一个关于流浪狗与人类之间建立深厚情感纽带的故事,我会先整理一些基本的故事框架。请您看看以下内容是否符合您的预期。如果您有其他想法,可以随时提出,我会进行调整。### 故事梗概- **雨夜相遇**:事业受挫的程明在暴雨夜遇到一只浑身湿透的流浪狗,出于同情将它带回家,却不知这个决定将改变他的人生。- **意外发现**:程明发现这只被他取名"阿黄"的狗异常聪明,能理解复杂指令,甚至能感知他的情绪变化,表现出超乎寻常的灵性。- **神秘警告**:阿黄突然变得焦躁不安,不断拉扯程明的裤腿阻止他出门上班,展现出对危险的预知能力,但程明并未重视。- **生死时刻**:程明遭遇车祸,阿黄不顾自身安危冲入危险救主,展现了惊人的勇气和忠诚,让程明意识到这不是一只普通的狗。- **真相浮现**:程明在康复过程中发现阿黄身上有特殊标记,开始调查它的来历,逐渐揭开阿黄作为退役警犬的神秘身份。本次写作重点围绕程明与阿黄的初次相遇,以及阿黄如何通过自己的行动证明它不是一只普通的流浪狗,最终在关键时刻救下程明的感人故事。---雨下得很大,像天空被撕开了一道口子。程明撑着伞,快步穿过空无一人的街道,水花溅湿了他的裤脚。他刚刚结束了一场失败的面试,心情比这天气还要糟糕。"三十岁了,连份像样的工作都找不到。"程明自嘲地摇摇头,雨水顺着伞沿滴落在他的肩膀上。就在他转过街角时,一声微弱的呜咽声引起了他的注意。程明停下脚步,循声望去——在便利店门口的纸箱下,蜷缩着一团黄色的身影。那是一只狗,一只看起来饱经风霜的土狗。它的毛发被雨水打湿,紧贴在瘦骨嶙峋的身体上,右耳有一道明显的缺口,像是被什么利器割伤的。最引人注目的是它的眼睛——那双琥珀色的眼睛在雨夜中显得格外明亮,带着一种程明读不懂的复杂情绪:警惕、哀求,还有一丝说不清的智慧光芒。"嘿,小家伙..."程明蹲下身,慢慢伸出手。狗没有吠叫,也没有退缩,只是用那双眼睛直直地看着他。程明注意到它的前爪有一道新鲜的伤口,血迹被雨水冲淡,但依然清晰可见。"你也是被抛弃的那个,对吗?"程明轻声说,不知为何,他在这只流浪狗身上看到了自己的影子——同样伤痕累累,同样被生活逼到角落。狗轻轻呜咽了一声,像是在回应他的话。程明叹了口气,脱下外套裹住湿漉漉的小家伙:"来吧,今晚你跟我回家。"就这样,程明把这只不知来历的流浪狗带回了自己租住的公寓。他给狗洗了热水澡,用旧毛巾擦干它的毛发,处理了前爪的伤口。整个过程中,狗出奇地配合,仿佛理解程明是在帮助它。"我得给你起个名字,"程明蹲在浴室门口,看着正在甩干毛发的狗,"就叫阿黄吧,简单好记。"阿黄停下动作,歪着头看他,尾巴轻轻摇了摇。接下来的日子,程明发现阿黄与普通的狗很不一样。它从不乱叫,也不破坏家具,甚至会在程明心情低落时安静地趴在他脚边,用脑袋轻轻蹭他的腿。更奇怪的是,阿黄似乎能听懂复杂的指令,不需要训练就能理解"拿拖鞋""关灯"这样的命令。"你以前肯定有主人,"程明揉着阿黄的脑袋说,"而且训练得很好。"阿黄只是用那双深邃的眼睛看着他,尾巴轻轻摆动。一周后的早晨,程明正准备出门参加一个重要面试。他穿上唯一一套像样的西装,反复检查简历是否齐全。"阿黄,今天这个面试很重要,"他一边系领带一边对趴在门口的狗说,"如果成功了,我就能搬出这个破公寓,给你买最好的狗粮。"阿黄突然站起来,耳朵竖起,发出低沉的呜咽声。它跑到程明面前,用身体挡住门,不让他出去。"怎么了?"程明困惑地问,"我得走了,否则会迟到的。"阿黄开始焦躁地转圈,然后咬住程明的裤腿往后拖,力道之大让程明差点摔倒。"阿黄!停下!"程明生气了,"别闹了!"狗松开嘴,但依然挡在门前,眼睛里闪烁着程明从未见过的坚决。有那么一瞬间,程明几乎要屈服于这种无声的坚持,但理智很快占了上风。"听着,我必须去这个面试,"他蹲下来与阿黄平视,"我保证早点回来,好吗?"阿黄发出一种近乎绝望的哀鸣,但最终还是让开了路。程明拍拍它的头,匆匆出门。外面的雨已经停了,但路面依然湿滑。程明快步走向地铁站,心里还在想着阿黄反常的行为。就在他准备过马路时,一辆失控的卡车突然从拐角处冲出,直直朝他驶来。时间仿佛凝固了。程明僵在原地,看着那辆庞然大物向他逼近。就在千钧一发之际,一道黄色的身影从侧面猛扑过来,将他狠狠撞开。程明摔倒在人行道上,手肘擦破了皮。他惊恐地转头,看到阿黄站在马路中央,卡车在距离它不到一米的地方急刹停下,发出刺耳的摩擦声。"阿黄!"程明的心脏几乎停跳。令他震惊的是,阿黄并没有惊慌逃窜,而是保持着一种近乎专业的警戒姿态,眼睛紧盯着卡车司机,直到确认危险完全解除,才小跑回到程明身边。"你...你是怎么..."程明颤抖着抱住阿黄,发现它的身体也在微微发抖,但眼神依然坚定。卡车司机下车查看情况,连连道歉:"对不起!刹车突然失灵了!你们没事吧?"程明摇摇头,仍处于震惊中:"我们没事...多亏了我的狗。"路人开始聚集过来,有人拿出手机拍摄。阿黄却突然变得紧张,躲到程明身后,喉咙里发出警告的低吼。"怎么了?"程明安抚地摸着它的背,"没事了,危险已经过去了。"但阿黄依然不安,拉扯着程明的裤腿,示意他离开。程明这才注意到,围观的人群中有一个戴着鸭舌帽的男人,正用奇怪的眼神盯着阿黄。"我们走吧,"程明抱起阿黄,迅速离开了现场,"回家。"回到家后,阿黄才渐渐平静下来。程明给它倒了水,检查它是否受伤。令他惊讶的是,除了几处轻微的擦伤,阿黄几乎毫发无损。"你救了我的命,"程明跪在地上,紧紧抱住阿黄,"如果不是你,我现在已经..."他的声音哽咽了。阿黄舔了舔他的脸,眼神温柔而坚定。那天晚上,程明辗转难眠。他起身来到客厅,发现阿黄也没睡,正警惕地守在门口。"你到底是谁?"程明轻声问,"普通的狗不可能做到这些。"借着月光,程明第一次仔细检查阿黄的身体。在它的腹部,他发现了一个小小的疤痕,形状像是一个字母"C"。更奇怪的是,阿黄的牙齿异常整齐锋利,不像普通家犬。一个想法突然闪过他的脑海:"你...是警犬?"阿黄没有反应,但它的尾巴微微摆动了一下。程明立刻打开电脑搜索"退役警犬""失踪工作犬"等关键词。当他看到一则三个月前某市警犬训练基地遭遇盗窃的新闻时,心跳加速了。新闻中提到,一只名为"闪电"的缉毒犬在事件中失踪,其特征与阿黄惊人地相似:黄色毛发,右耳缺口,腹部有识别标记..."天啊,"程明转向阿黄,"你是...闪电?"阿黄——或者说闪电——走到程明身边,用头轻轻蹭了蹭他的手,仿佛在确认他的猜测。程明的手悬在报警电话上方,犹豫了。如果他报告发现失踪警犬,阿黄就会被带走,回到它原来的工作岗位。但另一方面,阿黄显然不是普通的宠物,它受过专业训练,可能正在执行什么重要任务...就在这时,阿黄突然竖起耳朵,转向门口,全身肌肉紧绷。程明也听到了——门外有轻微的脚步声,停在了他的公寓门前。阿黄压低身体,进入攻击姿态,眼睛紧盯着门缝。程明屏住呼吸,看到一张纸条从门缝下被塞了进来。等脚步声远去后,程明才敢移动。他捡起纸条,上面只有一行打印的字:"我们知道你拿了不属于你的东西。明天中午,老仓库见。一个人来。"程明的手开始发抖。阿黄——闪电——紧张地看着他,似乎在等待指令。"看来,"程明深吸一口气,"我们的麻烦才刚刚开始。"---**接下来故事可能会沿着这些方向发展**:- **神秘标记**:阿黄腹部的"C"形疤痕不仅是一个简单的识别标记,实际上是一个微型数据储存装置的植入位置,里面藏有犯罪集团的重要信息。- **特殊训练**:阿黄对戴鸭舌帽男人的异常反应暗示它认识这个人,可能与警犬失踪案有关,这个人可能是犯罪集团成员或内鬼。- **双重身份**:程明在调查阿黄身份过程中,意外发现自己已故父亲曾经是警犬训练基地的兽医,这层联系将揭示更多关于阿黄和犯罪集团的秘密。希望这个关于忠诚与勇气的狗狗故事能满足您的要求。如果需要更多细节或调整,请随时告诉我。笑话:
好的,这里有一个关于狗狗的经典笑话:---**主人**:(举着飞盘)"来,宝贝!去把飞盘捡回来!"  
**狗子**:(一动不动趴着,尾巴懒洋洋地晃了晃)  
**主人**:"咦?你不是最爱玩飞盘吗?"  
**狗子**:(叹气)"汪今天不想当‘舔狗’了。"  (*备注:双关梗——既指狗狗舔人的习惯,也调侃网络流行语“舔狗”*)---如果需要更萌的版本或不同风格(比如冷笑话、谐音梗),可以告诉我调整方向哦! �🐶诗歌:
《爪痕与星》我们共用同一把梳子,
在晨光里打捞脱落的冬天。
你的毛发持续翻译着
我掌心的天气预报。门把上悬挂的铃铛,
突然学会用尾巴思考。
当你说“爱是椭圆的投掷”,
我接住的永远是
湿漉漉的直线。在公园长椅的阴影里,
我们轮流成为彼此的盲杖。
你教我用嗅觉读报,
我谎称看懂每朵尿迹的
头版头条。最动人的是深夜:
你对着月亮播放
我逐渐消磁的童年录音带。
那些被路灯拉长的吠叫,
多像一根根
正在量体温的骨头。
数据路由

 路由 对输入进行分类并将其定向到专门的后续任务。

例如,当将问题路由到不同的检索系统时。

例子:在 joke、story 和 poem 之间路由输入

from typing_extensions import Literal
# 用于作为路由逻辑的结构的方案
class Route(BaseModel):step:Literal["诗歌","故事","笑话"] = Field(None,description="路由过程中的下一步")# 为LLM增加结构化输出的模式
router = llm.with_structured_output(Route)
class State(TypedDict):input:strdecision: stroutput: str
from langchain_core.messages import HumanMessage, SystemMessage
#定义节点
def llm_call_1(state: State):"""写个故事"""print("写个故事")result = llm.invoke(state["input"])return {"output": result.content}def llm_call_2(state: State):"""写个笑话"""print("写个笑话")result = llm.invoke(state["input"])return {"output": result.content}def llm_call_3(state: State):"""写个诗歌"""print("写个诗歌")result = llm.invoke(state["input"])return {"output": result.content}def llm_call_router(state:State):""" 将输入路由到适当的节点"""# 运行增强型LLM以结构化输出作为路由逻辑decision = router.invoke([SystemMessage(content="根据用户的要求将输入路由到故事或者诗歌或者笑话"),HumanMessage(content=state["input"])])return {"decision": decision.step}# 条件边函数以路由到适当的节点
def route_decision(state:State):#返回您想要访问的下一个节点名称if state["decision"] == "故事":return "llm_call_1"elif state["decision"] == "笑话":return "llm_call_2"elif state["decision"] == "诗歌":return "llm_call_3"
# 构建工作流
router_builder = StateGraph(State)
# 添加node
router_builder.add_node("llm_call_1", llm_call_1)
router_builder.add_node("llm_call_2", llm_call_2)
router_builder.add_node("llm_call_3", llm_call_3)
router_builder.add_node("llm_call_router", llm_call_router)# 添加边
router_builder.add_edge(START, "llm_call_router")
router_builder.add_conditional_edges("llm_call_router",route_decision,{# 由 route_decision 返回的名称:要访问的下一个节点的名称"llm_call_1": "llm_call_1","llm_call_2": "llm_call_2","llm_call_3": "llm_call_3", })router_workflow = router_builder.compile()display(Image(router_workflow.get_graph().draw_mermaid_png()))

state = router_workflow.invoke({"input": "给我写一个关于狗的笑话"})
print(state["output"])

写个笑话
好的!这里有一个关于狗狗的可爱笑话:---**主人**:(下班回家,发现沙发被咬烂了)  
**狗狗**:(叼着拖鞋,尾巴狂摇)"惊喜吗?我把沙发改造成‘抽象艺术’了!"  **主人**:"这‘艺术’花了我三个月工资!"  
**狗狗**:(歪头)"那……下次我啃便宜点的,比如你的拖鞋?"(递上嘴里已经咬烂的拖鞋)  ——结局:主人默默下单了磨牙玩具。🐶  ---希望逗你一笑!需要更蠢萌或更冷的故事风格可以告诉我哦~

相关文章:

  • PaddleOCR项目实战(3):SpringBoot服务开发之全局异常处理
  • Appium+python自动化(二十四) - 元素等待
  • Spark简介脑图
  • 浏览器的事件循环和NodeJS的事件循环有什么区别
  • 【Erdas实验教程】023:遥感图像辐射增强(直方图匹配)
  • LangChain框架:AI应用开发利器
  • 最新推荐Python学习图书20本(引进版)
  • AUTOSAR Adaptive系统如何进行时间同步与延迟分析?
  • 软件设计模式入门
  • 一款完美适配mobile、pad、web三端的博客网站UI解决方案
  • 记录一次 Oracle DG 异常停库问题解决过程
  • Spring MVC 会话管理实践教程:HttpSession 深入应用
  • git 开源平台网站推荐 (2025-06 更新)
  • (十六)GRU 与 LSTM 的门控奥秘:长期依赖捕捉中的遗忘 - 更新机制对比
  • 数据治理域——数据应用设计
  • stm32 f103c8t6仿真 串口收发测试
  • 《寿康宝鉴》:欲海迷航中的修身指南
  • pythonA股实时数据分析(进阶版)
  • 幻休 v3.0.02 | AI趣味呼吸 助眠音乐 冥想音频
  • MFE微前端高级版:Angular + Module Federation + webpack + 路由(Route way)完整示例
  • 武汉建设网站/天津网络关键词排名
  • 徐汇网站制作/太原做网站的工作室
  • 现在lol谁做教学视频网站/谷歌浏览器最新版本
  • 网站开发哪家好/长尾关键词挖掘爱站网
  • wordpress 公众号 会员/长沙seo运营
  • 成全视频免费观看在线看小说原著叫什么/何鹏seo