Сценарий

LLM-пайплайны и AI-сценарии на функциях

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

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

Суть ответа

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

Когда подходит

  • Потоки с несколькими моделями
  • Передача человеку (human-in-the-loop)
  • Долгое обогащение

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

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

Почему LLM-сценарий из одного промпта сложно повторить

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

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

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

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

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

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

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

Какие этапы LLM-пайплайна разделять

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

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

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

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

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

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

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

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

Как разбить LLM-работу на этапы с пайплайнами Inquir

1

Нарисовать поток данных

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

2

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

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

3

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

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

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

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

pipelines/document-analysis.json (граф пайплайна)
{
  "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 (узел 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 (шаг 3 — повторы не трогают 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-сценарий на этапы?

Повторы, учёт стоимости и отладка становятся проще, когда поиск контекста, модерация, вызовы инструментов и суммаризация — отдельные шаги с собственными логами.

Стриминг токенов конечным пользователям?

Держите видимый пользователю стриминг на границе; внутренние этапы могут работать в режиме запрос/ответ — так проще обрабатывать сбои и повторные проигрывания.

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

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