news 2026/8/29 5:16:48

新手必看!手把手用Python写第一个AI Agent,简单到离谱

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
新手必看!手把手用Python写第一个AI Agent,简单到离谱

对于AI Agent而言, 不少新手觉得它是那种“高大上”的技术, 要具备深厚的算法功底以及复杂的框架知识方可上手。然而实际上呢, 凭借成熟的开源库还有简洁的代码逻辑, 就算是才刚开始接触的小白, 也能够在半小时之内写出一个可以自主执行任务的AI Agent。

今日便带来, 全网最为详尽的入门教程, 起始于环境搭建, 接着到代码编写, 随后是功能测试, 每一个步骤都, 逐一亲手拆解, 不存在晦涩难懂的术语, 全都是能够直接复制粘贴的实操内容, 助力你轻松跨出AI Agent开发的第一步。

一、先搞懂:什么是AI Agent?它到底能做什么?

在开始编写代码以前, 我们要首先花费2分钟弄明白核心概念, 防止出现“明明知道这样做, 却不清楚为什么要这样做”的情况。

不是简单的, 被称为AI Agent的, 是那种, 能够自己主动去感知所处环境的, 智能程序, 它还能制定计划, 并且执行任务。它跟普通脚本之间存在区别, 具体呢, 普通脚本是这样的情况, 就是你让它做什么, 它依据指令安排就做什么, 然而AI Agent不一样, 是你向它告知目标之后, 它会凭借自身能力想各种办法去完成。

举个简单的例子:

有种普通脚本, 你去写代码, 要让它达成打开指定文件夹, 接着去往读取所有txt文件, 随后再去提取关键词这样一系列操作, 其中步骤只要有一步出现差错, 那就会报错。

假设存在这样一个AI Agent, 你只需告知它, 帮我整理这个文件夹里的txt文件, 提取每个文件的核心关键词, 它便会自行规划步骤, 当遇到文件不存在的状况时, 还能够设法报错或者予以跳过, 并非需要你将每一步都固定写好不用你写死每一步。

以下是今天我们所要撰写的, 乃是一个“网页信息提取AI Agent”, 给予其一个网页链接, 它能够独立自主地达成“请求网页, 紧接着解析内容, 递进至提取标题以及正文, 最终保存至本地文件”这般完整详尽的流程任务, 并且还具备处理简易异常状况的能力。

二、准备工作:3分钟搭建开发环境

要想让工匠做好他的事情, 就一定要先让他把工具弄精良, 我们鉴于自身所需得去安装3个库, 这些库具有都是精巧优质并且能够轻易熟练操作的特性:

1. :用于发送网页请求,获取网页内容;

2. :用于解析HTML页面,提取需要的信息;

3. 能够提供AI Agent的基础框架, 以此来帮助我们, 去相对快速地构建智能体, 而且不用我们自己去撰写复杂的决策逻辑。

安装步骤(复制到终端执行)

# 安装依赖库

pip

去验证一下安装究竟有没有成功, 要打开终端, 接着输入一下下面这样子的代码, 倘若没有出现报错的情况的话那就表明环境是没有问题的。

from bs4

from . , t

print("环境搭建成功!")

三、核心代码编写:手把手拆解,每一行都讲清楚

我们所拥有的AI Agent被划分成4个核心模块, 其中有环境感知模块, 其职能是获取网页内容, 另有任务规划模块, 该模块的作用是要去确定所要做的步骤, 还有执行模块,执行模块负责解析以及提取信息, 除此之外还有存储模块, 存储模块用于保存结果。接下来, 一步步去编写代码, 在整个过程中注释要清晰明了, 即便新手也能够看得懂。

步骤1:导入所需库和模块

# 用于发送网页请求

# 用于解析HTML

from bs4

# 核心模块,构建Agent

from . , t

from .

from .tools Tool

从列表, 元组, 任意类型, 联合类型之中。

步骤2:定义工具函数——让Agent有“干活的能力”

