找回密码
 立即注册
首页 业界区 业界 200 行 Python 代码,从零手搓极简 Agent,吃透智能体核 ...

200 行 Python 代码,从零手搓极简 Agent,吃透智能体核心原理!

筒霓暄 4 小时前

现在市面上关于 AI Agent(智能体 的讨论越来越多,但大多停留在概念层面:自主思考、任务拆解、多智能体协同…… 听起来很高大上,却很少有人告诉你:AI Agent 的本质,到底是什么?
对于开发者来说,与其听一堆虚无缥缈的名词,不如亲手写一个。
今天我们不聊复杂理论,不套 LangChain、LlamaIndex 等框架,直接扒开 AI Agent 最底层的运行逻辑。
仅用不到 200 行 Python 代码,从零手搓一个完整可运行的极简 Agent,逐行拆解核心模块,新手复制粘贴就能直接跑通。
最终你到手的这个 Agent,具备四大核心能力:

  • 短期记忆对话:维护上下文,让无状态的 LLM 记住当前对话内容。
  • Function Calling 工具调用:给 LLM 装上 『手脚』,可读写文件、执行操作。
  • 智能上下文管理:手动清空 / 压缩 + 自动压缩上下文,彻底解决 token 溢出问题。
  • 长期记忆 + 极简 RAG:跨会话记住用户偏好,程序重启也不丢失,语义检索只给模型最相关的记忆。

吃透这套极简实现,你就能轻松举一反三:扩展技能(Skill)、多智能体(Multi-Agent)、自主规划等复杂能力,本质都是在这套底层逻辑上扩展。
Talk is cheap, show me the code! 文末附完整可运行 Python 源码!
1. 核心 LLM

很多人对大模型有个核心误区:觉得对话时它能记住上一句话,是模型本身有记忆能力。
但事实是,所有大模型天生都是无状态的—— 你上一轮和它说过什么,它本身根本不会留存。
那我们平时用的对话机器人,为什么能连贯对话?
答案非常简单:所谓的「短期记忆」,本质就是我们在代码里维护一个 messages 列表,把每一轮的对话历史,完整地传给大模型。
再套一个while True循环让程序持续运行,就是一个最简单的 Agent 雏形了。话不多说,直接上代码:
  1. from openai import OpenAIclient = OpenAI(base_url='http://localhost:11434/v1/', api_key='ollama-local')  # 大家按需修改为自己的大模型MODEL ="qwen3.5:4b"# 对话主循环def chat_loop():    # 维护对话上下文,实现短期记忆        messages = []    print("=== 极简Agent启动成功,输入/quit退出 ===")    while True:        user_input = input("\n你:").strip()        # 退出指令        if user_input == "/quit":            print("Agent:再见!")            break        # 加入用户输入到上下文        messages.append({"role": "user", "content": user_input})        # 调用大模型        response = client.chat.completions.create(model=MODEL, messages=messages)        reply = response.choices[0].message.content        # 加入模型回复到上下文,完成记忆闭环        messages.append({"role": "assistant", "content": reply})        print(f"Agent:{reply}")if __name__ == "__main__":    chat_loop()
复制代码
2. Function Calling  工具调用

LLM 只会动口(具有极强的意图识别能力),但不会动手(没法读取本地文件、没法获取实时数据、没法执行代码...)。
Function Calling 就是给 LLM 装上手脚,思路非常简单:

  • 我们提前定义好能实现具体功能的工具函数(读文件、写文件等);
  • 把工具的「使用说明书」(名称、功能、参数要求),整理成大模型能理解的格式,和用户指令一起传给 LLM;
  • LLM 收到需求后,自主决策:要不要调用工具?调用哪个?传什么参数?
  • 代码收到 LLM 的调用指令后,执行对应的工具函数,拿到执行结果;
  • 把执行结果再返回给 LLM,让它基于真实结果生成最终回答。

这里有个关键细节:很多复杂需求,大模型很可能需要连续调用多次工具。
比如你让它「把本地 a.txt 的内容整理成 markdown 格式,保存成 b.md」,它就需要先调用「读文件」拿内容,再调用「写文件」保存整理后的结果。
所以,我们要在主循环里,再加一层内层的 ReAct 循环,让它能反复调用工具,直到不需要再执行操作,再给你最终回复。
(1)定义工具

先给 Agent 写两个最基础的工具:读文件、写文件,这就是它能直接用的「手脚」。
  1. import jsondef read_file(file_path: str) -> str:    """读取本地文件"""    try:        with open(file_path, "r", encoding="utf-8") as f:            return f.read()    except Exception as e:        return f"读取失败:{str(e)}"def write_file(file_path: str, content: str) -> str:    """写入本地文件"""    try:        with open(file_path, "w", encoding="utf-8") as f:            f.write(content)        return f"写入成功:{file_path}"    except Exception as e:        return f"写入失败:{str(e)}"
复制代码
(2)给 LLM 的工具描述

大模型不会凭空知道怎么调用工具,我们需要把工具的信息,整理成它能识别的标准格式,同时做一个函数名到实际函数的映射,方便后续执行。
  1. TOOLS = [    {        "type": "function",        "function": {            "name": "read_file",            "description": "读取本地文件内容",            "parameters": {"type": "object", "properties": {"file_path": {"type": "string", "description": "要读取的文件路径"}}, "required": ["file_path"]}        }    },    {        "type": "function",        "function": {            "name": "write_file",            "description": "写入内容到本地文件",            "parameters": {"type": "object", "properties": {"file_path": {"type": "string", "description": "要写入的文件路径"}, "content": {"type": "string", "description": "要写入的内容"}}, "required": ["file_path", "content"]}        }    }]# 工具执行映射TOOL_MAP = {    "read_file": read_file,    "write_file": write_file}
复制代码
(3)加入内层工具循环

我们修改之前的chat_loop函数,加入内层循环,支持多轮连续工具调用:
[code]def chat_loop():    print("=== 极简Agent启动成功,输入/quit退出 ===")    # 维护对话上下文,实现短期记忆    messages = []    while True:        user_input = input("\n你:").strip()        # 退出指令        if user_input == "/quit":            print("Agent:再见!")            break        # 加入用户输入到上下文        messages.append({"role": "user", "content": user_input})        #
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册