对于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, 它有可能是为你梳理资料的那个“秘书”, 也有可能是帮你抓取数据的那种“爬虫”, 甚或是协助你制定学习规划的那个“助手”。