Честное описание AI-слоя проекта «Молния» для технического лида и AI-инженера. Что в production, что в прототипе, чего нет намеренно.
Основной клиент Avito-бота в webhook_server.py: OpenAI-compatible API, temperature ~0.3 для structured extract.
DEEPSEEK_API_KEYGEMINI_API_KEY)knowledge_base_combined.json (~1065 QA-пар)Отдельный инстанс avito_bot_standalone/bot_server.py — та же логика клиентов; в env также GigaChat (GIGACHAT_*).
cars, PRODUCT_ASSORTMENT, не веса моделиITEM_ROLE_MAP и post-rulesСлово «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) |
В deepseek_client.py / gemini_client.py:
Модули rag_embedder.py, rag_retriever.py, rag_system.py:
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
Не через RAGAS, а через архитектуру: модель не единственный source of truth.
car_inventory в промпт из БД с TTL-кешем. RAG и system prompt не содержат таблиц цен (BOT_AND_RAG_PROGRAMMER_INSTRUCTIONS.md).
[СЦЕНАРИЙ ОБЪЯВЛЕНИЯ: …] в начале chat_context — выкуп / такси / спец-тариф не смешиваются.
Запрет служебных меток в ответе, лимит 300 км, один уточняющий вопрос, не смешивать продукты.
Strip internal prompts, greeting dedup if history exists, outreach limits (max 2 pings без ответа).
Формально не считали (% factual errors). Операционный контроль — рассинхрон с менеджером и жалобы на условия. Roadmap: sample audit N=100 диалогов + чеклист factual accuracy по SKU.
office_visits + CRM attributionanalyze_visit_month_ab.py, analyze_visit_attribution.py
Источник: /opt/molnai/db.sqlite · отчёт docs/VISIT_MONTH_AB.md
| Метрика | Бот 24/7 (20.04–19.05) | Гибрид (19.05–17.06) |
|---|---|---|
| office_visits (auto) | 60 | 83 (все в bot window) |
| на 1000 входящих | 58.0 | 49.3 |
| CRM bot-path | 25 | 50 |
| CRM human-path | 129 (back-office) | 14 |
| Manager window (гибрид) | — | 0 auto · 7 human CRM · 759 чатов |
| Bot window, на 1000 входящих | 61.6 | 89.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 | Нет | — |
/opt/molnai (основной), /opt/avito_bot2 (Sinergiya)molnai, avito-bot2deploy/deploy.ps1, deploy_server.shwebhook_server.py~3 с median — на реальном трафике Avito автопарка (десятки чатов, не load test). Архитектура рассчитана на десятки параллельных диалогов, не на 1000 RPS. Bottleneck — LLM API latency + sequential context build, не CPU кластера.
Подключить RAGEnhancedClient к webhook path; A/B vs keyword-only.
Gold set 50–100 вопросов по SKU; RAGAS faithfulness + human spot-check.
lead_to_deal, visit_to_deal by product_code — связка с выдачей авто.
Structured logging LLM calls, latency p95, error rate — без обязательного Prometheus/K8s.
Не «мы обучили модель», а «мы построили контур, где LLM безопасно отвечает в домене с жёсткими правилами и бизнес-eval».