行业资讯

从LLM到AI Agent:突破大模型五大限制,构建实用智能体架构

发布时间:2026/8/13 1:51:12
从LLM到AI Agent:突破大模型五大限制,构建实用智能体架构 1. 项目概述从“万能”的幻觉到“有限”的现实最近和不少刚入行AI应用开发的朋友聊天发现一个挺有意思的现象大家一上来就想用大语言模型LLM做个“全能管家”恨不得让它写代码、查资料、订机票、分析股票一条龙服务。这种热情我能理解毕竟现在各种宣传都把LLM描绘得近乎无所不能。但真当你撸起袖子把OpenAI或者国内某个大厂的API key拿到手开始写第一个prompt时大概率会遭遇当头一盆冷水。你会发现让LLM帮你总结一篇新闻它做得又快又好但如果你让它“查一下明天北京飞上海的航班选最便宜的那一班然后用我的邮箱注册的账号登录某旅行网站下单”它立马就“傻”了。它可能会给你生成一段非常逼真的、包含航班号、价格和下单按钮的HTML代码或者编造一个根本不存在的航班信息。它不是在骗你它是真的“做不到”。这个“做不到”不是能力问题而是本质问题。LLM本质上是一个基于概率生成文本的模型它没有手去点击网页没有眼睛去“看”实时变动的机票价格也没有记忆去记住你上一句让它“保持预算在1000元以内”的指令。这就是我们今天要深入探讨的核心原生LLM的五个根本性“做不到”。理解这五点是你从“调API的Prompt工程师”迈向“构建智能体AI Agent的架构师”的关键第一步。这五个限制就像五指山框定了原生LLM的能力边界。而AI Agent的诞生正是为了翻越这座山。它不是要取代LLM而是为LLM装上“手脚”、“眼睛”和“大脑皮层”让它从一个才华横溢但“四肢不勤、五谷不分”的学者变成一个能真正在数字世界里完成任务的特工。2. 原生LLM的五个“做不到”智能体的诞生背景在开始动手搭建任何Agent之前我们必须先成为LLM的“产品经理”彻底搞清楚它的能力边界和缺陷。这五个“做不到”是设计任何Agent系统的根本出发点。2.1 做不到实时交互与执行没有“手”的思考者这是最直观的限制。LLM是一个纯文本的“思考黑箱”。你给它一段文本输入它给你一段文本输出。它无法主动打开一个浏览器标签页无法调用一个需要OAuth认证的第三方API更无法操控鼠标点击屏幕上的一个按钮。场景示例你让LLM“帮我将这份会议纪要的要点用红色高亮标出然后保存为PDF发到我的工作群”。LLM可以完美地总结出要点甚至可以生成一段描述“哪里该标红”的文本但它无法操作你的Word或Google Docs。它没有执行器Actuator。技术本质LLM的训练和推理过程完全发生在参数矩阵的乘法与变换中与外部世界的动态环境GUI、网络状态、API响应是隔绝的。它缺乏与环境交互并感知行动结果的反馈循环。对开发者的启示这意味着任何需要“动手操作”的任务都必须由一个外部的工具Tool层来承接。LLM的角色退居为“指挥官”或“规划者”它分析你的指令决定调用哪个工具比如save_as_pdf_tool并生成调用这个工具所需的精确参数如文件路径、高亮位置。工具执行后将结果成功或失败、返回的文件链接以文本形式返回给LLMLLM再据此决定下一步行动。这就是最基础的“思考-行动”循环。2.2 做不到获取实时、私有与精确信息没有“眼睛”的学者LLM的知识截止于其训练数据。对于训练后发生的事件“今天某支股票的价格”、非公开的个人数据“我上周的信用卡账单”或需要精确计算/查询的信息“圆周率第1000位小数”它要么不知道要么会“一本正经地胡说八道”幻觉Hallucination。场景示例你问“帮我对比一下特斯拉和比亚迪最新季度财报的毛利率”。LLM可能会基于它记忆中的历史数据或行业常识进行推测性对比但无法给出精确的、来自权威财经网站的最新数字。技术本质LLM的参数是静态的知识是冻结的。它不具备主动从互联网、数据库或本地文件中检索信息的能力。它的“知识”是训练数据分布的压缩表示并非一个可查询的数据库。对开发者的启示这催生了检索增强生成RAG技术的广泛应用。RAG系统在LLM之外维护一个可更新的知识库可以是向量数据库、传统数据库或文档系统。当用户提问时系统先从这个外部知识库中检索出最相关的片段然后将“问题检索到的上下文”一并交给LLM让LLM基于这些准确的、最新的参考信息来生成答案。这相当于给LLM配了一个随时可查阅的“外部知识助理”。2.3 做不到维持长期、连贯的对话状态没有“记忆”的健忘者标准的LLM API调用是无状态的Stateless。你每次发送请求它都视为一个全新的对话。虽然你可以在prompt里把之前的对话历史都附上即上下文窗口但这有两大问题1) 有长度限制长对话会挤占分析当前问题的“思考空间”2) 效率低下每次都要重复传输大量历史文本浪费token和算力。场景示例在一个长达50轮的用户支持对话中用户在第10轮说了自己的订单号在第30轮要求查询该订单状态。如果没有有效的记忆机制你在第30轮必须要么在prompt中再次询问订单号要么把前29轮对话全部塞进上下文前者体验差后者成本高且可能超出窗口限制。技术本质LLM本身不具备持久化记忆的能力。它的“记忆”完全依赖于输入给它的上下文文本。这就像一个人只能靠不停地翻看之前的聊天记录来回忆而不是真正把信息记在脑子里。对开发者的启示构建Agent必须设计记忆Memory模块。这个模块负责智能地、结构化地存储对话历史、用户偏好、任务状态等关键信息。常见的记忆类型包括短期记忆/缓冲区存放最近几轮对话保证基础连贯性。长期记忆/向量存储将重要的对话片段或提取出的实体如订单号、用户偏好转换成向量存入数据库供后续快速检索。摘要记忆对于超长对话定期由LLM生成对话摘要用摘要替代冗长的原始历史节省上下文空间。 Agent在每一步决策时会先从记忆模块中查询相关信息再结合当前用户输入形成完整的prompt交给LLM。这相当于给LLM配了一个“私人秘书”帮它打理所有记忆事务。2.4 做不到处理复杂、多步骤的规划与分解没有“策略”的执行者对于“帮我订一张机票”这样的简单指令LLM或许能直接调用一个book_flight_tool。但对于“我要组织一个为期三天的团队线下会议包含场地租赁、住宿安排、餐饮预订和活动策划预算10万元”这样的复杂目标原生LLM很难一次性给出一个可执行的、详尽的步骤规划。它容易遗漏细节或产生逻辑上不可行的步骤序列。场景示例LLM可能会直接生成“第一步预订会议室。第二步通知所有人。”而忽略了“确定参会人数和时间”是预订会议室的前提也忽略了需要“收集大家的住宿偏好”才能订酒店。技术本质LLM在单轮生成上表现出色但缺乏对长期任务进行递归性分解、状态跟踪和动态调整的规划Planning能力。它不擅长创建和维持一个随时间演进的任务树或状态机。对开发者的启示高级Agent需要引入规划器Planner组件。这个组件本身可以是一个LLM但它的任务特殊化接收高层目标输出一个结构化的任务列表或流程图如使用Thought, Action, Observation循环或更复杂的框架如Chain of Thought, Tree of Thoughts。规划器还需要能根据任务执行的结果成功、失败、出现新信息动态调整后续计划。这相当于给LLM配了一个“项目经理”负责拆解WBS工作分解结构并跟踪进度。2.5 做不到自我反思与纠错没有“元认知”的答题者当LLM生成一个错误答案或执行一个失败的动作后它通常没有内在机制去意识到“我错了”并主动尝试另一条路径。它依赖于开发者设计的外部流程来检查结果并决定重试。场景示例LLM调用一个查询天气的tool但返回了“服务超时”。原生LLM可能会把这个错误信息直接输出给用户或者陷入困惑。它不会自动想到“这个工具失败了我是不是可以换一个备用的天气API再试一次”技术本质LLM的训练目标是预测下一个token而不是评估自身输出质量或行动有效性的“元认知”Metacognition。它缺乏一个内置的“批判者”或“评审者”模块。对开发者的启示鲁棒的Agent系统需要反思Reflection或验证Validation环节。这可以通过多种方式实现让LLM检查自己的输出在生成最终答案前让同一个LLM或另一个专门的“批判者”LLM以“你是否确信这个答案正确请指出任何潜在问题”的方式对输出进行评审。设定成功标准为每个tool调用定义明确的成功/失败状态。当失败时触发一个“错误处理”子流程这个子流程可能包含重试、更换工具、向用户求助等逻辑。引入外部验证器对于关键操作如转账、发送邮件在执行前将计划发送给用户做最终确认Human-in-the-loop。 这相当于给LLM配了一个“质检员”和“流程顾问”确保行动的质量和安全性。注意这五个“做不到”并非LLM的缺陷而是其设计本质所带来的特性。就像我们不能抱怨螺丝刀不能砍树一样正确的做法是拿起锯子。AI Agent就是为我们提供的这一套完整的“工具箱”和“工作流程”。3. AI Agent的核心架构如何为LLM赋能理解了LLM的局限AI Agent的架构就变得清晰起来。它不是一个魔法黑盒而是一个精心设计的、模块化的系统旨在弥补上述所有不足。一个典型的、功能完整的AI Agent核心架构包含以下层次3.1 感知层信息输入与解析这是Agent与用户和环境的接口。它负责接收多种形式的输入文本、语音、图像、文件并将其转化为LLM能够理解的统一文本格式。同时它也负责将LLM的文本输出转化为用户友好的形式如语音合成、图形化展示。关键组件输入解析器处理用户指令可能包括意图识别、实体抽取等预处理。例如将“我想订后天的机票”解析为{intent: “book_flight”, date: “后天”}。多模态理解模块如果支持图像/语音则需要集成视觉模型VLM或语音识别ASR模型将非文本信息转为描述性文本。实操要点这一层是用户体验的门面。设计时要充分考虑容错性比如用户指令模糊时的澄清追问机制。3.2 记忆层状态与历史的维系这是Agent的“大脑皮层”负责存储和检索一切与当前会话和长期偏好相关的信息。它是实现连贯对话和个性化服务的基础。关键组件与实现记忆类型描述常见实现技术适用场景短期记忆保存最近的对话轮次保证基础上下文。简单的列表或队列在内存中维护。所有对话场景。长期记忆存储重要的、需要长期记住的事实、用户信息或会话摘要。向量数据库如Chroma, Pinecone, Weaviate。将文本片段向量化后存储支持相似性检索。记住用户偏好如“不喜欢吃香菜”、重要业务数据如客户ID。摘要记忆对长对话进行压缩用摘要替代冗长的原始历史。定期调用LLM生成“到目前为止我们讨论了什么”的摘要。超长对话如技术支持会话节省上下文窗口。实操心得记忆的存储和检索策略是设计难点。不是所有信息都需要存入长期记忆。一个常见的策略是让LLM在每轮对话后判断本对话中是否有需要长期记住的“关键信息”若有则将其结构化后存入向量库。检索时将当前用户问题向量化从长期记忆中找出最相关的几条记录作为上下文注入prompt。3.3 规划与推理层任务拆解与决策中枢这是Agent的“前额叶”负责高级认知功能。它接收来自感知层的用户目标结合记忆层的历史信息进行任务分解、路径规划和决策制定。核心模式反应式Reactive针对简单指令直接映射到工具调用。用户指令 - 工具选择 - 执行。适用于流程固定的场景。链式/思维链Chain-of-Thought对于需要多步推理的问题要求LLM“一步一步思考”将中间推理过程输出。这能显著提升复杂问题的回答质量。在Agent中这可以体现为生成一个步骤列表。目标再分解Goal Decomposition对于复杂项目规划器LLM先将大目标拆解为一系列子目标。例如“组织会议”分解为“确定时间人数”、“预订场地”、“安排住宿”等。每个子目标可能进一步分解或直接对应一个工具调用。动态重规划Re-planning监控每个步骤的执行结果。如果失败或环境变化则重新调用规划器调整后续计划。工具选择机制这是规划层的核心输出之一。通常我们会为Agent提供一个工具清单包含每个工具的名称、描述和参数格式。规划器LLM根据当前目标和上下文决定调用哪个工具并生成符合该工具要求的参数。这通常通过函数调用Function Calling能力来实现现代LLM API都支持此功能。3.4 工具执行层连接数字世界的“手脚”这是Agent与外部世界交互的桥梁。每个工具对应一个可执行的功能单元可以是调用一个API、执行一段数据库查询、运行一个本地脚本甚至是操控一个软件机器人RPA。工具设计规范明确的接口每个工具应有清晰的名称、功能描述和参数schema类型、是否必需、描述。例如{ name: get_weather, description: 获取指定城市的当前天气情况, parameters: { type: object, properties: { city: { type: string, description: 城市名称如‘北京’ } }, required: [city] } }原子性与可靠性工具应尽可能原子化只做好一件事。同时要有完善的错误处理返回结构化的结果包括成功状态、数据和错误信息。实操要点工具层是安全性和稳定性的关键。必须对工具调用进行权限控制和输入验证防止LLM生成恶意或危险的调用。例如删除文件或发送邮件的工具需要额外的确认机制。3.5 评估与反思层质量控制与持续改进这是Agent的“元认知”模块负责评估行动结果的质量决定是否重试、调整策略或向人类求助。实现方式规则验证对于简单情况可以用预定义的规则检查结果。例如调用计算器工具后检查结果是否为数字。LLM自我评估将执行结果和原始目标再次交给LLM提问“这个结果是否完美解决了用户的问题如果否问题出在哪里”。外部验证器对于关键业务引入更可靠的验证方式如数据库交叉检查、调用另一个权威API验证、或发送给人做最终审批Human-in-the-loop。实操心得反思层不宜过于复杂否则会大幅增加延迟和成本。通常用于关键步骤或失败后的复盘。一个简单的“最大重试次数”策略能解决大部分临时性失败。4. 从零搭建一个简易AI Agent以“旅行助手”为例理论讲完了我们动手搭建一个最简单的AI Agent让它具备工具调用和记忆能力。我们将构建一个“旅行助手”它能记住用户的偏好并调用工具查询信息。4.1 环境准备与工具定义我们使用Python并利用LangChain框架来简化流程。LangChain提供了构建Agent所需的大量组件。# 安装必要库 pip install langchain langchain-openai chromadb首先定义两个简单的工具get_weather查询天气这里模拟。search_flight查询航班这里模拟。from langchain.tools import tool from datetime import datetime tool def get_weather(city: str) - str: 获取指定城市的天气信息。 # 模拟API调用 weather_data { 北京: 晴15-25°C, 上海: 多云18-28°C, 深圳: 阵雨22-30°C } return f{city}的天气是{weather_data.get(city, 信息暂缺)} tool def search_flight(from_city: str, to_city: str, date: str) - str: 查询指定日期和城市的航班信息。 # 模拟API调用 flights [ f{from_city} - {to_city} 航班A 时间08:00 价格1200元, f{from_city} - {to_city} 航班B 时间14:00 价格980元 ] return f找到{len(flights)}个航班\n \n.join(flights) # 工具列表 tools [get_weather, search_flight]4.2 构建记忆系统与Agent执行器我们将使用ConversationBufferMemory作为短期记忆它能自动保存对话历史。from langchain.memory import ConversationBufferMemory from langchain_openai import ChatOpenAI from langchain.agents import initialize_agent, AgentType # 1. 初始化LLM请替换为你的API Key和Base URL llm ChatOpenAI( modelgpt-3.5-turbo, temperature0, openai_api_keyyour-api-key, openai_api_basehttps://api.openai.com/v1 # 或用国内厂商地址 ) # 2. 初始化记忆 memory ConversationBufferMemory(memory_keychat_history, return_messagesTrue) # 3. 创建Agent agent initialize_agent( tools, llm, agentAgentType.CHAT_CONVERSATIONAL_REACT_DESCRIPTION, # 适合对话的Agent类型 verboseTrue, # 打印详细执行过程便于调试 memorymemory, handle_parsing_errorsTrue # 处理解析错误 )4.3 运行与交互测试现在让我们与这个简易Agent对话观察它如何利用工具和记忆。# 第一轮对话用户表达偏好 response1 agent.run(我来自北京讨厌下雨天。) print(fAgent: {response1}) # 输出可能Agent: 好的我记住你来自北京并且讨厌下雨天了。 # 第二轮对话用户询问旅行建议Agent应利用记忆 response2 agent.run(我下周一想去上海出差有什么建议吗) print(f\nAgent: {response2})在这个交互中会发生以下过程记忆写入第一轮对话后LLM生成的回复和用户输入会被自动存入memory。记忆读取与上下文构建在第二轮agent.run时LangChain会自动从memory中取出历史对话并将其与当前问题一起构建成完整的prompt发送给LLM。这个prompt类似于历史对话 人类我来自北京讨厌下雨天。 AI好的我记住你来自北京并且讨厌下雨天了。 当前问题我下周一想去上海出差有什么建议吗规划与工具调用LLM基于这个包含历史的上下文进行分析。它可能会推理“用户来自北京讨厌下雨天。他要去上海出差我需要先查一下上海的天气如果下雨要提醒他。另外他可能需要航班信息。” 于是它可能会先调用get_weather(上海)工具。执行与回复工具返回上海的天气。LLM结合天气信息比如是“多云”、用户的厌恶讨厌下雨以及当前问题出差建议生成最终回复。它可能会说“上海下周一预计多云18-28°C没有雨适合出行。需要我为您查询一下从北京到上海的航班吗” 如果用户说“好的”那么Agent会接着调用search_flight工具。通过这个简单例子你可以清晰地看到记忆ConversationBufferMemory和工具Tools是如何与LLMChatOpenAI协同工作的。Agent框架LangChain负责管理这些组件的交互流程。5. 常见问题与进阶思考在实战中你会遇到各种各样的问题。下面是一些典型问题及其解决思路。5.1 Agent表现不稳定有时“胡言乱语”或调用错误工具可能原因与排查Prompt设计不佳给Agent的指令System Prompt不够清晰。你需要明确它的角色、能力和约束。例如明确告诉它“你是一个旅行助手只能使用提供的工具如果用户请求超出能力范围请礼貌拒绝。”工具描述模糊工具的名称和描述要极其精确避免歧义。search_flight比find_trip要好得多。LLM温度Temperature过高在需要确定性操作的Agent中应将temperature设置为0或接近0以减少随机性。上下文混乱检查记忆模块是否注入了过多无关历史导致LLM分心。可以尝试使用ConversationSummaryMemory或ConversationBufferWindowMemory只保留最近N轮来优化。解决策略编写高质量的System Prompt这是最重要的步骤。详细定义角色、规则、输出格式。迭代测试与评估构建一个测试用例集涵盖正常流程和边缘情况定期运行评估Agent的稳定性。使用更强大的模型对于复杂任务GPT-4等更高级的模型在遵循指令和工具选择上通常比GPT-3.5更可靠。5.2 处理复杂任务时Agent陷入循环或逻辑混乱可能原因任务过于复杂超出了简单“反应式”Agent的处理能力。它可能在一个子问题上打转或者步骤顺序错乱。进阶方案引入更强大的规划框架。Plan-and-Execute使用一个“规划者”LLM先将大任务分解成线性步骤清单再由一个“执行者”Agent按步骤调用工具。LangChain的PlanAndExecute执行器就是此模式。ReAct (Reason Act) 框架强制LLM以“Thought: ... Action: ... Observation: ...”的格式进行交互。Thought是推理Action是工具调用Observation是工具结果。这能极大提升复杂推理的透明度。我们之前使用的CHAT_CONVERSATIONAL_REACT_DESCRIPTION就是基于ReAct的一种Agent类型。LangGraph / AutoGen对于需要循环、分支、多Agent协作的超级复杂工作流可以考虑使用LangGraph基于状态机或微软的AutoGen多Agent对话来编排。这允许你以图的形式定义任务流程精确控制执行逻辑。5.3 如何为Agent添加长期记忆和个性化我们之前的例子用了缓冲区记忆是短期的。要实现长期记忆比如记住用户一年前说过喜欢靠窗的座位向量数据库长期记忆每当对话中产生需要长期记忆的信息如用户偏好可以用一个LLM调用将其提取成结构化语句例如“用户偏好喜欢靠窗的飞机座位”然后将其文本嵌入成向量存入如Chroma的向量数据库。检索增强当用户开始一次新对话如“帮我订机票”先将用户当前查询“订机票”向量化然后从向量数据库中检索出最相关的几条长期记忆“喜欢靠窗座位”作为额外上下文注入本次对话的prompt中。这样LLM在规划时就能考虑到这个长期偏好。5.4 工具调用安全如何保障这是生产级Agent必须考虑的问题。权限分级将工具分为“安全工具”如查询天气和“危险工具”如发送邮件、删除文件。在System Prompt中明确告知Agent危险工具的使用条件。人工确认Human-in-the-loop对于危险操作设计流程让工具执行前必须暂停并将执行计划发送给用户或管理员进行确认。只有在获得批准后才真正执行。输入验证与净化在工具函数内部对所有输入参数进行严格的类型检查和内容过滤防止注入攻击。沙箱环境对于执行代码或访问敏感系统的工具尽可能在沙箱环境中运行限制其权限。AI Agent的开发是一个系统工程它考验的不仅仅是LLM的调优能力更是对软件架构、用户体验和安全设计的综合把握。从理解LLM的“做不到”开始用模块化的思维为其补全“手、眼、记忆、策略和反思”能力你就能一步步构建出真正有用、可靠的智能体。这个旅程始于对局限的认知成于精心的设计。