- AI 代理 通常是一个循环运行的语言模型,具有工具和目标。
- 循环很简单:决定、行动、观察结果并重复直到完成。
- 该模型仅建议行动。您的代码运行它们,这是您执行规则的地方。
- 代理可能会循环或滥用工具,因此请设置步骤限制并要求批准危险操作。
向聊天机器人询问延迟订单的情况,它会给你一些建议。询问 AI 代理,它可以查找订单、检查延迟、申请优惠券并返回报告。不同之处在于,代理可以采取行动并对发生的情况做出反应,而不是只产生一个答复。
该术语在营销中被延伸,因此本指南坚持这些系统的实际工作方式。为了具体起见,我们在 Python 3.13 中构建了一个小型代理循环并运行它,下面的输出来自这些运行。 我们的“模型”是一个脚本函数,而不是真正的人工智能模型,因此任何人都可以运行和测试循环。它显示的是控制结构,而不是智能。刚接触基础知识?首先阅读什么是大语言模型。
什么是AI代理?
没有一个统一的定义。在目前的实践中,人工智能代理是一种通过反复决定下一步做什么、使用工具对世界采取行动并根据结果进行调整来追求目标的软件。通常,决策来自大型语言模型。
想一想指路的人和跑腿的人之间的区别。第一个回答一次。第二个出去,发现商店关门了,就尝试另一家,直到工作完成后才回来。
聊天机器人、工作流程还是代理?
| 类型 | 谁决定步骤? | 可以行动吗? | 示例 |
|---|---|---|---|
| 聊天机器人 | 用户驾驶每一回合 | 通常不会 | 根据文字回答问题 |
| 固定工作流程 | 开发商提前 | 是的,在设定的路径上 | 总结每张票,然后安排路线 |
| 人工智能代理 | 运行时的模型 | 是的,在限制范围内 | 调查并解决票证 |
这些存在于一个范围内,并且许多有用的系统是混合的。关键问题是有多少路径是在运行时决定的。
代理内部有什么
| 部分 | 角色 |
|---|---|
| 型号 | 根据目标和迄今为止发生的情况决定下一步 |
| 使用说明 | 应遵循的目标、规则和限制 |
| 工具 | 它可以请求的功能,例如搜索或调用 API |
| 内存 | 它从早期步骤或过去的会话中了解到什么 |
| 控制回路 | 运行工具并强制执行限制的普通代码 |
代理循环
- 决定。模型查看目标和历史,并选择一个动作或决定它已完成。
- Act. 您的代码运行所请求的工具。
- 观察。结果被添加到历史记录中。
- 重复,直到达到目标或达到限制。
这是大多数代理的核心。复杂性主要在于围绕这个循环的模型、工具和保障措施。
您可以运行的循环
我们的小代理处理延迟订单。它有两种工具,其中一种需要人工批准,因为它需要花钱:
ORDERS = {
"A100": {"status": "delayed", "days_late": 6},
"B200": {"status": "shipped", "days_late": 0},
}
def get_order(order_id):
return ORDERS.get(order_id, {"error": "order not found"})
def issue_voucher(order_id, amount):
return {"voucher": f"V-{order_id}", "amount": amount}
TOOLS = {"get_order": get_order, "issue_voucher": issue_voucher}
NEEDS_APPROVAL = {"issue_voucher"}
这是循环本身。它是普通代码,每个安全规则都位于此处而不是模型中:
def run_agent(goal, model, approve, max_steps=5):
history = []
for step in range(1, max_steps + 1):
decision = model(goal, history)
if "finish" in decision:
return decision["finish"]
name, args = decision["tool"], decision["args"]
if name in NEEDS_APPROVAL and not approve(name, args):
result = {"denied": True}
else:
result = TOOLS[name](**args)
history.append({"tool": name, "result": result})
return None # stopped: step limit reached
要使用真实模型,您可以将 model 函数替换为对 LLM API 的调用,并向其传递目标、工具的历史记录和描述。循环几乎保持不变。
我们跑步时发生了什么
我们使用脚本化决策函数尝试了五种情况,并记录了每个步骤。
延迟订单,且凭证已获批准
step 1: get_order({'order_id': 'A100'}) -> {'status': 'delayed', 'days_late': 6}
step 2: issue_voucher({'order_id': 'A100', 'amount': 200}) -> {'voucher': 'V-A100', 'amount': 200}
step 3: finish -> Sorry for the delay. Voucher V-A100 issued.
每一步都使用前一步的结果。仅在确认延迟后才考虑使用代金券。
相同的订单,但批准被拒绝
step 2: issue_voucher({'order_id': 'A100', 'amount': 200}) -> {'denied': True}
step 3: finish -> Your order is late. A person will review compensation.
人类说不,该工具从未运行,代理调整了其答复。
未知的订单
step 1: get_order({'order_id': 'Z999'}) -> {'error': 'order not found'}
step 2: finish -> I could not find that order.
为工具提供清晰的错误消息会有所帮助。真正的模型可以读取它们并做出明智的响应,而不是猜测。
陷入困境的模型
我们还交换了一个错误的决策函数,该函数永远重复相同的操作:
step 1: get_order({'order_id': 'B200'}) -> {'status': 'shipped', 'days_late': 0}
step 2: get_order({'order_id': 'B200'}) -> {'status': 'shipped', 'days_late': 0}
step 3: get_order({'order_id': 'B200'}) -> {'status': 'shipped', 'days_late': 0}
stopped: step limit reached
代理确实会陷入这样的循环,而真实模型的每一步都需要花钱。如果没有max_steps,这件事永远不会结束。
工具如何工作
这是最容易被误解的部分。语言模型本身无法运行任何东西。它生成结构化文本,说明它想要哪种工具以及什么参数。 您的代码决定是否运行它。这就是为什么循环是权限、验证和日志记录的正确位置的原因。
模型提供者为此提供了工具或函数调用。模型上下文协议 (MCP) 是一种用于将模型连接到工具和数据的开放标准,我们关于 Playwright MCP 的文章展示了一种用途。写下清晰的工具名称和描述,因为模型依赖它们来正确选择。
提示:从只读工具开始。一个只能查找信息的代理远比一个可以发送、删除或支付的代理危险得多。一旦您了解了它的行为方式,一次添加一个工具的写访问权限。
内存
| 类型 | 持有 | 示例 |
|---|---|---|
| 短期 | 当前任务的历史记录 | 我们循环中的 history 列表 |
| 长期 | 会议之间保留的事实 | 数据库中的用户偏好 |
| 知识 | 需要时检索的文档 | RAG 使用 嵌入 |
长任务可能会超出模型的上下文窗口,因此系统通常会总结较旧的步骤。摘要可能会丢失细节,这是长期运行的代理可能偏离路线的原因之一。
多代理系统
一些系统将工作分配给几个专门的代理,例如规划者、研究人员和审阅者。这有助于完成整齐划分的大型任务。它还增加了成本、更多的失败方式和更难的调试。首先尝试使用好的工具的单一代理,只有在有明确原因的情况下才进行拆分。
风险和限制
- 错误的行为。聊天机器人的错误是一个错误的句子。代理的错误可能是发送的电子邮件或删除的记录。
- 提示注入。 代理读取的网页或电子邮件可能包含隐藏指令。将所有工具输出视为不受信任的数据,而不是命令。
- 复合错误。 早期的一个小错误可能会让后面的每一步都走向错误的方向。
- 成本和延迟。每个步骤都可以是另一个模型调用,因此任务可能比单个提示慢得多且成本更高。
- 不一致。同一目标在每次运行中可能采取不同的路径,这使得测试变得更加困难。
- 问责制。 人们仍然对系统的行为负责,因此请保留记录。
护栏很重要
- 最低权限。 仅向每个代理提供其所需的工具和访问权限。
- 人类批准任何昂贵的、不可逆转的或外部的事情,就像我们的演示一样。
- 对步数、时间和支出的硬性限制。
- 验证代码中的工具输入,并且不依赖于模型指令。
- 记录每一步,以便您可以了解发生问题的原因。请参阅监控与可观察性。
- 使用真实场景进行测试, 包括失败。检查最终结果以及个人答复。我们的 AI 代理最佳实践 指南进一步介绍了部署。
何时使用代理
| 使用代理时 | 使用更简单的东西 |
|---|---|
| 步骤无法提前得知 | 步骤总是一样的 |
| 该任务需要多种工具 | 一个提示即可完成工作 |
| 结果改变接下来发生的事情 | 固定的工作流程会起作用 |
| 错误很便宜,或者可以回顾 | 错误代价高昂且难以挽回 |
编码助手是当今最成熟的示例之一,因为它们可以读取文件、运行测试、查看失败并重试,并由人工审查结果。测试套件给了他们明确的成功信号。我们的快速工程指南也适用于编写良好的代理指令。从最简单、可行的事情开始,因为经过良好提示的单个呼叫通常会击败复杂的代理。
最后的话
人工智能代理并不像听起来那么神秘:一个模型、一些工具和一个有限制的循环。困难的部分是信任,而不是代码。要了解它们的行为方式,请采用我们的小循环,使用只读工具将其连接到真实模型,并在其工作时观察日志。你很快就会看到它的闪光点以及它需要人类的地方。
常见问题
简单来说什么是人工智能代理?
它是一种通过选择操作、使用工具和循环检查结果来实现目标的软件,而不是只给出单一答复。
聊天机器人和人工智能代理有什么区别?
聊天机器人主要响应每条消息。代理可以计划几个步骤、调用工具并根据沿途发生的情况更改路线。
人工智能代理需要大型语言模型吗?
大多数现代人都使用法学硕士来做决策,尽管软件代理的更广泛的想法比较古老,并且可以使用规则或其他人工智能方法。
人工智能代理安全吗?
它们带来真正的风险,包括错误的行为和及时注射。限制他们的权限,要求批准危险步骤,设置硬限制并记录所有内容。
人工智能代理可以取代开发人员或测试人员吗?
一般而言不是今天。他们可以处理许多明确的任务,但人们仍然需要设定目标、审查输出并对结果负责。
继续学习
需要测试、WordPress 或 SEO 方面的帮助?
我们帮助团队交付更好的软件并发展他们的网站。告诉我们您正在做什么,我们将建议明确的下一步。
更多指南 测试、人工智能和现代开发
喜欢这篇文章吗?选择一个主题并直接跳至我们最新的教程。
人工智能幻觉解释:语言模型为何会产生幻觉以及如何减少它
人工智能幻觉解释:它们是什么,为什么语言模型产生它们,常见类型,如何通过基础和提示来减少它们,以及我们进行的简单检查。
阅读文章 →DevOps环境变量解释:.env 文件、秘密和配置正确完成
使用我们运行的 Python 示例解释环境变量:读取和设置它们、为什么每个值都是字符串、.env 文件、进程继承、秘密和验证。
阅读文章 →软件开发API 速率限制解释:算法、标头和处理 429 错误
API 速率限制通过我们运行的模拟进行了解释:令牌桶、固定窗口、滑动窗口、429 响应、速率限制标头、带回退的重试和测试限制。
阅读文章 →测试自动化Python 中的模拟:unittest.mock、补丁以及导致测试谎言的错误
使用unittest.mock 在Python 中进行模拟,经过测试:模拟和return_value、side_effect、修补使用名称的位置、spec 和autospec、模拟日期以及常见错误。
阅读文章 →软件测试代码覆盖率解释:行覆盖率与分支覆盖率以及 100% 的真正含义
用真实的coverage.py运行来解释代码覆盖率:行、分支和条件覆盖率,阅读报告,为什么100%覆盖率仍然会错过错误,以及合理的目标。
阅读文章 →数据库与 SQLSQL 中的 DELETE、TRUNCATE 和 DROP:差异、回滚以及何时使用它们
DELETE、TRUNCATE 和 DROP 通过经过测试的 SQL 进行了解释:各自删除什么、回滚、触发器、身份重置、速度,以及 PostgreSQL、MySQL、SQL Server 和 SQLite 有何不同。
阅读文章 →数据库与 SQLSQL 视图解释:创建、使用和避免陷阱(附示例)
SQL 视图通过我们运行的查询进行解释:创建视图、实时结果、隐藏列、性能、可更新和物化视图、破坏的依赖关系和最佳实践。
阅读文章 →软件开发TypeScript 接口与类型:真正的差异,使用编译器进行测试
TypeScript 接口与类型,使用真实编译器进行检查:两者都可以做什么,只有一个可以做什么,声明合并,扩展与交集以及要遵循的简单规则。
阅读文章 →软件开发Python *args 和 **kwargs 解释:灵活的函数和清晰的示例
Python *args 和 **kwargs 用我们运行的代码进行了解释:打包和解包、参数顺序、仅关键字和仅位置参数、装饰器和常见错误。
阅读文章 →软件开发Python Lambda 函数:语法、实际用途以及何时不使用它们
Python lambda 函数用我们运行的代码进行了解释:语法、使用键排序、映射和过滤器、闭包、后期绑定陷阱,以及何时普通 def 是更好的选择。
阅读文章 →人工智能什么是人工智能代理?它们是如何工作的,只需运行一个简单的代理循环
什么是人工智能代理?关于代理循环、工具、内存和护栏的简单指南,以及我们运行的一个小型 Python 循环、真正的风险以及何时简单的聊天机器人是更好的选择。
阅读文章 →DevOps监控与可观察性:真正的区别,包括日志、指标和跟踪
监控与可观察性解释:已知和未知的故障、日志、指标和跟踪、检查事件演练、黄金信号、OpenTelemetry 和有用的警报。
阅读文章 →DevOpsDocker Volumes 与 Bind Mounts:以正确的方式保留容器数据
Docker 卷与绑定挂载解释:为什么容器数据消失、命名卷、绑定挂载、tmpfs、Compose 示例、备份、权限以及何时使用它们。
阅读文章 →测试自动化TDD 与 BDD:主要区别、以两种方式构建的一个功能以及何时使用每种方式
TDD 与 BDD 的解释是通过一种双向构建的折扣功能:使用我们运行的代码进行红绿重构、Given-When-Then 场景、工具、权衡以及何时使用每种方案。
阅读文章 →软件开发Git merge 与 rebase 的区别:示例及如何选择
用真实的 log 输出、对比表、rebase 黄金法则和安全的团队工作流,讲清 Git merge 与 rebase 的区别。
阅读文章 →软件开发Python 列表推导式:语法、示例与何时避免使用
Python 列表推导式详解:语法、过滤、if-else、嵌套循环、实测耗时,以及何时普通 for 循环更合适。
阅读文章 →数据库与 SQLSQL JOIN 详解:附示例(INNER、LEFT、RIGHT、FULL)
通过示例表和查询,一步步讲解 SQL JOIN:INNER、LEFT、RIGHT、FULL、CROSS 和 SELF,并介绍常见错误与性能技巧。
阅读文章 →