LangChain 最近发布的一个重要功能:LangGraph

news2024/11/14 6:05:40

LangGraph 是 LangChain 最近发布的一个重要功能,LangChain 进入多代理框架领域。通过建立在LangChain 之上,LangGraph 使开发人员可以轻松创建强大的代理运行时。

在这里插入图片描述

LangChain 使用其表达语言(LCEL)为开发人员构建定制链提供技术支持。从数据结构的角度来看,这样的链是一个有向无环图(DAG)。然而,在实践中,用户可能希望使用代理构建循环图。换句话说,代理可以根据模型推理在循环中被调用,直到任务完成。AutoGen就是支持这种机制的框架。

LangGraph专门设计以满足这类用户的需求。换句话说,开发人员可以使用它来构建类似于AutoGen的多代理LLM应用程序。

LangGraph 提供了一种称为状态机的技术,它可以驱动循环代理调用。因此,LangGraph具有三个关键元素:

  1. StateGraph(状态图)
  2. Node(节点)
  3. Edge(边缘)

技术交流&资料

技术要学会分享、交流,不建议闭门造车。一个人可以走的很快、一堆人可以走的更远。

成立了大模型技术交流群,本文完整代码、相关资料、技术交流&答疑,均可加我们的交流群获取,群友已超过2000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友。

方式①、微信搜索公众号:机器学习社区,后台回复:加群
方式②、添加微信号:mlc2060,备注:来自CSDN + 技术交流

通俗易懂讲解大模型系列

  • 做大模型也有1年多了,聊聊这段时间的感悟!

  • 用通俗易懂的方式讲解:大模型算法工程师最全面试题汇总

  • 用通俗易懂的方式讲解:不要再苦苦寻觅了!AI 大模型面试指南(含答案)的最全总结来了!

  • 用通俗易懂的方式讲解:我的大模型岗位面试总结:共24家,9个offer

  • 用通俗易懂的方式讲解:大模型 RAG 在 LangChain 中的应用实战

  • 用通俗易懂的方式讲解:一文讲清大模型 RAG 技术全流程

  • 用通俗易懂的方式讲解:如何提升大模型 Agent 的能力?

  • 用通俗易懂的方式讲解:ChatGPT 开放的多模态的DALL-E 3功能,好玩到停不下来!

  • 用通俗易懂的方式讲解:基于扩散模型(Diffusion),文生图 AnyText 的效果太棒了

  • 用通俗易懂的方式讲解:在 CPU 服务器上部署 ChatGLM3-6B 模型

  • 用通俗易懂的方式讲解:使用 LangChain 和大模型生成海报文案

  • 用通俗易懂的方式讲解:ChatGLM3-6B 部署指南

  • 用通俗易懂的方式讲解:使用 LangChain 封装自定义的 LLM,太棒了

  • 用通俗易懂的方式讲解:基于 Langchain 和 ChatChat 部署本地知识库问答系统

  • 用通俗易懂的方式讲解:在 Ubuntu 22 上安装 CUDA、Nvidia 显卡驱动、PyTorch等大模型基础环境

  • 用通俗易懂的方式讲解:Llama2 部署讲解及试用方式

  • 用通俗易懂的方式讲解:基于 LangChain 和 ChatGLM2 打造自有知识库问答系统

  • 用通俗易懂的方式讲解:一份保姆级的 Stable Diffusion 部署教程,开启你的炼丹之路

  • 用通俗易懂的方式讲解:对 embedding 模型进行微调,我的大模型召回效果提升了太多了

  • 用通俗易懂的方式讲解:LlamaIndex 官方发布高清大图,纵览高级 RAG技术

  • 用通俗易懂的方式讲解:为什么大模型 Advanced RAG 方法对于AI的未来至关重要?

  • 用通俗易懂的方式讲解:使用 LlamaIndex 和 Eleasticsearch 进行大模型 RAG 检索增强生成

  • 用通俗易懂的方式讲解:基于 Langchain 框架,利用 MongoDB 矢量搜索实现大模型 RAG 高级检索方法

  • 用通俗易懂的方式讲解:使用Llama-2、PgVector和LlamaIndex,构建大模型 RAG 全流程

StateGraph

StateGraph 是LangChain的一个类,表示图的数据结构并反映其状态。图的状态由将很快介绍的节点更新。

class State(TypedDict):
    input: str
    all_actions: Annotated[List[str], operator.add]

graph = StateGraph(State)

Node

图中最关键的元素之一是节点。每个LangGraph节点都有一个名称和其值,它可以是LCEL中的函数或可运行项。每个节点接收一个字典类型的数据,其结构与状态定义相同。节点返回具有相同结构的更新状态。

