Skip to content

Agent入门

[toc]

AI Agent(智能体)

是一种能够感知环境、自主决策并执行行动以实现特定目标的软件实体。与传统的程序不同,AI Agent 具备一定程度的自主性和适应性。

AI Agent(智能代理)是一种能够自主感知环境、做出决策并执行任务的AI系统。

Agent的工作流程

典型的Agent执行循环(ReAct模式):

Text Only
用户输入
思考 (Thought): 我需要做什么?
行动 (Action): 调用工具X
观察 (Observation): 工具返回结果Y
思考 (Thought): 结果是否满足需求?
[如果未完成] → 继续行动
[如果完成] → 生成最终答案

实际示例

任务:帮我找出公司最畅销的产品并分析原因

Text Only
Thought 1: 我需要先查询销售数据
Action 1: database_query("SELECT product, SUM(sales) FROM orders GROUP BY product ORDER BY SUM(sales) DESC LIMIT 5")
Observation 1: 返回前5名产品:[产品A: 1000万, 产品B: 800万, ...]

Thought 2: 产品A是最畅销的,我需要分析它的评价
Action 2: web_search("产品A 用户评价")
Observation 2: 找到300条评价,主要提到"性价比高"、"质量好"

Thought 3: 还需要查看竞品情况
Action 3: web_search("产品A 竞品对比")
Observation 3: 竞品价格普遍高20-30%

Thought 4: 我已经收集足够信息,可以总结了
Final Answer: 产品A是最畅销产品(销售额1000万),主要优势是...

Agent的核心组成部分

一个完整的AI Agent系统通常包含以下组件:

1. 大脑(LLM)

大语言模型作为Agent的"大脑",负责: - 理解用户意图 - 规划执行步骤 - 生成工具调用指令 - 总结和呈现结果

2. 记忆(Memory)

Agent需要记住: - 短期记忆:当前对话的上下文 - 长期记忆:历史对话、用户偏好 - 工作记忆:执行过程中的中间结果

Python
memory = {
    "short_term": "用户刚才问了关于北京天气的问题",
    "long_term": "用户喜欢历史文化景点,预算中等",
    "working": "已查询到机票价格,正在搜索酒店"
}

3. 工具箱(Tools)

Agent可以使用的外部工具:

Python
tools = [
    "web_search",      # 网页搜索
    "calculator",      # 计算器
    "code_executor",   # 代码执行
    "database_query",  # 数据库查询
    "api_caller",      # API调用
    "file_reader",     # 文件读取
    # ... 更多工具
<div markdown="1" style="margin-top: -30px; font-size: 0.75em; opacity: 0.7;">
:material-circle-edit-outline:  1698 个字 :fontawesome-solid-code: 245 行代码 :material-clock-time-two-outline: 预计阅读时间 9 分钟
</div>
]

4. 规划器(Planner)

负责将复杂任务分解成可执行的步骤:

Text Only
任务:分析公司Q3销售数据

规划:
Step 1: 从数据库查询Q3销售数据
Step 2: 使用Python计算同比增长率
Step 3: 生成可视化图表
Step 4: 总结关键发现
Step 5: 撰写分析报告

5. 执行器(Executor)

按照计划执行每一步,并处理结果:

Python
for step in plan:
    result = execute_step(step)
    if result.success:
        continue
    else:
        replan()  # 失败则重新规划

Agent的类型

1. ReAct Agent(推理+行动)

最常见的Agent类型,交替进行思考和行动。

优点:过程透明,易于调试 缺点:可能产生冗余步骤

Python
# 伪代码示例
while not task_complete:
    thought = llm.think(current_state)
    action = llm.decide_action(thought)
    observation = execute(action)
    current_state.update(observation)

2. Plan-and-Execute Agent(规划-执行)

先制定完整计划,再逐步执行。

优点:效率高,步骤清晰 缺点:计划可能不完美,需要调整机制

Python
# 先规划
plan = llm.create_plan(task)  
# [步骤1, 步骤2, 步骤3, ...]

# 再执行
for step in plan:
    result = execute(step)
    if not result.success:
        plan = llm.replan(task, current_progress)

3. Self-Ask Agent(自问自答)

通过提问和回答的方式分解问题。

Text Only
问题:埃菲尔铁塔建造时法国总统是谁?

Are follow up questions needed? Yes
Follow up: 埃菲尔铁塔什么时候建造?
Intermediate answer: 1887-1889年
Follow up: 1887年法国总统是谁?
Intermediate answer: 儒勒·格雷维
So the final answer is: 儒勒·格雷维

4. Multi-Agent System(多智能体系统)

多个专门化的Agent协作完成任务。

Text Only
用户任务
协调Agent → 分配给:
  ├─ 研究Agent(负责信息收集)
  ├─ 分析Agent(负责数据分析)
  ├─ 写作Agent(负责撰写报告)
  └─ 审核Agent(负责质量检查)

