June 10

Контекстуализация чанков: как улучшить поиск в векторной базе


Если ты с RAG еще не знаком, то читай прошлые статьи:

Зачем нужен Agentic RAG?

Категориальный роутинг в RAG: Пошаговый гайд


🧠 Контекстуализация чанков: как улучшить поиск в векторной базе без магии

Если ты уже работаешь с RAG-системами и векторными базами, то знаешь:
🚨 просто порезать документ на чанки — недостаточно.

Модель может не понять смысл куска текста, если тот вырван из контекста. В результате:

  • Потеря точности при поиске
  • Невнятные ответы
  • Лишние расходы на токены

Anthropic предложили интересное решение: контекстуализировать чанки на этапе загрузки. Дальше покажу, как это реализовать в N8n без лишнего геморроя.


🔍 Что такое контекстуализация?

Это процесс, при котором каждый чанк (фрагмент текста) получает краткое описание в контексте всего документа.

Ты подаёшь:
🔹 Полный текст документа
🔹 Один чанк На выходе: краткая выжимка смысла этого чанка с учётом всего документа.

📦 Как это реализовать в N8n: пошаговая схема

Весь флоу строится на базе N8n + ChatGPT.

⚙️ Общий флоу

[1] Trigger: Upload file
      ↓
[2] Extract text from PDF 
      ↓
[3] Save full text in Set
      ↓
[4] Split into chunks (~500 символов, с учётом переносов)
      ↓
[5] Loop: For each chunk
      ↳ [6] Prompt Claude:
          - full document = System
          - chunk = User message
          - контекстуализация
      ↓
[7] Собрать: оригинал + "контекст: ..." → записать в Supabase

🛠️ Детализация шагов

Воркфлоу можно скачать в нашем Telegram-канале по ссылке

1. Загрузка документа

Через Google Drive в N8n загружаем PDF.
Извлекаем текст → сохраняем в переменную.

2. Разрезка на чанки

Нода разбивает текст с помощью кода по ~500 символов, стараясь обрезать по завершённым предложениям.


3. Контекстуализация через ноду LLM.

Как подаётся промпт:

  • В system блок — весь документ целиком
  • В user блок — чанк: Чанк: [текст]

Пример system prompt:

<document> 
{{ $('HTTP Request3').item.json.markdown }}
</document>
Here is the chunk we want to situate within the whole document 
<chunk> 
{{ $json.chunk }}
</chunk> 
Please give a short succinct context to situate this chunk within the overall document for the purposes of improving search retrieval of the chunk. Answer only with the succinct context and nothing else, and only in Russian. 


🧩 Финальный вид объекта для базы:

Каждый документ сохраняется в векторную базу данных как строка:

Оригинал: [исходный чанк]

Контекст: [результат от Claude]

🟡 По желанию: добавь в метаданные ключевые слова, имена, темы — также можно вытащить из Claude в JSON (показано в следующих видео).

Как добавлять метаданные читай в статье.


🧠 Зачем всё это?

Контекстуализация чанков:

  • 📈 Повышает релевантность поиска
  • 🧠 Делает семантику текста более очевидной для модели
  • 💡 Упрощает интерпретацию фрагментов, даже если они короткие или абстрактные

🚀 Что дальше?

  1. ✅ Контекстуализируй документы при загрузке — как в этом гайде
  2. 🔜 Контекстуализируй запросы пользователей перед поиском
    • особенно важно для коротких сообщений: «да», «хорошо», «найди»
  3. ⚙️ На базе контекста можно делать: фильтрацию, приоритизацию, мультистейдж-поиск

📌 Вывод: делай не больше, а лучше

Если ты просто загоняешь чанки в векторку — ты теряешь качество.
Контекстуализация — это отличный способ повысить качество ответов.


Наш Telegram - https://t.me/neurofolder