AI System Design
Middle+ в AI Team Plata. Инсайд раунда: eval-ы и выбор метрик. Формат 45 мин на доске публично не подтверждён — готовь generic + каре / документы / HR.
Один экран — говорить это
Не читать абзацами. Если время вылетело — этот блок важнее всего остального.
Первые 4 минуты
Не рисовать боксы до этого.
Success каре
Offline: recall@k по chunk_id, faithfulness, «цифры только из tool» (код), handoff precision/recall.
Online: resolution без вранья, recontact 72ч, эскалация, $/диалог, p95, PII-leak = 0.
Не CSAT первым. Не «средний quality 4.2». Containment ≠ качество.
Как строю eval
- 50–100 трейсов, первый важный фейл, частоты.
- На топ-фейл — бинарный тест, не helpfulness.
- Code-check если можно; судья — один вопрос, pass/fail.
- Судью меряю TPR/TNR против человека на holdout. Accuracy не использую.
- A/B только когда офлайн не различает. 5–10% трафика, kill switch.
Квадрант дыры
Пайплайн
v0: FAQ + статус. Не свободный ReAct на все API карты.
RAG vs FT vs agent
Факты живые → RAG. Форма/тон стабильны → FT. Действие в системе → workflow. Agent — только если ветки нельзя нарисовать заранее.
Якоря с CV
- Kontur: schema linking + few-shot retrieval + generate/fix + vote. Метрика — SQL exec / эталон, не «красивый SQL».
- Карты: кластер → few-shot бриф → генерация. Это prompt construction.
- Magnit: одна жёсткая метрика, честный A/B. Поэтому офлайн-eval для промптов, онлайн — редко.
Пробелы одной фразой
Ragas в проде не крутил — контуры свои. OCR/voice не деплоил — спроектирую + field F1 / WER на ваших данных. Go не основной.
С чего начнёшь в понедельник
Неделя
Цель не «посмотреть 20 часов». Цель: на доске провести 45 минут и в каждом слое сказать метрику. После каждого видео закрой вкладку и расскажи вслух 3 минуты.
Плейлист
Ядро — не пропускать
-
0152 мин
Hamel — AI Evaluations Clearly Explained
100 трейсов, spreadsheet, binary, почему accuracy судьи врёт, TPR/TNR - 02читать
- 03читать
-
04~2 ч
DL.AI Building and Evaluating Advanced RAG
Triad: context relevance / groundedness / answer relevance. Слой, который в JD назван Ragas -
0575 мин
Chip Huyen × Pragmatic Engineer
AI Eng vs ML Eng, start simple, RAG vs FT, eval — самая тяжёлая часть - 060–34:44
-
07читать
Anthropic — Building Effective Agents
Workflow ≠ agent. Routing, chaining, vote, orchestrator, evaluator-optimizer -
0827 мин
Aishwarya — Agent AI System Design
Routing, tool contracts, memory vs state, trace evals, approval gates
Если день 4–5 свободен
- 09~2.5 ч
- 10~1 ч
- 1120 мин
- 12читать
- 131:10–1:23
- 14утром
Не на эту неделю
Maven AI Evals — лучший курс, 4 недели, платный.
Mastering LLMs — 40+ часов, справочник.
«Generative AI Full Course 2026», плейлисты на 42 серии — шум.
Design YouTube / Uber — другой раунд.
GraphRAG как дефолт FAQ банка — scope creep.
Transformer internals / scaling laws — не этот раунд.
Как вести 45 минут
Самый частый фейл — рисовать боксы до требований.
- Clarify 4 мин. Кто юзер? Источники? PII / резидентность? p95? Vendor API? Что хуже: отказ или выдуманный лимит?
- Success 3 мин. Offline + online. Без этого это чат, не система.
- Estimate 3 мин. QPS, токены, $, корпус, свежесть.
- Sketch 8 мин. Два пайплайна: ingestion и query. Гарды до и после LLM.
- Deep dive 15 мин. Один слой — у тебя eval + retrieval. Не 12 квадратиков.
- Failures 7 мин. Пустой retrieval, отравленный чанк, stampede, 500 провайдера, PII, регрессия промпта.
- Evolve 3 мин. v0 / v1 / что сознательно не берёшь.
Evals — главный сигнал
Три уровня (Hamel)
| Уровень | Что | Когда |
|---|---|---|
| L1 code | JSON-схема, regex суммы, не вернул чужой account_id, SQL exec | Детерминированные инварианты |
| L2 human + judge | Трейсы, потом узкий судья на один failure mode | Открытый текст, тон, опора на политику |
| L3 A/B | Resolution, эскалация, CSAT, $/диалог | Когда офлайн уже не врёт |
Error analysis раньше метрик
- Сэмпл 50–100 трейсов.
- На каждый — первый важный фейл, не корневая причина.
- Сгруппировать, посчитать частоты.
- Eval на топ-3 повторных фейла, не на helpfulness.
Off-the-shelf helpfulness / coherence / hallucination score — чужой промпт под пятью слоями. Он не ловит ваш каре.
LLM-as-judge, чтобы не стыдно
- Один судья = один вопрос, binary pass/fail, не 1–5.
- 30–80 человеческих меток.
- Мерить TPR и TNR, не accuracy. Судья «всегда ок» имеет 95% accuracy на 5% ошибках и ловит ноль фейлов.
- Few-shot только из train, holdout не трогать.
- Сильная модель на судью, дешёвая в прод — если задача позволяет.
- Перекалибровка: criteria drift — критерии рождаются, когда смотришь новые выходы.
Три грейдера (Anthropic)
| Грейдер | Примеры | Сила | Слабость |
|---|---|---|---|
| Code | schema, regex, SQL exec, tool-call, сумма = OCR-поле | дёшево, воспроизводимо | ломается на валидных вариациях |
| Model | rubric, groundedness, тон | нюанс | нужна калибровка |
| Human | spot-check, новые фейлы | ground truth | дорого, drift |
У агента transcript (что сказал) ≠ outcome (создался ли тикет). pass@k — достаточно одного успеха (SQL). pass^k — нужна стабильность (лимит карты).
Метрики — какой рычаг чинит какую цифру
Не заучи все RAGAS. Заучи выбор.
Retrieval
| Метрика | Вопрос | Gold | Если плохо |
|---|---|---|---|
| Recall@k / Context Recall | Нужный факт в top-k? | да | chunking, hybrid, k, rewrite |
| Precision@k | Много ли мусора? | да | rerank, metadata, меньший k |
| MRR / nDCG | Нужный чанк высоко? | да | rerank |
| ID-based recall | Золотой doc_id в retrieved? | да, лучший дешёвый тест | ingestion / ACL / версия |
В банке логируй chunk_id и мерь ID-recall, не только LLM-judge.
Generation
| Метрика | Вопрос | Суть |
|---|---|---|
| Faithfulness | Claims сидят в контексте? | supported / all claims |
| Answer relevancy | Ответ про вопрос? | reverse-questions → cosine |
| Citation accuracy | Ссылка на тот чанк? | code + человек |
| Task success | Тикет / SQL / поле | бизнес, не RAGAS |
Онлайн каре
- Resolution без эскалации
- Escalation quality (вовремя? с контекстом?)
- Recontact 24–72 ч
- $ / диалог, p95, tokens
- PII leak, запретные темы (инвест-совет, чужой баланс)
- OCR: field-level F1, % авто, false-accept на сумме
Не первым
BLEU / ROUGE на чате. Cosine(answer, question) как «качество». LMSYS / MMLU. Один средний quality 4.2.
RAG за 8 минут
Два пайплайна, не один ящик «vector DB».
Ingestion: source of truth → ACL → чистка → chunk → embed + BM25 → version/doc_id → index.
Query: гарды (PII, injection) → rewrite только если eval доказал → hybrid → metadata filter → rerank → промпт с цитатами → generate T=0 → выходные гарды → лог.
- Нет chunk_id в top-k → retrieval.
- Chunk был, ответ врёт → generation / промпт / нет отказа.
- Ответ верный, юзер недоволен → продукт / тон / не тот скилл.
Hybrid — дефолт: BM25 ловит номера договоров и лимиты, dense — перефразы.
RAG не нужен на классификацию интента, извлечение 4 полей, перефраз.
RAG = факты. Fine-tune = форма. Tool/agent = действие.
Exact cache на (prompt, system, model). Semantic cache в банке опасен: «дней отпуска» ≈ «дней больничного». Prefix-cache провайдера ортогонален.
Agents — когда да
Workflow = заранее прошитый граф. Agent = модель сама выбирает шаги. Сначала простой RAG, усложняешь когда eval показывает потолок.
| Паттерн | Когда | Plata |
|---|---|---|
| Chaining | Шаги фиксированы | OCR → extract → verify → write |
| Routing | Разные классы | FAQ / транзакция / человек |
| Parallel + vote | Нужна уверенность | 2 модели на сумму в документе |
| Orchestrator-workers | Подзадачи неизвестны | разбери тред из 40 писем HR |
| Evaluator-optimizer | Есть критерий, итерация помогает | починить SQL / переписать отказ |
| Agent loop | Открытый тул-юз | редко в v0 каре |
CompleteTravel — нормальный агентный кейс. Каре банка — граф «интент → RAG / tool / human». Approval на деньги и PII.
Режь агента: router accuracy, tool F1, trajectory, outcome, cost / turns / latency.
Модель, стоимость, A/B
Не «возьму GPT-5».
- Golden set 50–200 ваших примеров.
- 2–4 модели одним промптом.
- Смотреть где ломается (поле, отказ, формат, ES), не средний балл.
- Cost × quality. Дешёвая на роутинг, дорогая на сложный ответ и на судью.
- Потом узкий онлайн A/B.
Streaming для UX. Факт / сумма — дождаться проверки. Semantic cache — только если измерил false-hit.
Лог: request_id, prompt_version, chunk_ids, model, tokens, latency, tool_calls, guard, handoff, cost. PII маскировать до провайдера и до лога.
Три сценария с доски
Это не подтверждённые вопросы. Это JD: chatbot, voice/STT, HR, OCR.
A. Customer-care — вести этот
Clarify: политики + статус карты? ES/EN? Можно ли баланс?
Ingest политик с версией → router FAQ / account-tool / human → hybrid RAG + ACL → generate + cite → post-guard (цифры только из tool) → handoff с саммари.
Eval v0: ID-recall политик, faithfulness FAQ, «цифры из tool» кодом, handoff P/R; online resolution, recontact, escalation, $.
Отказ: «не знаю, перевожу». Выдуманный лимит хуже эскалации.
Связка: Kontur = retrieval + generate + fix + vote. Карты = few-shot бриф. Magnit = одна метрика.
B. Документы / OCR — честный пробел
Не деплоил. Дальше: файл → тип → quality → OCR → layout → entities → сверка страниц и заявки → confidence → HITL → structured store. RAG уже по полям, не по картинке.
Eval: field F1, exact match на деньгах, false-accept, % straight-through. Vote двух моделей на сумме. После OCR это тот же linking, что schema linking в Text-to-SQL.
C. Voice / STT
Аудио → STT → тот же текстовый пайплайн → TTS. Eval STT = WER на их звонках MX-ES, не LibriSpeech. Не строить отдельную голосовую магию.
D. HR
FAQ + документы. Semantic cache опасен. Сменили «28 дней» на «30» — invalidate топик, как в turing-test-drive.
Качество плохое — 60 секунд
- 20 трейсов, не дашборд.
- Каждый: retrieval miss / generation lie / wrong skill / policy / UX.
- Частоты.
- Retrieval → chunk_id, не средний faithfulness.
- Фикс одного рычага, прогон golden set.
- Только потом онлайн.
Пробелы — не прятать
| Тема | Говори |
|---|---|
| Ragas | Инструмент знаю, контуры свои (execution accuracy, WAPE, ручной разбор). Ragas/MLflow — как стандарт команды. |
| OCR | Не деплоил. Спроектирую пайплайн и eval по полям. |
| Voice | Нет. Переиспользую текстовый стек, WER на ваших звонках. |
| Go | Не основной. Прочитаю сервис, напишу простой хендлер. |
| Fine-tune OSS | Бонус JD, не основной трек. |
Мок, дни 6–7
Таймер 45 минут. Бумага. Потом себе:
- Какая одна первичная метрика и почему не CSAT?
- Как поймёшь, что виноват retrieval, а не LLM?
- Что в v0 сознательно не берёшь?
- Что логируешь, что маскируешь?
- Как остановишь плохой промпт в проде?
- Где человек и какая у него метрика?
День 6 — сценарий A. День 7 — B, потом эта карточка вслух целиком.