当前位置: 首页 > news >正文

【Agent 从零到一】S01:The Agent Loop —— 30 行代码实现一个真正的 AI Agent

本系列文章:用最朴素的方式,从零构建一个生产级 AI Agent。不依赖 LangChain、不依赖 AutoGPT,只用原生 API 和 Python。

上一篇:现在整个行业都在谈论 “AI Agent“
https://blog.csdn.net/weixin_43499199/article/details/161593902?spm=1001.2014.3001.5501

核心观点:一个工具 + 一个循环 = 一个 Agent。所有复杂的 Agent 能力,都建立在这个最简单的循环之上。


前言:为什么 Agent Loop 是 AI 的 “操作系统”

在大模型出现之前,所有程序都是确定性的——你写什么代码,它就做什么事。

大模型带来了推理能力,但它有一个致命缺陷:它是一个纯函数。给它一个输入,它输出一个结果,然后就结束了。它不能自己读文件、不能自己跑代码、不能自己看报错、不能自己修正错误。

没有循环,你就是那个 Agent。你需要:

  1. 问大模型一个问题
  2. 复制它的输出
  3. 手动执行命令
  4. 把执行结果再粘贴回去
  5. 重复这个过程直到问题解决

而 Agent Loop,就是把你从这个循环里解放出来的那一行代码:while True

这就是为什么我把它称为 AI 的 “操作系统”——它是模型与真实世界的第一道连接,是所有智能行为的基础。


问题:大模型是 “缸中之脑”

语言模型拥有强大的推理能力,但它被关在一个玻璃盒子里。

  • 它能写出完美的 Python 代码,但它不能运行这段代码;
  • 它能告诉你如何修复一个 bug,但它不能看到错误日志;
  • 它能设计一个完整的项目结构,但它不能创建任何文件;
  • 它能解释 Git 命令的用法,但它不能执行任何 Git 操作。

没有与真实世界交互的能力,大模型永远只是一个 “顾问”,而不是一个 “执行者”。

而绝大多数人使用大模型的方式,就是自己充当那个 “手动循环”:

你提问 → 大模型回答 → 你执行 → 你把结果告诉大模型 → 大模型再回答 → ...

这个过程枯燥、重复、容易出错,而且效率极低。


解决方案:一个无限循环 + 一个退出条件

解决这个问题的方法简单到令人难以置信:加一个while循环。

+--------+ +-------+ +---------+ | User | ---> | LLM | ---> | Tool | | prompt | | | | execute | +--------+ +---+---+ +----+----+ ^ | | tool_result | +----------------+ (loop until stop_reason != "tool_use")

这就是整个 Agent 的核心架构。没有任何复杂的概念,没有任何多余的组件。

工作原理

  1. 把用户的问题发给大模型
  2. 大模型决定是直接回答,还是调用工具
  3. 如果调用工具,就执行工具,把结果返回给大模型
  4. 重复步骤 2-3,直到大模型决定不再调用工具
  5. 返回最终答案给用户

就是这么简单。所有你听说过的复杂 Agent 框架,本质上都是在这个循环上叠加各种优化和机制。


完整实现:30 行 Python 代码

下面是一个完整可运行的 Agent 实现。它只有 30 行代码,但它已经是一个真正的 AI Agent 了。

前置准备

首先安装 Anthropic SDK(我们用 Claude 3.5 Sonnet 作为基础模型,它的工具调用能力是目前最好的):

pipinstallanthropic

然后设置你的 API 密钥:

exportANTHROPIC_API_KEY="your_api_key_here"

完整代码

