ARTICLE · 1090127
AI Agent 系统:第1课:Foundations & Landscape
第1课:Foundations & Landscape
课程周次:第1周(共10周)
学习时长:约2小时
难度等级:入门级
学习目标
1. 为什么需要 Agent?LLM 不够用吗?
生活比喻 🏠
LLM(大型语言模型)像一个**「超级大脑」**——知识渊博,但只能思考,不能行动。
就像一个人知道所有食谱,但:
❌ 不会自己动手做饭 ❌ 不知道今天的天气 ❌ 无法帮你订外卖
技术现实 🔧
LLM 的本质是**「下一个 token 预测」**,它无法:
| 无法访问实时信息 | ||
| 无法执行外部操作 | ||
| 无法处理多步骤任务 |
2. 什么是 Compound AI System?
传统做法 vs 复合做法
传统(LLM 即一切):
┌─────────┐ ask_LLM("天气") ┌─────────┐
│ 用户 │ ────────────────────────→ │ LLM │ ───→ "我不知道"
└─────────┘ └─────────┘
复合(LLM + 工具):
┌─────────┐ ┌─────────┐
│ 用户 │ ────────────────────────→ │ LLM │ ───→ 调用天气API
└─────────┘ └─────────┘ │
↓
┌─────────┐
│ 天气API │
└─────────┘
│
↓
┌─────────┐ ┌─────────┐
│ LLM │ ← │ 结合数据│
└─────────┘ └─────────┘
│
↓
"今天晴,25度"
通俗比喻 🏥
Compound AI System 就像一个**「医院」**:
医院 ≠ 只有医生
医院 = 分诊台 + 化验科 + 药房 + 护士 + 医生
↓ ↓ ↓ ↓ ↓
分类 检测 取药 执行 诊断
每个部门各司其职,医生(LLM)只负责最终诊断,其他工作由专业部门完成。
3. Agent 架构图
┌─────────────────────────────────────────────────────────────┐
│ AI Agent │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────┐ │
│ │ 用户 │ │
│ └────┬────┘ │
│ │ 输入 │
│ ▼ │
│ ┌─────────┐ 「感知」 │
│ │ │ ← 理解用户意图、提取关键信息 │
│ └────┬────┘ │
│ │ │
│ ▼ │
│ ┌─────────┐ 「推理」 │
│ │ │ ← 调用 LLM、制定行动计划 │
│ └────┬────┘ │
│ │ │
│ ▼ │
│ ┌─────────┐ 「行动」 │
│ │ │ ← 调用工具、执行操作 │
│ └────┬────┘ │
│ │ │
│ ▼ │
│ ┌─────────┐ 「环境反馈」 │
│ │ │ ← 观察结果、更新状态 │
│ └────┬────┘ │
│ │ │
│ └──────────→ 循环直到任务完成 │
│ │
└─────────────────────────────────────────────────────────────┘
四个核心组件
| 感知 (Perception) | ||
| 推理 (Reasoning) | ||
| 行动 (Action) | ||
| 环境 (Environment) |
4. 三大工程挑战
构建 Agent 系统有三个核心挑战:
4.1 任务分解(Task Decomposition)
问题:如何把「写报告」拆成「查资料→整理→写作→检查」?
类比:像「写菜谱」——把「做一顿饭」分解成买菜、洗菜、切菜、炒菜等可执行步骤。
常见分解策略:
顺序分解:按步骤依次执行 并行分解:多个子任务同时执行 层级分解:大任务分解为小任务,小任务再分解
4.2 数据管理(Data Management)
问题:如何让 Agent 获得准确、及时、相关的知识?
挑战:
实时性:天气、股价等实时数据 准确性:避免过时或错误信息 相关性:找到最有用的一小部分
解决方案:RAG(检索增强生成)——像给 LLM 一个「参考资料袋」。
4.3 评测设计(Evaluation)
问题:如何衡量 Agent 的输出质量?如何构建可靠的 Benchmark?
类比:像「质检流水线」——需要明确的「质量标准」和「检测方法」。
评测维度:
正确性:输出是否正确? 效率:用了多少步/多少时间? 安全性:是否会产生有害输出?
5. 从零实现:最小 Agent Loop
核心概念
Agent Loop 是 Agent 的核心执行机制:
感知 → 推理 → 行动 → 观察 → [循环]
代码实现
"""
最小可运行的 Agent Loop
核心:感知 → 推理 → 行动
纯 Python 实现,无框架依赖
"""
from dataclasses import dataclass, field
from typing import List, Callable, Dict
from enum import Enum
class MessageRole(Enum):
"""消息角色"""
SYSTEM = "system"
USER = "user"
ASSISTANT = "assistant"
@dataclass
class Message:
"""消息"""
role: MessageRole
content: str
@dataclass
class AgentState:
"""Agent 状态"""
messages: List[Message] = field(default_factory=list)
iteration: int = 0
class MinimalAgent:
"""
最简单的 Agent Loop
核心流程:接收输入 → 调用 LLM → 返回响应
"""
def __init__(
self,
llm: Callable,
max_iterations: int = 10
):
self.llm = llm
self.max_iterations = max_iterations
self.state = AgentState()
def step(self, user_input: str) -> str:
"""
执行一步 Agent Loop
1. 感知:将用户输入加入消息历史
2. 推理:调用 LLM 生成响应
3. 行动:返回响应
"""
# 1. 感知
self.state.messages.append(
Message(MessageRole.USER, user_input)
)
# 2. 推理:调用 LLM
messages = [
{"role": m.role.value, "content": m.content}
for m in self.state.messages
]
response = self.llm(messages)
# 3. 行动:记录并返回响应
self.state.messages.append(
Message(MessageRole.ASSISTANT, response)
)
self.state.iteration += 1
return response
def run(self, user_input: str) -> str:
"""运行 Agent 直到得到最终回答"""
self.state = AgentState() # 重置状态
for _ in range(self.max_iterations):
response = self.step(user_input)
# 简单终止条件:检查响应是否包含完成标记
if "[完成]" in response or "任务完成" in response:
return response
return "已达到最大迭代次数"
# ============== 使用示例 ==============
def mock_llm(messages: List[Dict]) -> str:
"""模拟 LLM 响应(用于测试)"""
last_msg = messages[-1]["content"]
return f"Agent 思考:我收到了 '{last_msg[:30]}...',正在考虑下一步..."
def real_llm_call(messages: List[Dict]) -> str:
"""真实的 LLM 调用示例(使用 requests)"""
import os
import requests
api_key = os.environ.get("OPENAI_API_KEY", "")
if not api_key:
return "请设置 OPENAI_API_KEY 环境变量"
response = requests.post(
"https://api.openai.com/v1/chat/completions",
headers={
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
},
json={
"model": "gpt-4o-mini",
"messages": messages,
"temperature": 0.7
}
)
if response.status_code == 200:
return response.json()["choices"][0]["message"]["content"]
else:
return f"API 调用失败: {response.text}"
# 测试
if __name__ == "__main__":
# 使用模拟 LLM 测试
agent = MinimalAgent(llm=mock_llm)
result = agent.run("请介绍一下你自己")
print(f"Result: {result}")
运行步骤
保存代码到 minimal_agent.py运行 python minimal_agent.py观察输出,理解 Agent Loop 流程
6. 练习题 🏋️
基础练习
运行代码:执行上面的 MinimalAgent,理解 Agent Loop 结构
添加日志:在
step()方法中添加 print 语句,打印每次迭代的状态添加终止条件:修改代码,当 Agent 说「任务完成」时停止循环
进阶练习
添加工具调用:修改代码,让 Agent 能说「需要调用工具X」,并解析出工具名和参数
添加记忆:修改
AgentState,让 Agent 能记住之前的对话内容添加系统提示:添加
system_prompt参数,让用户可以自定义 Agent 角色
7. 框架抽象与工程权衡
| 从零实现 | ||||
| DSPy | ||||
| LangGraph | ||||
| LangChain |
选择建议
学习原理:从零实现,理解底层机制 快速验证:LangChain,快速搭建原型 生产系统:LangGraph,清晰的流程控制 性能优化:DSPy,自动优化提示词
8. 真实工程案例:浏览器自动化 Agent
项目背景
构建一个能控制浏览器的 AI Agent,可以自动完成搜索、填表、点击等操作。
架构设计
用户请求 → Agent Brain (LLM) → Action Parser → Browser Controller → Browser
↓
Page State Extractor
↓
Observation (截图/DOM)
核心组件
开源参考
browser-use:浏览器控制 Agent 框架
9. 阅读清单
10. 关键术语
下一步
下一课将学习 LLMs for Builders:如何用 Python 调用 LLM API,实现结构化输出。
⬜
有问题吗? 可以随时提问,我会帮你解答!