100行Python代码,搭一个能干活的AI Agent
100行Python代码搭一个能干活的AI Agent原文首发于点这里查看跟大模型聊天人人都会但你有没有想过——为什么ChatGPT能帮你订餐、查航班、写代码而你调用API只会一问一答差别就两个字Agent。大模型是大脑但没手没脚没记忆。你问它北京天气怎么样它只会说我无法访问实时数据。Agent就是给大脑装上四肢、记忆和执行力——让它自己判断该用什么工具执行完再思考下一步。听起来很复杂其实核心就一个公式Agent LLM大脑 Tools双手 Memory记忆 Loop循环今天用100行Python代码把这四个模块从零搭一遍。不依赖任何框架跑完你就明白Agent到底是怎么回事。00 环境准备pipinstallopenai用OpenAI SDK兼容DeepSeek、智谱等国产API改个base_url就行。这篇用DeepSeek做demo——便宜而且支持按量付费。你需要去https://platform.deepseek.com/注册拿一个API Key。01 LLM调用 —— 给Agent装个大脑第一块拼图能跟大模型对话。fromopenaiimportOpenAIfromdotenvimportload_dotenvimportos load_dotenv()clientOpenAI(# api_keyyour-api-key, # 换成你的DeepSeek API Keyapi_keyos.getenv(DEEPSEEK_API_KEY),# 或使用env方式存储apikeybase_urlhttps://api.deepseek.com)defask_llm(messages,toolsNone):responseclient.chat.completions.create(modeldeepseek-v4-flash,messagesmessages,toolstools,tool_choiceauto,)returnresponse.choices[0].message resask_llm([{role:user,content:你好}])print(res)这段代码本身没什么特别的就是标准的API调用。但注意tools这个参数——这是Agent和普通聊天的核心分界线。不传tools模型只能聊天。传了tools模型就知道我还有这些工具可以用在需要的时候会主动要求调用。tool_choiceauto的意思是让模型自己判断这个问题我直接答还是得用工具⚠️ 踩坑提示 DeepSeek的deepseek-chat模型已废弃对应deepseek-v4-flash模型中的非思考模式02 工具定义 —— 给Agent装双手工具就是普通的Python函数外加一份给LLM看的说明书。defcalculator(expression:str)-str:try:returnstr(eval(expression))except:return计算错误defget_weather(city:str)-str:mock{北京:晴 25℃,上海:多云 28℃,深圳:雷阵雨 30℃}returnmock.get(city,f暂无{city}天气数据)TOOLS[{type:function,function:{name:calculator,description:执行数学计算输入数学表达式,parameters:{type:object,properties:{expression:{type:string,description:数学表达式如 23*4}},required:[expression]}}},{type:function,function:{name:get_weather,description:查询指定城市的天气,parameters:{type:object,properties:{city:{type:string,description:城市名称}},required:[city]}}}]TOOL_MAP{calculator:calculator,get_weather:get_weather}这里有个关键认知LLM****不直接执行代码。它只做一件事——输出一段JSON告诉你我想调用calculator工具参数是123 * 456 789。真正执行计算的是你的代码。LLM的角色更像一个调度员决定调用什么工具、传什么参数但脏活累活都是你的程序干。description字段很重要写得越清晰模型调用越准确。模型是靠读这个描述来理解工具用途的——你说执行数学计算它就知道算术题该找这个工具。03 记忆 —— 让Agent记住上下文classMemory:def__init__(self):self.messages[]defadd(self,role,content,**kwargs):msg{role:role,content:content}msg.update(kwargs)self.messages.append(msg)defget_messages(self):returnself.messages.copy()就这就这么简单。很多人觉得Agent的记忆很高深其实本质就是维护一个messages列表。每次调用LLM时把完整的对话历史传过去——LLM本身没有状态所谓的记住上下文就是每轮都把历史消息全部塞进请求里。这也解释了为什么聊天越长API费用越高——因为每次请求都带着之前所有的对话。04 Agent循环 —— 让Agent会思考这是整个Agent的心脏。核心思路叫ReAct****模式思考→行动→观察→重复直到任务完成。defrun_agent(user_input,max_steps10):memoryMemory()memory.add(system,你是一个有用的助手可以调用工具回答问题。)memory.add(user,user_input)forstepinrange(max_steps):print(f\n--- 第{step1}步 ---)responseask_llm(memory.get_messages(),toolsTOOLS)ifnotresponse.tool_calls:print(fAgent回答{response.content})returnresponse.content memory.add(assistant,response.contentor,tool_callsresponse.tool_calls)fortool_callinresponse.tool_calls:nametool_call.function.name argsjson.loads(tool_call.function.arguments)print(f调用工具{name}({args}))resultTOOL_MAP[name](**args)print(f工具返回{result})memory.add(tool,result,tool_call_idtool_call.id)return达到最大步数Agent停止拆解这个循环思考把对话历史和工具列表发给LLMLLM决定下一步干什么判断如果LLM没有请求调用工具说明它觉得可以直接回答了循环结束行动LLM说我要查北京天气你的代码就执行get_weather(北京)观察把工具执行结果塞回messages让LLM看到结果重复LLM拿到结果后再思考可能还需要调别的工具也可能可以直接回答了max_steps是安全阀防止Agent陷入死循环。实际使用中10步足够处理大部分任务。跑起来看效果# 测试1简单计算run_agent(帮我算一下 123 * 456 789)输出两步完成第一步调计算器第二步直接回答。# 测试2多步骤任务run_agent(北京和上海哪个温度高并帮我算一下高多少)输出Silas说写完这100行代码最大的感受是Agent一点都不神秘。网上铺天盖地的Agent框架——LangChain、AutoGen、CrewAI——把这件事包装得很复杂。但你把核心扒开看就是一个while循环LLM决定调什么工具你的代码执行结果传回去循环直到完成。框架做的事无非是帮你把这个循环封装好再加上一些工程化的东西重试、超时、日志。我的建议先手写一遍再用框架。不是框架不好是你不理解原理直接用框架出了问题完全不知道怎么排查。你不知道tool_calls的格式长什么样不知道messages里每条消息的role有什么讲究调试的时候就是两眼一抹黑。还有一点别急着给Agent加复杂的Planning和Multi-Agent协作。先把这个最小闭环跑通加一个你自己业务场景需要的工具比如查数据库、调内部API让它真正干一件有用的事。能稳定跑一周再考虑扩展。Agent的价值不在于架构多精巧在于它能不能稳定地把一件事干好。跑通代码后可以试试这些扩展方向换个工具把get_weather换成查数据库、调内部API、发邮件——只要是个Python函数就能当工具加RAG给Agent接一个知识库让它能查文档回答问题多Agent协作多个Agent分工合作比如一个负责搜索、一个负责写作试试框架理解原理后再用LangChain或CrewAI你会发现它们其实就是帮你封装了这套循环完整代码我已经整理好了复制就能跑。你给Agent加了什么有意思的工具评论区聊聊。觉得有用的话转给也在折腾AI的朋友。关注我持续分享AI实操和踩坑记录。 最小AI Agent实现 —— 100行代码搞定 Agent LLM Tools Memory Loop fromopenaiimportOpenAIimportjsonfromdotenvimportload_dotenvimportos load_dotenv()# 1. LLM调用大脑clientOpenAI(# api_keyyour-api-key, # 换成你的DeepSeek API Keyapi_keyos.getenv(DEEPSEEK_API_KEY),# 或使用env方式存储apikeybase_urlhttps://api.deepseek.com)defask_llm(messages,toolsNone):responseclient.chat.completions.create(modeldeepseek-v4-flash,messagesmessages,toolstools,tool_choiceauto,)returnresponse.choices[0].message# 2. 工具定义双手defcalculator(expression:str)-str:try:returnstr(eval(expression))except:return计算错误defget_weather(city:str)-str:mock{北京:晴 25℃,上海:多云 28℃,深圳:雷阵雨 30℃}returnmock.get(city,f暂无{city}天气数据)TOOLS[{type:function,function:{name:calculator,description:执行数学计算输入数学表达式,parameters:{type:object,properties:{expression:{type:string,description:数学表达式如 23*4}},required:[expression]}}},{type:function,function:{name:get_weather,description:查询指定城市的天气,parameters:{type:object,properties:{city:{type:string,description:城市名称}},required:[city]}}}]TOOL_MAP{calculator:calculator,get_weather:get_weather}# 3. 记忆对话历史classMemory:def__init__(self):self.messages[]defadd(self,role,content,**kwargs):msg{role:role,content:content}msg.update(kwargs)self.messages.append(msg)defget_messages(self):returnself.messages.copy()# 4. Agent循环心脏defrun_agent(user_input,max_steps10):memoryMemory()memory.add(system,你是一个有用的助手可以调用工具回答问题。)memory.add(user,user_input)forstepinrange(max_steps):print(f\n--- 第{step1}步 ---)responseask_llm(memory.get_messages(),toolsTOOLS)ifnotresponse.tool_calls:print(fAgent回答{response.content})returnresponse.content memory.add(assistant,response.contentor,tool_callsresponse.tool_calls)fortool_callinresponse.tool_calls:nametool_call.function.name argsjson.loads(tool_call.function.arguments)print(f调用工具{name}({args}))resultTOOL_MAP[name](**args)print(f工具返回{result})memory.add(tool,result,tool_call_idtool_call.id)return达到最大步数Agent停止# 5. 测试 if__name____main__:run_agent(北京和上海哪个温度高并帮我算一下高多少)THE ENDRAG知识库搭建大揭秘原来这么简单还能这么有趣大模型到底怎么思考一篇看懂 Prompt、思维链、思维树Python数据分析入门从零开始玩转数据简明教程实现OpenCLaw轻量级应用服务器部署及Ollama大模型本地化DifyOllama模型搭建攻略本地环境实战指南

