Сценарий

LLM-пайплайны и serverless AI-workflow

Разносите поиск контекста, модерацию, вызовы инструментов и суммаризацию по отдельным функциям — ретраи, трассировки и контроль стоимости действуют на каждый шаг, а не на один огромный промпт.

Обновлено: 2026-06-28

Суть ответа

LLM-пайплайны и serverless AI-workflow. Каждый этап деплоится и логируется отдельно; асинхронные разрывы между вызовами модели закрывают пайплайны.

Когда подходит и когда нет

  • Мульти-модельные потоки
  • Human-in-the-loop
  • Долгое обогащение

На что обратить внимание

  • Исследовательские ноутбуки не дают устойчивых графов, ретраев и контроля стоимости, которые нужны продакшен-AI-workflow.

Почему один большой промпт сложно ретраить

Один мегапромпт нельзя ретраить по частям: повтор поиска заново запускает модерацию и вызовы инструментов — LLM-пайплайну нужны границы.

Стоимость раздувается, когда каждая ветка заново эмбеддит тот же контекст вместо кэширования структурированного результата поиска.

Почему ноутбуки не заменяют LLM-пайплайны

Исследовательские ноутбуки не дают устойчивых графов, ретраев и контроля стоимости, которые нужны продакшен-AI-workflow.

Этапы LLM-работы как деплоящиеся функции

Каждый этап деплоится и логируется отдельно; асинхронные разрывы между вызовами модели закрывают пайплайны.

Вызовы инструментов остаются HTTP-функциями с явной аутентификацией — так же, как в остальных агентских сценариях.

Какие этапы LLM-пайплайна выносить отдельно

Поиск контекста (retrieve)

Изолируйте вызовы эмбеддингов и поиска, чтобы retrieval можно было ретраить и кэшировать независимо.

Модерация (moderate)

Прогоняйте модерацию первой, чтобы небезопасные запросы отсекались до оплаты дорогой генерации.

Вызов инструментов (tools)

Держите вызовы инструментов за строгой валидацией входа и явной аутентификацией — как любой продакшен-эндпоинт.

Суммаризация (summarize)

Сжимайте результат для хранения или показа пользователю отдельным шагом с собственными ретраями.

Как вести LLM-работу по шагам с пайплайнами Inquir

1

Нарисовать dataflow

Назовите входы и выходы каждого этапа до написания кода.

2

Кодифицировать

Реализуйте каждый этап функцией или шагом пайплайна с собственными логами.

3

Мерить стоимость

Считайте токены и время выполнения по каждому шагу.

LLM-пайплайн анализа документов

Графовый пайплайн связывает триггер с цепочкой узлов-функций рёбрами — тот же формат, что в консоли и документации. Каждый этап — отдельная функция: повтор поиска без повтора классификации, учёт токенов по шагу, трассировки при сбое одного вызова модели.

pipelines/document-analysis.json (pipeline graph)
{
  "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" }
  ]
}
functions/extract-text.mjs (node 1)
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 };
}
jobs/retrieve.mjs (step 3 — retries skip extract/classify)
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 запросом/ответом — так проще обрабатывать сбои и повторные проигрывания.

Как контролировать стоимость по этапам?

Меряйте токены и время выполнения по каждому шагу в наблюдаемости; ограничивайте дорогие шаги бюджетами и выходите раньше при провале модерации.