☰
从零构建AI Agent:手把手教你实现具备搜索与计算技能的智能体
2026/10/15 9:07:15 网站建设 项目流程

如果你在2024年或2025年关注AI领域,大概率听过“AI Agent”这个词。它听起来很酷,但你可能也困惑过:它和ChatGPT这类聊天机器人到底有什么区别?为什么说它是“下一代AI应用”的核心?更重要的是,作为一个开发者,我该如何动手构建一个真正能“自主思考、执行任务”的Agent,而不是仅仅调用一个API?

这正是本文要解决的问题。市面上很多教程要么停留在概念科普,要么直接跳到复杂的框架源码,中间缺少一个关键的桥梁:如何从零开始,通过代码实战,理解并亲手打造一个具备“技能”(Skills)的智能体。

这篇文章将带你走完从概念到代码的完整路径。我们不空谈“智能体将改变世界”,而是聚焦于一个更实际的问题:如何让一个AI程序,从“被动回答问题”进化到“主动完成任务”?答案就藏在“Skills”的设计与实现里。通过本文,你将不仅理解Agent的核心架构,更能亲手编写代码,让一个Agent学会搜索、计算、读写文件,甚至组合多个技能完成复杂工作流。

1. 这篇文章真正要解决的问题:从“聊天”到“做事”的鸿沟

为什么我们需要Agent,而不仅仅是ChatGPT的API?

想象一个场景:你想让AI帮你分析最近一周的行业新闻,并生成一份带图表的报告。如果只用ChatGPT,你需要:

  1. 手动搜索新闻,复制粘贴给AI。
  2. 让AI总结,再手动整理。
  3. 打开另一个工具做图表,再把数据喂进去。
  4. 最后把文字和图表拼在一起。

这个过程里,你成了那个协调不同工具的“Agent”,而AI只是一个被动的文本处理器。

真正的AI Agent旨在消除这种割裂。它的目标是:你只需要给出一个目标(“写份行业周报”),Agent能自己规划步骤、调用工具(Skills)、执行任务,最终交付结果。这里的“Skills”,就是Agent赖以完成任务的手和脚,比如网络搜索、代码执行、文件操作、调用第三方API等。

本文要解决的核心痛点,正是许多开发者面临的困境:

  • 概念模糊:知道Agent重要,但说不清Agent、Skill、LLM(大语言模型)、Orchestrator(编排器)之间的关系。
  • 无从下手:想动手实践,但面对LangChain、AutoGen、CrewAI等众多框架,不知道从哪里开始,框架的抽象层反而成了障碍。
  • 缺乏实战:看了很多文章,依然写不出一个能真正“跑起来”并完成特定任务的Agent。

因此,本文的定位是一份“从第一性原理出发的实战指南”。我们将暂时抛开复杂框架,先用最基础的代码构建一个微型Agent,理解其每个核心组件。然后,再引入主流框架进行工程化升级。这样,你收获的将不是某个框架的“使用说明书”,而是构建智能体应用的底层思维和可迁移能力。

2. 基础概念与核心原理:拆解Agent的“大脑”与“手脚”

在深入代码之前,我们必须统一语言,厘清几个核心概念。很多人混淆了它们,导致学习过程事倍功半。

2.1 智能体(Agent) vs. 大语言模型(LLM)

这是最根本的区分。

  • 大语言模型(LLM): 如GPT-4、Claude、文心一言,本质是一个超级预测器。给定一段文本输入(提示词),它预测最可能的下一个词序列并输出。它拥有海量知识,能进行复杂推理,但它是“静态”和“被动”的。它不知道时间、无法主动执行操作、不能记忆长对话外的信息。
  • 智能体(Agent): 是一个基于LLM构建的自动化系统。你可以把它想象成一个拥有LLM作为“大脑”的机器人。这个系统还包括:
    • 记忆(Memory): 存储对话历史、任务上下文、知识。
    • 规划(Planning): 将复杂目标拆解为步骤(“先搜索,再分析,最后生成报告”)。
    • 工具使用(Tool Use): 调用各种Skills来影响外部世界或获取信息。
    • 行动(Action): 执行规划好的步骤。

