Инструменты искусственного интеллекта

yogpt: Используем ChatGPT и другие языковые модели из командной строки

translated by GPT

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

Уже есть несколько проектов, которые предоставляют интерфейс командной строки для ChatGPT, например, heygpt. Однако этот проект дает вам доступ только к модели OpenAI ChatGPT, в то время как мне хотелось иметь доступ к другим моделям, таким, как Yandex GPT и GigaChat. Более того, heygpt реализован в Rust, что затрудняет его установку для тех из нас, кто живет в экосистеме Python.

Добро пожаловать в yogpt!

В результате я решил потратить выходные и сделать свой собственный инструмент для работы с разными GPT из командной строки под названием yogpt. Вот основные принципы, которым я следовал при его разработке:

  • Инструмент должен быть доступен для установки с помощью pip. В наши дни у большинства сознательных людей на компьютере уже есть командная строка Python, и достаточно сказать pip install yogpt, чтобы начать пользоваться yogpt.
  • Он должен поддерживать любую разговорную модель, доступную в LangChain, что открывает нам немедленный доступ к множеству моделей, включая оригинальные ChatGPT, GigaChat, YandexGPT и т.д.

Есть несколько способов использования yogpt из командной строки:

  • Задаем вопрос GPT непосредственно в командной строке, например:
    $ yogpt Какая 10-я цифра числа Пи?
    
  • Перенаправлением конвейера в yogpt. Если yogpt поймет, что он вызывается в конвейере (|), он автоматически примет запрос через стандартный ввод. Вы также можете явно указать - в командной строке, например:
    $ echo Какова 10-я цифра числа Pi | yogpt -
    
  • Вызов yogpt без запроса инициирует консольный чат, и вы можете общаться с моделью в интерактивном режиме.
  • Продолжение диалогового общения с yogpt после предоставления ему некоторой информации. Например, вы можете попросить его прочитать программу на Python, а затем ответить на ваши вопросы по этой программе. В этом случае нужно указать флаг -c/--chat, и после обработки первоначального запроса будет инициирован последующий чат, в котором вы можете запросить более подробную информацию. Например, вы можете попросить GPT проанализировать программу на Python (например, эту):
$ yogpt -s "Вы эксперт по программному обеспечению. Пожалуйста, 
ознакомьтесь с представленной ниже программой на python и будьте
готовы ответить на вопросы по этой программе".
-c @game.py

Эта программа представляет собой простую реализацию игры Space Invaders
с использованием библиотеки Pygame на Python. Она включает в себя 
управляемый игроком космический корабль, который может перемещаться 
влево и вправо, стрелять пулями и уничтожать вражеские космические
корабли. Игрок зарабатывает очки за каждый уничтоженный вражеский
космический корабль.

 U> Как реализовано обнаружение столкновений?
AI> Обнаружение столкновений в этой программе реализовано с помощью
функции groupcollide, предоставляемой библиотекой Pygame. Функция
`groupcollide` используется для обнаружения столкновений между
двумя группами спрайтов и управления сталкивающимися спрайтами.
U> ^C

Приведенный выше пример также показывает, что вы можете использовать синтаксис @filename для получения входных данных из файла. Кроме того, мы указали здесь системное сообщение через параметр -s, инструктируя модель, что она должна делать.

Системные сообщения и шаблоны запросов

Во многих случаях мы хотим поручить модели что-то сделать с данными, которые мы подаём ей на вход. Например, если мы хотим использовать GPT для перевода программы с одного языка программирования на другой, нам нужно попросить GPT это сделать. Это можно сделать двумя способами:

  • Указав системное сообщение через параметр -s/--system:
$ echo print([2**i for i in range(10)]) |
yogpt -s "Переведи программу, приведённую ниже, на C++"

Вот результат, который вы, скорее всего, получите (в данном случае использовался Yandex GPT):

#include <iostream>

int main() {
    for (int i = 0; i < 10; ++i) {
        std::cout << std::pow(2, i) << " ";
    }
    return 0;
}
  • С помощью шаблона запроса через параметр -p/--template:
$ echo print([2**i for i in range(10)]) |
yogpt -p "Переведи программу, указанную ниже в
двойных квадратных скобках, на язык {param_1}:\n[[{}]]. 
Выведи только текст программы." -1 Javascript

Это дает следующий результат:

console.log(Array.from({length: 10}, (_, i) => 2 ** i));

Шаблоны обеспечивают большую гибкость, поскольку вы можете использовать различные тонкости промпт-инжинирига, такие как явное выделение входных данных (двойные квадратные скобки) и тонкая настройка промпта (в нашем случае я добавил Выведи только текст программы, чтобы избежать дополнительных объяснений в ответе).

