Найти в Дзене
Нейросети на Apple

Как заставить нейросеть отвечать используя вашу базу знаний бесплатно с помощью RAG. Часть II. Практика

Оглавление

О теории метода RAG, реализуемого программно, можно почитать в моей статье

Программная реализация

Программно метод RAG можно реализовать на языке программирования python. Я буду приводить пример, как я реализовал метод используя python на операционной системе MacOS. Реализация на других операционных системах может отличаться из-за совместимости используемых пакетов.

Шаг первый. Готовим векторную базу данных

Векторную базу данных я готовлю с помощью скрипта create_database_pdf.py. Ниже я буду приводить выдержки их него, снабжая комментариями

Функция извлечения текста из PDF
Функция извлечения текста из PDF

Объявляем функцию, которая извлекает текст из PDF файлов и запоминает номер страницы из которой текст был извлечен. Номера страниц запоминаются, что бы при получении ответа понять, с какой именно страницы был извлечен чанк для подготовки ответа.

Функция разбивки текста на чанки
Функция разбивки текста на чанки

Объявляем функцию, которая разбивает текст, поступающий на вход на чанки. Перекрытие(overlap) - это параметр, который отвечает на сколько следующий chank заступает на предыдущий. Это позволяет более точно подбирать нужные сhunks. В противном случае, ключевая информация может быть обрезана и остаться в предыдущем кусочке текста, не попав к контекст для нейросети.

Определение переменных и списков
Определение переменных и списков

Определяем основные переменные и списки используемые в коде. Для хранения данных я выбрал векторную базу данных Chromadb, которая хорошо подходит для таких задач.

Разбиваем текст на чанки, добавляя метаданные
Разбиваем текст на чанки, добавляя метаданные

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

Объявление и вставка чанков в векторную базу данных
Объявление и вставка чанков в векторную базу данных

Чанки в векторном представлении добавляем к коллекцию нашей базы данных. Вместе с чашками записываем метаданные, которые включают в себя документ и страницу документа, из которого был взят кусочек, а так же его идентификатор.

Код для вывода отладочной информации
Код для вывода отладочной информации

В конце добавляем код, для вывода информации о том, как прошло создание векторной базы данных на основе PDF файлов. Данная информация будет полезна для отладки и что бы понять, все прошло хорошо.

Отладочная информация
Отладочная информация

Из вывода в терминале мы видим, что в результате работы скрипта был разбит 1 документ (это PDF с правилами к игре Манчкин) на 56 чанков. Кроме того выводится пример такого чанка с методанными, а именно:

  • ID чанка
  • Имя документа из которого этот чанк
  • Номер страницы документа из которого этот чанк
  • Сам контент(текст) чанка

Шаг второй. Готовим запрос, отправляем его языковой модели и получаем ответ

Готовить запрос, отправлять языковой модели и получать от нее ответ я буду с помощью скрипта create_database_pdf.py

Определение переменных
Определение переменных

Определяем основные переменные и списки используемые в коде.

-10

Описываем шаблон запроса к нейросети (промпта)

Функция поиска чанков и генерации промпта
Функция поиска чанков и генерации промпта

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

Функция отправки промпта языковой модели.
Функция отправки промпта языковой модели.

Объявляем функцию, которая будет отправлять получившийся промпт на развернутый с помощью LM Studio локально сервер с языковой моделью. При необходимости промт, можно отправлять не на локальный сервер, а на сервер c ChatGPT или с другой языковой моделью.

О том, что такое LM Studio и как ей пользоваться можно почитать в моей статье

Направляем промтп языковой модели и получаем от нее ответ
Направляем промтп языковой модели и получаем от нее ответ

Используя объявленный выше функции направляем промтп языковой модели и получаем от нее ответ.

Запустить скрипт, можно следующим образом, в качестве аргумента передав запрос.

python ask.py "Что такое бродячая тварь?"

Обработав наш запрос, скрипт подготовит следующим промпт

Готовый промпт
Готовый промпт
Обработка промпта и подготовка ответа
Обработка промпта и подготовка ответа

Локальный сервер с языковой моделью получает наш промпт и готовит на него ответ

-16

В ответ от языковой модели мы получаем актуальный ответ, соответствующий запросу на основе данных из нашей базы знаний.

Вы прекрасны!

Исходный код

Исходный код можно найти на моем GitHub

GitHub - Ivan-Inby/python-rag

😇 Если вам интересна тема нейросетей, то подписывайтесь на мой канал telegram.