Методы построения RAG систем

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Процесс Retrieval-Augmented Generation (RAG) представляет собой довольно сложную систему, состоящую из множества компонентов. Вопрос о том, как определить существующие методы RAG и их оптимальные комбинации для выявления лучших практик, в настоящий момент остается наиболее актуальным. В этой статье я хочу поделиться своим опытом относительно реализации подходов и практик в области RAG систем, который реализует систематический подход к решению этой проблемы.

Типовые задачи процессов RAG систем

  • Классификация запросов,

  • Деление на фрагменты

  • Векторизация данных

  • Поиск,

  • Переранжирование,

  • Обобщение данных .

  • Генерация ответа

Каждый из этих этапов играет важную роль в обеспечении точности и эффективности системы. Например, классификация запросов помогает определить, нужно ли вообще выполнять поиск, что может значительно сократить время обработки. Переранжирование и переупаковка документов улучшают релевантность результатов, а обобщение помогает устранить избыточность и улучшить качество ответов.

На мой взгляд, ключевая сложность RAG заключается в том, что каждый этап требует тщательной настройки и выбора оптимальных методов. Например, как выбрать размер фрагментов для поиска? Какую эмбеддинг модель использовать? Эти вопросы требуют не только теоретического анализа, но и практических экспериментов.

Попробуем рассмотреть все этапы разработки участвующие в структуре обработке данных RAG систем

Типовая карта разработки RAG систем
Типовая карта разработки RAG систем

Как видно из визуализации необходимых шагов разработки, задачи делятся на три уровня уровень подготовки, обработки и классификации запроса, уровень подготовки, разделения, векторизации и хранения документов и уровень переранжирования, генерации и обобщения ответа. Схематично все этапы можно представить в виде схемы:

Рассмотрим все этапы поочередно.

Классификация запросов

Классификация запросов — это первый шаг, который позволяет определить, нужен ли поиск вообще. Не все запросы требуют дополнительного поиска, особенно если LLM (Large Language Model) модель уже обладает достаточными знаниями. Например, если запрос основан исключительно на информации, предоставленной пользователем, поиск может быть излишним.

Определяем тип запроса:

  • Фактический поиск (например, «Сколько стоит построить дом?»)

  • Мнение или оценка («Что лучше кирпич или каркас?»)

  • Рассуждение или синтез информации («Где лучше выбирать землю для строительства»)

  • Личный или неформальный запрос («Как ты думаешь лучше построить дом или жить в квартире?»)

Выбираем стратегию поиска:

  • Если запрос требует фактической информации, задействуется поиск в базе знаний или векторный поиск.

  • Если запрос сложный, комбинируется несколько источников информации.

  • Если ответ можно дать без поиска, LLM модель отвечает напрямую.

Производим фильтрацию и модерацию:

  • Проверка на запрещённый контент, токсичность, конфиденциальные данные.

  • Обнаружение нерелевантных или потенциально вредных запросов.

Методы классификации запросов

  • Лингвистический анализ (разбор структуры предложения, ключевых слов).

  • ML-модели классификации (обученные на размеченных данных, например, BERT или GPT).

  • Правила и эвристики (например, наличие вопросительных слов или ключевых фраз).

Пример классификации запросов с использованием библиотеки transformers и модели BERT

import torch
from transformers import pipeline

# Загружаем предобученную модель для классификации
classifier = pipeline("zero-shot-classification", model="facebook/bart-large-mnli")

# Возможные классы запросов
labels = ["фактический поиск", "мнение", "рассуждение", "личный вопрос", "неопределённый"]

# Функция классификации запроса
def classify_query(query):
    result = classifier(query, candidate_labels=labels)
    return result["labels"][0], result["scores"][0]

# Примеры запросов
queries = [
    "Сколько стоит построить дом?",
    "Как ты думаешь, погрузчик лучше, чем экскаватор?",
    "Объясни принципы работы ДВС.",
    "Стоит ли мне переехать в другой город?",
    "Просто хочу поговорить."
]

# Классифицируем запросы
for query in queries:
    label, score = classify_query(query)
    print(f"Запрос: {query}\nКлассификация: {label} (уверенность: {score:.2f})\n")

Результат выполнения:

Запрос: Сколько стоит построить дом?
Классификация: фактический поиск (уверенность: 0.24)

Запрос: Как ты думаешь, погрузчик лучше, чем экскаватор?
Классификация: личный вопрос (уверенность: 0.28)

Запрос: Объясни принципы работы ДВС.
Классификация: рассуждение (уверенность: 0.34)

Запрос: Стоит ли мне переехать в другой город?
Классификация: мнение (уверенность: 0.30)

Запрос: Просто хочу поговорить.
Классификация: рассуждение (уверенность: 0.26)

