tencent cloud

Tencent Smart Advisor-Tencent RTC Copilot

시나리오 기반 솔루션
Overview of Scenario-Based Solutions
소셜 엔터테인먼트
이커머스 라이브 방송
Audio/Video Call
원거리 실시간 조작
스마트 고객 서비스
AI 인터뷰
모듈화 솔루션
모듈화 솔루션의 개요
네트워크 품질의 모니터링
모바일 앱 생존 유지 방안
비디오 화면 속 화면 솔루션
라이브 방송 위-아래로 스크롤
스트리머 간 크로스 룸 PK 연결 방안
AI 대화 Chat 시그널링 솔루션

AI 인터뷰

PDF
포커스 모드
폰트 크기
마지막 업데이트 시간: 2025-12-10 11:10:55

시나리오에 대한 소개

AI 인터뷰는 인공지능 기술과 고수준의 실시간 음성및 영상 통신을 활용한 온라인 자동화 면접의 새로운 솔루션입니다. 기존 면접에서는 면접관 인원수, 시간, 주관적 평가 등의 제약으로 인해 기업이 대규모 채용 및 인재 선별 과정에서 효율성 낮고 비용이 많고 체험감 부족 등의 문제에 직면하기 쉽습니다. AI의 실시간 대화 능력을 통해 AI 인터뷰는 기업과 구직자에게 24시간 이용 가능하고 표준화된 고효율 온라인 면접을 제공할 수 있습니다. AI 면접관은 대규모 언어 모델(LLM)을 기반으로 지원자와 자연스러운 대화를 나누며 실시간 질문과 추가 질문을 통해 지원자의 종합적인 능력을 평가하고, 면접 내용을 자동으로 기록 및 정리하여 후속 평가를 지원합니다.
Tencent RTC는 기반 기술로서 AI 인터뷰 시나리오에 안정적, 고수준, 저지연의 음성및 영상 통신 기능을 제공합니다. 크로스 플랫폼 글로벌 전체 운용성의 이점으로 지원자는 iOS, Android, Windows, Mac, Web 및 WeChat/QQ 미니프로그램을 포함된 모든 단말기를 안심하게 사용할 수 있으며 언제 어디서나 AI 인터뷰에 참여할 수 있습니다. 초기 선별이든 심층 질문및 답변이든 RTC Engine은 커뮤니케이션 과정을 선명하고 원활하게 보장하며 사용자 체험은 로컬 애플리케이션에 필적합니다.
기업 개발자에게 RTC Engine은 풍부한 시나리오 기반 UI 구성 요소와 낮은 진입 장벽의 개발 접근 능력을 제공하여, 단 몇 줄의 코드로 빠르게 통합하여 테스트를 시작할 수 있습니다. 기업이 자체 앱이나 공식 계정, 미니프로그램에 AI 면접 입구를 배포하려는 경우에도 쉽게 구현할 수 있습니다.

구현 방안

완전한 AI 인터뷰 시나리오는 일반적으로 Real-Time Communication (RTC), Conversational AI, 대규모 언어 모듈 (LLM), Text To Speech (TTS), 인터뷰 관리 백엔드 등의 핵심 모듈로 구성됩니다. 다음은 AI 인터뷰 시나리오에서 각 모듈의 기능과 특징입니다.
기능 모듈
AI 인터뷰 시나리오의 적용
RTC
RTC Engine 기반으로 고수준, 저지연 음성및 영상 연결을 제공하며 720P/1080P/2K 고화질 및 48kHz 고음질을 지원합니다. 네트워크 환경에 관계없이 원활한 연결을 보장하여 실감적인 면접을 시뮬레이션합니다.
Conversational AI
Tencent Conversational AI 솔루션은 고객이 여러 AI 대형 모듈 서비스를 유연하게 접속할 수 있도록 지원하며, AI와 사용자 간의 RTC 인터랙션을 구현하여 업무 시나리오에 부합하는 Conversational AI 능력을 구축합니다. Tencent Real-Time Communication (Tencent RTC)의 글로벌 저지연 전송을 기반으로 대화 효과가 자연스럽고 리얼하며 접속이 간편하고 즉시 사용할 수 있습니다.
LLM
지능적으로 지원자의 음성 내용과 맥락을 이해하여 응답 요점을 정확하게 추출하고, 후속 면접 질문을 동적으로 생성하여 개인화및 구조화 면접 프로세스를 구현합니다. LLM 기술은 또한 직무별 알고리즘에 따라 자동으로 채점 기준을 조정하여 평가의 공정성과 정확성을 높입니다.
TTS
제3자 TTS 연동을 지원하며 다양한 언어와 음성 스타일의 출력이 가능합니다. AI 면접관은 TTS 기술을 통해 다양한 어조와 성격을 구현함으로써 실제 면접관을 최대한 모방하여 지원자 체험감을 향상시킵니다.
Chat
Chat을 통해 핵심 업무 신호의 전달을 완료합니다.
면접 관리 백엔드
문제 은행과 면접 설계, 자동 채점, 데이터 저장, 시각적 분석, 면접 일정 관리 등의 기능을 포함합니다.

