跳到导航

程序

智能体在相关时加载的任务专用指令

概述

程序包含针对某项具体任务的指令。每个程序都有一个触发条件,用于说明何时适用;还有内容,用于说明该怎么做。当对话符合触发条件时,智能体会加载该程序。

当智能体需要处理许多不同任务时,可使用程序。例如,客服智能体可让每个程序处理一种请求:退款、身份验证、账户恢复或连接故障排查。

智能体控制台中的程序标签页

程序类型

程序分为两类:

  • 自由形式程序 使用自然语言编写指令,智能体会根据具体情况理解和调整。
  • 结构化程序 是按顺序排列的带类型步骤列表,智能体每次都会以相同方式执行。

同一个智能体可以同时使用两类程序。无论类型如何,智能体都会根据触发条件选择相关程序。

程序可以相互调用。自由形式程序可通过内联引用调用另一程序,结构化程序则可通过子程序步骤调用另一结构化程序。常见做法是用自由形式程序处理开放式情况,再将每次都必须以相同方式执行的部分交给结构化程序。

智能体可以使用程序、工作流,或两者兼用。两者同时存在时,工作流中的每个节点都能使用所有程序;无法将程序限制在特定工作流节点中。大多数智能体围绕其中一种方式构建,但两者可以组合使用。

何时使用程序

每个智能体都有系统提示词。程序和工作流是在此基础上添加结构的两种方式,智能体也可以同时使用两者。根据对话可能变化的程度选择起点。

需求使用原因
简单的概念验证智能体仅使用系统提示词设置和迭代最快,但随着智能体覆盖范围扩大,单个提示词会变得难以管理。
智能体可调整措辞和顺序的任务自由形式程序将整段对话保留在同一个 LLM 的上下文中,因此智能体可调整措辞和顺序,并能应对意外走向。会占用更多上下文窗口。
每次都必须以相同方式执行步骤的任务结构化程序每个步骤都会按你设定的顺序、以相同方式执行,并且只需编写简短的步骤列表。
完全控制复杂分支和边缘情况工作流以你自行设计和连接的子智能体图运行,可完全控制分支及每个步骤使用的模型。

自由形式程序是默认选择。它们编写最快,读起来像文档,非技术团队也能负责维护;当对话偏离预设流程时,智能体也能恢复处理。若漏掉或调换步骤的代价很高,例如身份验证、升级处理或金融交易,请使用结构化程序。若需要两种程序都不提供的路由逻辑或逐步模型控制,请使用工作流。

管理程序

建议在控制台中编写程序。使用 CLI 或 API 以编程方式管理程序,或将其集成到部署工具中。

在控制台中打开智能体,然后选择 程序。 使用 + 创建自由形式或结构化程序。也可从同一菜单将程序归入文件夹。有关编写指南,请参阅自由形式程序和结构化程序。

为每次对话选择程序

默认情况下,每次对话都可以使用智能体的所有程序,且只有当对话符合某个程序的触发条件后,智能体才会加载该程序。应用通常在对话开始前就掌握更多信息:用户是谁、所在地区,或来电原因。可在对话初始化客户端数据中传入程序 ID 以利用这些信息。你可以决定智能体可使用哪些程序,以及从第一轮起遵循哪些程序。

字段作用使用原因
procedure_ids将对话限制为这些程序。空数组会禁用智能体的所有程序。只向每位用户提供适用的程序,例如对未登录用户隐藏账户程序。当程序存在无法避免的相似触发条件时也可使用,例如每个地区各有一个退款程序。只传入用户所在地区的程序,避免智能体遵循其他地区的程序。
start_procedure_ids对话开始时启动这些自由形式程序,使智能体从第一轮起遵循它们。最多接受 5 个 ID。当已知用户任务时可更快回复,例如来自 IVR 菜单选择、托管小组件的页面或 CRM 数据。

start_procedure_ids 中的程序会在用户首次发言时预先加载,因此智能体会跳过原本用于加载它的 LLM 调用。无论由智能体还是应用启动,任何活跃程序都会在每一轮保留在提示词中。对话实际从未需要的已启动程序仍会为每一轮添加内容,因此只启动对话可能会用到的程序。

1

允许选择程序

默认情况下,程序覆盖设置处于关闭状态。请在每个应接受客户端程序 ID 的智能体上启用它。

在控制台中打开智能体,选择 安全 标签页,然后启用 程序 覆盖设置。

2

在对话开始时传入 ID

如果智能体未启用 程序 覆盖设置,或 ID 无效,对话将无法开始。

从列出程序获取程序 ID。在对话初始化客户端数据中添加 procedure_ids、start_procedure_ids 或两者:

对话初始化负载
{
"type": "conversation_initiation_client_data",
"procedure_ids": [
"agtprc_4101k8f3w2pqv6xs9mhdr0tz7n3b",
"agtprc_2301k8f3xq9zfa7tkrqs6m4bdn5e",
"agtprc_7801k8f3yt4mfzh2xbq9d0vcpw1r"
],
"start_procedure_ids": ["agtprc_4101k8f3w2pqv6xs9mhdr0tz7n3b"]
}

智能体会在第一个程序已运行的状态下开始对话。当对话符合另外两个程序的触发条件时,仍可启动它们。

Python 和 JavaScript 对话 SDK 不会发送 procedure_ids 或 start_procedure_ids。要使用这些字段,请自行通过 WebSocket发送初始化消息。

两个字段都遵循以下规则:

  • procedure_ids 中的每个 ID 都必须属于该智能体。如果所选程序调用子程序,也需包含这些子程序。
  • start_procedure_ids 中的每个 ID 都必须是自由形式程序。如果同时传入 procedure_ids,每个 ID 也必须在该列表中。
  • procedure_ids 仅适用于对话开始时使用的智能体。在智能体转接后不再适用。
  • 已启动程序会计入限制中的 5 个活跃程序。对话历史会将每个程序记录为一次 start_procedure 工具调用。

限制

  • 单个程序内容最多 50,000 个字符。
  • 智能体会在上下文中保留最近启动的 5 个程序。当一次对话启动了更多程序时,最早的自由形式程序的内容、内联工具和知识库文档会从提示词中移除。请让程序聚焦,并使用子程序,以便同时活跃的程序较少。
  • 创建程序后无法更改其类型。如需在自由形式和结构化之间转换,请创建新程序并更新对它的所有引用。
  • 程序属于单个智能体,无法跨智能体共享,也不能存储为工作区级资源。
  • 复制智能体时会复制其程序,而非共享。副本会获得新的程序 ID,因此复制后智能体中的引用必须使用这些新 ID。
  • 无法将程序限制在特定工作流节点中。当智能体同时拥有两者时,每个节点都可使用所有程序。
  • 结构化程序无法引用知识库文档。