Художественный текст – это не просто мешок слов
Запросы вроде «найди сцены, где герой испытывает экзистенциальный ужас» или «покажи все диалоги о предательстве в третьей главе» ломают стандартный RAG. Почему? Потому что модели эмбеддингов, обученные на Википедии и научных статьях, плохо понимают метафоры, развитие персонажей и саспенс. Они видят текст, но не видят историю.
Основная проблема – контекстная целостность. Разбивая роман на куски по 512 токенов, вы гарантированно теряете нить повествования. Герой влюбляется в одном чанке, а признается в любви в другом, и между ними – пропасть в векторном пространстве.
1 Выбор модели эмбеддингов: не верьте бенчмаркам
На 30 марта 2026 года ландшафт моделей изменился. Модели типа BGE-M3 или Snowflake Arctic Embed с длиной контекста в 128k токенов стали нормой. Но для художественной прозы важна не длина, а чувствительность к нарративу.
Не гонитесь за размерностью 1024. Для поиска по 90k историй хватит 768 измерений, особенно если вы планируете использовать реранкер. Экономия на вычислениях будет существенной.
2 Чанкинг: как резать, чтобы не искалечить сюжет
Тупое разбиение по символам или предложениям – путь в никуда. Художественный текст имеет структуру: главы, сцены, абзацы, диалоги.
- Сценарный чанкинг: Разделяйте текст по смене локации, времени или группы персонажей. Библиотеки типа
nlp-text-splitterна 2026 год научились определять сцены с точностью около 85%. - Семантическое слияние: Получили два маленьких, но семантически связанных абзаца? Склейте их. Алгоритмы вроде
SemanticChunkerиз LangChain 0.2.x (актуально на 2026) делают это на лету, используя тот же эмбеддингер для оценки когерентности. - Наложение (overlap) – ваш друг и враг. Да, 10% оверлапа помогают сохранить контекст. Но в диалогах это приводит к дублированию реплик. Настройте оверлап адаптивно: больше для описаний, меньше для прямой речи.
# Пример адаптивного чанкинга с использованием литературно-ориентированного сплиттера
from literary_splitter import SceneAwareSplitter
splitter = SceneAwareSplitter(
chunk_size=1000, # токенов
chunk_overlap=50, # базовый оверлап
sensitivity="high", # режим для художественной прозы
model="gritlm-literary" # модель для оценки сцен
)
chunks = splitter.split_text(full_novel_text)
3 Векторная БД и гибридный поиск: не кладите все яйца в один вектор
Чисто семантический поиск по художественным текстам часто выдает красиво звучащие, но нерелевантные отрывки. Тут спасает гибридный подход.
Используйте Qdrant или Weaviate (актуальные версии на 2026) с включенным BM25. Эти базы научились эффективно комбинировать sparse и dense вектора. Запрос «любовное письмо Татьяны к Онегину» найдет и по ключевым словам («письмо», «Татьяна»), и по семантике («исповедь», «чувства»).
| Хранилище | Плюс для литературы | Минус |
|---|---|---|
| Qdrant 1.9.x | Отличная фильтрация по метаданным (автор, жанр, год) | Требует больше RAM для больших коллекций |
| Weaviate 1.24 | Встроенные модули реранкинга | Сложнее в кастомной настройке |
| Elasticsearch 10.x | Невероятно мощный гибридный поиск | Настройка – это отдельный ад (но оно того стоит) |
Про настройку гибридного поиска в Elasticsearch мы уже подробно писали в отдельном руководстве. Для 90k историй и 8 ГБ VRAM я бы стартовал с Qdrant – он проще и жрет меньше ресурсов.
4 Реранкинг: финальная полировка результатов
Векторный поиск вернет 20-30 потенциальных чанков. Половина будет не у дел. Реранкер – это кросс-энкодер, который берет ваш запрос и каждый чанк, и выдает точную оценку релевантности.
На 2026 год модели типа BGE-Reranker-v3-M3 или Cohere Rerank 3.5 (если бюджет позволяет) справляются с литературными нюансами. Они понимают, что запрос «момент moral dilemma» лучше соответствует внутреннему монологу, чем описанию погоды, даже если в последнем есть слово "difficulty".
Важный нюанс: не посылайте в реранкер огромные чанки. Обрежьте их до 256-512 токенов вокруг ключевой фразы. Этого достаточно для оценки, а скорость возрастет в разы.
# Пример пайплайна с реранкером
from sentence_transformers import CrossEncoder
reranker = CrossEncoder('BAAI/bge-reranker-v3-m3', device='cuda')
# Допустим, candidates - это чанки, найденные векторным поиском
pairs = [[query, chunk] for chunk in candidates]
scores = reranker.predict(pairs)
# Сортируем кандидатов по убыванию score
ranked_indices = np.argsort(scores)[::-1]
top_chunks = [candidates[i] for i in ranked_indices[:5]] # Берем топ-5
5 Сборка пайплайна и подача LLM
Теперь у вас есть 3-5 идеально подобранных отрывков. Не сваливайте их в промпт как есть. Художественный текст требует аккуратной контекстуализации.
- Добавьте метаданные к каждому чанку: название произведения, главу, окружающие события. Это помогает LLM сориентироваться.
- Используйте продвинутые шаблоны промптов, которые заставляют модель фокусироваться на сюжете и персонажах, а не пересказывать текст. Готовые работающие промпты можно взять здесь.
- Выберите LLM с длинным контекстом и способностью понимать нарративы. Claude-3.7-Sonnet или Gemini 2.5 Pro (актуально на март 2026) справляются лучше, чем чисто инженерные модели вроде GPT-4o.
Где все ломается: 5 ошибок, которые сведут ваш поиск на нет
- Игнорирование метаданных. Без жанра, года и автора поиск "готическая атмосфера" выдаст и "Дракулу", и современный любовный роман с вампирами. Фильтруйте.
- Чанкинг по абзацам в стихах. Поэзию вообще нельзя резать стандартными методами. Для нее нужны отдельные правила – по строфам или даже по ритмическим паттернам. (Об этом мало кто говорит, а потом плачут).
- Экономия на реранкере. Думаете, можно обойтись без него? Для технических текстов – может быть. Для художественных – нет. Это единственный способ отсечь красиво звучащий, но нерелевантный мусор.
- Использование общей эмбеддинг-модели. Модель, обученная на новостях, будет кодировать "темный лес" как экосистему, а не как символ опасности и неизвестности.
- Поиск по всему корпусу сразу. 90k историй – это много. Если не использовать эффективную фильтрацию (хотя бы по жанру), поиск будет медленным и неточным. Сегментируйте базу.
Что в итоге?
Строительство семантического поиска по художественным текстам – это не применение стандартного RAG, а его переосмысление. Вы имеете дело не с фактами, а с смыслами, спрятанными в метафорах, сюжетных поворотах и характерах.
Инструменты 2026 года дают для этого все возможности: специализированные эмбеддинг-модели, умный чанкинг, гибридный поиск и мощные реранкеры. Но самый важный компонент – это понимание, что вы работаете с литературой. Без этого даже самая сложная архитектура будет выдавать технически точные, но бессмысленные в контексте повествования ответы.
Для дальнейшего углубления в тему рекомендую ознакомиться с обзором свежих исследований RAG, где рассматриваются подходы вроде GraphRAG, которые могут лучше улавливать связи между персонажами и событиями.