LLM-пайплайны и serverless AI-workflow
Разносите поиск контекста, модерацию, вызовы инструментов и суммаризацию по отдельным функциям — ретраи, трассировки и контроль стоимости действуют на каждый шаг, а не на один огромный промпт.
Обновлено: 2026-06-28
Кратко
Суть ответа
LLM-пайплайны и serverless AI-workflow. Каждый этап деплоится и логируется отдельно; асинхронные разрывы между вызовами модели закрывают пайплайны.
Когда подходит и когда нет
- Мульти-модельные потоки
- Human-in-the-loop
- Долгое обогащение
На что обратить внимание
- Исследовательские ноутбуки не дают устойчивых графов, ретраев и контроля стоимости, которые нужны продакшен-AI-workflow.
Ситуация: нагрузка и где обычно ломается
Почему один большой промпт сложно ретраить
Один мегапромпт нельзя ретраить по частям: повтор поиска заново запускает модерацию и вызовы инструментов — LLM-пайплайну нужны границы.
Стоимость раздувается, когда каждая ветка заново эмбеддит тот же контекст вместо кэширования структурированного результата поиска.
Когда простых рецептов недостаточно
Почему ноутбуки не заменяют LLM-пайплайны
Исследовательские ноутбуки не дают устойчивых графов, ретраев и контроля стоимости, которые нужны продакшен-AI-workflow.
Как Inquir помогает в этом сценарии
Этапы LLM-работы как деплоящиеся функции
Каждый этап деплоится и логируется отдельно; асинхронные разрывы между вызовами модели закрывают пайплайны.
Вызовы инструментов остаются HTTP-функциями с явной аутентификацией — так же, как в остальных агентских сценариях.
Что вы получаете на платформе
Какие этапы LLM-пайплайна выносить отдельно
Поиск контекста (retrieve)
Изолируйте вызовы эмбеддингов и поиска, чтобы retrieval можно было ретраить и кэшировать независимо.
Модерация (moderate)
Прогоняйте модерацию первой, чтобы небезопасные запросы отсекались до оплаты дорогой генерации.
Вызов инструментов (tools)
Держите вызовы инструментов за строгой валидацией входа и явной аутентификацией — как любой продакшен-эндпоинт.
Суммаризация (summarize)
Сжимайте результат для хранения или показа пользователю отдельным шагом с собственными ретраями.
Что сделать дальше, по шагам
Как вести LLM-работу по шагам с пайплайнами Inquir
Нарисовать dataflow
Назовите входы и выходы каждого этапа до написания кода.
Кодифицировать
Реализуйте каждый этап функцией или шагом пайплайна с собственными логами.
Мерить стоимость
Считайте токены и время выполнения по каждому шагу.
Пример кода
LLM-пайплайн анализа документов
Графовый пайплайн связывает триггер с цепочкой узлов-функций рёбрами — тот же формат, что в консоли и документации. Каждый этап — отдельная функция: повтор поиска без повтора классификации, учёт токенов по шагу, трассировки при сбое одного вызова модели.
{ "schemaVersion": 1, "nodes": [ { "id": "t1", "kind": "manualTrigger", "name": "Start", "position": { "x": 0, "y": 0 }, "config": {} }, { "id": "extract", "kind": "lambda", "name": "Extract text", "position": { "x": 220, "y": 0 }, "config": { "functionId": "extract-text", "onError": "failPipeline" } }, { "id": "classify", "kind": "lambda", "name": "Classify document", "position": { "x": 440, "y": 0 }, "config": { "functionId": "classify", "onError": "failPipeline" } }, { "id": "retrieve", "kind": "lambda", "name": "Retrieve context", "position": { "x": 660, "y": 0 }, "config": { "functionId": "retrieve", "onError": "failPipeline" } }, { "id": "summarize", "kind": "lambda", "name": "Summarize", "position": { "x": 880, "y": 0 }, "config": { "functionId": "summarize", "onError": "failPipeline" } }, { "id": "store", "kind": "lambda", "name": "Store and notify", "position": { "x": 1100, "y": 0 }, "config": { "functionId": "store-and-notify", "onError": "failPipeline" } } ], "edges": [ { "id": "e1", "sourceNodeId": "t1", "targetNodeId": "extract", "sourceHandle": "default" }, { "id": "e2", "sourceNodeId": "extract", "targetNodeId": "classify", "sourceHandle": "success" }, { "id": "e3", "sourceNodeId": "classify", "targetNodeId": "retrieve", "sourceHandle": "success" }, { "id": "e4", "sourceNodeId": "retrieve", "targetNodeId": "summarize", "sourceHandle": "success" }, { "id": "e5", "sourceNodeId": "summarize", "targetNodeId": "store", "sourceHandle": "success" } ] }
export async function handler(event) { const { documentUrl } = event; // trigger body flows into the first node const text = await extractText(documentUrl); // PDF/HTML/DOCX → plain text return { text, charCount: text.length }; }
export async function handler(event) { const { text, category } = event.previousOutput ?? {}; const related = await vectorSearch(text, { filter: { category } }); return { ...event.previousOutput, related }; }
Когда подходит и когда нет
Когда пайплайны оправданы
Когда это уместно
- Мульти-модельные потоки
- Human-in-the-loop
- Долгое обогащение
Когда лучше выбрать другое
- Одноразовые демо с одним промптом
Вопросы и ответы
Вопросы и ответы
Зачем дробить LLM-workflow на этапы?
Ретраи, учёт стоимости и отладка становятся проще, когда поиск, модерация, инструменты и суммаризация — отдельные шаги с собственными логами.
Стриминг токенов пользователю?
Держите видимый пользователю стриминг на границе, у API-шлюза; внутренние шаги чаще обмениваются обычным JSON запросом/ответом — так проще обрабатывать сбои и повторные проигрывания.
Как контролировать стоимость по этапам?
Меряйте токены и время выполнения по каждому шагу в наблюдаемости; ограничивайте дорогие шаги бюджетами и выходите раньше при провале модерации.