importosimportsubprocessfromanthropicimportAnthropic# 配置MODEL="claude-3-5-sonnet-20240620"SYSTEM_PROMPT=""" 你是一个可以执行Bash命令的AI助手。 当用户要求你执行操作时,使用bash工具来完成。 不要编造结果,所有操作都必须通过工具执行。 执行完命令后,根据输出结果回答用户的问题。 """# 初始化客户端client=Anthropic(api_key=os.environ.get("ANTHROPIC_API_KEY"))# 定义唯一的工具:Bash执行器TOOLS=[{"name":"bash","description":"执行Bash命令并返回输出","input_schema":{"type":"object","properties":{"command":{"type":"string","description":"要执行的Bash命令"}},"required":["command"]}}]defrun_bash(command):"""执行Bash命令并返回输出"""try:result=subprocess.run(command,shell=True,capture_output=True,text=True,timeout=30)returnf"Exit code:{result.returncode}\nStdout:\n{result.stdout}\nStderr:\n{result.stderr}"exceptsubprocess.TimeoutExpired:return"Error: Command timed out after 30 seconds"defagent_loop(query):"""Agent主循环"""messages=[{"role":"user","content":query}]whileTrue:# 1. 调用大模型response=client.messages.create(model=MODEL,system=SYSTEM_PROMPT,messages=messages,tools=TOOLS,max_tokens=8000)# 2. 把模型响应加入消息历史messages.append({"role":"assistant","content":response.content})# 3. 检查是否需要继续循环ifresponse.stop_reason!="tool_use":# 模型不再调用工具,返回最终答案returnresponse.content# 4. 执行所有工具调用results=[]forblockinresponse.content:ifblock.type=="tool_use":print(f"\n🔧 执行命令:{block.input['command']}")output=run_bash(block.input["command"])results.append({"type":"tool_result","tool_use_id":block.id,"content":output})# 5. 把工具执行结果加入消息历史messages.append({"role":"user","content":results})# 测试运行if__name__=="__main__":print("🤖 Agent 已启动,输入 'exit' 退出")whileTrue:query=input("\n>>> ")ifquery.lower()=="exit":breakresult=agent_loop(query)print("\n📝 最终回答:")print(result[0].text)

逐行解析:Agent Loop 的工作原理

让我们把这个循环拆开来看,理解每一步到底在做什么。

步骤 1:初始化消息列表

messages=[{"role":"user","content":query}]

消息列表是 Agent 的 “记忆”。它记录了整个对话的历史,包括用户的问题、模型的回答和工具的执行结果。

步骤 2:调用大模型

response=client.messages.create(model=MODEL,system=SYSTEM_PROMPT,messages=messages,tools=TOOLS,max_tokens=8000)

我们把完整的消息历史和工具定义一起发给大模型。大模型会根据上下文决定下一步做什么。

步骤 3:检查退出条件

ifresponse.stop_reason!="tool_use":returnresponse.content

这是整个循环最关键的一行。stop_reason是大模型告诉我们它为什么停止生成内容:

  • 如果是tool_use:说明大模型想要调用工具,我们需要继续循环
  • 如果是end_turn:说明大模型已经完成了任务,想要直接回答用户,我们退出循环

步骤 4:执行工具调用

forblockinresponse.content:ifblock.type=="tool_use":output=run_bash(block.input["command"])results.append(...)

大模型可以在一次响应中调用多个工具。我们依次执行所有工具调用,收集结果。

步骤 5:把结果返回给大模型

messages.append({"role":"user","content":results})

我们把工具执行的结果作为一条新的用户消息加入历史,然后回到步骤 2,继续循环。

就是这样。这 30 行代码,就是所有 AI Agent 的本质。


我们到底添加了什么?

从一个普通的聊天机器人,到一个真正的 Agent,我们只添加了 4 个组件:

组件作用重要性
while True循环让 Agent 可以自主地进行多步推理和操作⭐⭐⭐⭐⭐
Bash 工具让 Agent 可以与真实世界交互⭐⭐⭐⭐⭐
累积式消息列表让 Agent 拥有记忆,知道自己之前做了什么⭐⭐⭐⭐
stop_reason控制流让 Agent 可以自己决定什么时候结束任务⭐⭐⭐⭐

重要提示:后面的 11 个章节,我们会在这个基础上添加更多的能力 —— 错误处理、并行工具调用、记忆管理、规划能力等等。但这个循环本身永远不会变。


现在就试试!

把上面的代码保存为s01_agent_loop.py,然后运行:

python s01_agent_loop.py

试试这些 prompt,看看你的第一个 Agent 能做什么:

基础操作

创建一个叫hello.py的文件,打印"Hello, Agent!" 列出当前目录下所有的Python文件 显示当前的Git分支 创建一个叫test的目录,在里面创建3个文件:a.txt, b.txt, c.txt

稍微复杂一点的任务

统计当前目录下所有Python文件的代码行数总和 查找所有包含"agent"关键词的文件 运行hello.py,看看输出是什么 把test目录下的所有.txt文件压缩成test.zip

真正展示 Agent 能力的任务

我不小心把hello.py删了,帮我恢复它 写一个Python脚本,计算斐波那契数列的第100项,然后运行它 检查当前系统的Python版本和pip版本 克隆一个GitHub仓库,然后列出它的目录结构

