AI Agent实战系列·第1篇
从源码拆解Agent与普通聊天机器人的本质区别

写在前面

本文你将收获:

  • ✅ 5分钟理解AI Agent到底是什么
  • ✅ 看懂Agent与ChatGPT的3个核心区别
  • ✅ 用100行代码实现一个能干活的AI
  • ✅ 运行你的第一个Agent程序

一、一个真实的场景

想象一下,你现在需要完成这样一个任务:

“帮我分析一下昨天的销售数据,计算总营收,找出销量最高的3个产品,然后给老板发个邮件汇报。”

用ChatGPT怎么做?

你可能需要这样操作:

  1. 手动打开Excel,导出数据
  2. 复制数据到ChatGPT,让它分析
  3. ChatGPT给你结果
  4. 你再手动整理格式
  5. 打开邮箱,粘贴内容
  6. 检查格式,发送邮件

整个过程需要人工参与6个步骤。


用AI Agent怎么做?

你:帮我分析昨天的销售数据并发邮件给老板

Agent:收到!让我来处理
  → 正在读取数据库...
  → 正在分析数据...
  → 计算完成:总营收 ¥125,340
  → 销量Top3:产品A、产品B、产品C
  → 正在生成邮件...
  → 邮件已发送!

整个过程全自动,你只需要一句话。

这就是AI Agent的魔力 —— 它不仅会"想",还会"做"。


二、什么是AI Agent?

2.1 一句话定义

AI Agent = 大语言模型的"大脑" + 工具的"手脚" + 自主决策的能力

让我们拆解一下:

组成部分 作用 类比
🧠 大语言模型 思考、规划、决策 人的大脑
🛠️ 工具系统 执行具体操作 人的手脚
🔄 反馈循环 根据结果调整策略 人的学习能力

2.2 用代码理解

一个最简单的Agent长这样:

def simple_agent(task):
    while not task_completed:
        # 1. 思考:下一步做什么?
        thought = llm.think(task)
        
        # 2. 行动:使用工具执行
        result = use_tool(thought.action)
        
        # 3. 反馈:根据结果继续思考
        task = update_task(result)
    
    return final_result

核心是这个循环:想 → 做 → 看结果 → 再想 → 再做…

这和人类解决问题的方式一模一样!


三、Agent vs ChatGPT:三个本质区别

很多人会困惑:ChatGPT不就是AI吗?Agent和它有什么不同?

区别1️⃣:被动 vs 主动

ChatGPT(被动响应):

你:帮我查一下明天的天气
ChatGPT:抱歉,我无法访问实时信息...

Agent(主动执行):

你:帮我查一下明天的天气
Agent:
  → 调用天气API...
  → 明天北京:晴,15-25℃
  → 建议穿薄外套

区别2️⃣:单轮 vs 多轮推理

ChatGPT: 一问一答,每次对话相对独立

Agent: 像下棋一样,会提前规划多步:

任务:订一张去上海的机票

Agent的思考过程:
第1步:先查我的日程,看什么时候有空
第2步:搜索那天的航班信息
第3步:比较价格和时间
第4步:选择最优方案
第5步:调用订票API
第6步:发送确认邮件

区别3️⃣:纯文本 vs 真实世界交互

能力 ChatGPT AI Agent
读取文件
操作数据库
发送邮件
调用API
生成图片
控制软件

💡 关键洞察: ChatGPT是"大脑",Agent是"大脑+身体"。


四、Agent的工作原理:感知-决策-执行循环

所有的AI Agent,无论多复杂,都遵循这个基本循环:

┌─────────────────────────────────────┐
│                                     │
│  1. 感知 (Perception)               │
│     ↓                               │
│  2. 决策 (Decision)                 │
│     ↓                               │
│  3. 执行 (Action)                   │
│     ↓                               │
│  4. 观察结果 (Observation)          │
│     ↓                               │
└─────┘ (循环回到第1步)               │

实际例子解析

任务: “帮我计算 (123 + 456) × 789”

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
【第1轮】
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

💭 Agent思考:
   "我需要先计算123+456,然后再乘以789"

