在手机上怎么做微电影网站吗,室内设计师灵感网站,中文网址怎么注册,做sgs认证公司网站LangChain实战快速入门笔记#xff08;六#xff09;–LangChain使用之Agent 文章目录LangChain实战快速入门笔记#xff08;六#xff09;--LangChain使用之Agent一、理解Agents1. Agent与Chain的区别2. 什么是Agent3. Agent的核心能力/组件4. 举例5. 明确几个组件5.1 工具…LangChain实战快速入门笔记六–LangChain使用之Agent文章目录LangChain实战快速入门笔记六--LangChain使用之Agent一、理解Agents1. Agent与Chain的区别2. 什么是Agent3. Agent的核心能力/组件4. 举例5. 明确几个组件5.1 工具 Tool5.2 工具集 Toolkits5.3 智能体/代理 Agent5.4 代理执行器 AgentExecutor二、Agent 入门使用1. Agent、AgentExecutor的创建2. Agent的类型2.1 FUNCATION_CALL模式2.2 ReAct 模式3. AgentExecutor创建方式传统方式initialize_agent()通用方式AgentExecutor构造方法4. 小结创建方式三、 Agent中工具的使用1. 传统方式案例1单工具使用方式1ReAct模式方式2FUNCATION_CALL模式二者对比ZERO_SHOT_REACT_DESCRIPTION和OPENAI_FUNCTIONS案例2多工具使用方式1ReAct 模式方式2FUNCATION_CALL模式案例3自定义函数与工具2. 通用方式方式1FUNCATION_CALL模式方式2ReAct模式体会1使用PromptTemplate方式1方式2体会2使用ChatPromptTemplate四、Agent嵌入记忆组件1. 传统方式2. 通用方式举例1FUNCATION_CALL模式举例2ReAct 模式举例3远程获取提示词模版总结一、理解Agents通用人工智能AGI将是AI的终极形态几乎已成为业界共识。同样构建智能体Agent则是AI工程应用当下的“终极形态”。将 AI 和人类协作的程度类比自动驾驶的不同阶段1. Agent与Chain的区别在Chain中行动序列是硬编码的、固定流程的像是“线性流水线”而Agent则采用语言模型作为推理引擎具备一定的自主决策能力来确定以什么样的顺序采取什么样的行动像是“拥有大脑的机器工人”。它可以根据任务动态决定• 如何拆解任务• 需要调用哪些工具• 以什么顺序调用• 如何利用好中间结果推进任务2. 什么是AgentAgent智能体 是一个通过动态协调 **大语言模型LLM**和工具Tools来完成复杂任务的智能系统。它让LLM充当决策大脑根据用户输入自主选择和执行工具如搜索、计算、数据库查询等最终生成精准的响应。3. Agent的核心能力/组件作为一个智能体需要具备以下核心能力1大模型(LLM)作为大脑提供推理、规划和知识理解能力。• 比如OpenaAI()、ChatOpenAI()2记忆(Memory)具备短期记忆上下文和长期记忆向量存储支持快速知识检索。• 比如ConversationBufferMemory、ConversationSummaryMemory、ConversationBufferWindowMemory等3工具(Tools)调用外部工具如API、数据库的执行单元• 比如SearchTool、CalculatorTool4规划(Planning)任务分解、反思与自省框架实现复杂任务处理5行动(Action)实际执行决策的能力• 比如检索、推理、编程6协作通过与其他智能体交互合作完成更复杂的任务目标。问题为什么要调用第三方工具比如搜索引擎或者 数据库或借助第三方库呢因为大模型虽然非常强大但是也具备一定的局限性。比如不能回答实时信息、处理复杂数学逻辑问题仍然非常初级等等。因此可以借助第三方工具来辅助大模型的应用。以MCP工具为例说明https://bailian.console.aliyun.com/?tabmcp#/mcp-market我们期待它不仅仅是执⾏任务的⼯具而是⼀个能够思考、⾃主分析需求、拆解任务并逐步实现⽬标的智能实体。这种形态的智能体才更接近于⼈⼯智能的终极⽬标------AGI通⽤⼈⼯智能它能让类似于托尼·斯塔克的贾维斯那样的智能助⼿成为现实服务于每个⼈。4. 举例举例1[扣子平台][https://www.coze.cn/home] 智能体演示举例2Manus、纳米AI 使用演示5. 明确几个组件Agents 模块有几个关键组件5.1 工具 ToolLangChain 提供了广泛的入门工具但也支持自定义工具包括自定义描述。在框架内每个功能或函数被封装成一个工具Tools具有自己的输入、输出及处理方法。具体使用步骤① Agent 接收任务后通过大模型推理选择适合的工具处理任务。② 一旦选定LangChain将任务输入传递给该工具工具处理输入生成输出。③ 输出经过大模型推理可用于其他工具的输入或作为最终结果返回给用户。5.2 工具集 Toolkits在构建Agent时通常提供给LLM的工具不仅仅只有一两个而是一组可供选择的工具集(Tool列表)这样可以让 LLM 在完成任务时有更多的选择。5.3 智能体/代理 Agent智能体/代理agent可以协助我们做出决策调用相应的 API。底层的实现方式是通过 LLM 来决定下一步执行什么动作。5.4 代理执行器 AgentExecutorAgentExecutor本质上是代理的运行时负责协调智能体的决策和实际的工具执行。AgentExecutor是⼀个很好的起点但是当你开始拥有更多定制化的代理时它就不够灵活了。❗为了解决这个问题我们构建了LangGraph使其成为这种灵活、⾼度可控的运⾏时。二、Agent 入门使用1. Agent、AgentExecutor的创建注意这里的传统-通用非官方定义为便于理解的个人定义版本。2. Agent的类型顾名思义就是某件事可以由不同的⼈去完成最终结果可能是⼀样的但是做的过程可能各有千秋。⽐如⼀个公司需求普通开发可以编写技术经理也可以编写CTO也可以编写。虽然都能完成最后的需求但是CTO做的过程可能更加直观⾼效。在LangChain中Agent的类型就是为你提供不同的问题解决姿势的。API说明:https://python.langchain.com/v0.1/docs/modules/agents/agent_types/Agents的核心类型有两种模式• 方式1Funcation Call模式• 方式2ReAct 模式2.1 FUNCATION_CALL模式• 基于结构化函数调用如 OpenAI Function Calling• 直接生成工具调用参数JSON 格式• 效率更高适合工具明确的场景典型 AgentType#第1种AgentType.OPENAI_FUNCTIONS#第2种AgentType.OPENAI_MULTI_FUNCTIONS工作流程示例2.2 ReAct 模式• 基于文本推理的链式思考Reasoning Acting具备反思和自我纠错能力。❀ 推理Reasoning分析当前状态决定下一步行动❀ 行动Acting调用工具并返回结果• 通过自然语言描述决策过程• 适合需要明确推理步骤的场景。例如智能客服、问答系统、任务执行等。典型 AgentType#第1种: 零样本推理(可以在没有预先训练的情况下尝试解决新的问题)AgentType.ZERO_SHOT_REACT_DESCRIPTION#第2种: 无记忆对话AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION#第3种: 带记忆对话AgentType.CONVERSATIONAL_REACT_DESCRIPTION工作流程示例① 问题我想要查询xxx② 思考我需要先搜索最新信息 → 行动调用Search工具 → 观察获得3个结果 →③ 思考需要抓取第一个链接 → 行动调用scrape_website工具…→ 观察获得工具结果④ 最后获取结果Agent两种典型类型对比表3. AgentExecutor创建方式传统方式initialize_agent()•特点❀内置一些标准化模板如ZERO_SHOT_REACT_DESCRIPTION❀Agent的创建使用AgentType•优点快速上手3行代码完成配置•缺点定制化能力较弱如提示词固定代码片段fromlangchain.agentsimportinitialize_agent#第1步: 创建AgentExecutoragent_executorinitialize_agent(llmllm,agentAgentType.ZERO_SHOT_REACT_DESCRIPTION,tools[search_tool],verboseTrue)#第2步: 执行agent_executor.invoke({input:xxxx})通用方式AgentExecutor构造方法•特点❀ Agent的创建使用create_xxx_agent•优点❀ 可自定义提示词如从远程hub获取或本地自定义❀ 清晰分离Agent逻辑与执行逻辑•缺点❀ 需要更多代码❀ 需理解底层组件关系•代码片段fromlangchainimporthub prompthub.pull(hwchase17/react)tools[search_tool]#第1步: 创建Agent实例agentcreate_react_agent(llmllm,promptprompt,toolstools)#第2步: 创建AgentExecutor实例agent_executorAgentExecutor(agentagent,toolstools)#第3步: 执行agent_executor.invoke({input:xxxx})4. 小结创建方式三、 Agent中工具的使用1. 传统方式案例1单工具使用• 需求今天北京的天气怎么样?• 使用Tavily搜索工具❀ Tavily的搜索API是一个专门为人工智能Agent(或LLM)构建的搜索引擎可以快速提供实时、准确和真实的结果。❀ LangChain 中有一个内置工具可以轻松使用 Tavily 搜索引擎作为工具。❀ TAVILY_API_KEY申请https://tavily.com/注册账号并登录创建 API 密钥。方式1ReAct模式• AgentType是 ZERO_SHOT_REACT_DESCRIPTIONfromlangchain_openaiimportChatOpenAIfromlangchain.agentsimportinitialize_agent,AgentTypefromlangchain.toolsimportToolimportosimportdotenvfromlangchain_openaiimportChatOpenAIfromlangchain_community.tools.tavily_searchimportTavilySearchResults# 1. 设置API密钥os.environ[TAVILY_API_KEY]tvy-dev-T9zUN2xmIw6XluXnH2IXbYFZ12YD# 2. 初始化搜索工具searchTavilySearchResults(max_results3)# max_results --只用三条搜索结果# 3. 创建Tool的实例本步骤可以考虑省略直接使用search替换search_tool但建议加上search_toolTool(nameSearch,funcsearch.run,description用于搜索互联网上的信息)# 4. 初始化LLMdotenv.load_dotenv()os.environ[OPENAI_API_KEY]os.getenv(OPENAI_API_KEY)os.environ[OPENAI_BASE_URL]os.getenv(OPENAI_BASE_URL)llmChatOpenAI(modelgpt-4o-mini,temperature0,)# 5. 创建AgentExecutoragent_executorinitialize_agent(tools[search_tool],llmllm,agentAgentType.ZERO_SHOT_REACT_DESCRIPTION,verboseTrue)# 5. 测试查询query今天北京的天气怎么样resultagent_executor.invoke(query)print(f查询结果:{result})拓展上述程序中tool的设置也可以简化为# 初始化搜索工具searchTavilySearchResults(max_results3)# 创建AgentExecutoragent_executorinitialize_agent(tools[search],llmllm,agentAgentType.ZERO_SHOT_REACT_DESCRIPTION,verboseTrue)方式2FUNCATION_CALL模式• AgentType是OPENAI_FUNCTIONS提示只需要修改前面代码中的initialize_agent中的agent参数值。fromlangchain_openaiimportChatOpenAIfromlangchain.agentsimportinitialize_agent,AgentTypefromlangchain.toolsimportToolimportosimportdotenvfromlangchain_openaiimportChatOpenAIfromlangchain_community.tools.tavily_searchimportTavilySearchResults# 1. 设置API密钥os.environ[TAVILY_API_KEY]tvy-dev-T9zUN2xmIw6XluXnH2IXbYFZ12YD# 2. 初始化搜索工具searchTavilySearchResults(max_results3)# 3. 创建Tool的实例search_toolTool(nameSearch,funcsearch.run,description用于搜索互联网上的信息)# 4. 初始化LLMdotenv.load_dotenv()os.environ[OPENAI_API_KEY]os.getenv(OPENAI_API_KEY)os.environ[OPENAI_BASE_URL]os.getenv(OPENAI_BASE_URL)llmChatOpenAI(modelgpt-4o-mini,temperature0,)# 5. 创建AgentExecutoragent_executorinitialize_agent(tools[search_tool],llmllm,agentAgentType.OPENAI_FUNCTIONS,#唯一变化verboseTrue)# 5. 测试查询query今天北京的天气怎么样resultagent_executor.invoke(query)print(f查询结果:{result})二者对比ZERO_SHOT_REACT_DESCRIPTION和OPENAI_FUNCTIONS案例2多工具使用• 需求❀ 计算特斯拉当前股价是多少❀ 比去年上涨了百分之几提示调用PythonREPL实例的run方法• 多个两个工具的选择方式1ReAct 模式• AgentType是 ZERO_SHOT_REACT_DESCRIPTION# 1.导入相关依赖fromlangchain_openaiimportChatOpenAIfromlangchain.agentsimportinitialize_agent,AgentTypefromlangchain.toolsimportToolfromlangchain_community.tools.tavily_searchimportTavilySearchResultsfromlangchain_experimental.utilities.pythonimportPythonREPL# 2.设置 TAVILY_API 密钥os.environ[TAVILY_API_KEY]tvy-dev-T9zUN2xmIw6XluXnH2IXbYFZ12YD#需要替换为你的Tavily API密钥# 3.定义搜索工具searchTavilySearchResults(max_results3)search_toolTool(nameSearch,funcsearch.run,description用于搜索互联网上的信息特别是股票价格和新闻)# 4.定义计算工具python_replPythonREPL()# LangChain封装的工具类可以进行数学计算calc_toolTool(nameCalculator,funcpython_repl.run,description用于执行数学计算例如计算百分比变化)# 5.定义LLMllmChatOpenAI(modelgpt-4o-mini,temperature0,)# 6.创建AgentExecutor执行对象agent_executorinitialize_agent(tools[search_tool,calc_tool],llmllm,agentAgentType.ZERO_SHOT_REACT_DESCRIPTION,verboseTrue)# 7.测试股票价格查询query特斯拉当前股价是多少比去年上涨了百分之几resultagent_executor.invoke(query)print(f查询结果:{result})注意可能会失败查询超时。方式2FUNCATION_CALL模式• AgentType是 FUNCATION_CALL# 1.导入相关依赖fromlangchain_openaiimportChatOpenAIfromlangchain.agentsimportinitialize_agent,AgentTypefromlangchain.toolsimportToolfromlangchain_community.tools.tavily_searchimportTavilySearchResultsfromlangchain_experimental.utilities.pythonimportPythonREPL# 2.设置 TAVILY_API 密钥os.environ[TAVILY_API_KEY]tvy-dev-T9zUN2xmIw6XluXnH2IXbYFZ12YD#需要替换为你的Tavily API密钥# 3.定义搜索工具searchTavilySearchResults(max_results3)search_toolTool(nameSearch,funcsearch.run,description用于搜索互联网上的信息特别是股票价格和新闻)# 4.定义计算工具python_replPythonREPL()# LangChain封装的工具类可以进行数学计算calc_toolTool(nameCalculator,funcpython_repl.run,description用于执行数学计算例如计算百分比变化)# 5.定义LLMllmChatOpenAI(modelgpt-4,temperature0,)# 6.创建AgentExecutor执行对象agent_executorinitialize_agent(tools[search_tool,calc_tool],llmllm,agentAgentType.OPENAI_FUNCTIONS,#唯一变化的位置verboseTrue)# 7.测试股票价格查询query特斯拉当前股价是多少比去年上涨了百分之几resultagent_executor.invoke(query)print(f查询结果:{result})注意也有可能输出失败但是机会小。案例3自定义函数与工具需求计算3的平方Agent自动调用工具完成fromlangchain.agentsimportinitialize_agent,AgentType,Toolfromlangchain_openaiimportChatOpenAIimportlangchain# 1.定义工具 - 计算器要求字符串输入defsimple_calculator(expression:str)-str: 基础数学计算工具支持加减乘除和幂运算 参数: expression: 数学表达式字符串如 35 或 2**3 返回: 计算结果字符串或错误信息 print(f[√]工具调用 计算表达式:{expression})print(只因为在人群中多看了你一眼确认下你调用了我^_^)returnstr(eval(expression))# 2.创建工具对象math_calculator_toolTool(nameMath_Calculator,# 工具名称Agent将根据名称选择工具funcsimple_calculator,# 工具调用的函数description用于数学计算输入必须是纯数学表达式如35或3**2表示平方。不支持字母或特殊符号# 关键明确输入格式要求)# 3.初始化大模型llmChatOpenAI(modelgpt-4o-mini,temperature0,)# 4.初始化AgentExecutor使用零样本React模式增加即时设置agent_executorinitialize_agent(tools[math_calculator_tool],# 可用的工具列表llmllm,agentAgentType.ZERO_SHOT_REACT_DESCRIPTION,# 简单指令模式verboseTrue# 关键参数在控制台显示详细的推理过程)# 5.测试工具调用添加异常捕获print( 测试正常工具调用 )responseagent_executor.invoke(计算3的平方)# 向Agent提问print(最终答案:,response)2. 通用方式需求今天北京的天气怎么样方式1FUNCATION_CALL模式# 1.导入相关包fromlangchain.agentsimportAgentExecutor,create_tool_calling_agentfromlangchain_community.tools.tavily_searchimportTavilySearchResultsfromlangchain_core.promptsimportChatPromptTemplateimportosfromlangchain_openaiimportChatOpenAI# 2.定义搜索化工具# ① 设置TAVILY API密钥os.environ[TAVILY_API_KEY]tvy-dev-yBbK0KLV3RpGcvBXsqRelBcdMnlZR# 需要替换为你的Tavily API密钥# ② 定义搜索工具searchTavilySearchResults(max_results1)# 3.自定义提示词模板promptChatPromptTemplate.from_messages([(system,您是一位乐于助人的助手, 请务必使用 tavily_search_results_json 工具来获取信息。),(human,{input}),(placeholder,{agent_scratchpad}),])# 4.定义LLMllmChatOpenAI(modelgpt-4o-mini,temperature0,)# 5.创建Agent对象agentcreate_tool_calling_agent(llmllm,tools[search],promptprompt)# 6.创建AgentExecutor执行器agent_executorAgentExecutor(agentagent,tools[search],verboseTrue)# 7.测试agent_executor.invoke({input:今天北京的天气怎么样})注意定义agent_scratchpad必须声明它用于存储和传递Agent的思考过程。比如在调用链式工具时如先搜索天气再推荐行程作用agent_scratchpad保留所有历史步骤避免上下文丢失。format方法会将intermediate_steps转换为特定格式的字符串并赋值给agent_scratchpad变量。如果不传递 intermediate_steps参数会导致KeyError: intermediate_steps’错误。方式2ReAct模式体会1使用PromptTemplate提示词要体现可以使用的工具、用户输入和agent_scratchpad。远程的提示词模版通过https://smith.langchain.com/hub/hwchase17获取• 举例https://smith.langchain.com/hub/hwchase17/react这个模板是专为ReAct模式设计的提示模板。这个模板中已经有聊天对话键tools、tool_names、agent_scratchpad方式1# 1.导入相关包fromlangchain.agentsimportAgentExecutor,create_react_agentfromlangchain_community.tools.tavily_searchimportTavilySearchResultsfromlangchain_core.promptsimportPromptTemplate# 2.定义搜索化工具tools[TavilySearchResults(max_results1,tavily_api_keytvy-dev-T9zUN2xmIw6XluXnH2IXbYFZ12Yd)]# 3.自定义提示词模板templateAnswer the following questions as best you can. You have access to the following tools: {tools} Use the following format: Question: the input question you must answer Thought: you should always think about what to do Action: the action to take, should be one of [{tool_names}] Action Input: the input to the action Observation: the result of the action ... (this Thought/Action/Action Input/Observation can repeat N times) Thought: I now know the final answer Final Answer: the final answer to the original input question Begin! Question: {input} Thought:{agent_scratchpad}# template1 # 请尽可能准确地回答以下问题, 您可以使用以下工具: {tools}# 请您使用以下格式:# 问题: 您必须回答的输入问题# 思考: 您应该始终思考要做什么# 行动: 要采取的行动, 应为 [{tool_names}] 中的一个# 行动输入: 行动的输入# 观察: 行动的结果# ...... (此思考/行动/行动输入/观察可重复 N 次)# 思考: 我现在知道最终答案了# 最终答案: 对原始输入问题的最终答案# 开始!# 问题: {question}# 思考: {agent_scratchpad}# promptPromptTemplate.from_template(template)# 4.定义LLMllmChatOpenAI(modelgpt-4o-mini,temperature0,)# 5.创建Agent对象agentcreate_react_agent(llm,tools,prompt)# 6.创建AgentExecutor执行器agent_executorAgentExecutor(agentagent,toolstools,verboseTrue,handle_parsing_errorsTrue)# 7.测试agent_executor.invoke({input:今天北京的天气怎么样})方式2# 1.导入相关包fromlangchain.agentsimportAgentExecutor,create_react_agentfromlangchain_community.tools.tavily_searchimportTavilySearchResultsfromlangchain_core.promptsimportPromptTemplatefromlangchainimporthubfromlangchain_openaiimportChatOpenAI# 2.定义搜索化工具tools[TavilySearchResults(max_results1,tavily_api_keytvy-dev-T9zUN2xmIw6XluXnH2IXbYFZ12Yd)]# 3.使用LangChain Hub中的官方ReAct提示模板 直接调用网址上的提示词换一种方式而已prompthub.pull(hwchase17/react)# 4.定义LLMllmChatOpenAI(modelgpt-4o-mini,temperature0,)# 5.创建Agent对象agentcreate_react_agent(llm,tools,prompt)# 6.创建AgentExecutor执行器agent_executorAgentExecutor(agentagent,toolstools,verboseTrue,handle_parsing_errorsTrue)# 7.测试agent_executor.invoke({input:今天北京的天气怎么样})体会2使用ChatPromptTemplate提示词中需要体现使用的工具、用户输入和agent_scratchpad。fromlangchain.agentsimportcreate_react_agentfromlangchain_core.promptsimportChatPromptTemplate# 获取Tavily搜索的实例fromlangchain_openaiimportChatOpenAIfromlangchain.agentsimportinitialize_agent,AgentType,create_tool_calling_agent,AgentExecutorfromlangchain.toolsimportToolimportosimportdotenvfromlangchain_openaiimportChatOpenAIfromlangchain_community.tools.tavily_searchimportTavilySearchResults dotenv.load_dotenv()# 读取配置文件的信息os.environ[TAVILY_API_KEY]tvy-dev-Yvg0XmzpzBueEMnXV3KGuNvQxkKW2# 获取Tavily搜索工具的实例searchTavilySearchResults(max_results3)# 获取一个搜索的工具searchToolTool(funcsearch.run,nameSearch,description用于检索互联网上的信息尤其是天气情况)# 获取大语言模型os.environ[OPENAI_API_KEY]os.getenv(OPENAI_API_KEY)os.environ[OPENAI_BASE_URL]os.getenv(OPENAI_BASE_URL)llmChatOpenAI(modelgpt-4o-mini,temperature0,)# 提供提示词模板以ChatPromptTemplate为例# prompt_template ChatPromptTemplate.from_messages([# (system, 你是一个人工智能的助手, 在用户提出需求以后, 必须要调用Search工具进行联网搜索。),# (system, 这是你可以使用的工具列表{tools}, 每次Action时调用{tool_names}, 并根据工具输出的网络结果回答用户的问题。),# (system, 工具调用格式必须严格遵守:# Thought: 分析需要做什么例如: 需要查询明天北京的天气# Action: 工具名称只能是{tool_names}中的一个# Action Input: 工具的输入内容例如: 北京明天天气# 若工具返回内容:# Observation: 工具返回的结果# 当我知道了足够的信息之后就说明输出:# Thought: 我知道答案了# FinalAnswer: 经过整理后的最终答案),# (system, {agent_scratchpad}),# (human, 我的问题是: {question}),# ])prompt_templateChatPromptTemplate.from_messages([(system,你是一个人工智能的助手, 在用户提出需求以后, 必须要调用Search工具进行联网搜索。),(system,Answer the following questions as best you can. You have access to the following tools: {tools} Use the following format: Question: the input question you must answer Thought: you should always think about what to do Action: the action to take, should be one of [{tool_names}] Action Input: the input to the action Observation: the result of the action ... (this Thought/Action/Action Input/Observation can repeat N times) Thought: I now know the final answer Final Answer: the final answer to the original input question Begin! 执行过程建议使用中文 ),(system,当前思考: {agent_scratchpad}),# 必须在提示词模板中提供agent_scratchpad参数。(human,我的问题是: {question}),])# 获取Agent的实例: create_tool_calling_agent()agentcreate_react_agent(llmllm,promptprompt_template,tools[searchTool])# 获取AgentExecutor的实例agent_executorAgentExecutor(agentagent,tools[searchTool],verboseTrue,handle_parsing_errorsTrue,max_iterations6# 可选: 限制最大迭代次数, 防止无限循环)# 通过AgentExecutor的实例调用invoke()得到响应resultagent_executor.invoke({question:查询今天北京的天气情况})# 处理响应print(result)执行结果上述执行可能会报错。错误原因:• 使用 ReAct 模式时要求 LLM 的响应必须遵循严格的格式如包含 Thought:、Action: 等标记。• 但 LLM 直接返回了自由文本非结构化导致解析器无法识别。修改:• 任务不变添加 handle_parsing_errorsTrue。用于控制 Agent 在解析工具调用或输出时发生错误的容错行为。handle_parsing_errorsTrue 的作用• 自动捕获错误并修复当解析失败时Agent 不会直接崩溃而是将错误信息传递给 LLM让 LLM自行修正并重试。• 降级处理如果重试后仍失败Agent 会返回一个友好的错误消息如“I couldn’t process that request.”而不是抛出异常。小结小结:1、传统方式相较于通用方式来讲不用提供提示词模板。2、对于通用方式来讲FUNCTION_CALL 模式在创建 Agent 时推荐大家使用 ChatPromptTemplateReAct 模式在创建 Agent 时大家可以使用ChatPromptTemplate、PromptTemplate。但相较来讲推荐大家使用 PromptTemplate四、Agent嵌入记忆组件1. 传统方式比如北京明天的天气怎么样上海呢 通过两次对话实现举例以REACT模式为例# 1. 导入依赖包fromlangchain_openaiimportChatOpenAIfromlangchain.agentsimportinitialize_agent,AgentTypefromlangchain_community.tools.tavily_searchimportTavilySearchResultsfromlangchain.memoryimportConversationBufferMemoryimportosimportdotenv dotenv.load_dotenv()# 2. 设置API密钥os.environ[TAVILY_API_KEY]tvy-dev-T9zUN2xmIw6XluXnH2IXbYFZf12Yd# 3. 定义搜索工具search_toolTavilySearchResults(max_results2)# 4. 定义LLMos.environ[OPENAI_API_KEY]os.getenv(OPENAI_API_KEY1)os.environ[OPENAI_BASE_URL]os.getenv(OPENAI_BASE_URL)llmChatOpenAI(modelgpt-4o-mini,temperature0)# 5. 定义记忆组件(以ConversationBufferMemory为例)memoryConversationBufferMemory(memory_keychat_history,# 必须是此值, 通过initialize_agent()的源码追踪得到return_messagesTrue)# 6. 创建AgentExecutoragent_executorinitialize_agent(tools[search_tool],llmllm,agentAgentType.CONVERSATIONAL_REACT_DESCRIPTION,memorymemory,#在AgentExecutor中声明verboseTrue)# 7. 测试对话# 第一个查询query1北京明天的天气怎么样result1agent_executor.invoke(query1)print(f查询结果:{result1})# print(\n 继续对话 )query2上海呢result2agent_executor.invoke(query2)print(f分析结果:{result2})上述执行可能会报错。错误原因:• 使用 ReAct 模式时要求 LLM 的响应必须遵循严格的格式如包含 Thought:、Action: 等标记。• 但 LLM 直接返回了自由文本非结构化导致解析器无法识别。修改:• 任务不变添加 handle_parsing_errorsTrue。用于控制 Agent 在解析工具调用或输出时发生错误的容错行为。handle_parsing_errorsTrue 的作用• 自动捕获错误并修复当解析失败时Agent 不会直接崩溃而是将错误信息传递给 LLM让 LLM 自行修正并重试。• 降级处理如果重试后仍失败Agent 会返回一个友好的错误消息如 “I couldn’t process that request.”而不是抛出异常。小结代码修改为# 1. 导入依赖包fromlangchain_openaiimportChatOpenAIfromlangchain.agentsimportinitialize_agent,AgentTypefromlangchain.toolsimportToolfromlangchain_community.tools.tavily_searchimportTavilySearchResultsfromlangchain_experimental.utilities.pythonimportPythonREPLfromlangchain.memoryimportConversationBufferMemory# 2. 设置API密钥os.environ[TAVILY_API_KEY]tvy-dev-T9zUN2xmIw6XluXnH2IXbYFZf12Yd# 3. 定义搜索工具search_toolTavilySearchResults(max_results2)# 5. 定义LLMllmChatOpenAI(modelgpt-4,temperature0)# 6. 定义记忆组件(以ConversationBufferMemory为例)memoryConversationBufferMemory(memory_keychat_history,return_messagesTrue)# 7. 创建AgentExecutoragent_executorinitialize_agent(tools[search_tool],llmllm,agentAgentType.CONVERSATIONAL_REACT_DESCRIPTION,memorymemory,handle_parsing_errorsTrue,verboseTrue)# 8. 测试对话# 第一个查询query1北京明天的天气怎么样result1agent_executor.invoke(query1)print(f查询结果:{result1})# print(\n 继续对话 )query2上海呢result2agent_executor.invoke(query2)print(f分析结果:{result2})再例2. 通用方式通用方式相较于传统方式可以提供自定义的提示词模板举例1FUNCATION_CALL模式如果使用的是FUNCTION_CALL方式则创建Agent时推荐使用ChatPromptTemplate# 1. 导入依赖包fromlangchain_openaiimportChatOpenAIfromlangchain.agentsimportinitialize_agent,AgentType,create_tool_calling_agentfromlangchain.toolsimportToolfromlangchain_community.tools.tavily_searchimportTavilySearchResultsfromlangchain_experimental.utilities.pythonimportPythonREPLfromlangchain.memoryimportConversationBufferMemoryfromlangchain_core.promptsimportChatPromptTemplateimportos# 2. 设置TAVILY API密钥os.environ[TAVILY_API_KEY]tvy-dev-T9zUN2xmIw6XluXnH2IXbYFZf12Yd# 3. 定义搜索工具searchTavilySearchResults(max_results2)search_toolTool(nameSearch,funcsearch.run,description用于互联网信息的检索)tools[search_tool]# 或者searchTavilySearchResults(max_results2)tools[search]# 4. 定义LLMllmChatOpenAI(modelgpt-4,temperature0)# 5. 定义提示词模板promptChatPromptTemplate.from_messages([(system,你是一个聪明的助手可以调用工具。),(human,{input}),# 思考: 如果想让Agent记住历史记录, 则需要将chat_history传入(placeholder,{agent_scratchpad})])# 6. 定义记忆组件(以ConversationBufferMemory为例)memoryConversationBufferMemory(memory_keychat_history,return_messagesTrue)# 7. 创建Agentagentcreate_tool_calling_agent(llm,tools,prompt)# 8. 创建AgentExecutor执行器(注意: memory参数需写在AgentExecutor类中)agent_executorAgentExecutor(agentagent,memorymemory,toolstools,verboseTrue)# 9. 测试对话# 第一个查询result1agent_executor.invoke({input:北京的天气多少})print(f查询结果:{result1})# print(\n 继续对话 )result2agent_executor.invoke({input:上海呢})print(f分析结果:{result2})拓展1如果ChatPromptTemplate.from_messages()中没有提供(“placeholder”, “{chat_history}”)这样操作会怎样呢输出如下拓展2如果删除AgentExecutor构造方法中的memory参数又会如何呢举例2ReAct 模式ReAct模式下创建Agent时可以使用ChatPromptTemplate、PromptTemplate# 1.导入相关包fromlangchain.agentsimportAgentExecutor,create_react_agentfromlangchain_community.tools.tavily_searchimportTavilySearchResultsfromlangchain_core.promptsimportPromptTemplateimportos# 2.定义搜索化工具# ① 设置TAVILY API密钥os.environ[TAVILY_API_KEY]tvy-dev-T9zUN2xmIw6XluXnH2IXbYFZf12Yd# 需要替换为你的Tavily API密钥# ② 定义搜索工具searchTavilySearchResults(max_results1)# ③ 设置工具集tools[search]# 3.自定义提示词模板template(Assistant is a large language model trained by OpenAI.\nAssistant is designed to be able to assist with a wide range of tasks, from answering simple questions to providing in-depth explanations and discussions on a wide range of topics. As a language model, Assistant is able to generate human-like text based on the input it receives, allowing it to engage in natural-sounding conversations and provide responses that are coherent and relevant to the topic at hand.\nAssistant is constantly learning and improving, and its capabilities are constantly evolving. It is able to process and understand large amounts of text, and can use this knowledge to provide accurate and informative responses to a wide range of questions. Additionally, Assistant is able to generate its own text based on the input it receives, allowing it to engage in discussions and provide explanations and descriptions on a wide range of topics.\nOverall, Assistant is a powerful tool that can help with a wide range of tasks and provide valuable insights and information on a wide range of topics. Whether you need help with a specific question or just want to have a conversation about a particular topic, Assistant is here to assist!\n\nTOOLS:\n-----\nAssistant has access to the following tools:\n{tools}\n\nTo use a tool, please use the following format:\n\nThought: Do I need to use a tool? Yes\nAction: the action to take, should be one of [{tool_names}]\nAction Input: the input to the action\nObservation: the result of the action\n\nWhen you have a response to say to the Human, or if you do not need to use a tool, you MUST use the format:\n\nThought: Do I need to use a tool? No\nFinal Answer: your response here\n\n\nBegin!\n\nPrevious conversation history:\n{chat_history}\n\nNew input: {input}\n{agent scratchpad})# template 助手是由 OpenAI 训练的一个大型语言模型。\n# 助手是由 OpenAI 训练的一个大型语言模型。\n# 助手旨在能够协助您完成各种各样的任务从回答简单的问题到对各种主题进行深入的解释和讨论。作为语言模型助手能够根据接收到的输入生成类似人类的文本从而能够进行自然流畅的对话并提供与当前主题相关且连贯的回答。\n# 助手在不断学习和改进其能力也在不断发展。它能够处理和理解大量的文本并利用这些知识为各种问题提供准确且信息丰富的回答。此外助手还能够根据接收到的输入生成自己的文本从而能够参与讨论并提供解释和描述。\n# 总的来说助手是一个强大的工具能够帮助完成各种各样的任务并在各种主题上提供有价值的见解和信息。无论您是需要解答某个具体问题还是只是想就某个特定话题进行交流助手都在这里为您提供帮助。\n\n# 工具\n-----# {tools}\n# 若要使用某个工具请使用以下格式\n# # 思考我是否需要使用工具是\n# 行动要采取的行动应为 [{tool_names}] 中的一个\n# 行动输入行动的输入\n# 观察行动的结果\n# \n\n# 当您有回复要对人类说或者不需要使用工具时您必须使用以下格式\n# \n# 思考我是否需要使用工具否\n# 最终答案您的回复\n# \n# 开始\n# 之前的对话历史\n#{chat_history}\n# 新的输入: {input}# {agent_scratchpad}## promptPromptTemplate.from_template(template)# 4.定义LLMllmChatOpenAI(modelgpt-4o-mini,temperature0,)# 5. 定义记忆组件(以ConversationBufferMemory为例)memoryConversationBufferMemory(memory_keychat_history,return_messagesTrue)# 6.创建Agent对象agentcreate_react_agent(llm,tools,prompt)# 7.创建AgentExecutor执行器agent_executorAgentExecutor(agentagent,toolstools,verboseTrue,memorymemory)# 8.测试agent_executor.invoke({input:我的名字叫Bob})agent_executor.invoke({input:我的名字叫什么?})举例3远程获取提示词模版• 以通用方式create_xxx_agent的ReAct模式为例FUNCATION_CALL一样• 远程的提示词模版通过https://smith.langchain.com/hub/hwchase17获取❀ 举例https://smith.langchain.com/hub/hwchase17/react-chat这个模板是专为聊天场景设计的ReAct提示模板。这个模板中已经有聊天对话键chat_history、agent_scratchpad# 1.导入相关依赖fromlangchain_core.messagesimportAIMessage,HumanMessagefromlangchainimporthubfromlangchain_community.tools.tavily_searchimportTavilySearchResultsfromlangchain_openaiimportChatOpenAIfromlangchain.agentsimportcreate_react_agent,AgentExecutorfromlangchain.memoryimportConversationBufferMemoryimportos# 2.定义搜索工具# ① 设置TAVILY_API密钥os.environ[TAVILY_API_KEY]tvy-dev-T9zUN2xmIw6XluXnH2IXbYFZf12Yd# 需要替换为你的Tavily API密钥# ② 定义搜索工具searchTavilySearchResults(max_results1)# ③ 设置工具集tools[search]# 3.获取提示词prompthub.pull(hwchase17/react-chat)# 4.定义LLMllmChatOpenAI(modelgpt-4o-mini,temperature0,)# 5. 定义记忆组件(以ConversationBufferMemory为例)memoryConversationBufferMemory(memory_keychat_history,return_messagesTrue)# 6.创建Agent、AgentExecutoragentcreate_react_agent(llm,tools,prompt)agent_executorAgentExecutor(agentagent,toolstools,memorymemory,verboseTrue)# 7.执行agent_executor.invoke({input:北京明天的天气怎么样})agent_executor.invoke({input:上海的呢})总结记得关注么么哒