LangGraph定义了一个称为END的特殊节点,用于识别状态机的结束状态。

from langgraph.graph import END
graph.add_node("model", model)
graph.add_node("tools", tool_executor)

Edge

在图中,节点之间的关系通过边界定义。LangGraph定义了两种类型的边:普通边和条件边。

普通边定义了上游节点应始终调用的其他节点。

graph.add_edge("tools", "model")

条件边,使用函数(路由器)来确定下游节点。

graph.add_conditional_edge(
    "model",
    should_continue,
    {
      "end": END,
      "continue": "tools"
    }
)

如上所示,条件边需要三个元素:

  1. 上游节点:边的起点,表示转换的起始点。
  2. 路由函数:此函数根据其返回值有条件地确定应进行转换的下游节点。
  3. 状态映射:根据路由函数的返回值,此映射指定下一个目的地。它将路由函数的可能返回值与相应的下游节点相关联。

运行图
在运行图之前,有两个必要的步骤需要完成:

  1. 设置入口点,以指定图中哪个节点作为入口点
graph.set_entry_point("model")
  1. 编译
app = graph.compile()

现在,我们可以运行LangGraph应用程序如下:

app.stream(
    {
        "messages": [
            HumanMessage(content="Write a tweet about LangChain news")
        ]
    }
)

用例

这是一个示例。图包含三个节点:主管、搜索引擎和 Twitter 作者。根据需要,主管可能多次调用搜索引擎以检索所需数据,然后将数据转发给Twitter作者以撰写推文。因此,在主管和搜索引擎之间存在循环。

LangChain可以帮助开发人员轻松构建基于工具的代理,然后基于这些代理创建节点。

定义图状态

class AgentState(TypedDict):
    messages: Annotated[Sequence[BaseMessage], operator.add]
    next: str

声明工具函数

@tool("web_search")
def web_search(query: str) -> str:
    """通过查询使用Google SERP API进行搜索"""
    search = SerpAPIWrapper()
    return search.run(query)

@tool("twitter_writer")
def write_tweet(content: str) -> str:
    """根据内容编写推文。"""
    chat = ChatOpenAI()
    messages = [
        SystemMessage(
            content="您是Twitter帐户操作员。您负责根据给定的内容撰写推文。您应遵循Twitter政策,并确保每条推文不超过140个字符。"
        ),
        HumanMessage(
            content=content
        ),
    ]
    response = chat(messages)
    return response.content

辅助函数 —— 使用工具创建代理

def create_agent(llm: ChatOpenAI, tools: list, system_prompt: str):
    prompt = ChatPromptTemplate.from_messages(
        [
            (
                "system",
                system_prompt,
            ),
            MessagesPlaceholder(variable_name="messages"),
            MessagesPlaceholder(variable_name="agent_scratchpad"),
        ]
    )
    agent = create_openai_tools_agent(llm, tools, prompt)
    executor = AgentExecutor(agent=agent, tools=tools)
    return executor

辅助函数 —— 使用代理创建节点

def agent_node(state, agent, name):
    result = agent.invoke(state)
    return {"messages": [HumanMessage(content=result["output"], name=name)]}

创建主管节点

members = ["Search_Engine", "Twitter_Writer"]
system_prompt = (
    "您是一名主管,负责管理以下工作者之间的对话:{members}。给定以下用户请求,使用下一步操作进行回复。每个工作者将执行一个任务,并回复其结果和状态。完成后,使用FINISH进行回复。"
)
options = ["FINISH"] + members
function_def = {
    "name": "route",
    "description": "选择下一个角色。",
    "parameters": {
        "title": "routeSchema",
        "type": "object",
        "properties": {
            "next": {
                "title": "Next",
                "anyOf": [
                    {"enum": options},
                ],
            }
        },
        "required": ["next"],
    },
}
prompt = ChatPromptTemplate.from_messages(
    [
        ("system", system_prompt),
        MessagesPlaceholder(variable_name="messages"),
        (
            "system",
            "根据以上对话,下一个应该采取行动的人是谁?还是我们应该结束?选择一个:{options}",
        ),
    ]
).partial(options=str(options), members=", ".join(members))
supervisor_chain = (
    prompt
    | llm.bind_functions(functions=[function_def], function_call="route")
    | JsonOutputFunctionsParser()
)

创建节点和边缘

