You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何确保Gemini Flash Live API始终使用最新用户上下文响应音频请求?

问题:确保Gemini Flash Live API始终基于最新上下文响应音频提问

需求背景

我正在使用Google Gemini Flash Live API(genai)开发应用,流程为:用户先发送更新后的上下文(如全新代码片段、文档文本),随后输入实时音频(针对刚提供的最新上下文提问)。核心目标是让Gemini始终以最新上下文为基础生成响应——比如用户发送更新后立即询问“你能看到我的最新版本吗?”时,模型需准确对应最新内容。

当前问题

尽管通过sendClientContent(作为用户轮次)发送了更新后的上下文,但用户后续输入实时音频流时,模型有时会回复幻觉内容、旧内容或无关内容,仿佛未接收最新上下文。

现有实现

上下文更新逻辑

await sessionInstance.sendClientContent({
    turns: [{
        role: 'user',
        parts: [{ text: `Here is my latest update:\n\`\`\`\n${latestContent}\n\`\`\`\n` }]
    }],
    turnComplete: false
});

音频输入逻辑

await sessionInstance.sendRealtimeInput({
    media: {
        data: audioData.toString('base64'),
        mimeType: 'audio/pcm;rate=16000'
    }
});

后端WebSocket处理器

ws.on('message', async (data: WebSocket.RawData) => {
    try {
        const messageStr = data.toString();

        if (messageStr.trim().startsWith('{')) {
            const message = JSON.parse(messageStr);
            if (message.type === 'context_update') {
                session.context = message.content;
                await sessionInstance.sendClientContent({
                    turns: [{
                        role: 'user',
                        parts: [{ text: `Here is my latest update:\n\`\`\`\n${message.content}\n\`\`\`\n` }]
                    }],
                    turnComplete: false
                });
            }
        } else {
            // AUDIO: (I've also tried sending the context here, see below)
            await sessionInstance.sendRealtimeInput({
                media: {
                    data: data.toString('base64'),
                    mimeType: 'audio/pcm;rate=16000'
                }
            });
        }
    } catch (e) {
        // error handling...
    }
});

注:曾尝试每次音频输入前通过sendClientContent重发上下文,但效果不稳定。

已尝试方案

  • 每次音频输入前立即用sendClientContent发送上下文(试过turnComplete: falsetrue
  • 发送上下文更新后等待Gemini响应,但Gemini在收到音频/提问前不会回复
  • 调整上下文内容(完整内容、差异内容等)

无论采取何种措施,Gemini有时仍会回复非最新内容或产生幻觉。

核心疑问

  1. 如何可靠确保Gemini Flash Live API始终使用用户提供的最新上下文处理下一个音频/提问轮次?
  2. 是否有官方推荐的模式,可将上下文更新与音频提问“绑定”,或强制模型始终基于最新用户内容作答?

解决方案建议

1. 严格标记轮次完整性

Gemini Live API依赖turnComplete区分单轮输入的结束。当前上下文更新设置turnComplete: false,可能导致模型认为本轮未结束,后续音频输入与上下文更新的文本逻辑割裂。

修改上下文更新调用,明确标记本轮完成,并添加约束指令:

await sessionInstance.sendClientContent({
    turns: [{
        role: 'user',
        parts: [{ text: `以下是我的最新上下文更新:\n\`\`\`\n${message.content}\n\`\`\`\n后续所有问题请严格基于此内容回答` }]
    }],
    turnComplete: true // 明确告知模型本轮输入完成
});

2. 绑定上下文与音频提问

音频输入前无需重复发送完整上下文,仅发送关联指令,避免上下文冗余:

// 先发送绑定指令,标记本轮未完成
await sessionInstance.sendClientContent({
    turns: [{
        role: 'user',
        parts: [{ text: '请基于我刚刚提供的最新上下文,处理接下来的音频提问' }]
    }],
    turnComplete: false
});
// 再发送音频输入
await sessionInstance.sendRealtimeInput({
    media: {
        data: data.toString('base64'),
        mimeType: 'audio/pcm;rate=16000'
    }
});

3. 会话重置机制(极端场景)

若模型持续出现幻觉,可在上下文更新时重置会话,彻底清除旧历史:

if (message.type === 'context_update') {
    session.context = message.content;
    // 关闭旧会话
    if (sessionInstance) {
        await sessionInstance.close();
    }
    // 创建新会话并注入最新上下文
    sessionInstance = await genai.createRealtimeSession({
        model: 'gemini-1.5-flash-live'
    });
    await sessionInstance.sendClientContent({
        turns: [{
            role: 'user',
            parts: [{ text: `这是我的最新上下文:\n\`\`\`\n${message.content}\n\`\`\`\n后续所有问题请基于此内容回答` }]
        }],
        turnComplete: true
    });
}

注:此方式会丢失之前的对话记录,适合仅需基于最新上下文处理后续提问的场景。

4. 系统提示词固化规则

创建会话时通过系统提示词强制模型优先使用最新上下文:

sessionInstance = await genai.createRealtimeSession({
    model: 'gemini-1.5-flash-live',
    systemInstruction: '你必须始终基于用户最后一次提供的上下文内容回答问题,忽略所有旧上下文。若用户未提供上下文,再基于对话历史回答。'
});

内容的提问来源于stack exchange,提问作者Tushar Raina

火山引擎 最新活动