Введение в разработку с LLMs

Гид по разработке приложений с использованием больших языковых моделей (LLM)

Пока я экспериментировал с LLMs в выходные, я сильно разочаровался, пытаясь расшифровать термины и найти хорошую информацию о всех новых достижениях. Было сложно найти хороший гид для начинающих от А до Я. Найти точные определения было трудно, потому что информация была разрозненной на Reddit, в различных репозиториях, трекерах проблем и так далее. Некоторые определения никогда не были ясными, потому что это было знанием по умолчанию. Чтобы сделать дело хуже, современные поисковые системы и SEO постоянно показывали блоги, которые были просто рекламными постами и воронками продаж для размещенных услуг, тонких оберток GPT или платных статей на Medium.

Почему я решил написать этот гид

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

Цели и подход

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

Обзор

Хотя я не нахожу чат-ботов особо захватывающими или «убийственным приложением» LLM, это обеспечивает отличный автономный проект, где мы можем исследовать технологии и ввести все концепции и терминологию прямолинейно. После этой серии вы будете хорошо подготовлены к разблокированию мирового потенциала LLM для модерации контента, анализа настроений, очистки данных, суммаризации и других задач, связанных с обработкой естественного языка (NLP), которые ранее были невероятно сложными или невозможными.

Что мы охватим

В этой первой статье:

  • Мы охватим много начального жаргона и терминов.
  • Загрузим модель.
  • Запустим базовый цикл чата в коде.

Во второй статье:

  • Рассмотрим использование LLM через сетевые API, чтобы подключиться к другим сервисам LLM.
  • Исследуем больше о работе с LLM, настройках генерации, шаблонах чатов и так далее.

В третьей статье:

  • Проводим через добавление базовой голосовой интерактивности.
  • Обработаем речь с живых микрофонов или записей.

Введение в термины LLM и трансформеры

Основные термины:

  • Токены: Это кусочки слов, предложений и грамматики, с которыми работают LLM. Они могут представлять все, от одного символа до целого слова, но в основном представляют несколько букв или символов.
  • Эмбеддинги: Это большие 2D матрицы, где каждый токен представлен большим вектором (1D матрица), который захватывает его значение и концепции.
  • Авторегрессивный: Модель предсказывает следующий токен, добавляет его во ввод, и процесс повторяется.
  • Казуальная языковая модель: Модель предсказывает следующий токен или слово вперед, основываясь только на предыдущих токенах.
  • Длина контекста: Количество текста или история, которая может быть учтена за раз LLM. Выражается в количестве токенов.
  • Трансформеры: Ядро LLM. Глубокая архитектура обучения, разработанная Google в 2017 году, которая была одним из ключевых технологических достижений в разработке LLM.

Ресурсы для изучения ML и внутренних частей трансформеров

Настройка нашего проекта

Основные инструменты:

  • Git: Инструмент контроля версий.
  • Git-LFS: Расширения для работы с большими файлами для git.
  • Build-Essential: Метапакет в Ubuntu, включающий инструменты C и C++.

bash

# Установка инструментов сборки
sudo apt-get install -y git git-lfs build-essential

Установка Python 3.11

bash

# Установка Python 3.11
sudo apt install -y software-properties-common
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt update
sudo apt install -y python3.11 python3.11-venv

Настройка виртуальной среды

# Создание каталога для проекта
mkdir chatbot
cd chatbot
# Настройка виртуальной среды
python3.11 -m venv .venv
source .venv/bin/activate

Скорость vs Производительность

  • Скорость: Скорость вывода или генерации модели.
  • Производительность: Качество генерируемых результатов.

Запуск модели локально

Модельные рантаймы и движки

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

  • Jupyter notebooks: Специальные скрипты на Python, позволяющие смешивать код и заметки.
  • PyTorch: Библиотека для машинного обучения, включающая инструменты для работы с нейронными сетями и тензорами.
  • HuggingFace Transformers: Библиотека для работы с трансформерными сетями и загрузки моделей, размещенных на HuggingFace.

Референсная реализация / PyTorch

Референсная реализация модели обычно представляет собой скрипты на Python или Jupyter notebook, которые запускаются с использованием PyTorch или библиотеки HuggingFace Transformers. Это дает хорошую базовую линию для производительности модели.

Ollama

Ollama — популярный и быстрый способ запуска моделей. Легко установить на Mac, Windows и Linux. С одной командой вы можете скачать и запустить модель. Есть приятный веб-интерфейс для просмотра доступных моделей.

Text Generation WebUI

Text Generation WebUI, иногда называемый Ooga Booga, представляет собой приложение с совместимым с OpenAI API. Это больше площадка для быстрого взаимодействия с моделями.

Llamafile

Llamafile — проект от Mozilla, встраивающий кроссплатформенный рантайм вместе с моделью. Позволяет скачать один файл и начать взаимодействовать с моделью сразу.