简单比喻:LLM是百科全书,Agent是能查阅百科全书、做笔记、使用计算器、上网搜索并最终给你一份完整答案的私人助理。

2.2 技能(Skills/Tools)—— Agent的“超能力”

Skill(或Tool)是Agent能力的扩展。LLM本身被限制在文本范畴,而Skills赋予了它与现实世界交互的能力。

技能类型功能描述相当于人类的…
搜索技能联网搜索实时信息上网查资料
计算技能执行数学运算、逻辑判断使用计算器
代码技能编写并执行代码(如Python)雇佣一个程序员
文件技能读取、写入、修改本地文件操作电脑文件夹
API技能调用外部服务(天气、股票、邮件)打电话给客服或使用专业软件

一个Agent的强大程度,直接取决于它拥有的Skills数量和质量。开发Agent,很大程度上就是在为它设计和开发新的Skills。

2.3 智能体系统的核心工作流(ReAct模式)

当前最主流的Agent推理范式是“ReAct”(Reason + Act)。它模拟了人类解决问题的方式:

  1. 思考(Think/Reason): LLM根据目标和当前状态,分析下一步该做什么。例如:“用户想知道北京天气。我需要一个天气查询工具。”
  2. 行动(Act): LLM决定调用哪个Skill,并生成符合该Skill要求的输入参数。例如:调用get_weather技能,参数{“city”: “北京”}。
  3. 观察(Observe): Skill执行后返回结果。例如:“北京:晴,25°C。”
  4. 循环: LLM根据观察到的结果,再次进行思考,决定是继续下一步行动,还是认为任务已完成,将最终结果返回给用户。

这个“思考-行动-观察”的循环,是Agent自主性的源泉。我们的代码将围绕实现这个循环展开。

3. 环境准备与前置条件

我们将使用Python进行实战,因为它拥有最丰富的AI生态。本教程将分为两个阶段:

  • 阶段一(基础篇): 不用任何框架,纯手写一个简易Agent,彻底理解原理。
  • 阶段二(进阶篇): 使用LangChain框架,以工程化的方式重构并增强我们的Agent。

3.1 基础环境

请确保你的系统已安装:

  • Python 3.8 或更高版本。
  • pip包管理工具。
  • 一个你喜欢的代码编辑器或IDE(如VSCode、PyCharm)。

3.2 安装核心依赖

首先,我们需要一个LLM作为Agent的“大脑”。为了便于演示和免费用,我们将使用OpenAI的GPT模型(需要API Key),同时也会展示如何用本地开源模型(如Ollama)替代。我们还会安装一些工具库。

打开终端,创建一个新的项目目录并安装依赖:

# 创建项目目录并进入 mkdir ai-agent-tutorial && cd ai-agent-tutorial # 创建虚拟环境(推荐,避免包冲突) python -m venv venv # 激活虚拟环境 # Windows: venv\Scripts\activate # macOS/Linux: source venv/bin/activate # 安装核心依赖 pip install openai requests langchain langchain-community langchain-openai # 可选:如果你打算用本地模型,安装Ollama # 访问 https://ollama.com/ 下载并安装Ollama,然后在终端运行: # ollama pull llama3.2 # 拉取一个模型,如llama3.2

3.3 获取OpenAI API Key(可选)

如果你使用OpenAI的模型,需要去 OpenAI平台 创建一个API Key。然后将其设置为环境变量:

# Windows (PowerShell) $env:OPENAI_API_KEY="你的-api-key-here" # macOS/Linux export OPENAI_API_KEY="你的-api-key-here"

