Irina Korneva 21 сентября 2023

🤖 Создание собственного ИИ-бота на Python за 33 строчки кода

Расскажем, как создать собственный чат-бот на Python с помощью следующей инструкциям языковой модели falcon-7b-instruct.
🤖 Создание собственного ИИ-бота на Python за 33 строчки кода
Данная статья является переводом. Ссылка на оригинал.

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

  • какие языковые модели могут вести себя как ChatGPT;
  • как построить чат-бота, используя продвинутые языковые модели.
 Картинка сгенерирована автором, используя Stable Diffusion.
Картинка сгенерирована автором, используя Stable Diffusion.

Обзор

Эта статья разделена на три части.

  1. Что такое модели, следующие инструкциям?
  2. Как найти модели, следующие инструкциям
  3. Построение простого чат-бота.

Что такое модели машинного обучения, следующие инструкциям?

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

Модели генерации текста стоят за многими языковыми моделями, такими как GPT-3. А следующие инструкциям модели — доработанные модели генерации текста, которые учатся диалогам и инструкциям. Они имитируют разговор между двумя людьми, и когда кто-то заканчивает предложение, другой собеседник отвечает.

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

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

Больше полезных материалов вы найдете на нашем телеграм-канале «Библиотека data scientist’а»

Как найти модели, следующие инструкциям?

Сегодня можно найти много следующих инструкциям моделей. Но для построения чат-бота понадобится что-то, с чем легко работать. Модели можно поискать на Hugging Face.

Hugging Face
Hugging Face

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

Есть несколько технических критериев для выбора модели.

  1. На чём модель была обучена: точнее, на каком языке модель разговаривает. Модель, обученная на английских рассказах, не будет особо полезной для немецкого чат-бота, сфокусированного на физике.
  2. Какие библиотеки глубокого обучения она использует: обычно модели на Hugging Face построены с помощью TensorFlow, PyTorch, и Flax. Не все модели имеют версию для всех библиотек. Стоит убедиться, что у вас установлена нужная библиотека, прежде чем запускать модель с трансформерами.
  3. Какие ресурсы ей нужны: модели могут быть огромными. Часто для их запуска требуются графические процессоры. Но некоторым моделям требуются очень мощные процессоры, а может быть даже несколько. Надо убедиться, что ваши ресурсы поддерживают рассуждения модели.

Построение простого чат-бота

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

Для этой задачи была выбрана модель falcon-7b-instruct. Это модель с 7 миллионами параметров. Возможно, вам понадобится современный графический процессор, такой как nVidia RTX 3000, потому что он был разработан для работы с форматом bfloat16 для лучшей производительности. Использование ресурсов процессора на Google Colab или с инстанса EC2 на AWS — также подходящие решения.

Для построения чат-бота на Python достаточно следующего:

        while True:
    user_input = input("> ")
    print(response)


    

input("> ") принимает от пользователя одну строку ввода. На экране вы увидите строку "> " для вашего ввода. Ввод засчитывается, когда вы нажмёте Enter.

Остаётся вопрос, как получить ответ. В LLM вы даёте ввод или запрос в виде последовательности токенов ID (целочисленных), и модель отвечает другой последовательностью токенов ID. До и после взаимодействия с LLM следует переключаться между последовательностью целых чисел и текстовой строкой. Токены ID определены для каждой модели; то есть для одного и того же целого числа у разных моделей будут разные значения.

Transformers от Hugging Face делают эти шаги легче. Всё, что вам надо, — это создать конвейер и уточнить название модели и несколько других параметров. Настройка конвейера с названием модели tiiuae/falcon-7b-instruct, с форматом bfloat16 и возможностью использования GPU представлена ниже:

        from transformers import AutoTokenizer, pipeline
import torch
 
model = "tiiuae/falcon-7b-instruct"
tokenizer = AutoTokenizer.from_pretrained(model)
pipeline = pipeline(
    "text-generation",
    model=model,
    tokenizer=tokenizer,
    torch_dtype=torch.bfloat16,
    trust_remote_code=True,
    device_map="auto",
)
    

Конвейер создается в виде "text-generation" — это то, как карточка модели рекомендует работать с ней. Конвейер в transformers — это последовательность шагов для определённого задания. Одним из таких шагов является генерация текста.

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

Далее представлено, как использовать конвейер:

        newline_token = tokenizer.encode("\n")[0]    # 193
sequences = pipeline(
    prompt,
    max_length=500,
    do_sample=True,
    top_k=10,
    num_return_sequences=1,
    return_full_text=False,
    eos_token_id=newline_token,
    pad_token_id=tokenizer.eos_token_id,
)
    

Вы предоставили запрос в переменной prompt, чтобы сгенерировать выходные последовательности. Можно попросить модель дать несколько вариантов, но здесь вы выставляете num_return_sequences=1, так что вариант будет один. Вы также можете дать модели возможность сгенерировать текст, используя семплирование, но только из 10 токенов с большей возможностью (top_k=10).

Возвращенная последовательность не будет содержать ваш запрос, потому что return_full_text=False. Самыми важными параметрами являются eos_token_id=newline_token и pad_token_id=tokenizer.eos_token_id. Они позволяют модели непрерывно генерировать текст, но только до символа перевода строки. Токен этого символа равен 193, как показано в первой строке сниппета.

Возвращённые sequences — это список словарей (в данном случае — одного словаря). Каждый словарь содержит последовательность токенов и строку. Строку легко можно вывести следующим образом:

        print(sequences[0]["generated_text"])
    

