Гид по разработке приложений с использованием больших языковых моделей (LLM)
Пока я экспериментировал с LLMs в выходные, я сильно разочаровался, пытаясь расшифровать термины и найти хорошую информацию о всех новых достижениях. Было сложно найти хороший гид для начинающих от А до Я. Найти точные определения было трудно, потому что информация была разрозненной на Reddit, в различных репозиториях, трекерах проблем и так далее. Некоторые определения никогда не были ясными, потому что это было знанием по умолчанию. Чтобы сделать дело хуже, современные поисковые системы и SEO постоянно показывали блоги, которые были просто рекламными постами и воронками продаж для размещенных услуг, тонких оберток GPT или платных статей на Medium.
Почему я решил написать этот гид
Пока я обучался, я делал обширные заметки, отвечая на вопросы, которые у меня возникали, и решил превратить их в серию статей в надежде, что это поможет другим с похожими разочарованиями. Это тот гид, который я бы хотел иметь!
Цели и подход
Я проведу вас через процесс создания базового голосового ассистента. По ходу дела я введу терминологию, составлю глоссарий терминов, введу концепции и покажу четкие и краткие примеры на каждом шаге. Я не собираюсь вам что-то продавать, мы будем использовать бесплатные и открытые проекты и использовать некоторые из возникающих стандартных технологий без лишних слов.
Обзор
Хотя я не нахожу чат-ботов особо захватывающими или «убийственным приложением» LLM, это обеспечивает отличный автономный проект, где мы можем исследовать технологии и ввести все концепции и терминологию прямолинейно. После этой серии вы будете хорошо подготовлены к разблокированию мирового потенциала LLM для модерации контента, анализа настроений, очистки данных, суммаризации и других задач, связанных с обработкой естественного языка (NLP), которые ранее были невероятно сложными или невозможными.
Что мы охватим
В этой первой статье:
- Мы охватим много начального жаргона и терминов.
- Загрузим модель.
- Запустим базовый цикл чата в коде.
Во второй статье:
- Рассмотрим использование LLM через сетевые API, чтобы подключиться к другим сервисам LLM.
- Исследуем больше о работе с LLM, настройках генерации, шаблонах чатов и так далее.
В третьей статье:
- Проводим через добавление базовой голосовой интерактивности.
- Обработаем речь с живых микрофонов или записей.
Введение в термины LLM и трансформеры
Основные термины:
- Токены: Это кусочки слов, предложений и грамматики, с которыми работают LLM. Они могут представлять все, от одного символа до целого слова, но в основном представляют несколько букв или символов.
- Эмбеддинги: Это большие 2D матрицы, где каждый токен представлен большим вектором (1D матрица), который захватывает его значение и концепции.
- Авторегрессивный: Модель предсказывает следующий токен, добавляет его во ввод, и процесс повторяется.
- Казуальная языковая модель: Модель предсказывает следующий токен или слово вперед, основываясь только на предыдущих токенах.
- Длина контекста: Количество текста или история, которая может быть учтена за раз LLM. Выражается в количестве токенов.
- Трансформеры: Ядро LLM. Глубокая архитектура обучения, разработанная Google в 2017 году, которая была одним из ключевых технологических достижений в разработке LLM.
Ресурсы для изучения ML и внутренних частей трансформеров
- Видео-серия 3Blue1Brown о нейронных сетях.
- Курс по обработке естественного языка от Hugging Face.
- Статья A Beginner’s Guide to Tokens, Vectors and Embeddings in NLP от Sascha Metzger.
- Книга 3D Math Primer for Graphics and Game Development.
Настройка нашего проекта
Основные инструменты:
- 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.cppgit 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.
- Потоковая генерация.
- Системные подсказки.
- Шаблоны чатов.
- Настройки генерации, такие как контекст и температура.
Упражнения для читателя
Напишите мне в телеграм и я отправлю вам домашнее задание для фиксирования результатов.