从零开始:用Python和Gemini 3四步搭建你自己的AI Agent

作者:deephub日期:2025/11/29

很多人第一次看到 AI Agent 自己编辑文件、跑代码、修 bug,还能一直运行下去的时候,都觉得挺神奇。其实远没有想象中那么复杂。这里没什么秘密算法,也没有什么"智能体大脑"这种玄学概念。

AI Agent核心就三件事:循环 + LLM + 工具函数

如果你会写个

1while True
2

循环?那基本就算成功一半了。

这篇文章会完整展示怎么用 Gemini 3 搭一个真正能用的 Agent:从最基础的 API 调用,到一个能读写文件、理解需求的命令行助手。

Agent 到底是什么

传统程序就是流程图那一套:步骤 A → 步骤 B → 步骤 C → 结束。

而Agent 不一样,它会根据当前状况决定下一步干什么。可以理解成围绕 LLM 搭的一个小系统,比如说:

  • 规划任务
  • 执行操作
  • 根据结果调整
  • 循环往复直到搞定

所以不是写死的脚本,更像是个会思考的循环。

不管多复杂的 Agent,都逃不开这四个部分:

1、模型 负责思考

这里用的是 Gemini 3 Pro。它可以分析用户需求,决定接下来该做什么。

2、工具 负责执行

就是一堆函数:读文件、列目录、发邮件、调 API…想加什么加什么。

3、上下文工作记忆

模型当前能看到的所有信息,怎么管理这块内容,业内叫 Context Engineering

4、循环 运转机制

观察 → 思考 → 行动 → 重复,一直到任务完成。

就这么四块,没别的了。

循环的运行逻辑

几乎所有 Agent 都是这个流程:

先把可用的工具描述给模型看,然后把用户请求和工具定义一起发给模型。模型会做决策:要么直接回复,要么调用某个工具并传参数。

但是你要写代码负责在 Python 里执行这个工具。

执行完把结果喂回给 Gemini。

模型拿到新信息后继续判断下一步。

就这样循环,直到模型觉得任务完成了。

下面我们开始写:

第一步:基础聊天机器人

先写个 Gemini 3 API 的简单封装 ,其实就是个能记住对话的类。

1 from google import genai  
2from google.genai import types  
3   
4class Agent:  
5    def __init__(self, model: str):  
6        self.model = model  
7        self.client = genai.Client()  
8        self.contents = []  
9   
10    def run(self, contents: str):  
11        self.contents.append({"role": "user", "parts": [{"text": contents}]})  
12   
13        response = self.client.models.generate_content(  
14            model=self.model,  
15            contents=self.contents  
16        )  
17   
18        self.contents.append(response.candidates[0].content)  
19        return response  
20   
21agent = Agent(model="gemini-3-pro-preview")  
22
23response1 = agent.run(  
24    "Hello, what are the top 3 cities in Germany to visit? Only return the names."  
25)  
26 print(response1.text)
27

上面代码能跑,但是就是个聊天机器人。它啥也干不了,因为没有"手"。

第二步:加入工具函数

工具其实就是 Python 函数 + 一段 JSON schema 描述。描述是给 Gemini 看的,让它知道这个函数能干啥。

这里加三个简单的:

  • read_file- 读文件
  • write_file- 写文件
  • list_dir- 列目录

先写定义:

1 read_file_definition = {  
2    "name": "read_file",  
3    "description": "Reads a file and returns its contents.",  
4    "parameters": {  
5        "type": "object",  
6        "properties": {  
7            "file_path": {"type": "string"}  
8        },  
9        "required": ["file_path"],  
10    },  
11}  
12   
13list_dir_definition = {  
14    "name": "list_dir",  
15    "description": "Lists the files in a directory.",  
16    "parameters": {  
17        "type": "object",  
18        "properties": {  
19            "directory_path": {"type": "string"}  
20        },  
21        "required": ["directory_path"],  
22    },  
23}  
24   
25write_file_definition = {  
26    "name": "write_file",  
27    "description": "Writes contents to a file.",  
28    "parameters": {  
29        "type": "object",  
30        "properties": {  
31            "file_path": {"type": "string"},  
32            "contents": {"type": "string"},  
33        },  
34        "required": ["file_path", "contents"],  
35    },  
36 }
37

