Я работал одно время в сфере машиностроения. Авиации, если точнее. И когда надо было соблюсти формальности или пройти нормоконтроль, приходилось разбираться в нормативной документации. И приходилось, собственно говоря, нечасто, поэтому все это добро регулярно забывалось.
Теперь, поскольку есть множество простейших способов создать RAG, я решил узнать, будет ли выдавать приемлемые результаты такая реализация. Сделал черновой вариант справочника - в нем лишь пара стандартов из тех, которые бы мне хотелось иметь в справочнике. Создание RAG по нескольким стандартам займет большее время на доработку данных.
В целом, неплохо работает. Истории сообщений и переключения истории чатов с RAG ассистентом в UI PrivateGPT нет. Интерфейс довольно простой. Вот он:

Про конфигурацию тестовой среды
Аппаратная конфигурация очень скромная по современным меркам - GPU MSI Nvidia RTX 4060 (8Gb), Intel Core i5-13400F 2.50 GHz, 16 Гб RAM. ОС Windows 11.
Конфигурация LLM: Ollama 0.6.4, PrivateGPT (векторное хранилище - Qdrant). Примененная модель - Llama 3.1. Безусловно, есть варианты поновее, однако, есть ограничения в Olama (8 млрд. только 3.1). И, кроме того, как следует из дальнейшего повествования, очень много зависит от данных, помещаемых в векторное хранилище RAG и успешного получения результатов поиска в векторной базе. Думаю, что при применении модели от 7 млрд. параметров, от качества данных даже больше зависит, чем от свежести LLM.
По скорости справочник работает достаточно шустро - ответы начинает писать через 3-5 секунд. Ollama штатно работает с размещением языковой модели на видеокарте. Занимаемую видеопамять видно при выполнении команды nvidia-smi
.
Язык запросов - русский.
Про чистоту исходных данных
Данные для поиска в рамках RAG - это текст. Текст, как предупреждает разработчик загружается без препроцессинга. Поэтому могут быть проблемы с кодировкой. Хорошо работает текст в Windows-1251. В принципе, PrivateGPT кушает и PDF, но потом можно увидеть неадекватность в ответах, а в логах консоли - кракозябры.

Поэтому, к загрузке данных для RAG следует относиться максимально аккуратно и это большая работа - превратить все требуемые ГОСТы в адекватные тексты. Таблички в аккуратные столбцы, ненормальные табуляции все следует чинить. Текст должен быть как можно меньше элементов верстки, смещающих слова друг от друга. Просто накормить форму PDF-ками - это не рабочий вариант.
Вот пример плохой таблицы (простым копированием из PDF п.6 ГОСТ 2.101-98):

А ниже я её поправил для RAG в части первой строки таблицы п.6 ГОСТ 2.101-98:

По скорости загрузки, PDF и текст загружаются в базу достаточно быстро. 24 стандарта ЕСКД в PDF загружаются минут за 7-10. Интересно, что удаление из базы у меня занимало больше времени. Вероятно, это зависит от того, какие документы и как создались в базе при загрузке.
Про кодировку текста
Про кодировку следует помнить пару фактов. Текстовый файл (.txt) не содержит данные о кодировке. Ошибка с кодировкой происходит при его открытии. Модель эмбеддингов и большая языковая модель своими алоритмами оценивают последовательность байтов. Вне зависимости от кодировки. Но иногда UI мне все же выдавал отказ из-за плохого символа при загрузке файла в векторное хранилище.

