[Перевод] Все, что нужно знать для разработки с использованием LLM

Изображение создано Stable Diffusion

Изображение создано Stable Diffusion

Перевод статьи Сергея Саввова.

Цель данной статьи — простым языком объяснить ключевые технологии, необходимые для начала разработки приложений на основе LLM. Oна подойдёт как разработчикам, так и специалистам по машинному обучению, у которых есть базовое понимание концепций и желание заглянуть поглубже. Также я прикрепил множество полезных ссылок для дальнейшего изучения. Давайте начинать!

Введение в Large Language Models

Думаю, вы уже тысячу раз слышали, что такое LLM, поэтому не буду рассказывать еще раз. Все, что нам нужно знать: Large Language Model (LLM) — это ОГРОМНАЯ нейросеть, которая предсказывает следующий токен на основе предсказанного ранее.

Сравнение количества параметров моделей. Просто посмотрите, насколько большая GPT-3. Про GPT-4 пока что информации нет.

Сравнение количества параметров моделей. Просто посмотрите, насколько большая GPT-3. Про GPT-4 пока что информации нет.

По большей части, LLMs стали популярны из-за их универсальности и эффективности. Они хорошо справляются с переводом, резюмированием, анализом и т.д.

Возможности LLM

Возможности LLM

Вот примеры некоторых проектов, которые уже используют внутри себя LLMs:

  • Notion AI — улучшает качество текста, генерирует контент, правит орфографию и грамматику, редактирует тон и интонацию, переводит.

  • GitHub Copilot — пишет за вас код, даёт подсказки.

  • Dropbox Dash — обеспечивает функцию поиска на естественном языке, а также конкретно указывает, из каких файлов получен ответ.

Если хотите более подробно разобраться , что такое LLM, то рекомендую статью от Mark Riedl «A Very Gentle Introduction to Large Language Models without the Hype».

2. Open Source vs Closed Source Models

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

  • Приватность — одна из основных причин, почему большие компании часто выбирают self-hosted модели.

  • Быстрое прототипирование — отлично подходит для небольших стартапов, чтобы быстро протестировать свои идеи без чрезмерных затрат.

  • Качество генерации — либо вы дообучаете модель под конкретную задачу, либо используете платный API.

Однозначного ответа на вопрос, что лучше, а что хуже, нет. Я выделил следующие аспекты:

5db69f5f9eccbfbc63fa6d1e7e1743d4.png

Если вам интересно углубиться в детали, можете прочитать мою статью «You don«t need hosted LLMs, do you?».

Популярные Open Source models

  • LLaMA-2 от Meta

  • Falcon от Technology Innovation Institute in Abu Dhabi

  • Mistral от Mistral AI

Популярные Closed Source models

Вот тут вы сможете найти все существующие модели с их описанием.

Промпт-Инжиниринг

Знаю, знаю, многие считают это псевдонаукой или просто временной шумихой. Но правда в том, что мы до сих пор не до конца понимаем, как работают LLM. Почему они иногда дают качественные ответы, а иногда лгут или галлюцинируют? Почему добавление в промпт «let«s think step-by-step» внезапно улучшает качество?

Добавление эмоциональной окраски повышает качество любых моделей.

Добавление эмоциональной окраски повышает качество любых моделей.

В связи с этим ученым и энтузиастам остается только экспериментировать с различными промптами, пытаясь заставить модели работать лучше.

Иллюстрация различных подходов к решению задач с помощью LLMs

Иллюстрация различных подходов к решению задач с помощью LLMs

Не буду утомлять вас сложными схемами промптов. Лучше приведу несколько примеров, которые позволят быстро повысить перфоманс:

  1. «Let«s think step by step» — отлично подходит для рассуждений или логических задач.

  2. «Take a deep breath and work on this problem step-by-step»— улучшенная версия предыдущего пункта, поможет добавить еще несколько процентов качества.

  3. «This is very important to my career» — просто добавьте это в конец промпта, и вы заметите улучшение качества на 5–20%.

А вот готовый шаблон промпта:

Let«s combine our X command and clear thinking to quickly and accurately decipher the answer in the step-by-step approach. Provide details and include sources in the answer. This is very important to my career.

Where X is the industry of the task you are solving, for example, programming.

Настоятельно рекомендую потратить несколько вечеров на техники промпт-инжиниринга. Это поможет лучше контролировать поведение модели и уменьшить процент галлюцинаций. Можно начать с прочтения Prompt Engineering Guide, очень информативная и подробная сводка.

Полезные ссылки:

  • prompttools — тестирование и эксперименты параллельно с разными моделями (например, OpenAI, LLaMA).

  • promptfoo — тестирование и оценка качества генерации LLMs.

  • Awesome ChatGPT Prompts — коллекция примеров промптов для использования в ChatGPT.

4. Добавление новых данных: Retrieval Augmented Generation (RAG)