솔루션 아키텍처



다음은 AI 면접 접속의 주요 프로세스에 대해 소개입니다

전제 조건

LLM 준비

Conversational AI는 OpenAI 표준 프로토콜을 준수하는 모든 LLM 모듈을 지원하며, Tencent Cloud Agent Development Platform (ADP), Dify, Coze 등의 LLM 애플리케이션 개발 플랫폼도 지원합니다. 지원되는 플랫폼에 대한 자세한 내용은 LLMConfig 구성 설명을 참조하십시오.

TTS 준비

Tencent 클라우드 TTS의 사용
TTS 음성 합성 기능을 사용하려면 애플리케이션의 TTS 서비스를 개설해야 합니다.
APPID는 계정 정보에서 받을 수 있습니다.
SecretId와 SecretKey는 API 키 관리에서 받을 수 있으며, SecretKey는 키 생성 시에만 확인할 수 있으니 반드시 저장해 두시기 바랍니다.
음색 목록에서 조정 가능한 음색을 확인할 수 있습니다.
제3자 또는 커스텀 TTS 사용: 현재 TTS 문자를 음성으로 변환 구성(TTSConfig) 지원합니다.

RTC Engine 준비

주의:
Conversational AI 호출은 사용 요금이 발생할 수 있으며, 자세한 내용은 Conversational AI 과금 설명을 참조하세요.

접속 단계

업무 프로세스의 흐름도



단계1: RTC Engine SDK를 프로젝트에 가져오고 RTC Engine 방에 들어갑니다.

단계 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();
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 방에 들어갑니다. 전제 조건의 LLM 및 TTS 관련 정보를 LLMConfigTTSConfig에 입력합니다.
LLMConfig
TTSConfig
다음은 OpenAI 표준 프로토콜의 LLM 모듈을 예로 들어 LLMConfig를 구성하는 방법을 설명합니다.
구성 설명
명칭
유형
기입 필수 여부
설명
LLMType
String
대모듈 유형, OpenAI API 프로토콜을 준수하는 대모듈은 모두 openai으로 기입합니다.
Model
String
구체적인 모듈 이름, 예를 들어 gpt-4o, deepseek-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에 포함되어 대형 모듈에 전달됩니다.
구성 예시
"LLMConfig": {
"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"
}
]
}
아래는 Tencent TTS를 예로 들어 TTSConfig를 구성하는 방법을 소개합니다.
{
"TTSType": "tencent", // String TTS 유형, 현재 "tencent"와 "minixmax" 지원하며 다른 업체 지원 중입니다
"AppId": 손님의 애플리케이션 ID입니다. // Integer 기입 필수합니다
"SecretId": "손님의 키 ID입니다", // String 기입 필수합니다
"SecretKey": "손님의 키 Key입니다", // String 기입 필수합니다
"VoiceType": 101001, // Integer 기입 필수합니다.음색 Id는 표준 음색과 프리미엄 음색을 포함하며 프리미엄 음색은 더 높은 사실감을 제공하고 가격이 표준 음색과 다릅니다. 음성 합성 요금 개요를 참조하십시오. 전체 음색 ID 목록은 음성 합성 음색 목록을 참조하십시오.
"Speed": 1.25, // Integer 기입 선택 사항입니다. 음성 속도의 범위는 [-2, 6]이며, 각각 다른 속도에 해당됩니다. -2: 0.6배, -1: 0.8배, 0: 1.0배(기본값), 1: 1.2배, 2: 1.5배, 6: 2.5배를 의미합니다. 더 세분화된 음성 속도가 필요한 경우 소수점 2자리까지 지정 가능합니다(예: 0.5/1.25/2.81 등). 매개변수 값과 실제 음성 속도의 변환은 음성 속도 변환을 참조하십시오.
""Volume": 5, // Integer 기입선택 사항입니다.볼륨 크기의 범위는 [0, 10]이며, 각각 11개의 볼륨 레벨에 해당하며 기본값은 0이고 정상 볼륨을 나타냅니다.
"PrimaryLanguage": 1, // Integer 기입 선택 사항입니다. 주요 언어는 1-중국어(기본값), 2-영어, 3-일본어로 됩니다
"FastVoiceType": "xxxx" // String 선택적 매개변수이며 빠른 음성 복제하는 매개변수입니다
"EmotionCategory":"angry",// String 기입선택 사항입니다.합성된 오디오의 감정을 제어하며 다중 감정 음색에서만 사용 가능합니다. 값: neutral(중립), sad(슬픔)...
"EmotionIntensity":150 //Integer 기입 선택 사항입니다.합성된 오디오의 감정 강도를 제어하며 범위는 [50,200]이며 기본값은 100입니다. EmotionCategory가 비어 있지 않을 때만 적용됩니다.
}
현재 지원되는 STTConfig, LLMConfigTTSConfig 구성에 대한 설명입니다:
주의:
RoomId는 클라이언트가 방 입장하는 RoomId와 일치해야 하며, 방 번호 유형(숫자 방 번호, 문자열 방 번호)도 동일해야 합니다(즉, 로봇과 사용자가 동일한 방에 있어야 함).
TargetUserId는 클라이언트가 방 입장할 때 사용하는 UserId와 일치해야 합니다.
LLMConfigTTSConfig는 모두 JSON 문자열이며 Conversational AI를 성공적으로 시작하려면 올바르게 구성해야 합니다.

