런타임 구성요소와 저장소¶
핵심 구성요소¶
| 구성요소 | 소유 책임 | 주요 계약 |
|---|---|---|
| App Backend | 인증·워크스페이스, API key/client-secret, 시나리오 관리, 대화·분석 조회 | HTTPS REST, PostgreSQL 읽기 모델 |
| WebRTC Gateway | WebRTC 시그널링, Opus/PCM 변환, 세션별 WSS 브리지, 재생 제어 | WebRTC/SRTP/SCTP ↔ PCM·JSON /sohri |
| Socket Backend | WebSocket 세션, EPD·Graph Builder·TTS 조정, 턴 제어, 저장·최종화 | /sohri, 외부 서비스 어댑터, DB 쓰기 |
| EPD | 발화 후보·확정·종료 감지와 STT | PCM 입력, activity 이벤트, END + STT |
| Graph Builder | 시나리오 로드·검증, NLU, 정책, 대화 상태, 전이, NLG | 세션·메시지 API, 상태 저장소 |
| Sohri Skill Runtime | Graph Builder 요청을 Skill Engine 공통 실행 계약으로 변환하고 오류를 정규화하는 범용 프록시 | skill_id, arguments, 제한된 context |
| Skill Engine / 외부 API | 스킬별 입력 검증, 도메인 기능 실행과 외부 제공자 연동 | 스킬별 입력·결과 계약 |
| TTS Provider | 응답 텍스트의 음성 합성 | 텍스트·음성 설정 → WAV 또는 PCM |
WebRTC Gateway는 각 세션에 PeerConnection, 코덱 상태, WSS와 재생 세대를 격리합니다. 입력은 Opus 48 kHz를 PCM 16 kHz mono s16le로 정규화하고, 출력 PCM은 WebRTC 전송 전에 Opus 48 kHz로 변환합니다. Socket Backend를 직접 사용하는 클라이언트에는 이 변환 계층이 필요하지 않을 수 있습니다.
Socket Backend는 세션별 대화 경로를 한 번 확정하고 PCM, 취소, 종료를 같은 경로에 위임합니다. 기본 경로는 EPD·Graph Builder·TTS 조합입니다. 지원 가능한 다른 대화 엔진이 있더라도 사용 가능 여부는 배포 설정과 공급자 활성화 상태에 따라 달라집니다.
상태와 저장소¶
flowchart TB
S["Socket Backend"]
G["Graph Builder"]
A["App Backend"]
DB[("PostgreSQL<br/>대화·메시지·분석·요약")]
RS[("Redis<br/>세션 설정·DialogueState·lock")]
MS[("프로세스 메모리<br/>단일 worker/replica 모드")]
OBJ[("선택적 오디오 객체 저장소")]
S -->|"실시간 기록·최종화 쓰기"| DB
A -->|"워크스페이스 범위 조회"| DB
G -->|"공유 세션 모드"| RS
G -->|"로컬 세션 모드"| MS
S -. "선택적 오디오 보관" .-> OBJ
A -. "인증된 프록시 읽기" .-> OBJ
PostgreSQL¶
- 대화 연결 시
dialog를 만들고 턴마다 EPD, USER/BOT 메시지와 분석 결과를 기록합니다. - Socket Backend가 실시간 쓰기를 소유하고 App Backend가 조회 모델을 구성합니다.
- 물리 스키마, 인덱스, 제약과 파티션의 정본은 DB 스키마 저장소에 있습니다.
- 공유 DB는 서비스 간 통합 계약이지만, 서비스끼리 임의로 상대 소유 필드를 변경할 수 있다는 의미는 아닙니다.
Graph Builder 세션 상태¶
DialogueState에는 현재 노드, 슬롯, 대화 이력, 런타임 컨텍스트, 턴 수와 완료 상태가 들어갑니다.- Redis 모드는 세션 설정, JSON 시나리오, 상태와 분산 lock을 공유해 다중 worker/Pod를 지원합니다.
- 메모리 모드는 프로세스 로컬 상태와 lock을 사용하므로 worker와 replica를 각각 하나로 제한해야 합니다.
- 세션 완료와 상태 삭제는 별개입니다. TTL 또는 명시적 정리 전까지 상태가 남을 수 있습니다.
선택적 오디오 보관¶
오디오 아카이빙은 대화 성공 조건이 아닙니다. 활성화된 배포에서는 USER/BOT 오디오와 DB 메타데이터를 연결할 수 있으며, 보관 실패는 대화와 세션 종료를 실패시키지 않는 부가 경로로 취급합니다.
수명주기 구분¶
- 턴 종료: TTS·응답 전송 후 입력 gate와 처리 lease를 반납합니다.
- 대화 최종화: 미완료 기록을 기다리고 분석, 일반 요약, 바이오마커 요약을 마무리합니다.
- 연결 종료: 세션 맵과 외부 연결을 멱등 정리하고 종료 시각을 기록합니다.
세 수명주기는 같은 시점에 끝난다고 가정하면 안 됩니다. 대화 완료 신호가 최종화를 시작해도 WebSocket 연결은 유지될 수 있습니다.