你会惊讶地发现,这个只有 30 行代码的 Agent,已经能完成绝大多数日常开发任务了。


常见误区与注意事项

为什么只用 Bash 一个工具?

因为 Bash 是最强大的工具。你可以用 Bash 做任何事 —— 读文件、写文件、运行程序、调用 API、管理系统等等。不需要为每一个操作定义单独的工具。

Agent 会执行危险命令吗?

是的。所以永远不要用 root 权限运行 Agent,也不要在生产环境中直接使用这个简单版本。后面的章节我们会添加安全沙箱和命令审核机制。

为什么用 Claude 而不是 GPT-4?

Claude 3.5 Sonnet 的工具调用能力目前是业界最好的。它更擅长理解什么时候需要调用工具,什么时候可以直接回答。当然,你也可以很容易地把代码改成使用 OpenAI API。

Agent 会陷入无限循环吗?

有可能。在后面的章节我们会添加最大循环次数限制和超时机制。


总结

在这一章,我们用 30 行代码实现了一个真正的 AI Agent。

我们没有使用任何复杂的框架,没有引入任何抽象概念。我们只是给大模型加了一个循环,让它可以自己执行命令,自己看结果,自己修正错误。

这就是 Agent 的本质:一个能够自主地与环境交互,直到完成目标的程序。

所有复杂的 Agent 能力 —— 规划、记忆、推理、工具使用 —— 都是建立在这个最简单的循环之上的。


下一章预告

S02:工具的使用,加一个工具,只加一个 handler

http://www.rkmt.cn/news/1455458.html

相关文章:

  • 01005超小元件贴装,深圳哪家SMT工厂技术强?
  • 3分钟学会BetterRenderDragon:让你的Minecraft画质提升300%
  • 5 步搞定 CRUD!实测,一句话需求生成完整 SpringBoot 项目
  • Linux网络编程(十二):HTTP协议基础与报文格式
  • 【收藏 2026 年版】零基础入门大模型全栈学习路线,程序员转行 LLM 避坑指南
  • 前端工程师进阶提示词工程实战
  • 计算机网络(1) -- 基础知识
  • 从零开始 C++------ 十四【C++ 数据结构】unordered_map/unordered_set 全解析:从使用到底层模拟实现
  • 基于舵机与3D打印的复古二进制显示模块设计与实现
  • Bebas Neue字体:当你的设计项目需要现代感标题时的实用解决方案
  • 别再到处找破解版了!Kali Linux 2024最新版一键安装AWVS 14教程(附官方试用版申请与激活)
  • 本硕连读升学规划机构排行 核心维度客观解析 - 互联网科技品牌测评
  • CloudBeaver终极指南:浏览器端多数据库统一管理平台深度解析与实战部署
  • CloudBeaver实战部署指南:从零构建高效Web数据库管理平台
  • 终极指南:5分钟学会用Mousecape免费定制Mac鼠标指针
  • 基于树莓派与超声波传感器的智能垃圾监测系统实战指南
  • 数学教资科三真题答案
  • 雷达仿真测试技术落地能源安防,干扰模拟器筑牢场站安防监测防线
  • 辽宁省CPPM和SCMP课程咨询方式:众智商学院官网与冯老师入口说明 - 众智商学院职业教育
  • 终极指南:如何使用IDM Activation Script免费解锁Internet Download Manager完整功能
  • 完全指南:用Mousecape打造个性化的macOS光标体验
  • 【系统架构设计师】2026年上半年真题论文:论六边形架构的设计与应用
  • Linux 组调度的 burst 带宽:突发负载的临时资源分配
  • 2026实验室用水配套选型参考,详解超纯水、纯化水设备选购要点及靠谱生产厂家推荐 - 栗子测评
  • Llama3中文微调一站式工具包:51K指令数据+LoRA脚本+多精度量化模型
  • CEM-1 PCB器件分区排布与铜箔散热实操规范
  • 天津靠谱包包回收商家榜单,结合报价行情筛选优质变现门店! - 合扬奢侈品交易中心
  • PyPYLON技术解析:5个关键特性实现高效工业相机控制
  • Spark SQL详解(二):RDD转换DataFrame与Spark SQL读写数据库
  • 【AI风控融合实战指南】:20年专家亲授3大落地陷阱与5步集成方法论