На мой взгляд автоматизация этого процесса с помощью классификатора — это лучшее решение. Однако важно учитывать, что классификатор должен быть обучен на разнообразных данных, чтобы избежать ошибок в реальных сценариях.

Разделение на части

Разделение документов на фрагменты — это критически важный этап, который влияет на точность поиска. В основе лежит три уровня фрагментации: на уровне токенов, семантическая фрагментация и фрагментация на уровне предложений. На мой взгляд, фрагментация на уровне предложений является наиболее сбалансированным подходом, так как она сохраняет семантику текста, оставаясь при этом достаточно простой для реализации.

В RAG разделение документов на фрагменты (chunking) — один из кючевых этапов, который влияет на эффективность поиска и генерации ответов. В этом процессе определяется, какие части текста будут использоваться для векторного представления и поиска в дальнейшем.
Зачем делить?

  1. Что бы оптимизировать поиск, поскольку векторные поисковые системы ( FAISS, Chroma, Weaviate) работают эффективнее с короткими фрагментами.

  2. Чтобы снизить поисковый шум, поскольку при индексации слишком больших кусков текста, поиск может выдавать нерелевантные результаты.

  3. Чтобы обеспечить контекстную релевантность, поскольку разбиение помогает извлекать только нужную информацию и не перегружать LLM лишними данными. Как делить?

  4. Кусками фиксированными по размеру (Fixed-length chunking) Разделение текста на куски фиксированной длины, например, по 512 или 1024 токена. Плюсы: ✔ Простая реализация. ✔ Хорошо работает с длинными документами. Минусы: ✖ Может разделять связанный контекст. ✖ Потеря смысла при разрыве на границе.

  5. Семантическими кусками (Semantic chunking) Использует модели NLP (например, BERT) для разбиения по смысловым блокам (абзацы, заголовки, смысловые единицы). Плюсы: ✔ Сохраняет логическую целостность. ✔ Улучшает точность поиска. Минусы: ✖ Более сложная реализация. ✖ Может приводить к неравномерным размерам фрагментов.

  6. По структурным элементам (Structural chunking) Использует разбиение по логическим единицам документа (заголовки, списки, таблицы). Плюсы: ✔ Хорошо подходит для технических документов, статей и справочников. ✔ Сохраняет контекст. Минусы: ✖ Требует предварительной обработки документов. ✖ Не всегда применимо к неструктурированным данным.

Пример фиксированного разделения по 512 токенов

from transformers import AutoTokenizer

# Загружаем токенизатор (используем BERT)
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")

def chunk_text(text, max_tokens=512):
    tokens = tokenizer.encode(text, add_special_tokens=False)
    chunks = [tokens[i:i+max_tokens] for i in range(0, len(tokens), max_tokens)]
    return [tokenizer.decode(chunk) for chunk in chunks]

# Тестовый текст
text = "Иску́сственный интелле́кт (англ. artificial intelligence; AI) в самом широком смысле — это интеллект, демонстрируемый машинами, в частности компьютерными системами. Это область исследований в области компьютерных наук, которая разрабатывает и изучает методы и программное обеспечение, позволяющие машинам воспринимать окружающую среду и использовать обучение и интеллект для выполнения действий, которые максимально увеличивают их шансы на достижение поставленных целей[1]. Такие машины можно назвать искусственным интеллектом. Некоторые из наиболее известных приложений искусственного интеллекта включают в себя передовые поисковые системы (например, Google Search, Bing, Яндекс); рекомендательные системы (используемые на YouTube, Amazon и Netflix); взаимодействие посредством человеческой речи (например, Google Assistant, Siri, Alexa, Алиса); автономные транспортные средства (например, Waymo); генеративные и творческие инструменты (например, ChatGPT, Apple Intelligence и искусство искусственного интеллекта); а также сверхчеловеческую игру и анализ в стратегических играх (например, шахматы и го). Однако многие приложения искусственного интеллекта не воспринимаются как искусственный интеллект: «Многие передовые разработки искусственного интеллекта проникли в общие приложения, часто не называясь искусственным интеллектом, потому что как только что-то становится достаточно полезным и достаточно распространённым, его больше не называют искусственным интеллектом»[2][3]. Алан Тьюринг был первым человеком, который провёл масштабные исследования в области, которую он назвал машинным интеллектом[4]. Искусственный интеллект был основан как академическая дисциплина в 1956 году[5] теми, кого сейчас считают отцами-основателями искусственного интеллекта: Джоном Маккарти, Марвином Мински, Натаниэлем Рочестером[англ.] и Клодом Шенноном[6][7]. Эта область пережила несколько циклов оптимизма[8], за которыми последовали периоды разочарования и потери финансирования, известные как зима искусственного интеллекта[9]. Финансирование и интерес значительно возросли после 2012 года, когда глубокое обучение превзошло все предыдущие методы искусственного интеллекта[10], а также после 2017 года с появлением архитектуры Transformer[11]. Это привело к буму искусственного интеллекта в начале 2020-х годов, когда компании, университеты и лаборатории, в подавляющем большинстве базирующиеся в Соединённых Штатах, стали пионерами значительных достижений в области искусственного интеллекта[12]. Растущее использование искусственного интеллекта в XXI веке влияет на общественный и экономический сдвиг в сторону большей автоматизации, принятия решений на основе данных и интеграции систем искусственного интеллекта в различные секторы экономики и сферы жизни, влияя на рынки труда, здравоохранение, государственное управление, промышленность, образование, пропаганду и дезинформацию. Это поднимает вопросы о долгосрочных эффектах, этических последствиях и рисках искусственного интеллекта, побуждая к обсуждениям о политике регулирования, направленной на обеспечение безопасности и преимуществ этой технологии. Различные направления исследований искусственного интеллекта сосредоточены вокруг определённых целей и использования определённых инструментов. Традиционные цели исследований искусственного интеллекта включают рассуждение, представление знаний, планирование, обучение, обработку естественного языка, восприятие и поддержку робототехники[13]. Общий интеллект, или же сильный, — способность выполнять любую задачу, которую может выполнить человек, по крайней мере на равном уровне — входит в число долгосрочных целей данной области[14]. Для достижения этих целей исследователи искусственного интеллекта адаптировали и интегрировали широкий спектр методов, включая поиск и математическую оптимизацию, формальную логику, искусственные нейронные сети, а также методы, основанные на статистике, исследовании операций и экономике[13]. Искусственный интеллект также опирается на психологию, лингвистику, философию, нейронауку и другие области[15]."

