Продвинутый chunking для улучшения RAG
1. Введение
Chunking — это процесс разделения длинного текста на более мелкие фрагменты, называемые чанками. В RAG (Retrieval-Augmented Generation) пайплайнах этот процесс является важным этапом, потому что именно чанки используются для создания векторных эмбеддингов и семантического поиска информации. Мы ищем самые близкие куски (чанки) под запрос пользователя, и отдаем их LLM для генерации ответа на запросы. Чем лучше нарезан документ на текстовые чанки, тем выше вероятность того, что модель сможет найти и предоставить точную и релевантную информацию.
В чем сложность? Финансовые документы, такие как PDF-отчёты компаний, содержат сложную структуру: заголовки, таблицы, списки и текстовые блоки, в них сложная верстка и расположение блоков. Если обработать документы и разбить их на чанки неправильно, это негативно повлияет на качество ответа.
Цель этого гайда — продемонстрировать, как различаются результаты, когда мы используем базовую нарезку на чанки из langchain и более продвинутую нарезку CompressaChunking, которая учитывает структуру документа и например, распознает таблицы.
Наш гайд будет включать следующие шаги:
- Загрузка финансовой PDF презентации и нарезка на чанки с помощью langchain
- Повторение базового langchain RAG пайплайна из гайда "Базовый RAG за 15 минут"
- Проверка работы пайплайна на тестовых вопросах
- Улучшение качества chunking процесса
- Повторное тестирование и оценка результатов
2. Подготовка окружения
Установим и импортируем необходимые библиотеки:
#!pip install langchain
#!pip install langchain-compressa
#!pip install langchain_community
#!pip install requests
#!pip install beautifulsoup4
#!pip install gdown
#!pip install faiss-cpu - если вы запускаете на CPU
#!pip install faiss-gpu - если вы запускаете на GPU с поддержкой CUDA
import os
import requests
import gdown
from bs4 import BeautifulSoup
from langchain_compressa import CompressaEmbeddings, ChatCompressa
from langchain_core.documents import Document
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_core.prompts import ChatPromptTemplate
from langchain.chains import create_retrieval_chain
from langchain_community.vectorstores import FAISS
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain.document_loaders import PyPDFLoader
Для ячейки ниже вам понадобится API ключ Compressa. Вы можете получить его после регистрации.
os.environ["COMPRESSA_API_KEY"] = "ваш_ключ"
# Если вы запускаете локально на Macbook, укажите также следующие переменные в окружении
# os.environ["TOKENIZERS_PARALLELISM"] = "false"
# os.environ["KMP_DUPLICATE_LIB_OK"] = "TRUE"