tencent cloud

AI 智能客服

下载
聚焦模式
字号
最后更新时间: 2026-06-05 09:09:43

场景介绍

智能语音客服是一种利用人工智能和语音识别技术来实现自动化交互和问题解决的客户服务系统。在 AI 大模型出现之前,智能客服主要利用自然语言处理和机器学习算法来理解客户的意图,依赖于预设的规则和知识库来进行问题解答。随着 LLM 的发展,越来越多的智能客服接入了大模型的能力,LLM 技术使智能语音客服能够更好地理解对话的上下文,从而实现连贯的对话交流。
RTC 技术的引入,为智能语音客服带来了实时通信的能力。这意味着智能客服可以更加迅速地响应客户的需求,提供即时的反馈和解决方案。同时,Tencent RTC 还支持多人通话、屏幕共享等功能,进一步提升了客户服务的效率和质量。


实现方案

通常实现一个完整的智能客服场景,需要涉及到多个模块:实时音视频、AI 实时对话、STT、LLM、TTS 等。每个模块下的关键动作及功能点如下表所示:
功能
AI 智能客服场景应用
实时音视频
流式传输技术可以确保语音和视频数据的连续性和稳定性,减少延迟和抖动,提供接近于真人客服通话的高质量体验。用户可以与智能客服系统进行更自然的对话,就像是在和真人客服交谈一样,这种互动体验可以显著提升用户满意度。
AI 实时对话
腾讯 AI 实时对话解决方案,支持客户灵活接入多家 AI 大模型服务,实现 AI 与用户之间的实时音视频互动,打造符合业务场景的 AI 实时对话能力。基于腾讯 RTC 全球低延迟传输,语音对话延迟低至1s,对话效果自然拟真,接入便捷,开箱即用。
语音转文字 STT
STT 模块实时捕获用户的语音流并将其转换为文本,随后发送给 LLM 进行处理。STT 模块依托 TRTC 超低延迟音频管线以及先进音频处理能力,AI 降噪和回声消除,即使在嘈杂环境中也能提供清晰、准确的转录。
大语言模型 LLM
LLM 技术使智能语音客服能够更好地理解对话的上下文,从而实现连贯的对话交流。LLM 可以捕捉对话中的语义和语境信息,识别用户意图,并将上一轮对话的内容与当前对话关联起来。
文字转语音 TTS
支持接入第三方 TTS,通过在模型中引入个性化的训练数据或调整模型的参数,可以生成符合特定要求的语音输出。智能语音客服可以根据用户的偏好或特定场景的需求,提供不同的语音风格。

方案架构

以下是基于 腾讯云智能顾问 架构治理构建的 AI 智能客服方案技术架构,您可以 通过智能顾问快速部署


前提条件

准备 RTC Engine

创建 RTC Engine 应用:Tencent RTC 控制台 > 应用 > 创建 RTC Engine 应用。详细步骤请参见 开通对话式 AI 服务

注意:
RTC Engine 体验版即支持 AI 实时对话、AI 智能识别功能,产生的使用费用按量后付费,具体计费规则详见 AI 实时对话计费说明

准备 STT

使用 TRTC 内置的 Tencent ASR
Tencent ASR 是 TRTC 内置的语音识别引擎。与第三方提供商(Azure、Deepgram、Soniox)不同,它不需要 CustomParam 字段,只需配置 STTConfig 顶层字段即可。完整的腾讯 ASR 参数参考,请参见 ASR 参数配置指南
使用第三方 STT:目前支持的 STT 提供商请参见 可用提供商

准备 LLM

TRTC 的灵活框架支持接入任意主流 LLM,包括 OpenAI 兼容模型(OpenAI、Gemini、MiniMax、Hunyuan)以及 Dify、Coze 等智能体平台。您可以根据具体场景选择最适合的引擎。具体支持的 LLM 提供商请参见 可用提供商

准备 TTS

使用 TRTC 内置的 原生实时 TTS
如需使用 TRTC 内置 TTS 服务,请参见 Text-to-Speech ConfigurationStartAIConversation API 的 TTSConfig 字段中传入指定格式的 JSON 字符串,无需外部账号或 API 密钥。
使用第三方或自定义 TTS:目前支持的 TTS 提供商请参见 可用提供商

接入步骤

业务流程图



步骤1:集成 RTC Engine SDK

