什么是人工智能代理?它们是如何工作的,只需运行一个简单的代理循环

  1. 首页
  2. 博客
  3. 人工智能

人工智能

什么是人工智能代理? 它们如何工作,只需运行一个简单的代理循环即可

人工智能代理的作用不仅仅是回答。它需要一个目标,选择行动,检查结果并继续前进。了解其中的内容,在 Python 中运行一个小循环,并在信任它之前了解其中的风险。

阅读约 9 分钟
什么是人工智能代理?它们是如何工作的,您可以通过一个简单的代理循环来运行

要点速览

  • AI 代理 通常是一个循环运行的语言模型,具有工具和目标。
  • 循环很简单:决定、行动、观察结果并重复直到完成。
  • 该模型仅建议行动。您的代码运行它们,这是您执行规则的地方。
  • 代理可能会循环或滥用工具,因此请设置步骤限制并要求批准危险操作。

向聊天机器人询问延迟订单的情况,它会给你一些建议。询问 AI 代理,它可以查找订单、检查延迟、申请优惠券并返回报告。不同之处在于,代理可以采取行动并对发生的情况做出反应,而不是只产生一个答复。

该术语在营销中被延伸,因此本指南坚持这些系统的实际工作方式。为了具体起见,我们在 Python 3.13 中构建了一个小型代理循环并运行它,下面的输出来自这些运​​行。 我们的“模型”是一个脚本函数,而不是真正的人工智能模型,因此任何人都可以运行和测试循环。它显示的是控制结构,而不是智能。刚接触基础知识?首先阅读什么是大语言模型。

什么是AI代理?

没有一个统一的定义。在目前的实践中,人工智能代理是一种通过反复决定下一步做什么、使用工具对世界采取行动并根据结果进行调整来追求目标的软件。通常,决策来自大型语言模型。

想一想指路的人和跑腿的人之间的区别。第一个回答一次。第二个出去,发现商店关门了,就尝试另一家,直到工作完成后才回来。

聊天机器人、工作流程还是代理?

类型 谁决定步骤? 可以行动吗? 示例
聊天机器人 用户驾驶每一回合 通常不会 根据文字回答问题
固定工作流程 开发商提前 是的,在设定的路径上 总结每张票,然后安排路线
人工智能代理 运行时的模型 是的,在限制范围内 调查并解决票证

这些存在于一个范围内,并且许多有用的系统是混合的。关键问题是有多少路径是在运行时决定的。

代理内部有什么

部分 角色
型号 根据目标和迄今为止发生的情况决定下一步
使用说明 应遵循的目标、规则和限制
工具 它可以请求的功能,例如搜索或调用 API
内存 它从早期步骤或过去的会话中了解到什么
控制回路 运行工具并强制执行限制的普通代码

代理循环

  1. 决定。模型查看目标和历史,并选择一个动作或决定它已完成。
  2. Act. 您的代码运行所请求的工具。
  3. 观察。结果被添加到历史记录中。
  4. 重复,直到达到目标或达到限制。

这是大多数代理的核心。复杂性主要在于围绕这个循环的模型、工具和保障措施。

您可以运行的循环

我们的小代理处理延迟订单。它有两种工具,其中一种需要人工批准,因为它需要花钱:

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 使用 嵌入

长任务可能会超出模型的上下文窗口,因此系统通常会总结较旧的步骤。摘要可能会丢失细节,这是长期运行的代理可能偏离路线的原因之一。

多代理系统

一些系统将工作分配给几个专门的代理,例如规划者、研究人员和审阅者。这有助于完成整齐划分的大型任务。它还增加了成本、更多的失败方式和更难的调试。首先尝试使用好的工具的单一代理,只有在有明确原因的情况下才进行拆分。

风险和限制

  • 错误的行为。聊天机器人的错误是一个错误的句子。代理的错误可能是发送的电子邮件或删除的记录。
  • 提示注入。 代理读取的网页或电子邮件可能包含隐藏指令。将所有工具输出视为不受信任的数据,而不是命令。
  • 复合错误。 早期的一个小错误可能会让后面的每一步都走向错误的方向。
  • 成本和延迟。每个步骤都可以是另一个模型调用,因此任务可能比单个提示慢得多且成本更高。
  • 不一致。同一目标在每次运行中可能采取不同的路径,这使得测试变得更加困难。
  • 问责制。 人们仍然对系统的行为负责,因此请保留记录。

