Files
samreshu_docs/architecture/decisions/005-llm-abstraction.md
Anton 99cd8ae727 docs: add full project documentation
- Architecture: overview, 7 ADR, tech stack
- Principles: code-style, git-workflow, security
- API contracts: auth, profile, tests, admin endpoints
- Database schema: tables, relationships, indexes
- LLM strategy: prompts, fallback, validation, Qwen 2.5 14B
- Onboarding: setup, Docker, .env template
- Progress: roadmap, changelog
- Agents: context, backend instructions

Made-with: Cursor
2026-03-04 12:07:17 +03:00

46 lines
2.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ADR-005: Абстракция LLM через LlmService
## Статус
Принято
## Контекст
Приложение использует LLM для генерации вопросов, проверки ответов и рекомендаций. Нужна возможность менять провайдера без изменения бизнес-логики.
## Решение
Весь доступ к LLM только через `LlmService`. Конфигурация провайдера — через переменные окружения:
```
LLM_BASE_URL=http://localhost:11434/v1 # Ollama (runtime для backend)
LLM_MODEL=qwen2.5:14b
LLM_API_KEY= # пустой для локального
LLM_TIMEOUT_MS=15000
LLM_MAX_RETRIES=1
```
### Стратегия провайдеров
1. **Dev/test** — локальный LLM (Ollama, LM Studio, vLLM) с OpenAI-совместимым API
2. **Production** — облачный API (OpenAI, Anthropic и др.)
3. Переключение — замена переменных в `.env`, код приложения не меняется
### Интерфейс LlmService
- `generateQuestions(stack, level, count, type)` → structured JSON
- `verifyAnswer(question, userAnswer)` → boolean + explanation
- `getHint(question)` → string
- `getRecommendations(weakTopics)` → string[]
### Fallback
Если LLM недоступен или таймаут — берём вопросы из `question_bank` (предварительно наполненного через тот же LLM и провалидированного вручную).
## Последствия
- Бизнес-код не зависит от конкретного провайдера
- Замена LLM — изменение одного `.env` файла
- Нужен минимальный банк вопросов для fallback до запуска
- Все ответы LLM валидируются по JSON-схеме перед использованием