使用LangGraph構(gòu)建你的第一個(gè)AI Agent-附完整代碼
AI Agent 指的是有能力主動思考和行動的智能體,能夠以類似人類的方式工作,通過大模型來“理解”用戶需求,主動“規(guī)劃”以達(dá)成目標(biāo),使用各種“工具”來完成任務(wù),并最終“行動”執(zhí)行這些任務(wù)。
從模型到 Agent
在 Agent 出現(xiàn)之前,我們將 AI 模型建為獨(dú)立且互不關(guān)聯(lián)的組件——一個(gè)模型用于理解文本,一個(gè)模型用于生成代碼,還有一個(gè)模型用于處理圖像。
這種碎片化的方法
- 迫使用戶手動管理工作流程
- 導(dǎo)致在不同系統(tǒng)之間切換時(shí)上下文信息消失
- 需要為每個(gè)流程步驟集成 ai 模型
Agent 的出現(xiàn)就是為了解決這一碎片問題。
與處理孤立任務(wù)的傳統(tǒng)模型不同,Agent 能夠管理各種功能,同時(shí)保持對整個(gè)任務(wù)的全面理解,它通過賦予大型語言模型 (LLMs) 訪問工具和知識來擴(kuò)展其能力,使模型能夠連貫執(zhí)行一系列操作。
使用 LangGraph 構(gòu)建 AI 代理
現(xiàn)在讓我們使用 LangGraph來構(gòu)建一個(gè)文本分析 agent。
LangGraph 是 LangChain 生態(tài)系統(tǒng)中的一個(gè)開源框架,專門用于構(gòu)建基于大型語言模型(LLM)的復(fù)雜應(yīng)用程序。它通過 圖結(jié)構(gòu)(Graph) 將應(yīng)用邏輯組織為有向圖,提供靈活的流程控制和狀態(tài)管理能力,適用于開發(fā)多智能體(Multi-Agent)、多步驟、動態(tài)交互的智能系統(tǒng)。
該 Agent 將根據(jù)文章內(nèi)容,進(jìn)行歸納分類,提取重要元素并給出摘要信息。
開發(fā)環(huán)境準(zhǔn)備
Python:3.11+
1. 導(dǎo)入必要的庫
pip install langgraph langchain langchain-openai python-dotenv
2. import 準(zhǔn)備
import os
from typing import TypedDict, List
from langgraph.graph import StateGraph, END
from langchain.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
from langchain.schema import HumanMessage
- StateGraph 管理代理組件之間的信息流
- PromptTemplate 創(chuàng)建一致的指令
- ChatOpenAI 連接到 OpenAI 的字符模型,為 agent 提供思維支持
3. 定義 State 類,記錄 Agent 數(shù)據(jù)
定義一個(gè)名為 'State' 的 TypedDict,用于結(jié)構(gòu)化個(gè)工具方法的狀態(tài)數(shù)據(jù)
from typing import TypedDict, List
# 定義一個(gè)名為 'State' 的TypedDict,用于結(jié)構(gòu)化表示狀態(tài)數(shù)據(jù)
class State(TypedDict):
text: str # 存儲原始輸入文本
classification: str # 分類結(jié)果(例如類別標(biāo)簽)
entities: List[str] # 存儲提取的實(shí)體列表(如命名實(shí)體)
summary: str # 存儲文本的摘要版本
4. 創(chuàng)建 llm 對象
llm = ChatOpenAI(model="qwen-plus", temperature=0, api_key="",
base_url="")
temperature 參數(shù)很重要
- temperature=0:專注、確定性的響應(yīng)
- temperature=1:更加多樣化、更具創(chuàng)造力的輸出
- temperature=2:天馬行空、有時(shí)語無倫次的想法
api_key 是訪問 AI 服務(wù)(如 OpenAI、DeepSeek 等)的身份憑證,用于:
- 身份驗(yàn)證:確保請求來自授權(quán)用戶。
- 權(quán)限控制:限制調(diào)用接口的范圍(如僅允許特定模型或功能)。
- 計(jì)費(fèi)與監(jiān)控:跟蹤 API 調(diào)用次數(shù)、費(fèi)用和使用模式。
base_url 是訪問 AI 服務(wù)的連接,不同 AI 服務(wù)商的 base_url 不一樣。
5. 添加 agent 功能
現(xiàn)在,我們將為 Agent 構(gòu)建專用工具方法,每個(gè)工具分別處理特定的任務(wù)類型。
分類功能
首先,是我們的分類功能:
def classification_node(state: State):
"""
將文本分類到預(yù)定義的類別中。
參數(shù):
state (State): 包含待分類文本的當(dāng)前狀態(tài)字典
返回:
dict: 包含"分類"鍵的字典,值為分類結(jié)果
分類類別:
- 新聞: 事實(shí)性報(bào)道當(dāng)前事件
- 博客: 個(gè)人或非正式的網(wǎng)絡(luò)寫作
- 研究: 學(xué)術(shù)或科學(xué)內(nèi)容
- 其他: 不符合上述類別的內(nèi)容
"""
# 創(chuàng)建提示模板,要求模型將文本分類到指定類別
prompt = PromptTemplate(
input_variables=["text"],
template="將以下文本分類到以下類別之一:新聞、博客、研究、其他。\n\n文本:{text}\n\n類別:"
)
# 使用狀態(tài)中的文本格式化提示并包裝為HumanMessage
message = HumanMessage(content=prompt.format(text=state["text"]))
# 調(diào)用語言模型進(jìn)行分類
classification = llm.invoke([message]).content.strip()
# 返回分類結(jié)果字典
return {"classification": classification}
此函數(shù)使用提示模板向我們的 AI 模型發(fā)出清晰的指令。該函數(shù)獲取當(dāng)前狀態(tài)(包含我們正在分析的文本)并返回其分類。
實(shí)體提取功能
接下來是我們的實(shí)體提取功能:
def entity_extraction_node(state: State):
# 從文本中識別并提取命名實(shí)體(按人物、組織、地點(diǎn)分類)
# 創(chuàng)建實(shí)體提取提示模板,要求返回逗號分隔的實(shí)體列表
prompt = PromptTemplate(
input_variables=["text"],
template="從以下文本中提取所有實(shí)體(人物、組織、地點(diǎn))。以逗號分隔列表形式返回結(jié)果。\n\n文本:{text}\n\n實(shí)體:"
)
# 使用文本格式化提示并包裝為HumanMessage
message = HumanMessage(content=prompt.format(text=state["text"]))
# 調(diào)用模型獲取響應(yīng),清理空白并拆分為列表
entities = llm.invoke([message]).content.strip().split(", ")
# 返回包含實(shí)體列表的字典
return {"entities": entities}
此函數(shù)處理文檔并返回關(guān)鍵實(shí)體列表,例如重要名稱、組織和地點(diǎn)。
摘要功能
最后,我們的摘要功能
def summarize_node(state: State):
# 創(chuàng)建摘要提示模板,要求用一句話總結(jié)輸入文本
# 使用模板創(chuàng)建鏈?zhǔn)教幚砹鞒蹋ㄌ崾灸0?→ 語言模型)
summarization_prompt = PromptTemplate.from_template(
"""用一句話總結(jié)以下文本。\n\n文本:{text}\n\n摘要:"""
)
# 構(gòu)建處理鏈:提示模板 → 語言模型
chain = summarization_prompt | llm
# 執(zhí)行處理流程,傳入文本進(jìn)行摘要生成
response = chain.invoke({"text": state["text"]})
# 返回包含摘要結(jié)果的字典
return {"summary": response.content}
此功能將文檔提煉為要點(diǎn)的簡明摘要。
這些技能相結(jié)合,使我們的代理能夠理解內(nèi)容類型、識別關(guān)鍵信息并創(chuàng)建易于理解的摘要——每個(gè)功能都遵循相同的模式:獲取當(dāng)前狀態(tài)、進(jìn)行處理,并將有用信息返回給下一個(gè)功能
7. 創(chuàng)建狀態(tài)圖對象
# 創(chuàng)建狀態(tài)圖對象
workflow = StateGraph(State)
# 添加處理節(jié)點(diǎn)到流程圖
workflow.add_node("classification_node", classification_node) # 分類節(jié)點(diǎn)
workflow.add_node("entity_extraction", entity_extraction_node) # 實(shí)體提取節(jié)點(diǎn)
workflow.add_node("summarization", summarize_node) # 摘要生成節(jié)點(diǎn)
# 設(shè)置流程入口點(diǎn)并定義執(zhí)行路徑
workflow.set_entry_point("classification_node") # 設(shè)置初始執(zhí)行節(jié)點(diǎn)
workflow.add_edge("classification_node", "entity_extraction") # 分類 → 實(shí)體提取
workflow.add_edge("entity_extraction", "summarization") # 實(shí)體提取 → 摘要生成
workflow.add_edge("summarization", END) # 摘要生成 → 流程結(jié)束
# 編譯工作流為可執(zhí)行應(yīng)用
app = workflow.compile()
OK,到之類我們就已經(jīng)構(gòu)建了一個(gè)完整的用于文章歸納總結(jié)摘要的 Agent,它能夠按照協(xié)調(diào)的順序完成從分類到實(shí)體提取再到摘要的整個(gè)過程,使其能夠理解文本類型、識別重要實(shí)體、創(chuàng)建摘要,然后完成整個(gè)流程。
8. 實(shí)戰(zhàn)一下
現(xiàn)在讓我們用示例文本測試我們的代理:
# 測試用例:關(guān)于Anthropic的MCP技術(shù)說明文本
sample_text = """
Anthropic的MCP(Model Context Protocol)是一個(gè)開源的強(qiáng)大工具,允許應(yīng)用程序與各種系統(tǒng)的API進(jìn)行無縫交互。
"""
# 創(chuàng)建初始狀態(tài)對象
state_input = {"text": sample_text}
# 執(zhí)行完整工作流處理
result = app.invoke(state_input)
# 輸出處理結(jié)果
print("分類結(jié)果:", result["classification"])
print("\n實(shí)體列表:", result["entities"])
print("\n摘要內(nèi)容:", result["summary"])
運(yùn)行結(jié)果
分類結(jié)果: 研究
理由:該文本提到了Anthropic的MCP(Model Context Protocol),并描述了其功能和特性。這種內(nèi)容通常與技術(shù)研究、創(chuàng)新工具或方法相關(guān),因此分類為“研究”較為合適。如果該文本出現(xiàn)在具體的產(chǎn)品新聞或個(gè)人觀點(diǎn)分享的語境下,也可能屬于其他類別,但從當(dāng)前表述來看,“研究”是最貼切的分類。
實(shí)體列表: ['Anthropic', 'MCP', 'Model Context Protocol']
摘要內(nèi)容: Anthropic的MCP是一個(gè)開源工具,可實(shí)現(xiàn)應(yīng)用程序與系統(tǒng)API的無縫交互。
最后
隨著大模型能力的不斷突破,未來 AI Agent 將深度融入社會生產(chǎn)與生活,成為數(shù)字化轉(zhuǎn)型的核心驅(qū)動力。開發(fā)者與企業(yè)需關(guān)注場景適配性、數(shù)據(jù)安全和人機(jī)協(xié)作,以最大化其價(jià)值。