变量

变量用于在多个对话轮次中存储和检索数据。 它们使智能体能够记住信息并保持上下文。 为智能体编写提示指令时,您可以添加对这些变量的引用。

变量类型

代理构建器支持在指令中使用两种不同类型的变量:静态变量和动态变量。

选择正确的类型取决于变量的值是否需要在用户会话期间更改,以及您需要针对延迟时间进行多少优化。

静态变量

静态变量会在模型调用发生之前直接编译到智能体提示中。它们充当直接的 1:1 文本替换,并且不经常更新。

静态变量可最大限度地提高指令遵循质量,适用于许多场景的条件指令。对于配置数据、严格的业务规则或在单次对话期间不会发生变化的大型上下文载荷,请使用静态变量。

如需在指令中按名称引用静态变量,请使用双大括号:{{variable_name}}。

例如,如果您要创建一个商品清单庞大且静态的零售智能体,可以使用如下指令:

You are a helpful shopping assistant.
Please follow these business rules: {{business_rules}}.

动态变量

在对话期间,工具、回调或 API 请求可以随时更新动态变量。它们不会直接替换到提示文本中。 相反,当它们更新时,其新值会作为 state update 事件附加到对话记录中。例如:<state_update>var_name: value</state_update>。

对于在会话期间从用户那里提取的信息、从外部 API(工具)检索到的输出,或随着对话进展而发生变化的任何状态,请使用动态变量。

动态变量存在以下缺点:

  • 动态变量会附加到对话记录中,因此,如果长时间的会话超出了上下文窗口限制,智能体可能会忘记在修剪记录时丢失的变量值。
  • 与静态变量相比,动态变量可能会导致指令遵循率略有下降。 这是因为变量值的定义位置距离指令更远。 这还可能会增加延迟时间,因为模型思考需要找到距离指令更远的值。

如需在指令中按名称引用动态变量,请使用单层大括号:{variable_name}。

例如,如果您要创建的智能体需要对用户进行身份验证,然后使用工具查找其特定账号详细信息,则可以使用如下指令:

If the user asks for their balance, call the {@TOOL: LookupBalance}.
The tool will update the {current_account_balance} variable.
Always share the {current_account_balance} with the user.

变量数据

变量包含以下数据:

  • Name:使用蛇形命名法的变量名称
  • 类型:底层数据类型:
    • 文本:字符串值
    • 数字:数值
    • 是/否:布尔值
    • 自定义对象:您为对象提供架构
    • 列表:变量列表。以英文逗号分隔列表的形式提供值。
  • 默认值:变量的默认值
  • 说明:变量的可选说明

更新变量值

智能体本身无法更新变量的值,但工具和回调可以更新变量值。

智能体变量使用 ADK 上下文状态,该状态可用于更新变量。您可以在 Python 工具代码中使用名为 context 的全局变量。例如,您可以在 Python 工具中使用以下语句,通过 ADK 功能更新变量:

context.state["variable_name"] = value

内置会话上下文变量

除了自定义变量之外,OpenAPI 和 MCP 工具还可以引用内置会话上下文变量。这些参数默认可用,可以在 HTTP 标头或请求参数中传递。这些变量无法在指令中引用,也无法手动覆盖。 以下是可用的内置变量:

  • $context.project_id、$context.project_number、$context.location、$context.app_id、$context.session_id、$context.turn_index(应用级/会话级资源 ID)。
  • $context.variables.variable_name,用于指定代理变量值。
  • $context.variables,用于将所有代理变量值作为对象。