然后是实际的 Python 实现:

1 def read_file(file_path: str) -> dict:  
2    with open(file_path, "r") as f:  
3        return f.read()  
4   
5def write_file(file_path: str, contents: str) -> bool:  
6    with open(file_path, "w") as f:  
7        f.write(contents)  
8    return True  
9   
10def list_dir(directory_path: str) -> list[str]:  
11     return os.listdir(directory_path)
12

打包一下就搞定了:

1 file_tools = {  
2     "read_file": {"definition": read_file_definition, "function": read_file},  
3     "write_file": {"definition": write_file_definition, "function": write_file},  
4     "list_dir": {"definition": list_dir_definition, "function": list_dir},  
5 }
6

第三步:真正的 Agent

现在把 Agent 类扩展一下,让它能:

  • 识别工具调用
  • 在 Python 里执行对应的函数
  • 把结果传回 Gemini
  • 继续循环直到完成
1 class Agent:  
2    def __init__(self, model: str, tools: dict,   
3                 system_instruction="You are a helpful assistant."):  
4        self.model = model  
5        self.client = genai.Client()  
6        self.contents = []  
7        self.tools = tools  
8        self.system_instruction = system_instruction  
9   
10    def run(self, contents):  
11        # Add user input to history  
12        if isinstance(contents, list):  
13            self.contents.append({"role": "user", "parts": contents})  
14        else:  
15            self.contents.append({"role": "user", "parts": [{"text": contents}]})  
16   
17        config = types.GenerateContentConfig(  
18            system_instruction=self.system_instruction,  
19            tools=[types.Tool(  
20                function_declarations=[  
21                    tool["definition"] for tool in self.tools.values()  
22                ]  
23            )],  
24        )  
25   
26        response = self.client.models.generate_content(  
27            model=self.model,  
28            contents=self.contents,  
29            config=config  
30        )  
31   
32        # Save model output  
33        self.contents.append(response.candidates[0].content)  
34   
35        # If model wants to call tools  
36        if response.function_calls:  
37            functions_response_parts = []  
38   
39            for tool_call in response.function_calls:  
40                print(f"[Function Call] {tool_call}")  
41   
42                if tool_call.name in self.tools:  
43                    result = {"result": self.tools[tool_call.name]["function"](**tool_call.args)}  
44                else:  
45                    result = {"error": "Tool not found"}  
46   
47                print(f"[Function Response] {result}")  
48   
49                functions_response_parts.append(  
50                    {"functionResponse": {"name": tool_call.name, "response": result}}  
51                )  
52   
53            # Feed tool results back to the model  
54            return self.run(functions_response_parts)  
55          
56         return response
57

这样就可以跑一下试试了:

1 agent = Agent(  
2    model="gemini-3-pro-preview",  
3    tools=file_tools,  
4    system_instruction="You are a helpful Coding Assistant. Respond like Linus Torvalds."  
5)  
6
7response = agent.run("Can you list my files in the current directory?")  
8 print(response.text)
9

如果没问题,Gemini 会调工具,拿到结果,然后给出最终回复。

到这一步,一个能用的 Agent 就搭好了。

第四步:包装成命令行工具

最后我们在再套个输入循环就行:

1 agent = Agent(  
2    model="gemini-3-pro-preview",  
3    tools=file_tools,  
4    system_instruction="You are a helpful Coding Assistant. Respond like Linus Torvalds."  
5)  
6   
7print("Agent ready. Type something (or 'exit').")  
8while True:  
9    user_input = input("You: ")  
10    if user_input.lower() in ['exit', 'quit']:  
11        break  
12   
13    response = agent.run(user_input)  
14     print("Linus:", response.text, "\n")
15