导入 RTC Engine SDK 到项目中并进入 TRTC 房间。智能客服进房场景参数推荐使用音频对话客服:TRTCAppSceneAudioCall 或数字人视频客服:TRTCAppSceneVideoCall

步骤2:发布音频流

Android&iOS&Flutter
Web&H5
Windows
Mac
您可以调用 startLocalAudio 来开启麦克风采集,该接口需要您通过 quality 参数确定采集模式。虽然这个参数的名字叫做 quality,但并不是说质量越高越好,不同的业务场景有最适合的参数选择(这个参数更准确的含义是 scene)。
AI 对话场景下推荐使用 SPEECH 模式,该模式下的 SDK 音频模块会专注于提炼语音信号,最大限度地过滤周围的环境噪音,同时该模式下的音频数据也会获得较好的差质量网络的抵抗能力,因此该模式特别适合于“视频通话”和“在线会议”等侧重于语音沟通的场景。
Android
iOS&Mac
Flutter
// 开启麦克风采集,并设置当前场景为:语音模式(高噪声抑制能力、强弱网络抗性)
mCloud.startLocalAudio(TRTCCloudDef.TRTC_AUDIO_QUALITY_SPEECH);
self.trtcCloud = [TRTCCloud sharedInstance];
// 开启麦克风采集,并设置当前场景为:语音模式(高噪声抑制能力、强弱网络抗性)
[self.trtcCloud startLocalAudio:TRTCAudioQualitySpeech];
// 开启麦克风采集,并设置当前场景为:语音模式(高噪声抑制能力、强弱网络抗性)
trtcCloud.startLocalAudio(TRTCAudioQuality.speech);
使用 trtc.startLocalAudio()方法开启麦克风,并发布到房间。
await trtc.startLocalAudio({ option: { profile: TRTC.TYPE.AUDIO_PROFILE_STANDARD }});
调用 startLocalAudio 开启麦克风采集,AI 对话场景下推荐使用 SPEECH 模式
// 开启麦克风采集,设置当前场景为:语音模式
// 具有高的噪声抑制能力,有强有弱的网络阻力
ITRTCCloud* trtcCloud = CRTCWindowsApp::GetInstance()->trtc_cloud_;
trtcCloud->startLocalAudio(TRTCAudioQualitySpeech);
调用 startLocalAudio 开启麦克风采集,AI 对话场景下推荐使用 SPEECH 模式
// 开启麦克风采集,设置当前场景为:语音模式
// 具有高的噪声抑制能力,有强有弱的网络阻力
AppDelegate *appDelegate = (AppDelegate *)[[NSApplication sharedApplication] delegate];
[appDelegate.trtcCloud startLocalAudio:TRTCAudioQualitySpeech];

步骤3:发起 AI 对话

