上下文管理能让智能体在单次的连续多轮对话中,记录并理解历史对话内容,从而做出更精准连贯的回复。支持在发起对话时设置基础上下文作为初始信息,或在对话过程中动态传入上下文,实时补充背景信息或通过文本直接发起提问。
说明
上下文管理主要用于实现智能体的短期记忆,即在单次连续对话中理解历史对话。如果要实现跨对话的长期记忆(如记住用户偏好),可接入火山记忆库。详细实现方法,请参见接入记忆库。
在发起对话时,通过 StartVoiceChat 接口为智能体设定初始的上下文信息。不同的大模型平台,其上下文管理机制有差异。
使用火山方舟平台时,模型对话上下文生成逻辑由系统提示词(SystemMessages)、用户提示词(UserPrompts/UserMessages)和历史问题轮数(HistoryLength)共同控制。
| 参数名 | 类型 | 说明 |
|---|---|---|
SystemMessages | String[] | 系统提示词。定义模型的角色、行为准则及输出格式等核心指令。 |
UserPrompts | Object[] | 用户提示词。可用于增强模型的回复质量,模型回复时会优先参考此处内容,引导模型生成特定的输出或执行特定的任务。需包含 Role(仅支持 user/assistant)和 Content 字段,且必须成对出现。推荐使用该参数控制用户提示词,具有存储提示词自动逐出机制,且表现更稳定。 |
HistoryLength | Integer | 模型存储历史问题轮数。 |
UserMessages | String[] | 旧版本参数,不推荐使用,仅为兼容保留。 用户提示词。可用于增强模型的回复质量,模型回复时会优先参考此处内容,引导模型生成特定的输出或执行特定的任务。 |
UserMessages 说明
UserMessages 是一个为保证向后兼容性而保留的旧版参数,不推荐使用,与 UserPrompts 的差异如下:
| 维度 | UserPrompts (推荐) | UserMessages (不推荐) |
|---|---|---|
| 数据类型 | 对象数组 Object[] | 字符串数组 String[] |
| 字段要求 | 必须包含 Role 和 Content 字段,且 user 和 assistant 角色需成对交替出现。 | 无严格字段要求,直接存储对话文本。 |
| 存储机制 | 自动逐出:当对话历史超过 HistoryLength 限制时,最早的 UserPrompts 会被逐出,为新的对话历史腾出空间。 | 永久存储:内容不会被自动逐出,会始终占用上下文空间。 |
上下文总长度(以 Tokens 计算)不得超过所选大模型的上限(如 8k)。计算方式取决于您使用的参数组合。
(推荐)使用 UserPrompts 时:
计算逻辑:UserPrompts 支持自动逐出,计算总长度时只包含当前对话中仍然生效的 UserPrompts。
计算公式:
总长度 = SystemMessages + 当前生效的 UserPrompts + HistoryLength 轮对话
示例:若 HistoryLength 为 3,模型上限 8k。当一轮旧的 UserPrompts 因对话轮数增加被逐出后,计算总长度时就不再包含它,从而为新的对话历史腾出空间。
(不推荐)使用 UserMessages 时:
总长度 = SystemMessages + 全部 UserMessages + HistoryLength 轮对话
使用Coze平台时,上下文管理有两种模式,通过 StartVoiceChat 中的字段 LLMConfig.EnableConversation 控制:
| 模式 | 上下文生成逻辑 |
|---|---|
| RTC管理上下文 | 即 EnableConversation: false。模型对话上下文生成逻辑由历史问题轮数 HistoryLength 和 Coze 平台编排页人设与回复逻辑、插件、知识库共同控制。 |
| Coze平台管理上下文 | 即 EnableConversation: true。模型对话上下文生成逻辑完全由 Coze 平台编排页人设与回复逻辑、插件、知识库共同控制。HistoryLength 参数不生效。 |
Coze 编排功能、插件等搭建能力详细介绍参看 Coze 开发智能体功能概述。
需要确保编排页人设与回复逻辑、插件、知识库与会话内容文本总长度不超过大模型上下文长度。历史问题轮数在 RTC 管理上下文时通过 HistoryLength 参数控制,在 Coze 平台管理上下文时通过模型设置页面操作。
除了启动时设定的基础上下文,你还可以在对话过程中,实时地为智能体传入文本信息,作为下一轮对话的背景参考,或直接触发回复。
动态传入上下文在启用端到端实时语音大模型(S2SConfig)时无效。详细说明,请参见接入端到端实时语音大模型。
向智能体传入文本信息,作为它下一轮回答的背景参考,但不会立即触发回复。适用于需要结合实时变化或用户无法通过语音表达的隐式信息的场景。
| 场景 | 描述 | 示例 |
|---|---|---|
游戏陪玩 | 结合用户实时游戏数据生成合适的回答,为用户提供更贴心的陪伴。 |
|
健康咨询 | 结合用户实时生理数据生成个性化建议,提升健康指导的精准度。 |
|
调用 UpdateVoiceChat 接口,并按如下配置关键参数:
Command:设置为 ExternalPromptsForLLM。Message:填入要传入的背景信息文本内容。请求示例
POST https://rtc.volcengineapi.com?Action=UpdateVoiceChat&Version=2024-12-01 { "AppId": "Your_AppId", "RoomId": "Your_RoomId", "TaskId": "Your_TaskId", "Command": "ExternalPromptsForLLM", "Message": "当前用户战绩 0-14,金币落后" }
传入的文本会作为用户的直接提问,智能体会立即处理并生成语音回复。相当于模拟了一次用户的“文字输入”。
| 场景 | 描述 |
|---|---|
| 电商直播 | 将观众在弹幕或私信中提出的问题,实时发送给正在直播的 AI 智能体主播进行回答。 |
| 特殊内容输入 | 当问题包含生僻字、专业术语、复杂编码或同音字较多时,用户通过文本输入可以确保提问的准确性。 |
调用 UpdateVoiceChat接口,设置以下参数自定义传入大模型上下文:
| 参数 | 类型 | 描述 |
|---|---|---|
| AppId | String | RTC 应用 AppId,参看获取 AppId。 |
| RoomId | String | 自定义会话房间 ID。 |
| TaskId | String | 自定义会话任务 ID。 |
| Command | String | 填入ExternalTextToLLM,表示自定义传入大模型上下文。 |
| Message | String | 填入自定义传入大模型上下文内容,长度不超过 200 个字符。 |
| InterruptMode | Integer | 传入大模型上下文内容处理优先级。
|
你可参考以下示例从服务端实现自定义传入大模型上下文内容:
POST https://rtc.volcengineapi.com?Action=UpdateVoiceChat&Version=2024-12-01 { "AppId": "661e****543cf", "RoomId": "Room1", "TaskId": "task1", "Command": "ExternalTextToLLM", "Message": "给一些出装建议。用户当前的背景是:金币落后,法师,输出高,脆皮", "InterruptMode": 2 }
使用 sendUserBinaryMessage 接口构造一个 Command 为 ExternalTextToLLM 的控制消息。该接口的 buffer 参数需要传入特定格式的内容,下图展示了 buffer 参数的格式:

| 参数名 | 类型 | 描述 |
|---|---|---|
| magic_number | binary | 消息格式标识符,当前场景消息格式固定为 ctrl,用于标识该消息为控制消息。 |
| length | binary | 传入大模型上下文消息长度,单位为字节,采用大端序(Big-endian)存储方式,用于说明 control_message 字段的字节长度。 |
| control_message | binary | 传入大模型上下文配置信息,采用 JSON 格式,具体内容格式参看 control_message 格式。 |
control_message
| 参数名 | 类型 | 描述 |
|---|---|---|
| Command | String | 控制命令,此处填入 ExternalTextToLLM。 |
| Message | String | 传入大模型上下文内容,长度不超过 200 个字符。 |
| InterruptMode | Int | 传入大模型上下文内容处理优先级。
|
你可参看以下示例从客户端实现自定义传入大模型上下文。
// 传入大模型上下文信息 void sendLLMMessage(const std::string &uid, const std::string& content) { nlohmann::json json_data; json_data["Command"] = "ExternalTextToLLM"; json_data["Message"] = content; json_data["InterruptMode"] = 1; sendUserBinaryMessage(uid, json_data.dump()); } void buildBinaryMessage(const std::string& magic_number, const std::string& message, size_t& binary_message_length, std::shared_ptr<uint8_t[]>& binary_message) { auto magic_number_length = magic_number.size(); auto message_length = message.size(); binary_message_length = magic_number_length + 4 + message_length; binary_message = std::shared_ptr<uint8_t[]>(new uint8_t[binary_message_length]); std::memcpy(binary_message.get(), magic_number.data(), magic_number_length); binary_message[magic_number_length] = static_cast<uint8_t>((message_length >> 24) & 0xFF); binary_message[magic_number_length+1] = static_cast<uint8_t>((message_length >> 16) & 0xFF); binary_message[magic_number_length+2] = static_cast<uint8_t>((message_length >> 8) & 0xFF); binary_message[magic_number_length+3] = static_cast<uint8_t>(message_length & 0xFF); std::memcpy(binary_message.get()+magic_number_length+4, message.data(), message_length); } // userId 为房间内智能体的 ID(对应 StartVoiceChat 中的 AgentConfig.UserId) int sendUserBinaryMessage(const std::string &uid, const std::string& message) { if (rtcRoom_ != nullptr) { size_t length = 0; std::shared_ptr<uint8_t[]> binary_message = nullptr; buildBinaryMessage("ctrl", message, length, binary_message); return rtcRoom_->sendUserBinaryMessage(uid.c_str(), static_cast<int>(length), binary_message.get()); } return -1; }