护栏很重要

  1. 最低权限。 仅向每个代理提供其所需的工具和访问权限。
  2. 人类批准任何昂贵的、不可逆转的或外部的事情,就像我们的演示一样。
  3. 对步数、时间和支出的硬性限制。
  4. 验证代码中的工具输入,并且不依赖于模型指令。
  5. 记录每一步,以便您可以了解发生问题的原因。请参阅监控与可观察性。
  6. 使用真实场景进行测试, 包括失败。检查最终结果以及个人答复。我们的 AI 代理最佳实践 指南进一步介绍了部署。

何时使用代理

使用代理时 使用更简单的东西
步骤无法提前得知 步骤总是一样的
该任务需要多种工具 一个提示即可完成工作
结果改变接下来发生的事情 固定的工作流程会起作用
错误很便宜,或者可以回顾 错误代价高昂且难以挽回

编码助手是当今最成熟的示例之一,因为它们可以读取文件、运行测试、查看失败并重试,并由人工审查结果。测试套件给了他们明确的成功信号。我们的快速工程指南也适用于编写良好的代理指令。从最简单、可行的事情开始,因为经过良好提示的单个呼叫通常会击败复杂的代理。

最后的话

人工智能代理并不像听起来那么神秘:一个模型、一些工具和一个有限制的循环。困难的部分是信任,而不是代码。要了解它们的行为方式,请采用我们的小循环,使用只读工具将其连接到真实模型,并在其工作时观察日志。你很快就会看到它的闪光点以及它需要人类的地方。

常见问题

简单来说什么是人工智能代理?

它是一种通过选择操作、使用工具和循环检查结果来实现目标的软件,而不是只给出单一答复。

聊天机器人和人工智能代理有什么区别?

聊天机器人主要响应每条消息。代理可以计划几个步骤、调用工具并根据沿途发生的情况更改路线。

人工智能代理需要大型语言模型吗?

大多数现代人都使用法学硕士来做决策,尽管软件代理的更广泛的想法比较古老,并且可以使用规则或其他人工智能方法。

人工智能代理安全吗?

它们带来真正的风险,包括错误的行为和及时注射。限制他们的权限,要求批准危险步骤,设置硬限制并记录所有内容。

人工智能代理可以取代开发人员或测试人员吗?

一般而言不是今天。他们可以处理许多明确的任务,但人们仍然需要设定目标、审查输出并对结果负责。

继续学习

与Stack Quora合作

需要测试、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%覆盖率仍然会错过错误,以及合理的目标。

阅读文章 →
数据库与 SQL

SQL 中的 DELETE、TRUNCATE 和 DROP:差异、回滚以及何时使用它们

DELETE、TRUNCATE 和 DROP 通过经过测试的 SQL 进行了解释:各自删除什么、回滚、触发器、身份重置、速度,以及 PostgreSQL、MySQL、SQL Server 和 SQLite 有何不同。

阅读文章 →
数据库与 SQL

SQL 视图解释:创建、使用和避免陷阱(附示例)

SQL 视图通过我们运行的查询进行解释:创建视图、实时结果、隐藏列、性能、可更新和物化视图、破坏的依赖关系和最佳实践。

阅读文章 →
软件开发

TypeScript 接口与类型:真正的差异,使用编译器进行测试

TypeScript 接口与类型,使用真实编译器进行检查:两者都可以做什么,只有一个可以做什么,声明合并,扩展与交集以及要遵循的简单规则。

阅读文章 →
软件开发

Python *args 和 **kwargs 解释:灵活的函数和清晰的示例

Python *args 和 **kwargs 用我们运行的代码进行了解释:打包和解包、参数顺序、仅关键字和仅位置参数、装饰器和常见错误。

阅读文章 →
软件开发

Python Lambda 函数:语法、实际用途以及何时不使用它们

Python lambda 函数用我们运行的代码进行了解释:语法、使用键排序、映射和过滤器、闭包、后期绑定陷阱,以及何时普通 def 是更好的选择。

阅读文章 →
人工智能

什么是人工智能代理?它们是如何工作的,只需运行一个简单的代理循环

什么是人工智能代理?关于代理循环、工具、内存和护栏的简单指南,以及我们运行的一个小型 Python 循环、真正的风险以及何时简单的聊天机器人是更好的选择。

阅读文章 →
DevOps

监控与可观察性:真正的区别,包括日志、指标和跟踪

监控与可观察性解释:已知和未知的故障、日志、指标和跟踪、检查事件演练、黄金信号、OpenTelemetry 和有用的警报。

阅读文章 →
DevOps

Docker 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 循环更合适。

阅读文章 →
数据库与 SQL

SQL JOIN 详解:附示例(INNER、LEFT、RIGHT、FULL)

通过示例表和查询,一步步讲解 SQL JOIN:INNER、LEFT、RIGHT、FULL、CROSS 和 SELF,并介绍常见错误与性能技巧。

阅读文章 →