AI大模型系列教程--动手实现一个AI Agent
早晨七点,你的AI助手自动检查日程,发现上午有户外会议,立刻查询天气,发现午后有雨,于是不仅提醒你带伞,还调整了出行路线,预订了雨后的室内会议室——这就是AI Agent,一个能自主思考并行动的智能助手。
1024程序员节,祝各位节日快乐! 引言:成为AI时代的入口【AI大模型教程】
如果你用过DeepSeek,你一定感叹于它强大的对话能力。但当它说“我很乐意帮你订餐,但我做不到”时,你是否感到一丝遗憾?AI Agent(智能体) 就是要解决这个问题——让AI从“能说会道”的聊天机器人,变成“能办实事”的数字助手。
想象一个具备思考和行动能力的AI助手:它不仅能理解你的需求,还能调用各种工具(查询天气、发送邮件、控制智能家居)来实际完成任务。这就是AI Agent,数字世界里的智能机器人。
为什么这如此重要? 当大语言模型学会了使用工具,就从“大脑”进化成了“完整智能体”,这是AI应用的下一个范式转移。
本教程将带你理解AI Agent的核心概念,并亲手构建你的第一个AI Agent,以及多Agent架构实现,文章后半部分会涉及Python代码演示,如果没没有相关经验,建议提前学习。
第一部分:基础概念篇 —— 理解AI Agent的“灵魂”
1.1 什么是AI Agent?一个精确的定义
核心定义:AI Agent是一个能感知环境、自主规划、执行动作并达成目标的智能体。
与传统AI模型(如ChatGPT/DeepSeek)的关键区别:
- ChatGPT:问答模式,被动响应
- AI Agent:代理模式,主动完成
AI Agent的核心循环:
思考(分析目标)-> 行动(调用工具)-> 观察(获取结果)-> 循环直到任务完成
1.2 AI Agent的核心构成要素
规划(Planning) - Agent的“大脑”
- 任务分解:把“规划一次旅行”拆解为订机票、订酒店、安排行程
- 思维链(CoT):逐步推理“如果要订餐厅,需要先知道位置、预算和口味偏好”
- 自我反思:当行动失败时,能分析原因并调整策略
记忆(Memory) - Agent的“经验库”
- 短期记忆:记住当前对话的上下文
- 长期记忆:用向量数据库存储历史经验,供未来参考
工具使用(Tool Use) - Agent的“双手”
- 调用外部API、函数、软件的能力
- 示例:
get_weather("北京")、send_email("同事", "会议纪要", "内容")
1.3 AI Agent的常见类型
按智能程度分:
- 反射型Agent:简单响应(如自动回复邮件)
- 目标驱动型:本文重点,能规划复杂任务
- 学习型:能从经验中不断改进
按应用场景分:
- 单一任务Agent:专注一件事,如摘要生成
- 多模态Agent:处理文本、图像、语音
- 模拟社会Agent:多个Agent协作解决问题
第二部分:核心技术篇 —— 揭秘AI Agent的“骨架”
2.1 构建AI Agent的通用架构
ReAct范式:推理(Reason)+ 行动(Act)的经典组合
LangGraph思想:将任务视为有向图,通过状态流转控制执行
基本工作流:
用户指令 → 任务规划 → 选择工具 → 执行动作 → 观察结果 → 判断是否完成 → 输出最终结果
2.2 关键技术栈与工具
框架层:
- LangChain/LangGraph:功能全面,开发者生态丰富
- CrewAI:专注多Agent协作
- AutoGen:微软出品,支持复杂多Agent对话
模型层:
- GPT-4/Claude-3:强大的推理引擎
- 开源模型:Llama、Qwen,追求可控性和隐私
记忆层:
- 向量数据库:Chroma、Pinecone、Weaviate
第三部分:动手实践篇 —— 构建你的第一个AI Agent
项目:创建“天气预报与穿衣建议”Agent
目标:用户输入城市名,Agent返回当地天气和穿衣建议能力:调用天气API + 基于温度的智能推理
3.1 环境准备
pip install langchain-openai langchain-core
3.2 分步实现教程
步骤一:初始化大模型
from langchain_openai import ChatOpenAI# 初始化模型,使用gpt-3.5-turbo兼顾效果与成本llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)
步骤二:定义天气工具函数
import jsondef get_weather(city: str) -> str: """获取城市天气信息(这里使用模拟数据)""" weather_data = { "北京": {"weather": "晴天", "temp": 25, "humidity": 40}, "上海": {"weather": "多云", "temp": 28, "humidity": 70}, "广州": {"weather": "雷阵雨", "temp": 32, "humidity": 85} } if city in weather_data: return json.dumps(weather_data[city], ensure_ascii=False) else: return json.dumps({"weather": "未知", "temp": 0, "humidity": 0})
步骤三:绑定工具并创建Agent
from langchain.agents import AgentExecutor, create_tool_calling_agentfrom langchain_core.prompts import ChatPromptTemplate# 定义工具列表tools = [get_weather]# 创建提示词模板prompt = ChatPromptTemplate.from_messages([ ("system", """你是一个专业的天气助手。根据用户的查询,调用合适的工具获取天气信息,然后给出专业的穿衣建议。 穿衣指南: - 25度以上:建议短袖、短裤 - 15-25度:建议长袖T恤、薄外套 - 15度以下:建议毛衣、厚外套 - 下雨天:记得带伞或穿防水外套 - 高湿度:建议穿透气衣物"""), ("placeholder", "{chat_history}"), ("human", "{input}"), ("placeholder", "{agent_scratchpad}")])# 创建Agentagent = create_tool_calling_agent(llm, tools, prompt)agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
步骤四:运行测试
# 测试Agentresult = agent_executor.invoke({ "input": "北京天气怎么样?应该穿什么衣服?"})print(result["output"])
3.4 完整代码展示
from langchain_openai import ChatOpenAIfrom langchain.agents import AgentExecutor, create_tool_calling_agentfrom langchain_core.prompts import ChatPromptTemplateimport json# 1. 初始化模型llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)# 2. 定义天气工具def get_weather(city: str) -> str: """获取城市天气信息""" weather_data = { "北京": {"weather": "晴天", "temp": 25, "humidity": 40}, "上海": {"weather": "多云", "temp": 28, "humidity": 70}, "广州": {"weather": "雷阵雨", "temp": 32, "humidity": 85} } if city in weather_data: return json.dumps(weather_data[city], ensure_ascii=False) else: return json.dumps({"weather": "未知", "temp": 0, "humidity": 0})# 3. 创建Agenttools = [get_weather]prompt = ChatPromptTemplate.from_messages([ ("system", """你是一个专业的天气助手。根据用户的查询,调用合适的工具获取天气信息,然后给出专业的穿衣建议。"""), ("placeholder", "{chat_history}"), ("human", "{input}"), ("placeholder", "{agent_scratchpad}")])agent = create_tool_calling_agent(llm, tools, prompt)agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)# 4. 运行Agentif __name__ == "__main__": response = agent_executor.invoke({ "input": "北京天气怎么样?应该穿什么衣服?" }) print("\n=== AI Agent回复 ===") print(response["output"])
运行结果示例:
=== AI Agent回复 ===北京今天晴天,温度25度,湿度40%。天气比较舒适,建议穿短袖和薄外套,白天可能会有点热,可以把外套拿在手里。
第四部分:进阶与最佳实践
掌握了基础 AI Agent 的构建后,要让 Agent 真正落地并发挥价值,还需解决 “如何设计更强大的 Agent”“如何实现多 Agent 协作”“如何应对实际开发中的挑战” 这三大核心问题。本节将从实战角度,提供可落地的优化方案与解决方案。
4.1 如何设计一个强大的 Agent?
一个 “强大” 的 AI Agent,不仅能完成基础任务,还需具备 “高可靠性、低风险、强适配性” 的特点。核心优化方向集中在提示词工程、错误处理、安全伦理三个维度。
4.1.1 清晰的提示词工程:给 Agent “明确的行动指南”
提示词是 Agent 的 “指令说明书”,模糊的提示会导致 Agent 决策混乱,而精准的提示能让 Agent 高效完成任务。设计提示词时,需包含角色定义、目标拆解、约束条件三大核心要素:
- 角色定义:明确 Agent 的 “身份” 与 “专业领域”,让模型快速进入对应场景。例如,为 “市场调研 Agent” 设计提示词时,可明确:“你是一名资深市场调研专家,擅长分析消费电子领域的用户需求与竞品动态,具备数据整理与趋势总结能力”;
- 目标拆解:将复杂目标转化为 “可量化、可执行” 的子任务,避免 Agent 遗漏关键步骤。例如,将 “完成某款手机的市场调研” 拆解为:“1. 收集近 3 个月该手机的线上销量数据;2. 分析 Top5 竞品的核心功能差异;3. 提取用户评价中的高频好评与差评点;4. 生成包含数据图表的调研报告”;
- 约束条件:明确 Agent 的 “行动边界”,避免无效操作。例如,添加约束:“仅使用权威数据源(如京东、天猫官方数据、IDC 行业报告);调研报告需包含数据来源标注;若某类数据无法获取,需说明原因而非编造数据”。
示例:优化后的提示词对比
- 普通提示词:“帮我做一份手机市场调研”;
- 优化提示词:“你是消费电子领域的市场调研专家,需完成某品牌 X 手机的市场调研任务,具体要求:1. 收集 2024 年 Q3 该手机在京东、天猫的销量数据(需标注具体数值与同比变化);2. 对比该手机与苹果 iPhone 16、华为 Mate 70 的核心参数(芯片、屏幕、电池);3. 从天猫评论中提取前 100 条评价,统计高频好评(如续航、拍照)与差评(如发热、系统卡顿)关键词;4. 最终输出 3000 字以内的报告,附数据来源链接。约束:不使用非官方数据源,若销量数据无法获取,需注明‘Q3 官方销量数据暂未公开’”。
4.1.2 有效的错误处理:让 Agent 具备 “抗挫折能力”
在实际使用中,Agent 调用工具时难免遇到错误(如 API 超时、数据返回为空、参数错误),若缺乏错误处理机制,Agent 会直接 “卡住” 或返回无效结果。有效的错误处理需覆盖错误识别、重试策略、替代方案三个环节:
- 错误识别:提前定义常见错误类型,并让 Agent 能判断错误原因。例如,调用天气 API 时,可能出现 “城市名称错误(返回 404)”“API 密钥过期(返回 401)”“网络超时(无返回)” 三种常见错误;
- 重试策略:针对不同错误类型设计差异化重试逻辑。例如:
- 网络超时:设置 “3 次重试,每次间隔 2 秒” 的策略,避免因临时网络波动导致任务失败;
- 城市名称错误:让 Agent 主动询问用户 “您输入的城市名称可能有误,请确认是否为‘北京市’而非‘北京省’”,获取正确信息后重新调用工具;
- 替代方案:当工具调用持续失败时,提供 “Plan B”。例如,若高德天气 API 因密钥过期无法使用,Agent 可自动切换为 “和风天气 API”,或告知用户 “当前天气 API 暂时不可用,可为您提供该城市的历史天气平均数据作为参考”。
代码示例:错误处理逻辑实现
def get_weather(city): # 定义错误重试与替代方案 max_retries = 3# 最大重试次数 retry_interval = 2# 重试间隔(秒) retry_count = 0 while retry_count < max_retries: try: # 尝试调用高德天气API response = requests.get( "https://restapi.amap.com/v3/weather/weatherInfo", params={"key": os.getenv("AMAP_API_KEY"), "city": city, "extensions": "base"} ) response.raise_for_status() # 触发HTTP错误(如404、401) data = response.json() if data["status"] != "1": # API返回业务错误(如城市不存在) raise ValueError(f"城市{city}不存在,请确认名称") return data["lives"][0] # 返回天气数据 except requests.exceptions.Timeout: # 网络超时:重试 retry_count += 1 print(f"网络超时,第{retry_count}次重试...") time.sleep(retry_interval) except requests.exceptions.HTTPError as e: # API密钥过期或权限错误:切换备用API print(f"高德API错误:{e},切换至和风天气API") return get_weather_alternative(city) # 调用备用API函数 except ValueError as e: # 城市名称错误:询问用户 user_confirm = input(f"{e},是否需要修正为其他城市?(请输入新城市名,或按回车取消)") if user_confirm: city = user_confirm retry_count = 0# 重置重试次数,用新城市名重新尝试 else: returnNone# 用户取消,返回空 # 多次重试失败:返回替代方案 print(f"多次调用天气API失败,返回{city}历史平均天气数据") return get_historical_weather(city) # 返回历史天气数据
4.1.3 安全与伦理考量:为 Agent “装上安全阀”
AI Agent 具备调用外部工具的能力,若缺乏安全管控,可能执行危险操作(如删除系统文件、发送垃圾邮件)或泄露敏感信息。核心管控措施包括权限限制、敏感信息过滤、操作审计:
- 权限限制:严格控制 Agent 的工具调用权限。例如,“文档处理 Agent” 仅允许 “读取指定文件夹的文档”“写入指定格式的报告”,禁止 “删除文件”“修改系统配置”;使用 API 时,采用 “最小权限原则”,为 Agent 分配仅能完成当前任务的 API 权限(如天气 API 仅授予 “查询天气” 权限,无 “修改用户数据” 权限);
- 敏感信息过滤:防止 Agent 泄露或处理敏感数据。例如,在 “邮件发送 Agent” 中,添加敏感信息检测逻辑:若邮件内容包含 “身份证号、银行卡号”,自动提示用户 “内容包含敏感信息,是否确认发送?”;若收件人邮箱非公司内部域名,需二次验证用户身份;
- 操作审计:记录 Agent 的所有行动日志,便于追溯问题。日志需包含 “操作时间、调用工具、输入参数、输出结果、错误信息”,例如:“2024-10-23 14:30:00,调用 send_email 工具,输入参数(to: xxx@xxx.com,subject: 会议通知),输出结果:邮件发送成功,错误信息:无”。
4.2 从单 Agent 到多 Agent 系统:让 Agent “协同工作”
在复杂场景中(如 “撰写一篇深度行业报告”“组织一场大型活动”),单一 Agent 的能力有限,而多 Agent 系统通过 “分工协作”,能高效完成复杂任务。本节将介绍多 Agent 协作的核心逻辑,及基于 CrewAI 框架的实践思路。
4.2.1 多 Agent 协作的核心概念:“角色分工 + 任务流转”
多 Agent 系统的本质是 “模拟人类团队协作”,每个 Agent 扮演特定角色,负责专属任务,通过预设规则完成任务流转。以 “撰写行业报告” 为例,典型的多 Agent 分工如下:
- 调研 Agent:负责收集数据,角色定位为 “数据收集专家”,任务包括 “查找行业最新政策、统计市场规模数据、整理竞品动态”;
- 写作 Agent:负责内容创作,角色定位为 “行业分析师”,任务包括 “将调研数据转化为结构化内容、撰写报告正文、制作数据图表说明”;
- 编辑 Agent:负责质量审核,角色定位为 “内容编辑”,任务包括 “检查报告逻辑是否通顺、修正错别字与格式错误、验证数据准确性”。
任务流转规则需明确 “谁先做、做完交给谁、遇到问题找谁”:
- 调研 Agent 完成数据收集后,将 “调研数据集” 传递给写作 Agent;
- 写作 Agent 基于调研数据完成初稿后,将 “报告初稿” 传递给编辑 Agent;
- 若编辑 Agent 发现数据错误(如某市场规模数据矛盾),则将 “错误反馈” 传回调研 Agent,调研 Agent 修正后重新流转;
- 编辑 Agent 审核通过后,将 “最终报告” 返回给用户。
4.2.2 用 CrewAI 构建多 Agent 系统:实践思路
CrewAI 是专注于多 Agent 协作的框架,支持快速定义 Agent 角色、分配任务、设置协作规则。以下以 “撰写 2024 年消费电子行业报告” 为例,展示多 Agent 系统的构建步骤:
步骤 1:安装 CrewAI 框架
pip install crewai # 安装CrewAI核心库pip install crewai-tools # 安装配套工具库(如搜索工具、文档工具)
步骤 2:定义 Agent 角色与能力
from crewai import Agent, Task, Crewfrom crewai_tools import SerperDevTool # 搜索工具(需申请Serper API Key)# 1. 定义调研Agentresearch_agent = Agent( role="消费电子行业调研专家", goal="收集2024年消费电子行业的核心数据,包括市场规模、政策动态、竞品趋势", backstory="你拥有5年消费电子行业调研经验,擅长从权威渠道(如IDC、工信部报告、京东/天猫数据)获取精准数据,能快速筛选关键信息", tools=[SerperDevTool(api_key=os.getenv("SERPER_API_KEY"))] # 赋予搜索能力)# 2. 定义写作Agentwriting_agent = Agent( role="行业报告撰写分析师", goal="将调研数据转化为逻辑清晰、内容详实的行业报告,包含数据图表说明与趋势分析", backstory="你是资深行业分析师,曾撰写过数十份消费电子行业报告,擅长用通俗语言解读复杂数据,报告结构符合行业标准(含摘要、市场现状、趋势预测、结论)")# 3. 定义编辑Agentediting_agent = Agent( role="报告编辑专家", goal="审核报告的逻辑连贯性、数据准确性、格式规范性,修正错误并提出优化建议", backstory="你拥有10年内容编辑经验,专注于行业报告审核,对数据矛盾、逻辑漏洞、格式错误敏感,能确保报告符合专业标准")
步骤 3:分配任务与设置流转规则
# 1. 调研任务:收集行业数据research_task = Task( description="1. 查找2024年全球消费电子行业市场规模数据(单位:亿美元)及同比增长率;2. 整理2024年中国消费电子行业相关政策(如补贴、技术标准);3. 统计Top3消费电子品牌(苹果、三星、华为)2024年Q3的销量占比;4. 将数据整理为表格格式,标注来源", agent=research_agent, output_file="research_data.csv"# 调研结果保存为CSV文件)# 2. 写作任务:基于调研数据撰写报告(依赖调研任务完成)writing_task = Task( description="基于research_data.csv中的数据,撰写《2024年消费电子行业报告》,要求:1. 报告字数2000字以内;2. 包含摘要(100字)、市场现状(含数据图表)、政策影响分析、未来趋势预测(2025年)、结论;3. 数据引用需标注来源(如“据IDC数据显示...”)", agent=writing_agent, dependencies=[research_task], # 依赖调研任务完成 output_file="industry_report.md"# 报告保存为Markdown文件)# 3. 编辑任务:审核报告(依赖写作任务完成)editing_task = Task( description="审核industry_report.md:1. 检查数据是否与research_data.csv一致(如市场规模数值、销量占比);2. 修正错别字、语法错误与格式问题(如标题层级、表格对齐);3. 优化报告逻辑(如趋势预测是否有数据支撑);4. 生成审核后的最终报告", agent=editing_agent, dependencies=[writing_task], # 依赖写作任务完成 output_file="final_industry_report.md"# 最终报告保存路径)
步骤 4:启动多 Agent 协作
# 创建Crew(协作团队)并启动任务crew = Crew( agents=[research_agent, writing_agent, editing_agent], tasks=[research_task, writing_task, editing_task], verbose=True# 打印协作过程日志)# 启动协作,执行任务result = crew.kickoff()print("多Agent协作完成,最终报告路径:final_industry_report.md")
4.2.3 多 Agent 协作的关键注意事项
- 避免角色重叠:每个 Agent 的任务需明确边界,例如 “调研 Agent” 仅负责收集数据,不参与报告撰写,防止任务混乱;
- 明确依赖关系:通过 “dependencies” 参数设置任务先后顺序,避免 “写作 Agent” 在调研数据未完成时提前启动;
- 控制沟通成本:多 Agent 间的消息传递需简洁,仅传递 “任务结果”(如调研数据、初稿文档),避免冗余信息干扰决策。
4.3 常见挑战与解决方案:攻克开发中的 “拦路虎”
在 AI Agent 开发与落地过程中,常会遇到 “无限循环、工具选择错误、高延迟与成本” 等问题。以下针对每个挑战,提供具体的诊断方法与解决方案。
4.3.1 挑战 1:无限循环 ——Agent 陷入 “重复行动”
现象:Agent 在 “思考→行动→观察” 的循环中反复执行同一操作,无法推进任务。例如,调用天气 API 时,因城市名称错误,Agent 反复重试却不询问用户,导致无限循环。
原因:
- 未设置 “循环终止条件”,Agent 不知道何时停止重试;
- 错误处理逻辑缺失,无法识别 “需要用户干预” 的错误(如城市名称错误)。
解决方案:
- 设置最大迭代次数:为 Agent 的循环过程添加 “最大步数限制”,例如,设置 “最多执行 5 次行动,若仍未完成任务则停止并提示用户”;
- 定义 “终止触发条件”:明确哪些情况属于 “任务无法继续”,需终止循环。例如,当 Agent 连续 2 次调用工具返回相同错误(如 “城市名称错误”),则触发终止,询问用户确认城市名称;
代码示例:添加循环终止机制
def agent_execution_loop(user_query, max_iterations=5): iteration = 0 current_state = {"query": user_query, "result": None, "error": None} while iteration < max_iterations: iteration += 1 print(f"执行第{iteration}轮循环...") # 1. 思考:判断是否需要调用工具 thought = model.generate(f"用户需求:{current_state['query']},当前结果:{current_state['result']},是否需要调用工具?若需要,说明工具类型与参数;若不需要,直接生成回答") if"不需要调用工具"in thought: # 无需工具,生成最终回答 final_answer = model.generate(f"基于用户需求{current_state['query']},生成自然语言回答:") return final_answer # 2. 行动:调用工具 try: tool_result = call_tool(thought) # 根据思考结果调用对应工具 current_state["result"] = tool_result current_state["error"] = None except Exception as e: current_state["error"] = str(e) print(f"工具调用错误:{e}") # 3. 判断是否需要终止:连续2次相同错误 if iteration >= 2and current_state["error"] == previous_error: returnf"任务执行遇到持续错误:{current_state['error']},请确认输入信息(如城市名称、API密钥)后重试" previous_error = current_state["error"] # 达到最大迭代次数 return f"任务执行超时(已尝试{</doubaocanvas>
总结
通过本篇文章,相信你已经掌握了AI Agent的核心概念:规划、记忆和工具使用。你了解了构建Agent的ReAct范式和主流技术栈(如LangChain),并且亲手构建了一个能够解决实际问题的Agent,以及对多Agent架构的理解。
如果对Agent想要学的更多,可以参考以下能力,尝试自己实现:
- 一个能帮你自动总结网页内容的Agent。
- 一个能连接飞书文档/印象笔记,帮你自动整理笔记的Agent。
- 一个能监控商品价格,在降价时自动提醒你的Agent。
AI Agent技术将解决问题的主动权交到了我们手中。现在,我们不仅是使用者,更是创造者。
如果帮助,感谢点赞,关注,转发,评论!