«LangChain 101 Часть 2ab. Все, что вам нужно знать о моделях (больших языковых)»

«Всё, что вам нужно знать о моделях (больших языковых) в LangChain 101, Часть 2аб»

Это часть 2ab курса LangChain 101. Настоятельно рекомендуется ознакомиться с первой частью, чтобы лучше понять контекст этой статьи (следите за автором, чтобы не пропустить следующую часть):

LangChain 101: Часть 1. Создание простого приложения вопрос-ответ

В этой статье я познакомлю вас с основами LangChain, фреймворка для создания приложений с большими возможностями…

pub.towardsai.net

Компонент Models является основой Langchain. Это ядро, которое отвечает за генерацию токенов, делающих технологию волшебной.

Компонент Models позволяет использовать различные языковые модели, включая ChatGPT, GPT-4, LLAMA и т. д. Эти модели могут использоваться для выполнения различных задач, наиболее популярных: ответы на вопросы и генерация текста.

Компонент Models легок в использовании. Для генерации текста можно передать модели подсказку, и она создаст ответ. То же самое можно сделать для перевода предложения или ответа на вопрос.

Компонент Models также очень гибок. Вы можете комбинировать его с другими компонентами LangChain для создания более сложных систем. Например, вы можете объединить компонент Models с компонентом Prompts, чтобы создать чат-бота, который может генерировать различные виды творческого текста, такие как код или сценарии, стихи или музыкальные произведения, письма или электронные письма и т. д. Комбинируйте компоненты Models и Indexes, чтобы создать поисковую систему, способную отвечать на вопросы, используя информацию из разных источников.

Весь код (включая блокноты Colab) и дополнительные материалы доступны на GitHub.

Обзор

LangChain поддерживает различные модели, чтобы вы могли выбрать ту, которая лучше всего соответствует вашим потребностям:

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

Токенизация

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

Генерация текста

Предположим, что мы хотим создать продолжение фразы:

«Париж — город…».

Энкодер отправляет логиты для всех токенов, которые у нас есть (если вы не знаете, что такое логиты – рассмотрите их как оценки), которые могут быть преобразованы, с использованием функции софтмакса, в вероятности выбора токена для генерации.

Узнайте больше о генерации текста:

Как LLM генерирует текст?

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

pub.towardsai.net

.from_pretrained(<модель>)

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

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

Ключи API

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

Многие открытые модели организованы и хранятся на Hugging Face как сообщество. Открытые модели обычно меньше и имеют более низкие возможности по сравнению с собственными моделями, но они более экономичны.

Примеры: BLOOM (BigScience), LLaMA (Meta), Flan-T5 (Google) и т. д.

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

Примеры: OpenAI, co:here, AI21 Labs, Anthropic и т. д.

Вложения

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

  • OpenAIEmbeddings
  • HuggingFaceEmbeddings
  • GPT4AllEmbeddings
  • SpacyEmbeddings
  • FakeEmbeddings

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

  1. Лучшая подушка для шеи для длительных перелетов
  2. Легкий рюкзак для походов и путешествий
  3. Водонепроницаемая спортивная сумка для активного отдыха
  4. Набор нержавеющих столовых приборов для индукционных плит
  5. Набор высококачественных поварских ножей
  6. Высокопроизводительный миксер для выпечки
  7. Новинки в художественной литературе
  8. Вдохновляющие биографии и мемуары
  9. Лучшие книги по саморазвитию

Как можно заметить, сходство предложения 1 близко к 2 и 3, при этом сравнительно мало сходства с остальными предложениями. Можно видеть, что все предложения можно объединить в три группы.

Большие языковые и чат-модели

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

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

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

Задание вопроса GPT

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

import openaidef get_completion(prompt, model="gpt-3.5-turbo"):    """    Генерирует завершение для данной подсказки с использованием указанной модели.    Args:        prompt (str): Входная подсказка для генерации завершения.        model (str): Название модели, которую использовать для генерации завершения.    Returns:        str: Сгенерированный текст завершения.    """    # Создание списка словарей сообщений с подсказкой пользователя    messages = [{"role": "user", "content": prompt}]    # Генерация завершения чата с использованием API OpenAI    response = openai.ChatCompletion.create(        model=model,        messages=messages,        temperature=0,  # Установка температуры на 0 для детерминированного вывода    )    # Извлечение и возврат сгенерированного контента завершения    return response.choices[0].message["content"]

Как видно, простые вопросы модель отвечает правильно. Но для сложных запросов, можно использовать LangChain.

Сколько оперативной памяти?

Чтобы определить размер модели в байтах, параметры умножают на выбранный размер точности.

Давайте скажем, что мы выбрали точность bfloat16 (16 бит = 2 байта). Мы хотим использовать модель BLOOM-176B. Это означает, что нам нужно 176 миллиардов параметров * 2 байта = 352GB!

В машинном обучении используется смешанный подход точности, где обучение и вывод идеально выполняются в FP32, но вычисления выполняются в FP16/BF16 для более быстрого обучения. Веса хранятся в FP32, и для их обновления используются градиенты FP16/BF16. Во время вывода полурекисные веса часто обеспечивают аналогичное качество, как и FP32, что позволяет более быстрой обработке с меньшим количеством графических процессоров.

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

В коде вы, вероятно, увидите следующие параметры квантизации:

# Configure BitsAndBytesConfig for 4-bit quantizationbnb_config = BitsAndBytesConfig(    load_in_4bit=True,    bnb_4bit_use_double_quant=True,    bnb_4bit_quant_type="nf4",    bnb_4bit_compute_dtype=torch.bfloat16,)

Чтобы полностью понять квантизацию, ознакомьтесь с моей статьей по этой теме:

Как поместить большие языковые модели в ограниченную память: квантизация

Как запустить LLM на локальной машине

pub.towardsai.net

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

Может быть удивительно, но можно запустить LLM только на процессоре:

# check model versions https://huggingface.co/TheBloke/Llama-2-7B-Chat-GGML/tree/main!wget --output-document=llama-2-7b-chat.bin https://huggingface.co/TheBloke/Llama-2-7B-Chat-GGML/resolve/main/llama-2-7b-chat.ggmlv3.q8_0.binfrom langchain.llms import CTransformers# Initialize a Local CTransformers wrapper for the Llama-2-7B-Chat modelllm = CTransformers(    model="llama-2-7b-chat.bin",  # Location of the downloaded GGML model    model_type="llama",  # Specify the model type as Llama    config={        "max_new_tokens": 256,        "temperature": 0.1,    },  # Set specific configuration)# Initialize an LLMChain instance with the provided prompt, llm, and verbose settingllm_chain = LLMChain(prompt=prompt, llm=llm, verbose=True)

Ответ займет несколько минут, но это показывает возможность запуска ллмс даже на устройствах Rasberry!

Это конец части 1аб. Следующая часть (cde) будет посвящена донастройке моделей.

Хлопайте и следите за мной, так как это мотивирует меня писать новые статьи 🙂