开始 AI 对话:StartAIConversation
通过业务后台调用 开始 AI 对话任务 接口,来发起 AI 实时对话,调用成功后,AI 机器人会进入 RTC Engine 房间。将 前提条件 中的 STT/LLM/TTS 相关信息填入 STTConfigLLMConfigTTSConfig 中。
STTConfig
LLMConfig
TTSConfig
下面以 Tencent ASR 作为 STT 引擎举例,介绍如何配置 STTConfig
配置说明
字段
类型
必填
说明
Language
String
主要语言代码(如 "zh"、"en")。请参阅 STTConfig
VadSilenceTime
Integer
VAD 静音持续时间(毫秒)。当静音超过此值时,当前语音片段结束。请参阅 STTConfig
配置示例
{
"Language": "zh",
"VadSilenceTime": 1000
}
下面以 OpenAI 标准协议的 LLM 模型举例,介绍如何配置 LLMConfig
配置说明
字段
类型
必填
说明
LLMType
String
大模型类型,只要是符合 OpenAI API 协议的大模型,都填写 openai
Model
String
具体的模型名称,例如 gpt-4odeepseek-chat
APIKey
String
大模型的 APIKey
APIUrl
String
大模型的 APIUrl
Streaming
Boolean
是否流式,默认为 false,建议填 true
SystemPrompt
String
系统提示词。
Timeout
Float
超时时间,取值范围 [1,50], 默认为 3 秒(单位:秒)。
History
Integer
设置 LLM 的上下文轮次,默认值:0(不提供上下文管理),最大值:50(提供最近50轮的上下文管理)。
MaxTokens
Integer
输出文本的最大 token 限制。
Temperature
Float
采样温度。
TopP
Float
采样的选择范围,控制输出 token 的多样性。
UserMessages
Object[]
用户提示词。
MetaInfo
Object
自定义参数,会放在请求的 body 中透传给大模型。
配置示例
{
"LLMType": "openai",
"Model": "gpt-4o",
"APIKey": "api-key",
"APIUrl": "https://api.openai.com/v1/chat/completions",
"Streaming": true,
"SystemPrompt": "你是一个个人助手",
"Timeout": 3.0,
"History": 5,
"MetaInfo": {},
"MaxTokens": 4096,
"Temperature": 0.8,
"TopP": 0.8,
"UserMessages": [
{
"Role": "user",
"Content": "content"
},
{
"Role": "assistant",
"Content": "content"
}
]
}
下面以 TRTC 内置 TTS 举例,介绍如何配置 TTSConfig
配置说明
字段
类型
必填
说明
TTSType
String
固定值:"flow"。
VoiceId
String
精品音色或克隆音色 ID,详见 音色库
Model
String
TTS 模型版本。当前默认:flow_01_turbo。
Speed
Float
语速。范围:[0.5,2.0]。默认值:1.0。
Volume
Float
音量。范围:[0,10]。默认值:1.0。
Pitch
Integer
音调调整。范围:[-12,12]。默认值:0。
Language
String
语言 ID:zh(中文)、en(英文)、yue(粤语)。
配置示例
{
"TTSType": "flow",
"VoiceId": "v-female-R2s4N9qJ",
"Model": "flow_01_turbo",
"Speed": 1.0,
"Volume": 1.0,
"Pitch": 0,
"Language": "zh"
}
目前支持的 STTConfigLLMConfigTTSConfig 配置说明:
注意:
RoomId 需要和客户端进房的 RoomId 保持一致,并且房间号类型(数字房间号、字符串房间号)也必须相同(即机器人和用户需要确保在同一个房间)。
TargetUserId 需要和客户端用户进房使用的 UserId 一致。
LLMConfigTTSConfig 均为 JSON 字符串,需要正确配置才能成功发起 AI 实时对话。

步骤4:接收 AI 对话字幕及 AI 状态

通过 RTC Engine 接收自定义消息功能,在客户端上监听回调来接收实时字幕与 AI 状态等数据。cmdID 固定是1
接收实时字幕
消息格式:
{
"type": 10000, // 10000表示是下发的实时字幕
"sender": "user_a", // 说话人的userid
"receiver": [], // 接收者userid列表,该消息实际是在房间内广播
"payload": {
"text":"", // 语音识别出的文本
"translation_text":"", // 翻译的文本
"start_time":"00:00:01", // 这句话的开始时间
"end_time":"00:00:02", // 这句话的结束时间
"roundid": "xxxxx", // 唯一标识一轮对话
"end": true // 如果为true,代表这是一句完整的话
}
}
接收 AI 机器人状态
消息格式:
{
"type": 10001, // AI 机器人的状态
"sender": "user_a", // 发送者userid,这里是机器人的id
"receiver": [], // 接受者userid列表,该消息实际是在房间内广播
"payload": {
"roundid": "xxx", // 唯一标识一轮对话
"timestamp": 123,
"state": 1, // 1 聆听中 2 思考中 3 说话中 4 被打断
}
}
示例代码
Android
iOS&Mac
Web&H5
Windows
Flutter
@Override
public void onRecvCustomCmdMsg(String userId, int cmdID, int seq, byte[] message) {
String data = new String(message, StandardCharsets.UTF_8);
try {
JSONObject jsonData = new JSONObject(data);
Log.i(TAG, String.format("receive custom msg from %s cmdId: %d seq: %d data: %s", userId, cmdID, seq, data));
} catch (JSONException e) {
Log.e(TAG, "onRecvCustomCmdMsg err");
throw new RuntimeException(e);
}
}
func onRecvCustomCmdMsgUserId(_ userId: String, cmdID: Int, seq: UInt32, message: Data) {
if cmdID == 1 {
do {
if let jsonObject = try JSONSerialization.jsonObject(with: message, options: []) as? [String: Any] {
print("Dictionary: \\(jsonObject)")
} else {
print("The data is not a dictionary.")
}
} catch {
print("Error parsing JSON: \\(error)")
}
}
}
trtcClient.on(TRTC.EVENT.CUSTOM_MESSAGE, (event) => {
let data = new TextDecoder().decode(event.data);
let jsonData = JSON.parse(data);
console.log(`receive custom msg from ${event.userId} cmdId: ${event.cmdId} seq: ${event.seq} data: ${data}`);
if (jsonData.type == 10000 && jsonData.payload.end == false) {
// 字幕中间状态
} else if (jsonData.type == 10000 && jsonData.payload.end == true) {
// 一句话说完了
}
});
void onRecvCustomCmdMsg(const char* userId, int cmdID, int seq,
const uint8_t* message, uint32_t msgLen) {
std::string data;
if (message != nullptr && msgLen > 0) {
data.assign(reinterpret_cast<const char*>(message), msgLen);
}
if (cmdID == 1) {
try {
auto j = nlohmann::json::parse(data);
std::cout << "Dictionary: " << j.dump() << std::endl;
} catch (const std::exception& e) {
std::cerr << "Error parsing JSON: " << e.what() << std::endl;
}
return;
}
}
void onRecvCustomCmdMsg(String userId, int cmdID, int seq, String message) {
if (cmdID == 1) {
try {
final decoded = json.decode(message);
if (decoded is Map<String, dynamic>) {
print('Dictionary: $decoded');
} else {
print('The data is not a dictionary. Raw: $decoded');
}
} catch (e) {
print('Error parsing JSON: $e');
}
return;
}
}
说明:
TRTC 提供更多 AI 对话客户端上的回调,具体可参见:AI 对话状态回调AI 对话字幕回调AI 对话指标回调AI 对话错误回调