# Разбиваем на куски по 512 токенов
chunks = chunk_text(text)

for i, chunk in enumerate(chunks):
    print(f"Фрагмент {i+1}:\n{chunk}\n")

Результат выполнения:

Фрагмент 1: искусственный интеллект ( англ. artificial intelligence ; ai ) в самом широком смысле — это интеллект, демонстрируемыи машинами, в частности компьютерными системами. это область исследовании в области компьютерных наук, которая разрабатывает и изучает методы и программное обеспечение, позволяющие машинам воспринимать окружающую среду и использовать обучение и интеллект для выполнения деиствии, которые максимально увеличивают их шансы на достижение поставленных целеи [ 1 ]. такие машины можно назвать искусственным интеллектом. некоторые из наиболее известных приложении искусственного интеллекта включают в себя пере

Фрагмент 2: ##довые поисковые системы ( например, google search, bing, яндекс ) ; рекомендательные системы ( используемые на youtube, amazon и netflix ) ; взаимодействие посредством человеческой речи ( например, google assistant, siri, alexa, Алиса ) ; автономные транспортные средства ( например, waymo ) ; генеративные и творческие инструменты ( например, chatgpt, apple intelligence и искусство искусственного интеллекта ) ; а также сверхчеловеческую игру и анализ в стратегических играх ( например, шахматы и го ). однако многие приложения искусственного интеллекта не воспринимаются как искусственный интеллект: « многие передовые разработки искусственного интеллекта проникли в общие приложен

Фрагмент 3: ##ия, часто не называясь искусственным интеллектом, потому что как только что - то становится достаточно полезным и достаточно распространенным, его больше не называют искусственным интеллектом » [ 2 ] [ 3 ]. алан тьюринг был первым человеком, который провел масштабные исследования в области, которую он назвал машинным интеллектом [ 4 ]. искусственный интеллект был основан как академическая дисциплина в 1956 году [ 5 ] теми, кого сеичас считают отцами - основателями искусственного интеллекта : джоном маккарти, марвином мински, натаниэлем рочестером [ англ. ] и клодом шенноном [ 6 ] [ 7 ]. эта область пережила несколько цикл

Пример семантического разделения с использованием spaCy для разбиения текста на смысловые блоки:

import spacy

# Загружаем модель NLP
nlp = spacy.load("ru_core_news_sm")  

def semantic_chunking(text, max_sentences=3):
 
    doc = nlp(text)
    sentences = [sent.text for sent in doc.sents]
    
    # Группируем предложения по max_sentences
    chunks = []
    for i in range(0, len(sentences), max_sentences):
        chunk = " ".join(sentences[i:i+max_sentences])
        chunks.append(chunk)
    
    return chunks