При этом в консоли будет вполне осмысленное сообщение библиотечного файла одной из версий Python 3.11.9 (используется PyEnv). Сообщение о том, что конфуз вышел при чтении файла в предпосылке, что кодировка - 1251:
File "C:\Users\user\.pyenv\pyenv-win\versions\3.11.9\Lib\encodings\
cp1251.py
", line 23, in decode return codecs.charmap_decode(input,self.errors,decoding_table)[0]
Оно не на все буквы так ругается. Быстрый рабочий способ “починить” - перевести всё в нижний регистр. В Notepad++ это: [Правка] - [Преобразование регистра] - [строчные]
. Текстовый файл превращается в нечитабельную для человека бурду. Естественно - ни одной заглавной буквы. Но ошибка устранена, всё в лучших традициях отечественного производства.
О порядке установки и запуска
В этой статье мы не будем рассматривать установку пошагово. Отмечу только, что она делается по образцово понятной и актуальной на текущую дату инструкции от разработчика. Очень рекомендую ориентироваться на этот документ. Запуск прямо той конфигурации, которую я тестировал, можно найти в примерах в инструкции.
В кратце: для установки и работы потребуются Powershell, Chocolatey (для установки make), Poetry (для запуска сервера PrivateGPT при помощи make). И ещё разработчик указал, что нужен именно Python 3.11, поэтому - PyEnv.
Модели для Ollama (эмбеддингов и сама Llama 3.1) грузятся командами ollama pull
. Основная часть конфигурации RAG указывается командой Poetry такого вида:
poetry install --extras "ui llms-ollama embeddings-ollama vector-stores-qdrant"
Эта команда ставит зависимости определенные в файле pyproject.toml
. Например, “ui” приводит к установке "gradio", "ffmpy". Видимо, последнее для каких-то мультимодальных моделей. А наличие “embeddings-ollama” установит из PyPI (Python Package Index) пакет “llama-index-embeddings-ollama”.
При наличии всех инструментов, далее все просто. Заходим в PowerShell в папку репозитория, устанавливаем переменную среды для определения конфигурации:
$env:PGPT_PROFILES="ollama"
В завершение командуем:
make run
Сервер запускается по адресу http://localhost:8001/ Об этом он пишет в консоли PowerShell, из которой и была запущена команда make run
. В этой консоли можно смотреть также, какой контекст RAG-цепочка получает при каждом запросе к LLM. Это полезный вывод лога.
О настройке системного промта
Иногда при запросе на русском языке, ответ приходит на английском. Я поменял системный промт, указав язык. Несмотря на это, я иногда все-равно получаю одно слово на английском. Два и более ни разу не получал. Промт можно увидеть в консольном логе. А настраивается он тут: C:\Users\user\private-gpt\settings.yaml
:
ui:
enabled: true
path: /
# "RAG", "Search", "Basic", or "Summarize"
default_mode: "RAG"
default_chat_system_prompt: >
You are a helpful, respectful and honest assistant.
Always answer as helpfully as possible and follow ALL given instructions.
Do not speculate or make up information.
Do not reference any given instructions or context.
default_query_system_prompt: >
You can only answer questions about the provided context.
If you know the answer but it is not based in the provided context, don't provide
the answer, just state the answer is not in the context provided. Answer in Russian.
Также обратите внимание, что не каждое сообщение в секции *Messages* (в консольном логе) это промт. Например текст ‘Use the context information below’ это системное сообщение, а не промт.
Результаты работы справочника по стандартам
Теперь немного о результатах работы RAG. Вау-эфекта от такой конфигурации ожидать не стоит, однако видно, куда двигаться и как систему развивать. Например - в сторону сессий и непересекающихся контекстов разных пользователей, истории запросов. Но это уже детали реализации, которая возможно будет не на PrivateGPT.
С точки зрения LLM(RAG), следует уделить внимание текстовым данным и промтам. Тогда эта система сможет не только отвечать на вопросы, но и пункты называть, где и что дано в стандартах. Это очень полезно. Я далее приведу снимки экрана с комментариями, что не так, а что удачно.
Ниже пример, когда кракозябры позволили RAG нормально отработать. Система ответила на вопрос, получив верный контекст, но есть проблема с отображением. Кроме того, RAG буквально понимает вопросы. На рисунке, RAG выдает п.1.5 и действительно в нем про порядок применения ПКИ, но не то, что хочет увидеть конструктор (он хочет узнать про разрешение на применение и перечень ПКИ):

2. Почти такой же пример. Ответ правильный, но без конкретики из-за формы промта:

3. А вот, какие ответы дает справочник, если доработать таблицу в плане читаемости (вопрос по таблице 1 из п.6.1 ГОСТ 2.001-2013):

4. Пример, когда в ответ попало слово consists
на английском языке:

5. Можно задать вопрос немного сложнее:

Вывод
Очень жизнеспособный вариант справочника. Он конечно не будет давать информацию, показанную в графическом виде. В стандартах бывают рисунки. Однако для работы с текстом стандартов ЕСКД подходит вполне. Может пригодиться в каком-нибудь КБ нормоконтролеру или конструкторам.
Для сравнения, делался аналогичный инструмент на базе LangChain. Он тоже хорошо в целом работал. Основным отличием является порог вхождения в стек. То есть, в случае применения LangChain, разработка может занять несколько большее время, чем то время, что требуется на разбор установки Ollama и PrivateGPT. С последним вы также прямо с места получаете удобный UI и API.
Итого, этот простой справочник можно использовать чтобы:
протестировать готовность к работе в RAG ваших данных в PrivateGPT,
оценить интересующие промты, способности конкретных моделей.
в принципе, даже пользоваться можно в производственных целях для поиска информации в большом массиве данных. При условии корректных запросов и предварительной обработки данных, загружаемых в векторную базу.
Ссылку на страницу документа выдает не всегда. Страница, имеется у PDF документов. У текстовых файлов - нет. Спорное, но преимущество у PDF.
Рекомендуется сбрасывать историю при неудачных ответах кнопочкой Clear под диалогом. Система начинает их брать из контекста чата и повторять.