实现一个简单的Agent

下面是一个使用LangChain实现的基础Agent:

Python
# 安装依赖
# pip install langchain openai duckduckgo-search

from langchain.agents import AgentExecutor, create_react_agent
from langchain.tools import Tool
from langchain_openai import ChatOpenAI
from langchain import hub

# 1. 定义工具
def calculator(expression):
    """计算数学表达式"""
    try:
        return str(eval(expression))
    except:
        return "计算错误"

def web_search(query):
    """网页搜索(简化版)"""
    from duckduckgo_search import DDGS
    results = DDGS().text(query, max_results=3)
    return "\n".join([r['body'] for r in results])

tools = [
    Tool(
        name="Calculator",
        func=calculator,
        description="用于数学计算。输入数学表达式,如 '2 + 2' 或 '10 * 5'"
    ),
    Tool(
        name="Search",
        func=web_search,
        description="用于搜索最新信息。输入搜索关键词"
    )
]

# 2. 初始化LLM
llm = ChatOpenAI(model="gpt-4", temperature=0)

# 3. 获取提示词模板
prompt = hub.pull("hwchase17/react")

# 4. 创建Agent
agent = create_react_agent(llm, tools, prompt)
agent_executor = AgentExecutor(
    agent=agent,
    tools=tools,
    verbose=True,  # 显示思考过程
    max_iterations=10
)

# 5. 执行任务
result = agent_executor.invoke({
    "input": "2024年巴黎奥运会有多少参赛国家?这个数字乘以3是多少?"
})

print(result["output"])

执行过程示例:

Text Only
> Entering new AgentExecutor chain...

Thought: 我需要先搜索2024年巴黎奥运会的参赛国家数量
Action: Search
Action Input: "2024年巴黎奥运会参赛国家数量"
Observation: 2024年巴黎奥运会共有206个国家和地区参赛...

Thought: 我知道是206个国家,现在需要计算206乘以3
Action: Calculator
Action Input: 206 * 3
Observation: 618

Thought: 我现在知道最终答案了
Final Answer: 2024年巴黎奥运会有206个参赛国家,这个数字乘以3是618。

> Finished chain.

Agent的应用场景

数据分析 Agent

  • 自动读取数据
  • 分析趋势
  • 输出结论

办公自动化 Agent

  • 写周报 / PPT
  • 汇总会议纪要
  • 整理文档

企业内部 AI 员工

  • 客服 Agent
  • 运维 Agent
  • 财务 / HR Agent

编程 Agent

  • 写代码
  • Debug
  • 生成测试
  • 自动提交 PR

研究助手 todo:

场景:文献检索、信息整合、报告撰写

Python
任务研究量子计算的最新进展

Agent执行
1. 搜索相关论文和新闻
2. 阅读并提取关键信息
3. 对比不同观点
4. 整合信息
5. 生成综述报告

客户服务Agent

场景:处理客户咨询、问题解决、订单跟踪

Python
客户我的订单什么时候到

Agent执行
1. 查询订单号
2. 检查物流状态
3. 如果延迟查询原因
4. 提供解决方案
5. 记录对话更新工单

常见问题与解决方案

1. Agent陷入循环

问题:Agent重复执行相同的无效操作

解决方案

Python
# 记录已执行的操作
executed_actions = set()

def check_repetition(action):
    action_key = f"{action.tool}:{action.input}"
    if action_key in executed_actions:
        return "已经尝试过这个操作,请换一种方法"
    executed_actions.add(action_key)
    return None

2. 工具选择不准确

问题:Agent选择了错误的工具

解决方案: - 改进工具描述,增加示例 - 在提示词中明确工具的使用场景 - 使用Few-shot示例教Agent正确选择

Python
examples = """
示例1:
任务: 今天天气怎么样?
正确工具: web_search
错误工具: calculator

示例2:
任务: 计算10加20
正确工具: calculator
错误工具: web_search
"""

3. 响应速度慢

问题:Agent需要多次调用LLM,耗时长

解决方案: - 使用更快的模型处理简单任务 - 缓存常见查询结果 - 并行执行独立的工具调用 - 优化工具本身的性能

4. 成本控制

问题:频繁调用API导致成本高

解决方案

Python
# 设置token限制
llm = ChatOpenAI(
    model="gpt-3.5-turbo",  # 使用更便宜的模型
    max_tokens=500,          # 限制输出长度
)

# 实现缓存
from langchain.cache import InMemoryCache
langchain.llm_cache = InMemoryCache()

# 监控使用情况
def track_usage(callback):
    total_tokens = callback.total_tokens
    cost = total_tokens * 0.000002  # 估算成本
    log_usage(cost)

5. 安全性问题

问题:Agent可能执行危险操作