단계 4: 대화 시작

이제 사용자는 AI 고객 서비스와 정상적으로 대화할 수 있습니다.

단계 5: AI 대화 중지하고 RTC Engine 방에서 나갑니다

1. 서버에서 AI 대화 작업을 중지합니다. 업무 백엔드에서 AI 대화 중지 인터페이스를 호출하여 해당 대화 작업을 중지합니다.
2. 클라이언트가 RTC Engine 방에서 나갑니다.방에서 나가기을 참조하는 것을 권장합니다.

고급 기능

원거리 음성 억제

AI 면접 중에 AI가 사용자 측의 다른 사람의 목소리를 사용자의 목소리로 인식하여 응답할 수 있습니다. 이러한 상황을 최대한 방지하기 위해 원거리 음성 억제 기능을 사용해야 합니다. AI 대화 작업 시작 인터페이스를 호출할 때 STTConfig.VadLevel을 2 또는 3으로 설정하면 원거리 음성 억제 기능을 혀과적으로 발휘할 수 있습니다.

대화 지연의 최적화

Conversational AI에서 AI 응답 지연은 주로 LLM, TTS의 첫 패킷 처리 시간, ASR의 VadSilenceTime 및 RTC Engine 채널의 지연으로 발생됩니다.
RTC Engine는 자체 개발한 다중 최적 주소 지정 알고리즘을 보유하며 전체 네트워크 스케줄링 기능이 있어서 종단 간의 평균 지연 시간이 300ms 미만입니다. LLM 및 TTS의 첫 패킷 소요 시간에 비해 RTC Engine의 지연 시간은 매우 작아 개발자는 일반적으로 그 지연을 걱정할 필요가 없습니다.
ASR의 소요 시간은 기본적으로 VadSilenceTime에 의해 결정되며, 값이 너무 높으면 대화 지연이 증가하고 너무 낮으면 ASR 문장 분리 간격이 너무 짧아져 사용자가 말할 때 약간 멈추기만 해도 완전한 문장으로 인식되어 LLM에 요청이 전송됩니다.
LLM과 TTS의 첫 패킷 처리 시간은 AI 응답 지연에 가장 큰 영향을 미치는 부분으로, 개발자는 클라이언트 콜백서버 콜백을 통해 LLM 및 TTS 첫 패킷 처리 시간에 대한 콜백을 획득할 수 있습니다.

지표 명칭에 대한 설명