# Пример текста
text = "Иску́сственный интелле́кт (англ. artificial intelligence; AI) в самом широком смысле — это интеллект, демонстрируемый машинами, в частности компьютерными системами. Это область исследований в области компьютерных наук, которая разрабатывает и изучает методы и программное обеспечение, позволяющие машинам воспринимать окружающую среду и использовать обучение и интеллект для выполнения действий, которые максимально увеличивают их шансы на достижение поставленных целей[1]. Такие машины можно назвать искусственным интеллектом. Некоторые из наиболее известных приложений искусственного интеллекта включают в себя передовые поисковые системы (например, Google Search, Bing, Яндекс); рекомендательные системы (используемые на YouTube, Amazon и Netflix); взаимодействие посредством человеческой речи (например, Google Assistant, Siri, Alexa, Алиса); автономные транспортные средства (например, Waymo); генеративные и творческие инструменты (например, ChatGPT, Apple Intelligence и искусство искусственного интеллекта); а также сверхчеловеческую игру и анализ в стратегических играх (например, шахматы и го). Однако многие приложения искусственного интеллекта не воспринимаются как искусственный интеллект: «Многие передовые разработки искусственного интеллекта проникли в общие приложения, часто не называясь искусственным интеллектом, потому что как только что-то становится достаточно полезным и достаточно распространённым, его больше не называют искусственным интеллектом»[2][3]. Алан Тьюринг был первым человеком, который провёл масштабные исследования в области, которую он назвал машинным интеллектом[4]. Искусственный интеллект был основан как академическая дисциплина в 1956 году[5] теми, кого сейчас считают отцами-основателями искусственного интеллекта: Джоном Маккарти, Марвином Мински, Натаниэлем Рочестером[англ.] и Клодом Шенноном[6][7]. Эта область пережила несколько циклов оптимизма[8], за которыми последовали периоды разочарования и потери финансирования, известные как зима искусственного интеллекта[9]. Финансирование и интерес значительно возросли после 2012 года, когда глубокое обучение превзошло все предыдущие методы искусственного интеллекта[10], а также после 2017 года с появлением архитектуры Transformer[11]. Это привело к буму искусственного интеллекта в начале 2020-х годов, когда компании, университеты и лаборатории, в подавляющем большинстве базирующиеся в Соединённых Штатах, стали пионерами значительных достижений в области искусственного интеллекта[12]. Растущее использование искусственного интеллекта в XXI веке влияет на общественный и экономический сдвиг в сторону большей автоматизации, принятия решений на основе данных и интеграции систем искусственного интеллекта в различные секторы экономики и сферы жизни, влияя на рынки труда, здравоохранение, государственное управление, промышленность, образование, пропаганду и дезинформацию. Это поднимает вопросы о долгосрочных эффектах, этических последствиях и рисках искусственного интеллекта, побуждая к обсуждениям о политике регулирования, направленной на обеспечение безопасности и преимуществ этой технологии. Различные направления исследований искусственного интеллекта сосредоточены вокруг определённых целей и использования определённых инструментов. Традиционные цели исследований искусственного интеллекта включают рассуждение, представление знаний, планирование, обучение, обработку естественного языка, восприятие и поддержку робототехники[13]. Общий интеллект, или же сильный, — способность выполнять любую задачу, которую может выполнить человек, по крайней мере на равном уровне — входит в число долгосрочных целей данной области[14]. Для достижения этих целей исследователи искусственного интеллекта адаптировали и интегрировали широкий спектр методов, включая поиск и математическую оптимизацию, формальную логику, искусственные нейронные сети, а также методы, основанные на статистике, исследовании операций и экономике[13]. Искусственный интеллект также опирается на психологию, лингвистику, философию, нейронауку и другие области[15]."


# Разделяем на семантические фрагменты
chunks = semantic_chunking(text)

# Вывод результатов
for i, chunk in enumerate(chunks):
    print(f"						
Источник: https://habr.com/ru/articles/881268/


Интересные статьи

Интересные статьи

Стартап Figure AI, занимающийся разработкой человекоподобных роботов, во вторник объявил о прекращении сотрудничества с OpenAI и о намерении разрабатывать собственные модели искусственного интеллекта....
Когда я пользуюсь сайтом, я хочу, чтобы поиск был максимально простым и удобным. Мы все уже привыкли к тому, как работают умные системы вроде Google или Яндекса, поэтому от любой другой поисковой стро...
Привет, Хабр! Меня зовут Анастасия, я QA-специалист SimbirSoft и работаю на проектах с 1С-Битрикс. Не единожды я могла наблюдать, насколько эффективно бывает допустить QA-команду внутрь CMS, чтобы дос...
Привет! Меня зовут Виктория Кабыткина, я работаю старшим системным аналитиком в компании Lamoda. По своему опыту как в банковской сфере, так и в сфере e-commerce, могу заметить, что во многих компания...
Всем привет. Когда я искал информацию о журналировании (аудите событий) в Bitrix, на Хабре не было ни чего, в остальном рунете кое что было, но кто же там найдёт? Для пополнения базы знаний...