LLM Post-processing
ASR сървърът поддържа опционална LLM-базирана корекция на транскрибирания текст. Суровият изход от Canary-1B-v2 се изпраща към vLLM сървър (Gemma 3 12B), който коригира правопис, граматика и пунктуация.
Архитектура
Как работи
- ASR модулът транскрибира аудиото и получава суров текст
- Ако post-processing е включен (глобално или per-request), текстът се изпраща към vLLM
- vLLM изпълнява Gemma 3 12B модел с OpenAI-compatible API
- LLM-ът получава system prompt с инструкции за корекция и user message с текста
- Коригираният текст се връща в полето
postprocessed_textна отговора
Определяне на езика в промпта
В зависимост от задачата, текстът се изпраща с различен prefix:
transcribeзадача:[{language}] {text}(напр.[bg] Здравейте как сте)translateзадача:[translated to en] {text}(указва, че текстът вече е на английски)
System Prompt
LLM-ът получава следния system prompt:
You are a post-processor for automatic speech recognition (ASR) output.
You receive raw ASR text that may contain:
- Spelling errors and typos caused by the ASR system
- Missing or incorrect punctuation (periods, commas, question marks)
- Repeated syllables or words (e.g. "popu popular" → "popular")
- Incorrect word boundaries (words merged or split wrongly)
Rules:
1. Fix spelling, grammar, and punctuation errors
2. Keep the original meaning — do NOT add, remove, or rephrase content
3. Stay as close to the original text as possible
4. Proper nouns, brand names, and technical terms should use their standard spelling
5. Return ONLY the corrected text, with no explanations or commentary
6. If the text is already correct, return it unchanged
LLM параметри
| Параметър | Стойност | Описание |
|---|---|---|
max_tokens | 512 | Максимален брой генерирани токени |
temperature | 0.1 | Ниска температура за детерминистичен изход |
top_p | 1.0 | Без nucleus sampling ограничение |
repetition_penalty | 1.1 | Леко наказание за повтаряне на токени |
Конфигурация
Environment variables
| Променлива | По подразбиране | Описание |
|---|---|---|
POSTPROCESS_ENABLED | false | Глобално включване на post-processing. Стойности: 1, true, yes |
POSTPROCESS_URL | http://llm:8000 | URL на vLLM сървъра (вътрешен Docker DNS) |
POSTPROCESS_MODEL | google/gemma-3-12b-it | Име на модела за vLLM |
POSTPROCESS_TIMEOUT | 5.0 | Timeout за LLM заявки в секунди |
vLLM сървър конфигурация
vLLM сървърът се стартира с Docker Compose profile postprocess:
# Стартиране с post-processing
docker compose --profile postprocess up -d
vLLM параметри от docker-compose.yml:
| Параметър | Стойност | Описание |
|---|---|---|
--dtype | bfloat16 | Тип данни за по-ниска VRAM консумация |
--enforce-eager | -- | Изключва CUDA graphs за стабилност |
--gpu-memory-utilization | 0.25 | Използва 25% от GPU VRAM (ASR заема останалото) |
--max-model-len | 1024 | Максимална дължина на контекста |
--max-num-seqs | 8 | Максимален брой паралелни последователности |
vLLM Health Check
vLLM контейнерът има конфигуриран health check:
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
interval: 30s
timeout: 10s
retries: 5
start_period: 180s # 3 минути за зареждане на модела
Fallback поведение
Post-processing е проектиран да не блокира ASR резултатите:
Кога fallback се задейства
- vLLM сървърът не е наличен -- connection error
- Timeout -- заявката отнема повече от
POSTPROCESS_TIMEOUTсекунди - HTTP грешка -- 4xx/5xx отговор от vLLM
- JSON parse error -- невалиден отговор от модела
При всички тези случаи:
- Оригиналният текст от ASR се използва като
postprocessed_text - Грешката се записва в
postprocess_error - Латентността се записва в
postprocess_ms - Заявката не се счита за неуспешна -- клиентът все пак получава транскрипция
Per-request Override
Клиентът може да override-не глобалната настройка за post-processing чрез полето postprocess в metadata:
{
"type": "transcribe",
"language": "bg",
"postprocess": false
}
"postprocess": true-- принудително включване (дори ако глобално е изключен, vLLM трябва да е наличен)"postprocess": false-- принудително изключване per-request
Статистика
PostProcessor класът поддържа rolling статистика за последните 100 заявки:
| Метрика | Описание |
|---|---|
requests | Общ брой заявки към LLM |
errors | Общ брой грешки |
avg_ms | Средна латентност (rolling window от 100) |
last_ms | Латентност на последната заявка |
error_rate | Процент грешки |
Тези метрики са достъпни чрез Dashboard-а и Prometheus histogram asr_postprocess_seconds.
GPU споделяне
ASR и vLLM споделят една и съща GPU, но не работят едновременно:
- ASR inference е защитен от
asyncio.Lock-- само една транскрипция наведнъж - Post-processing работи извън GPU lock-а (vLLM управлява собствения си GPU достъп)
- vLLM е конфигуриран да използва само 25% от GPU паметта (
--gpu-memory-utilization 0.25) - Останалата VRAM е за Canary-1B-v2 модела