멀티모달 콘텐츠 처리
PRX는 채널과 LLM 프로바이더에 걸쳐 멀티모달 콘텐츠 -- 이미지, 오디오, 비디오 --를 지원합니다. 멀티모달 서브시스템은 콘텐츠 유형 감지, 형식 트랜스코딩, 크기 제한, 채널과 프로바이더 간의 기능 협상을 처리합니다.
개요
사용자가 채널을 통해 미디어 첨부 (사진, 음성 메시지, 문서)를 보내면 멀티모달 파이프라인은:
- 매직 바이트와 파일 확장자를 사용하여 콘텐츠 유형을 감지합니다
- 크기 및 형식 제약에 대해 콘텐츠를 검증합니다
- 대상 프로바이더가 원본 형식을 지원하지 않으면 콘텐츠를 트랜스코딩합니다
- 대화 컨텍스트의 일부로 콘텐츠를 LLM 프로바이더에 디스패치합니다
- 프로바이더가 이미지나 오디오를 생성하면 응답의 미디어를 처리합니다
Channel Input Provider Output
│ │
▼ ▼
┌──────────────┐ ┌──────────────┐
│ Content Type │ │ Response │
│ Detection │ │ Media │
└──────┬───────┘ └──────┬───────┘
│ │
▼ ▼
┌──────────────┐ ┌──────────────┐
│ Validation │ │ Transcoding │
│ & Limits │ │ (if needed) │
└──────┬───────┘ └──────┬───────┘
│ │
▼ ▼
┌──────────────┐ ┌──────────────┐
│ Transcoding │ │ Channel │
│ (if needed) │ │ Delivery │
└──────┬───────┘ └──────────────┘
│
▼
┌──────────────┐
│ Provider │
│ Dispatch │
└──────────────┘지원되는 콘텐츠 유형
이미지
| 형식 | 감지 | 프로바이더로 전송 | 프로바이더에서 수신 |
|---|---|---|---|
| JPEG | 매직 바이트 FF D8 FF | 예 | 예 |
| PNG | 매직 바이트 89 50 4E 47 | 예 | 예 |
| GIF | 매직 바이트 47 49 46 | 예 (첫 프레임) | 아니요 |
| WebP | RIFF 헤더 + WEBP | 예 | 예 |
| BMP | 매직 바이트 42 4D | PNG로 트랜스코딩 | 아니요 |
| TIFF | 매직 바이트 49 49 또는 4D 4D | PNG로 트랜스코딩 | 아니요 |
| SVG | XML 감지 | PNG로 래스터화 | 아니요 |
오디오
| 형식 | 감지 | 전사 | 프로바이더 입력 |
|---|---|---|---|
| OGG/Opus | OGG 헤더 | 예 (STT 경유) | 전사된 텍스트 |
| MP3 | ID3/sync 헤더 | 예 (STT 경유) | 전사된 텍스트 |
| WAV | RIFF + WAVE | 예 (STT 경유) | 전사된 텍스트 |
| M4A/AAC | ftyp box | 예 (STT 경유) | 전사된 텍스트 |
| WebM | EBML 헤더 | 예 (STT 경유) | 전사된 텍스트 |
비디오
| 형식 | 감지 | 처리 |
|---|---|---|
| MP4 | ftyp box | 키프레임 + 오디오 트랙 추출 |
| WebM | EBML 헤더 | 키프레임 + 오디오 트랙 추출 |
| MOV | ftyp box | 키프레임 + 오디오 트랙 추출 |
비디오 파일은 키프레임 이미지와 오디오 트랙으로 분해됩니다. 키프레임은 이미지로 전송되고 오디오는 전사됩니다.
콘텐츠 유형 감지
감지는 2단계 접근 방식을 사용합니다:
- 매직 바이트 -- 파일의 처음 16바이트를 알려진 시그니처와 비교합니다
- 파일 확장자 -- 매직 바이트가 결정적이지 않으면 파일 확장자를 폴백으로 사용합니다
- MIME 유형 헤더 -- HTTP를 통해 수신된 콘텐츠의 경우
Content-Type헤더를 참조합니다
감지 결과에 따라 어떤 처리 파이프라인이 콘텐츠를 처리할지 결정됩니다.
설정
toml
[multimodal]
enabled = true
[multimodal.images]
max_size_bytes = 20_971_520 # 20 MB
max_resolution = "4096x4096" # 최대 너비 x 높이
auto_resize = true # max_resolution을 초과하는 이미지 자동 리사이즈
resize_quality = 85 # 리사이즈된 이미지의 JPEG 품질 (1-100)
strip_exif = true # 개인정보 보호를 위해 EXIF 메타데이터 제거
[multimodal.audio]
max_size_bytes = 26_214_400 # 25 MB
max_duration_secs = 300 # 5분
stt_provider = "whisper" # "whisper", "deepgram" 또는 "provider" (LLM 프로바이더의 STT 사용)
stt_model = "whisper-1"
stt_language = "auto" # 언어 자동 감지는 "auto", 또는 ISO 639-1 코드
[multimodal.video]
max_size_bytes = 104_857_600 # 100 MB
max_duration_secs = 120 # 2분
keyframe_interval_secs = 5 # 5초마다 키프레임 하나 추출
max_keyframes = 20 # 추출할 최대 키프레임 수
extract_audio = true # 오디오 트랙 전사설정 레퍼런스
이미지
| 필드 | 타입 | 기본값 | 설명 |
|---|---|---|---|
max_size_bytes | u64 | 20971520 | 최대 이미지 파일 크기 (20 MB) |
max_resolution | String | "4096x4096" | 최대 이미지 해상도 (WxH) |
auto_resize | bool | true | 크기 초과 이미지 자동 리사이즈 |
resize_quality | u8 | 85 | 리사이즈된 이미지의 JPEG 품질 (1--100) |
strip_exif | bool | true | 이미지에서 EXIF 메타데이터 제거 |
오디오
| 필드 | 타입 | 기본값 | 설명 |
|---|---|---|---|
max_size_bytes | u64 | 26214400 | 최대 오디오 파일 크기 (25 MB) |
max_duration_secs | u64 | 300 | 최대 오디오 길이 (5분) |
stt_provider | String | "whisper" | 음성-텍스트 변환 프로바이더 |
stt_model | String | "whisper-1" | STT 모델명 |
stt_language | String | "auto" | 전사 언어 힌트 |
비디오
| 필드 | 타입 | 기본값 | 설명 |
|---|---|---|---|
max_size_bytes | u64 | 104857600 | 최대 비디오 파일 크기 (100 MB) |
max_duration_secs | u64 | 120 | 최대 비디오 길이 (2분) |
keyframe_interval_secs | u64 | 5 | 키프레임 추출 간격 (초) |
max_keyframes | usize | 20 | 추출할 최대 키프레임 수 |
extract_audio | bool | true | 비디오의 오디오 트랙 전사 |
프로바이더 기능
모든 LLM 프로바이더가 동일한 미디어 유형을 지원하는 것은 아닙니다. PRX는 기능을 자동으로 협상합니다:
| 프로바이더 | 이미지 입력 | 이미지 출력 | 오디오 입력 | 네이티브 멀티모달 |
|---|---|---|---|---|
| Anthropic (Claude) | 예 | 아니요 | 아니요 (먼저 전사) | 예 (비전) |
| OpenAI (GPT-4o) | 예 | 예 (DALL-E) | 예 (Whisper) | 예 |
| Google (Gemini) | 예 | 예 (Imagen) | 예 | 예 |
| Ollama (LLaVA) | 예 | 아니요 | 아니요 | 예 (비전) |
| AWS Bedrock | 모델에 따라 다름 | 다름 | 아니요 | 다름 |
프로바이더가 미디어 유형을 네이티브로 지원하지 않을 때 PRX는 폴백 처리를 적용합니다:
- 이미지 미지원 -- 비전 지원 모델을 사용하여 이미지를 설명하고, 설명을 텍스트로 전송합니다
- 오디오 미지원 -- 설정된 STT 프로바이더로 오디오를 전사하고, 전사본을 텍스트로 전송합니다
- 비디오 미지원 -- 키프레임과 오디오 전사본을 복합 메시지로 전송합니다
채널 미디어 제한
각 채널은 자체 파일 크기 및 형식 제한을 부과합니다:
| 채널 | 최대 업로드 | 최대 다운로드 | 지원 형식 |
|---|---|---|---|
| Telegram | 50 MB | 20 MB | 이미지, 오디오, 비디오, 문서 |
| Discord | 25 MB (무료) | 25 MB | 이미지, 오디오, 비디오, 문서 |
| 16 MB (미디어) | 16 MB | JPEG, PNG, MP3, MP4, PDF | |
| 20 MB | 20 MB | 이미지, 오디오, 문서 | |
| DingTalk | 20 MB | 20 MB | 이미지, 오디오, 문서 |
| Lark | 25 MB | 25 MB | 이미지, 오디오, 비디오, 문서 |
| Matrix | 홈서버에 따라 다름 | 홈서버에 따라 다름 | 모든 일반 형식 |
| 25 MB (일반적) | 25 MB | MIME 첨부로 모두 | |
| CLI | 파일시스템 제한 | 파일시스템 제한 | 모든 형식 |
PRX는 응답 전송을 시도하기 전에 채널의 제한을 적용합니다. 생성된 이미지나 파일이 채널 제한을 초과하면 압축되거나 다운로드 링크가 대신 제공됩니다.
트랜스코딩 파이프라인
형식 변환이 필요할 때 PRX는 다음 트랜스코딩 파이프라인을 사용합니다:
- 이미지 트랜스코딩 --
image크레이트로 처리됩니다 (순수 Rust, 외부 종속성 없음) - 오디오 트랜스코딩 -- FFmpeg가 설치된 경우 사용하고, 그렇지 않으면 일반 형식용 네이티브 디코더로 폴백합니다
- 비디오 키프레임 추출 -- FFmpeg가 필요합니다
FFmpeg 감지
PRX는 시작 시 FFmpeg를 자동으로 감지합니다:
bash
prx doctor multimodal출력:
Multimodal Support:
Images: OK (native)
Audio transcoding: OK (ffmpeg 6.1 detected)
Video processing: OK (ffmpeg 6.1 detected)
STT provider: OK (whisper-1 via OpenAI)FFmpeg가 설치되지 않은 경우 오디오 트랜스코딩과 비디오 처리는 네이티브로 지원되는 형식으로 제한됩니다.
제한 사항
- 비디오 처리는 시스템에 FFmpeg가 설치되어 있어야 합니다
- 대용량 미디어 파일은 LLM 토큰 사용량을 크게 증가시킬 수 있습니다 (특히 여러 키프레임)
- 일부 프로바이더는 비전/멀티모달 API 호출에 대해 추가 요금을 부과합니다
- 실시간 오디오 스트리밍 (라이브 음성 대화)은 아직 지원되지 않습니다
- 프로바이더에서 생성된 이미지 (DALL-E, Imagen)는 프로바이더의 콘텐츠 정책의 적용을 받습니다
- SVG 래스터화는 기본 렌더러를 사용합니다; 복잡한 SVG는 정확하게 렌더링되지 않을 수 있습니다
관련 페이지
- Agent Runtime -- 미디어 콘텐츠가 에이전트 루프를 통과하는 방식
- 채널 개요 -- 채널별 미디어 처리
- 프로바이더 개요 -- 프로바이더 멀티모달 기능
- 임베딩 백엔드 -- 메모리용 임베딩 모델