АРХИТЕКТУРА
КОРПОРАТИВНЫХ LLM
Четыре домена ИИ-архитектуры
Извлечение структурированных данных
"entity": "Order",
"id": 101,
"status": "confirmed",
"items": ["A", "B"]
}
Оркестрация клиентской поддержки
Продуктивность разработчика
$ help git commit
project/
├── src/
│ ├── components/
│ ├── utils/
│ └── styles/
├── index.js
└── package.json
Мультиагентные системы
Иерархия ограничений архитектора
Задержка
Снижается через параллелизацию и кэширование
Точность
Снижается через структурированные промежуточные представления и Few-Shot промпты
Стоимость
Снижается через Batch API и очистку контекста
Комплаенс
Обеспечивается через перехваты на уровне приложения (не промптами)
Маршрутизация по стоимости и SLA
(< 30 мин SLA)
Messages API
отчёты
очередь
| Тип | Решение |
|---|---|
| Срочные исключения | Real-time Messages API (высокая стоимость, мгновенная задержка) |
| Стандартные рабочие процессы | Message Batches API (экономия 50%) |
| Непрерывное поступление (SLA 30 часов) |
Отправка батчей каждые 6 часов с документами из этого окна |
Проектирование устойчивых схем
Непрерывное расширение enum при появлении граничных случаев.
// Хрупкая схема с ограниченным enum
{
"type": "object",
"properties": {
"property_type": {
"type": "string",
"enum": ["house", "apartment",
"condo", "townhouse"]
}
},
"required": ["property_type"]
}
// Ошибка валидации:
// "property_type": "studio"
// "property_type": "converted warehouse"
Добавьте значение «other» в enum вместе с полем-детализатором.
// Устойчивая схема с Catch-All
{
"type": "object",
"properties": {
"property_type": {
"type": "string",
"enum": ["house", "apartment",
"condo", "townhouse",
"other"]
},
"property_type_detail": {
"type": "string",
"description": "Детали для 'other'"
}
},
"required": ["property_type"]
}
Правило эволюции данных
Для изменяемых документов переработайте схему так, чтобы поля хранили несколько значений — каждое с источником и датой вступления в силу — вместо перезаписи оригинала.
Обеспечение математической согласованности
Пример: счёт-фактура
Решение: избыточность в схеме
{
"invoice_id": "12345",
"line_items": [
{ "description": "Item 1", "amount": 120.50 },
{ "description": "Item 2", "amount": 85.00 },
{ "description": "Item 3", "amount": 4.525 }
],
"calculated_total": 210.025, // Сумма модели
"stated_total": 260.00, // Из документа
"currency": "USD"
}
calculated_total != stated_total.
Нормализация и обработка null
Базовый промпт
Ввод: Извлеки количество участников и материалы.
{
"attendee_count": "500",
// ↑ Правдоподобная галлюцинация
"materials": "cotton blend"
// ↑ Несогласованный формат
}
Инструкция обработки null
Проблема: Когда поля допускают null, модели могут выдумать правдоподобные данные, если не получат явных инструкций.
Добавьте явную инструкцию: возвращать null, если данных нет в тексте.
{
"attendee_count": null, // ✓ Корректно
"materials": "cotton blend"
}
Нормализация формата
Проблема: «cotton blend» vs «Cotton/Polyester mix» — несогласованные форматы.
Предоставьте 2–3 полных примера ввод-вывод со стандартизированными форматами. Не полагайтесь только на temperature 0.
{
"attendee_count": null, ✓
"materials": "Cotton Blend"
// ↑ Стандартизировано
}
Пределы автоматических повторов
об ошибке → повтор
Исправление вложенных объектов vs плоских массивов. Разрешение строк с локально-зависимым форматированием.
Калибровка Human-in-the-Loop
Требование
Автоматизировать извлечения с уверенностью модели >90%.
Реализация
Модель выдаёт field-level confidence scores. Привязывайте эту деталь к решению по снижению семантических ошибок.
Нулевая толерантность к нарушениям комплаенса
уровне
приложения
Архитектурный стандарт
Реализуйте перехват на уровне приложения для вызовов инструментов.
Когда сумма операции превышает порог — блокируйте на стороне сервера и запускайте эскалацию.
Дискреция модели устраняется.
Возобновление асинхронных сессий
Ходы 1–32 (4 часа назад)
Асинхронная пауза
Программный фильтр
Ход 33 (возобновление)
tool_result-сообщения. Оставьте только ходы человека/ассистента, чтобы агент был вынужден заново запросить данные при возобновлении. Это гарантирует, что возвращающиеся клиенты всегда получают свежую, актуальную информацию.
Очистка контекста инструментов
lookup_order заполняют контекстное окно подробными данными о доставке и оплате, когда нужен только статус возврата.Сырой ответ API (40+ полей)
"shipping_address": {...},
"payment_method": {...},
"tracking_history": [...],
"order_total": ...,
"order_cost": ...,
"payment_history": [...],
"user_preferences": null,
...
Очищенный контекст
"items": [...],
"purchase_date": ...,
"return_window": ...,
"status": ...
Паттерн: фильтрация на стороне приложения
Извлекайте только релевантные поля (товары, дата покупки, окно возврата, статус) из каждого ответа заказа, удаляя избыточные подробности до передачи в диалог. Эта стратегия соответствует управлению множественными объёмными ответами инструментов в сессии поддержки.
Корректная обработка ошибок инструментов
{
"isError": true,
"errorCategory": "transient",
"isRetryable": true
}
isError: true.
Передача при эскалации
«Хочу оператора СЕЙЧАС.»
↓Выполнить немедленно.
Не запрашивать уточнений.
Сложный вопрос по политике
↓(get_customer)
Сначала убедитесь, что
вызваны инструменты контекста.
Полезная нагрузка: структурированное резюме
Не передавайте сырые стенограммы. Передайте структурированное резюме: ID клиента, причина, сумма, рекомендованное действие.
{
"customer_id": "CUST-847392",
"root_cause": "Дублирование списаний из-за таймаута шлюза.",
"amount": "847.00 USD",
"recommended_action": "Одобрить возврат 847.00 USD и уведомить клиента."
}
Сжатие длинных сессий
решённых вопросов
проблема
Специфичность MCP-инструментов
$ Agent execution...
Агент использует встроенный Grep для поиска импортов.
│
└→ {name: analyze_dependencies}
$ Agent execution...
Агент использует кастомный инструмент для зависимостей.
├→ - list_imports
├→ - resolve_transitive_deps
└→ - detect_circular_deps
Решение
Разбейте широкие инструменты на узкоспециализированные. Улучшите описания MCP-инструментов, чтобы явно указывать возможности, ожидаемые выходы и когда предпочитать их перед манипуляцией текстом. Это аналогично переходу на кастомные инструменты рефакторинга вместо стандартных Bash/sed.
Направленное исследование кодовой базы
Чтение всех 15 файлов последовательно → переполнение контекстного окна нерелевантными данными.
Процесс динамического исследования
и базовых интерфейсов
реализаций
подзадач по находкам
Стратегия: начинай широко, затем уточняй
Сначала прочти CLAUDE.md/README, затем спроси инженера о приоритетных файлах.
Пусть агент динамически генерирует подзадачи на основе того, что находит на каждом шаге.
Ветвление реальности
анализ
Ветка A: Выделение микросервиса
ядро логики
API-интерфейс
микросервис
Ветка B: Рефакторинг на месте
методы
поток данных
аутентификации
Команда
Используйте fork_session для создания двух отдельных веток из базового анализа. Это позволяет независимое, глубокое исследование A/B-сценариев без контаминации контекста.
Паттерн «Черновик» (Scratchpad)
Агент читает исходные файлы
📝 Scratchpad.md
Ключевые находки:
- Структура модуля X
- API-эндпоинт Y
- Решение: использовать паттерн Z
Архитектурная карта:
...
Принятые решения:
...
→ Постоянная ссылка для последующих вопросов
Возобновление в динамичных средах
Стенограммы сессии (вчера)
Git Diff (ночные мержи)
PR коллеги: переименование утилитарных функций в 3 файлах.
Возобновлённая сессия (сегодня)
Действие
Возобновите сессию из прежней стенограммы, но явно сообщите агенту, какие конкретно файлы или функции изменились, для целенаправленного перечитывания. Не форсируйте полное перечитывание и не делайте вид, что ничего не изменилось.
resume_session --update_context={files:['File C', 'File D', 'File E'], changes:'renamed utility functions'}
Архитектура общей памяти
Агент веб-поиска
векторное хранилище
Агент анализа документов
(семантический поиск)
Принудительный порядок выполнения
{
"model": "claude-3-opus-20240229",
"max_tokens": 1024,
"messages": [
{"role": "user", "content": "Извлеки метаданные из этой статьи и найди её DOI."}
],
"tools": [
{"name": "extract_metadata", "description": "..."},
{"name": "lookup_citations", "description": "..."}
],
"tool_choice": {"type": "tool", "name": "extract_metadata"}
}
Принуждение
Не надейтесь на «уговаривание» промптом. Используйте ограничения API. Установите tool_choice для первого API-вызова, чтобы гарантировать выполнение конвейера в нужном порядке. Это гарантирует, что структурированное извлечение метаданных происходит до любого поиска DOI или обогащения.
Структурированные промежуточные представления
(Structured JSON)
(Prose Summaries)
(Structured Lists)
форматов
промежуточное представление
"claim": "...",
"evidence": "...",
"source": "...",
"confidence": ...
}
(Executive Briefings)
Параллелизация и кэширование
Проблема: Последовательная обработка каждого прецедента в сложном юридическом деле занимает более 3 минут, создавая неприемлемую задержку.
+ кэш
T0 → T+30с
Параллелизм подагентов
При обработке независимых данных (например, 12 юридических прецедентов) координатор должен порождать параллельные подагенты, каждый обрабатывает подмножество, затем агрегация результатов.
Кэширование промптов
Когда итоговые сводки постоянно занимают 40+ секунд, передавая 80K+ токенов накопленных находок, включите кэширование промптов на подагенте синтеза для радикального снижения накладных расходов.
Целеориентированное делегирование
Подагент веб-поиска
→ Шаг 2: Прочти Y.
→ Шаг 3: Извлеки Z.
Негибко, не адаптируется
Подагент веб-поиска
• Критерий: Актуальность
Самостоятельная стратегия
Подход архитектора
Указывайте цели исследования и критерии качества, а не процедурные шаги. Пусть специализированный подагент сам определит стратегию поиска. Держите интерфейсы инструментов универсальными, но добавляйте enum-параметры (например, analysis_type: extraction | summarization) для направления поведения.
Справочная матрица архитектора
| Извлечение данных | Клиентская поддержка | Продуктивность разработчика | Мультиагентные системы | |
|---|---|---|---|---|
| Раздувание токенов | Фильтрация устаревших результатов | Scratchpad-файл | Общее векторное хранилище | |
| Задержка | Batch-маршрутизация | Параллелизация и кэширование | ||
| Комплаенс / Контроль | Перехваты на уровне приложения | Принудительный tool_choice | ||
| Точность | Избыточность в схеме | Гранулярные MCP-инструменты | Структурированные промежуточные представления |
Чертёж продакшн-архитектуры
паттернов
Строгая типизация в середине.
Слой выполнения
Гранулярные инструменты
Перехваты приложения
Агрегация результатов
Форматирование
Доставка
Управление состоянием (Очистка + Общий вектор)
(pruning)
хранилище (data)
💾 Управление контекстным окном
Общая память, поддерживающая жизненный цикл