Кроме того, я использовал дополнительный параметр для указания целевого языка программирования. Используя конструкции от {param_1} до {param_3} в шаблоне, я затем могу указать эти параметры с помощью в командной строке как -1-3. Это особенно полезно, если шаблон запроса берется из файла или конфигурации, как это описано ниже.

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

Установка и настройка

Теперь, когда вы увидели несколько примеров использования yogpt, вам, вероятно, хочется скорее начать его использовать.

Как я уже упоминал, установка yogpt на ваш локальный компьютер делается одной командой:

$ pip install yogpt

Конечно, это работает при условии, что у вас есть доступные инструменты Python 3.10+. Важно иметь версию Python>=3.10, потому что это та минимальная версия, которую требует LangChain.

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

Настройка выполняется путем создания файла .yogpt.config.json в вашем домашнем каталоге (обычно это c:\users \<имя пользователя> в Windows или /home/<имя пользователя> в Linux). В этом файле JSON вы можете указать модели, которые вы хотите использовать, включая ваши личные ключи API. Например, вот файл, в котором прописаны модели Yandex GPT и GigaChat:

{
 "models" : [
   {
     "name" : "yagpt",
     "classname" : "langchain.chat_models.ChatYandexGPT",
     "default" : true,
     "params" : { "api_key" : "..." }
   },
   {
     "name" : "gc",
     "classname" : "langchain.chat_models.GigaChat",
     "params" : { "credentials" : "... ", 
                         "verify_ssl_certs" : false }
   }
]}

Вы можете ознакомиться с примером файла .yogpt.config.json в репозитории проекта здесь и использовать его в качестве отправной точки при создании своей конфигурации.

Как вы можете видеть, для каждой модели мы указываем имя Python-класса модели (который может быть частью LangChain, но вы также можете указать другие LangChain-совместимые модели, доступные в вашей Python-среде), а также параметры, которые мы передаем конструктору класса (сюда обычно включаются все необходимые ключи доступа). Мы также можем пометить любую модель в конфигурационном файле как используемую по умолчанию.

Определив свои модели в конфигурационном файле, вы можете указать модель по имени при вызове yogpt следующим образом:

$ yogpt -m yagpt Привет, расскажи анекдот про число пи!
Почему число Пи такое большое? Потому что оно округляет!

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

{
  "name" : "translate",
  "template" : "Please, translate the text in double square brackets
    below into the {param_1} language. Here is the text:\n[[{}]]"
}

В этом случае для перевода используем команду:

$ echo How do you do? | yogpt -p translate -1 german -t 0.01
Wie geht es Ihnen?

Здесь я указал параметр --temperature или -t, чтобы получить меньше галлюцинаций на выходе (т.е. более точный перевод). Если нам нужно, чтобы модель была более креативной - используем более высокое значение (от 0 до 1):

$ yogpt -t 0.6 Придумай 5 забавных имен для кота разработчика на Python.
1. Питонище
2. Кодо-кот
3. Шерлок Хохмс (Хохмс - от "хохмач", что в переводе с котом является "кодом")
4. ФурриФункция
5. БайтоБэггинс (или просто Байто-кот)

Пример: суммаризация записей в блоге

Выше вы видели несколько примеров использования yogpt в разных задачах, от понимания компьютерных программ до перевода. Существует множество возможных примеров использования GPT из командной строки - от перевода формул LaTeX на Python до переписывания записей в блоге в другой тональности. Например, вот в этом блоге описано использование ChatGPT в работе математика, и оно во многом основано именно на командной строке.

Давайте остановимся на последнем примере обработки записей в блоге. Для некоторых не очень длинных постов в блоге (которые достаточно коротки, чтобы вписаться в контекстное окно текущих языковых моделей) я использовую yogpt для перевода. В моем конфигурационном файле определено следующее приглашение blogtran: Я хочу перевести свой пост в блоге, написанный в формате Jekyll markdown, на русский язык. Пожалуйста, оставь раздел конфигурации нетронутым и переведи остальной текст, оставив синтаксис markdown. Запись в блоге приведена ниже: {}, что позволяет мне использовать такую команду:

$ yogpt -p blogtran @blog.md > blog_en.md

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

Гораздо лучшим вариантом использования GPT является суммаризация текста, которая позволяет нам извлекать наиболее важную информацию из сообщения в блоге. Предположим, мы хотим получить табличку с короткими описаниями наших постов. Для этого можно использовать вот такой промпт: Пожалуйста, прочти приведенный ниже блогпост в Jekyll Markdown и напиши его краткое содержание. Выводи результаты в формате JSON с полями “title” (заголовок поста) и “summary” (краткое содержание). Вот текст поста:\n{}. Поместим такой текст в summarize.txt, а затем организуем цикл по всем записям в блоге, чтобы извлечь их краткое содержание (здесь я для примера использую старый добрый синтаксис DOS, поскольку сам больше половины времени провожу в командной строке Windows):