代码很少但是效果已经相当不错了。

总结

搭 Agent 一开始看着挺唬人,但理解了结构之后,会发现简单得有点无聊。往简单了说,它就是个循环。一个里面跑着聪明模型的循环。明白这点之后,你就能造出看起来"有生命"的 Agent 了。

如果想继续扩展的话,可以加这些:

网络搜索、数据库查询、执行 shell 命令、调用云服务、长期记忆、工作流编排、任务调度、多步规划…

但不管怎么加,底层还是那个简单结构:

观察 → 思考 → 行动 → 重复

这就是现代 Agent 的核心。

https://avoid.overfit.cn/post/67cef1690eb14d2fb3ecc0ff7bdf91f8


从零开始:用Python和Gemini 3四步搭建你自己的AI Agent》 是转载文章,点击查看原文


相关推荐


提升 EdgeWorker 可观测性:使用 DataStream 设置日志功能
AKAMAI2025/11/26

关于作者:AJ Johnson 是 Akamai Technologies 的高级产品经理,专注于平台即服务(PaaS),并领导旨在扩展和优化公司云平台能力的战略计划。 如您所在的企业也在考虑采购云服务或进行云迁移, 点击链接了解Akamai Linode解决方案,现在申请试用可得高达500美元专属额度 询问任何开发者,他们都会告诉您,良好且及时的应用遥测对于构建、维护和优化应用程序至关重要。没有适当的反馈,开发人员就如同在黑暗中摸索,难以识别逻辑错误、合规性问题以及优化空间。应用日志记录


Python异步爬虫实战:从基础请求到高效数据抓取的全流程解析与优化技巧
2501_941801762025/11/24

在互联网技术飞速发展的今天,数据获取和处理成为了各类应用的核心能力。Python 以其简洁、高效的特性,成为了网络爬虫与数据抓取领域的首选语言。今天,我们将从基础请求开始,逐步深入 Python 异步爬虫的实践方法,并结合优化技巧分享一些实战经验。 一、网络请求基础 网络爬虫的核心是 HTTP 请求。Python 内置的 requests 库为同步请求提供了非常友好的接口,使用起来极为方便。例如,简单的网页抓取可以通过以下方式实现: import requests url = 'ht


进程、线程、协程三者的区别和联系
爱学习的小道长2025/11/23

1. 核心概念对比 特性维度进程 (Process)线程 (Thread)协程 (Coroutine)基本定义资源分配的基本单位,拥有独立的地址空间CPU调度的基本单位,共享进程的资源用户态的轻量级线程,在单线程内通过协作进行任务切换隔离性强,一个进程崩溃通常不会影响其他进程弱,一个线程崩溃可能导致整个进程退出,影响同进程所有线程。无,所有协程在同一线程内运行。开销大,创建、销毁和上下文切换(涉及页表、寄存器等)成本高。中等,创建和切换开销比进程小,但仍需内核介入。极小,切换由程序控制,无需内


Redis(136)Redis的客户端缓存是如何实现的?
Victor3562025/11/21

Redis 的客户端缓存(Client-Side Caching)是一项重要特性,允许客户端在本地缓存 Redis 数据,从而减少与 Redis 服务器的通信频率,提高应用的响应速度和可扩展性。Redis 客户端缓存的实现主要依赖于以下几个核心组件和机制: 订阅机制:客户端通过订阅特定的键空间事件,获取键的变更通知。 通知机制:Redis 服务器在键发生变更时,通过发布/订阅(Pub/Sub)机制将变更通知推送给客户端。 缓存一致性:确保客户端缓存与 Redis 服务器的数据一致性。 核心概


【AI省流快讯】Cloudflare 炸了 / Gemini 3 来了 / Antigravity 独家实测 (附:无法登录解法)
coder_pig2025/11/19