상태 코드
설명
asr_latency
ASR 지연.주의: 지표는 AI 대화 시작 시 VadSilenceTime으로 설정된 시간을 포함합니다.
llm_network_latency
LLM 요청한 네트워크 소요 시간.
llm_first_token
LLM 첫 token 소요 시간의 지표는 네트워크 소요 시간을 포함합니다.
tts_network_latency
TTS 요청한 네트워크 소요 시간.
tts_first_frame_latency
TTS 첫 프레임 소요 시간의 지표는 네트워크 소요 시간을 포함합니다.
tts_discontinuity
TTS 연속되지 않는 횟수는 TTS 스트리밍 요청 재생 완료 후 다음 요청 결과가 아직 반환되지 않은 경우를 나타내며, 일반적으로 TTS 지연이 높은 경우에 발생합니다.
interruption
이번 대화가 중단되었음을 나타냅니다.
가장 중요한 데이터는 llm_first_token(LLM 첫 패킷 소요 시간)과 tts_first_frame_latency(TTS 첫 프레임 소요 시간)입니다.
llm_first_token
LLM 첫 패킷 소요 시간은 2초 이내로 제어하는 것이 좋으며, 낮을수록 좋습니다. 음성 대화 시나리오에서는 LLM이 스트리밍 반환을 사용하는 것을 권장합니다(LLMConfigStreamingtrue로 설정해야 함). 이렇게 하면 지연 시간을 크게 줄일 수 있습니다. DeepSeek-R1과 같은 사고형 모듈은 LLM 지연 시간이 너무 길어 음성 대화에 적용할 수 없으므로 사용하지 않는 것이 좋습니다. 대화 지연에 특히 민감한 경우 매개변수가 더 작은 모듈을 선택할 수 있으며, 많은 모듈이 첫 패킷 소요 시간을 500ms 정도로 제어할 수 있습니다.
또한, 추가로 일부 Agent나 워크플로우 플랫폼을 연결하면 첫 패킷 지연 시간이 증가할 수 있습니다. 단독으로 LLM + 프롬프트를 사용하는 경우 일반적으로 지연 시간이 더 짧습니다.
tts_first_frame_latency
대부분의 TTS 첫 패킷 소요 시간은 일반적으로 500ms~1000ms 정도입니다. 소요 시간이 특히 높은 경우 음색이나 TTS 제공업체를 변경하여 대화 지연을 개선할 수 있습니다.

AI 대화 자막 및 AI 상태의 수신

RTC Engine의 커스텀 메시지 수신 기능을 통해 클라이언트에서 콜백을 모니터링하여 실시간 자막 및 AI 상태 데이터를 수신합니다. cmdID는 고정적으로 1입니다.

실시간 자막의 수신

메시지 형식:
{
"type": 10000, // 10000은 실시간 자막 전송을 나타냅니다
"sender": "user_a", // 발화자의 userid입니다
"receiver": [], // 수신자 userid 목록입니다.해당 메시지는 실제로 방 내에서 브로드캐스트됩니다
"payload": {
"text":"", // 음성에서 인식된 텍스트입니다
"start_time":"00:00:01", // 이 문장의 시작 시간입니다
"end_time":"00:00:02", // 이 문장의 종료 시간입니다
"roundid": "xxxxx", // 한 라운드 대화의 고유 식별자입니다
"end": true // true인 경우, 이 문장이 완전한 문장임을 나타냅니다
}
}

로봇 상태의 수신

메시지 형식:
{
"type": 10001, // 로봇의 상태입니다
"sender": "user_a", // 발신자 userid입니다. 여기는 로봇의 id입니다
"receiver": [], // 수신자 userid 목록입니다.해당 메시지는 실제로 방 내에서 브로드캐스트됩니다
"payload": {
"roundid": "xxx", // 한 라운드 대화의 고유 식별자입니다
"timestamp": 123,
"state": 1, // 1 듣는 중, 2 생각 중, 3 말하는 중, 4 중단됨, 5 말을 마침
}
}

예시 코드
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;
}
}
설명:
우리는 더 많은 AI 대화 클라이언트의 콜백을 가지고 있으며, 구체적으로는 AI 대화 상태 콜백, AI 대화 자막 콜백, AI 대화 지표 콜백, AI 대화 오류 콜백을 참조할 수 있습니다.

프록시 LLM

