Agent 到底是什么?—— 从概念到实践的全面解析

文章目录

    • [一、一句话看懂 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 拆解为:

  1. 调用股票 API 获取 TSLA 实时价格
  2. 计算涨跌幅和成交量
  3. 从新闻 API 获取相关新闻
  4. 用 LLM 生成分析摘要
  5. 调用邮件 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 的未来趋势

  1. 多模态 Agent:不仅能调用工具,还能看懂图片、视频
  2. 自我进化的 Agent:根据任务结果自动优化 prompt 和工具选择
  3. Agent 安全体系:沙箱执行、权限控制、审计日志成为标配
  4. 轻量级本地 Agent:手机、边缘设备也能跑 Agent
  5. 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
  • 开源项目

  • 实践建议

    1. 先用 LangChain 跑通一个 Demo
    2. 尝试不用框架,自己实现简单的 ReAct 循环
    3. 给你的 Agent 加上一个真实 API(比如飞书、钉钉)
    4. 接入向量数据库实现长期记忆

结语

Agent 是 LLM 从"语言模型"走向"行动模型"的关键一步。虽然今天的 Agent 还不完美,会犯错、会绕路、会烧钱,但它已经展示了 AI 自主完成任务的惊人潜力。

如果你只记住一句话:Agent 让 AI 从"会聊天"变成了"会干活"。

技术的拐点往往出现在两个能力打通的那一刻 ------ 语言理解和行动执行,Agent 就是这个打通者。现在开始动手写你的第一个 Agent 吧,5 行代码就能让它帮你搜索、计算、发邮件。

未来已来,只是尚未均匀分布。而 Agent,正在加速这个分布过程。

相关推荐
码农小白AI1 小时前
农产品安全新标准:土壤溯源联动农残检测,IACheck 助力 AI 报告审核实现上下游数据精准对齐
人工智能·安全
lars_lhuan1 小时前
AI 工作团队
人工智能
iNeuOS工业互联网1 小时前
iNeuOS_AiInsight·数智灵鉴(Text2SQL/NL2SQL自然语言大模型智能问数),免费下载试用
大数据·数据库·人工智能·智能制造·工业互联网·ineuos
【建模先锋】1 小时前
强噪声故障诊断新思路!从频域降噪到故障分类:FusADFaultClassifier 自适应谱降噪分类模型详解
人工智能·深度学习·分类·数据挖掘·信号处理·故障诊断·降噪算法
AI品信智慧数智人1 小时前
AI交互新突破!数字人语音交互系统实现数字展厅设备实时智能管控✨
人工智能
机器学习之心1 小时前
基于LSTM-Attention的轴承剩余寿命预测:从振动信号到RUL的端到端MATLAB实现
人工智能·matlab·lstm·轴承剩余寿命预测
不做无法实现的梦~1 小时前
无人机仿真软件与气球仿真实现
人工智能·机器人·自动驾驶
承渊政道1 小时前
【从零开始大模型开发与微调:基于PyTorch与ChatGLM】(新时代的曙光之大模型与人工智能)
人工智能·pytorch·python·深度学习·机器学习·语言模型·自然语言处理
陆业聪1 小时前
WebView性能优化与稳定性治理:预热、复用池与崩溃防护
人工智能·aigc