掘金 人工智能 前天 09:26
LangGraph官方文档笔记(01)——构建一个基础聊天机器人
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文详细介绍了如何使用 LangGraph 框架构建一个基础的聊天机器人。文章从 LangGraph 的核心概念、环境配置入手,通过运行官方 demo,逐步拆解代码,详细讲解了 State 的定义、图的构建、节点的添加、边的连接,以及如何实现多轮对话。文章还提供了完整的代码示例,并介绍了如何使用国内云服务商的 LLM 模型。通过本文,读者可以快速掌握 LangGraph 的基本流程,并构建自己的聊天机器人。

🤖 LangGraph 是一个基于 LangChain 的智能体编排框架,它将 Agent 系统建模设计为有向图流程图,适合处理复杂流程或多 Agent 协作系统。

🔑 构建 LangGraph 应用的第一步是定义状态(State),状态通常是一个字典,用于存储和传递数据,例如聊天消息列表。使用 `add_messages` 函数来追加新消息到列表中。

🧩 核心流程包括:创建 StateGraph 图,添加节点(代表工作单元,如 LLM 调用),添加边(定义流程路径),最后编译图。START 和 END 分别表示流程的开始和结束。

💬 节点通常是 Python 函数,接受状态,更新状态,并返回状态。例如,聊天机器人的节点接收用户消息,调用 LLM 生成回复,并将回复添加到消息列表中。

⚙️ 通过 `graph.stream` 方法可以实现连续的聊天流,`while` 循环结合用户输入,可以实现多轮对话,构建一个交互式的聊天机器人。

通过这种方式来快速掌握langgraph基本流程,同时介绍关键的 LangGraph 概念。在之后的章节会逐步添加更复杂的功能,让我们开始吧!

在本节,我们会先跑通官方的demo,即创建一个简单的聊天机器人,这个聊天机器人将直接响应用户的消息。通过这种方式来快速掌握langgraph基本流程,同时介绍关键的 LangGraph 概念。在之后的章节会逐步添加更复杂的功能,让我们开始吧!

LangGraph介绍

LangGraph是基于LangChain的智能体编排框架,它将 Agent 系统建模设计为(有向图)流程图,每个节点表示一个计算步骤进行状态的更新,每条表示状态转移路径,适合处理复杂流程或多Agent 协作系统。

官方资料

本节对应的链接:

环境配置

首先,安装依赖包:

pip install -U langgraph langsmith "langchain[anthropic]"

如果实践过程中遇到了一些模块缺失,基本pip install都能解决,在环境依赖上我实践下来并没有遇到坑。

看官方的示例

无论如何,先把这一章节的完整官方代码copy下来,看看做了什么事情:

import getpassimport osdef _set_env(var: str):    if not os.environ.get(var):        os.environ[var] = getpass.getpass(f"{var}: ")_set_env("ANTHROPIC_API_KEY")from typing import Annotatedfrom typing_extensions import TypedDictfrom langgraph.graph import StateGraph, START, ENDfrom langgraph.graph.message import add_messagesclass 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)from langchain_anthropic import ChatAnthropicllm = ChatAnthropic(model="claude-3-5-sonnet-20240620")def chatbot(state: State):    return {"messages": [llm.invoke(state["messages"])]}# The first argument is the unique node name# The second argument is the function or object that will be called whenever# the node is used.graph_builder.add_node("chatbot", chatbot)graph_builder.add_edge(START, "chatbot")graph_builder.add_edge("chatbot", END)graph = graph_builder.compile()from IPython.display import Image, displaytry:    display(Image(graph.get_graph().draw_mermaid_png()))except Exception:    # This requires some extra dependencies and is optional    passdef stream_graph_updates(user_input: str):    for event in graph.stream({"messages": [{"role": "user", "content": user_input}]}):        for value in event.values():            print("Assistant:", value["messages"][-1].content)while True:    try:        user_input = input("User: ")        if user_input.lower() in ["quit", "exit", "q"]:            print("Goodbye!")            break        stream_graph_updates(user_input)    except:        # fallback if input() is not available        user_input = "What do you know about LangGraph?"        print("User: " + user_input)        stream_graph_updates(user_input)        break

可以看到,这段代码做了以下事情:

    设置环境变量:(环境变量名为ANTHROPIC_API_KEY)创建State类,即状态(继承自TypedDict,定义为字典类型)创建langgraph的图(StateGraph根据用户定义的 State构建图)创建大语言模型LLM和聊天chatbot函数(chatbot函数接受状态State返回更新后的状态)向图添加节点和边,然后编译(START表示将用户输入发送到图的节点,END是终止节点)使用Image, display可视化编译的图(不影响功能)创建stream_graph_updates方法用于连续聊天流while实现多轮对话

如果没有完全看懂也没关系,了解基本流程即可,接下来的实践中会把以上步骤进行拆解。

快速开始demo——基础聊天机器人

1.设置环境变量

国外的教程和文档里使用的大语言模型API KEY因为各种原因很难获取,对国内开发者不太友好。但好在咱们国内的云服务商在云端已部署好大模型服务,并且很多都兼容OPENAI接口,还提供了一定的免费额度,足够咱们学习使用。这里我使用的是火山方舟的"doubao-1-5-pro-32k-250115"模型。

import os#设置为你的API_KEYos.environ['ARK_API_KEY'] = 'YOUR_API_KEY'

这里我选择直接os.environ设置环境变量,并且之后的文章也是这样直接设置。你也可以选择用官方的,这样需要在运行时输入你的API_KEY即可。