执行具体任务时, AI Agent需要“工具”, 这和人干活需要工具是一样的。我们定义3个工具函数。

1. 获取网页内容:根据链接下载网页HTML;

2. 解析网页信息:提取标题和正文;

3. 保存到本地文件:把提取的内容存成txt。

# 工具1:获取网页内容

def (url: str) -> str:

try:

# 发送请求,添加请求头模拟浏览器,避免被反爬

= {

“用户代理”: “/5.0( 新台币10.0; 64位视窗; 64型) /537.36( 类壁虎KHTML) /120.0.0.0 /537.36”。

= .get(url, =, =10)

.() # 抛出HTTP异常

. =

. # 自动识别编码

.text

as e:

f"获取网页失败:{str(e)}"

# 工具2:解析网页,提取标题和正文

def (html: str) -> str:

try:

soup = (html, "html.")

# 提取标题

title等于soup的title, 如果存在soup的title的话, 否则就是“无标题”。

# 提取正文(去除和style标签)

for in soup(

"", "style"

):

.()

# 合并结果

标题呈现为: {title}, 正文内容是: {text} , 二者以不同分列为两个部分, 组成这样一份文本结果状态。

as e:

f"解析网页失败:{str(e)}"

# 工具3:保存内容到本地txt文件

try:

f.write()

f"内容已成功保存到 {}"

as e:

f"保存文件失败:{str(e)}"

步骤3:构建AI Agent核心——让它学会“自主决策”

这一步占据着关键局面, 我们所运用的那个整体架构, 使得智能体拥有以此目标为依据自行挑选工具去开展任务的潜力, 而并非需要我们以实际手动操作的方式去调用函数来达成。

第1点, 定义工具列表, 将刚才撰写出的函数, 封装成为Agent能够识别的工具。

tools =

Tool(

name="",

func=,

="用于获取指定网页的HTML内容,输入参数是网页链接"

),

Tool(

name="",

func=,

=用于对HTML内容做解析, 从中提取标题以及正文, 其输入参数为网页的HTML字符串。

),

Tool(

name="",

func=,

它的作用是, 把提取到的内容, 保存到本地的txt文件之中, 其输入参数呢, 是需要保存的文本内容。

# 2. 定义Agent类:核心决策逻辑

class (t):

@

def (self) -> List:

# Agent的输入是网页链接

def plan(

self,

: List,

**: Any,

) -> Union:

# 决策逻辑:根据已完成的步骤,决定下一步做什么

url =

if not :

# 第一步:还没做任何事,先获取网页内容

f"调用 工具,参数:{url}"

elif len() == 1:

# 第二步:已经获取了HTML,下一步解析内容

=

if "失败" in :

# 获取失败,直接返回结果

f"调用 工具,参数:{}"

elif len() == 2:

# 第三步:已经解析了内容,下一步保存到文件

=

if "失败" in :

# 解析失败,直接返回结果

f"调用 工具,参数:{}"

else:

# 所有步骤完成

"任务已完成!"

async def aplan(

self,

: List,

**: Any,

) -> Union:

# 异步规划(这里和同步逻辑一致,新手可以忽略)

self.plan(,** )

# 3. 解析工具调用指令

def (: str) -> Tuple:

if "调用" not in :

("", )

进行分割操作, 先按照“调用”一词进行分割, 之后再依据“工具”一词进行分割, 最后执行去除两端空白字符的操作。

= .split("参数:").strip()

(, )

# 4. 创建Agent执行器

def r() -> :

agent = ()

.(

agent=agent,

tools=tools,

=True, # 开启详细日志,方便看执行过程

=

步骤4:编写主函数——运行AI Agent

最后写一个主函数,传入网页链接,让Agent开始工作:

if == "":

# 创建Agent执行器

= r()

# 目标网页链接(可以换成你想提取的链接)

= ""

# 运行Agent

= .({"url": })

# 输出结果

print("\n===== 任务执行结果 =====")

print()

四、测试运行:看AI Agent如何自主完成任务

在代码被写完之后, 我们实施测试这一行为, 以此查看当前这个AI Agent从事工作时是否能够依照预期的情况去运行。

运行步骤

1. 把代码保存为 .py;

2. 打开终端,输入 .py;

3. 观察终端输出的日志,你会看到Agent的执行流程:

第一步:自动调用 工具,获取目标网页的HTML;

第二步:如果获取成功,自动调用 工具,提取标题和正文;

第三步, 要是解析达成成功的状态, 便会自行去调用那个工具, 将内容完好保存妥当到那个.txt文件之中。

最终得出的结果是, 终端会输出任务完成的提示, 与此同时, 在本地生成一个txt格式的文件。

常见问题及解决方法

1. 那种被表述为“获取网页失败”的状况, 很大程度上是由于目标网站存在反爬机制, 又或者是链接处于无效的情形。能够去尝试更换一个公开的网页链接, 就像(举例内容)那样去尝试。

2. “解析网页失败”, 这种情况有可能是因为网页结构太过复杂, 以至于无法进行解析。若是如此情况, 可以尝试采用 lxml解析器展开解析(不过这要求额外安装 pip lxml, 之后需要将 html. 替换为 lxml)。

3. 出现“保存文件失败”这种情况, 有可能是存在没有得以具备的文件写入权限, 那么不妨将保存路径作出更改, 改成桌面去尝试一下。

五、功能升级:给你的AI Agent加“buff”

这个处于基础版本的人工智能智能体已然能够达成简单的任务, 我们还能够为其增添一些具备实用性质的功能, 从而使得它变得更加智能。

升级1:支持批量处理多个网页链接

修改主函数,让Agent能一次性处理多个链接:

if == "":

= r()

# 批量链接列表

=

"", ""

for i, url in ():

print(f"\n===== 针对第 {i + 1} 个链接展开处理: {url} =====")。

= .({"url": url})

print()

升级2:添加异常重试机制

在工具函数里添加重试逻辑,比如获取网页失败时重试2次:

函数定义为, 参数为一个字符串类型的url, 还有一个默认值为2的整数类型参数, 返回值为字符串类型。

for i in range( + 1):

try:

= {

"User-Agent": "/5.0 ( NT 10.0; Win64; x64) /537.36 (KHTML, like Gecko) /120.0.0.0 /537.36"

= .get(url, =, =10)

.()

. = .

.text

as e:

if i == :

f"获取网页失败(已重试{}次):{str(e)}"

进行打印操作, 打印的内容为“获取失败, 正在重试第”, 其后紧跟变量 \(i + 1\) 的值 , 再接着打印“次 ...”。

升级3:支持提取指定标签内容

将函数更改, 促使它能够把特定的HTML标签给提炼出来, 像是仅仅提炼从某个起始点往后截至特定位置的、标明为标题的那些HTML字符串部分 , 标点符号!

def (html: str, : List =

"h1", "h2", "h3", "p"

) -> str:

try:

soup = (html, "html.")

title = soup.title. if soup.title else "无标题"

=

for tag in :

= soup.(tag)

for elem in :

.(elem.(strip=True))

这个句子似乎不太完整,你可以补充完整后让我继续为你按照要求进行改写。请把它完整准确地呈现出来。

as e:

f"解析网页失败:{str(e)}"

六、进阶方向:从“玩具”到“实用工具”

它只是入门案例, 是这个基础版的AI Agent, 若想把它变成真正能实用的工具, 朝着这几个方向深入即可:

1. 接入大语言模型, 也就是LLM, 像对接GPT、文心一言这类模型, 以此让Agent能够理解更为复杂的自然语言指令, 存在这样的指令, 例如“帮我提取这篇文章中关于人工智能的段落, 并且用一句话进行总结”。

2. 增添记忆功能, 使得 Agent 能够记住先前的任务执行结果, 像是提取过的网页链接, 还有保存的文件路径, 在下次执行的时候无需重复进行相关操作。

3. 多Agent协作, 使得多个Agent进行分工合作, 其中一个承担爬取网页的工作, 一个负责分析内容, 还有一个负责生成报告, 以此共同来完成复杂任务。

4. 制作添加可视化界面的操作: 运用PyQt来编写一个简易的GUI, 使得那些不明白代码的人也能够借由点击按钮的方式来运用这个Agent。

七、总结:AI Agent没你想象的那么难

很多人认定AI Agent是高深莫测的技术, 然而通过今天的教程能发觉, 只要把握了核心框架以及工具函数, 新手也能够迅速上手。

这个案例的核心逻辑并不繁杂, 把那任务划分成逐个步骤, 使得Agent依据当下状态自行挑选工具去执行, 从本质上来说, 就是“自动化 + 决策逻辑”两者的结合。

以这个基础案例作为起始点, 你能够持续增添功能, 终究能创作出可解决实际问题的AI Agent, 它有可能是为你梳理资料的那个“秘书”, 也有可能是帮你抓取数据的那种“爬虫”, 甚或是协助你制定学习规划的那个“助手”。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/29 5:16:41

湖南码界领航教育科技有限公司:Python的广泛应用与职业价值

湖南码界领航教育科技有限公司: 的广泛应用与职业价值倘若讲易学性是那吸引初学者前来探寻的“入门石”, 那么其充满强大效能、具备涵盖广泛的应用情景以及呈现持续飙升态势的职业价值, 就是促使学习者能够长时间深入钻研的关键动力所在。在数字化犹如浪潮般涌动进展…

作者头像 李华
网站建设 2026/8/29 5:14:12

2015阿里实习生笔试题深度解析:Java基础与核心算法考点

1. 关注这份2015年阿里巴巴实习生笔试题,其实是在关注什么 每年三四月份,大厂实习生招聘笔试一出来,论坛上、校招群里就会炸开锅。特别是阿里巴巴这种级别的公司,笔试题一旦流出,大家第一反应不是“这题我不会”&#…

作者头像 李华
网站建设 2026/8/29 5:13:27

拓扑排序与动态规划:DAG路径计数在生态建模中的算法实践

1. 项目概述:从一道题看生态建模与算法思维最近在整理算法笔记时,又翻到了这道经典的“P4017 最大食物链计数”。题目本身是洛谷上一个关于拓扑排序的练习题,但它的背景设定非常有意思——模拟一个生态系统的食物网,要求计算从最底…

作者头像 李华
网站建设 2026/8/29 5:13:19

从SIER模型到Python实战:传染病动力学建模与干预策略量化评估

1. 项目概述:从“黑箱”到“显微镜”,传染病模型的价值何在?如果你关注过公共卫生事件,或者对数据科学、系统仿真感兴趣,那么“传染病模型”这个词你一定不陌生。它听起来很学术,似乎离我们很远&#xff0c…

作者头像 李华
网站建设 2026/8/29 5:12:26

第一、二类斯特林(Stirling)数的指数型生成函数(EGF)及其组合解释

1. 斯特林数与生成函数:从排列组合到形式幂级数第一次接触斯特林数时,我被它那看似复杂的定义弄得一头雾水——这些数字既不像组合数那样直观,也不像斐波那契数列那样有明确的递推关系。直到我发现了生成函数这个神奇的工具,才真正…

作者头像 李华
网站建设 2026/8/29 5:06:49

PCF8591 ADDA转换芯片:从原理到实战的I2C接口模数转换应用

1. 从模拟到数字的桥梁:为什么ADDA转换无处不在如果你玩过Arduino或者树莓派,肯定遇到过这样的场景:想用单片机读取一个电位器的旋转角度,或者根据环境光线强度自动调节LED灯的亮度。这时候,你手头的传感器&#xff08…

作者头像 李华