Agent项目实战——Agent框架
创建agent需要model、memory、prompt、agent执行器等
搭建Agent框架,先将其主要功能封装在一个类中。
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate,MessagesPlaceholder
from langchain.agents import create_openai_tools_agent,AgentExecutor,tool
import os
os.environ["OPENAI_API_KEY"] = "sk-xxxxxxxxxx"
os.environ["OPENAI_API_BASE"] = "url" #代理地址
@tool
def test():
"""Test tool"""
return "test"
class Master:
def __init__(self):
self.chatmodel = ChatOpenAI(
model="gpt-3.5-turbo-0125",
temperature=0,
streaming=True,
)
self.MEMORY_KEY = "chat_history"
self.SYSTEMPL = ""
self.prompt = ChatPromptTemplate.from_messages(
[
("system", "你是一个助手,协助用户完成任务。"),
MessagesPlaceholder(variable_name="agent_scratchpad"),
("user", "{input}"),
]
)
self.memory = ""
tools = [test]
agent = create_openai_tools_agent(
self.chatmodel,
tools=tools,
prompt=self.prompt,
)
self.agent_executor = AgentExecutor(
agent=agent,
tools=tools,
verbose=True,
)
def run(self,query):
result = self.agent_executor.invoke({"input": query})
return result
随后在chat接口实例化对象,运行项目开始测试。
@app.post("/chat")
def chat(query:str):
master = Master()
return master.run(query)
在此需要注意:
1.Agent(智能体)创建的方法
1. initialize_agent
-
作用:通用的 Agent 创建入口,支持多种
AgentType(如ZERO_SHOT_REACT_DESCRIPTION、CHAT_CONVERSATIONAL_REACT_DESCRIPTION等)。 -
特点:
-
封装程度高,内部自动生成 prompt
-
通过
AgentType枚举选择不同的 agent 行为模式 -
直接返回 AgentExecutor,可直接执行
-
设计上更像"配置式",灵活性较低
-
-
适用模型:任意 LLM(包括非 OpenAI)
示例:
from langchain.agents import initialize_agent, AgentType
from langchain_openai import ChatOpenAI
from langchain.tools import Tool
# 定义一个简单工具
def add_numbers(a: int, b: int) -> int:
return a + b
tools = [
Tool(
name="AddNumbers",
func=lambda x: add_numbers(*map(int, x.split())),
description="输入两个整数,返回它们的和"
)
]
# 创建 LLM
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
# 创建 Agent
agent = initialize_agent(
tools=tools,
llm=llm,
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
verbose=True
)
# 运行
agent.run("请用 AddNumbers 计算 12 和 30 的和")
2. create_openai_tools_agent
- 作用:专门为 OpenAI Functions API(即 function calling)设计的 Agent 创建方法。
- 特点:
-
需要手动传入 prompt,自由度极高
-
返回的是
Runnable对象,可以被链式调用 -
必须配合 AgentExecutor 使用,职责分离更清晰
-
专为 OpenAI 的函数/工具调用优化
-
-
适用模型:仅支持 OpenAI function calling 模型
示例:
from langchain.agents import create_openai_tools_agent, tool
from langchain_openai import ChatOpenAI
from langchain.agents import tool
# 定义工具(使用 @tool 装饰器)
@tool
def multiply_numbers(a: int, b: int) -> int:
"""返回两个整数的乘积"""
return a * b
# 创建 LLM(必须是支持 function calling 的模型)
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
# 创建 Agent
agent = create_openai_tools_agent(llm, [multiply_numbers])
# 运行
result = agent.invoke({"input": "请用 multiply_numbers 计算 6 和 7 的乘积"})
print(result)
LangChain 官方明确建议:新项目v0.1.0+ 使用 create_openai_tools_agent 这类新函数,逐步淘汰 initialize_agent。!!!!!!
2.MessagesPlaceholder
MessagesPlaceholder 是 LangChain 框架中 ChatPromptTemplate 的一种特殊占位符,用于在提示词模板中动态插入一组已有的消息(通常是多轮对话的历史记录)。它是 Agent 的"草稿纸",记录整个思考→行动→观察的过程。
它的主要作用是:
- 保留对话上下文:在调用模型时,把之前的聊天记录插入到提示词中。
- 灵活插入消息列表:不需要提前知道有多少条历史消息。
- 与多轮对话记忆(Memory)配合:常用于
ConversationBufferMemory、ConversationBufferWindowMemory等。
通俗理解:
你可以把它想象成一个"草稿纸占位符":
-
variable_name="agent_scratchpad" 就像在说:"这里预留一个位置,放 Agent 的草稿纸"
-
运行时,LangChain 会自动把 Agent 的思考过程、中间步骤、工具调用记录等放到这个位置
实际工作流程:
# 典型的 Agent 提示模板结构
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个有用的助手,可以调用工具解决问题。"),
("user", "{input}"), # 用户输入
("placeholder", "{agent_scratchpad}"), #这里就是 MessagesPlaceholder
])
当 Agent 运行时:
第一轮:
agent_scratchpad是空的调用工具后:把"思考→调用工具→得到结果"的过程添加到
agent_scratchpad下一轮:Agent 可以看到之前的思考过程,决定下一步
更多推荐



所有评论(0)