2.创建State类

在定义一个图时,第一步是定义其状态。在示例中,状态是一个字典,字典的键为messages,值是一个装有对话消息的列表(习惯叫消息列表)。使用了add_messages函数来追加新消息到列表中,而不是覆盖它。

from typing import Annotatedfrom typing_extensions import TypedDictfrom langgraph.graph import StateGraph, START, ENDfrom langgraph.graph.message import add_messagesclass 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]

Annotated:允许为类型添加元数据(如验证函数、处理逻辑)。

TypedDict:创建带有类型注解的字典,允许你定义字典的键及其对应值的类。

add_messages:将 LLM 的响应消息附加到状态中已有的任何消息之后。参考add_messages文档

3.创建langgraph图

graph_builder = StateGraph(State)

我们根据定义的State创建了langgraph的图,这个图之后会添加节点和有向边,来流程性地处理任务。
StateGraph文档

4.创建LLM和聊天chatbot函数

接下来,添加一个“聊天机器人”节点。节点代表工作单元,它们通常是常规的 Python 函数,接受状态,更新状态,返回状态。

注意这里我用的是兼容openai接口的豆包大模型,你需要去官网获取你专属的API_KEY。

from langchain_openai import ChatOpenAI# 实际请以官方文档为准llm = ChatOpenAI(    base_url="https://ark.cn-beijing.volces.com/api/v3",    api_key=os.environ.get("ARK_API_KEY"),      model="doubao-1-5-pro-32k-250115"  # 根据实际模型名称修改)def chatbot(state: State):    return {"messages": [llm.invoke(state["messages"])]}

我们定义的 State 中的 add_messages 函数会将大语言模型(LLM)的响应消息追加到状态中已有的消息列表后面(即更新后的状态)。

5.向图添加节点和边,然后编译

接下来,先把我们的节点添加进去,然后添加边。START是入口点,这告诉我们的图在每次运行时"从哪里开始工作"。END是终止点,这指示图"每次运行此节点时,都可以退出"。

graph_builder.add_node("chatbot", chatbot)graph_builder.add_edge(START, "chatbot")graph_builder.add_edge("chatbot", END)graph = graph_builder.compile()

最后,我们需要能够运行我们的图。为此,调用图构建器上的"compile()"方法。这会创建一个我们可以用来调用状态的"CompiledGraph"。

6.可视化编译的图

你可以使用get_graph方法和其中一种“绘制”方法(如draw_ascii或draw_png)来可视化图形。每种draw方法都需要额外的依赖项。

from IPython.display import Image, displaytry:    display(Image(graph.get_graph().draw_mermaid_png()))except Exception:    # This requires some extra dependencies and is optional    pass

这部分我没能可视化成功,感觉是网络问题。报错如下:
ValueError: Failed to reach mermaid.ink/ API while trying to render your graph after 1 retries.

7.创建连续聊天流

def stream_graph_updates(user_input: str):    for event in graph.stream({"messages": [{"role": "user", "content": user_input}]}):        for value in event.values():            print("Assistant:", value["messages"][-1].content)

graph.stream 方法用于将用户的输入流过图,在图中处理并返回生成的事件。事件包含了聊天历史更新后的状态。value["messages"][-1].content即聊天机器人最新的回复。

8.实现多轮对话

while True:    try:        user_input = input("User: ")        if user_input.lower() in ["quit", "exit", "q"]:#输入"quit""exit""q"来退出聊天循环。            print("Goodbye!")            break        stream_graph_updates(user_input)    except:        # fallback if input() is not available        user_input = "一句话介绍langchain和LangGraph"        print("User: " + user_input)        stream_graph_updates(user_input)        break

恭喜!  您已经使用LangGraph构建了自己的第一个聊天机器人。此机器人可以通过接收用户输入并利用LLM生成响应来参与基本对话。

完整代码

import osfrom typing import Annotatedfrom typing_extensions import TypedDictfrom langgraph.graph import StateGraph, START, ENDfrom langgraph.graph.message import add_messagesfrom langchain_openai import ChatOpenAIfrom IPython.display import Image, displayos.environ['ARK_API_KEY'] = 'YOUR_API_KEY'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)# 实际请以官方文档为准llm = ChatOpenAI(    base_url="https://ark.cn-beijing.volces.com/api/v3",    api_key=os.environ.get("ARK_API_KEY"),  # 替换为你的API密钥    model="doubao-1-5-pro-32k-250115"  # 根据实际模型名称修改)def chatbot(state: State):    return {"messages": [llm.invoke(state["messages"])]}graph_builder.add_node("chatbot", chatbot)graph_builder.add_edge(START, "chatbot")graph_builder.add_edge("chatbot", END)graph = graph_builder.compile()try:    display(Image(graph.get_graph().draw_mermaid_png()))except Exception:    # This requires some extra dependencies and is optional    passdef stream_graph_updates(user_input: str):    for event in graph.stream({"messages": [{"role": "user", "content": user_input}]}):        for value in event.values():            print("Assistant:", value["messages"][-1].content)while True:    try:        user_input = input("User: ")        if user_input.lower() in ["quit", "exit", "q"]:            print("Goodbye!")            break        stream_graph_updates(user_input)    except:        # fallback if input() is not available        user_input = "一句话介绍langchain和LangGraph"        print("User: " + user_input)        stream_graph_updates(user_input)        break

原文地址:https://www.cnblogs.com/LiShengTrip/p/18924086

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

LangGraph LangChain 聊天机器人 LLM Agent
相关文章