发布时间:2026/6/14 15:02:23
129 行 Python,手写一个 AI 智能体
以下包含代码及注释仅在倒数第四行配置自己的deepseek-key即可运行mini_agent.py — 从零实现一个 AI 智能体基于 ReAct (Thought → Action → Observation) 范式核心概念:Agent 大脑(LLM) 工具(Tools) 记忆(Messages) 循环(Loop)运行流程:用户输入 → [思考(Thought) → 行动(Action) → 观察(Observation)] × N → 最终答案运行前提: pip install openai requests使用方法: python mini_agent.pyimport re, requestsfrom openai import OpenAI# ═══════════════════════════════════════════════════════════════# 1. 工具系统# 工具 智能体的手和眼睛让它能获取外部信息、执行操作。# tool 装饰器将普通函数注册到 TOOL_REGISTRY# LLM 通过函数名称 参数的方式调用它们。# ═══════════════════════════════════════════════════════════════TOOL_REGISTRY {}def tool(name, desc):def deco(func):TOOL_REGISTRY[name] {func: func, desc: desc}return funcreturn decotool(calculator, 数学计算器例如: calculator(expr1 2 * 3))def calculator(expr: str) - str:把 LLM 给的数学表达式 eval 算出结果expr_clean expr.replace(×, *).replace(÷, /).replace(x, *)try:return f计算结果: {eval(expr_clean)}except Exception as e:return f计算错误: {e}tool(get_time, 获取指定城市的当前时间例如: get_time(city北京))def get_time(city: str) - str:import datetimereturn f{city}当前时间: {datetime.datetime.now():%Y-%m-%d %H:%M:%S}tool(get_weather, 查询指定城市的实时天气例如: get_weather(city北京))def get_weather(city: str) - str:通过免费 API wttr.in 获取实时天气try:data requests.get(fhttps://wttr.in/{city}?formatj1, timeout10).json()c data[current_condition][0]return f{city}天气: {c[weatherDesc][0][value]}气温{c[temp_C]}°Cexcept Exception as e:return f天气查询失败: {e}# ═══════════════════════════════════════════════════════════════# 2. Agent 智能体# 集大脑(LLM)、记忆(messages)、循环(run)于一身。# 不需要单独的 LLMClient 类——Agent 自己管理 API 调用。# ═══════════════════════════════════════════════════════════════class Agent:def __init__(self, model: str, api_key: str, base_url: str):# LLM 客户端 — 智能体的大脑负责推理决策self.llm OpenAI(api_keyapi_key, base_urlbase_url)self.model model# 对话记忆 — 存储完整的思考→行动→观察历史self.messages []def _build_prompt(self) - str:构造系统提示词告诉 LLM 它的身份、工具和输出格式tools_text \n.join(f - {name}: {info[desc]}for name, info in TOOL_REGISTRY.items())return (你是一个通用的 AI 智能体。你可以使用工具来获取信息或执行操作。\nf\n【可用工具】\n{tools_text}\n\n【工作方式】\n请通过思考→行动循环来解决问题每轮只输出一对内容\n Thought: [你的思考过程]\n Action: [工具名称(参数名参数值)]\n\n当你认为已经完成任务时使用以下格式结束\n Thought: [总结]\n Action: Finish[最终答案]\n\n【规则】\n- 一次只输出一对 Thought 和 Action\n- Action 必须在一行内开始参数用双引号)def _call_llm(self) - str:调用大语言模型返回回复内容或错误信息print( 思考中..., end, flushTrue)try:resp self.llm.chat.completions.create(modelself.model, messagesself.messages, temperature0.3, timeout30)print(\r LLM 响应完成)return resp.choices[0].message.contentexcept Exception as e:print(f\r❌ LLM 调用失败: {type(e).__name__})return f错误: {type(e).__name__}: {e}def _parse_action(self, response: str):从 LLM 的回复中解析 Action 字段m re.search(rAction:\s*(.*), response)if not m:return {error: 回复中缺少 Action 字段}action m.group(1).strip()# 检查是否结束if action.startswith(Finish[):if action.endswith(]):return {type: finish, answer: action[7:-1]}# 支持多行 Finish[...\n内容\n] 的情况fm re.search(rFinish\[(.*?)\], response, re.DOTALL)return {type: finish, answer: fm.group(1).strip() if fm else action[7:]}# 解析工具调用m re.match(r(\w)\((.*)\), action)if not m:return {error: f无法解析行动格式: {action}}args dict(re.findall(r(\w)[\]([^\]*)[\], m.group(2)))return {type: tool, name: m.group(1), args: args}def run(self, user_input: str, max_steps: int 10):主循环感知→思考→行动→观察直到得出最终答案self.messages [{role: system, content: self._build_prompt()},{role: user, content: user_input}]print(f\n{*50}\n 用户: {user_input}\n{*50})for step in range(max_steps):print(f\n--- 第 {step1} 轮循环 ---)# 【思考】调用 LLM 进行推理决策response self._call_llm()if not response or response.startswith(错误:):print(f\n❌ {response or LLM 返回为空})print( 提示: 请检查 API Key、base_url 和 model 名称是否正确)breakprint(f\n{response}\n)# 【解析】从回复中提取 Action 指令action self._parse_action(response)if error in action:print(f⚠️ {action[error]})self.messages.append({role: assistant, content: response})self.messages.append({role: user, content: fObservation: {action[error]}})continue# 【结束】LLM 认为任务完成if action[type] finish:print(f{*50}\n✅ 最终答案: {action[answer]}\n{*50})return action[answer]# 【行动】调用工具tool_info TOOL_REGISTRY.get(action[name])if not tool_info:obs f未知工具 {action[name]}可用: {list(TOOL_REGISTRY.keys())}else:try:result tool_info[func](**action[args])obs resultprint(f 调用 {action[name]}({action[args]}) → {result})except Exception as e:obs f工具执行错误: {e}# 【观察】将工具返回结果记入记忆供下一轮 LLM 使用self.messages.append({role: assistant, content: response})self.messages.append({role: user, content: fObservation: {obs}})print(f\n⚠️ 达到最大循环次数 {max_steps}自动停止)# ═══════════════════════════════════════════════════════════════# 3. 启动# 支持任何 OpenAI 兼容接口。# 常见配置取消注释即可使用# ═══════════════════════════════════════════════════════════════if __name__ __main__:# DeepSeek: modeldeepseek-chat, base_urlhttps://api.deepseek.com/v1agent Agent(modeldeepseek-v4-flash,api_keysk-your-api-key,base_urlhttps://api.deepseek.com/v1)agent.run(input( 请输入你的问题: ))