步骤5:停止 AI 对话,退出 RTC Engine 房间

1. 服务端停止 AI 对话任务。通过业务后台调用 停止 AI 对话 接口,停止该对话任务。
2. 客户端退出 RTC Engine 房间,建议参见 退出房间

高级功能

端上发送自定义消息

可以通过在端侧发送自定义信令,跳过 ASR 流程,直接跟 AI 进行文字沟通,或通过发送打断信令来进行打断。
type
说明
20000
发送自定义的文本,跳过 ASR 过程,直接跟 AI Service 进行文字沟通。
20001
发送打断信令来进行打断。
发送上行信令,跳过 ASR 过程,直接跟 AI 进行文字沟通。
{
"type": 20000, // 端上发送自定义文本消息
"sender": "user_a", // 发送者userid, 服务端会check该userid是否有效
"receiver": ["user_bot"], // 接受者userid列表,只需要填写机器人userid,服务端会check该userid是否有效
"payload": {
"id": "uuid", // 消息id,可以使用uuid,排查问题使用
"message": "xxx", // 消息内容
"timestamp": 123 // 时间戳,排查问题使用
}
}
发送打断信令进行打断。
{
"type": 20001, // 端上发送打断信令
"sender": "user_a", // 发送者userid, 服务端会check该userid是否有效
"receiver": ["user_bot"], // 接受者userid列表,只需要填写机器人userid,服务端会check该userid是否有效
"payload": {
"id": "uuid", // 消息id,可以使用uuid,排查问题使用
"timestamp": 123 // 时间戳,排查问题使用
}
}
注意:
目前小程序端暂不支持接收和发送自定义消息,如果您想在小程序端实现接收字幕或发送消息等功能,需要使用 Chat 提供的即时通信来实现,详见 AI 对话 Chat 信令方案。开通 Chat 信令通道可通过商务或提交工单 联系我们

实现数字人视频客服

可以通过使用 腾讯云智能数智人 服务生成 AI 智能客服的可视化数字人形象,实现数字人视频客服,增强交互体验。

开通数智人服务

1. 开通服务。访问 云智能数智人购买页面 通过形象租赁或形象定制获取 2D 或 3D 数智人形象资产,同时需购买云渲染会话交互并发。
2. 创建交互项目。登录 数字人服务平台,选择交互场景,单击创建新项目。
3. 配置形象和声音。单击编辑按钮,通过切换选项卡来对形象、姿势、声音和输出格式进行修改。
4. 获取项目密钥。切换 API Integration,单击 View Key,获取密钥参数 appkeyaccesstokenvirtualmanProjectId

配置数智人参数