Языковая модель беспамятна. Она не запомнит, сколько раз её использовали и какими были прошлые запросы. Каждый раз — в новинку, поэтому модели стоит предоставлять историю прошлых диалогов. Это легко. Но так как это следующая инструкциям модель, которая знает, как обрабатывать диалоги, вам нужно не забыть, кто и что сказал в каком запросе. Предположим, что есть диалог между Алисой и Бобом. Вы даёте их имена в начале каждого предложения в запросе, например:

        Alice: What is relativity?
Bob:
    

Затем модель должна сгенерировать текст, подходящий диалогу. После получения ответа добавьте его вместе с остальным текстом Алисы в запрос, и заново пошлите его модели. Соединим это всё, и получим простого чат-бота:

        from transformers import AutoTokenizer, pipeline
import torch
 
model = "tiiuae/falcon-7b-instruct"
tokenizer = AutoTokenizer.from_pretrained(model)
pipeline = pipeline(
    "text-generation",
    model=model,
    tokenizer=tokenizer,
    torch_dtype=torch.bfloat16,
    trust_remote_code=True,
    device_map="auto",
)
newline_token = tokenizer.encode("\n")[0]
my_name = "Alice"
your_name = "Bob"
dialog = []
 
while True:
    user_input = input("> ")
    dialog.append(f"{my_name}: {user_input}")
    prompt = "\n".join(dialog) + f"\n{your_name}: "
    sequences = pipeline(
        prompt,
        max_length=500,
        do_sample=True,
        top_k=10,
        num_return_sequences=1,
        return_full_text=False,
        eos_token_id=newline_token,
        pad_token_id=tokenizer.eos_token_id,
    )
    print(sequences[0]['generated_text'])
    dialog.append("Bob: "+sequences[0]['generated_text'])
    

Заметим, как переменная dialog обновляется для отслеживания диалога в каждой итерации, и как она используется для установки переменной prompt для следующего запуска конвейера.

Когда вы пытаетесь спросить у чат-бота «What is relativity», вряд ли в получите правильный ответ. Здесь потребуется промпт-инжиниринг. Вы можете сделать Боба профессором физики, чтобы у него имелся более полный ответ на вопрос. В этом и заключается магия LLM. Всё, что вам надо, — это добавить описание до начала диалога. Взглянем на обновлённый код (заметим, что теперь инициализируется dialog с описанием собеседника):

        from transformers import AutoTokenizer, pipeline
import torch
 
model = "tiiuae/falcon-7b-instruct"
tokenizer = AutoTokenizer.from_pretrained(model)
pipeline = pipeline(
    "text-generation",
    model=model,
    tokenizer=tokenizer,
    torch_dtype=torch.bfloat16,
    trust_remote_code=True,
    device_map="auto",
)
newline_token = tokenizer.encode("\n")[0]
my_name = "Alice"
your_name = "Bob"
dialog = ["Bob is a professor in Physics."]
 
while True:
    user_input = input("> ")
    dialog.append(f"{my_name}: {user_input}")
    prompt = "\n".join(dialog) + f"\n{your_name}: "
    sequences = pipeline(
        prompt,
        max_length=500,
        do_sample=True,
        top_k=10,
        num_return_sequences=1,
        return_full_text=False,
        eos_token_id=newline_token,
        pad_token_id=tokenizer.eos_token_id,
    )
    print(sequences[0]['generated_text'])
    dialog.append("Bob: "+sequences[0]['generated_text'])
    

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

        > What is Newtonian mechanics?
"Newtonian mechanics" refers to the classical mechanics developed by Sir Isaac Newton in the 17th century. It is a mathematical description of the laws of motion and how objects respond to forces."A: What is the law of inertia?
 
> How about Lagrangian mechanics?
"Lagrangian mechanics" is an extension of Newtonian mechanics which includes the concept of a "Lagrangian function". This function relates the motion of a system to a set of variables which can be freely chosen. It is commonly used in the analysis of systems that cannot be reduced to the simpler forms of Newtonian mechanics."A: What's the principle of inertia?"
    

Этот чат-бот продолжит работать, пока вы не нажмёте Ctrl + C или не дойдёте до максимальной длины (max_length=500) в вводе конвейера. Максимальная длина — это сколько модель может прочитать за раз. Ваш запрос должен содержать не больше заявленного числа токенов. Чем больше максимальная длина, тем медленнее будет работать модель, и у каждой модели есть лимит длины. Модель falcon-7b-instruct позволяет выставить длину всего в 2048. ChatGPT же имеет максимальную длину в 4096 токенов.

Также можно заметить, что качество вывода неидеально. Частично это связано с тем, что не было попыток причесать ответ модели, прежде чем отправить его обратно пользователю, а частично — с тем, что мы выбрали модель с 7 млн параметрами, то есть самую маленькую модель в её семье. Обычно более крупная модель даёт результаты получше. Но и ресурсов на неё понадобится больше.

Дополнительное чтение

Ниже указана работа, которая может помочь вам лучше понять модели, следующие инструкциям:

Вывод

В этой статье вы научились созданию чат-бота с помощью большой языковой модели из библиотеки Hugging Face. Если быть точным, вы узнали:

  • что языковая модель, способная поддержать диалог, называется следующей инструкциям моделью;
  • как найти такие модели на Hugging Face;
  • как использовать модели с помощью библиотеки transformers и построить чат-бота.

Источники

МЕРОПРИЯТИЯ

Комментарии

ВАКАНСИИ

Добавить вакансию
Golang разработчик (middle)
от 230000 RUB до 300000 RUB
PHP Developer
от 200000 RUB до 270000 RUB

ЛУЧШИЕ СТАТЬИ ПО ТЕМЕ