相关新闻

数学建模论文写作指南:从结构框架到核心模块的完整解析

数学建模论文写作指南:从结构框架到核心模块的完整解析

1. 项目概述:一份让数学建模“小白”也能上手的论文写作指南 如果你是一名刚接触数学建模的大学生,或者是一位需要快速完成建模任务但苦于论文无从下手的职场新人,看到“史上最棒”、“让小白也能写论文”这样的标题,是不是瞬间感…

2026/10/12 6:46:04 阅读更多 →
G-Helper 免费替代奥创全攻略:5 分钟完成安装,轻松掌控华硕笔记本性能与风扇

G-Helper 免费替代奥创全攻略:5 分钟完成安装,轻松掌控华硕笔记本性能与风扇

G-Helper 免费替代奥创全攻略:5 分钟完成安装,轻松掌控华硕笔记本性能与风扇 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Sca…

2026/10/7 0:13:19 阅读更多 →
IntelliJ IDEA内存占用过高?JVM调优与性能优化全攻略

IntelliJ IDEA内存占用过高?JVM调优与性能优化全攻略

1. 问题定位:你的IDEA为什么“吃”内存?如果你是一名Java或全栈开发者,IntelliJ IDEA(以下简称IDEA)大概率是你的主力武器。但用久了,你可能会发现它变得越来越“臃肿”,启动慢、编辑卡顿、甚至…