开始 AI 对话任务中通过 AvatarConfig 参数配置数智人服务的各项密钥参数,示例 JSON 如下:
{
"AvatarType" : "tencent", // 数字人类型,目前仅支持 tencent
"Appkey" : "appkey", // 数智人服务的 appkey
"AccessToken" : "accesstoken", // 数智人服务的 accesstoken
"VirtualmanProjectId" : "virtualmanProjectId", // 数智人服务的 virtualmanProjectId
"AvatarUserID" : "robot_xxxx", // TRTC 数字人用户 userID
"DriverType": 1, // 数智人驱动方式(纯文本驱动)
"AvatarUserSig" : "eJw1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" // TRTC 数字人用户签名
}

客户端订阅 RTC 视频流

AI 对话任务发起成功后,数字人会作为一个独立用户进入 RTC 房间并推流。客户端只需要监听、订阅、播放远端数字人视频流即可。
Web
Flutter
Android
iOS
1. 进入房间前监听 TRTC.EVENT.REMOTE_VIDEO_AVAILABLE 事件,以接收所有远程用户视频发布事件。
2. 在收到该事件时,通过 trtc.startRemoteVideo() 播放远端视频流。
trtc.on(TRTC.EVENT.REMOTE_VIDEO_AVAILABLE, ({ userId, streamType }) => {
// To play the video image, you need to place an HTMLElement in the DOM,
// which can be a div tag, assuming its id is `${userId}_${streamType}`
const view = `${userId}_${streamType}`;
trtc.startRemoteVideo({ userId, streamType, view });
});
1. 在进入房间之前对 onUserVideoAvailable 进行监听,当您收到 onUserVideoAvailable(userId, true) 通知时,表示该路画面已经有可播放的视频帧到达。
2. 您可以通过调用接口 startRemoteView 来播放远端用户的视频画面。
// 播放远端用户 robot_xxxx 的主流视频画面
trtcCloud.startRemoteView("robot_xxxx", TRTCVideoStreamType.big, remoteViewId);
1. 在进入房间之前对 onUserVideoAvailable 进行监听,当您收到 onUserVideoAvailable(userId, true) 通知时,表示该路画面已经有可播放的视频帧到达。
2. 调用 startRemoteView 对远端视频画面进行播放。
// 播放远端画面
TXCloudVideoView cameraVideo = findViewById(R.id.txcvv_main_local);
mCloud.startRemoteView("robot_xxxx", TRTCCloudDef.TRTC_VIDEO_STREAM_TYPE_BIG, cameraVideo); // 以高清大画面播放远端视频内容
1. 在进入房间之前对 onUserVideoAvailable 进行监听,当您收到 onUserVideoAvailable(userId, YES) 通知时,表示该路画面已经有可播放的视频帧到达。
2. 调用 startRemoteView 对远端视频画面进行播放。
- (void)startRemoteView {
// 播放远端画面
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
[appDelegate.trtcCloud startRemoteView:@"robot_xxxx" streamType:TRTCVideoStreamTypeBig view:self.remoteVideoView];
}

转接人工客服坐席

人工服务是智能客服系统不可或缺的环节之一,当 AI 客服无法满足用户需求时,提供转接人工客服功能可以大幅提升用户使用体验。
云联络中心(Cloud Contact Center)帮助企业快速搭建集电话、在线交流、音视频通话为一体的客户联络平台。云联络中心 SDK 支持将通信工作台嵌入企业自有业务系统,为企业提供稳定、灵活的融合通信基座。推荐采用云联络中心(Cloud Contact Center)实现人工坐席服务的接入。

触发判断

1. 按钮触发。用户单击“转人工”按钮,端侧直接触发转接人工客服的业务编排。
2. 意图识别。通过 LLM Function Call 语义判断用户在与 AI 客服对话过程中表达的转人工意图,命中后 LLM 返回 tool_calls,业务层执行转人工动作。
定义转人工工具函数,示例如下:
{
"type": "function",
"function": {
"name": "transfer_to_agent",
"description": "当用户明确要求人工、或问题超出AI能力、涉及投诉退款纠纷时调用;仅闲聊抱怨不调用",
"parameters": {
"type": "object",
"properties": {
"reason": { "type": "string", "description": "转人工原因" },
"department": { "type": "string", "enum": ["售后", "技术", "投诉"], "description": "目标技能组" },
"urgency": { "type": "string", "enum": ["low", "high"], "description": "紧急程度" }
},
"required": ["reason"]
}
}
}
LLM 在生成时做语义判断:理解用户真实意图 → 对照每个工具的 description → 决定“这次该不该调用某个工具”。
若判定要调用,LLM 不返回普通文本,而是返回结构化的 tool_calls(含函数名以及从对话里自己提取的参数)。
业务中间层捕获 finish_reason === 'tool_calls',执行转人工动作。
说明:
LLM Function Call 的具体实现可以参考 conversational-ai-cloudbase/llm-tools