安全提示:永远不要将API Key直接硬编码在代码中提交到GitHub等公开仓库。使用环境变量或配置文件。

4. 核心流程拆解:手搓一个迷你Agent

让我们暂时忘记LangChain,用最纯粹的Python来构建一个具备两个技能(计算和搜索)的Agent。这是理解所有框架底层逻辑的关键。

4.1 第一步:定义技能(Skills)

技能本质上是一个个函数,它们能被Agent识别和调用。我们创建两个基础技能:

# 文件:skills.py import math import requests from urllib.parse import quote def calculator(expression: str) -> str: """ 一个简单的计算器技能。 参数: expression (str), 例如 "3 + 5 * 2" 返回: 计算结果字符串。 """ try: # 警告:使用eval有安全风险,仅用于演示。生产环境应用ast.literal_eval或专用库。 # 这里我们做一个极简的安全过滤,仅允许数字和基础运算符。 allowed_chars = set("0123456789+-*/(). ") if not all(c in allowed_chars for c in expression): return "错误:表达式中包含不安全字符。" result = eval(expression, {"__builtins__": {}}, math.__dict__) return f"计算结果: {result}" except Exception as e: return f"计算错误: {e}" def search_web(query: str) -> str: """ 一个模拟的网页搜索技能(使用DuckDuckGo即时答案API)。 参数: query (str), 搜索关键词。 返回: 搜索摘要字符串。 """ try: # 使用DuckDuckGo的API,它无需API Key且免费。 url = f"https://api.duckduckgo.com/?q={quote(query)}&format=json&pretty=1" response = requests.get(url, timeout=10) data = response.json() # 提取摘要信息 abstract = data.get('AbstractText') if abstract: return f"搜索摘要: {abstract[:200]}..." # 截断长度 else: # 如果没有摘要,返回相关主题 related_topics = data.get('RelatedTopics', []) if related_topics: first_topic = related_topics[0].get('Text', '无相关信息') return f"相关主题: {first_topic[:150]}..." else: return "未找到相关信息。" except Exception as e: return f"搜索请求失败: {e}" # 技能注册表:将技能名称映射到函数和描述 SKILL_REGISTRY = { "calculator": { "function": calculator, "description": "用于执行数学计算。输入一个数学表达式,如 '3 + 5 * 2' 或 'sqrt(16)'。" }, "search_web": { "function": search_web, "description": "用于在互联网上搜索信息。输入一个搜索查询。" } }

关键点:

  1. 每个技能函数都有清晰的输入(query/expression)和输出(str)。
  2. 我们创建了一个SKILL_REGISTRY字典来管理所有技能。这是Agent的“技能库”。
  3. 描述(description)至关重要,LLM需要根据描述来决定何时调用哪个技能。

4.2 第二步:构建Agent的“大脑”(LLM交互)

我们需要一个函数,能够将对话历史、可用技能和用户问题组合成一个精妙的提示词(Prompt),发送给LLM,并解析LLM的回复,判断它是想说话还是想调用技能。

