大家好,博主又来给大家分享知识了。一直以来,我都非常感激大家对我的支持与鼓励,大家的点赞、关注和收藏,不仅是对博主分享内容的认可,更是博主不断创作、坚持分享知识的永恒动力。
今天给大家分享的内容是使用LangChain进行大模型应用开发中的LangGraph,那么什么是LangGraph呢?我们直接进入正题。
LangGraph是一个用于借助大语言模型(LLMs)构建有状态的、多主体应用程序的库,可用于创建智能体和多智能体工作流程。
LangGraph的灵感源自Pregel和Apache Beam。其公开接口借鉴了NetworkX的设计思路。LangGraph由LangChain的开发者——LangChain公司所开发,但即便不使用LangChain,也能运用LangGraph。
大家可选看:
LangGraph使我们能够对智能体应用程序的流程和状态进行细粒度的控制。它实现了一个中央持久层,具备了大多数智能体架构共有的功能:
LangGraph是LangChain的高级库,为大型语言模型(LLM)带来循环计算能力。它超越了LangChain的线性工作流,通过循环支持复杂的任务处理。
对这些组件进行标准化,能让个人和团队专注于智能体的行为本身,而非其支持性的基础设施。通过LangGraph平台,LangGraph还提供了用于开发、部署、调试和监控应用程序的工具。
LangGraph可与LangChain和LangSmith无缝集成(但并非必须使用它们)。
LangGraph平台是用于部署LangGraph智能体的基础设施。它是一个将智能体应用程序部署到生产环境的商业解决方案,构建在开源的LangGraph框架之上。
LangGraph平台由多个组件组成,这些组件协同工作,为LangGraph应用程序的开发、部署、调试和监控提供支持,包括:LangGraph服务器(提供应用程序编程接口)、LangGraph软件开发工具包(用于调用这些接口的客户端)、LangGraph命令行界面(用于构建服务器的命令行工具)以及LangGraph工作室(用户界面兼调试器)。
LangGraph平台的优势是它能够解决这些问题:
我们使用pip命令安装,安装命令为:
pip install langgraph
我们利用LangGraph和LangChain构建了一个基于大语言模型的问答工作流应用,实现与用户进行多轮对话并根据用户问题调用工具查询信息的功能。
我们构建一个简单的问答系统,通过工作流的方式管理对话流程,根据用户问题调用工具获取信息,并使用语言模型生成回复。
# 导入Literal类型,用于类型注解,指定方法返回值只能是特定的几个值
from typing import Literal
# 从langchain_core.messages模块导入HumanMessage类,用于表示人类输入的消息
from langchain_core.messages import HumanMessage
# 从langchain_core.tools模块导入tool装饰器,用于将方法转换为工具
from langchain_core.tools import tool
# 从langchain_openai模块导入ChatOpenAI类,用于调用OpenAI的聊天模型
from langchain_openai import ChatOpenAI
# 从langgraph.checkpoint.memory模块导入MemorySaver类,用于保存工作流的状态
from langgraph.checkpoint.memory import MemorySaver
# 从langgraph.graph模块导入END常量、StateGraph类和MessagesState类,用于构建工作流图和管理消息状态
from langgraph.graph import END, StateGraph, MessagesState
# 从langgraph.prebuilt模块导入ToolNode类,用于创建工具节点
from langgraph.prebuilt import ToolNode
# 使用tool装饰器将search方法转换为工具
@tool
def search(query: str):
"""模拟一个搜索工具"""
# 如果查询中包含“北京”或“Beijing”
if "北京" in query.lower() or "Beijing" in query.lower():
# 返回北京的天气信息
return "现在31度,有风."
# 否则返回默认的天气信息
return "现在是35度,万里无云。"
# 将search工具添加到列表中
tools = [search]
# 创建一个工具节点,用于处理工具调用
tool_node = ToolNode(tools)
# 初始化一个ChatOpenAI模型实例,使用gpt-3.5-turbo模型,设置temperature=0不考虑随机性,并将工具绑定到模型上
chat_model = ChatOpenAI(model="gpt-3.5-turbo", temperature=0).bind_tools(tools)
# 定义一个方法,用于判断是否需要继续调用工具
def should_continue(state: MessagesState) -> Literal["tools", END]:
# 从状态中获取消息列表
messages = state['messages']
# 获取最后一条消息
last_message = messages[-1]
# 如果最后一条消息包含工具调用
if last_message.tool_calls:
# 返回"tools",表示需要继续调用工具
return "tools"
# 否则返回END,表示工作流结束
return END
# 定义一个方法,用于调用语言模型处理消息
def call_model(state: MessagesState):
# 从状态中获取消息列表
messages = state['messages']
# 调用语言模型处理消息
response = chat_model.invoke(messages)
# 返回包含模型响应的新状态
return {"messages": [response]}
# 创建一个StateGraph实例,用于定义工作流的状态转换
workflow = StateGraph(MessagesState)
# 向工作流中添加一个名为"agent"的节点,该节点执行call_model方法
workflow.add_node("agent", call_model)
# 向工作流中添加一个名为"tools"的节点,该节点执行tool_node
workflow.add_node("tools", tool_node)
# 设置"agent"节点为工作流的入口点
workflow.set_entry_point("agent")
# 为"agent"节点添加条件边,根据should_continue方法的返回值决定流向
workflow.add_conditional_edges(
"agent",
should_continue,
)
# 添加从"tools"节点到"agent"节点的边,使得工具调用完成后回到"agent"节点继续处理
workflow.add_edge("tools", 'agent')
# 创建一个MemorySaver实例,用于保存工作流的状态
checkpointer = MemorySaver()
# 使用checkpointer编译工作流,生成可执行的应用
app = workflow.compile(checkpointer=checkpointer)
# 调用应用,传入用户的问题和配置信息
final_state = app.invoke(
{"messages": [HumanMessage(content="北京的天气怎么样?")]},
config={"configurable": {"thread_id": 21}}
)
# 从最终状态中提取模型的回复内容
result = final_state["messages"][-1].content
# 打印模型的回复
print(result)
# 再次调用应用,传入新的用户问题和配置信息
final_state = app.invoke(
{"messages": [HumanMessage(content="我问的哪个城市?")]},
config={"configurable": {"thread_id": 21}}
)
# 从最终状态中提取模型的回复内容
result = final_state["messages"][-1].content
# 打印模型的回复
print(result)
北京的天气现在是31度,有风。
您问的是北京城市的天气情况。
进程已结束,退出代码为 0
def should_continue(state: MessagesState) -> Literal["tools", END]:
messages = state['messages']
last_message = messages[-1]
if last_message.tool_calls:
return "tools"
return END
def call_model(state: MessagesState):
messages = state['messages']
response = chat_model.invoke(messages)
return {"messages": [response]}
workflow = StateGraph(MessagesState)
workflow.add_node("agent", call_model)
workflow.add_node("tools", tool_node)
workflow.set_entry_point("agent")
workflow.add_conditional_edges(
"agent",
should_continue,
)
workflow.add_edge("tools", 'agent')
checkpointer = MemorySaver()
app = workflow.compile(checkpointer=checkpointer)
final_state = app.invoke(
{"messages": [HumanMessage(content="北京的天气怎么样?")]},
config={"configurable": {"thread_id": 21}}
)
result = final_state["messages"][-1].content
print(result)
final_state = app.invoke(
{"messages": [HumanMessage(content="我问的哪个城市?")]},
config={"configurable": {"thread_id": 21}}
)
result = final_state["messages"][-1].content
print(result)
结合实际应用,LangGraph的作用主要体现在以下几个方面:
好了,以上就是本次分享的全部内容了。希望大家对LangGraph有一定的了解和掌握,本次分享只是对LangGraph的一个入门讲解,让大家对它有个概念,然后通过示例代码来给大家演示如何去使用它的功能。
LangGraph是一个用于构建具有LLMs的有状态、多角色应用程序的库,用于创建智能体和多智能体工作流。与其他LLM框架相比,它提供了循环、可控性和持久性的核心优势。
LangGraph允许我们定义涉及循环的流程,这对于大多数智能体架构至关重要。作为一种非常底层的框架,它提供了对应用程序的流程和状态的精细控制,这对创建可靠的智能体至关重要。此外,LangGraph包含内置的持久性,可以实现高级的 “人机交互” 和内存功能。
那么本次分享就到这里了。最后,博主还是那句话:请大家多去大胆的尝试和使用,成功总是在不断的失败中试验出来的,敢于尝试就已经成功了一半。如果大家对博主分享的内容感兴趣或有帮助,请点赞和关注。大家的点赞和关注是博主持续分享的动力,博主也希望让更多的人学习到新的知识。