Уже есть несколько проектов, которые предоставляют интерфейс командной строки для 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 на ваш локальный компьютер делается одной командой:
Конечно, это работает при условии, что у вас есть доступные инструменты 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!