~/tools / Эмбеддинги и поиск (RAG) / RAG Text Chunker
RAG Text Chunker — Разделение текста на чанки с перекрытием и запрос Ollama /api/embed для RAG
Разделите длинный документ на чанки с максимальной длиной и перекрытием, прежде чем создавать его эмбеддинги для RAG или семантического поиска. Текст режется сначала по абзацам, затем по строкам, предложениям и пробелам, и внутри слова — только когда ничто другое не подходит. Вы получите чанки и готовую к запуску команду curl для /api/embed в Ollama со всеми чанками в одном запросе. Данные не покидают ваш браузер.
Длины указаны в символах. Контекстное окно модели считается в токенах, а сколько токенов занимает текст, зависит от модели, поэтому оставьте запас.
Команда curl
Выполните её на компьютере, который может обратиться к Ollama. В ответе будет по одному вектору на чанк, в этом порядке.
curl http://localhost:11434/api/embed -d '{
"model": "embeddinggemma",
"input": [
"Embeddings turn text into numeric vectors. You can store them in a vector database and search them with cosine similarity, or use them in a RAG pipeline.\n\nThe length of each vector depends on the embedding model. Use the same model when you index your documents and when you embed a question.\n\n",
"Ollama'\''s /api/embed endpoint takes a single string or an array of strings. By default, input that is longer than the model'\''s context window is truncated. Set truncate to false to get an error instead.\n\n",
"Split long documents into smaller chunks before you embed them, so that each chunk fits in the context window and a search can return the part that answers the question."
],
"truncate": false
}'Чанки
Чанков: 3. Самый длинный — 294 символов.
#0 · символов: 294 · начинается со смещения 0
Embeddings turn text into numeric vectors. You can store them in a vector database and search them with cosine similarity, or use them in a RAG pipeline. The length of each vector depends on the embedding model. Use the same model when you index your documents and when you embed a question.
#1 · символов: 202 · начинается со смещения 294
Ollama's /api/embed endpoint takes a single string or an array of strings. By default, input that is longer than the model's context window is truncated. Set truncate to false to get an error instead.
#2 · символов: 169 · начинается со смещения 496
Split long documents into smaller chunks before you embed them, so that each chunk fits in the context window and a search can return the part that answers the question.
Тело JSON для /api/embed
{
"model": "embeddinggemma",
"input": [
"Embeddings turn text into numeric vectors. You can store them in a vector database and search them with cosine similarity, or use them in a RAG pipeline.\n\nThe length of each vector depends on the embedding model. Use the same model when you index your documents and when you embed a question.\n\n",
"Ollama's /api/embed endpoint takes a single string or an array of strings. By default, input that is longer than the model's context window is truncated. Set truncate to false to get an error instead.\n\n",
"Split long documents into smaller chunks before you embed them, so that each chunk fits in the context window and a search can return the part that answers the question."
],
"truncate": false
}Поля запроса по справочнику API Ollama для /api/embed, проверено 2026-11-04. Ollama API: Generate embeddings
Всё выполняется в вашем браузере. Инструмент лишь записывает команду и ничего не отправляет.
Эндпоинт /api/embed в Ollama принимает одну строку или массив строк, а в справочнике API сказано, что по умолчанию ввод длиннее контекстного окна модели обрезается. Поэтому длинный документ, отправленный одной строкой, может потерять свой конец без какой-либо ошибки, а единственный вектор на весь документ мешает поиску вернуть ту часть, которая отвечает на вопрос. Обычное решение — разделить документ на более мелкие чанки и создать эмбеддинг каждого. Этот инструмент делит текст по самой крупной границе, которая ещё подходит: сначала по пустым строкам между абзацами, затем по переводам строк, затем по концам предложений (включая 。!?), затем по пробелам, а по отдельным символам — только в крайнем случае. Он сохраняет разделители, так что чанки, сложенные обратно, дают исходный текст. Перекрытие повторяет конец одного чанка в начале следующего, целыми кусками, чтобы предложение, разрезанное на границе, целиком присутствовало в одном из чанков. Длины считаются в символах. Результат — запрос /api/embed со всеми чанками в массиве input, с truncate, равным false, если вы хотите получать ошибку вместо тихого обрезания. Разбиение проверено на примерах, посчитанных вручную, и тем, что каждый чанк является частью исходного текста в показанной позиции.
Основная логика этого инструмента открыта под лицензией MIT. github.com/seigo5555/toolkitbox-lib/src/text-chunk.ts
Когда пригодится
- Подготовить руководство, FAQ или README для поиска RAG на собственном сервере Ollama и создать эмбеддинги всех чанков одним запросом
- Подобрать размер чанка, при котором абзацы остаются вместе, меняя размер и наблюдая, где проходят границы
- Убедиться, что ничего не обрезается незаметно: включите truncate false, и Ollama вернёт ошибку, если чанк слишком длинный для модели
Как пользоваться
- Вставьте текст. Разделяйте абзацы пустой строкой, чтобы по возможности они оставались вместе.
- Задайте максимальную длину чанка и перекрытие в символах, имя модели эмбеддингов и адрес вашего сервера Ollama, если это не http://localhost:11434.
- Скопируйте команду curl и выполните её на компьютере, который может обратиться к Ollama. В ответе будет по одному вектору на чанк, в том же порядке. Embedding Similarity Calculator на этом сайте может их сравнить.
Вопросы
Какой размер чанка использовать?
Единственно верного размера нет. Каждый чанк должен помещаться в контекстное окно модели, которое считается в токенах, а более мелкие чанки позволяют поиску указать на более конкретный фрагмент. Начните с размера, при котором вместе остаются один-два абзаца, а затем сравните результаты поиска с помощью Embedding Similarity Calculator.
Почему символы, а не токены?
У каждой модели эмбеддингов свой токенизатор, поэтому один и тот же текст в разных моделях даёт разное число токенов, а инструмент в браузере не может точно посчитать их для каждой модели. В библиотеке Ollama контекстное окно каждой модели указано в токенах; например, там показано 2K для embeddinggemma и nomic-embed-text и 512 для mxbai-embed-large и all-minilm. Оставьте запас и используйте truncate false, чтобы находить слишком длинные чанки.
Что делает truncate false?
В справочнике API Ollama сказано, что truncate по умолчанию равен true, то есть ввод, превышающий контекстное окно, обрезается. При false Ollama вместо этого возвращает ошибку. Когда флажок отмечен, инструмент добавляет "truncate": false, чтобы слишком длинный чанк приводил к явной ошибке, а не сокращался.
Как работает перекрытие?
Когда начинается новый чанк, последние куски предыдущего (предложения, строки или слова) повторяются в его начале, пока они укладываются в длину перекрытия, а чанк остаётся в пределах максимума. Куски никогда не режутся ради заполнения перекрытия, поэтому фактическое перекрытие может быть короче заданного числа.
Понимает ли он Markdown, HTML или код?
Нет. Он рассматривает всё как обычный текст и делит по абзацам, строкам, предложениям и пробелам. Удалите разметку, которая не нужна в эмбеддингах, прежде чем вставлять текст.
Отправляется ли мой текст куда-либо?
Нет. Текст делится в вашем браузере, а инструмент лишь записывает команду. Ничего не отправляется, пока вы не выполните её сами.
Похожие статьи
- Эмбеддинги в Ollama: основы поиска и RAGСоздание эмбеддингов через /api/embed в Ollama: модели и их размеры, truncate и dimensions, векторы единичной длины и косинусное сходство, по официальной документации.
- Хранение и поиск эмбеддингов Ollama в PostgreSQL с помощью pgvectorЭмбеддинги Ollama в PostgreSQL с pgvector, поиск через HNSW или IVFFlat и передача результатов в /api/chat, чтобы ответ ссылался на источники.