Дата публикации: 01:53:53 ().
Современные приложения, работающие с большими объёмами текста, часто используют семантический поиск для быстрого нахождения релевантных фрагментов. В данной статье мы рассмотрим, как правильно формировать чанки, выполнять векторный поиск и улучшать результаты с помощью техник перезаписи запросов (query rewriting). Информация основана на материалах из открытых источников, включая обсуждения в сообществах OpenAI, LexisNexis, Stack Overflow и документацию Azure AI Search.
Подготовка корпуса: чанкинг и скользящее окно
- Размер чанка. Оптимальная длина – около 20 предложений. Это позволяет сохранить достаточный контекст, не перегружая векторное представление.
- Скользящее окно. При разбиении документа используют overlap (например, 5‑10 предложений), чтобы соседние чанки делились частью текста. Это снижает риск потери важной информации на границах чанков.
- Пример псевдокода (Python):
def chunk_text(text, sentences_per_chunk=20, overlap=5):
sentences = sent_tokenize(text) # например, через nltk
chunks = []
i = 0
while i < len(sentences):
chunk = sentences[i:i+sentences_per_chunk]
chunks.append(' '.join(chunk))
i += sentences_per_chunk ⸺ overlap
return chunks
Векторизация чанков
Для получения числовых представлений используется модель эмбеддингов от OpenAI (например, text-embedding-ada-002). Каждый чанк преобразуется в вектор фиксированной размерности (1536 для указанной модели). Эти векторы сохраняются в векторной базе данных (FAISS, Annoy, Pinecone, Weaviate и т.д.).
Семантический поиск по запросу пользователя
- Запрос пользователя также преобразуется в вектор той же моделью эмбеддингов.
- Выполняется поиск ближайших соседей (обычно cosine similarity) в векторном индексе.
- Извлекаются топ‑N чанков (часто N = 10) и передаются в генеративную модель (GPT‑4, GPT‑3.5 и т.п.) для формирования окончательного ответа.
Пример запроса к векторной базе (псевдо‑SQL):
SELECT chunk_id, text
FROM chunks
ORDER BY cosine_distance(embedding, :query_embedding) ASC
LIMIT 10;
Почему полезна перезапись запросов (query rewriting)
Прямой эмбеддинг пользовательского запроса иногда неет все нюансы намерения, особенно когда:
- Запрос содержит синонимы или жаргон;
- Есть орфографические ошибки;
- Требуется учёт специфической терминологии (например, юридические или медицинские термины).
- Расширить семантическое покрытие;
- Уменьшить влияние шума;
- Улучшить recall без существенной потери precision.
Перезапись позволяет:
Стратегии перезаписи запросов
Использование LLM для генерации вариантов
Можно попросить большую языковую модель сгенерировать несколько перефразированных вариантов исходного запроса:
Prompt:
"Перепиши следующий запрос разными способами, сохраняя его смысл: '{original_query}'"
Полученные варианты эмбеддируются и объединяются (например, средним вектором) перед поиском.
Синонимическое расширение на основе словарей
Для русскоязычного корпуса полезно использовать ресурсы вроде RusVectores или OpenCorpora для получения синонимов и морфологических вариантов.
Контекстуальная перезапись с учётом истории диалога
Если приложение поддерживает многократный диалог, предыдущие реплики могут быть добавлены к текущему запросу перед эмбеддингом, что помогает уточнить намерение.
Практические рекомендации
- Экспериментируйте с размером чанка и величиной overlap; оптимальные значения зависят от плотности информации в документах.
- Нормализуйте текст перед эмбеддингом: приводите к нижнему регистру, удаляйте лишние пробелы, но сохраняйте знаки препинания, если они важны для смысла (например, в кодовых фрагментах).
- При работе с русским языком проверяйте коллацию базы данных; использование
utf8mb4_unicode_ci(MySQL) илиRussian_100_CI_AS(SQL Server) обеспечивает корректное сравнение символов. - Для оценки качества поиска используйте метрики Recall@K и MRR (Mean Reciprocal Rank) на размеченном наборе запросов.
- Логируйте исходные запросы, их перезаписанные варианты и полученные ранги; это позволит отлаживать pipeline и улучшать его со временем.
Семантический поиск, построенный на правильно сформированных чанках и векторных представлениях, обеспечивает быстрый и релевантный доступ к большим текстовым массивам. Перезапись запросов — мощный инструмент для повышения качества поиска, особенно в условиях многоязычных и шумных пользовательских вводов. Комбинируя эти подходы, вы сможете создать надежную систему вопросов‑ответов, которая будет эффективно работать с русскоязычным контентом.
Статья подготовлена на основе информации из открытых источников, актуальной на .