LLM-пайплайны и AI-сценарии на функциях
Разносите поиск контекста, модерацию, вызовы инструментов и суммаризацию по отдельным функциям — повторы, трассировки и контроль стоимости действуют на каждый шаг, а не на один раздутый промпт.
Обновлено: 2026-06-28
Кратко
Суть ответа
LLM-пайплайны и AI-сценарии на функциях. Каждый этап деплоится и логируется отдельно; асинхронные паузы между вызовами модели собирайте пайплайнами.
Когда подходит
- Потоки с несколькими моделями
- Передача человеку (human-in-the-loop)
- Долгое обогащение
На что обратить внимание
- Исследовательским ноутбукам не хватает надёжных графов, повторов и контроля стоимости, которые нужны AI-сценариям в продакшене.
Нагрузка и где ломается
Почему LLM-сценарий из одного промпта сложно повторить
Один мегапромпт не может повторить поиск контекста, не запуская заново модерацию и вызовы инструментов, — LLM-пайплайнам нужны границы.
Стоимость раздувается, когда каждая ветка заново эмбеддит тот же контекст вместо кэширования структурированного результата поиска.
Когда простых рецептов недостаточно
Почему ноутбуки не заменяют LLM-пайплайны
Исследовательским ноутбукам не хватает надёжных графов, повторов и контроля стоимости, которые нужны AI-сценариям в продакшене.
Как помогает Inquir
Этапы LLM-работы как функции с отдельным деплоем
Каждый этап деплоится и логируется отдельно; асинхронные паузы между вызовами модели собирайте пайплайнами.
Вызовы инструментов остаются HTTP-функциями с явной авторизацией — так же, как у AI-агентов на функциях в других сценариях.
Что вы получаете
Какие этапы LLM-пайплайна разделять
Поиск контекста (retrieve)
Изолируйте вызовы эмбеддингов и поиска, чтобы retrieval можно было повторять и кэшировать независимо.
Модерация (moderate)
Прогоняйте модерацию первой, чтобы небезопасные запросы отсекались быстро — до оплаты дорогой генерации.
Вызов инструментов (tools)
Держите вызовы инструментов за строгой валидацией входа и явной авторизацией — как любой продакшен-эндпоинт.
Суммаризация (summarize)
Сжимайте результат для хранения или показа пользователю отдельным финальным шагом с собственными повторами.
Что дальше
Как разбить LLM-работу на этапы с пайплайнами Inquir
Нарисовать поток данных
Назовите входы и выходы каждого этапа до написания кода.
Кодифицировать
Реализуйте каждый этап функцией или шагом пайплайна с собственными логами.
Мерить стоимость
Считайте токены и время выполнения по каждому этапу.
Пример кода
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-сценарий на этапы?
Повторы, учёт стоимости и отладка становятся проще, когда поиск контекста, модерация, вызовы инструментов и суммаризация — отдельные шаги с собственными логами.
Стриминг токенов конечным пользователям?
Держите видимый пользователю стриминг на границе; внутренние этапы могут работать в режиме запрос/ответ — так проще обрабатывать сбои и повторные проигрывания.
Как контролировать стоимость по этапам?
Меряйте токены и время выполнения по каждому этапу в наблюдаемости; ограничивайте дорогие шаги бюджетами и обрывайте пайплайн, когда модерация не пройдена.