相关新闻

Claude机会点识别不是猜测——用3层验证模型(业务层/数据层/合规层)锁定真需求
2026/6/11 17:53:45

Claude机会点识别不是猜测——用3层验证模型(业务层/数据层/合规层)锁定真需求

更多请点击: https://intelliparadigm.com 第一章:Claude机会点识别不是猜测——用3层验证模型(业务层/数据层/合规层)锁定真需求 在企业级AI应用落地过程中,将Claude模型嵌入业务流程常陷入“伪需求陷阱”&#xff1…

阅读更多
深入XTDrone仿真:手把手教你用ROS话题控制无人机旋转与定点(解析/xtdrone/iris_0/cmd_vel_flu)
2026/6/10 3:22:03

深入XTDrone仿真:手把手教你用ROS话题控制无人机旋转与定点(解析/xtdrone/iris_0/cmd_vel_flu)

深入解析XTDrone仿真:ROS话题控制无人机的核心技术与实战在无人机仿真领域,XTDrone凭借其与ROS和PX4的深度整合,为开发者提供了一个功能完备的测试平台。本文将聚焦于如何通过ROS话题实现对仿真无人机的精确控制,特别是针对/xtdro…

阅读更多
基于Arduino与VESC的智能骑行发电系统:算法模拟路感与再生制动实践
2026/6/14 11:13:02

基于Arduino与VESC的智能骑行发电系统:算法模拟路感与再生制动实践

1. 项目概述与核心价值作为一个常年泡在工作室里捣鼓电子项目和机械结构的老玩家,我一直对“人力发电”这个点子特别着迷。想想看,我们每天在健身房里挥汗如雨,那些能量最后都变成了跑步机散热风扇的热风,实在有点可惜。如果能把这…

阅读更多
ComfyUI IPAdapter Plus:如何通过多图融合实现精准角色特征控制
2026/6/14 14:57:54

ComfyUI IPAdapter Plus:如何通过多图融合实现精准角色特征控制

ComfyUI IPAdapter Plus:如何通过多图融合实现精准角色特征控制 【免费下载链接】ComfyUI_IPAdapter_plus 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI_IPAdapter_plus 在AI图像生成领域,保持角色一致性一直是个技术难题。传统方法要么…

阅读更多
企业级虚拟化平台扩展工具:macOS与VMware ESXi集成深度实战指南
2026/6/14 14:57:54

企业级虚拟化平台扩展工具:macOS与VMware ESXi集成深度实战指南

企业级虚拟化平台扩展工具:macOS与VMware ESXi集成深度实战指南 【免费下载链接】esxi-unlocker VMware ESXi macOS 项目地址: https://gitcode.com/gh_mirrors/es/esxi-unlocker 在虚拟化技术日益成熟的今天,VMware ESXi作为企业级虚拟化平台的标…

阅读更多
深入解析MPC7450:PowerPC架构的缓存一致性与内存管理实战
2026/6/14 14:57:54

深入解析MPC7450:PowerPC架构的缓存一致性与内存管理实战

1. 项目概述如果你在嵌入式系统、网络设备或者某些老牌工作站领域摸爬滚打过,那么“PowerPC”这个名字对你来说一定不陌生。它不像x86那样无处不在,但在那些对性能、能效和可靠性有着极致要求的角落里,PowerPC架构的处理器曾是当之无愧的王者…

阅读更多
如何快速上手Arduino红外遥控:新手完整指南
2026/6/14 14:57:54

如何快速上手Arduino红外遥控:新手完整指南

