ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

从大模型到智能体:实战构建具备规划与工具调用能力的AI应用

从大模型到智能体:实战构建具备规划与工具调用能力的AI应用 在当前的AI技术浪潮中我们经常听到“智能体”和“大模型”这两个词被频繁提及。许多开发者尤其是刚接触这个领域的同学可能会感到困惑它们到底有什么区别为什么现在大家都在谈论“智能体开发”更重要的是在构建一个真正有用的AI应用时我们究竟是在比拼模型的“判断力”还是在激发它的“创造力”本文将从一线开发者的实战视角出发彻底厘清智能体Agent与大模型LLM的核心差异。我们将通过一个完整的项目案例手把手教你如何利用现有的大模型API构建一个具备自主规划、工具调用和持续学习能力的智能体。文章不仅会解释概念更会提供可运行、可复现的代码并深入探讨在工程化实践中如何平衡与提升智能体的“判断力”与“创造力”。无论你是想入门AI应用开发还是希望将现有的大模型调用升级为更智能的系统这篇文章都将为你提供清晰的路径和实用的工具箱。1. 智能体与大模型核心概念辨析与时代背景在深入代码之前我们必须先建立正确的认知框架。混淆智能体和大模型是很多项目走弯路的第一步。1.1 大模型强大的“大脑”与“知识库”大语言模型Large Language Model, LLM如 GPT-4、Claude、文心一言、通义千问等本质上是一个基于海量数据训练而成的概率模型。它的核心能力是文本生成与理解。它是什么你可以把它想象成一个拥有庞杂知识、语言能力极强的“大脑”。你给它一段输入提示词它根据学习到的模式预测并生成最可能的后续文本。它能做什么流畅对话、文本创作、翻译、总结、代码生成、简单推理等。它的局限知识截止性它的知识局限于训练数据无法获取实时信息除非设计特定接口。缺乏“行动”能力它只能“说”不能“做”。它知道如何写一段查询数据库的SQL代码但它不能自己去执行这段代码。幻觉问题可能会生成看似合理但实际错误或虚构的内容。静态性一次对话中它通常不会主动记忆或规划多步骤任务。简单来说大模型是一个被动的、强大的响应生成器。1.2 智能体拥有“大脑”、“手脚”和“记忆”的智能系统智能体Agent是一个更上层的概念。它是一个能够感知环境、进行决策并执行行动以实现目标的系统。在AI语境下智能体通常以大模型作为其“大脑”或“决策核心”。它是什么一个完整的、可自主运行的软件实体。它整合了思考LLM、工具Tools、记忆Memory和规划Planning等多个模块。核心组件规划模块将复杂目标拆解为可执行的子任务序列。这体现了“判断力”——分析现状、确定优先级、制定策略。工具调用模块为LLM装上“手脚”。智能体可以调用搜索引擎、数据库、API、计算器、文件系统等外部工具来获取信息或执行操作。记忆模块包括短期记忆当前会话上下文和长期记忆向量数据库等让智能体拥有持续学习和对活历史的能力。执行与反思模块执行行动后评估结果如果失败则调整策略。这体现了“创造力”的另一种形式——解决新问题的应变能力。它能做什么自动完成涉及多步骤、多工具调用的复杂任务。例如“分析上周销售数据生成报告摘要并邮件发送给经理”。这个任务需要调用数据库工具、数据分析工具、文本生成模型和邮件API。两者的关系大模型是智能体的核心推理引擎但智能体是让大模型真正“活”起来具备行动力和自主性的框架和身体。我们开发的不是另一个大模型而是如何高效、可靠地组织和使用大模型。1.3 判断力与创造力之争智能体时代的工程核心这并非哲学辩论而是实实在在的工程挑战。判断力在智能体中指其规划、决策和评估的准确性与可靠性。对应技术任务拆解Chain-of-Thought、工具选择Tool Calling、结果验证Self-Correction。例如用户说“我热了”智能体需要判断是调低空调温度还是推荐一杯冷饮或是检查用户是否有发热症状这需要结合上下文、用户画像和可用工具做出最佳决策。挑战如何减少幻觉导致的错误决策如何设计评估机制确保每一步都走在正确的路径上创造力在智能体中指其解决前所未见问题、生成新颖有效解决方案的能力。对应技术思维链提示、多智能体协作模拟头脑风暴、基于反馈的迭代优化。例如为一个全新产品起名、设计一个独特的营销方案。挑战如何引导LLM跳出常规模式如何在可控范围内激发“创意”同时避免产出无用或离题的内容工程上的平衡一个优秀的智能体既需要稳健的判断力来保证任务执行的成功率也需要一定的创造力来处理边界情况和开放性问题。我们的开发工作很大程度上就是在设计提示词Prompt、工作流Workflow和反馈机制来塑造和平衡这两种能力。2. 环境准备与核心工具栈我们将使用 Python 作为开发语言这是目前 AI 智能体生态最丰富的语言。我们的目标是构建一个本地可运行的智能体原型。2.1 基础环境与版本说明操作系统Windows 10/11, macOS, 或 Linux (Ubuntu 20.04) 均可。Python版本 3.8。推荐使用 3.9 或 3.10以获得最佳的库兼容性。包管理工具使用pip。强烈建议使用虚拟环境venv或conda来隔离项目依赖。2.2 核心库介绍与安装我们将基于LangChain框架来构建智能体它是一个用于开发由语言模型驱动的应用程序的流行框架提供了智能体、链、工具等高级抽象。打开终端创建并激活虚拟环境后执行以下安装命令# 安装 LangChain 核心库及 OpenAI 集成我们将使用 OpenAI API 作为 LLM 引擎 pip install langchain langchain-openai # 安装用于定义和解析工具调用结构的库 pip install langchain-community # 安装用于环境变量管理的库安全存储API密钥 pip install python-dotenv # 可选但推荐安装用于结构化输出的库使LLM返回更规整的数据 pip install langchain-core重要提示本文示例将使用OpenAI的 GPT 模型作为推理核心你需要一个有效的 OpenAI API Key。你也可以替换为其他兼容 OpenAI API 的模型服务如 Azure OpenAI, 国内的一些大模型平台等只需调整初始化参数。2.3 项目结构初始化创建一个新的项目目录结构如下ai_agent_project/ ├── .env # 存储环境变量如API密钥 ├── main.py # 主程序入口 ├── tools/ # 自定义工具模块 │ └── custom_tools.py ├── agents/ # 智能体定义模块 │ └── research_agent.py └── utils/ # 工具函数 └── __init__.py首先在项目根目录创建.env文件并填入你的 OpenAI API Key。切记不要将此文件提交到版本控制系统如 Git。# .env OPENAI_API_KEYsk-your-actual-openai-api-key-here3. 核心模块拆解从工具到智能体智能体的构建是模块化的。我们自底向上先创建“手脚”工具再组装“大脑”和“记忆”。3.1 打造智能体的“手脚”自定义工具工具是智能体与外界交互的桥梁。LangChain 提供了简洁的方式来定义工具。假设我们要创建一个“研究助手”智能体它需要能搜索网络和进行数学计算。我们先实现一个简单的计算器工具和一个模拟的网络搜索工具。# tools/custom_tools.py import math from langchain.tools import tool from typing import Optional tool def calculate(expression: str) - str: 执行一个数学表达式计算。支持加减乘除(, -, *, /)、乘方(**)、括号和常见数学函数如sqrt, sin, cos。 请确保表达式是数学上有效的。 Args: expression: 一个字符串格式的数学表达式例如 3 5 * 2, sqrt(16), sin(3.14/2)。 Returns: 计算结果的字符串表示如果出错则返回错误信息。 # 安全警告在生产环境中直接eval用户输入是极度危险的 # 这里仅为演示实际应用必须使用安全的表达式解析库如 ast.literal_eval 配合限制或 numexpr。 try: # 为数学表达式添加安全的数学函数命名空间 allowed_names {k: v for k, v in math.__dict__.items() if not k.startswith(_)} allowed_names[abs] abs # 使用 eval 并限制可用的命名空间这是一个简化的示例生产环境需加固。 result eval(expression, {__builtins__: {}}, allowed_names) return str(result) except Exception as e: return f计算错误{e}。请检查表达式格式。 tool def search_web(query: str, max_results: int 3) - str: 根据查询词模拟网络搜索。在实际应用中这里应替换为真实的搜索引擎API如SerperAPI、Google Custom Search。 Args: query: 搜索关键词。 max_results: 返回的最大结果数量。 Returns: 模拟的搜索结果摘要字符串。 # 这是一个模拟函数。真实集成请参考以下思路 # 1. 使用 SerperAPI (https://serper.dev) 或 Tavily API。 # 2. 使用 requests 库调用搜索引擎API。 # 3. 解析返回的JSON提取标题、链接和摘要。 # 模拟返回 mock_results [ f1. 关于 {query} 的百科介绍这是一个模拟结果描述了{query}的基本概念。, f2. {query} 的最新发展2023-2024年{query}在AI领域取得了显著进展。, f3. 学习 {query} 的教程资源推荐官方文档和几个实践课程。 ] return \n\n.join(mock_results[:max_results]) # 将工具收集到列表中方便后续提供给智能体 CUSTOM_TOOLS [calculate, search_web]关键点解释tool装饰器LangChain 用于声明一个函数为工具的便捷方式。它会自动根据函数签名和文档字符串生成工具的描述这对于LLM理解工具功能至关重要。文档字符串必须清晰描述工具的功能、参数和返回值。LLM 依靠这些描述来决定何时以及如何使用该工具。安全性calculate工具中的eval用法在演示中可行但在真实、对外的服务中必须替换为安全的表达式求值库否则会造成严重的代码注入漏洞。3.2 装配“大脑”初始化大模型与智能体接下来我们创建智能体。我们将使用 LangChain 提供的create_react_agent助手函数它实现了 ReAct 框架Reasoning Acting让智能体能够进行“思考-行动-观察”的循环。# agents/research_agent.py import os from langchain_openai import ChatOpenAI from langchain.agents import create_react_agent, AgentExecutor from langchain.prompts import PromptTemplate from tools.custom_tools import CUSTOM_TOOLS from dotenv import load_dotenv # 加载 .env 文件中的环境变量 load_dotenv() def get_research_agent(): 创建并返回一个配置好的研究助手智能体执行器。 # 1. 初始化大模型 # 使用 GPT-3.5-turbo 作为推理引擎性价比高。可根据需要换为 gpt-4。 llm ChatOpenAI( modelgpt-3.5-turbo, temperature0.1, # 较低的温度使输出更确定、更可靠适合需要判断力的任务。 openai_api_keyos.getenv(OPENAI_API_KEY) ) # 2. 定义智能体的提示词模板 # ReAct 框架有特定的提示词结构LangChain 提供了默认模板我们也可以微调。 prompt PromptTemplate.from_template( 你是一个强大的研究助手。你的任务是利用所有可用工具帮助用户解答问题或完成研究任务。 你可以使用的工具 {tools} 使用工具时请严格按照以下格式Thought: 我需要思考当前问题并决定下一步做什么 Action: 要使用的工具名称必须是[{tool_names}]中的一个 Action Input: 工具的输入参数当你有工具返回的观察结果时必须遵循以下格式Observation: 工具返回的结果当你最终得出问题的答案时必须使用以下格式Thought: 我现在知道了最终答案 Final Answer: 你的最终答案开始记住在给出最终答案前如果需要请多次使用工具。 历史对话 {chat_history} 当前问题{input} {agent_scratchpad} ) # 3. 创建智能体 # create_react_agent 将模型、提示词和工具绑定在一起形成一个智能体对象。 agent create_react_agent( llmllm, toolsCUSTOM_TOOLS, promptprompt ) # 4. 创建智能体执行器 # AgentExecutor 是运行智能体的“发动机”它处理与模型的交互、工具调用和解析循环。 agent_executor AgentExecutor( agentagent, toolsCUSTOM_TOOLS, verboseTrue, # 设置为 True 可以在控制台看到详细的思考过程调试时非常有用。 handle_parsing_errorsTrue, # 优雅地处理模型输出解析错误 max_iterations5, # 限制最大迭代次数防止智能体陷入死循环 early_stopping_methodgenerate # 当模型连续两次生成最终答案时停止 ) return agent_executor关键点解释temperature设置为较低的 0.1这会让模型的输出更加集中和确定减少随机性从而提升任务执行的判断力和可靠性。如果需要更多创造力如头脑风暴、写作可以适当调高。提示词模板这是塑造智能体行为的关键。我们定义了清晰的 ReAct 格式强制模型进行结构化思考。{agent_scratchpad}是一个特殊占位符LangChain 会自动将之前的“思考-行动-观察”记录填充进去。AgentExecutor它管理着智能体运行的整个生命周期包括调用模型、解析输出、执行工具、处理错误并控制循环通过max_iterations防止无限循环。3.3 赋予“记忆”为智能体添加会话上下文一个没有记忆的智能体每次对话都是全新的开始。为了实现连贯的多轮对话我们需要引入记忆机制。# agents/research_agent.py (续) from langchain.memory import ConversationBufferMemory def get_research_agent_with_memory(): 创建并返回一个带有会话记忆的研究助手智能体执行器。 llm ChatOpenAI(modelgpt-3.5-turbo, temperature0.1, openai_api_keyos.getenv(OPENAI_API_KEY)) # 初始化一个对话缓冲记忆 memory ConversationBufferMemory(memory_keychat_history, return_messagesTrue) prompt PromptTemplate.from_template( # ... 同上一个提示词模板但包含了 {chat_history} 占位符 ... ) agent create_react_agent(llmllm, toolsCUSTOM_TOOLS, promptprompt) # 在创建执行器时传入 memory agent_executor AgentExecutor( agentagent, toolsCUSTOM_TOOLS, verboseTrue, handle_parsing_errorsTrue, max_iterations5, memorymemory # 关键添加记忆组件 ) return agent_executor现在智能体可以记住同一会话中之前的对话内容从而进行更连贯的交互。例如用户先问“什么是LangChain”再问“它和LlamaIndex有什么区别”智能体会知道“它”指代的是LangChain。4. 完整实战构建并运行你的第一个智能体让我们将以上模块组合起来创建一个完整的可运行示例。# main.py import sys import os sys.path.append(os.path.dirname(os.path.abspath(__file__))) from agents.research_agent import get_research_agent_with_memory def main(): print( 研究助手智能体已启动 ) print(输入 quit 或 exit 结束对话。\n) # 获取带有记忆的智能体 agent get_research_agent_with_memory() while True: try: user_input input(\n您: ) if user_input.lower() in [quit, exit]: print(智能体: 再见) break if not user_input.strip(): continue # 调用智能体 response agent.invoke({input: user_input}) print(f\n智能体: {response[output]}) except KeyboardInterrupt: print(\n\n程序被中断。) break except Exception as e: print(f\n发生错误: {e}) if __name__ __main__: main()运行你的智能体确保你的.env文件已正确配置 API Key。在终端中进入项目根目录运行python main.py交互示例您: 请计算圆的面积如果半径是5。 智能体思考过程 Thought: 用户想计算半径为5的圆的面积。我需要使用数学公式 面积 π * r²。我有一个计算工具。 Action: calculate Action Input: math.pi * 5 ** 2 Observation: 78.53981633974483 Thought: 我得到了计算结果可以给出最终答案。 Final Answer: 半径为5的圆的面积大约是78.54平方单位。 智能体: 半径为5的圆的面积大约是78.54平方单位。您: 帮我搜索一下LangChain的最新信息然后告诉我它主要用来做什么。 智能体思考过程 Thought: 用户需要两个信息1. LangChain的最新信息。2. LangChain的主要用途。我应该先使用搜索工具。 Action: search_web Action Input: LangChain latest updates 2024 Observation: 1. 关于 LangChain latest updates 2024 的百科介绍这是一个模拟结果... 2. LangChain latest updates 2024 的最新发展2023-2024年LangChain在AI领域取得了显著进展... 3. 学习 LangChain latest updates 2024 的教程资源... Thought: 我得到了一些关于LangChain的最新信息。现在我需要总结它的主要用途。我可以基于我的知识回答但为了更准确也许可以再搜索一下它的用途。 Action: search_web Action Input: LangChain primary use cases Observation: 1. 关于 LangChain primary use cases 的百科介绍这是一个模拟结果描述了LangChain用于构建LLM应用... 2. LangChain primary use cases 的最新发展... Thought: 我现在有足够的信息来回答用户的问题。 Final Answer: 根据最新信息LangChain 是一个用于开发由语言模型驱动的应用程序的框架。它的主要用途包括1. 构建智能体Agents使LLM能够调用工具和进行推理2. 创建处理复杂任务的工作链Chains3. 管理LLM的提示词Prompts4. 集成多种数据源如索引和检索系统5. 提供记忆Memory能力以实现多轮对话。它简化了将大语言模型连接到外部数据和动作的过程。 智能体: 根据最新信息LangChain 是一个用于开发由语言模型驱动的应用程序的框架...通过这个例子你可以看到智能体如何自主地规划任务先搜索最新信息再搜索用途调用合适的工具并综合信息给出最终答案。这体现了判断力决定搜索什么、如何组织答案和一定程度的创造力综合信息并生成连贯的总结。5. 进阶提升判断力与创造力的工程实践基础智能体已经能工作但要使其强大可靠还需要进一步的工程优化。5.1 提升判断力结构化输出与验证LLM 的自由文本输出容易导致格式错误。使用Pydantic和 LangChain 的StructuredOutputParser可以强制模型返回结构化的 JSON 数据极大提升工具调用和结果解析的可靠性。# 示例定义一个结构化工具调用的期望格式 from langchain.output_parsers import PydanticOutputParser from pydantic import BaseModel, Field from typing import List class ToolCallSchema(BaseModel): 定义工具调用的结构 thought: str Field(description智能体当前的思考过程) action: str Field(description要调用的工具名称, pattern^(calculate|search_web)$) # 限制工具名 action_input: str Field(description工具的输入参数) # 在更复杂的智能体设定中可以将此解析器集成到提示词中引导模型输出标准JSON。5.2 提升判断力让智能体学会“反思”ReAct 框架本身包含了“观察”步骤。我们可以强化这一点在工具返回结果后让智能体主动评估结果是否解决了问题或者是否需要尝试其他方法。这可以通过在提示词中加入反思指令来实现。# 在提示词模板的思考部分加入反思引导 reflection_prompt_section 在得到观察结果后请反思 1. 这个结果是否直接回答了问题的一部分 2. 结果是否可信或有疑问 3. 我是否需要更多信息或使用其他工具 然后再决定下一步是继续行动还是给出最终答案。 # 将这部分内容加入到主提示词的 {agent_scratchpad} 之前或之后。5.3 激发创造力多智能体协作与辩论对于开放性问题单一智能体的思路可能受限。可以模拟“头脑风暴”创建多个具有不同角色如“创意者”、“批评者”、“执行者”的智能体让它们围绕一个问题进行讨论或辩论最后由一个“协调者”智能体汇总结论。# 概念性代码展示多智能体协作思路 from langchain.schema import SystemMessage, HumanMessage class DebateAgent: def __init__(self, role, llm): self.role role # 例如 创意发散者, 逻辑批判者 self.llm llm self.system_prompt f你是一个{role}请从你的角色出发思考问题。 def generate_opinion(self, topic): messages [ SystemMessage(contentself.system_prompt), HumanMessage(contentf请就以下话题发表你的看法{topic}) ] response self.llm.invoke(messages) return response.content # 主流程 topic 如何设计一个吸引年轻人的环保公益项目 creative_agent DebateAgent(创意发散者追求新颖有趣, llm) critical_agent DebateAgent(逻辑批判者关注可行性与成本, llm) creative_idea creative_agent.generate_opinion(topic) critical_feedback critical_agent.generate_opinion(f请评价这个想法{creative_idea}) # 最后可以再用一个智能体来综合双方观点5.4 平衡判断与创造温度参数与提示词工程判断力任务数据查询、代码执行、逻辑推理使用低温度如 0.1-0.3和高度结构化的提示词明确步骤和格式要求。创造力任务创意写作、方案设计、头脑风暴可以尝试稍高的温度如 0.7-0.9和更开放、鼓励性的提示词如“请列出10个天马行空的想法”。在实践中一个复杂的智能体可能需要动态调整这些参数或者为不同的子任务调用不同配置的模型。6. 常见问题与排查思路在开发智能体时你可能会遇到以下典型问题问题现象可能原因排查与解决思路智能体陷入循环不断调用同一个工具。1. 工具返回的结果未能满足停止条件。2. 提示词中停止指令不清晰。3.max_iterations设置过高。1. 检查工具功能是否正常返回格式是否易于理解。2. 强化提示词中关于“何时给出最终答案”的规则。3. 降低max_iterations如设为3-5并设置early_stopping_methodgenerate。模型无法正确选择工具或工具输入格式错误。1. 工具的描述文档字符串不清晰。2. 工具名称过于相似。3. 模型温度过高输出不稳定。1. 为每个工具编写精确、无歧义的文档字符串明确输入参数类型和示例。2. 给工具起独特、描述性的名字。3. 尝试降低温度参数。使用StructuredOutputParser强制格式化输出。智能体忽略了之前的对话历史记忆失效。1. 记忆组件未正确连接到执行器。2. 提示词模板中未包含记忆的占位符如{chat_history}。3. 记忆的 Key 不匹配。1. 确认AgentExecutor初始化时传入了memory参数。2. 检查提示词模板确保包含了用于插入历史消息的变量。3. 确保ConversationBufferMemory(memory_keychat_history)中的memory_key与提示词中的占位符名称一致。API 调用超时或报错。1. 网络问题。2. API Key 无效或余额不足。3. 请求速率超限。1. 检查网络连接。2. 验证.env文件中的 API Key并在供应商后台检查用量。3. 为代码添加重试机制和指数退避策略或降低请求频率。智能体在处理复杂问题时表现不佳。1. 底层大模型能力不足。2. 任务拆解规划逻辑不够强。1. 升级到更强大的模型如 GPT-4。2. 考虑使用更高级的智能体框架如 LangGraph它可以让你以图的形式精确控制工作流和任务拆解。7. 最佳实践与工程化建议要将智能体从原型推向生产需要考虑以下方面工具设计的鲁棒性输入验证在所有工具函数的入口处严格检查输入参数的类型、范围和格式。错误处理工具内部必须有完善的 try-catch返回清晰的错误信息而不是抛出异常导致智能体崩溃。超时与重试对于调用外部 API 的工具必须设置超时和重试逻辑。提示词工程与管理模块化将系统指令、工具描述、格式规范、示例等拆分成可维护的模块。版本控制像管理代码一样对提示词进行版本控制如 Git记录每次变更的效果。A/B测试对重要的提示词进行 A/B 测试量化不同提示词对任务成功率的影响。可观测性与评估全面日志记录记录每一次用户输入、模型思考、工具调用、工具输出和最终回答。这对于调试和优化至关重要。定义评估指标根据应用场景定义成功指标如任务完成率、工具调用准确率、用户满意度等。构建测试集创建涵盖常见和边缘用例的测试问题集定期运行以监控智能体性能是否退化。安全与合规权限控制为智能体配备的工具应遵循最小权限原则。例如一个回答内部知识库的智能体不应拥有删除数据库的权限。内容过滤在智能体的输入和输出端部署内容安全过滤器防止生成或响应有害、偏见或不适当的内容。用户数据隔离确保不同用户的记忆对话历史严格隔离防止信息泄露。架构演进从单智能体到多智能体复杂业务可以拆分成由多个 specialized agent 协作完成的流水线。引入规划器对于超复杂任务可以引入一个专门的“规划器”智能体先将宏观目标分解成子任务再分发给其他“执行器”智能体。与现有系统集成智能体应通过清晰的 API 与你的业务后端、数据库、中间件集成而不是一个信息孤岛。智能体开发是一个快速迭代的过程核心在于深刻理解“判断力”与“创造力”不过是不同场景下对模型推理和生成能力的不同约束与引导。通过精心的工具设计、提示词工程和系统架构我们能够将大模型的原始潜力塑造成可靠、有用且智能的应用程序。
返回列表