Llama.cpp

Llama.cpp — быстрая реализация вывода для LLM, поддерживающая широкий круг моделей и бэкэндов, включая GPU.

Llama-cpp-python

Llama-cpp-python — обертка на Python вокруг llama.cpp.

Другие

Существуют и другие способы запуска LLM, такие как Koboldcpp, NVIDIA ChatRTX, LM Studio и полные фреймворки, такие как LangChain, LlamaIndex и другие.

Окончательный выбор

Наша цель — работать с LLM в минималистичном практическом смысле, используя llama.cpp и llama-cpp-python для изучения деталей за кулисами.

Выбор модели

Термины:

  • Параметры: Количество весов в модели.
  • Квантование: Форма потерь при сжатии, уменьшающая память и пропускную способность, требуемую для модели.
  • Базовые / Чат / Инструкт модели: Разные уровни обучения.
  • Тонкая настройка: Обучение на предварительно обученных моделях.
  • LoRA / QLoRA / PEFT: Техники тонкой настройки.
  • Mixture-Of-Experts / MoE: Архитектура модели, где используются только части модели.
  • Объединение: Процесс объединения двух моделей для улучшения производительности.

Форматы моделей

Основные форматы:

  • PyTorch: Общий формат для моделей.
  • SafeTensors: Новый метод сериализации модели, более безопасный для обмена.
  • HuggingFace / hf / Transformers: Формат для моделей, совместимый с библиотекой HuggingFace Transformers.
  • GGUF: Формат, разработанный вместе с проектом Llama.cpp.
  • JAX: Высокопроизводительная библиотека машинного обучения от Google.
  • ONNX Runtime: Фреймворк ИИ от Microsoft.

Загрузка модели

Пример загрузки модели Llama-3-8b-Instruct

bash

# Клонирование модели с использованием Git LFS
git clone https://huggingface.co/meta-llama/Meta-Llama-3-8B-Instruct

Мои рекомендованные модели для начала:

Модель Описание
Mistral 7B Instruct 0.3 Отличная модель, быстрая и эффективная.
Llama 3 — Instruct Семейство моделей от Meta, хорошее качество.
Phi-3 Instruct Модель от Microsoft, впечатляющая производительность.
Mixtral 8x7B Instruct 0.1 MoE модель от Mistral, требует большого объема памяти.

Установка Llama.cpp

Пример установки

bash

# Переход в каталог проекта
cd chatbot
# Клонирование репозитория llama.cpp
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp# Сборка проекта
make -j $(nproc)# Установка зависимостей
pip install -r requirements.txt

# Возвращение в каталог проекта
cd ..

Конвертация и квантование модели

Конвертация из HuggingFace в GGUF

bash

python llama.cpp/convert-hf-to-gguf.py Meta-Llama-3-8B-Instruct/ --outfile Meta-Llama-3-8B-Instruct.gguf --outtype auto

Квантование модели

bash

llama.cpp/quantize Meta-Llama-3-8B-Instruct.gguf Meta-Llama-3-8B-Instruct-q5_k_m.gguf Q5_K_M

Пример использования модели

Запуск модели

bash

llama.cpp/main -m Meta-Llama-3-8B-Instruct-q5_k_m.gguf

Взаимодействие с моделью

bash

llama.cpp/simple Meta-Llama-3-8B-Instruct-q5_k_m.gguf "What is the capital of Australia?"

Создание базового чат-бота

Установка llama-cpp-python

bash

pip install llama-cpp-python

Пример кода для чат-бота

python

from llama_cpp import Llama

# Загрузка модели
llm = Llama(model_path=«Meta-Llama-3-8B-Instruct-q5_k_m.gguf», chat_format=«llama-3»)

# История сообщений
messages_history = [
{
«role»: «system»,
«content»: «You are a helpful teacher who is teaching students about astronomy and the Solar System.»
}
]

def get_message_from_response(response):
return response[«choices»][0][«message»]

def add_user_message(message):
messages_history.append({
«role»: «user»,
«content»: message
})

def print_message_history():
print(«===============================»)
for message in messages_history:
print(message[«role»], «:», message[«content»])

# Цикл чата
while True:
user_message = input(«(Type exit to quit) User: «)

if user_message.strip() == «exit»:
break

add_user_message(user_message)

llm_output = llm.create_chat_completion(
messages=messages_history,
max_tokens=128
)

messages_history.append(get_message_from_response(llm_output))
print_message_history()

print(«Chatbot finished — Goodbye!»)

Продолжение следует

В следующей статье:

  • OpenAI совместимые API и клиент-серверная архитектура для LLM.
  • Потоковая генерация.
  • Системные подсказки.
  • Шаблоны чатов.
  • Настройки генерации, такие как контекст и температура.

Упражнения для читателя

Напишите мне в телеграм и я отправлю вам домашнее задание для фиксирования результатов.

Комментарии: 0