如何快速上手Arduino红外遥控:新手完整指南 【免费下载链接】Arduino-IRremote Infrared remote library for Arduino: send and receive infrared signals with multiple protocols 项目地址: https://gitcode.com/gh_mirrors/ar/Arduino-IRremote Arduino-…

阅读更多
深入解析MPC7450指令集:同步机制、流水线优化与底层编程实践
2026/6/14 14:57:54

深入解析MPC7450指令集:同步机制、流水线优化与底层编程实践

1. 项目概述:深入MPC7450的指令世界如果你正在为PowerPC架构,特别是像MPC7450这样的高性能处理器编写底层系统软件、操作系统内核或者高性能计算库,那么你很可能已经和它的指令集手册“搏斗”过。手册里那些关于“执行同步”、“上下文同步”…

阅读更多
MPC8260 ADS开发板硬件设计深度解析:连接器、BOM与调试实战
2026/6/14 13:57:54

MPC8260 ADS开发板硬件设计深度解析:连接器、BOM与调试实战

1. 项目概述:从一份手册到一套硬件设计指南在嵌入式硬件开发领域,尤其是面对像Freescale(现NXP)MPC8260这类高度集成的通信处理器时,开发板(Application Development System, ADS)不…

阅读更多
别再只用BERT了!用Transformers库的AutoModel,5分钟搞定文本相似度计算(附代码对比)
2026/6/14 0:57:30

别再只用BERT了!用Transformers库的AutoModel,5分钟搞定文本相似度计算(附代码对比)

超越BERT:用Transformers库高效实现文本相似度计算的三种实战方案在自然语言处理领域,文本相似度计算是信息检索、问答系统和推荐系统等应用的核心技术。传统方法如TF-IDF或Word2Vec已逐渐被基于Transformer的预训练模型所取代。Hugging Face的Transform…

阅读更多
Prompt Engineering:重构人机协作的工程化方法论
2026/6/14 0:57:30

Prompt Engineering:重构人机协作的工程化方法论

1. 项目概述:这不是“写提示词”,而是重构人机协作的底层逻辑“Prompt Engineering”这个词,这两年被讲得太多,也太轻飘。很多人把它理解成“给AI发指令的技巧”,甚至简化为“多加几个形容词”“换种说法再试一次”。我…

阅读更多
Anthropic提示层归零:模型即协议的工程实践
2026/6/14 0:57:30

Anthropic提示层归零:模型即协议的工程实践

1. 项目概述:这不是一次普通更新,而是一次架构级“蒸发”“Anthropic Just Shipped the Layer That’s Already Going to Zero”——这个标题一出来,我正在调试一个Claude调用链的终端前停了三秒。不是因为震惊,而是因为熟悉&…

阅读更多
别再只用BERT了!用Transformers库的AutoModel,5分钟搞定文本相似度计算(附代码对比)
2026/6/14 0:57:30

别再只用BERT了!用Transformers库的AutoModel,5分钟搞定文本相似度计算(附代码对比)

超越BERT:用Transformers库高效实现文本相似度计算的三种实战方案在自然语言处理领域,文本相似度计算是信息检索、问答系统和推荐系统等应用的核心技术。传统方法如TF-IDF或Word2Vec已逐渐被基于Transformer的预训练模型所取代。Hugging Face的Transform…

阅读更多
Prompt Engineering:重构人机协作的工程化方法论
2026/6/14 0:57:30

Prompt Engineering:重构人机协作的工程化方法论

1. 项目概述:这不是“写提示词”,而是重构人机协作的底层逻辑“Prompt Engineering”这个词,这两年被讲得太多,也太轻飘。很多人把它理解成“给AI发指令的技巧”,甚至简化为“多加几个形容词”“换种说法再试一次”。我…

阅读更多
Anthropic提示层归零:模型即协议的工程实践
2026/6/14 0:57:30

Anthropic提示层归零:模型即协议的工程实践

1. 项目概述:这不是一次普通更新,而是一次架构级“蒸发”“Anthropic Just Shipped the Layer That’s Already Going to Zero”——这个标题一出来,我正在调试一个Claude调用链的终端前停了三秒。不是因为震惊,而是因为熟悉&…

阅读更多
GIT修改用户名
2026/6/14 11:53:59

GIT修改用户名

在GIT中修改用户名可按以下步骤操作: 查看当前git的用户名,使用命令git config --list或git config user.name。修改git用户名,使用命令git config --global user.name "xxx(新的用户名)",将其中…

阅读更多
Win11Debloat:让你的Windows系统重获新生的终极优化工具
2026/6/13 15:45:46

Win11Debloat:让你的Windows系统重获新生的终极优化工具

Win11Debloat:让你的Windows系统重获新生的终极优化工具 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter and …

阅读更多
技术深度解析:m4s-converter实现原理与B站缓存视频转换最佳实践
2026/6/13 11:10:35

技术深度解析:m4s-converter实现原理与B站缓存视频转换最佳实践

技术深度解析:m4s-converter实现原理与B站缓存视频转换最佳实践 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter m4s-converter是一个…

阅读更多