В этой статье мы покажем как можно очень быстро и просто развернуть собственный чатбот на базе 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 :) Только не забывайте, что с настройками по умолчанию этот чат бот будет доступен всем желающим.