Преминете към основното съдържание

LLM Post-processing

ASR сървърът поддържа опционална LLM-базирана корекция на транскрибирания текст. Суровият изход от Canary-1B-v2 се изпраща към vLLM сървър (Gemma 3 12B), който коригира правопис, граматика и пунктуация.

Архитектура

Как работи

  1. ASR модулът транскрибира аудиото и получава суров текст
  2. Ако post-processing е включен (глобално или per-request), текстът се изпраща към vLLM
  3. vLLM изпълнява Gemma 3 12B модел с OpenAI-compatible API
  4. LLM-ът получава system prompt с инструкции за корекция и user message с текста
  5. Коригираният текст се връща в полето 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_tokens512Максимален брой генерирани токени
temperature0.1Ниска температура за детерминистичен изход
top_p1.0Без nucleus sampling ограничение
repetition_penalty1.1Леко наказание за повтаряне на токени

Конфигурация

Environment variables

ПроменливаПо подразбиранеОписание
POSTPROCESS_ENABLEDfalseГлобално включване на post-processing. Стойности: 1, true, yes
POSTPROCESS_URLhttp://llm:8000URL на vLLM сървъра (вътрешен Docker DNS)
POSTPROCESS_MODELgoogle/gemma-3-12b-itИме на модела за vLLM
POSTPROCESS_TIMEOUT5.0Timeout за LLM заявки в секунди

vLLM сървър конфигурация

vLLM сървърът се стартира с Docker Compose profile postprocess:

# Стартиране с post-processing
docker compose --profile postprocess up -d

vLLM параметри от docker-compose.yml:

ПараметърСтойностОписание
--dtypebfloat16Тип данни за по-ниска VRAM консумация
--enforce-eager--Изключва CUDA graphs за стабилност
--gpu-memory-utilization0.25Използва 25% от GPU VRAM (ASR заема останалото)
--max-model-len1024Максимална дължина на контекста
--max-num-seqs8Максимален брой паралелни последователности

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 модела