# 文件:agent_brain.py import openai import json import os # 从环境变量读取API Key openai.api_key = os.getenv("OPENAI_API_KEY") def call_llm(messages, model="gpt-3.5-turbo"): """调用OpenAI API的辅助函数。""" try: response = openai.chat.completions.create( model=model, messages=messages, temperature=0.1, # 低温度,让输出更确定,减少随机性 max_tokens=500 ) return response.choices[0].message.content except Exception as e: return f"调用LLM API时出错: {e}" def think_and_plan(user_input: str, conversation_history: list, skills_info: dict) -> dict: """ Agent的思考核心。 参数: user_input: 用户当前输入 conversation_history: 之前的对话消息列表 skills_info: 技能注册表信息 返回: 一个字典,包含LLM的决策。例如: {'action': 'final_answer', 'content': '...'} 或 {'action': 'use_skill', 'skill_name': '...', 'skill_input': '...'} """ # 1. 构建系统提示词,告诉LLM它的角色和可用技能 skills_description = "\n".join([f"- {name}: {info['description']}" for name, info in skills_info.items()]) system_prompt = f"""你是一个有帮助的AI助手,可以调用以下工具(技能)来帮助用户: {skills_description} 请严格按以下规则响应: 1. 如果用户的问题可以直接回答,或者无需调用工具,请直接给出最终答案。 2. 如果需要调用工具,请以严格的JSON格式回复,且只包含这个JSON对象,不要有任何其他文字。 JSON格式必须为:{{"action": "use_skill", "skill_name": "技能名", "skill_input": "技能输入参数"}} 3. 如果工具调用后得到了结果,你需要结合结果和用户问题,给出最终答案。 当前对话历史: {conversation_history} """ # 2. 构建消息列表 messages = [ {"role": "system", "content": system_prompt}, {"role": "user", "content": user_input} ] # 3. 调用LLM llm_response = call_llm(messages) # 4. 解析LLM的响应 # 尝试解析JSON,如果成功,说明LLM想调用技能 try: decision = json.loads(llm_response) if decision.get("action") == "use_skill": # 验证技能是否存在 if decision["skill_name"] in skills_info: return decision else: return {"action": "final_answer", "content": f"错误:尝试调用不存在的技能 '{decision['skill_name']}'。"} else: # 如果不是use_skill,当作最终答案 return {"action": "final_answer", "content": llm_response} except json.JSONDecodeError: # 如果响应不是JSON,则视为最终答案 return {"action": "final_answer", "content": llm_response}

关键点:

  1. 系统提示词(System Prompt)是控制Agent行为的关键。我们明确规定了它的角色、可用技能和响应格式。
  2. 我们要求LLM在需要调用技能时,返回一个结构化的JSON。这是实现“思考-行动”循环的协议。
  3. 通过json.loads尝试解析响应,来判断LLM的意图。这是ReAct模式中“思考”环节的简化实现。

4.3 第三步:组装Agent主循环

现在,我们将技能库和大脑组装起来,形成一个可以交互的Agent。

# 文件:simple_agent.py from skills import SKILL_REGISTRY from agent_brain import think_and_plan class SimpleAgent: def __init__(self): self.skills = SKILL_REGISTRY self.conversation_history = [] def run_skill(self, skill_name: str, skill_input: str) -> str: """执行指定的技能。""" if skill_name in self.skills: skill_func = self.skills[skill_name]["function"] print(f"[Agent] 正在执行技能: {skill_name}({skill_input})") result = skill_func(skill_input) print(f"[Skill Result] {result}") return result else: return f"错误:未找到技能 '{skill_name}'。" def chat(self, user_input: str) -> str: """处理用户输入的一轮对话。""" print(f"\n[User] {user_input}") # 1. Agent思考并做决策 decision = think_and_plan(user_input, self.conversation_history, self.skills) final_answer = "" # 2. 根据决策行动 if decision["action"] == "use_skill": skill_name = decision["skill_name"] skill_input = decision["skill_input"] # 执行技能 observation = self.run_skill(skill_name, skill_input) # 将观察结果(技能输出)加入历史,并让Agent基于此继续思考(简化版,这里直接作为最终答案的一部分) # 在一个更复杂的循环中,这里应该将observation再次喂给think_and_plan final_answer = f"我通过{skill_name}了解到:{observation}。根据这个信息,答案是:{observation}" # 简化处理 else: # final_answer final_answer = decision["content"] # 3. 更新对话历史(实际应用中需控制历史长度) self.conversation_history.append(f"User: {user_input}") self.conversation_history.append(f"Assistant: {final_answer}") # 保持历史记录不会无限增长(例如只保留最近10轮) if len(self.conversation_history) > 20: self.conversation_history = self.conversation_history[-20:] print(f"[Agent] {final_answer}") return final_answer def start_cli(self): """启动一个简单的命令行交互界面。""" print("简易AI Agent已启动!输入 'quit' 或 'exit' 退出。") while True: try: user_input = input("\nYou: ").strip() if user_input.lower() in ['quit', 'exit', 'q']: print("再见!") break if user_input: self.chat(user_input) except KeyboardInterrupt: print("\n程序被中断。") break except Exception as e: print(f"发生错误: {e}") if __name__ == "__main__": agent = SimpleAgent() agent.start_cli()

