§ БЛОГ

Эмбеддинги в workflow: новая нода Staqflow для поиска по смыслу и векторных баз

В Staqflow появился узел «Эмбеддинги»: текст на входе, вектор на выходе. Шесть провайдеров — OpenAI, Gemini, Mistral, Qwen, Yandex Cloud и свой сервер, — пачки до 200 текстов за запрос, назначение вектора и готовая связка с Qdrant для поиска по смыслу, разбора обращений и ответов по своим документам.

Эмбеддинги в workflow: новая нода Staqflow для поиска по смыслу и векторных баз

Клиент пишет в поддержку: «как вернуть деньги за заказ». В базе знаний статья называется «Возврат средств и отмена покупки». Поиск по ключевым словам её не найдёт: ни одного общего слова. Человек видит, что это одно и то же, а строковый поиск — нет.

Эту разницу закрывают эмбеддинги. В Staqflow появился узел «Эмбеддинги»: на входе текст, на выходе вектор, которым уже можно искать по смыслу, раскладывать обращения по темам и наполнять векторную базу.

Эмбеддинг — это список чисел, в который нейросеть превращает текст так, что у близких по смыслу текстов числа оказываются рядом. Расстояние между двумя такими списками и есть мера смысловой близости: сравнивая их, можно находить подходящие документы, не совпадая с ними ни одним словом.

Что умеет узел «Эмбеддинги»

  • Считает вектор для каждого элемента. Один элемент на входе — один вектор на выходе.
  • Складывает соседние элементы в один запрос. Наполнение базы — это тысячи фрагментов, и запрос на каждый означал бы тысячи обращений к провайдеру.
  • Знает назначение вектора. Документ для базы и поисковый запрос считаются по-разному, и путать их — значит ухудшать поиск.
  • Умеет укоротить вектор. Короче вектор — меньше места в базе и быстрее поиск, ценой части смысла.
  • Возвращает вектор рядом с исходными полями. Удобно, когда текст едет в базу вместе с идентификатором и метаданными.

Шесть провайдеров и их пределы

ПровайдерТекстов за один запросОсобенности
OpenAI200вектор укорачивается параметром
Mistral200длину вектора меняет только codestral-embed
Google Gemini100назначение вектора отдельным полем, пять вариантов
Qwen (Alibaba Cloud)10вектор укорачивается параметром
Yandex Cloud1назначение и есть выбор модели: документ или запрос
Свой сервер16 по умолчаниювсё, что говорит на протоколе OpenAI; точный предел задаётся параметром

Пределы пачки сняты опросом живых API, а не переписаны из документации: Qwen отвечает «batch size … should not be larger than 10», Gemini — «at most 100 requests can be in one batch», Yandex — «Array input must contain exactly one string». У OpenAI и Mistral прошли 200 строк.

Честно про тех, кого в списке нет: у OpenRouter, Groq и xAI среди моделей нет ни одной с embed, у Anthropic, DeepSeek и Perplexity такой ручки нет вовсе, а у GigaChat она за отдельным тарифом. Показывать то, чего не видели работающим, мы не стали.

Как настроить

  1. Добавьте подключение к сервису в учётных данных пространства — то же самое, на котором работает языковая модель.
  2. Поставьте узел «Эмбеддинги» и выберите провайдера и модель. У Yandex поля модели нет: её называет назначение вектора.
  3. Подставьте текст через выражения: {{ $json.text }}.
  4. Укажите назначение вектора, если провайдер его принимает: документ для базы, поисковый запрос, сравнение по смыслу, классификация или кластеризация.

Важное правило: один элемент — один вектор. Узел не режет длинный документ сам, поэтому статью или инструкцию нужно заранее разбить на фрагменты — например, узлом «Код» — и подать их отдельными элементами.

Размер пачки

Размер пачки — главный параметр этой ноды. По умолчанию 16 текстов в запросе; выше предела провайдера узел прижимает значение сам, так что поставить лишнего нельзя. Для наполнения базы через OpenAI или Mistral ставьте 200 — тысяча фрагментов уедет пятью запросами вместо тысячи.

Векторы раскладываются обратно по номерам из ответа, а не по порядку. Это не педантизм: при раскладке по порядку вектор мог бы молча лечь не к своему тексту, и поиск врал бы, ничего не роняя. Если векторов пришло не столько, сколько текстов, узел останавливается с ошибкой «Просили N векторов, получили M».

Что приходит на выход

  • embedding — сам вектор, список чисел. Имя поля меняется параметром;
  • provider, model, purpose — кто считал, чем и для чего;
  • dimensions — длина вектора: по ней создаётся коллекция в базе;
  • tokens — расход, когда в пачке был один текст: провайдер считает токены на весь запрос, и приписывать их одному элементу из двухсот было бы враньём;
  • ignored — параметры, которые провайдер не принял.

Включите «Сохранять поля входа», и рядом с вектором останутся id, заголовок и всё, что пришло на вход, — ровно то, что нужно положить в базу вместе с вектором.

Два процесса вместо одного

На практике эмбеддинги живут в паре процессов, и их удобно сразу так и собирать.

Наполнение базы — по расписанию или по событию: источник (CMS, папка в хранилище, таблица) → разбиение на фрагменты → узел «Эмбеддинги» с назначением «документ для базы» и крупной пачкой → запись в базу вместе с текстом и ссылкой на исходник.

Поиск — по запросу пользователя: вопрос из чата или формы → узел «Эмбеддинги» с назначением «поисковый запрос», один текст → поиск ближайших в базе → найденные фрагменты уходят дальше: в ответ, в языковую модель или в карточку.

Разделять их стоит не из аккуратности: наполнение идёт редко и большими объёмами, поиск — часто и по одному тексту, и размер пачки у них нужен разный.

Куда класть векторы

В каталоге уже есть узел Qdrant: создать коллекцию, добавить или обновить точки, найти похожие, удалить. Метрика выбирается при создании коллекции — косинусная, евклидова или скалярное произведение, — а длину вектора возьмите из поля dimensions.

Если отдельную векторную базу заводить не хочется, вектор ложится в обычную: PostgreSQL, MongoDB, ClickHouse, Supabase — все эти узлы в каталоге есть. Для небольших коллекций этого хватает.

Сценарии автоматизации

Поиск по базе знаний и документам

Раз в сутки процесс забирает новые статьи, режет на фрагменты, считает векторы пачками по 200 и кладёт в Qdrant вместе со ссылкой на исходник. Поиск — тот же узел, но с назначением «поисковый запрос».

Ответы поддержки по вашим материалам

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

Разбор обращений по темам

Каждое входящее письмо превращается в вектор с назначением «классификация» и сравнивается с эталонными формулировками тем. Дальше маршрутизация: счета — в бухгалтерию, поломки — в сервис.

Поиск дублей

Новая заявка сравнивается с открытыми: если вектор почти совпал с существующей, это повтор — не плодим карточки в CRM, а добавляем комментарий к старой.

Похожие товары и материалы

Описания товаров считаются один раз и лежат в базе. Для карточки подбираются ближайшие по смыслу — без ручной простановки связей.

Сколько это стоит

Провайдеры берут плату за токены, и эмбеддинги дешевле обычных запросов к языковой модели, но объёмы здесь другие: наполнение базы — это разом тысячи фрагментов. Поэтому и параметр tokens в ответе, и пачки: чем крупнее пачка, тем меньше обращений.

В Staqflow оплачивается только работа процесса — токены за CPU-секунды. Ожидание ответа провайдера процессор почти не грузит, но тысяча элементов в прогоне — это тысяча элементов, которые надо разложить и передать дальше. Тарифы — на странице цен.

Частые вопросы

Зачем эмбеддинги, если есть поиск по словам?

Поиск по словам находит совпадения, эмбеддинги — смысл. «Как вернуть деньги» и «возврат средств» не совпадают ни одним словом, но их векторы окажутся рядом.

Какую модель выбрать?

Ту, что доступна на вашем ключе. Правило одно: документы и запросы должны считаться одной моделью — векторы разных моделей несравнимы, и при смене модели базу придётся пересчитать.

Что такое назначение вектора?

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

Как разбить длинный документ?

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

Нужна ли отдельная векторная база?

Для больших коллекций удобнее Qdrant: он умеет искать ближайшие векторы штатно. Для сотен записей хватит PostgreSQL или MongoDB — узлы для них тоже есть в каталоге.

Данные уходят во внешний сервис?

В облачные — да, как при любом вызове чужого API. Если так нельзя, в своём контуре к узлу подключается локальная модель на протоколе OpenAI — и тексты не покидают периметр.

Попробуйте

  1. Создайте аккаунт — карта не нужна.
  2. Соберите процесс из трёх узлов: источник текстов, «Эмбеддинги» с пачкой побольше и Qdrant.
  3. Или опишите задачу ИИ-клиенту через MCP: «Раз в сутки забирай новые статьи, считай векторы и складывай в Qdrant».

Ответ по найденным фрагментам соберёт узел языковой модели, а озвучит его синтез речи — если ответ нужен голосом.