AI 대화 서비스는 표준 OpenAI 규범을 지원하여 개발자가 자신의 업무에서 맞춤형 LLM을 구현할 수 있습니다. 개발자는 자신의 업무 백엔드에서 OpenAI API와 호환되는 대형 모듈 인터페이스를 구현하고, 컨텍스트 로직과 RAG가 포함된 대형 모듈 요청을 제3자 대형 모듈로 전송할 수 있습니다. 구현 프로세스는 다음과 같습니다.

이 플로우 차트는 커스텀 컨텍스트 관리의 기본 단계를 보여줍니다. 개발자는 자신의 구체적인 요구 사항에 따라 이 프로세스를 조정하고 최적화시킬 수 있습니다.
코드 예시
import time
from fastapi import FastAPI, HTTPException
from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel
from typing import List, Optional
from langchain_core.messages import HumanMessage, SystemMessage
from langchain_openai import ChatOpenAI

app = FastAPI(debug=True)

# CORS 미들웨어의 추가
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)

class Message(BaseModel):
role: str
content: str

class ChatRequest(BaseModel):
model: str
messages: List[Message]
temperature: Optional[float] = 0.7

class ChatResponse(BaseModel):
id: str
object: str
created: int
model: str
choices: List[dict]
usage: dict

@app.post("/v1/chat/completions")
async def chat_completions(request: ChatRequest):
try:
# 요청 메시지를 LangChain 메시지 형식으로 변환합니다
langchain_messages = []
for msg in request.messages:
if msg.role == "system":
langchain_messages.append(SystemMessage(content=msg.content))
elif msg.role == "user":
langchain_messages.append(HumanMessage(content=msg.content))

# add more historys
# LangChain의 ChatOpenAI 모듈 사용합니다
chat = ChatOpenAI(temperature=request.temperature,
model_name=request.model)
response = chat(langchain_messages)
print(response)

# OpenAI API 형식에 맞는 응답을 구성합니다
return ChatResponse(
id="chatcmpl-" + "".join([str(ord(c))
for c in response.content[:8]]),
object="chat.completion",
created=int(time.time()),
model=request.model,
choices=[{
"index": 0,
"message": {
"role": "assistant",
"content": response.content
},
"finish_reason": "stop"
}],
usage={
"prompt_tokens": -1, # LangChain은 이 정보를 제공하지 않으므로 플레이스홀더 값을 사용합니다
"completion_tokens": -1,
"total_tokens": -1
}
)
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))

if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)

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
}

Chat을 통해 핵심 신호를 전달합니다

업무 서버가 클라이언트에 일부 업무의 핵심 신호를 전달해야 하는 경우, Chat SDK을 통해 전송하는 것이 더 권장됩니다. 이는 AI 로봇으로 인해 중단되어 metainfo 신호가 손실되는 문제를 방지할 수 있습니다.
서버 메시지의 발송:
클라이언트에서 메시지 수신:

AI 면접관의 "말 끊기" 방지

수동 라운드 모드의 사용

