
文章目录
-
- [一、一句话看懂 Agent](#一、一句话看懂 Agent)
- [二、Agent 的核心架构(必看流程图)](#二、Agent 的核心架构(必看流程图))
- [三、Agent 的 5 大核心组件](#三、Agent 的 5 大核心组件)
-
- [3.1 大语言模型(LLM)------ 大脑](#3.1 大语言模型(LLM)—— 大脑)
- [3.2 规划模块 ------ 任务拆解](#3.2 规划模块 —— 任务拆解)
- [3.3 记忆模块 ------ 经验存储](#3.3 记忆模块 —— 经验存储)
- [3.4 工具模块 ------ 手脚](#3.4 工具模块 —— 手脚)
- [3.5 反思模块 ------ 自我纠错](#3.5 反思模块 —— 自我纠错)
- [四、Agent 的工作流程(附完整流程图)](#四、Agent 的工作流程(附完整流程图))
- [五、手把手写一个 Agent(完整代码)](#五、手把手写一个 Agent(完整代码))
-
- [5.1 环境准备](#5.1 环境准备)
- [5.2 基础 Agent(20 行代码)](#5.2 基础 Agent(20 行代码))
- [5.3 带记忆的 Agent(更实用)](#5.3 带记忆的 Agent(更实用))
- [5.4 自定义工具(对接你的业务 API)](#5.4 自定义工具(对接你的业务 API))
- [六、Agent 的高级能力:记忆与工具](#六、Agent 的高级能力:记忆与工具)
-
- [6.1 长期记忆:向量数据库](#6.1 长期记忆:向量数据库)
- [6.2 工具调用示意图](#6.2 工具调用示意图)
- [七、主流 Agent 框架对比](#七、主流 Agent 框架对比)
- [八、Agent 的落地场景与案例](#八、Agent 的落地场景与案例)
-
- [8.1 自动化客服(含代码示例)](#8.1 自动化客服(含代码示例))
- [8.2 代码开发 Agent(自动写测试)](#8.2 代码开发 Agent(自动写测试))
- [8.3 数据分析 Agent](#8.3 数据分析 Agent)
- [8.4 实际应用案例汇总](#8.4 实际应用案例汇总)
- [九、Agent 的坑与解决方案](#九、Agent 的坑与解决方案)
-
- [9.1 死循环问题](#9.1 死循环问题)
- [9.2 成本失控](#9.2 成本失控)
- [9.3 幻觉导致错误操作](#9.3 幻觉导致错误操作)
- [9.4 工具调用超时](#9.4 工具调用超时)
- 十、未来展望与学习路线
-
- [10.1 Agent 的未来趋势](#10.1 Agent 的未来趋势)
- [10.2 学习路线图](#10.2 学习路线图)
- [10.3 推荐学习资源](#10.3 推荐学习资源)
- 结语
一、一句话看懂 Agent
Agent = 大模型(大脑) + 规划(拆解任务) + 记忆(经验) + 工具(手脚) + 自主执行
普通的大模型(如 ChatGPT)只会对话 ,而 Agent 会行动。
举个例子:
- 普通 LLM:你问"帮我订一张机票",它回答"好的,您可以去携程搜索"。
- Agent:你问"帮我订一张机票",它会自己打开浏览器、搜索航班、比较价格、填写信息、提交订单。
二、Agent 的核心架构(必看流程图)
下面这张 Mermaid 流程图展示了 Agent 的完整架构:
#mermaid-svg-fkVmFLzpCKwExFbv{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-fkVmFLzpCKwExFbv .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-fkVmFLzpCKwExFbv .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-fkVmFLzpCKwExFbv .error-icon{fill:#552222;}#mermaid-svg-fkVmFLzpCKwExFbv .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-fkVmFLzpCKwExFbv .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-fkVmFLzpCKwExFbv .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-fkVmFLzpCKwExFbv .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-fkVmFLzpCKwExFbv .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-fkVmFLzpCKwExFbv .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-fkVmFLzpCKwExFbv .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-fkVmFLzpCKwExFbv .marker{fill:#333333;stroke:#333333;}#mermaid-svg-fkVmFLzpCKwExFbv .marker.cross{stroke:#333333;}#mermaid-svg-fkVmFLzpCKwExFbv svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-fkVmFLzpCKwExFbv p{margin:0;}#mermaid-svg-fkVmFLzpCKwExFbv .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-fkVmFLzpCKwExFbv .cluster-label text{fill:#333;}#mermaid-svg-fkVmFLzpCKwExFbv .cluster-label span{color:#333;}#mermaid-svg-fkVmFLzpCKwExFbv .cluster-label span p{background-color:transparent;}#mermaid-svg-fkVmFLzpCKwExFbv .label text,#mermaid-svg-fkVmFLzpCKwExFbv span{fill:#333;color:#333;}#mermaid-svg-fkVmFLzpCKwExFbv .node rect,#mermaid-svg-fkVmFLzpCKwExFbv .node circle,#mermaid-svg-fkVmFLzpCKwExFbv .node ellipse,#mermaid-svg-fkVmFLzpCKwExFbv .node polygon,#mermaid-svg-fkVmFLzpCKwExFbv .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-fkVmFLzpCKwExFbv .rough-node .label text,#mermaid-svg-fkVmFLzpCKwExFbv .node .label text,#mermaid-svg-fkVmFLzpCKwExFbv .image-shape .label,#mermaid-svg-fkVmFLzpCKwExFbv .icon-shape .label{text-anchor:middle;}#mermaid-svg-fkVmFLzpCKwExFbv .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-fkVmFLzpCKwExFbv .rough-node .label,#mermaid-svg-fkVmFLzpCKwExFbv .node .label,#mermaid-svg-fkVmFLzpCKwExFbv .image-shape .label,#mermaid-svg-fkVmFLzpCKwExFbv .icon-shape .label{text-align:center;}#mermaid-svg-fkVmFLzpCKwExFbv .node.clickable{cursor:pointer;}#mermaid-svg-fkVmFLzpCKwExFbv .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-fkVmFLzpCKwExFbv .arrowheadPath{fill:#333333;}#mermaid-svg-fkVmFLzpCKwExFbv .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-fkVmFLzpCKwExFbv .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-fkVmFLzpCKwExFbv .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-fkVmFLzpCKwExFbv .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-fkVmFLzpCKwExFbv .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-fkVmFLzpCKwExFbv .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-fkVmFLzpCKwExFbv .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-fkVmFLzpCKwExFbv .cluster text{fill:#333;}#mermaid-svg-fkVmFLzpCKwExFbv .cluster span{color:#333;}#mermaid-svg-fkVmFLzpCKwExFbv div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-fkVmFLzpCKwExFbv .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-fkVmFLzpCKwExFbv rect.text{fill:none;stroke-width:0;}#mermaid-svg-fkVmFLzpCKwExFbv .icon-shape,#mermaid-svg-fkVmFLzpCKwExFbv .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-fkVmFLzpCKwExFbv .icon-shape p,#mermaid-svg-fkVmFLzpCKwExFbv .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-fkVmFLzpCKwExFbv .icon-shape .label rect,#mermaid-svg-fkVmFLzpCKwExFbv .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-fkVmFLzpCKwExFbv .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-fkVmFLzpCKwExFbv .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-fkVmFLzpCKwExFbv :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Agent 内部架构
反馈
提供上下文
记录经验
最终结果
用户输入任务
Agent 核心
大语言模型
大脑:理解与推理
规划模块
拆解任务
记忆模块
短期+长期
工具管理器
选择与调用工具
执行器
执行动作
反思模块
评估结果并调整
外部环境
具体工具
搜索/API/代码/数据库
架构说明:
- 大脑(LLM):理解用户意图
- 规划(Planner):把大任务拆成小步骤
- 记忆(Memory):记住历史信息和用户偏好
- 工具(Tools):真正去干活的手脚
- 反思(Reflector):检查结果对不对,不对就重来
三、Agent 的 5 大核心组件
3.1 大语言模型(LLM)------ 大脑
负责理解、推理、生成计划。目前常用的基座模型:
| 模型 | 特点 | 适合场景 |
|---|---|---|
| GPT-4 | 最强推理能力 | 复杂任务 |
| Claude-3 | 长上下文、安全 | 企业应用 |
| Qwen-72B | 开源、中文好 | 国内部署 |
| Llama-3 | 开源、可微调 | 学术研究 |
3.2 规划模块 ------ 任务拆解
规划模块把模糊的用户需求变成可执行的步骤序列。
示例 :
用户说:"帮我分析特斯拉股票,然后发邮件给老板"
Agent 拆解为:
- 调用股票 API 获取 TSLA 实时价格
- 计算涨跌幅和成交量
- 从新闻 API 获取相关新闻
- 用 LLM 生成分析摘要
- 调用邮件 API 发送给 boss@company.com
3.3 记忆模块 ------ 经验存储
Agent 的记忆分两种:
python
# 记忆的两种类型
class Memory:
short_term = [] # 当前任务的对话历史
long_term = { # 跨任务的持久信息
"user_preference": "喜欢早班飞机",
"saved_api_key": "sk-xxx",
"last_task_result": "..."
}
实现方式:
- 短期记忆:直接存在变量或 Redis
- 长期记忆:向量数据库(Chroma、Milvus)+ 语义检索
3.4 工具模块 ------ 手脚
工具是 Agent 与外部世界的接口。常见工具:
python
# 工具示例
tools = {
"web_search": "搜索互联网",
"calculator": "数学计算",
"run_python": "执行Python代码",
"database_query": "查询数据库",
"send_email": "发送邮件",
"browser": "控制浏览器"
}
3.5 反思模块 ------ 自我纠错
反思模块让 Agent 能够:
- 检查工具调用是否成功
- 判断当前结果是否满足用户需求
- 不满足时自动调整计划
四、Agent 的工作流程(附完整流程图)
下面这张流程图展示了 Agent 从收到任务到完成任务的完整闭环:
#mermaid-svg-99Uld0HQTbF2z4D3{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-99Uld0HQTbF2z4D3 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-99Uld0HQTbF2z4D3 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-99Uld0HQTbF2z4D3 .error-icon{fill:#552222;}#mermaid-svg-99Uld0HQTbF2z4D3 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-99Uld0HQTbF2z4D3 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-99Uld0HQTbF2z4D3 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-99Uld0HQTbF2z4D3 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-99Uld0HQTbF2z4D3 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-99Uld0HQTbF2z4D3 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-99Uld0HQTbF2z4D3 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-99Uld0HQTbF2z4D3 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-99Uld0HQTbF2z4D3 .marker.cross{stroke:#333333;}#mermaid-svg-99Uld0HQTbF2z4D3 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-99Uld0HQTbF2z4D3 p{margin:0;}#mermaid-svg-99Uld0HQTbF2z4D3 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-99Uld0HQTbF2z4D3 .cluster-label text{fill:#333;}#mermaid-svg-99Uld0HQTbF2z4D3 .cluster-label span{color:#333;}#mermaid-svg-99Uld0HQTbF2z4D3 .cluster-label span p{background-color:transparent;}#mermaid-svg-99Uld0HQTbF2z4D3 .label text,#mermaid-svg-99Uld0HQTbF2z4D3 span{fill:#333;color:#333;}#mermaid-svg-99Uld0HQTbF2z4D3 .node rect,#mermaid-svg-99Uld0HQTbF2z4D3 .node circle,#mermaid-svg-99Uld0HQTbF2z4D3 .node ellipse,#mermaid-svg-99Uld0HQTbF2z4D3 .node polygon,#mermaid-svg-99Uld0HQTbF2z4D3 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-99Uld0HQTbF2z4D3 .rough-node .label text,#mermaid-svg-99Uld0HQTbF2z4D3 .node .label text,#mermaid-svg-99Uld0HQTbF2z4D3 .image-shape .label,#mermaid-svg-99Uld0HQTbF2z4D3 .icon-shape .label{text-anchor:middle;}#mermaid-svg-99Uld0HQTbF2z4D3 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-99Uld0HQTbF2z4D3 .rough-node .label,#mermaid-svg-99Uld0HQTbF2z4D3 .node .label,#mermaid-svg-99Uld0HQTbF2z4D3 .image-shape .label,#mermaid-svg-99Uld0HQTbF2z4D3 .icon-shape .label{text-align:center;}#mermaid-svg-99Uld0HQTbF2z4D3 .node.clickable{cursor:pointer;}#mermaid-svg-99Uld0HQTbF2z4D3 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-99Uld0HQTbF2z4D3 .arrowheadPath{fill:#333333;}#mermaid-svg-99Uld0HQTbF2z4D3 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-99Uld0HQTbF2z4D3 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-99Uld0HQTbF2z4D3 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-99Uld0HQTbF2z4D3 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-99Uld0HQTbF2z4D3 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-99Uld0HQTbF2z4D3 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-99Uld0HQTbF2z4D3 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-99Uld0HQTbF2z4D3 .cluster text{fill:#333;}#mermaid-svg-99Uld0HQTbF2z4D3 .cluster span{color:#333;}#mermaid-svg-99Uld0HQTbF2z4D3 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-99Uld0HQTbF2z4D3 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-99Uld0HQTbF2z4D3 rect.text{fill:none;stroke-width:0;}#mermaid-svg-99Uld0HQTbF2z4D3 .icon-shape,#mermaid-svg-99Uld0HQTbF2z4D3 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-99Uld0HQTbF2z4D3 .icon-shape p,#mermaid-svg-99Uld0HQTbF2z4D3 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-99Uld0HQTbF2z4D3 .icon-shape .label rect,#mermaid-svg-99Uld0HQTbF2z4D3 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-99Uld0HQTbF2z4D3 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-99Uld0HQTbF2z4D3 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-99Uld0HQTbF2z4D3 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 有
是
否
是
否
是
否
否
是
否
用户输入任务
LLM 解析意图
规划:拆解为子任务
还有未完成的
子任务?
选择下一个子任务
是否需要
调用工具?
选择最合适的工具
调用工具 API
获取执行结果
执行成功?
是否重试?
记录错误
询问用户
更新记忆
结果满足
要求吗?
LLM 直接推理
重新规划该子任务
合并结果到最终输出
输出最终结果
任务完成
关键点:
- Agent 会循环执行"选任务 → 调工具 → 看结果 → 调整"直到完成
- 失败时有重试机制,避免一次失败就全部崩盘
- 反思模块(Evaluate)决定要不要重新规划
五、手把手写一个 Agent(完整代码)
这一节我们用 LangChain 从零实现一个能上网搜索 + 数学计算的 Agent。
5.1 环境准备
bash
pip install langchain langchain-community langchain-openai wikipedia duckduckgo-search
5.2 基础 Agent(20 行代码)
python
import os
from langchain_openai import ChatOpenAI
from langchain.agents import create_react_agent, AgentExecutor
from langchain.tools import Tool
from langchain import hub
# 1. 设置 API Key
os.environ["OPENAI_API_KEY"] = "your-key-here"
# 2. 定义两个工具
def search(query: str) -> str:
"""使用 DuckDuckGo 搜索"""
from duckduckgo_search import DDGS
with DDGS() as ddgs:
results = list(ddgs.text(query, max_results=2))
return str(results)
def calculate(expression: str) -> str:
"""计算数学表达式"""
try:
return str(eval(expression))
except Exception as e:
return f"计算错误: {e}"
# 3. 包装成 LangChain 工具
tools = [
Tool(name="Search", func=search, description="搜索互联网信息"),
Tool(name="Calculator", func=calculate, description="计算数学表达式,输入如 '2+3*4'")
]
# 4. 创建 LLM 和 Agent
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)
prompt = hub.pull("hwchase17/react") # 使用标准 ReAct prompt
agent = create_react_agent(llm, tools, prompt)
# 5. 创建执行器
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
# 6. 运行
result = agent_executor.invoke({
"input": "告诉我现在北京的气温,然后计算 20 度乘以 3 是多少"
})
print("最终答案:", result["output"])
运行时会看到类似输出:
> Entering new AgentExecutor chain...
我需要先搜索北京气温,然后计算20*3
Action: Search
Action Input: 北京实时气温
Observation: [{'title': '北京天气', 'body': '当前温度:25°C'}]
Thought: 已获取气温为25°C,现在计算20*3
Action: Calculator
Action Input: 20*3
Observation: 60
Thought: 我已经有答案了
Final Answer: 北京当前气温约25°C,20度乘以3等于60。
5.3 带记忆的 Agent(更实用)
python
from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationalRetrievalChain
from langchain.agents import ConversationalChatAgent
# 添加记忆
memory = ConversationBufferMemory(
memory_key="chat_history",
return_messages=True
)
# 创建带记忆的 Agent
agent_executor_with_memory = AgentExecutor(
agent=agent,
tools=tools,
memory=memory,
verbose=True,
max_iterations=5 # 最多执行5步,防止死循环
)
# 多轮对话测试
print(agent_executor_with_memory.invoke({"input": "我叫张三"}))
print(agent_executor_with_memory.invoke({"input": "我刚才说我叫什么?"}))
# 第二次会从记忆中召回"张三"
5.4 自定义工具(对接你的业务 API)
python
from langchain.tools import BaseTool
from pydantic import BaseModel, Field
class WeatherInput(BaseModel):
city: str = Field(description="城市名称,如'北京'")
class WeatherTool(BaseTool):
name = "weather_query"
description = "查询指定城市的实时天气"
args_schema = WeatherInput
def _run(self, city: str) -> str:
# 这里换成真实的天气 API
import requests
try:
# 示例:使用 wttr.in 免费天气 API
url = f"https://wttr.in/{city}?format=%C+%t"
response = requests.get(url, timeout=5)
return f"{city}天气:{response.text}"
except:
return f"{city}:无法获取天气"
# 使用自定义工具
tools.append(WeatherTool())
六、Agent 的高级能力:记忆与工具
6.1 长期记忆:向量数据库
当 Agent 需要记住跨会话的信息时(比如用户偏好、历史记录),需要用向量数据库:
python
from langchain.vectorstores import Chroma
from langchain.embeddings import OpenAIEmbeddings
from langchain.memory import VectorStoreRetrieverMemory
# 创建向量存储
embeddings = OpenAIEmbeddings()
vectorstore = Chroma(embedding_function=embeddings, persist_directory="./memory_db")
# 创建长期记忆
retriever = vectorstore.as_retriever(search_kwargs={"k": 3})
long_term_memory = VectorStoreRetrieverMemory(retriever=retriever)
# 保存重要信息
long_term_memory.save_context(
{"input": "用户偏好"},
{"output": "喜欢靠窗座位,素食主义者"}
)
# 检索记忆
relevant_memories = long_term_memory.load_memory_variables({"prompt": "订餐需求"})
print(relevant_memories)
6.2 工具调用示意图
API Tool LLM Agent User API Tool LLM Agent User #mermaid-svg-czDxGL7eKtkI7Psp{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-czDxGL7eKtkI7Psp .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-czDxGL7eKtkI7Psp .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-czDxGL7eKtkI7Psp .error-icon{fill:#552222;}#mermaid-svg-czDxGL7eKtkI7Psp .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-czDxGL7eKtkI7Psp .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-czDxGL7eKtkI7Psp .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-czDxGL7eKtkI7Psp .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-czDxGL7eKtkI7Psp .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-czDxGL7eKtkI7Psp .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-czDxGL7eKtkI7Psp .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-czDxGL7eKtkI7Psp .marker{fill:#333333;stroke:#333333;}#mermaid-svg-czDxGL7eKtkI7Psp .marker.cross{stroke:#333333;}#mermaid-svg-czDxGL7eKtkI7Psp svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-czDxGL7eKtkI7Psp p{margin:0;}#mermaid-svg-czDxGL7eKtkI7Psp .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-czDxGL7eKtkI7Psp text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-czDxGL7eKtkI7Psp .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-czDxGL7eKtkI7Psp .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-czDxGL7eKtkI7Psp .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-czDxGL7eKtkI7Psp .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-czDxGL7eKtkI7Psp #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-czDxGL7eKtkI7Psp .sequenceNumber{fill:white;}#mermaid-svg-czDxGL7eKtkI7Psp #sequencenumber{fill:#333;}#mermaid-svg-czDxGL7eKtkI7Psp #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-czDxGL7eKtkI7Psp .messageText{fill:#333;stroke:none;}#mermaid-svg-czDxGL7eKtkI7Psp .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-czDxGL7eKtkI7Psp .labelText,#mermaid-svg-czDxGL7eKtkI7Psp .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-czDxGL7eKtkI7Psp .loopText,#mermaid-svg-czDxGL7eKtkI7Psp .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-czDxGL7eKtkI7Psp .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-czDxGL7eKtkI7Psp .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-czDxGL7eKtkI7Psp .noteText,#mermaid-svg-czDxGL7eKtkI7Psp .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-czDxGL7eKtkI7Psp .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-czDxGL7eKtkI7Psp .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-czDxGL7eKtkI7Psp .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-czDxGL7eKtkI7Psp .actorPopupMenu{position:absolute;}#mermaid-svg-czDxGL7eKtkI7Psp .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-czDxGL7eKtkI7Psp .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-czDxGL7eKtkI7Psp .actor-man circle,#mermaid-svg-czDxGL7eKtkI7Psp line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-czDxGL7eKtkI7Psp :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 查一下北京的天气 理解意图 需要调用 weather_tool weather_tool(city="北京") GET /weather?city=beijing {"temp":25,"condition":"晴"} 格式化结果 将结果转为自然语言 "北京当前25℃,晴天" 北京当前25℃,晴天
七、主流 Agent 框架对比
| 框架 | 优势 | 劣势 | 适用场景 |
|---|---|---|---|
| LangChain | 生态最全,组件丰富 | 学习曲线陡,抽象多 | 通用 Agent 开发 |
| AutoGPT | 完全自主执行 | 容易陷入循环,成本高 | 实验、探索 |
| BabyAGI | 轻量级,易理解 | 功能简单 | 学习原理 |
| AutoGen | 多 Agent 协作强 | 文档相对少 | 复杂任务分工 |
| Semantic Kernel | 微软生态,C#支持 | Python 生态弱 | 企业 .NET 项目 |
| Dify | 可视化编排 | 定制性受限 | 快速原型 |
选型建议:
- 想快速上手 → LangChain
- 想做多 Agent 协作 → AutoGen
- 想看看自动化的极限 → AutoGPT
- 企业 .NET 环境 → Semantic Kernel
八、Agent 的落地场景与案例
8.1 自动化客服(含代码示例)
python
# 客服 Agent:能查询订单、退换货、转人工
class CustomerServiceAgent:
def __init__(self):
self.tools = {
"query_order": self.query_order,
"return_product": self.return_product,
"transfer_human": self.transfer_human
}
def query_order(self, order_id: str) -> str:
# 调用订单系统 API
return f"订单{order_id}状态:已发货,预计明天到达"
def return_product(self, order_id: str) -> str:
# 发起退货流程
return f"已为您发起退货申请,退款3-5天到账"
def transfer_human(self, reason: str) -> str:
# 转人工客服
return "正在为您转接人工客服,请稍候..."
8.2 代码开发 Agent(自动写测试)
python
# 自动为函数生成单元测试
def generate_tests(function_code: str) -> str:
prompt = f"""
为以下函数生成 pytest 单元测试:
{function_code}
要求:
- 覆盖正常情况和边界条件
- 包含参数校验
"""
response = llm.invoke(prompt)
return response.content
# 示例:为加法函数生成测试
test_code = generate_tests("def add(a,b): return a+b")
print(test_code)
8.3 数据分析 Agent
python
# 自动读取 CSV 并生成分析报告
def analyze_csv(file_path: str, query: str) -> str:
import pandas as pd
df = pd.read_csv(file_path)
# Agent 自动决定分析步骤
steps = [
"查看数据基本信息",
"计算统计量",
"根据用户 query 做可视化"
]
# 实际执行...
return f"分析结果:数据共{len(df)}行,{query}的结果是..."
8.4 实际应用案例汇总
| 行业 | 应用 | 效果 |
|---|---|---|
| 电商 | 自动处理退款、换货 | 减少 70% 人工客服 |
| 金融 | 自动生成财报分析 | 从 2 小时缩短到 5 分钟 |
| 医疗 | 病历摘要 + 用药提醒 | 减少医生文书时间 |
| 教育 | 自动出题 + 批改 | 可同时服务 1000+ 学生 |
九、Agent 的坑与解决方案
9.1 死循环问题
现象:Agent 反复执行相同的无效操作
解决方案:
python
# 设置最大迭代次数
agent_executor = AgentExecutor(
agent=agent,
tools=tools,
max_iterations=5, # 关键参数
early_stopping_method="force" # 强制停止
)
# 添加循环检测
class LoopDetector:
def __init__(self, max_repeats=3):
self.history = []
self.max_repeats = max_repeats
def check(self, action):
self.history.append(action)
if len(self.history) > self.max_repeats:
last_n = self.history[-self.max_repeats:]
if len(set(last_n)) == 1: # 连续相同动作
return True # 检测到循环
return False
9.2 成本失控
现象:一个任务调用几十次 LLM,API 费用飙升
解决方案:
python
# 设置 Token 预算
from langchain.callbacks import get_openai_callback
with get_openai_callback() as cb:
result = agent_executor.invoke({"input": "复杂任务"})
print(f"Token 使用: {cb.total_tokens}")
print(f"费用: ${cb.total_cost}")
# 费用超过阈值时告警
if cb.total_cost > 0.1:
send_alert("Agent 费用超限")
# 使用更便宜的模型
cheap_llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)
9.3 幻觉导致错误操作
现象:Agent 编造不存在的 API 或工具
解决方案:
python
# 方案1:限制工具白名单
allowed_tools = ["search", "calculator", "weather"]
agent_executor = AgentExecutor(
agent=agent,
tools=[t for t in tools if t.name in allowed_tools]
)
# 方案2:添加结果验证
def safe_execute(tool_name, input_str):
# 在执行前验证输入合法性
if tool_name == "delete_file" and ".." in input_str:
return "操作被拒绝:路径不合法"
# 执行...
9.4 工具调用超时
python
import timeout_decorator
@timeout_decorator.timeout(5) # 5秒超时
def call_api_with_timeout(url):
return requests.get(url, timeout=5)
# 在工具中使用
def safe_tool_call(tool_func, *args, **kwargs):
try:
return tool_func(*args, **kwargs)
except TimeoutError:
return "工具调用超时,请稍后重试"
except Exception as e:
return f"工具调用失败:{str(e)}"
十、未来展望与学习路线
10.1 Agent 的未来趋势
- 多模态 Agent:不仅能调用工具,还能看懂图片、视频
- 自我进化的 Agent:根据任务结果自动优化 prompt 和工具选择
- Agent 安全体系:沙箱执行、权限控制、审计日志成为标配
- 轻量级本地 Agent:手机、边缘设备也能跑 Agent
- Agent 市场:类似 App Store,用户可以下载各种专用 Agent
10.2 学习路线图
#mermaid-svg-fqHkfjzHoM9Oozbs{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-fqHkfjzHoM9Oozbs .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-fqHkfjzHoM9Oozbs .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-fqHkfjzHoM9Oozbs .error-icon{fill:#552222;}#mermaid-svg-fqHkfjzHoM9Oozbs .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-fqHkfjzHoM9Oozbs .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-fqHkfjzHoM9Oozbs .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-fqHkfjzHoM9Oozbs .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-fqHkfjzHoM9Oozbs .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-fqHkfjzHoM9Oozbs .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-fqHkfjzHoM9Oozbs .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-fqHkfjzHoM9Oozbs .marker{fill:#333333;stroke:#333333;}#mermaid-svg-fqHkfjzHoM9Oozbs .marker.cross{stroke:#333333;}#mermaid-svg-fqHkfjzHoM9Oozbs svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-fqHkfjzHoM9Oozbs p{margin:0;}#mermaid-svg-fqHkfjzHoM9Oozbs .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-fqHkfjzHoM9Oozbs .cluster-label text{fill:#333;}#mermaid-svg-fqHkfjzHoM9Oozbs .cluster-label span{color:#333;}#mermaid-svg-fqHkfjzHoM9Oozbs .cluster-label span p{background-color:transparent;}#mermaid-svg-fqHkfjzHoM9Oozbs .label text,#mermaid-svg-fqHkfjzHoM9Oozbs span{fill:#333;color:#333;}#mermaid-svg-fqHkfjzHoM9Oozbs .node rect,#mermaid-svg-fqHkfjzHoM9Oozbs .node circle,#mermaid-svg-fqHkfjzHoM9Oozbs .node ellipse,#mermaid-svg-fqHkfjzHoM9Oozbs .node polygon,#mermaid-svg-fqHkfjzHoM9Oozbs .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-fqHkfjzHoM9Oozbs .rough-node .label text,#mermaid-svg-fqHkfjzHoM9Oozbs .node .label text,#mermaid-svg-fqHkfjzHoM9Oozbs .image-shape .label,#mermaid-svg-fqHkfjzHoM9Oozbs .icon-shape .label{text-anchor:middle;}#mermaid-svg-fqHkfjzHoM9Oozbs .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-fqHkfjzHoM9Oozbs .rough-node .label,#mermaid-svg-fqHkfjzHoM9Oozbs .node .label,#mermaid-svg-fqHkfjzHoM9Oozbs .image-shape .label,#mermaid-svg-fqHkfjzHoM9Oozbs .icon-shape .label{text-align:center;}#mermaid-svg-fqHkfjzHoM9Oozbs .node.clickable{cursor:pointer;}#mermaid-svg-fqHkfjzHoM9Oozbs .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-fqHkfjzHoM9Oozbs .arrowheadPath{fill:#333333;}#mermaid-svg-fqHkfjzHoM9Oozbs .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-fqHkfjzHoM9Oozbs .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-fqHkfjzHoM9Oozbs .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-fqHkfjzHoM9Oozbs .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-fqHkfjzHoM9Oozbs .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-fqHkfjzHoM9Oozbs .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-fqHkfjzHoM9Oozbs .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-fqHkfjzHoM9Oozbs .cluster text{fill:#333;}#mermaid-svg-fqHkfjzHoM9Oozbs .cluster span{color:#333;}#mermaid-svg-fqHkfjzHoM9Oozbs div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-fqHkfjzHoM9Oozbs .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-fqHkfjzHoM9Oozbs rect.text{fill:none;stroke-width:0;}#mermaid-svg-fqHkfjzHoM9Oozbs .icon-shape,#mermaid-svg-fqHkfjzHoM9Oozbs .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-fqHkfjzHoM9Oozbs .icon-shape p,#mermaid-svg-fqHkfjzHoM9Oozbs .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-fqHkfjzHoM9Oozbs .icon-shape .label rect,#mermaid-svg-fqHkfjzHoM9Oozbs .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-fqHkfjzHoM9Oozbs .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-fqHkfjzHoM9Oozbs .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-fqHkfjzHoM9Oozbs :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Python 基础
大模型 API 使用
Prompt 工程
LangChain 入门
手写一个简单 Agent
理解 ReAct/CoT
添加记忆和工具
多 Agent 协作
生产环境部署
10.3 推荐学习资源
-
论文:
- ReAct: Synergizing Reasoning and Acting in Language Models
- Tree of Thoughts: Deliberate Problem Solving
-
开源项目:
-
实践建议:
- 先用 LangChain 跑通一个 Demo
- 尝试不用框架,自己实现简单的 ReAct 循环
- 给你的 Agent 加上一个真实 API(比如飞书、钉钉)
- 接入向量数据库实现长期记忆
结语
Agent 是 LLM 从"语言模型"走向"行动模型"的关键一步。虽然今天的 Agent 还不完美,会犯错、会绕路、会烧钱,但它已经展示了 AI 自主完成任务的惊人潜力。
如果你只记住一句话:Agent 让 AI 从"会聊天"变成了"会干活"。
技术的拐点往往出现在两个能力打通的那一刻 ------ 语言理解和行动执行,Agent 就是这个打通者。现在开始动手写你的第一个 Agent 吧,5 行代码就能让它帮你搜索、计算、发邮件。
未来已来,只是尚未均匀分布。而 Agent,正在加速这个分布过程。