情感对话

情感对话使 agent 具备情绪感知能力:它能从用户的语音中捕捉其语气——沮丧、兴奋、犹豫——并调整自己的表达方式来配合。沮丧的客户会听到更加冷静、谨慎的 agent;开心的客户则会得到温暖的回应。这就是脚本式交互与对话之间的区别。

启用

RealtimeConfig 上调用一次构建器:

let config = RealtimeConfig::default()
    .with_instruction("You are a warm, empathetic support agent.")
    .with_voice("Kore")
    .with_audio_only()
    .with_vad(VadConfig::server_vad())
    .with_transcription()
    .with_affective_dialog(true);   // ← emotion-aware responses

要求(请阅读)

情感对话是 仅限 Gemini 的功能,并有两个硬性要求:

  1. 原生音频模型。 gemini-3.1-flash-live-preview 不支持该功能。请使用原生音频模型,例如 models/gemini-live-2.5-flash-native-audio
  2. v1alpha 端点。 crate 的 GeminiLiveBackend::studio(...) 已经通过 v1alpha 连接,因此这一点会由系统为你处理。

如果你在不支持该功能的模型上设置 with_affective_dialog(true),Gemini 配置会被拒绝,并显示 "Unknown name enableAffectiveDialog",随后会话关闭。因此,启用该功能时请切换模型:

let (default_model, voice) = if affective {
    ("models/gemini-live-2.5-flash-native-audio", "Kore")
} else {
    ("models/gemini-3.1-flash-live-preview", "Kore")
};

在 OpenAI(以及非原生 Gemini 模型)上,with_affective_dialog(true) 是一个 空操作——没有危害,只会被忽略——因此可以无条件设置,让提供商自行决定。

权衡

原生音频模型能够提供最自然、最富有表现力的语音以及情绪适应能力,但它们调用工具的可靠性低于 half-cascade 模型。因此,这确实是一种取舍:

  • 工具密集型 agent(退款、查询、执行操作)→ half-cascade (gemini-3.1-flash-live-preview),不使用情感对话。
  • 共情优先型 agent(支持场景中的情绪缓和、陪伴、指导)→ 原生音频 + 情感对话。

customer_service 示例正是出于这一原因将其设为选择启用: CS_AFFECTIVE=1 会将 Gemini 切换到原生音频模型并开启该标志;否则则继续使用工具调用更可靠的模型。

工作原理

with_affective_dialog(true) 设置 RealtimeConfig.affective_dialog,而且 Gemini 配置会在 generationConfig 内部发出 enableAffectiveDialog: true (而不是在配置顶层——v1alpha 端点在那里会拒绝它)。使用它时无需了解这些细节,但这正是模型和端点要求严格的原因。

无需标志也能产生共情。 即使在 OpenAI 或半级联模型上,一条编写良好的指令(“注意用户的情绪状态并真诚地回应”)也会产生切实具有共情的行为。在 Gemini 原生音频中,情感对话还会在此基础上增加真正的声学语调匹配。

下一步:记忆 →

情感对话 - ADK-Rust 文档 | ADK-Rust