1. 学习背景
接上一篇传送门,介绍了AI Agent的基本工作原理。本节学习LangGraph的部分组件。
学习地址:传送门
代码地址:传送门
2. 开始上手
2.1 基本知识
上节学习,是从头开始构建了一个代理。如图:
这一次实践,则是使用LangGraph实现代理,顺便学习组件和特性。LangGraph主要做的事情则是帮助描述和编排控制流。也就是说,允许创建循环图,自带持久化可以不丢失上下文信息。
LangGraph的三个核心概念是:节点、边、和条件边
,如图所示:
节点是代理或者函数,边链接这些点,在做决定时,确定下一步路径,去哪个节点。形象化如下图所示:
2.2 代码实践,导入基本包
# 导入基本的环境读取包
from dotenv import load_dotenv
_ = load_dotenv()
from langgraph.graph import StateGraph, END
from typing import TypedDict, Annotated
import operator
from langchain_core.messages import AnyMessage, SystemMessage, HumanMessage, ToolMessage
from langchain_openai import ChatOpenAI
from langchain_community.tools.tavily_search import TavilySearchResults
# 导入基本工具,Tavily是一款在线搜索工具,每月有1000次API免费调用机会,需自行注册
tool = TavilySearchResults(max_results=4) #increased number of results
print(type(tool))
print(tool.name)
输出如下:
<class 'langchain_community.tools.tavily_search.tool.TavilySearchResults'>
tavily_search_results_json
2.3 尝试编写Agent
如果用户不熟悉python中的typing 注解,可以参考如下链接:Support for type hints
# 定义AgentState类,messages变量接受列表类型的变量,内容为AnyMessage类型数据
# operator.add意味着会将新的更新推送到messages其中
class AgentState(TypedDict):
messages: Annotated[list[AnyMessage], operator.add]
# 整个过程,Agent的状态非常重要,是衡量是否执行结束的判断标志
class Agent:
def __init__(self, model, tools, system=""):
self.system = system
graph = StateGraph(AgentState)
graph.add_node("llm", self.call_openai) # 构建节点
graph.add_node("action", self.take_action) # 如果有存在action,则执行
graph