回顾 LangGraph 并创建测试智能体
LangGraph 是用于构建基于 LLM 的复杂智能体的底层框架。它并非类似于 Coze 这样的低代码 Agent 构建平台,而是更侧重于提供强大的图结构控制能力。与其类似的是另一家主流框架 LlamaIndex 推出的 Workflows。
主要特点包括:
- 基于图结构定义的 AI 工作流:允许开发者以节点和边的形式定义逻辑。
- 支持复杂的循环与条件分支:能够处理多轮对话、工具调用循环等复杂场景。
- 细粒度的智能体控制:避免智能体成为'黑盒子',可精确控制每一步行为。
- 智能体状态的持久化:支持单步控制、暂停与恢复,便于调试。
- 支持多智能体开发与人机交互工作流:适合构建协作型系统。
现在让我们参考官方应用构建一个简单的测试智能体,这个智能体的 Graph 图定义如下:
这是一个非常简单的智能体,流程描述如下:
- 用户输入问题。
- 调用 LLM 获得问题答案,并决定是否需要调用搜索工具。
- 如果需要,则调用搜索引擎获得结果,并返回给 LLM 继续。
- 如果不再需要搜索,则给出答案,流程结束。
使用 LangGraph 实现智能体
1. 定义 State
定义在工作流中传递与保持的'状态'数据,可以理解为全局共享数据:
from typing import TypedDict, Annotated, Sequence
from langgraph.graph import StateGraph, END
from langgraph.graph import add_messages
from langchain_core.messages import BaseMessage
from langchain_openai import ChatOpenAI
from langgraph.prebuilt import ToolNode
from langchain_community.tools.tavily_search import TavilySearchResults
class AgentState(TypedDict):
messages: Annotated[Sequence[BaseMessage], add_messages]
2. 定义 Node
定义一个工作流中的处理节点,这里主要有两个:LLM 调用与搜索引擎调用。另外定义一个辅助判断方法,用来决定是否需要调用搜索引擎。
# 调用搜索引擎的工具节点,利用 ToolNode 构建
tools = [TavilySearchResults(max_results=1)]
tool_node = ToolNode(tools)
# 调用大模型
def ():
messages = state[]
messages = [{: , : }] + messages
model = ChatOpenAI(temperature=, model_name=)
model = model.bind_tools(tools)
response = model.invoke(messages)
{: [response]}
():
messages = state[]
last_message = messages[-]
last_message.tool_calls:
:


