Agent学习二:智能体(Agent)开发核心原理

设计目标 :建立系统化认知框架,理解 Agent 与传统程序的本质差异,掌握 ReAct 思维链、工具调用等核心范式,为后续编码实践奠定理论基石。避免"只会调 API 不懂原理"的陷阱。

2.1 Agent 本质:从"程序"到"自主实体"的范式跃迁

🔑 核心定义(对比传统 Linux 应用)

表格

维度 传统 Linux 应用 智能体(Agent) 为什么重要
执行模型 确定性流程(if-else/循环) 概率性推理 + 工具调用 Agent 需处理模糊指令
输入 结构化参数(CLI 参数/配置文件) 自然语言指令 + 环境上下文 需解析人类意图
决策 预设逻辑分支 LLM 推理 + 工具选择 动态生成执行路径
输出 固定格式结果(stdout/文件) 多模态响应(文本/动作/反思) 需适应用户需求
状态管理 进程内存/文件系统 对话历史 + 工具状态缓存 支持多轮交互

2.2 Agent 核心组件深度解析(附代码骨架)

🧠 三元架构模型

1. 感知层(Perception)
  • 输入:用户指令 + 工具输出 + 历史对话
  • 关键处理
    • 指令解析(提取意图/参数)
    • 上下文压缩(避免 token 溢出)
    • 敏感信息过滤(安全前置)
2. 决策层(Reasoning)← 核心创新区
  • 思维链(Chain-of-Thought):LLM 生成推理步骤
  • 工具选择(Tool Selection):根据当前状态选择技能
  • 错误恢复:检测工具调用失败并重试/换工具
3. 行动层(Action)
  • 工具执行:调用预定义函数(如搜索、计算)
  • 结果格式化:将工具输出转为 LLM 可理解的文本
  • 状态更新:持久化关键中间结果

2.3 ReAct 框架:推理与行动的黄金标准

📜 原理精解(对比 CoT)

方法 思维链 行动能力 适用场景
CoT "因为...所以..." ❌ 无 纯推理问题
ReAct "思考→行动→观察→再思考" ✅ 工具调用 需外部知识/操作的任务

最小可运行 ReAct 示例(纯 Python + requests)

python 复制代码
import requests
import json

class ReActAgent:
    def __init__(self, llm_api_key):
        self.llm_api_key = llm_api_key
        self.history = []
    
    def think(self, query: str) -> str:
        """生成 ReAct 思维链(简化版)"""
        prompt = f"""
当前任务:{query}
历史行动:
{chr(10).join(self.history[-3:]) if self.history else '无'}

请按格式输出:
Thought: [你的推理]
Action: [工具名] [参数]
Observation: [等待工具返回]
"""
        # 实际项目应调用 LLM API(此处简化)
        return "Thought: 需要查询天气 → Action: get_weather Beijing"
    
    def act(self, action: str) -> str:
        """执行工具调用"""
        if action.startswith("get_weather"):
            city = action.split()[1]
            # 模拟天气 API 调用
            return f"Observation: {city} 当前晴,25°C"
        return "Observation: 未知工具"
    
    def run(self, query: str, max_steps=3):
        for step in range(max_steps):
            thought_action = self.think(query)
            print(f"🔄 Step {step+1}: {thought_action}")
            
            if "Action:" in thought_action:
                action = thought_action.split("Action:")[1].strip()
                obs = self.act(action)
                self.history.append(f"{thought_action}\n{obs}")
                print(f"✅ {obs}")
                
                if "Answer:" in obs:  # 终止条件
                    return obs.split("Answer:")[1].strip()
            else:
                return thought_action  # 直接回答
        
        return "⚠️ 达到最大推理步数"

# 使用示例
if __name__ == "__main__":
    agent = ReActAgent(llm_api_key="sk-...")
    result = agent.run("北京明天适合户外活动吗?")
    print(f"\n🎯 最终答案: {result}")

2.4 🛠️ Skill(工具)设计黄金法则

原则 说明 反面案例
单一职责 一个 Skill 只做一件事 "全能工具"包含搜索/计算/翻译
幂等性 多次调用相同参数结果一致 调用"随机数生成器"导致结果不可复现
明确边界 参数校验 + 错误提示 未校验城市名导致 API 404
安全沙箱 隔离危险操作(如文件系统) 直接执行用户输入的 shell 命令
可观测性 记录调用日志/耗时 无法定位性能瓶颈
相关推荐
一只路人甲1 天前
使用AI快速学习
学习
传奇开心果编程1 天前
【Rust入门练中学】第2课:变量、可变性与常量
开发语言·学习·rust
边境悍匪1 天前
蜗牛学苑 Java 智能体学习 Day42|项目周开发技术汇总 1 思维导图复盘
java·开发语言·spring boot·学习·spring
Gyr01 天前
浅刷了一遍51CTO软考题库客观题及其解析(4)
学习·软考·知识点·信息安全工程师
是隼人1 天前
buuctf-pwn [NewStarCTF 2023 公开赛道]stack migration(64位栈迁移)题解(学习过程持续更新)
c语言·学习·安全·pwn入门·ctf入门
ι:1 天前
单相桥式全控整流仿真从零复现教学
windows·学习·matlab·simulink
传奇开心果编程1 天前
【Rust入门练中学】 第3课:数据类型
开发语言·学习·rust
humors2211 天前
今年我正在看、看完和还没看的书单(不定期更新)
学习·阅读·读书·书单·书籍
泡泡鱼(敲代码中)1 天前
MySQL 学习笔记:DCL、函数与约束 —— 安全、效率、完整性的三板斧
开发语言·笔记·sql·学习·mysql·gitee
爱吃苹果的日记本1 天前
数据结构第五课
数据结构·学习