Technical Appendix

Applied LLM engineering,
не ML-research

Честное описание AI-слоя проекта «Молния» для технического лида и AI-инженера. Что в production, что в прототипе, чего нет намеренно.

← Бизнес-кейс Позиционирование: LLM integrator + domain guardrails
LLM stack

Какая модель и почему не fine-tune

Production · webhook

DeepSeek Chat API

Основной клиент Avito-бота в webhook_server.py: OpenAI-compatible API, temperature ~0.3 для structured extract.

  • Приоритет: DEEPSEEK_API_KEY
  • Fallback: Gemini (GEMINI_API_KEY)
  • Knowledge: knowledge_base_combined.json (~1065 QA-пар)
Production · standalone

Sinergiya / alt deploy

Отдельный инстанс avito_bot_standalone/bot_server.py — та же логика клиентов; в env также GigaChat (GIGACHAT_*).

  • DeepSeek → Gemini fallback (как в основном деплое)
  • GigaChat — опционально по credentials клиента
Fine-tuning · нет

Почему не дообучали модель

  • Source of truth — БД cars, PRODUCT_ASSORTMENT, не веса модели
  • Цены и условия меняются — fine-tune устаревает быстрее промпта + inventory injection
  • Compliance: выкуп ≠ аренда ≠ вакансия — проще через ITEM_ROLE_MAP и post-rules
  • ROI: prompt engineering + guardrails закрыли задачу без GPU-цикла
Knowledge layer

Prod ≠ vector RAG

Слово «RAG» в маркетинге часто вводит в заблуждение. Ниже — два разных слоя.

Production (Avito webhook) Prototype (rag_system.py)
Retrieval _find_relevant_qa() — keyword overlap, top-5 Cosine similarity + hybrid semantic/keyword
Embeddings paraphrase-multilingual-MiniLM-L12-v2
Index JSON QA in memory rag_index/embeddings.npy + pickle
Vector DB Нет NumPy (не Pinecone / Qdrant / FAISS prod)
Chunking 1 QA-пара = 1 документ То же; overlap нет
Re-ranking Нет Нет
В prod webhook Да Нет (только demo / example scripts)
Prod retrieval

Keyword scoring + domain boosts

В deepseek_client.py / gemini_client.py:

  • Intersection слов вопроса и QA
  • Буст ×8 для темы «коробка / АКПП»
  • Буст ×6 для «ГБО / пропан / топливо»
  • Top-5 примеров → в user prompt как few-shot context
R&D prototype

Vector RAG module

Модули rag_embedder.py, rag_retriever.py, rag_system.py:

  • Sentence-transformers MiniLM (multilingual)
  • Semantic + keyword hybrid (weights 0.7 / 0.3)
  • RAGEnhancedClient — обёртка для постепенного внедрения
  • Не подключено к webhook_server на момент кейса
# Production path (упрощённо)
webhook → get_chat_context(DB) + item_role_hint + car_inventory(BD)
       → DeepSeekClient.ask()
       → _find_relevant_qa(keyword top-5) + system_prompt + rules
       → Avito Messenger API send
Domain guardrails

Как снижаем галлюцинации

Не через RAGAS, а через архитектуру: модель не единственный source of truth.

Avito item_id ITEM_ROLE_MAP _ROLE_HINTS get_available_cars_summary() LLM

Цены только из БД

car_inventory в промпт из БД с TTL-кешем. RAG и system prompt не содержат таблиц цен (BOT_AND_RAG_PROGRAMMER_INSTRUCTIONS.md).

Сценарий объявления

[СЦЕНАРИЙ ОБЪЯВЛЕНИЯ: …] в начале chat_context — выкуп / такси / спец-тариф не смешиваются.

System rules (~17 пунктов)

Запрет служебных меток в ответе, лимит 300 км, один уточняющий вопрос, не смешивать продукты.

Post-processing

Strip internal prompts, greeting dedup if history exists, outreach limits (max 2 pings без ответа).

Hallucination rate

Формально не считали (% factual errors). Операционный контроль — рассинхрон с менеджером и жалобы на условия. Roadmap: sample audit N=100 диалогов + чеклист factual accuracy по SKU.

Evaluation

Как мерили качество
(без BLEU / RAGAS)

Business proxy metrics

  • Latency: median ~3 с (bot) vs 24–606 с (human pre-bot)
  • Engagement: client reply within 7d after seller message
  • Visit funnel: office_visits + CRM attribution
  • Scripts: analyze_visit_month_ab.py, analyze_visit_attribution.py

Hybrid A/B · engagement (19.05–17.06)

  • Manager day: 41.1% reply 7d (n=666 outgoing)
  • Bot evening: 39.3% (n=1213)
  • Δ −1.8 п.п. — паритет, не «2× engagement»
  • Statistical significance: не считали (можно bootstrap)
Prod · equal-month A/B

Визиты: месяц 24/7 vs месяц гибрида (29,3 суток)

Источник: /opt/molnai/db.sqlite · отчёт docs/VISIT_MONTH_AB.md

Метрика Бот 24/7 (20.04–19.05) Гибрид (19.05–17.06)
office_visits (auto)6083 (все в bot window)
на 1000 входящих58.049.3
CRM bot-path2550
CRM human-path129 (back-office)14
Manager window (гибрид)0 auto · 7 human CRM · 759 чатов
Bot window, на 1000 входящих61.689.7 (сезон/трафик)

Вывод для eval: бот не побеждает менеджера по engagement, но создаёт отдельную воронку save_office_visit (306 записей, 100% bot-path). Дневной менеджер в эксперименте не компенсирует объём.

МетрикаИспользовали?Комментарий
BLEU / ROUGEНетНе релевантно для sales-диалога
RAGAS (faithfulness)НетRoadmap после vector RAG in prod
Retriever P/RНетKeyword retriever без gold labels
Human evalЧастичноРазбор чатов, категории в KB builder
Lead → deal CRНет (null в CRM TZ)Целевая метрика этапа 2
NPSНет
Infrastructure

Где хостится и масштаб

Deployment

  • VPS: /opt/molnai (основной), /opt/avito_bot2 (Sinergiya)
  • systemd services: molnai, avito-bot2
  • nginx reverse proxy + SSL (car74.ru)
  • Deploy: deploy/deploy.ps1, deploy_server.sh

Runtime

  • Flask webhook_server.py
  • Async message processing (webhook не блокируется LLM)
  • PostgreSQL / SQLite (env-dependent)
  • Не Kubernetes, не Kafka/RabbitMQ в prod

Throughput / latency

~3 с median — на реальном трафике Avito автопарка (десятки чатов, не load test). Архитектура рассчитана на десятки параллельных диалогов, не на 1000 RPS. Bottleneck — LLM API latency + sequential context build, не CPU кластера.

Roadmap

Следующий уровень для ML-лида

Planned

Vector RAG → production

Подключить RAGEnhancedClient к webhook path; A/B vs keyword-only.

Planned

Eval harness

Gold set 50–100 вопросов по SKU; RAGAS faithfulness + human spot-check.

Planned

CRM conversion

lead_to_deal, visit_to_deal by product_code — связка с выдачей авто.

Optional

Observability

Structured logging LLM calls, latency p95, error rate — без обязательного Prometheus/K8s.

Итог для собеседования

LLM integrator + guardrails

Не «мы обучили модель», а «мы построили контур, где LLM безопасно отвечает в домене с жёсткими правилами и бизнес-eval».

← Бизнес-кейс Обсудить проект