ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

从零构建AI智能体:Agent开发核心范式与工程实践指南

从零构建AI智能体:Agent开发核心范式与工程实践指南 如果你最近在B站、GitHub或者技术社区里频繁看到“Agent”这个词但感觉它既像“智能体”又像“自动化脚本”既像“大模型应用”又像“复杂系统”那么你并不孤单。很多开发者包括一些经验丰富的工程师对Agent的理解都停留在“一个能调用工具的AI”这个模糊层面。这导致了一个普遍现象看了很多教程依然不知道如何从零开始构建一个能在实际项目中稳定运行的Agent。这篇文章要解决的正是这个核心痛点。它不是一个简单的概念科普也不是某个特定框架如LangChain、AutoGen的说明书。本文的核心判断是Agent开发的真正门槛不在于调用某个API而在于建立一套“任务规划-工具执行-状态管理-安全控制”的工程化思维。盲目追新框架不如先吃透这套基础范式。对于零基础或希望系统提升的开发者来说一周时间完全足够你建立起对Agent开发的清晰认知和实践能力。但这需要一条正确的学习路径从核心概念拆解到本地环境搭建再到亲手实现一个具备规划、执行、反思能力的完整Agent最后探讨工程化与安全。本文将遵循这条路径带你超越“只会调包”的阶段真正理解如何设计、实现并优化一个属于自己的智能体。1. Agent究竟是什么从“调用工具”到“自主智能体”的认知升级在深入代码之前我们必须统一认知。如果你认为Agent就是“大模型函数调用”那你的认知需要一次升级。1.1 通俗理解Agent是一个“数字员工”想象你要招聘一个数据分析实习生。你给他的指令Prompt是“分析一下我们上个月的销售数据写一份报告重点指出问题并提出建议。” 一个优秀的实习生会怎么做理解任务拆解你的指令明确需要“获取数据”、“分析趋势”、“定位问题”、“撰写报告”。规划步骤他可能会先去找数据库管理员要权限工具1连接数据库然后用Excel或Python做分析工具2数据分析工具最后用Word写报告工具3文档编辑器。执行与调整如果发现某个地区数据缺失他会回来问你或者尝试从其他渠道获取。他会不断检查自己的工作是否偏离了“写一份有价值的报告”这个核心目标。交付结果最终给你一份结构清晰、有洞察的报告。一个真正的Agent就是在数字世界里扮演这个“实习生”的角色。它不仅仅是根据你的指令调用一个工具而是能够自主进行任务分解Planning、选择合适工具Tool Use、在复杂环境中保持目标Memory State并从结果中学习Learning/Reflection。1.2 技术定义感知-规划-执行-学习循环在学术和工程领域Agent通常被定义为具备以下特性的系统自治性Autonomy在无人干预下运行。反应性Reactivity感知环境并做出及时响应。主动性Pro-activeness主动采取行动以实现目标。社会能力Social Ability与其他Agent或人类交互。其核心运作遵循一个循环如下图所示我们用文字描述这个逻辑[感知 Perception] - [规划 Planning] - [行动 Action] - [评估 Reflection] - (循环)感知接收用户指令、环境状态、工具执行结果等输入。规划将高层目标分解为可执行的子任务序列。这是Agent“思考”的关键。行动根据规划调用具体的工具API、函数、模型来执行任务。评估/反思检查行动结果是否有效是否偏离目标并据此调整后续规划。1.3 Agent vs. 传统程序 vs. 简单提示工程为了更清晰我们通过一个表格来对比特性传统程序简单提示工程Prompt Engineering智能体Agent决策逻辑开发者预先编写的确定性的if-else或规则。依赖大模型单次响应的概率性输出。大模型驱动下的动态规划与决策循环。灵活性低。场景变化需修改代码。中。通过优化提示词适应新任务但复杂任务乏力。高。能根据环境和中间结果动态调整策略。处理复杂度适合流程固定、边界清晰的任务。适合单轮、定义明确的问答或创作。适合多步骤、有状态、需外部工具交互的开放任务。开发核心算法与业务逻辑编码。提示词设计与调试。系统架构设计、工具抽象、状态管理与安全管控。关键洞察开发Agent你从“程序员”变成了“系统架构师产品经理”。你需要设计智能体的“大脑”规划逻辑、“手脚”工具集和“记事本”记忆模块并确保它们协同工作。2. 为什么现在必须学习Agent开发除了“这是热点”之外有三个更本质的原因推动着Agent成为开发者的一项核心技能。第一技术范式的转变从“功能实现”到“目标达成”。过去的软件开发是“输入-处理-输出”的管道模式。而Agent开发是“给定目标-自主寻路-达成结果”的模式。这要求开发者的思维从“如何实现函数”转向“如何定义目标、提供资源并评估结果”。这种思维是构建下一代AI原生应用的基础。第二解决大模型“最后一公里”问题。大模型本身知识渊博但“手无寸铁”。它不知道今天的天气不能操作你的数据库不能发送邮件。Agent通过工具调用Tool Calling赋予大模型“动手能力”使其能力得以在真实世界中落地。不会开发Agent你就无法释放大模型的全部潜力。第三个人效率与价值的放大器。一个设计良好的个人Agent可以成为你的“超级副驾”。它可以帮你自动整理会议纪要、追踪项目进度、筛选每日信息、甚至初步调试代码。掌握Agent开发意味着你能将重复、琐碎的知识工作流程自动化从而聚焦于更高价值的创造和决策。3. 环境准备构建你的本地Agent实验室理论之后即刻动手。我们避开复杂的云服务和昂贵的API在本地搭建一个轻量但功能完整的开发环境。这是你“一周学完”并能持续实验的基础。3.1 核心工具选型Ollama LiteLLM 本地框架我们的技术栈遵循“本地优先、低成本、高可控”原则大模型运行时Ollama。它是在本地运行、管理开源大模型如Llama 3, Mistral, Gemma最简单的方式无需GPU也能用CPU运行较小参数模型。模型API统一层LiteLLM。它将不同模型OpenAI格式、Anthropic、Cohere及Ollama本地模型的API统一成OpenAI格式让我们的代码无需关心后端模型的具体差异极大提升开发灵活性。Agent开发框架示例LangChain。虽然我们强调理解范式重于框架但LangChain提供了丰富的模块化组件非常适合学习和快速原型开发。本文将以LangChain为例但其概念通用。3.2 一步步搭建环境步骤1安装Ollama访问 Ollama官网 下载对应操作系统的安装包。安装完成后打开终端验证ollama --version拉取一个适合本地运行的轻量模型例如Llama 3.2:1B10亿参数对硬件要求极低ollama pull llama3.2:1b运行模型测试是否正常ollama run llama3.2:1b在出现的提示符后输入Hello看到模型回复即表示成功。按CtrlD退出。步骤2安装Python及必要库确保你已安装Python 3.8。然后创建虚拟环境并安装核心包# 创建并进入虚拟环境可选但推荐 python -m venv agent-env source agent-env/bin/activate # Windows: agent-env\Scripts\activate # 安装核心库 pip install langchain langchain-community litellm # 安装用于构建Web界面的库可选用于可视化 pip install streamlit # 安装用于Agent工具的工具库示例如网页抓取、数学计算 pip install duckduckgo-search sympy步骤3配置LiteLLM连接本地OllamaLiteLLM的妙处在于它让你用OpenAI的客户端代码来调用本地模型。创建一个Python脚本test_llm.py来测试连通性# test_llm.py import litellm from litellm import completion # 告诉LiteLLM使用本地的Ollama服务模型名对应你pull的模型 response completion( modelollama/llama3.2:1b, # 格式ollama/模型名 messages[{role: user, content: 请用中文回答什么是人工智能}], api_basehttp://localhost:11434, # Ollama默认服务地址 ) print(response.choices[0].message.content)运行这个脚本python test_llm.py如果看到一段关于AI的中文解释恭喜你本地大模型服务已就绪这比直接调用云端API慢但零成本、完全私有是学习和原型设计的绝佳选择。4. 核心实战从零构建一个“研究助手”Agent现在我们运用前面所学的概念构建一个能解决实际问题的Agent“研究助手”。它的目标是根据用户提出的一个复杂话题例如“量子计算对密码学的影响”自动进行网络搜索、收集信息、总结并生成一份简易报告。4.1 设计Agent的“心智”任务规划与工具集首先明确我们的Agent需要什么能力规划能力理解“研究一个话题”需要哪些步骤搜索、筛选、总结、报告。工具能力SearchTool: 执行网络搜索获取最新信息。SummarizeTool: 对长文本进行摘要。ReportWriterTool: 将摘要整合成结构化的报告。记忆能力记住搜索到的关键信息在生成报告时使用。在LangChain中我们可以使用其强大的AgentExecutor和create_react_agent来组装这些部件。ReActReason Act是一种经典的Agent范式让模型在“思考”和“行动”间交替。4.2 第一步构建工具Tools工具是Agent的手脚。我们创建三个工具# tools.py from langchain.tools import Tool from duckduckgo_search import DDGS from langchain_core.prompts import ChatPromptTemplate from langchain_community.llms import OllamaLLM # 使用LangChain的Ollama集成 # 初始化一个本地LLM供工具内部使用如总结 llm OllamaLLM(modelllama3.2:1b, base_urlhttp://localhost:11434) # 工具1网络搜索工具 def search_online(query: str) - str: 使用DuckDuckGo搜索网络信息。 try: with DDGS() as ddgs: results list(ddgs.text(query, max_results3)) if not results: return 未找到相关信息。 # 将结果拼接成字符串返回 return \n\n.join([f来源{r[title]}\n内容{r[body]} for r in results]) except Exception as e: return f搜索过程中出现错误{str(e)} search_tool Tool( nameWebSearch, funcsearch_online, description当需要获取关于某个主题的最新、事实性信息时使用此工具。输入应为一个明确的搜索查询词。 ) # 工具2文本总结工具 def summarize_text(long_text: str) - str: 对长文本进行总结。 prompt ChatPromptTemplate.from_messages([ (system, 你是一个专业的文本总结助手。请将用户提供的文本浓缩为一段核心摘要保留关键事实和观点。), (user, {text}) ]) chain prompt | llm # 如果文本过长可先截断这里做简单处理 if len(long_text) 3000: long_text long_text[:3000] ...[文本过长已截断] result chain.invoke({text: long_text}) return result summarize_tool Tool( nameTextSummarizer, funcsummarize_text, description当面对过长文本需要提取核心内容时使用此工具。输入为需要总结的文本。 ) # 工具3报告生成工具示例实际可更复杂 def write_report(topic: str, key_points: str) - str: 根据主题和关键点生成报告。 prompt ChatPromptTemplate.from_messages([ (system, 你是一个分析报告撰写员。请根据提供的主题和关键信息点生成一份结构清晰、包含引言、主体分析和结论的简短报告。), (user, 主题{topic}\n\n收集到的关键信息{key_points}) ]) chain prompt | llm result chain.invoke({topic: topic, key_points: key_points}) return result report_tool Tool( nameReportWriter, funcwrite_report, description当需要将零散信息整合成一份正式报告时使用此工具。输入参数为报告主题和收集到的关键信息字符串。 ) # 工具列表 tools [search_tool, summarize_tool, report_tool]4.3 第二步构建Agent执行器我们将工具、模型和提示词模板组合起来创建Agent。# agent_builder.py from langchain import hub from langchain.agents import create_react_agent, AgentExecutor from langchain_community.llms import OllamaLLM from tools import tools # 导入上面定义的工具 # 1. 加载一个预定义的ReAct提示词模板LangChain Hub提供 prompt hub.pull(hwchase17/react) # 2. 初始化LLM使用Ollama本地模型 llm OllamaLLM(modelllama3.2:1b, base_urlhttp://localhost:11434, temperature0) # 3. 创建ReAct Agent agent create_react_agent(llm, tools, prompt) # 4. 创建执行器它负责运行Agent的循环 agent_executor AgentExecutor(agentagent, toolstools, verboseTrue, handle_parsing_errorsTrue) # 5. 测试运行 if __name__ __main__: research_topic 量子计算对现代密码学的主要挑战 print(f开始研究{research_topic}) result agent_executor.invoke({ input: f请对以下主题进行调研并生成一份简要报告{research_topic}。请使用你拥有的工具。 }) print(\n *50) print(最终报告) print(result[output])4.4 运行与观察在终端运行python agent_builder.py。由于设置了verboseTrue你将看到Agent完整的思考过程开始研究量子计算对现代密码学的主要挑战 进入新的Agent执行链... 思考用户要求我调研“量子计算对现代密码学的主要挑战”并生成报告。我需要先搜索最新信息。 行动WebSearch 行动输入量子计算 密码学 挑战 2024 观察[搜索返回的结果文本...] 思考我获得了一些信息。这些内容比较零散我需要先总结一下核心点。 行动TextSummarizer 行动输入[截取的搜索文本] 观察[总结后的核心要点...] 思考现在我已经有了关键信息可以生成报告了。 行动ReportWriter 行动输入主题量子计算对现代密码学的主要挑战收集到的关键信息[总结后的要点] 观察[生成的报告文本...] 思考我已经完成了调研并生成了报告可以结束了。 链结束。 最终报告 【报告标题量子计算对现代密码学的挑战与展望】 引言随着量子计算技术...后续报告内容这个过程中发生了什么Agent接收任务理解需要“调研”。它规划出第一步使用WebSearch工具获取信息。执行搜索获得观察结果一堆文本。根据观察它规划下一步信息太乱需要用TextSummarizer工具提炼。执行总结获得关键要点。再次规划信息已提炼可以使用ReportWriter生成最终交付物。执行报告生成完成任务。你亲眼见证了感知-规划-执行的循环。这就是Agent的核心。5. 进阶为Agent注入“记忆”与“反思”基础的Agent是“金鱼脑”每次对话都从头开始。一个强大的Agent需要记忆Memory来保存对话历史和上下文以及反思Reflection能力来评估自己的行动并改进。5.1 添加对话记忆LangChain提供了多种记忆组件。我们使用简单的ConversationBufferMemory。# agent_with_memory.py from langchain.memory import ConversationBufferMemory from langchain.agents import AgentExecutor, create_react_agent from langchain import hub from tools import tools from langchain_community.llms import OllamaLLM # 1. 创建记忆体 memory ConversationBufferMemory(memory_keychat_history, return_messagesTrue) # 2. 修改提示词以包含记忆 prompt hub.pull(hwchase17/react) # 注意标准的react提示词不一定直接支持chat_history我们需要自定义或使用支持记忆的Agent类型。 # 更简单的方式是使用ConversationalAgent这里为了概念清晰我们展示记忆的接入思路。 # 3. 使用支持记忆的Agent初始化方式示例使用OpenAI Functions Agent风格 from langchain.agents import initialize_agent from langchain.agents.agent_types import AgentType llm OllamaLLM(modelllama3.2:1b, base_urlhttp://localhost:11434) # 创建一个支持对话的Agent conversational_agent initialize_agent( tools, llm, agentAgentType.CONVERSATIONAL_REACT_DESCRIPTION, # 专为对话设计的Agent类型 verboseTrue, memorymemory, handle_parsing_errorsTrue ) # 4. 进行多轮对话 print(第一轮) result1 conversational_agent.run(量子计算会威胁当前的RSA加密算法吗) print(fAgent: {result1}) print(\n---记忆内容---) print(memory.buffer) print(---------------\n) print(第二轮基于记忆) result2 conversational_agent.run(那么有哪些抗量子密码算法正在被研究) print(fAgent: {result2}) # 在第二轮中Agent会记得之前关于RSA和量子计算威胁的讨论回答会更连贯。5.2 实现简易反思Reflection反思让Agent能评估自己的行动质量。一个简单实现是在Agent完成一系列动作后让另一个LLM或同一个对其过程和结果进行评审并提出改进建议并将建议存入记忆供下次参考。# reflection.py def reflective_agent_loop(initial_task, max_steps5): 一个带有简易反思循环的Agent示例框架。 llm OllamaLLM(modelllama3.2:1b, base_urlhttp://localhost:11434) memory ConversationBufferMemory() # ... 初始化agent_executor (类似之前但包含memory) ... steps [] for step in range(max_steps): # Agent执行一步 result agent_executor.invoke({input: initial_task}) steps.append(result) # 反思让LLM评价刚才的行动是否有效 reflection_prompt f 你刚完成了一个Agent任务的一步。以下是这一步的输入和输出 输入{initial_task} 输出{result[output]} 历史步骤{steps[:-1] if len(steps)1 else 无} 请分析当前输出是否充分解决了任务如果没有主要缺少什么或哪里可以改进请用一句话给出建议。 reflection llm.invoke(reflection_prompt) print(f[反思 Step {step1}]: {reflection}) # 如果反思认为可以结束则跳出循环 if 充分 in reflection or 可以结束 in reflection.lower(): print(反思认为任务已完成或进展良好结束循环。) break # 否则可以将反思建议作为下一轮输入的一部分 # initial_task f{initial_task}。上一轮的反思建议是{reflection} return steps这个框架展示了反思循环的概念。在实际复杂Agent系统中反思机制会更加精细例如判断工具调用是否失败、结果是否相关等。6. 工程化与安全从玩具到可用的关键跨越让一个Agent在笔记本里跑起来是一回事让它稳定、安全、可维护地运行在真实环境中是另一回事。以下是必须考虑的工程化要点。6.1 工具执行的安全沙箱我们的WebSearch工具直接执行了网络请求。如果工具允许执行系统命令或访问文件风险极高。最佳实践对工具进行严格的输入验证和输出过滤。考虑在沙箱环境如Docker容器中运行不可信的工具代码。示例对于文件操作工具限制其可访问的目录路径。6.2 对LLM输出的解析与验证LLM的输出可能不符合工具调用的格式JSON或者产生有害指令。最佳实践使用框架提供的OutputParser如LangChain的JsonOutputParser并捕获解析错误。在将LLM的“行动决定”传递给工具前增加一层校验逻辑例如检查工具名是否在允许列表中。6.3 设置超时与循环限制Agent可能陷入死循环或长时间无响应。最佳实践在AgentExecutor中务必设置max_iterations最大循环次数和max_execution_time最大执行时间。agent_executor AgentExecutor( agentagent, toolstools, verboseTrue, max_iterations10, # 防止无限循环 early_stopping_methodgenerate, # 提前停止策略 handle_parsing_errorsTrue )6.4 日志与监控记录Agent的完整思考过程、工具调用和结果对于调试和审计至关重要。最佳实践集成日志系统如logging模块。将AgentExecutor的每一步输出包括Thought,Action,Observation结构化的记录到日志文件或监控系统。这有助于分析Agent的决策质量。6.5 成本与性能优化使用本地模型避免了API成本但性能是瓶颈。在云上使用GPT-4等模型时成本控制是关键。最佳实践缓存对重复的LLM调用或工具查询结果进行缓存。限制Token设置生成的最大Token数避免无意义的长篇大论。模型路由使用LiteLLM这样的抽象层可以根据任务复杂度动态选择便宜/快速的模型如简单分类用小型模型复杂规划用大型模型。7. 常见问题与排查指南在搭建和运行Agent过程中你一定会遇到各种问题。下表列出了典型问题及解决方案。问题现象可能原因排查步骤解决方案运行ollama run时下载模型失败或极慢网络连接问题或Ollama服务器访问不畅。1. 检查网络。2. 运行ollama serve查看服务日志。3. 尝试拉取更小的模型如tinyllama。1. 配置网络代理注意需合法合规使用网络。2. 使用国内镜像源如果可用。3. 手动下载模型文件并加载。运行Python脚本报错ModuleNotFoundError依赖库未安装或虚拟环境未激活。在终端执行pip list检查langchain,litellm等是否存在。1. 确认虚拟环境已激活。2. 在项目根目录执行pip install -r requirements.txt如果已创建文件。Agent执行时卡住长时间无输出1. LLM响应慢。2. 陷入无限循环。3. 工具调用超时。1. 查看终端verbose输出卡在哪一步。2. 检查工具函数是否有网络请求且未设置超时。1. 为AgentExecutor设置max_iterations和max_execution_time。2. 为网络请求类工具添加timeout参数。3. 尝试使用响应更快的模型。工具调用失败Agent不断重试同一工具工具返回的格式Agent无法理解或工具抛出异常。1. 检查工具函数的返回值是否为字符串。2. 在工具函数内部添加try...except返回明确的错误信息。1. 确保工具函数返回纯文本字符串。2. 在AgentExecutor中设置handle_parsing_errorsTrue。3. 优化工具的描述description使其更精确。LLM生成的行动指令无法被解析提示词设计不佳导致LLM输出不符合ReAct格式如Thought: ... Action: ...。打印出LLM在收到提示词后的原始输出。1. 使用LangChain Hub上经过验证的提示词模板如hwchase17/react。2. 在提示词中提供更清晰的格式示例Few-Shot。记忆Memory不生效1. 记忆对象未正确传递给Agent。2. 使用的Agent类型不支持记忆。1. 检查memory参数是否传给了AgentExecutor。2. 查阅文档确认你使用的AgentType支持记忆。1. 对于对话场景使用AgentType.CONVERSATIONAL_REACT_DESCRIPTION。2. 确保记忆的memory_key与提示词中引用的变量名一致。8. 下一步超越教程构建你自己的Agent完成以上步骤你已经掌握了Agent开发的核心流程。要真正超越他人你需要从“教程跟随者”变为“项目构建者”。设计更有价值的工具将你的日常工作APIJira、GitLab、邮件、日历封装成工具让Agent帮你处理通知、汇总日报。探索更强大的框架LangChain适合入门和原型。深入了解AutoGen微软专注于多Agent协作、CrewAI面向角色扮演和协作、Semantic Kernel微软深度集成等框架根据你的场景协作、工作流、集成选择。深入研究规划Planning算法尝试除了ReAct之外的规划策略如Chain of Thought (CoT)、Tree of Thoughts (ToT)甚至用一个小模型专门做任务规划。加入评估与反馈循环构建一个简单的评估体系自动判断Agent输出结果的质量如相关性、完整性并用这些数据微调提示词或优化规划逻辑。关注Agent安全与对齐这是行业前沿也是痛点。研究如何防止Agent被恶意提示词操纵Prompt Injection、如何确保工具使用的合规性、如何让Agent的目标与人类意图对齐。Agent不是未来它正在成为现在。通过这一周的系统学习与实践你已经打下了坚实的根基——不仅仅是学会使用几个库而是理解了如何将大语言模型转化为能感知、规划、行动并持续学习的智能系统。真正的超越始于你将这套思维应用于解决一个真实、具体的问题。现在关闭这篇教程打开你的编辑器开始设计你的第一个实用Agent吧。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进