当前位置: 首页 > news >正文

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_DESCRIPTIONCHAT_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

MessagesPlaceholderLangChain框架中ChatPromptTemplate的一种特殊占位符,用于在提示词模板中动态插入一组已有的消息(通常是多轮对话的历史记录)。它是 Agent 的"草稿纸",记录整个思考→行动→观察的过程。

它的主要作用是:

  • 保留对话上下文:在调用模型时,把之前的聊天记录插入到提示词中。
  • 灵活插入消息列表:不需要提前知道有多少条历史消息。
  • 与多轮对话记忆(Memory)配合:常用于ConversationBufferMemoryConversationBufferWindowMemory等。

通俗理解:

你可以把它想象成一个"草稿纸占位符"

  • variable_name="agent_scratchpad"就像在说:"这里预留一个位置,放 Agent 的草稿纸"

  • 运行时,LangChain 会自动把 Agent 的思考过程、中间步骤、工具调用记录等放到这个位置

实际工作流程:

# 典型的 Agent 提示模板结构 prompt = ChatPromptTemplate.from_messages([ ("system", "你是一个有用的助手,可以调用工具解决问题。"), ("user", "{input}"), # 用户输入 ("placeholder", "{agent_scratchpad}"), #这里就是 MessagesPlaceholder ])

当 Agent 运行时:

  1. 第一轮agent_scratchpad是空的

  2. 调用工具后:把"思考→调用工具→得到结果"的过程添加到agent_scratchpad

  3. 下一轮:Agent 可以看到之前的思考过程,决定下一步

http://www.jsqmd.com/news/454102/

相关文章:

  • 2026年3月建筑AI实测白皮书:10款工具,EVAI第一
  • 怎么制作小程序,0门槛搭建企业专属小程序 - 码云数智
  • 2026年寺庙小程序开发指南:数字化赋能宗教场所,北京麦冬科技提供定制解决方案 - 品牌2026
  • 长沙看心理医生指南:真实案例分享与医院推荐
  • 2026年 羊绒面料厂家推荐排行榜,再生羊绒面料,出口外贸面料,高端定制与环保创新实力解析 - 品牌企业推荐师(官方)
  • 学术写作的“分子料理“:书匠策AI如何用算法解构重组降重与原创的边界
  • 2026网络安全新战场:重要性飙升背后,有哪些技术红利?
  • 新零售时代的敏捷供应链:线上线下融合下的货运物流系统设计思路
  • SOC蓄电池双向DC/DC充放电控制Matlab仿真模型探索
  • 华东瓷泳系统门窗优质品牌厂家推荐榜 - 优质品牌商家
  • 分享高中自习室优质公司亲测效果
  • 「MySQL」日期时间格式化函数 DATE_FORMAT() 的使用详解
  • 计及条件风险价值的电气综合能源系统能量 - 备用分布鲁棒优化
  • 计算机网络总结---基础
  • 一天一个Python库:pyarrow - 大规模数据处理的利器
  • MATLAB 实现基于萤火虫改进的麻雀搜索算法SSA
  • 深入理解Kafka:Java后端开发必备的消息队列技术
  • 题解 - P15434 [蓝桥杯 2025 国 Python B] 三角形构造
  • 2026年 Elmo国产化伺服驱动器推荐榜单:高功率密度/微型/高端/军工/半导体/关节模组专用,全国产化低压伺服驱动器实力厂家精选 - 品牌企业推荐师(官方)
  • 算法简史!
  • 一篇速通java线程池,看完直接上手用!
  • VMWare安装Centos 8系统
  • 2026年投票小程序开发指南:北京定制化技术服务商深度解析 - 品牌2026
  • Java面试实战:从Spring Boot到微服务架构的循序渐进问答
  • Vue——小白也能学!Day2
  • 智能软开关在配电网重构中的Matlab实践:基于二阶锥规划
  • 好用的监控塔品牌推荐,安徽佳旭钢结构上榜吗? - mypinpai
  • 阻抗分析仪与矢量网络分析仪在阻抗测量中的对比分析
  • 探索 Lumerical - FDTD 软件在光子学领域的奇妙之旅
  • 微算法科技(NASDAQ:MLGO)量子PBFT改进技术:重构联盟链共识的效率与安全