Pull to refresh
110.7

Как приручить нейросеть: практический опыт

Reading time5 min
Views18K

Итак, в прошлой статье я уже немного рассказывал о том, что с LLM можно работать и даже построить определенный RAG. Как и обещал, перейдем к практике! :)

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

Начнем с того, что вам понадобится довольно мощный компьютер, о чем я уже говорил в прошлой статье, а также:

  • Установить LM Studio, дабы было проще работать с локальной моделью.

  • Установить NPM 18+ версии, он требуется для Flowise

  • Docker

  • Git

  • Postman или аналог

  • Ну и, собственно, установить сам Flowise

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

Что ж, время перейти в LM Studio, будем загружать саму языковую модельку для “очеловечевания” нашей системки. Я остановил свой выбор на IlyaGusev/saiga_mistral_7b_gguf в q4 исполнении, так как:

  • Она построена на основе mistral, что уже хорошо.

  • Она работает с русским языком.

  • 7 миллиардов параметров для наших задач будет достаточно.

  • Для нее хватит не заоблачно мощного железа.

Прямо в поиске в самой LM Studio пишем название данной модельки, находим q4 исполнение и тыкаем на Download.

Пока наша модель качается, можем заняться запуском Flowise. Для этого:

  • Сначала установка npm install -g flowise (это нужно сделать только один раз).

  • Сам старт npx flowise start.

Стартует оно быстро, и после появления в консольки информации, что flowise стартанул, куда-нибудь сворачиваем окно консоли и не закрываем, пока не закончим работу с flowise. Переходим на нашу локалочку, по умолчанию все должно было стартануть тут.

Можно долго рассказывать, что тут можно потыкать, но у нас ведь конкретная цель сейчас :) Так что тыкаем на Add New.

У нас открывается непаханое поле возможностей для создания какой-либо цепочки.

В самом левом углу можно увидеть иконку “+”, она-то и развернет нам список инструментов. Тут мы узрим множество компонентов для создания нашего RAG. Перво-наперво у нас есть выбор между LangChain и LlamaIndex, фреймворками, на которых у нас будет собираться весь этот RAG. В момент написание статьи LlamaIndex в Flowise находится на стадии Beta, так что в будущем все может немного измениться. На данный момент мы будем использовать LangChain.

Начнем с добавления в Flow самой Chain, нам подойдет Conversational Retrieval QA Chain. Выглядеть его компонент будет следующим образом:

Если кратко, то Chat Model - это непосредственно наша LLM модель которая будет “очеловечивать” и обрабатывать наши запросы и контент, который будет получать. Vector Store Retriver будет хранить в себе нашу базу знаний, чтобы брать оттуда необходимую нам информацию. Memory отвечает за хранение контекста нашего разговора с моделью. Переключалка Return Source Documents - Additional Parameters позволит нам добавить prompt для общения с моделью. Это мы пока не трогаем.

Теперь возвращаемся в нашу LM Studio, модель уже должна была скачаться. Переходим в раздел с чатами.

 

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

Теперь, когда мы убедились, что на этом этапе проблем у нас нет, переходим в следующий раздел (кнопка в левом меню под чатом), рекомендую выполнить настройки и включить ускорение с помощью GPU. Не для всех это будет актуально, и количество слоев будет подбираться эмпирически. Также длина контекста, будет стоять по умолчанию 2048 токенов, я бы рекомендовал использовать больше. После конфигурации тыкаем на Start Server и идем обратно в Flowise.

Теперь конфигурируем подключение к нашей модели. Возьмем компонент Chat Model, так как мы хотим иметь все локально, выбираем ChatLocalAI и соединяем его с нашим Chain. Теперь настраиваем креды, по стандарту LocalAI Api Key будет "not-needed", Base Path - “http://localhost:1234/v1”, а Model - "local-model". Temperature отвечает за то, насколько креативна наша модель, и насколько широко она будет отвечать. Я бы рекомендовал поставить 0.7 для нашей задачи.

Теперь добавим Vector Store Retriever, на данном этапе будем использовать In Memory, так как мы “щупаем” возможность, и нам не нужно долго хранить данные. В дальнейшем нам понадобится полноценная векторная база данных, например, Chroma, чтобы не проделывать загрузку файлов в нее каждый раз заново. Также подключаем ее к нашей цепи.