RAG — техника, объединяющая LLM с внешними базами знаний. Позволяет добавить в модель актуальную информацию или какие-то конкретные данные, на которых модель не училась изначально.

Несмотря на устрашающее название (иногда мы добавляем к нему слово «reranker»), на самом деле это довольно старый и на удивление простой метод:

Схематично как работает RAG

Схематично как работает RAG

  1. Преобразуем документ в числа, мы называем их эмбединги.

  2. Преобразуем поисковый запрос в эмбединги, используя ту же модель.

  3. Ищем топ K наиболее похожих документов, обычно на основе cosine similarity.

  4. Просим LLM сгенерировать ответ на основе найденных документов.

Когда использовать

  • Нужна актуальная информация: Если информацию в приложении необходимо постоянно обновлять. К примеру, если речь идет о новостных статьях.

  • Узкая доменная область: Если требуются особые знания, выходящие за рамки учебных данных LLM. Например, внутренняя документация компании.

Когда НЕ использовать

  • General Conversational Applications: Если информация общая и не требует дополнительных ресурсов, то RAG вам не понадобится.

  • Ограниченные ресурсы: поисковый компонент RAG предполагает работу с большими базами знаний, что может быть дорого и медленно — хотя все равно быстрее и дешевле, чем fine-tuning.

Готовим RAG

Отличной стартовой точкой будет использование библиотеки LlamaIndex. Она поможет быстро подключить ваши данные к LLMs. Для этого потребуется всего несколько строк кода:

from llama_index import VectorStoreIndex, SimpleDirectoryReader

# 1. Load your documents:
documents = SimpleDirectoryReader("YOUR_DATA").load_data()

# 2. Convert them to vectors:
index = VectorStoreIndex.from_documents(documents)