🔧 Agent行动:
   使用计算器工具
   calculator(123 + 456)

👀 观察结果:
   "计算结果是 579"

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
【第2轮】
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

💭 Agent思考:
   "现在我需要用579乘以789"

🔧 Agent行动:
   calculator(579 × 789)

👀 观察结果:
   "计算结果是 456,831"

✅ 任务完成!最终答案:456,831

看到了吗?Agent会自己拆解任务,一步步执行,直到完成目标


五、动手实践:100行代码实现你的第一个Agent

理论说再多不如实际跑一遍。现在我们来实现一个真正能用的Agent。

5.1 准备工作

# 安装依赖
pip install openai
# 设置API Key
import openai
openai.api_key = "你的OpenAI密钥"

5.2 完整代码

"""
一个100行的最小Agent实现
功能:可以使用计算器和搜索工具
"""

import openai
import re

class MinimalAgent:
    def __init__(self, tools):
        self.tools = {t["name"]: t["func"] for t in tools}
        self.history = []
    
    def run(self, task, max_steps=10):
        """执行任务"""
        print(f"\n{'='*50}")
        print(f"🎯 任务: {task}")
        print(f"{'='*50}\n")
        
        # 初始化对话
        self.history = [
            {"role": "system", "content": self._system_prompt()},
            {"role": "user", "content": task}
        ]
        
        # 主循环
        for step in range(1, max_steps + 1):
            print(f"【第{step}轮】")
            
            # 1. 让LLM思考
            response = self._call_llm()
            print(f"💭 思考: {response}\n")
            
            # 2. 检查是否完成
            if "FINISH:" in response:
                answer = response.split("FINISH:")[1].strip()
                print(f"✅ 完成!答案: {answer}")
                return answer
            
            # 3. 解析并执行工具
            tool_name, args = self._parse_action(response)
            if tool_name:
                result = self._execute_tool(tool_name, args)
                print(f"🔧 使用工具: {tool_name}({args})")
                print(f"📊 结果: {result}\n")
                
                # 4. 将结果反馈给LLM
                self.history.append({"role": "assistant", "content": response})
                self.history.append({"role": "user", "content": f"观察: {result}"})
        
        return "任务未完成"
    
    def _call_llm(self):
        """调用大语言模型"""
        response = openai.ChatCompletion.create(
            model="gpt-3.5-turbo",
            messages=self.history,
            temperature=0
        )
        return response.choices[0].message.content
    
    def _parse_action(self, response):
        """解析工具调用"""
        # 匹配格式: USE_TOOL: tool_name(arguments)
        match = re.search(r"USE_TOOL:\s*(\w+)\((.*?)\)", response)
        if match:
            return match.group(1), match.group(2)
        return None, None
    
    def _execute_tool(self, tool_name, args):
        """执行工具"""
        if tool_name in self.tools:
            return self.tools[tool_name](args)
        return f"错误: 工具 {tool_name} 不存在"
    
    def _system_prompt(self):
        """系统提示词"""
        tool_desc = "\n".join([
            f"- {name}" for name in self.tools.keys()
        ])
        
        return f"""你是一个AI助手,可以使用以下工具:
{tool_desc}

使用工具的格式:
USE_TOOL: tool_name(arguments)

完成任务后的格式:
FINISH: 你的最终答案

一步步思考,清晰说明你的推理过程。"""

# ========== 定义工具 ==========

def calculator(expression):
    """计算器工具"""
    try:
        result = eval(expression)
        return str(result)
    except:
        return "计算错误"

def search(query):
    """搜索工具(模拟)"""
    # 实际应该调用搜索API
    return f"关于'{query}'的搜索结果:[模拟数据]"

# ========== 使用示例 ==========

if __name__ == "__main__":
    # 创建Agent
    agent = MinimalAgent(tools=[
        {"name": "calculator", "func": calculator},
        {"name": "search", "func": search}
    ])
    
    # 执行任务
    result = agent.run("计算 (25 + 75) × 4 的结果")
    
    print(f"\n{'='*50}")
    print(f"最终结果: {result}")
    print(f"{'='*50}")