Теперь подключим саму возможность “закидывать” файлы в нашу систему. Для этого возьмем любой Document Loader из компонентов. Их там великое множество, и вам будет с чем поэкспериментировать :) Я выберу простой Text File. Его мы подсоединяем к In-memory vector store.

Затем нам нужен Text Splitter, дабы разбивать наш большой текст, который мы будем загружать на “чанки”. Это нужно, чтобы поместить в векторную БД адекватные размеры информации, и поиск проходил лучше. Берем Recursive, а размер чанка поставим на 500, это будет оптимально для небольшого текста с малым количество “воды”. “Чанки” в принципе лучше делать меньше, так как они будут помещать в контекст нашего “разговора” с ботом, значит, чем меньше чанк, тем эффективнее и быстрее будет обрабатываться информация. Chunk Overlap - 20, что указывает, так сказать, на то, сколько “чанков” вокруг имеют смысл друг от друга. Собственно, подключаем к нашему загрузчику файлов.

Теперь самое запарное: нам нужны embeddings. Этот компонент будет преобразовывать наши “чанки” из документа в вектора для базы данных, которые содержат в себе необходимую информацию для модели, которую она будет использовать в качестве контекста. Не пытайтесь понять на данном этапе, что такое вектор, ибо это специфический формат хранения данных, который используют нейросети.

Что ж, для локальной модельки которая будет создавать embeddings нам понадобится LocalAI, так как LM Studio не поддерживает такие модели.

  • Делаем Clone данного приложения.

  • Запускаем наш Doker desktop.

  • Переходим в папку с приложением и запускаем его docker-compose up -d –pull always. Процесс этот довольно долгий но получится должно что-то в этом духе

После того, как все это добро развернется, нам нужно загрузить туда модель. Для ее загрузки на локальный сервер нам потребуется через Postman выполнить POST запрос на http://127.0.0.1:8080/models/apply c телом:

{

    "url": "github:go-skynet/model-gallery/bert-embeddings.yaml",

    "name": "text-embedding-ada-002"

}

Если все сделали правильно, ответ будет примерно такой: 

{

    "uuid": "3f362765-c66f-11ee-a529-0242ac120002",

    "status": "http://127.0.0.1:8080/models/jobs/3f362765-c66f-11ee-a529-0242ac120002"

}

Возвращаемся в наш flowise и вставляем из вкладки Embeddings localAIEmbddings. В нем нам не требуется указывать Connect Credential, Basepath будет http://localhost:8080/v1, Model name - text-embedding-ada-002.

В конечном итоге должно получиться что-то в этом духе:


Долгожданный момент: идем заливать данные, собираем интересующую нас информацию в файлик и загружаем его в наш файлоприемник, используя кнопку Upload File.

Для тестов я возьму случайную статью из интернета.

После загрузки файлов, мы, наконец, можем попробовать, как будет работать наша системка. Для этого тыкаем на Save Chatflow, а затем на Upsert Vector Database. Это в правом верхнем углу. 

И теперь заходим в чатик и спрашиваем нашу систему, о том, что нас интересует)

Да, бесспорно, эта система не идеальна, но она работает с русским языком, абсолютно приватна и полностью бесплатна. На основе всего этого ужаса, который мы сегодня прошли можно и дальше развивать нашу систему и экспериментировать, например, попробовать другие модели или даже отказаться от них в пользу API других ресурсов.

К сожалению, мы упустили тему промптов, и как провернуть все тоже самое, используя один только LocalAI. Но возможно в следующих статьях мы применим непосредственно Python, Langchain или llama и будем писать RAG кодом, чтобы кастомизировать и использовать все это на полную катушку.

А теперь вынужден откланяться, статья и так получилась сильно больше, чем я ожидал. Удачи в ваших начинаниях, рад, если вы попробовали и у вас что-нибудь получилось на основе этого материала!

Tags:
Hubs:
Total votes 26: ↑26 and ↓0+26
Comments16

Articles

Information

Website
www.reksoft.ru
Registered
Founded
Employees
1,001–5,000 employees
Location
Россия