转接执行

1. 业务后台调用 StopAIConversation 停止 AI 对话任务。
2. 业务后台调起 TCCC,按 department 路由到目标技能组。
3. TCCC 分配人工座席(IVR 转人工节点 → 技能组 → 空闲座席)。
4. 座席接管对话(SIP 话机 / 网页工作台 / SDK 集成)。
说明:
集成云联络中心 TCCC 所需的配置指引及最佳实践可以参考 呼入配置客服热线(呼入)

自定义知识库与 RAG

在智能客服场景中,企业通常需要上传自有知识库,包括各类文档、问答素材等,这就需要用到 RAG(检索增强生成)的能力。在 TRTC AI 实时对话(Conversational AI)方案中,TRTC 本身不存储知识库、不做检索,知识库与 RAG 都发生在 LLM 这一层。

核心机制

TRTC 通过 StartAIConversation 接口的 LLMConfig 字段,把 STT 转写后的文本转发到外部 LLM 或智能体平台。因此“注入自定义知识库/实现 RAG”的本质就是在 LLM 这一环接入一个具备检索能力的后端或平台。TRTC 会自动在每个 LLM 请求中自动注入以下 HTTP 请求头,可用于业务后台做用户级的知识库路由、鉴权或日志记录等。
请求头
说明
X-Task-Id
当前 AI 会话的唯一任务标识符。
X-Request-Id
请求标识符,同一请求重试时保持一致。
X-Sdk-App-Id
你的 TRTC 应用的 SdkAppId。
X-User-Id
当前会话中的用户 ID。
X-Room-Id
当前 TRTC 会话的房间 ID。
X-Room-Id-Type
房间 ID 类型。"0" = 数字型,"1" = 字符串型。

可用路径

当前建议三条可用的知识库注入及 RAG 实现路径,下面从多个不同维度对比不同实现路径的差异。
实现路径
LLMType
RAG/知识库发生位置
改造成本
适用场景
自建 OpenAI 兼容中间层
openai
业务后台(自建向量库/ES)
私有化、完全可控、复杂 RAG
Dify
dify
Dify 平台知识库
可视化低代码 RAG、快速搭建
Coze
coze
Coze 平台知识库
零代码机器人、内置插件
1. 自建 OpenAI 兼容中间层:业务侧自行实现一个符合 OpenAI 规范的 /v1/chat/completions 接口,TRTC 把其当成普通 OpenAI 模型调用。业务接口内部完成“检索知识库 → 拼接上下文 → 调真实大模型 → 流式返回”,RAG 逻辑完全自主可控。
2. Dify 平台:Dify 的 Knowledge 即其 RAG 实现,官方明确遵循 Retrieval → Augmented → Generation 流程。通过在 Dify 平台建知识库、创建应用、挂载知识库等步骤完成知识库的配置和检索,最后通过 LLMConfig 接入 TRTC Conversational AI。
3. Coze 平台:Coze 的 Knowledge(知识库)即其 RAG 实现,同样遵循 Retrieval → Augmented → Generation 流程。通过在 Coze 平台新建知识库、创建 Bot 并绑定知识库、发布 Bot 等步骤完成知识库的配置与检索,最后通过 LLMConfig 接入 TRTC Conversational AI。
注意:
自建 OpenAI 兼容中间层里,关于 LLM RAG 的具体实现可以参考 conversational-ai-cloudbase/llm-rag

上下文管理与个性化记忆

在智能客服场景中,用户的问题咨询通常具有连贯性,将历史对话记录带入新一轮对话中,可以让 AI 客服更懂用户咨询的背景信息,从而更好地解答用户的问题。RAG 让 AI “更有学问”(懂领域知识),记忆/上下文让 AI “更懂你”(记住用户)。两者都通过 StartAIConversation 中的 LLMConfig 字段注入,可叠加使用。下面介绍 LLMConfig 中与上下文相关的三个字段,即三层记忆体系。

三层记忆体系