for %c in (*.md) do;
  yogpt -m yagpt -p @summarize.txt @%c >> result.json

Это создаст файл result.json, который не будет точно правильно сформированным JSON, но будет выглядеть аналогично:

{
  "title": "Запускаем Jupyter Notebook",
  "summary": "Узнаете, как запустить Jupyter Notebook на компьютере и в облаках, с использованием VSC, Binder и других инструментов."
}
{
  "title": "Творческие Люди - Федерируйтесь!",
  "summary": "Блог-пост о преимуществах использования федеративных сетей Mastodon и Pixelfed для общения и обмена информацией."
}
``json
{
  "title": "Почему не стоит доверять ChatGPT",
  "summary": "В статье показано, как ChatGPT может ошибаться в своих выводах на основе предоставленных данных. Также рассматриваются примеры использования ChatGPT для создания ложных фактов, что доказывает его неспособность точно обрабатывать информацию."
}

В некоторых случаях этот искаженный JSON может включать элементы форматирования markdown, и в нем отсутствует группировка отдельных объектов JSON в единый список. Однако это не имеет значения, если все, что мы хотим сделать - это дополнительно обработать этот результате с помощью GPT, потому что LLM может обрабатывать небольшие отклонения от формата JSON. Например, чтобы получить результат в виде таблицы (HTML или Markdown), мы можем просто сказать:

$ yogpt -p "Пожалуйста, возьми список объектов JSON с полями title и
summary и представь их в виде Markdown-таблицы." -m yagpt
@result.json > result.html

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

ЗаголовокКраткое описание
Запускаем Jupyter NotebookУзнаете, как запустить Jupyter Notebook на компьютере и в облаках, с использованием VSC, Binder и других инструментов.
Творческие Люди - Федерируйтесь!Блог-пост о преимуществах использования федеративных сетей Mastodon и Pixelfed для общения и обмена информацией.
Почему не стоит доверять ChatGPTВ статье показано, как ChatGPT может ошибаться в своих выводах на основе предоставленных данных. Также рассматриваются примеры использования ChatGPT для создания ложных фактов, что доказывает его неспособность точно обрабатывать информацию.

Конечно, мы также можем попросить GPT представить это в виде таблицы HTML, или в виде последовательности SQL-инструкций для вставки данных в базу данных.

$ yogpt -m yagpt -p "Пожалуйста, возьми список объектов JSON с полями
  title и summary из запроса ниже и представь их в виде SQL-инструкций
  INSERT для вставки в базу данных." @res > result.sql

И вот что получится:

INSERT INTO article (title, summary) VALUES
('Запускаем Jupyter Notebook', 'Узнаете, как запустить Jupyter Notebook на компьютере и в облаках, с использованием VSC, Binder и других инструментов.'),
('Творческие Люди - Федерируйтесь!', 'Блог-пост о преимуществах использования федеративных сетей Mastodon и Pixelfed для общения и обмена информацией.'),
('Почему не стоит доверять ChatGPT', 'В статье показано, как ChatGPT может ошибаться в своих выводах на основе предоставленных данных. Также рассматриваются примеры использования ChatGPT для создания ложных фактов, что доказывает его неспособность точно обрабатывать информацию.');

В дополнение к краткому содержанию блога, я могу попросить GPT подготовить для каждого поста “продающий текст”, который затем можно будет разместить на главной странице в качестве тизера. Мне просто нужно немного скорректировать подсказку: Пожалуйста, прочитай приведённый ниже блог-пост в формате Jekyll Markdown и напиши короткий продающий текст, который увлечёт читателя и заставит его прочитать пост. Результат представь в формате JSON с полями “title” и “selling_text”. Вот сам пост: {}. После повторения всех описанных выше шагов с новым приглашением результатом будет:

ЗаголовокПродающий текст
Как запустить Jupyter NotebookДва подхода: установить Python-окружение у себя на компьютер или запустить в облаке онлайн.
Творческие люди — федерируйтесьВ связи с изменениями в Twitter, многие ищут альтернативы. Mastodon — интересный вариант.
ChatGPT: не всё то золото, что нейросетьУзнайте, почему нейросети не всегда могут быть точными и надежными источниками информации.

Обратите внимание, что все эти таблицы, включая форматирование, были созданы автоматически из оригинальных записей в блоге с использованием всего двух командных строк за считанные минуты!

Заключение

Я думаю, что приведенные выше примеры демонстрируют истинную мощь GPT-моделей, которые теперь, благодаря yogpt, вы можете свободно использовать из командной строки! Оставляйте свои комментарии и предложения по работе утилиты на странице GitHub. И если у вас есть какие-то идеи о том, как улучшить инструмент - лучшим способом сделать это будет pull request!

Приятной работы! Наслаждайтесь yogpt!

Диалоги и обсуждения