AI 대화 인터페이스 시작 내부의 AgentConfig.TurnDetectionMode 매개변수를 1으로 설정하여 수동 라운드 모드를 활성화할 수 있습니다. 이 경우에 클라이언트는 자막 메시지를 수신한 후 새로운 대화를 트리거하기 위해 채팅 신호를 수동으로 보낼지, 안 보낼지를 자체적으로 결정합니다.
매개변수에 대한 설명
매개변수
유형
설명
TurnDetectionMode
Integer
새로운 대화의 트리거 방식을 제어하며 기본값은 0입니다.
0은 서버의 음성 인식이 완전한 문장을 감지한 후 자동으로 새로운 대화를 시작함을 나타냅니다.
1은 클라이언트가 자막 메시지를 수신한 후 수동으로 채팅 신호를 보내 새로운 대화를 트리거할지를 자체적으로 결정함을 나타냅니다.
예시 값: 0
채팅 신호
{
"type": 20000, // 클라이언트에서 커스텀 텍스트 메시지를 전송합니다
"sender": "user_a", // 발신자 userid입니다. 서버는 해당 userid가 유효한지 확인합니다
"receiver": ["user_bot"], // 수신자 userid 목록입니다.로봇 userid만 기입하면 되며, 서버에서 해당 userid의 유효성을 확인합니다
"payload": {
"id": "uuid", // 메시지 ID입니다.문제 해결 시 uuid를 사용할 수 있습니다
"message": "xxx", // 메시지 내용입니다
"timestamp": 123 // 타임스탬프입니다.문제 해결에 사용할 수 있습니다
}
}
예시 코드
Android
iOS
Web&H5
public void sendMessage() {
try {
int cmdID = 0x2;

long time = System.currentTimeMillis();
String timeStamp = String.valueOf(time/1000);
JSONObject payLoadContent = new JSONObject();
payLoadContent.put("timestamp", timeStamp);
payLoadContent.put("message", message);
payLoadContent.put("id", String.valueOf(GenerateTestUserSig.SDKAPPID) + "_" + mRoomId);

String[] receivers = new String[]{robotUserId};

JSONObject interruptContent = new JSONObject();
interruptContent.put("type", 20000);
interruptContent.put("sender", mUserId);
interruptContent.put("receiver", new JSONArray(receivers));
interruptContent.put("payload", payLoadContent);

String interruptString = interruptContent.toString();
byte[] data = interruptString.getBytes("UTF-8");

Log.i(TAG, "sendInterruptCode :" + interruptString);

mTRTCCloud.sendCustomCmdMsg(cmdID, data, true, true);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (JSONException e) {
throw new RuntimeException(e);
}
}
@objc func sendMessage() {
let cmdId = 0x2
let timestamp = Int(Date().timeIntervalSince1970 * 1000)
let payload = [
"id": userId + "_\\(roomId)" + "_\\(timestamp)", // 메시지 ID입니다.문제 해결 시 uuid를 사용할 수 있습니다
"timestamp”: timestamp, // 타임스탬프입니다. 문제 해결에 사용할 수 있습니다
"message": "xxx" // 메시지 내용입니다
] as [String : Any]
let dict = [
"type": 20001,
"sender": userId,
"receiver": [botId],
"payload": payload
] as [String : Any]
do {
let jsonData = try JSONSerialization.data(withJSONObject: dict, options: [])
self.trtcCloud.sendCustomCmdMsg(cmdId, data: jsonData, reliable: true, ordered: true)
} catch {
print("Error serializing dictionary to JSON: \\(error)")
}
}
const message = {
"type": 20000,
"sender": "user_a",
"receiver": ["user_bot"],
"payload": {
"id": "uuid",
"timestamp": 123,
"message": "xxx", // 메시지 내용입니다
}
};

trtc.sendCustomMessage({
cmdId: 2,
data: new TextEncoder().encode(JSON.stringify(message)).buffer
});
주의:
커스텀 메시지는 각 메시지 패킷(즉, data의 크기)이 최대 1KB로 제한되며, 1KB를 초과하는 요구 사항이 있는 경우 Chat 신호 채널을 사용할 수 있습니다.

인터럽트 지연의 최적화

AI와 대화할 때 응답 지연이 느리다고 느끼면 AI 대화 인터페이스 시작AgentConfig.InterruptSpeechDurationSTTConfig.VadSilenceTime 매개변수를 낮게 설정하여 응답 지연을 줄일 수 있습니다. 오작동 확률을 줄이기 위해 원거리 음성 억제 기능을 함께 활성화하는 것이 좋습니다.
매개변수에 대한 설명
매개변수
유형
설명
AgentConfig.InterruptSpeechDuration
Integer
InterruptMode가 0일 때 사용되며 단위는 밀리초이고 기본값은 500ms입니다. 서버가 지속적으로 InterruptSpeechDuration 밀리초 동안 사람의 목소리를 감지하면 대화를 중단합니다.
예시 값: 500
STTConfig.VadSilenceTime
Integer
음성 인식 vad 시간의 범위는 240~2000이며 기본값은 1000(단위: ms)입니다. 값이 작을수록 음성 인식 문장 분할이 더 빨라집니다.
예시 값: 500

서버 콜백

AI 대화 서버 콜백을 참조하세요.
주의:
콜백 주소는 RTC Engine 콘솔에서 설정하며, Conversational AI 콜백입니다.
RTC Engine 방 및 미디어 콜백과 함께 사용하여 기능을 풍부하게 할 수 있습니다.

클라우드 레코딩

RTC Engine 최신 업그레이드된 클라우드 레코딩은 RTC Engine 내부의 실시간 레코딩 클러스터를 사용하여 오디오/비디오를 레코딩하며 더 완전하고 통일된 레코딩 체험을 제공합니다.
싱글 스트림 레코딩: RTC Engine의 클라우드 레코딩 기능을 통해 방 안의 각 사용자의 오디오 스트림을 개별 파일로 레코딩할 수 있습니다.



혼합 스트림 레코딩: 동일한 방의 오디오 미디어 스트림을 하나의 파일로 혼합하여 레코딩합니다.



설명:
RTC Engine 클라우드 레코딩의 상세 소개 및 개설 안내는 RTC Engine 클라우드 레코딩 설명을 참조하십시오.

자주 발생한 문제

로봇이 왜 말을 하지 않나요?

1. 클라이언트가 마이크의 수집을 활성화하고 오디오 스트림을 게시했는지 확인하세요.
2. RTC Engine의 커스텀 메시지 수신 기능을 통해 실시간 자막 및 AI 상태 등의 데이터를 수신할 수 있는지 확인합니다. 수신되지 않는 경우, StartAIConversation 인터페이스 호출 시 사용한 RoomId이 클라이언트 방 입장 시 사용한 RoomId와 일치하는지, 그리고 방 번호 유형(숫자 방 번호, 문자열 방 번호)도 동일한지 확인하세요(즉, 로봇과 사용자가 동일한 방에 있어야 함). 또한 TargetUserId가 클라이언트 방입장 시 사용한 UserId와 일치하는지 확인하세요.
3. 자신이 말한 자막은 수신되지만 로봇의 응답 자막이 수신되지 않으면 LLM 관련 구성을 확인하는 것을 권장합니다.
4. 로봇의 응답 자막은 수신되지만 로봇의 음성이 들리지 않으면 TTS 관련 구성을 확인하는 것을 권장합니다.
5. 클라이언트서버 콜백을 통해 LLM과 TTS의 오류 정보를 확인할 수 있어 개발자가 문제를 해결하는 데 도움이 됩니다.
서비스 유형
에러 코드
에러의 설명
ASR
30100
요청이 시간 초과했습니다
30102
내부 오류
LLM
30200
LLM 요청이 시간 초과했습니다
30201
LLM 요청이 빈도에 제한됩니다
30202
LLM 서비스 반환이 실패됩니다
TTS
30300
TTS 서비스 요청이 시간 초과했습니다
30301
TTS 요청이 빈도에 제한됩니다
30302
TTS 서비스 반환이 실패됩니다

대형 모듈 Timeout 오류

LLM Timeout 오류가 발생하는 경우, 예를 들어 llm error Timeout on reading data from socket과 같은 메시지가 표시되면 일반적으로 LLM 요청이 시간 초과된 것입니다. LLMConfig의 Timeout 매개변수를 더 크게 설정하여 본 문제를 해결할 수 있습니다(기본값은 3초임). 또한 LLM의 첫 패킷 소요 시간이 3초를 초과한 경우, 높은 대화 지연은 AI 대화에 영향을 미칩니다. 특별한 요구 사항이 없는 경우 LLM의 첫 패킷 소요 시간을 최적화하는 것이 좋으며, 대화 지연 최적화을 참조하십시오.

Tencent TTS 오류

Tencent TTS 오류가 발생하는 경우, 예를 들어 다음과 같은 오류가 발생하면:
TencentTTS chunk error {'Response': {'RequestId': 'xxxxxx', 'Error': {'Code': 'AuthorizationFailed', 'Message': "Please check http header 'Authorization' field or request parameter"}}}
다음과 같은 측면에서 점검할 수 있습니다.
1. 앱에서 TTS 서비스가 개설되었는지 확인하세요.
2. APPID, SecretId, SecretKey가 올바르게 입력되었는지 확인하세요.
3. 무료 TTS 리소스 패키지를 수령했는지 확인하세요.
4. 입력한 음색 ID가 무료 리소스 패키지에 포함되어 있는지 확인하세요.
전제 조건의 TTS 부분 단계를 참고하여 다시 진행하세요. 또한, 서브 계정을 사용하는 경우 서브 계정에 TTS 권한 개설을 해야 합니다.

사용자가 단일 문자로 답변할 때 왜 LLM을 요청하지 않나요?

사용자가 "예", "좋아" 등 단일 문자로 답변할 때 LLM을 요청하지 않으면 AI 대화 인터페이스 시작AgentConfig.FilterOneWord 매개변수가 false(기본값 true)로 설정되었는지 확인하세요.
매개변수
유형
설명
FilterOneWord
Boolean
사용자가 한 단어만 말한 문장을 필터링할지, true는 필터링하고 false는 필터링하지 않습니다. 기본값은 true입니다
예시 값: true

이상및 오류 처리

RTC Engine SDK에서 복구할 수 없는 오류가 발생하면 onError 콜백에서 나오며, 자세한 내용은 오류 코드표을 참조하십시오.
UserSig 관련.
UserSig 검증 실패로 인해 방 입장에 실패할 수 있으며, UserSig 도구을 사용하여 검증할 수 있습니다.
열거형
설명
ERR_TRTC_INVALID_USER_SIG
-3320
방 입장 매개변수 userSig가 올바르지 않습니다. TRTCParams.userSig이 비어 있는지 확인하세요.
ERR_TRTC_USER_SIG_CHECK_FAILED
-100018
UserSig 검증에 실패했습니다. 매개변수 TRTCParams.userSig이 올바르게 입력되었는지, 또는 만료되었는지 확인하세요.
방 입장 및 퇴장 관련.
방 입장 실패 시 먼저 입장 매개변수가 올바른지 확인하고 방 입장 및 퇴장 인터페이스는 반드시 쌍으로 호출해야 합니다. 입장에 실패한 경우에도 퇴장 인터페이스를 호출해야 합니다.
열거형
설명
ERR_TRTC_CONNECT_SERVER_TIMEOUT
-3308
방 입장 요청이 시간 초과하는 경우, 네트워크 연결이 끊겼는지 또는 VPN이 켜져 있는지 확인하세요. 4G로 전환하여 테스트할 수도 있습니다.
ERR_TRTC_INVALID_SDK_APPID
-3317
방 입장 매개변수 SDKAppId가 잘못되었습니다. TRTCParams.sdkAppId이 비어 있는지 확인하세요.
ERR_TRTC_INVALID_ROOM_ID
-3318
방 입장 매개변수 roomId가 잘못되었습니다. TRTCParams.roomId 또는 TRTCParams.strRoomId이 비어 있는지 확인하세요. roomId와 strRoomId는 혼용할 수 없습니다.
ERR_TRTC_INVALID_USER_ID
-3319
방 입장 매개변수 UserID가 올바르지 않습니다. TRTCParams.userId이 비어 있는지 확인하세요.
ERR_TRTC_ENTER_ROOM_REFUSED
-3340
방 입장 요청이 거부되었습니다. enterRoom을 연속적으로 호출하여 동일한 ID의 방에 입장했는지 확인하세요.
장치 관련.
장치 관련 오류를 감지할 수 있으며, 관련 오류 발생 시 UI가 사용자에게 알려줍니다.
열거형
설명
ERR_MIC_START_FAIL
-1302
Windows 또는 Mac 장치에서 마이크 구성 프로그램(드라이버)이 비정상일 경우에 마이크 열 수가 없습니다. 장치를 비활성화한 후 다시 활성화하거나, 장치를 재시작하거나, 구성 프로그램을 업데이트하세요.
ERR_SPEAKER_START_FAIL
-1321
Windows 또는 Mac 장치에서 스피커 구성 프로그램(드라이버)이 이상이 있는 경우에 스피커를 열수 가 없습니다.장치를 비활성화한 후 다시 활성화하거나, 장치를 재시작하거나 구성 프로그램을 업데이트하세요.
ERR_MIC_OCCUPY
-1319
마이크가 사용 중입니다. 예를 들어 모바일 장치에서 통화 중일 때 마이크를 열 수가 없습니다.

방안의 관련 제품

시스템 계층
제품명
시나리오 용도
접속 계층
저지연 및 고수준의 실시간 음성/영상 인터랙션 솔루션을 제공하며 음성/영상 통화 시나리오의 기반 인프라 기능입니다.
접속 계층
핵심 업무 신호의 전달을 완료합니다.
클라우드 서비스
AI와 사용자 간의 실시간 음성 및 영상 인터랙션을 구현하여 업무 시나리오에 부합하는 Conversational AI 능력을 구축합니다.
클라우드 서비스
신원 확인 및 부정행위 방지 기능을 제공합니다.
대형 모듈
지능형 고객 서비스의 두뇌로 LLM+RAG, Workflow, Multi-agent 등 다양한 에이전트 개발 프레임워크를 제공합니다.
데이터 저장
오디오 레코딩 파일 및 오디오 슬라이스 파일의 저장 서비스를 제공합니다.


도움말 및 지원

문제 해결에 도움이 되었나요?

피드백