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 可以看到之前的思考过程,决定下一步