1. Cloudflare 挂了 🤡 昨晚陆续刷到 "CF挂了" 的消息,没太在意,直到无法打开" 盗版漫画" 站点,我才意识到问题的严重性: 🤣 原因众说纷纭,刷到这哥们的 "梗图",差点把我笑岔气: 😃 还有人猜测可能是 Google 发布的 "哈基米 3" (Gemini) 发起的攻击: 时间线: 【19:30】用户开始报告网站无法访问,出现10xx、52x、50x系列错误;Cloudflare Dashboard无法访问;部分Cloudflare域名解析中断。 【19:4


Excel处理控件Aspose.Cells教程:使用Python从Excel工作表中删除数据透视表
IT开发者笔记2025/11/18

在使用 Excel 处理数据时,数据透视表通过汇总大型数据集,简化了分析过程。但随着分析的深入,您可能需要删除旧的数据透视表,以保持工作表的整洁或为新的分析结果做好准备。您可以快速删除任何数据透视表,无需手动查找,也不会留下任何失效的引用。本教程将逐步介绍如何借助Aspose.Cells使用Python从Excel 工作表中删除数据透视表。 Aspose.Cells官方试用版免费下载 本篇教程适合: 使用Excel高级用户自动生成每月演示文稿每周一都要重建仪表盘的数据分析师宁愿写五行代码也


用 TRAE SOLO 高效开发的 12 个小技巧
TRAE_ai2025/11/17

本文作者:云舒,TRAE 产品运营 用 SOLO 高效开发的 12 个技巧,从入门到精通,带你玩转 SOLO。 第一部分:入门篇 技巧 1:根据项目需求选择合适的内置智能体 TRAE SOLO 内置了两个核心智能体:SOLO Coder和 SOLO Builder,它们分别适用于不同的开发场景,明确场景后选择合适的智能体,能显著提升推进效率与结果质量。 如果你想处理基于现有代码库的迭代、重构和 Bug 修复等复杂任务,SOLO Coder 是最佳的选择,它具备优秀的项目理解和上下文管理能力


linux之ubuntu qt界面开发开发点菜系统
RouDragon2025/11/16

首先这篇博客主要讲解的是如何设计一个基于qt开发的点菜系统,这方面有很多内容会引用他人的文章需要继续学习他人的文章才会明白此文章是在讲解啥。 自制点菜系统视频链接 整体设计思路     这张图其实很详细的介绍了点菜系统需要的技术,在开发板方面,也就是服务器端,首先屏幕显示也是基于qt开发,所有你的ubuntu qt开发的时候就得设置好其编译器和环境基于开发板的,同时你还需要另一套环境进行直接在开发板上测试不需要反反复复的在开发板上重装。屏幕显示部分还需要首先设置一个登陆界面当客户


进入职场第五课——突破和跃升
Mapbarfront2025/11/14

观察、融入、立足、产出,度过这4个阶段之后,你已经稳稳地,成为团队里的主力输出了,接下来,如果你想从团队中的好员工,跃升为老板眼中的关键人物,从业务骨干到真正的团队核心,必须要做的下一步就是突破,易经乾卦中的或跃在渊,说的就是这个意思。 或是或许,代表着不确定性,跃是跳跃,代表着勇敢一搏,在渊是指在深渊里,代表着突破前在深渊里的等待,这个阶段,是你在积蓄了足够的力量之后,遇到合适的机会纵身一跃的时刻,这是审慎的冒险,也是耐心等待之后的水到渠成,想要完成这次关键的进阶,以下这5个动作,你要步步为营


uos基础 dmesg 查看内核的实时日志
行初心2025/11/13

统信桌面操作系统专业版V20(1070) Linux uos 5.10.97-arm64-desktop uos基础 dmesg 查看内核的实时日志 root@uos:~# dmesg -wH [11月10 14:59] [pid:3256,cpu1,Xwayland,1][HISI_DRM_HEAPS D]:do_alloc_memory: need alloc size=0x3000, now pool size=0x1a60000 [ +0.000000] [pid:3256,cpu1

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2025 聚合阅读