字段
记忆层级
内容
精度
时间跨度
管理方
SystemPrompt
长期记忆
基础人设 + 用户长期偏好的 LLM 摘要
中(摘要)
长期
业务侧维护摘要并拼接
UserMessages
短期记忆
最近 N 条外部历史消息记录原文
高(原文)
短期
业务侧启动对话时注入
History
通话内记忆
当前 TRTC 通话过程中的多轮对话轮次
高(原文)
当次通话
TRTC 自动管理,最大50轮

上下文注入示例

以 AI 电商客服为例:SystemPrompt 写入客服人设以及该用户的长期画像摘要,UserMessages 注入用户最近的咨询原文,History 让本次语音通话内多轮连贯。
{
"LLMType": "openai",
"Model": "gpt-5.5",
"APIKey": "<your_openai_api_key>",
"APIUrl": "https://api.openai.com/v1/chat/completions",
"Streaming": true,
"SystemPrompt": "你是某电商平台的AI客服助手,负责订单查询、退换货、物流追踪与商品咨询,回答简洁友好。\\n\\n【用户长期记忆摘要】\\n- 用户昵称小明,黑卡会员,偏好简洁直接的回复\\n- 常购品类:数码3C,历史无退货纠纷\\n- 上次通话咨询过『蓝牙耳机右耳无声』,已建议重新配对",
"Timeout": 3.0,
"History": 10,
"UserMessages": [
{ "Role": "user", "Content": "我上周买的耳机想退货" },
{ "Role": "assistant", "Content": "好的,您的订单 NO.20260528001(蓝牙耳机)在7天无理由期内,可以为您办理退货。" },
{ "Role": "user", "Content": "那退款多久到账?" },
{ "Role": "assistant", "Content": "商品寄回签收后1-3个工作日原路退回到您的支付账户。" }
]
}

历史数据获取

UserMessages 的短期咨询原文,以及 SystemPrompt 的长期摘要数据如何获取?
Chat 文本聊天可以通过 拉取单聊历史消息 获取,内容为用户和客服通过 Chat 单聊产生的历史聊天记录。
TRTC AI 实时对话产生的对话记录可以通过 服务端 903 回调事件 实时接收并存储,内容为 ASR (STT) 识别的用户语音文本和 LLM 生成的回复文本。
摘要更新时机:长期摘要建议在每次 AI 实时对话结束后异步更新,避免影响通话启动速度。
隐私合规要求:长期记忆摘要仅存储关键事实性信息,不保留原始对话全文,并应在用户协议中明确告知。
注意:
注入的 UserMessages 条数越多,LLM 每次调用的 Token 消耗越大且耗时越长,需结合实际需求及成本合理配置。
注入的 SystemPrompt 摘要建议控制在 300 Token 以内,避免过长挤占对话上下文窗口,影响 LLM 首 Token 时延。

智能打断时延优化

若希望调整 AI 实时对话过程中的智能打断时延,可以通过设置 开始 AI 对话接口 里的 AgentConfig.InterruptSpeechDurationSTTConfig.VadSilenceTime 参数,从而调高或降低打断时延。建议同时打开远场人声抑制能力,以降低误打断的概率。

远场人声抑制

在与 AI 客服对话过程中,可能会出现 AI 客服将用户侧其他背景人声识别为用户说的话,从而发生误打断和回复。为了尽量避免此类情况的发生,我们需要启用远场人声抑制的能力。在调用 开始 AI 对话任务 接口时,可以将 STTConfig.VadLevel 设置为2或者3,有较好的远场人声抑制能力。

参数设置说明

参数
类型
描述
AgentConfig.InterruptSpeechDuration
Integer
InterruptMode 为0时使用,单位为毫秒,默认为500ms。表示服务端检测到持续 InterruptSpeechDuration 毫秒的人声则进行打断。
示例值:500
STTConfig.VadSilenceTime
Integer
语音识别 VAD 的时间,范围为 [240, 2000],默认为1000,单位为 ms。更小的值会让语音识别分句更快。
示例值:1000
STTConfig.VadLevel
Integer
VAD 的远场人声抑制能力(不会对 ASR 识别效果造成影响),范围为 [0, 5],默认为0,表示不开启远场人声抑制能力。推荐设置为2,有较好的远场人声抑制能力。嘈杂的办公室环境下可以设置为3,更为嘈杂的环境下可以设置为4或5。注意较高的 VadLevel 可能会将单字当作噪声给过滤。
示例值:2

LLM 透传自定义消息