4.4 第四步:运行与测试

将以上三个文件(skills.py,agent_brain.py,simple_agent.py)放在同一目录下。确保已设置好OPENAI_API_KEY环境变量,然后在终端运行:

python simple_agent.py

现在,你可以和你的Agent对话了!尝试以下问题:

  • “计算一下 15 的平方加上 20 除以 4 等于多少?” (它会调用calculator)
  • “搜索一下Python编程语言的最新版本。” (它会调用search_web)
  • “你好吗?” (它会直接回答,不调用技能)

恭喜!你已经亲手创建了一个具备ReAct思维链雏形的AI Agent。虽然简陋,但它包含了所有核心要素:技能定义、LLM决策、执行循环。

5. 完整示例与代码实现:用LangChain工程化升级

手搓Agent有助于理解原理,但生产环境我们需要更强大、更稳定的框架。LangChain是目前最流行的AI应用开发框架之一,它为我们抽象了Agent、Chain、Memory、Tool等概念,提供了大量开箱即用的组件。

接下来,我们用LangChain重构上面的Agent,并增加记忆(Memory)和更复杂的技能链。

5.1 安装LangChain及相关组件

我们已经安装了langchain和langchain-openai。为了使用更多工具,我们再安装一个社区工具包:

pip install langchain-community

5.2 使用LangChain定义工具(Skills)

在LangChain中,Skill被称为Tool。我们可以用装饰器轻松地将一个函数转化为Tool。

# 文件:langchain_agent_demo.py import os from langchain_openai import ChatOpenAI from langchain.agents import AgentExecutor, create_openai_tools_agent from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder from langchain.agents.format_scratchpad.openai_tools import format_to_openai_tool_messages from langchain.agents.output_parsers.openai_tools import OpenAIToolsAgentOutputParser from langchain.memory import ConversationBufferMemory from langchain_community.tools import DuckDuckGoSearchRun from langchain.tools import tool import math # 1. 定义自定义工具(计算器),使用@tool装饰器 @tool def calculator_tool(expression: str) -> str: """执行数学计算。输入一个有效的数学表达式,如 '(12+5)*3' 或 'sqrt(25)'。""" try: allowed_chars = set("0123456789+-*/(). ") if not all(c in allowed_chars for c in expression): return "错误:表达式中包含不安全字符。" result = eval(expression, {"__builtins__": {}}, math.__dict__) return str(result) except Exception as e: return f"计算错误: {e}" # 2. 使用社区中已定义的工具(网络搜索) search_tool = DuckDuckGoSearchRun() # 3. 工具列表 tools = [calculator_tool, search_tool] # 4. 初始化LLM llm = ChatOpenAI(model="gpt-3.5-turbo-1106", temperature=0, openai_api_key=os.getenv("OPENAI_API_KEY")) # 5. 构建提示词模板 prompt = ChatPromptTemplate.from_messages([ ("system", "你是一个强大的AI助手,可以调用工具来回答问题。请清晰、准确地思考。"), MessagesPlaceholder(variable_name="chat_history"), # 记忆将注入这里 ("user", "{input}"), MessagesPlaceholder(variable_name="agent_scratchpad"), # Agent的思考过程将注入这里 ]) # 6. 创建记忆(Memory) memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True) # 7. 创建Agent agent = create_openai_tools_agent(llm, tools, prompt) # 8. 创建Agent执行器,它封装了ReAct循环 agent_executor = AgentExecutor( agent=agent, tools=tools, memory=memory, verbose=True, # 设置为True可以看到Agent的思考过程! handle_parsing_errors=True, # 优雅地处理解析错误 max_iterations=5, # 防止Agent陷入无限循环 ) # 9. 运行Agent if __name__ == "__main__": print("LangChain AI Agent 已启动 (输入 'quit' 退出)") while True: try: user_input = input("\nYou: ").strip() if user_input.lower() in ['quit', 'exit', 'q']: print("再见!") break if user_input: # 调用执行器 response = agent_executor.invoke({"input": user_input}) print(f"\nAgent: {response['output']}") except KeyboardInterrupt: print("\n程序被中断。") break except Exception as e: print(f"发生错误: {e}")