search_engine_agent = create_agent(llm, [web_search], "您是一个网络搜索引擎。")
search_engine_node = functools.partial(agent_node, agent=search_engine_agent, name="Search_Engine")
twitter_operator_agent = create_agent(llm, [write_tweet], "您负责根据给定的内容撰写推文。")
twitter_operator_node = functools.partial(agent_node, agent=twitter_operator_agent, name="Twitter_Writer")
workflow = StateGraph(AgentState)
workflow.add_node("Search_Engine", search_engine_node)
workflow.add_node("Twitter_Writer", twitter_operator_node)
workflow.add_node("supervisor", supervisor_chain)
for member in members:
    workflow.add_edge(member, "supervisor")
conditional_map = {k: k for k in members}
conditional_map["FINISH"] = END
workflow.add_conditional_edges("supervisor", lambda x: x["next"], conditional_map)

编译

workflow.set_entry_point("supervisor")
graph = workflow.compile()

现在我们可以使用此图执行任务。让我们要求它搜索LangChain新闻并撰写一条推文:

for s in graph.stream(
    {
        "messages": [
            HumanMessage(content="Write a tweet about LangChain news")
        ]
    }
):
    if "__end__" not in s:
        print(s)
        print("----")

参考文献

  • https://ai.gopubby.com/langgraph-absolute-beginners-guide-cd4a05336312
  • https://github.com/sugarforever/LangChain-Tutorials/blob/main/langgraph_nodes_edges.ipynb

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1440151.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Django学习记录02

1.请求与响应 1.1get与post的区别 get 一般是从url输入地址,会调用get请求 post 一般是内部数据传输# get请求 def something(request):# req是一个对象,封装了用户发送过来的所有请求相关数据# 1.获取请求方式 http://localhost:8000/something# pri…

[职场] 智能材料与结构专业的就业前景 #经验分享#学习方法

智能材料与结构专业的就业前景 智能材料与结构专业是面向国家智能制造强国战略,面向地方经济新旧动能转换需求,学习智能材料与结构的基础理论及基本知识,接受智能材料制备、组织分析、性能测试、智能材料系统集成技能的基本训练,…

春运一票难求,候补抢票显威,如何设计一个候补订单系统?

春运一票难求,候补官方抢票 最近春节火车一票难求,12306系统的候补购票是一种官方支持的抢票方式。在首日票已售罄时,立即提交候补请求,系统会优先考虑候补乘客的需求。根据成功率灵活选择是否候补购票。 当旅客在12306网站购票&…

mac协议远程管理软件:Termius for Mac 8.4.0激活版

Termius是一款远程访问和管理工具,旨在帮助用户轻松地远程连接到各种服务器和设备。它适用于多种操作系统,包括Windows、macOS、Linux和移动设备。 该软件提供了一个直观的界面,使用户可以通过SSH、Telnet和Mosh等协议连接到远程设备。它还支…

考研数据结构笔记(3)