如需大模型返回不参与 TTS 环节的内容,可在大模型返回内容中增加自定义字段 metainfo, AI 服务探测到 metainfo 后,通过 自定义消息 推送到客户端 SDK 上,完成 metainfo 的透传。
大模型侧发送方式:在大模型流式返回 chat.completion.chunk 对象时,同时返回 meta.infochunk
{"id":"chatcmpl-123","object":"chat.completion.chunk","created":1694268190,"model":"gpt-xxxx", "system_fingerprint": "fp_xxxx", "choices":[{"index":0,"delta":{"role":"assistant","content":""},"logprobs":null,"finish_reason":null}]}
{"id":"chatcmpl-123","object":"chat.completion.chunk","created":1694268190,"model":"gpt-xxxx", "system_fingerprint": "fp_xxxx", "choices":[{"index":0,"delta":{"content":"Hello"},"logprobs":null,"finish_reason":null}]}
// 增加如下自定义消息
{"id":"chatcmpl-123","type":"meta.info","created":1694268190,"metainfo": {}}
{"id":"chatcmpl-123","object":"chat.completion.chunk","created":1694268190,"model":"gpt-xxxx", "system_fingerprint": "fp_xxxx", "choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}]}
客户端侧接收方式:AI 服务检测到有 metainfo 之后,通过 RTC Engine 的 自定义消息 进行下发。客户端可通过 SDK 回调中的 onRecvCustomCmdMsg 接口接收。
{
"type": 10002, // 自定义消息
"sender": "user_a", // 发送者userid,这里是机器人的id
"receiver": [], // 接受者userid列表,该消息实际是在房间内广播,
"roundid": "xxxxxx",
"payload": {} // metainfo
}

常见问题

AI 客服无回应 / 无语音播报

检查客户端是否已开启麦克风采集并发布音频流,或是否正常授予麦克风权限。
确认 StartAIConversation 中的 RoomId 与客户端进房的 RoomId 一致,且房间号类型(RoomIdType)也一致。
检查 LLMConfigTTSConfig 的 JSON 字符串格式是否正确。
确认腾讯云 API 密钥(SecretId / SecretKey)有效,且完成 QcloudTRTCFullAccess 全读写访问权限授权。
建议通过 客户端 或者 服务端 回调,获取 STT / LLM / TTS 的报错信息,便于开发者排查问题,错误码列表如下所示。
服务类别
错误码
错误描述
STT(ASR)
30100
请求超时。
30102
内部错误。
LLM
30200
请求 LLM 超时。
30201
LLM 请求被频率限制。
30202
LLM 服务返回失败。
TTS
30300
请求 TTS 服务超时。
30301
TTS 请求被频率限制。
30302
TTS 服务返回失败。

LLM 长时间无输出或超时报错

如遇到 LLM Timeout 报错,例如提示 llm error Timeout on reading data from socket ,一般是 LLM 请求超时了,可以将 LLMConfig 里的 Timeout 参数值适当调高(默认为3秒)。此外,当 LLM 的首包耗时超过3秒时,较高的对话延迟会影响 AI 对话的体验,如果没有特殊需求,建议优化一下 LLM 的首包耗时,请参见 对话延迟优化

回复单个文字时无响应

当用户回答“是”、“好”等单个文字时,如果 AI 客服没有响应(不去请求 LLM),可以检查是否将 开始 AI 对话接口 里的 AgentConfig.FilterOneWord 参数设置为 false (默认为 true 表示过滤掉用户只说了一个字的句子)。
参数
类型
描述
FilterOneWord
Boolean
是否过滤掉用户只说了一个字的句子,true 表示过滤,false 表示不过滤,默认值为 true。
示例值:true

TRTC 相关错误排查

RTC Engine SDK 遇到不可恢复的错误会在 onError 回调中抛出,常见错误见下表:
错误
错误码
错误描述
ERR_TRTC_USER_SIG_CHECK_FAILED
-100018
UserSig 校验失败,检查签名是否正确或已过期。
ERR_TRTC_CONNECT_SERVER_TIMEOUT
-3308
请求进房超时,请检查是否断网或者是否开启 VPN。
ERR_TRTC_INVALID_SDK_APPID
-3317
进房参数 SDKAppID 错误,请检查 TRTCParams.sdkAppId 是否为空。
ERR_MIC_NOT_AUTHORIZED
-1317
麦克风设备未授权。

帮助和支持

本页内容是否解决了您的问题?

填写满意度调查问卷,共创更好文档体验。

文档反馈