langchain中实现多Agent的利器-基于图论的️ LangGraph

LangGraph的出现

LangChain中的智能体从数据结构的角度来讲等同于一个有向无环图,也就是说,chain在推理过程中无法被循环调用.而尽管AgentExecutor(代理执行器)支持’循环’.但是缺乏精确控制能力,时常发生失控陷入死循环的情况.

使用代理执行器实现循环调用LLM的能力,其调用过程主要有两步:

  • 通过大模型来决定采取什么行动,使用什么工具,对用户采取输出响应
  • 执行步骤1中的行动,并且把结果继续交给大模型来决定

AgentExecutor存在的问题是决策过程隐藏在AgentExcutor背后,过于黑盒,缺乏更精细的控制能力,在构建复杂的Agent的时候受限

  • 工具的使用顺序
  • 在执行过程中添加人机交互
  • 灵活的更换Prompt或者背后的LLM

在LangChain中简单的链不具备循环能力,而AgentExcutor调用Agent又过于黑盒,因此需要一个具备更精细控制能力的框架来支持复杂场景的LLM应用.LangGraph的出现宣布LangChain进入到多智能体框架领域,langGraph是基于图论运作的,他提供了一种状态机的技术,可与驱动循环代理调用,实现有向有环图. 因此,LangGraph有三个关键元素:

  • StateGraph:状态图

是LangChain的一个类,表示图的数据结构并且反应其状态,节点会更新图的状态

  • Node:节点

图中关键元素之一,每个langGraph节点都有一个名称的值,可以是LangChain表达式中的函数或者可运行项,每个节点接收一个字典类型的数据.节点返回具有相同结构的更新状态.有一个名为"END"的特殊节点,用于识别状态机的结束状态

  • Edge:边缘

边维系节点之间的关系,三种类型的边:开始边(没有上游节点),普通边和条件边

  • 普通边定义上游节点应始终调用的下游节点

  • 条件边,通过函数(路由器)来确定下游节点,条件边需要三个元素

    • 上游节点:边的起点,表示转换的起点
    • 路由函数:此函数根据返回值有条件的来确定应进行转换的下游节点
    • 状态映射:根据路由函数的返回值,来指定下游节点.它将路由函数有可能的返回值与相应的下游节点相关联

构建LangGraph实例

LangGraph的状态

类似于状态机(State Machine),由一组状态(State)和状态之间的转换(Transition)组成,用于表示系统在不同状态之间的转换和响应事件的行为。

from typing import Annotated
from typing_extensions import TypedDict
from langgraph.graph import StateGraph
from langgraph.graph.message import add_messages

class State(TypedDict):
# Messages have the type "list". The `add_messages` function
# in the annotation defines how this state key should be updated
# (in this case, it appends messages to the list, rather than overwriting them)
messages: Annotated[list, add_messages]

graph_builder = StateGraph(State)

这个状态定义了随时间更新的核心状态对象,它接收一些操作以及属性定义以及会被节点更新;会在每一个Node之间传递不同的状态信息。然后每一个节点会根据自己定义的逻辑去更新这个状态信息

节点信息

Node可以是一个langchain的runnable或者是一个可执行的函数,也可以是一个Graph,构建完成的Graph也是一个langchain的runnable,这也正是LangGraph作为langchain的扩展可以与langchain完美衔接的关键.

添加节点直接使用Graph实例中的add_node方法添加即可,当然这个节点应当有一个名字

graph_builder.add_node("node",node)

node就是langchain的runnable对象或者可执行函数,具体在开发中定义

绘制图的边

边(Edge)描述的是节点与节点之间的关系,可以是普通的或者是有条件的.他们都有方向,Edge描述的上游节点与下游节点的关系(开始边除外).

Edge的实现由Graph实例中的add_edge方法添加,同样这个边也有一个名字,这个名字就是节点的名字,代表的是上游节点.

graph_builder.add_edge("node",next_node)

next_node就是node节点的下游节点.

条件边的实现由Graph实例中的add_conditional_edge进行添加

graph.add_conditional_edge(
    "node",
    should_continue,
    {
        "end": END,
        "continue": "next_node"
    }
)

should_continue就是条件边三个组成元素的路由函数了.确定下一个的可调用对象一个或多个节点.

编译图

到现在就完成一个图所需要的基本条件了,这也是一个最简单的LangGraph列子

