从零到一:用LangGraph与LLM打造你的首个AI智能体

在构建复杂AI应用时,将强大的大型语言模型(LLM)与灵活的流程编排框架结合是实现智能化的关键一步。

今天,我们将聚焦于如何首次将LLM集成到LangGraph图中,构建一个“简单机器人”(Agent Bot),了解其基本工作原理,并探讨其初始阶段“无记忆”的特点。

为什么要将LLM与LangGraph结合?

LangGraph的核心是一个动态的图结构(Graph Structure),好比一张“智能蓝图”,通过节点(Nodes)和边(Edges)协调数据流,轻松实现复杂的AI工作流。相比纯Python函数,接入LLM就像为你的“流水线”装上一个能推理、生成内容的“大脑”。

通过LLM的加持,LangGraph可以处理用户输入、生成自然语言响应,甚至为后续复杂决策奠定基础。接下来,我们将用最简单的Agent Bot,带你上手这一组合!

️ 打造Agent I:你的第一个“简单机器人”

Agent Bot的目标直截了当:将LLM嵌入LangGraph图,掌握基本工作流。尽管它简单,却是你通往高级AI智能体的起点。

1. 核心基石:AgentState

在LangGraph中,**状态(State)**是节点间共享的“数据仓库”,存储上下文信息。Agent Bot的状态很简单,只包含用户输入的消息。我们用Python的TypedDict定义:

from typing import TypedDict, List
from langchain_core.messages import HumanMessage

class AgentState(TypedDict):
    messages: List[HumanMessage]

messages是一个HumanMessage对象列表,代表用户的输入,标准的LLM交互格式。

2. 定义LLM节点

节点是LangGraph中执行任务的单元。Agent Bot的核心节点负责调用LLM处理用户输入。我们用LangChain的ChatOpenAI初始化LLM(以GPT-4o-mini为例):

from langchain_openai import ChatOpenAI
import os

llm = ChatOpenAI(
    model="gpt-4o-mini",
    api_key=os.getenv("OPENAI_API_KEY"),
    base_url=os.getenv("OPENAI_BASE_URL")
)

def process(state: AgentState) -> AgentState:
    response = llm.invoke(state["messages"])
    print(f"\nAI: {response.content}")
    return state

这个process节点从状态中提取messages,调用LLM生成响应,并打印结果。

3. 构建与编译图

LangGraph通过StateGraph定义工作流,Agent Bot的图结构极简:起点(START)、LLM节点(process)、终点(END)。代码如下:

from langgraph.graph import StateGraph, START, END

graph = StateGraph(AgentState)
graph.add_node("process", process)
graph.add_edge(START, "process")
graph.add_edge("process", END)
agent = graph.compile()

STARTEND分别是工作流的入口和出口,编译后的图通过agent.invoke()运行,接收用户输入作为初始状态。

4. 运行Agent Bot

以下是交互代码,让用户与Agent I对话:

user_input = input("输入: ")
while user_input != "exit":
    agent.invoke({"messages": [HumanMessage(content=user_input)]})
    user_input = input("输入: ")

试试输入“嗨,我是Bob”,AI会热情回应。但如果你接着问“我叫什么?”,它可能会说“抱歉,我不知道你的名字”,这暴露了Agent I的局限。

⚠️ “无记忆”的痛点

Agent Bot成功集成了LLM,但它有一个致命弱点:无记忆。每次用户输入都触发一次独立的LLM调用,AI无法记住之前的对话。例如,你说“嗨,我是Bob”后问“我叫什么?”,AI因缺乏上下文而束手无策。

这是因为我们仅将当前HumanMessage传入llm.invoke(),没有存储对话历史。这种“无记忆”特性让Agent Bot显得“简单”,但也为我们指明了优化方向。

未来展望:向“有记忆”智能体进阶

Agent Bot是我们探索LangGraph与LLM融合的第一步。它的“无记忆”短板让我们意识到上下文管理的重要性。未来,我们将通过更复杂的状态设计(例如联合HumanMessageAIMessage)以及对话历史存储,让AI具备“记忆”,实现更流畅、聪明的交互体验。

完整代码

from typing import TypedDict, List
from langchain_core.messages import HumanMessage
from langchain_openai import ChatOpenAI
from langgraph.graph import StateGraph, START, END
import os

# 定义状态
class AgentState(TypedDict):
    messages: List[HumanMessage]

# 创建LLM
llm = ChatOpenAI(
    model="gpt-4o-mini",
    api_key=os.getenv("OPENAI_API_KEY"),
    base_url=os.getenv("OPENAI_BASE_URL")
)

# 创建节点
def process(state: AgentState) -> AgentState:
    response = llm.invoke(state["messages"])
    print(f"\nAI: {response.content}")
    return state

# 创建状态图
graph = StateGraph(AgentState)
# 添加节点
graph.add_node("process", process)
# 添加边
graph.add_edge(START, "process")
graph.add_edge("process", END)
# 编译图
agent = graph.compile()

# 交互循环
user_input = input("输入: ")
while user_input != "exit":
    agent.invoke({"messages": [HumanMessage(content=user_input)]})
    user_input = input("输入: ")

结语

通过Agent Bot,我们迈出了将LLM与LangGraph结合的关键一步。尽管它目前“无记忆”,但已为更强大的AI智能体铺平道路。下一期,我们将为Agent I注入“记忆”,让AI更聪明、更贴心!快动手试试,解锁AI开发的无限可能吧!

你可能感兴趣的:(LangGraph框架学习,人工智能,microsoft)