5.3 代码解析与LangChain优势

运行这个脚本(python langchain_agent_demo.py),你会看到完全不同的体验。当verbose=True时,控制台会打印出Agent详细的思考过程:

> Entering new AgentExecutor chain... 思考:用户想知道北京的天气。我需要搜索实时信息。 行动:调用搜索工具。 观察:...(搜索返回的天气信息) 思考:我已经获得了北京的天气信息,可以回答用户了。 最终答案:北京今天晴,气温25°C。 > Finished chain.

LangChain带来的核心优势:

  1. 标准化工具接口:@tool装饰器自动处理函数描述、参数schema生成,让LLM能精确理解如何调用。
  2. 内置ReAct循环:AgentExecutor自动管理“思考-行动-观察”的循环,无需手动解析JSON和判断。
  3. 强大的记忆管理:ConversationBufferMemory轻松管理对话历史,并自动将其注入到提示词中。
  4. 丰富的工具生态:langchain-community提供了数百种预置工具(搜索、维基百科、Shell、文件操作等)。
  5. 错误处理与安全: 自动处理工具调用失败、解析错误,并可通过max_iterations防止死循环。

6. 运行结果与效果验证

运行langchain_agent_demo.py后,你可以进行更复杂的测试,验证Agent的能力:

测试用例1:多步骤推理与工具组合

  • 输入:“先搜索一下特斯拉(Tesla)当前的股价,然后计算如果我有1000股,总价值是多少美元?”
  • 预期行为:
    1. Agent应首先调用search_tool,关键词可能是“Tesla stock price today”。
    2. 从搜索结果中提取股价数字(例如 “$175.30”)。
    3. 调用calculator_tool,计算175.30 * 1000。
    4. 输出最终答案。
  • 验证:观察控制台输出的思考链,看是否按预期调用了两个工具。

测试用例2:依赖上下文的对话(测试Memory)

  • 第一轮输入:“我的名字叫小明。”
  • 预期输出:Agent可能简单确认或问候。
  • 第二轮输入:“我刚才说我叫什么名字?”
  • 预期行为:Agent应能正确回答“小明”,证明记忆功能生效。
  • 验证:检查第二轮的回答。

测试用例3:处理无法直接回答的问题

  • 输入:“今天北京和上海的温度相差多少度?”
  • 预期行为:Agent应意识到需要分别查询两地的天气(调用两次搜索工具),提取温度数值,再计算差值(可能调用计算器工具)。这是一个典型的多步骤规划任务。
  • 验证:观察Agent是否成功规划并执行了这些步骤。

如果Agent能顺利完成以上测试,说明你的LangChain Agent已经具备了相当不错的任务理解和执行能力。

7. 常见问题与排查思路

在开发Agent过程中,你一定会遇到各种问题。下表列出了最常见的问题及其解决方法:

问题现象可能原因排查方式解决方案
Agent陷入循环,不断调用同一个工具1. 工具返回的结果无法满足停止条件。
2.max_iterations设置过高。
3. 系统提示词不够清晰。
1. 查看verbose=True的日志,观察每次“观察”后的“思考”内容。
2. 检查工具返回的结果格式是否清晰。
1. 在系统提示词中明确给出最终答案的格式要求。
2. 适当降低max_iterations(如设为3-5)。
3. 优化工具函数,返回更结构化、清晰的结果。
LLM无法正确选择或调用工具1. 工具的描述(description)不清晰。
2. 工具的参数schema太复杂或LLM不理解。
3. LLM能力不足(如使用过时的模型)。
1. 检查@tool装饰器中的文档字符串是否准确描述了功能和输入。
2. 尝试用更简单的示例测试。
1.重写工具描述:使用最直白、无歧义的语言,并包含1-2个输入示例。
2.升级LLM:使用gpt-4-turbo等更强模型,工具调用准确率会大幅提升。
3. 简化工具参数,或将其拆分为多个更简单的工具。
“Rate limit” 或 “Authentication” 错误1. OpenAI API Key无效或余额不足。
2. 请求频率超限。
1. 检查环境变量OPENAI_API_KEY是否正确设置。
2. 登录OpenAI平台检查用量和余额。
1. 确保API Key有效且有余额。
2. 在代码中增加请求延迟(如time.sleep(1))。
3. 考虑使用Azure OpenAI或其他模型供应商。
本地模型(如Ollama)响应慢或效果差1. 本地模型参数量小,推理能力弱。
2. 提示词未针对本地模型优化。
3. 硬件资源(CPU/GPU/RAM)不足。
1. 先用一个简单问题测试模型的基础对话能力。
2. 查看Ollama服务日志。
1.选择合适模型:使用专为工具调用微调的模型(如llama3.2:latest比早期版本好)。
2.简化提示词:本地模型对复杂系统提示词的理解可能不如GPT-4,需要更直接、简短的指令。
3.升级硬件或量化模型。
工具执行出错(如网络超时、文件不存在)工具函数内部代码有Bug或依赖服务不稳定。1. 在工具函数内部添加try...except捕获异常并返回友好错误信息。
2. 单独测试工具函数。
1.增强工具鲁棒性:添加异常处理、参数验证、超时设置。
2. 在Agent层面,可以通过handle_parsing_errors和自定义错误处理逻辑来降级。
记忆混乱或丢失上下文1.ConversationBufferMemory的k参数设置过小,历史被截断。
2. 记忆的key与提示词中的placeholder不匹配。
1. 检查memory_key和提示词中MessagesPlaceholder的variable_name是否一致。
2. 打印memory.chat_memory.messages查看存储的内容。
1. 确保memory_key与提示词中的变量名一致。
2. 对于长对话,考虑使用ConversationSummaryMemory或ConversationBufferWindowMemory(滑动窗口记忆)。

8. 最佳实践与工程建议

当你掌握了基础开发后,以下建议能帮助你将Agent项目提升到生产可用级别:

8.1 技能(工具)设计原则

  • 单一职责:一个工具只做一件事,并且做好。避免创建“万能工具”。
  • 描述清晰:工具的文档字符串(docstring)是给LLM看的“说明书”,必须精确描述功能、输入格式和输出示例。例如:“输入一个城市名称(如‘北京’),返回该城市当前的天气情况。输出格式:‘城市:天气,温度’。”
  • 防御性编程:工具函数内部必须进行输入验证、异常捕获和资源清理(如关闭网络连接、文件句柄)。
  • 提供结构化输出:尽可能让工具返回结构化的数据(如JSON),而非纯自然语言,便于后续工具或LLM解析。例如,天气工具返回{"city": "北京", "weather": "晴", "temp": 25}。

