В этой статье мы покажем как можно очень быстро и просто развернуть собственный чатбот на базе OpenSource модели llama 3.1.
Использование локальных LLM (Large Language Models) имеет ряд преимуществ перед использованием облачного сервиса ChatGPT от OpenAI. В первую очередь это сохранение конфиденциальности вашей информации. Когда вы используете ChatGPT, все ваши запросы и загруженные документы собираются и хранятся на серверах OpenAI, а так же могут быть использованы при обучении будущих моделей, что может привести к утечке конфиденциальной информации. Локальные LLM модели, с другой стороны, можно развернуть на собственных серверах или даже на персональных компьютерах, гарантируя полный контроль над данными и отсутствие передачи конфиденциальной информации третьим лицам. Это не только обеспечивает более высокий уровень безопасности, но и позволяет организациям соблюдать требования по защите данных и соответствующую нормативную базу. Кроме того, локальные модели могут быть персонализированы и настроены в соответствии с конкретными потребностями организации, что может привести к повышению точности и полезности получаемых ответов. Это особенно важно для задач, требующих глубокого понимания предметной области или специфических знаний.
Модель, используемая в нашем учебном чатботе, не обладает никакой информацией о вашей компании, но ее легко можно научить работать с вашими документами и отвечать на вопросы по ним, используя подход RAG (Retrieval Augmented Generation). Правда такая доработка уже выходит за рамки данной статьи.
Разумеется, любая современная LLM требует серьезных вычислительных мощностей и для достижения сколь либо приемлемой скорости работы моделей вам потребуются видеокарты (GPU) с довольно большим объемом видеопамяти. Но покупать дорогие видеокарты на сегодняшний день нет необходимости, ведь их можно арендовать на почасовой основе. Наша компания предлагает линейку VDS Ultra с видеокартами от Nvidia.
Чтобы запустить такой VDS, достаточно в вашем личном кабинете перейти в раздел VDS, нажать на кнопку создания виртуальной машины (ВМ) и выбрать требуемую вам конфигурацию сервера, а также модель и количество видеокарт, которые вам необходимы. Предположим что вы всё это уже проделали и получили доступ к вновь созданной ВМ по ssh. Здесь и далее мы предполагаем что вы зашли на сервер от имени пользователя ubuntu, создаваемого по умолчанию.
Проверим что у нас есть доступ к видеокарте:
$ sudo nvidia-smi
Fri Aug  2 10:25:21 2024
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 550.54.15              Driver Version: 550.54.15      CUDA Version: 12.4     |
|-----------------------------------------+------------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
|                                         |                        |               MIG M. |
|=========================================+========================+======================|
|   0  NVIDIA RTX A5000               Off |   00000000:01:00.0 Off |                  Off |
| 30%   41C    P0             N/A /  230W |       0MiB /  24564MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+
+-----------------------------------------------------------------------------------------+
| Processes:                                                                              |
|  GPU   GI   CI        PID   Type   Process name                              GPU Memory |
|        ID   ID                                                               Usage      |
|=========================================================================================|
|  No running processes found                                                             |
+-----------------------------------------------------------------------------------------+
Видим что у нас есть видеокарта RTX A5000 с 24 ГБ видеопамяти. Значит мы можем загрузить в нее любую модель размером приблизительно до 20 ГБ, с учетом того что нам нужно оставить какой-то объем памяти под кеши и контекст запросов.
Ollama представляет на сегодняшний день наиболее простой и быстрый способ запуска LLM и предоставляет к ним API, совместимое с форматом запросов OpenAI, так что вы можете использовать для работы с вашей LLM те же библиотеки и тот же код, что и для работы с ChatGPT. Установка ollama делается очень просто:
$ sudo curl -fsSL https://ollama.com/install.sh | sh
Теперь нам надо решить какую модель использовать, какой размер модели и уровень квантизации выбрать. Модель llama3.1 размером 8 миллиардов параметров с квантизацией 8 бит (что такое квантизация?) имеет размер 8,5 ГБ (подробнее о доступных вариантах квантизации этой модели), а значит доступной нам в случае нашего учебного примера видеопамяти более чем достаточно для запуска такой модели. Скачаем ее:
$ ollama pull llama3.1:8b-instruct-q8_0
Убедимся что модель доступна:
$ ollama ls
NAME                        ID              SIZE    MODIFIED
llama3.1:8b-instruct-q8_0   9b90f0f552e7    8.5 GB  9 seconds ago
Теперь мы буквально в шаге от того, чтобы начать работать с собственной большой языковой моделью. Осталось только установить соответствующие библиотеки для python.
Создадим виртуальное окружение python, в которое поставим нужные нам пакеты:
$ python3 -m venv ~/.venv
$ source ~/.venv/bin/activate
$ pip install ollama gradio
Ну а теперь напишем простейший скрипт на python, реализующий интерфейс чат бота на базе пакета gradio:
import gradio as gr
from ollama import Client
def response(input, history, system):
    messages: list = [{'role': 'system', 'content': system}]
    for human, bot in history:
        messages.append({'role': 'user', 'content': human})
        messages.append({'role': 'assistant', 'content': bot})
    messages.append({'role': 'user', 'content': input})
    client = Client(host='http://localhost:11434')
    stream = client.chat(model='llama3.1:8b-instruct-q8_0', messages=messages, stream=True)
    response = ''
    for chunk in stream:
        response += chunk['message']['content']
        yield response
def main():
    gr.ChatInterface(
        response, retry_btn=None, title='Ollama chatbot',
        additional_inputs=[
            gr.Textbox(
"""You are a powerful conversational AI trained to help people. You will see a conversation history between yourself and the user, ending with an instruction from the user.
You help people answer their questions and other requests interactively. You will be asked a very wide array of requests on all kinds of topics.
You should focus on serving the user's needs as best you can, which will be wide-ranging. If provided with a context you must ground your answer to the context.
Unless the user asks for a different style of answer, you should answer in full sentences, using proper grammar and spelling. IMPORTANT! ALWAYS answer in Russian!""",
            label='System prompt')
        ]
    ).queue().launch(
        server_name='0.0.0.0', server_port=8000, width='100%', # share=True
    )
if __name__ == "__main__":
    main()
Запускаем наш чат бот:
$ python chatbot.py
Открываем в браузере url: http://vm-abcdef.na4u.ru:8000/ и вуаля, у нас есть собственный аналог chatgpt :) Только не забывайте, что с настройками по умолчанию этот чат бот будет доступен всем желающим.