编译图也是由Graph实例对象的方法实现

graph = graph_builder.compile()

编译之后的graph是一个langchain的runnable对象,同样具有.invoke.stram方法,也具备成为一个节点的能力.

由LangGraph构建的简单聊天机器人

import os
from dotenv import find_dotenv, load_dotenv
load_dotenv(find_dotenv())
OPENAI_API_BASE=os.environ['OPENAI_API_BASE'] 
OPENAI_API_KEY=os.environ['OPENAI_API_KEY'] 

from typing import Annotated
from typing_extensions import TypedDict
from langgraph.graph import StateGraph
from langgraph.graph.message import add_messages

class State(TypedDict):
    messages: Annotated[list, add_messages]

graph_builder = StateGraph(State)

from langchain_openai import ChatOpenAI
llm = ChatOpenAI()

def chatbot(state: State):
    return {"messages": [llm.invoke(state["messages"])]}

graph_builder.add_node("chatbot", chatbot)

graph_builder.set_entry_point("chatbot")

graph_builder.set_finish_point("chatbot")

graph = graph_builder.compile()

while True:
    user_input = input("User: ")
    if user_input.lower() in ["quit", "exit", "q"]:
        print("Goodbye!")
        break
    for event in graph.stream({"messages": ("user", user_input)}):
        for value in event.values():
            print("Assistant:", value["messages"][-1].content)

LangGraph的应用

想要让单个Agent干很多活儿,就必须的有极强的推理能力以及定义好工具之间的关系,和精确到控制能力.而单个Agent的执行过程过于黑盒等问题导致单个Agent很难集多种本领于一身,同时langchain却没有一个能实现多Agent的方法或者技巧.LangGraph作为langchain的扩展就可以实现多Agent(Multi-agent).当然,单个Agent有单个的好处,分开也有分开的优势

单Agent的构建较为简单,不仅编码简单,逻辑也比较清晰,LangGraph与之相比就太过于复杂了,不仅要有清晰的逻辑关系,还要有一个图的数据流向,构建一个简单的图人脑还是能应对,一旦节点,边多起来了,就需要借助工具进行设计了,在复杂的逻辑链路中抽丝剥茧.

LangGraph构建多Agent在编码的过程中或许会比较难受,但是实现效果不是单个Agent能够相比的.

AotuGen中的多Agent是基于会话实现的,有三个Agent角色,构建过程要比LangGraph简单,与LangGraph不同,LangGraph具有更清晰的逻辑条理.

当前的LangGraph还处在一个初期发展的阶段,在langchain的0.2.x版本迭代中,Agent应该会占据一个重要地位.相信在未来的LangGraph构建会更容易.

那么,如何系统的去学习大模型LLM?

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

作为一名热心肠的互联网老兵,我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。

但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

所有资料 ⚡️ ,朋友们如果有需要全套 《LLM大模型入门+进阶学习资源包》,扫码获取~

篇幅有限,部分资料如下:

👉LLM大模型学习指南+路线汇总👈

💥大模型入门要点,扫盲必看!
在这里插入图片描述
💥既然要系统的学习大模型,那么学习路线是必不可少的,这份路线能帮助你快速梳理知识,形成自己的体系。
在这里插入图片描述

👉大模型入门实战训练👈

💥光学理论是没用的,要学会跟着一起做,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
在这里插入图片描述

👉国内企业大模型落地应用案例👈

💥《中国大模型落地应用案例集》 收录了52个优秀的大模型落地应用案例,这些案例覆盖了金融、医疗、教育、交通、制造等众多领域,无论是对于大模型技术的研究者,还是对于希望了解大模型技术在实际业务中如何应用的业内人士,都具有很高的参考价值。 (文末领取)
在这里插入图片描述
💥《2024大模型行业应用十大典范案例集》 汇集了文化、医药、IT、钢铁、航空、企业服务等行业在大模型应用领域的典范案例。

在这里插入图片描述

👉LLM大模型学习视频👈

💥观看零基础学习书籍和视频,看书籍和视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。 (文末领取)
在这里插入图片描述

👉640份大模型行业报告👈

💥包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。
在这里插入图片描述

👉获取方式:

这份完整版的大模型 LLM 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

😝有需要的小伙伴,可以Vx扫描下方二维码免费领取🆓

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值