顺序表存储结构 存储结构顺序结构定义基本操作的实现静态分配问题 动态分配代码功能 顺序表的特点: 顺序表小结顺序表的插入删除插入删除小结 顺序表的查找按位查找按值查找小结 存储结构 顺序结构 定义 线性表是具有相同数据类型的n(n>0)个数据元素的有限序列(每个数据元素…

Vue + Element UI el-table + sortablejs 行、列拖拽排序

实现Element UI中的el-table表格组件的行和列的拖拽排序 使用 Vue3 Element Plus UI sortablejs 安装sortablejs pnpm install sortablejs行拖拽 基本实现 效果 <script setup> import { onMounted, ref } from "vue"; import Sortable from "sort…

Flink流式数据倾斜

1. 流式数据倾斜 流式处理的数据倾斜和 Spark 的离线或者微批处理都是某一个 SubTask 数据过多这种数据不均匀导致的&#xff0c;但是因为流式处理的特性其中又有些许不同 2. 如何解决 2.1 窗口有界流倾斜 窗口操作类似Spark的微批处理&#xff0c;直接两阶段聚合的方式来解决…

【stm32】hal库学习笔记-ADC模数转换(超详细)

【stm32】hal库学习笔记-ADC模数转换&#xff08;超详细&#xff09; 本篇章介绍了ADC实现电压检测的三种方式 ADC原理及选型 ADC将连续的模拟电压信号转换为二进制的数字信号 选型参数 速度&#xff08;采样频率&#xff09; 功耗 精度 转换原理 ADC hal库驱动函数 普通…

【EEG信号处理】对信号进行模拟生成

生成信号的目的还是主要是为了学习和探究后面的分析方法&#xff1b;本文主要是对方法进行整理 瞬态 transient 瞬态信号是指的是一瞬间信号上去了&#xff0c;这种情况我们可以用在时域上高斯模拟 peaktime 1; % seconds width .12; ampl 9; gaus ampl * exp( -(EEG.tim…

RocketMQ下载安装及基本使用

目录 消息队列的作用 消息队列的优势 应用解耦 异步提速 削峰填谷 RocketMQ介绍 RocketMQ特点 RocketMQ安装下载(4.9.5版本) RocketMQ启动可视化管理服务 RocketMQ实现基本消息收发 消息队列的作用 队列是一种FIFO先进先出的数据结构。消息则是跨进程传递的数据。一个…

多线程JUC:多线程的实现和常用成员方法(守护、礼让、插入线程)

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位大四、研0学生&#xff0c;正在努力准备大四暑假的实习 &#x1f30c;上期文章&#xff1a;首期文章 &#x1f4da;订阅专栏&#xff1a;多线程&JUC 希望文章对你们有所帮助 JUC的学习也是需要一些计算机、操作系统的…

【算法设计与分析】求根节点到叶节点数字之和

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;算法分析与设计 ⛺️稳中求进&#xff0c;晒太阳 题目 给你一个二叉树的根节点 root &#xff0c;树中每个节点都存放有一个 0 到 9 之间的数字。 每条从根节点到叶节点的路径都代表一个数…

高可用 k8s 1.29 一键安装脚本, 丝滑至极

博客原文 文章目录 集群配置配置清单集群规划集群网络规划 环境初始化主机配置 配置高可用ApiServer安装 nginx安装 Keepalived 安装脚本需要魔法的脚本不需要魔法的脚本配置自动补全加入其余节点 验证集群 集群配置 配置清单 OS&#xff1a; ubuntu 20.04kubernetes&#xf…

HarmonyOS class类对象基础使用

按我们之前的写法 就是 Entry Component struct Dom {p:Object {name: "小猫猫",age: 21,gf: {name: "小小猫猫",age: 18,}}build() {Row() {Column() {// ts-ignoreText(this.p.gf.name)}.width(100%)}.height(100%)} }直接用 Object 一层一层往里套 这…

MySQL用心总结

大家好&#xff0c;好久不见&#xff0c;今天笔者用心一步步写一份mysql的基础操作指南&#xff0c;欢迎各位点赞收藏 -- 启动MySQL net start mysql-- 创建Windows服务 sc create mysql binPath mysqld_bin_path(注意&#xff1a;等号与值之间有空格) mysql -h 地址 -…

【Flink状态管理(二)各状态初始化入口】状态初始化流程详解与源码剖析

文章目录 1. 状态初始化总流程梳理2.创建StreamOperatorStateContext3. StateInitializationContext的接口设计。4. 状态初始化举例&#xff1a;UDF状态初始化 在TaskManager中启动Task线程后&#xff0c;会调用StreamTask.invoke()方法触发当前Task中算子的执行&#xff0c;在…

如何从 iPhone 上恢复永久删除的照片

您的 iPhone 上缺少照片吗&#xff1f;讽刺的是&#xff0c;iPhone 的许多高级功能可能正是这个问题如此普遍的原因。幸运的是&#xff0c;还有很多方法可以从 iPhone 恢复已删除的照片&#xff0c;具体取决于您设备的设置方式。 本文涵盖了所有这些内容。该过程根据您的具体情…

git安装配置

1、下载安装 下载地址 2、配置git用户 git config --global user.name "yw" git config --global user.email "88888qq.com" 3、git init 初始化 4、生成ssh密钥 mkdir .ssh //创建文件夹cd .ssh //进入新建文件夹 ssh-keygen -t rsa // 输入密钥文…

计算机服务器中了halo勒索病毒如何处理,halo勒索病毒解密数据恢复

网络技术的不断发展与应用&#xff0c;为企业的生产生活提供了极大便利&#xff0c;但网络数据安全威胁无处不在&#xff0c;近日&#xff0c;云天数据恢复中心接到某连锁超市求助&#xff0c;企业计算机服务器被halo勒索病毒攻击&#xff0c;导致计算机系统瘫痪&#xff0c;无…

将xyz格式的GRACE数据转成geotiff格式

我们需要将xyz格式的文件转成geotiff便于成图&#xff0c;或者geotiff转成xyz用于数据运算&#xff0c;下面介绍如何实现这一操作&#xff0c;采用GMT和matlab两种方法。 1.GMT转换 我们先准备一个xyz文件&#xff0c;这里是一个降水文件。在gmt中采用以下的语句实现xyz转grd…