情感对话
情感对话使 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 的功能,并有两个硬性要求:
- 原生音频模型。
gemini-3.1-flash-live-preview不支持该功能。请使用原生音频模型,例如models/gemini-live-2.5-flash-native-audio。 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 原生音频中,情感对话还会在此基础上增加真正的声学语调匹配。
下一步:记忆 →