解决方案

Python
# 危险操作白名单
ALLOWED_OPERATIONS = [
    "read_file",
    "search_web",
    "query_database"
]

FORBIDDEN_OPERATIONS = [
    "delete_file",
    "execute_system_command",
    "modify_database"
]

def validate_action(action):
    if action.tool in FORBIDDEN_OPERATIONS:
        return "此操作不被允许"
    return None

进阶话题

1. 多模态Agent

支持处理图像、音频、视频的Agent:

Python
tools = [
    ImageAnalysisTool(),      # 分析图片内容
    TextToSpeechTool(),       # 文本转语音
    VideoSummaryTool(),       # 视频总结
    OCRTool(),                # 图片文字识别
]

# 任务:分析这张图片并朗读内容

2. 自主学习Agent

Agent可以从经验中学习优化:

Python
# 记录成功的执行路径
successful_patterns = {
    "数据分析任务": ["query_db", "calculate", "visualize"],
    "信息检索任务": ["search", "summarize", "cite_sources"]
}

# 下次遇到相似任务时参考
def get_suggested_plan(task_type):
    return successful_patterns.get(task_type, None)

3. 人机协作Agent

Agent在关键决策点请求人类确认:

Python
def execute_with_human_in_loop(action):
    if action.requires_confirmation:
        print(f"准备执行:{action.description}")
        confirm = input("是否继续?(y/n): ")
        if confirm.lower() != 'y':
            return "操作已取消"
    return action.execute()

4. 分层Agent架构

Text Only
主Agent(协调者)
├─ 专家Agent 1(负责数据分析)
├─ 专家Agent 2(负责文档生成)
└─ 专家Agent 3(负责质量检查)
Python
class MasterAgent:
    def __init__(self):
        self.specialists = {
            "data": DataAnalystAgent(),
            "writing": WritingAgent(),
            "qa": QualityAssuranceAgent()
        }

    def delegate(self, task):
        task_type = self.classify_task(task)
        specialist = self.specialists[task_type]
        return specialist.execute(task)

开发Agent的最佳实践

1. 从简单开始

Python
# 第一版:最小可行Agent
simple_agent = Agent(
    llm=llm,
    tools=[search_tool],  # 只有一个工具
    max_iterations=5
)

# 测试稳定后逐步添加功能

2. 全面的日志记录

Python
import logging

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

def execute_action(action):
    logger.info(f"执行动作: {action.tool} - {action.input}")
    result = action.run()
    logger.info(f"结果: {result[:100]}...")  # 记录前100字符
    return result

3. 单元测试

Python
def test_agent_basic_calculation():
    result = agent.run("计算 25 * 4")
    assert "100" in result

def test_agent_web_search():
    result = agent.run("搜索Python是什么")
    assert "编程语言" in result.lower()

def test_agent_error_handling():
    result = agent.run("计算 abc + xyz")
    assert "错误" in result or "无法计算" in result

4. 版本控制你的提示词

Python
# prompts/v1.txt
你是一个助手...

# prompts/v2.txt(改进版)
你是一个专业的任务执行助手...

# 使用版本管理
PROMPT_VERSION = "v2"
prompt = load_prompt(f"prompts/{PROMPT_VERSION}.txt")

5. 监控和分析

Python
metrics = {
    "total_tasks": 0,
    "successful_tasks": 0,
    "average_steps": 0,
    "tool_usage": {},
}

def track_execution(agent_result):
    metrics["total_tasks"] += 1
    if agent_result.success:
        metrics["successful_tasks"] += 1
    # ... 更多指标

学习路径建议

阶段一:理解基础(1-2周)

  1. 学习LLM的基本概念
  2. 了解ReAct框架
  3. 实现一个简单的计算器Agent
  4. 理解工具调用机制

实践项目:构建一个能搜索和计算的简单Agent

阶段二:掌握框架(2-4周)

  1. 深入学习LangChain或其他Agent框架
  2. 尝试不同类型的工具
  3. 实现记忆机制
  4. 优化提示词

实践项目:构建个人助理Agent(日程管理+信息查询)

阶段三:进阶应用(4-8周)

  1. 多Agent协作
  2. 自定义复杂工具
  3. 长期记忆和学习
  4. 人机协作设计

实践项目:行业专用Agent(如数据分析助手、客服系统)

阶段四:生产部署(持续)

  1. 性能优化
  2. 成本控制
  3. 安全性加固
  4. 监控和维护

推荐资源

框架和工具

  • LangChain:最流行的Agent开发框架
  • AutoGPT:自主任务执行的先驱项目
  • CrewAI:多Agent协作框架
  • BabyAGI:轻量级任务驱动Agent
  • Semantic Kernel:微软的Agent框架

学习材料

用模型检测模型, 失败率降低到: 0.1 * 0.1 *0.1 = 0.001