8.2 提示词工程优化

  • 角色设定:在系统提示词中明确Agent的“人设”,如“你是一个严谨的数据分析师”或“你是一个乐于助人的编程助手”,这能显著影响其行为风格。
  • 思维链(Chain-of-Thought)鼓励:在提示词中要求LLM“逐步思考”,例如“请先分析问题,列出所需步骤,再调用工具”。这能提高复杂任务的成功率。
  • 提供少量示例(Few-Shot):在系统提示词中提供1-2个“用户提问-Agent思考-工具调用-最终答案”的完整示例,能极大地引导LLM遵循你期望的格式和流程。

8.3 生产环境部署考量

  • 异步与并发:使用asyncio和LangChain的异步接口处理多个并发用户请求,避免阻塞。
  • 状态管理:对于Web应用,不能使用全局变量存储记忆。需要将对话状态(Memory)与用户会话(Session)绑定,并存储到数据库(如Redis)中。
  • 可观测性:记录详细的日志,包括用户的原始输入、LLM的完整响应(思考过程)、工具调用记录及结果、最终输出。这对于调试和优化至关重要。
  • 成本与延迟控制:设置LLM调用的超时和重试机制。监控API调用成本,对于内部工具,考虑使用更便宜的模型(如gpt-3.5-turbo)进行路由或初步处理。
  • 安全与审核:对用户输入进行内容安全过滤。对工具调用(特别是文件操作、Shell命令、数据库查询)实施严格的权限控制和输入净化,防止提示词注入或越权操作。

8.4 超越基础Agent:多智能体与编排

当单个Agent无法处理复杂工作流时,就需要考虑多智能体系统。框架如CrewAI、AutoGen专门为此设计。

  • 角色分工:可以创建“研究员”、“分析师”、“撰稿人”、“审核员”等多个Agent,每个拥有不同的技能和系统提示词。
  • 编排流程:定义Agent之间的协作流程,例如研究员收集信息给分析师,分析师生成洞察给撰稿人,最后审核员校对。
  • 适用场景:内容生成、复杂数据分析、软件工程任务分解等。

9. 总结与后续学习方向

通过本文,我们完成了一次从理论到实践的深度穿越:

  1. 澄清了本质:理解了Agent不是魔法,而是一个以LLM为“大脑”,通过规划、记忆和工具使用来主动完成任务的系统。
  2. 亲手实现了核心循环:通过手写代码,你透彻理解了ReAct(思考-行动-观察)这一Agent核心工作模式是如何在代码层面流转的。
  3. 掌握了主流框架:使用LangChain重构了Agent,体验了其如何通过抽象,让我们能专注于业务逻辑(工具定义和提示词),而将复杂的循环、解析、记忆管理交给框架。
  4. 规避了常见陷阱:了解了开发中可能遇到的循环、调用错误、记忆丢失等问题及其解决方案。
  5. 看到了更高阶的图景:了解了生产级Agent的最佳实践和多智能体系统的可能性。

你的下一步学习方向:

  • 深入LangChain生态:探索更多的内置工具(langchain-community)、向量数据库集成(用于知识库)、以及更高级的Agent类型(如Plan-and-Execute Agent)。
  • 探索其他框架:尝试CrewAI(专注于角色扮演和多智能体协作)或Microsoft Autogen(功能极其强大,支持代码执行、群聊等复杂模式)。
  • 集成实际业务:将Agent与你现有的系统连接。例如,开发一个技能,让它能通过API查询公司数据库;或者创建一个能自动写SQL、分析数据并生成图表的数据分析Agent。
  • 关注评估与优化:学习如何评估Agent的性能(任务完成率、步骤效率、成本),并通过优化提示词、工具设计、甚至对LLM进行微调(Fine-tuning)来持续提升。

AI Agent的开发是一场关于“如何将语言模型的认知能力有效转化为实际行动”的工程实践。它没有想象中那么神秘,但也远比调用一个API复杂。希望这份从零开始的指南,为你提供了坚实的地图和第一块积木。现在,是时候用这些技能,去构建真正能解决实际问题的智能体了。建议收藏本文,在未来的开发中随时回溯这些核心概念和代码片段。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询