5.3 运行效果

==================================================
🎯 任务: 计算 (25 + 75) × 4 的结果
==================================================

【第1轮】
💭 思考: 我需要先计算 25 + 75,然后将结果乘以 4

🔧 使用工具: calculator(25 + 75)
📊 结果: 100

【第2轮】
💭 思考: 现在我需要将 100 乘以 4

🔧 使用工具: calculator(100 * 4)
📊 结果: 400

【第3轮】
💭 思考: 计算完成
FINISH: 400

✅ 完成!答案: 400

==================================================
最终结果: 400
==================================================

六、代码解析:Agent的4个关键部分

1. 系统提示词(System Prompt)

def _system_prompt(self):
    return f"""你是一个AI助手,可以使用以下工具:
{tool_desc}

使用工具的格式:
USE_TOOL: tool_name(arguments)
"""

💡 这是Agent的"使用说明书",告诉LLM它有什么能力、怎么使用。

2. 主循环

for step in range(1, max_steps + 1):
    response = self._call_llm()      # 思考
    tool_name, args = self._parse_action(response)  # 解析
    result = self._execute_tool(tool_name, args)    # 执行
    # 反馈给LLM继续思考

💡 这是Agent的"心跳",不断循环直到任务完成。

3. 工具解析

def _parse_action(self, response):
    match = re.search(r"USE_TOOL:\s*(\w+)\((.*?)\)", response)
    if match:
        return match.group(1), match.group(2)

💡 这是Agent的"翻译器",把LLM的想法转换成实际操作。

4. 历史记录

self.history.append({"role": "assistant", "content": response})
self.history.append({"role": "user", "content": f"观察: {result}"})

💡 这是Agent的"记忆",记住之前做了什么、结果如何。


七、试试更复杂的任务

现在我们让Agent处理一个更实际的问题:

agent.run("""
今天是2024年1月15日,请帮我:
1. 计算距离春节(2月10日)还有多少天
2. 搜索一下春节旅游推荐
""")

Agent会这样工作:

【第1轮】
💭 思考: 需要计算1月15日到2月10日的天数
      1月剩余:31-15=16天
      2月到10日:10天
      总计:16+10=26天

🔧 使用工具: calculator(31 - 15 + 10)
📊 结果: 26

【第2轮】
💭 思考: 现在搜索春节旅游推荐

🔧 使用工具: search(2024春节旅游推荐)
📊 结果: 关于'2024春节旅游推荐'的搜索结果...

【第3轮】
💭 思考: 已经完成两个任务
FINISH: 
  距离春节还有26天
  春节旅游推荐:[搜索结果]

看到了吗?Agent自己拆解任务、分步执行、整合结果。


八、现在你可以做什么?

💪 立即尝试

  1. 复制上面的代码,在本地运行
  2. 修改任务,看Agent怎么处理
  3. 添加新工具,比如:
    def read_file(filename):
        with open(filename) as f:
            return f.read()
    

🎯 练习题

尝试让你的Agent完成这些任务:

  1. ✅ 简单:计算一个复杂的数学表达式
  2. ✅ 中等:读取一个文本文件并统计字数
  3. ✅ 困难:分析CSV文件并生成报表

📚 下期预告

下一篇我们将深入探讨:

  • ReAct模式的论文原理
  • LangChain、AutoGPT如何实现ReAct
  • 更强大的Prompt工程技巧
  • 处理复杂任务的策略

总结

AI Agent = 大脑(LLM)+ 手脚(工具)+ 循环(反馈)
核心工作流程:感知 → 决策 → 执行 → 观察 → 循环
100行代码就能实现一个可用的Agent
Prompt是Agent的"操作系统"

💡 核心洞察: Agent的强大不在于模型本身,而在于"思考-行动-反馈"的循环机制。


如果这篇文章对你有帮助:

  • 👍 点个赞,让更多人看到
  • 🔖 收藏起来,方便随时查阅
  • 📤 转发给需要的朋友

留言区见!
你在学习AI Agent过程中遇到了什么问题?欢迎留言讨论!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