2026/10/10 13:07:49 阅读更多 →

最新新闻

E2B沙箱实战:AI智能体代码执行失控防护与排障指南

E2B沙箱实战:AI智能体代码执行失控防护与排障指南

1. 先搞清楚:AI 智能体为什么总能把沙箱跑崩上周有个朋友找我,说他的 AI 智能体项目出事了:Agent 在沙箱里跑了一段“看似无害”的 Python 脚本,结果沙箱彻底失联,连宿主机都差点被拖挂,最后只能重启整台机…

2026/10/13 7:35:07 阅读更多 →
Xcode自定义文件头注释:模板占位符与批量替换实战

Xcode自定义文件头注释:模板占位符与批量替换实战

如果一个工程里几十个文件的开头都自动带着“Created by 某用户 on 2024-xx-xx”和“Copyright (c) 2024 CompanyName”这种默认注释,而团队其实想换成统一格式的公司版权头,这个需求可能经常被当成“小事一桩”。我自己折腾过一次之后发现,这…

2026/10/13 7:35:07 阅读更多 →
CTF Misc入门:用CRC爆破还原PNG隐藏图片宽高

CTF Misc入门:用CRC爆破还原PNG隐藏图片宽高

这道题我在不同平台见过好多次,几乎每一个入门 Misc 的人都会被它“坑”一次。[BJDCTF2020]认真你就输了 这个名字本身自带劝退效果,越是想认真分析,越容易被表面信息带走。整道题涉及的其实都是基础功:文件类型识别、隐藏文件分离…

2026/10/13 7:35:07 阅读更多 →
Clion配置C语言开发环境:MinGW工具链与CMake调试实战

Clion配置C语言开发环境:MinGW工具链与CMake调试实战

如果你刚开始用 Clion 跑 C 语言,大概率会卡在这一步:软件装好了,新建了项目,写了个 Hello World,一运行却提示找不到编译器。这不是你笨,而是很多人第一次接触 Clion 都容易忽略一个事实——Clion 本质上是…

2026/10/13 7:35:07 阅读更多 →
UDP传输实战:低延迟选型、报文细节与可靠改造

UDP传输实战:低延迟选型、报文细节与可靠改造

干我们这行的,做网络通信绕不开UDP。很多人一提起UDP,条件反射就是“不可靠、会丢包、没连接”,然后转头去用TCP。但我在几个实时性要求极高的项目里,比如某跨平台系统的帧同步对战模块、某图像处理Demo的端到端推流,都…

2026/10/13 7:35:07 阅读更多 →
三自由度圆柱坐标型工业机器人设计:从构型到驱动匹配

三自由度圆柱坐标型工业机器人设计:从构型到驱动匹配

简介:三自由度圆柱坐标型工业机器人的设计文档,面向机械设计、自动化与机电一体化专业的毕业生及相关工程师,系统呈现了该型机器人从需求分析、总体方案拟定到机械系统设计、自动控制系统实现的完整流程。文档以刚性高、定位精度高的手臂为主…

2026/10/13 7:34:05 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →