Клиент пишет в поддержку: «как вернуть деньги за заказ». В базе знаний статья называется «Возврат средств и отмена покупки». Поиск по ключевым словам её не найдёт: ни одного общего слова. Человек видит, что это одно и то же, а строковый поиск — нет.
Эту разницу закрывают эмбеддинги. В Staqflow появился узел «Эмбеддинги»: на входе текст, на выходе вектор, которым уже можно искать по смыслу, раскладывать обращения по темам и наполнять векторную базу.
Эмбеддинг — это список чисел, в который нейросеть превращает текст так, что у близких по смыслу текстов числа оказываются рядом. Расстояние между двумя такими списками и есть мера смысловой близости: сравнивая их, можно находить подходящие документы, не совпадая с ними ни одним словом.
Что умеет узел «Эмбеддинги»
- Считает вектор для каждого элемента. Один элемент на входе — один вектор на выходе.
- Складывает соседние элементы в один запрос. Наполнение базы — это тысячи фрагментов, и запрос на каждый означал бы тысячи обращений к провайдеру.
- Знает назначение вектора. Документ для базы и поисковый запрос считаются по-разному, и путать их — значит ухудшать поиск.
- Умеет укоротить вектор. Короче вектор — меньше места в базе и быстрее поиск, ценой части смысла.
- Возвращает вектор рядом с исходными полями. Удобно, когда текст едет в базу вместе с идентификатором и метаданными.
Шесть провайдеров и их пределы
| Провайдер | Текстов за один запрос | Особенности |
|---|---|---|
| OpenAI | 200 | вектор укорачивается параметром |
| Mistral | 200 | длину вектора меняет только codestral-embed |
| Google Gemini | 100 | назначение вектора отдельным полем, пять вариантов |
| Qwen (Alibaba Cloud) | 10 | вектор укорачивается параметром |
| Yandex Cloud | 1 | назначение и есть выбор модели: документ или запрос |
| Свой сервер | 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 она за отдельным тарифом. Показывать то, чего не видели работающим, мы не стали.
Как настроить
- Добавьте подключение к сервису в учётных данных пространства — то же самое, на котором работает языковая модель.
- Поставьте узел «Эмбеддинги» и выберите провайдера и модель. У Yandex поля модели нет: её называет назначение вектора.
- Подставьте текст через выражения:
{{ $json.text }}. - Укажите назначение вектора, если провайдер его принимает: документ для базы, поисковый запрос, сравнение по смыслу, классификация или кластеризация.
Важное правило: один элемент — один вектор. Узел не режет длинный документ сам, поэтому статью или инструкцию нужно заранее разбить на фрагменты — например, узлом «Код» — и подать их отдельными элементами.
Размер пачки
Размер пачки — главный параметр этой ноды. По умолчанию 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 — и тексты не покидают периметр.
Попробуйте
- Создайте аккаунт — карта не нужна.
- Соберите процесс из трёх узлов: источник текстов, «Эмбеддинги» с пачкой побольше и Qdrant.
- Или опишите задачу ИИ-клиенту через MCP: «Раз в сутки забирай новые статьи, считай векторы и складывай в Qdrant».
Ответ по найденным фрагментам соберёт узел языковой модели, а озвучит его синтез речи — если ответ нужен голосом.