# 3. Ask the question:
query_engine = index.as_query_engine()
response = query_engine.query("When's my boss's birthday?"
print(response)

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

Что почитать & полезные ссылки

5. Fine-Tuning LLM

Fine-tuning — это процесс дообучения ранее обученной LLM на определенном датасете. Напрашивается вопрос -, а зачем дообучать модель, если можно добавить данные с помощью RAG? Простой ответ заключается в том, что только дообучение может адаптировать вашу модель для понимания конкретной области или определить ее стиль. К примеру, я создал копию самого себя, используя fine-tuning на личной переписке:

Demo of the fine-tuned model on the author’s correspondences

Demo of the fine-tuned model on the author«s correspondences

Ладно, если я вас убедил в его важности, давайте посмотрим, как оно работает (спойлер — это не так уж и сложно):

Classical approach of fine-tuning on domain specific data

Classical approach of fine-tuning on domain specific data

  1. Возьмите базовую LLM. Можно скачать ее с HuggingFace.

  2. Подготовьте обучающие данные. Вам нужно составить инструкции и ответы. Вот пример такого датасета. Можно также сгенерировать синтетические данные с помощью GPT-4.

  3. Выберите подходящий метод дообучения. На сегодняшний день популярны LoRA и QLoRA.

  4. Дообучите модель на новых данных.

Когда использовать

  • Нишевые приложения: Когда приложение основано на специализированных темах. Например, приложения для работы с юридическими документами, которые должны понимать и обрабатывать профессиональную лексику.

  • Изменение характера: Для приложений, требующих определенного тона или стиля. Например, создание персонажа ИИ, будь то знаменитость или персонаж из книги.

Когда НЕ использовать

  • Broad Applications: Когда область применения обширная и не требует специальных знаний.

  • Ограниченные данные: Для fine-tuning нужно много релевантных данных. Однако их всегда можно сгенерировать с помощью другого LLM. Например, датасет Alpaca, состоящий из 52 тыс. пар «instruction-response» был использован для создания первой finetuning Llama v1 модели в начале этого года.

Дообучаем вашу LLM

На сегодняшний день существует множество статей, посвященных дообучению моделей. Как минимум, можно насчитать примерно 1000 только на Medium. Поэтому я не хочу слишком углубляться в эту тему и покажу вам высокоуровневую библиотеку Lit-GPT, которая скрывает всю магию внутри. Да, она не позволяет сильно кастомизировать тренировочный процесс, но зато можно быстро провести эксперименты и получить первоначальные результаты. И вновь нам понадобится лишь несколько строчек кода:

# 1. Download the model:
python scripts/download.py --repo_id meta-llama/Llama-2-7b

# 2. Convert the checkpoint to the lit-gpt format:
python scripts/convert_hf_checkpoint.py --checkpoint_dir checkpoints/llama

# 3. Generate an instruction tuning dataset:
python scripts/prepare_alpaca.py  # it should be your dataset

# 4. Run the finetuning script
python finetune/lora.py \
    --checkpoint_dir checkpoints/llama/
    --data_dir your_data_folder/
    --out_dir my_finetuned_model/ 

И все! Процесс обучения уже запущен:

0273bc4c6e6380bfaae39d341a3bbc94.gif

Имейте в виду, что этот процесс может занять много времени. Для дообучения Falcon-7B на одном графическом процессоре A100 требуется около 10 часов и 30 ГБ памяти.

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

Что почитать & полезные ссылки

Деплой LLM приложения

Иногда все, что нужно, — это нажать кнопку «deploy»…

74099bab06bd00884ac56abcbcab2d2e.png

К счастью, это вполне осуществимо. Есть множество фреймворков, которые помогут задеплоить LLMs. Что делает их полезными:

  • Множество готовых обёрток и интеграций.

  • Огромный выбор доступных моделей.

  • Большое количество внутренних оптимизаций.

  • Быстрое прототипирование.

Выбор подходящего фреймворка

Выбор фреймворка зависит от разных параметров: размер модели, требования к масштабируемости, область внедрения. Сегодня хороших фреймворков не так много, что дает нам некое преимущество — мы можем проще разобраться в их различиях. Я сделал для вас «шпаргалку», которая поможет быстро начать работу:

688597df1568f2aa850ccbddc3d42edd.png

Более подробный обзор вы найдете в моей статье »7 Frameworks for Serving LLMs». Советую ознакомиться с ней, если решите задеплоить LLM.

Сравнение фреймворков для вывода LLMs

Сравнение фреймворков для вывода LLMs

Пример кода для деплоя

Давайте перейдем от теории к практике и попробуем развернуть LLaMA-2 с помощью Text Generation Inference. Для этого, как вы уже догадались, понадобится всего несколько строк кода:

# 1. Create a folder where your model will be stored:
mkdir data

# 2. Run Docker container (launch RestAPI service):
docker run --gpus all --shm-size 1g -p 8080:80 \
    -v $volume:/data \
    ghcr.io/huggingface/text-generation-inference:1.1.0
    --model-id meta-llama/Llama-2-7b

# 3. And now you can make requests:
curl 127.0.0.1:8080/generate \
    -X POST \
    -d '{"inputs":"Tell me a joke!","parameters":{"max_new_tokens":20}}' \
    -H 'Content-Type: application/json'

Готово! Вы настроили RestAPI-сервис со встроенным логированием, эндопоинтом Prometheus для мониторинга, потоковой передачей токенов, и ваша модель полностью оптимизирована. Разве это не магия?

Документация по API

Документация по API

Что почитать & полезные ссылки

  • 7 Frameworks for Serving LLMs — сравнение основных фреймворков для деплоя LLMs с их плюсами и минусами.

  • Inference Endpoints — продукт от компании HuggingFace, который позволит вам развернуть любую модель в несколько кликов. Хороший выбор для быстрого прототипирования.

7. Что осталось за кадром

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

Оптимизация

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

  • 7 Ways To Speed Up Inference of Your Hosted LLMs — методы ускорения LLMs для увеличения скорости генерации токенов и снижения потребления памяти.

  • Optimizing Memory Usage for Training LLMs in PyTorch — в статье представлен ряд методов, которые могут снизить потребление памяти в PyTorch примерно в 20 раз без ущерба для производительности и качества.

Evaluating

Предположим, что вы дообучили модель. Но как понять, что ее качество улучшилось? Какие метрики следует использовать?

Vector Databases

Если вы работаете с RAG, то в какой-то момент вам придется перейти от хранения векторов в памяти к базе данных. Для этого важно понимать, что сейчас есть на рынке и с какими ограничениями.

LLM-агенты

На мой взгляд, это наиболее перспективное развитие в LLMs. Если вы хотите, чтобы несколько моделей работали вместе, я рекомендую изучить следующие ссылки.

  • A Survey on LLM-based Autonomous Agents — один из самых подробных обзоров агентов LLM.

  • autogen — фреймворк, позволяющий разрабатывать LLM-приложения с использованием нескольких агентов, которые могут взаимодействовать друг с другом для решения задач.

  • OpenAgents — открытая платформа для использования и размещения агентов.

Reinforcement Learning from Human Feedback (RLHF)

Как только вы предоставляете пользователям доступ к своей модели, вы берете на себя ответственность. Что, если она ответит грубо? Или расскажет как собрать бомбу? Чтобы избежать этого, ознакомьтесь с этими статьями:

  • Illustrating Reinforcement Learning from Human Feedback (RLHF) — обзорная статья, подробно описывающая технологию RLHF.

  • RL4LMs — модульная библиотека RL для fine-tuning моделей в соответствии с предпочтениями человека.

  • TRL — набор инструментов для обучения трансформаторных LLM с помощью технологии Reinforcement Learning, начиная с этапа Supervised Fine-tuning (SFT), этапа Reward Modeling (RM) и заканчивая этапом Proximal Policy Optimization (PPO).

Заключение

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

© Habrahabr.ru