aia
— это утилита командной строки, которая облегчает взаимодействие с моделями ИИ. Он автоматизирует управление предкомпозиционными подсказками и выполняет команды генеративного искусственного интеллекта (Gen-AI) по этим подсказкам, используя преимущества увеличенного размера контекстного окна современных LLM.
Он использует гем prompt_manager
для управления подсказками для mods
и утилит CLI sgpt
. Он использует «ripgrep» для поиска файлов подсказок. Он использует fzf
для быстрого выбора на основе поискового запроса и нечеткого соответствия.
Самые последние изменения : см. журнал изменений.
К вашему сведению... Я работаю в ветке
develop
, чтобы избавиться от зависимости от серверных процессоров LLM, таких как моды и llm. Я реорганизую aia, чтобы использовать свой собственный универсальный клиентский драгоценный камень под названием ai_client, который предоставляет доступ ко всем моделям и всем поставщикам.
aia
llm
sgpt
plz
Установите драгоценный камень, выполнив:
gem install aia
Установите утилиты командной строки, выполнив:
brew install mods fzf ripgrep
Вам также потребуется создать каталог в вашей файловой системе, где будут храниться текстовые файлы приглашений, последние использованные параметры и файлы журналов использования.
Настройте переменную системной среды (envar) с именем «AIA_PROMPTS_DIR», которая указывает на ваш каталог подсказок. По умолчанию это ваш домашний каталог с именем «.prompts». Envar «AIA_ROLES_DIR» указывает на ваш каталог ролей, где у вас есть подсказки, определяющие различные роли, которые вы хотите, чтобы LLM выполнял свою работу. Каталог ролей по умолчанию находится внутри каталога подсказок. Его название — «роли».
Вы также можете установить сценарий завершения для своей оболочки. Чтобы получить копию сценария завершения, выполните:
aia --completion bash
fish
и zsh
также доступны.
Отчет об использовании, полученный с помощью -h
или --help
реализуется как стандартная страница man
. Вы можете использовать оба --help --verbose
из -h -v
вместе, чтобы получить не только справочную страницу aia
, но и отчет об использовании из backend
инструмента обработки LLM.
$ aia --help
Значения конфигурации aia
по умолчанию могут быть переопределены переменными системной среды (envars) с префиксом «AIA_», за которым следует имя элемента конфигурации, также в верхнем регистре. Таким образом, все элементы конфигурации могут быть переопределены с помощью envar. В следующей таблице показано несколько примеров.
Элемент конфигурации | Значение по умолчанию | ключ энвара |
---|---|---|
серверная часть | моды | AIA_BACKEND |
файл_конфигурации | ноль | AIA_CONFIG_FILE |
отлаживать | ЛОЖЬ | AIA_DEBUG |
редактировать | ЛОЖЬ | AIA_EDIT |
дополнительный | '' | AIA_EXTRA |
нечеткий | ЛОЖЬ | AIA_FUZZY |
файл_журнала | ~/.prompts/_prompts.log | AIA_LOG_FILE |
уценка | истинный | AIA_MARKDOWN |
модель | gpt-4-1106-предварительный просмотр | AIA_MODEL |
исходящий_файл | стандартный вывод | AIA_OUT_FILE |
подсказки_каталог | ~/.prompts | AIA_PROMPTS_DIR |
речь_модель. | ттс-1 | AIA_SPEECH_MODEL |
многословный | ЛОЖЬ | AIA_VERBOSE |
голос | сплав | AIA_VOICE |
Полный список см. в хеше @options
в файле cli.rb
Есть некоторые элементы конфигурации, которые не обязательно имеют смысл использовать в качестве переопределения envar. Например, если вы установите export AIA_DUMP_FILE=config.yaml
, тогда aia
будет сбрасывать текущую конфигурацию config.yaml и завершать работу при каждом запуске, пока вы окончательно unset AIA_DUMP_FILE
В дополнение к этим элементам конфигурации для aia
дополнительные параметры командной строки для внутренних утилит обработки подсказок (mods и sgpt) также могут быть установлены с использованием envars с префиксом «AIA_». Например, «export AIA_TOPP=1.0» установит параметр командной строки «--topp 1.0» для утилиты mods
, когда она используется в качестве внутреннего процессора.
Использование опции --shell
позволяет aia
получить доступ к среде оболочки вашего терминала из текста приглашения.
aia
может заменить любую ссылку на переменную системной среды (envar) в тексте приглашения значением envar. Такие шаблоны, как
Динамический контент можно вставить в приглашение с помощью шаблона
Подумайте о возможности адаптации приглашения к вашей конкретной операционной системе:
As a system administration on a $(uname -v) platform what is the best way to [DO_SOMETHING]
или вставьте содержимое из файла в вашем домашнем каталоге:
Given the following constraints $(cat ~/3_laws_of_robotics.txt) determine the best way to instruct my roomba to clean my kids room.
Когда вы используете опцию --shell
для начала сеанса чата, интеграция оболочки доступна в ваших последующих подсказках. Предположим, вы начали сеанс чата, используя «Ruby Expert», ожидая поговорить об изменениях, которые могут быть внесены в определенный класс, НО вы забыли включить исходный файл класса как часть контекста, когда начали. Вы можете ввести это как последующее приглашение, чтобы продолжить:
The class I want to chat about refactoring is this one: $(cat my_class.rb)
Это вставит весь исходный файл класса в последующее приглашение. Вы можете продолжать общаться с AI Assistant об изменениях в классе.
Включение динамического контента посредством интеграции оболочки, обеспечиваемой опцией --shell
, имеет важное значение. aia
также предоставляет всю мощь встроенной обработки кода Ruby в тексте приглашения.
Опция --erb
превращает текстовый файл приглашения в полнофункциональный шаблон ERB. Синтаксис шаблона Embedded Ruby (ERB) (2024 г.) предоставляет хороший обзор синтаксиса и возможностей ERB.
Большинство веб-сайтов, на которых есть информация о ERB, дадут примеры того, как использовать ERB для создания динамического HTML-контента для веб-приложений. Это обычный вариант использования ERB. aia
с другой стороны, использует ERB для генерации динамического текста подсказки.
В сеансе чата, запущенном опцией --chat
или ее эквивалентом с директивой в текстовом файле приглашения, он ведет себя немного по-другому в зависимости от его привязки и назначения локальных переменных. Поскольку сеанс чата по определению имеет несколько запросов, установка локальной переменной в одном приглашении и ожидание ее доступности в последующем приглашении не работает. Для выполнения этого запроса вам необходимо использовать переменные экземпляра, чтобы запросить перенос информации.
Кроме того, поскольку ожидается, что последующие подсказки будут состоять из одного предложения или абзаца, завершающегося одним возвратом, вполне вероятно, что улучшение ERB принесет пользу; но, возможно, вы найдете ему применение.
Директивы последующей обработки были добавлены в гем prompt_manager
используемый au
в версии 0.4.1. Эти директивы представляют собой строки в текстовом файле приглашения, начинающиеся с «//», имеющие следующий шаблон:
//command parameters
Между «//» и командой нет пробела.
Когда вы комбинируете директивы подсказки с параметрами подсказки и заменами командной строки, вы можете получить мощные композиционные подсказки.
Вот пример чистой общей директивы.
//[DIRECTIVE_NAME] [DIRECTIVE_PARAMS]
При запуске приглашения вам будет предложено ввести значение для каждого параметра. Вы можете ответить «shell» в качестве имени директивы и «calc 22/7», если вам нужно плохое приближение PI.
Попробуйте этот файл подсказки:
//shell calc [FORMULA]
What does that number mean to you?
aia
В настоящее время aia
есть только несколько директив, которые подробно описаны ниже.
Директива //config
в текстовом файле приглашения используется для настройки конкретной среды конфигурации для приглашения. Все элементы конфигурации доступны для изменения их значений. Порядок присвоения значений для элемента конфигурации начинается со значения по умолчанию, которое заменяется значением envar, которое заменяется значением параметра командной строки, которое заменяется значением из файла конфигурации.
//config
— это последний и окончательный способ изменения значения элемента конфигурации для определенного приглашения.
Параметры переключателя обрабатываются как логические значения. Они либо true
, либо false
. Их имя в контексте директивы //config
всегда заканчивается знаком «?». символ - вопросительный знак.
Чтобы установить значение переключателя, используя ``//config, for example
--terse` или `--chat`, выполните следующее:
//config chat? = true
//config terse? = true
Элемент конфигурации, такой как --out_file
или --model
имеет связанное значение в командной строке. Чтобы установить это значение с помощью директивы //config
сделайте это следующим образом:
//config model = gpt-3.5-turbo
//config out_file = temp.md
//config backend = mods
Кстати: "=" - это полностью опции. На самом деле он игнорируется, как и ":=", если вы выбрали его в качестве оператора присваивания. Также количество пробелов между элементом и значением совершенно произвольно. Мне нравится выстраивать вещи в ряд, поэтому этот синтаксис столь же актуален:
//config model gpt-3.5-turbo
//config out_file temp.md
//config backend mods
//config chat? true
//config terse? true
//config model gpt-4
ПРИМЕЧАНИЕ. Если вы укажете одно и то же имя элемента конфигурации более одного раза в файле подсказки, то при окончательной обработке подсказки через LLM будет установлено последнее. Например, в приведенном выше примере в качестве модели будет использоваться gpt-4
. Быть первым в данном случае не считается.
Пример:
//include path_to_file
path_to_file
может быть абсолютным или относительным. Если оно относительное, то оно привязано к PWD. Если path_to_file
включает envar, необходимо использовать параметр CLI --shell
для замены envar в директиве его фактическим значением.
Из включенного файла будут исключены любые комментарии или директивы. Ожидается, что файл будет текстовым, и его содержимое можно будет добавить к существующему приглашению; однако, если файл является файлом исходного кода (например: file.rb), исходный код будет включен ОДНАКО любая строка комментария или строка, начинающаяся с «//», будет исключена.
ЗАДАЧА: рассмотрите возможность добавления параметра командной строки --include_dir
чтобы указать место, из которого должны поступать соответствующие файлы.
Пример:
//ruby any_code_that_returns_an_instance_of_String
Эта директива является дополнением к ERB. На этом этапе директива //ruby
ограничена текущей привязкой, которая находится внутри метода AIA::Directives#ruby
. Таким образом, он вряд ли найдет большое применение.
Однако, поскольку он реализован как простой eval(code)
, существует возможность его использования следующим образом:
//ruby load(some_ruby_file); execute_some_method
Каждое выполнение директивы //ruby
будет новым выполнением метода AIA::Directives#ruby
, поэтому вы не сможете переносить локальные переменные от одного вызова к другому; однако вы можете что-то сделать с переменными экземпляра или глобальными переменными. Вы можете даже добавить что-то в объект AIA.config
, чтобы вставить его при следующем вызове директивы в контексте того же приглашения.
Пример:
//shell some_shell_command
Ожидается, что команда оболочки вернет некоторый текст в STDOUT, который будет предшествовать существующему тексту приглашения в файле приглашения.
Нет никаких ограничений на то, какой может быть команда оболочки. Например, если вы хотите обойти удаление комментариев и директив из файла, вы можете сделать что-то вроде этого:
//shell cat path_to_file
По сути, она делает то же самое, что и директива //include
, за исключением того, что использует все содержимое файла. Для относительных путей к файлам применяется то же самое. Путь к файлу будет относительно PWD.
См. исходный код директив, поддерживаемых серверными модулями, которые в настоящее время также основаны на конфигурации.
Например mods
есть элемент конфигурации topp
, который можно установить директивой непосредственно в текстовом файле подсказки.
//topp 1.5
Если mods
не является серверной частью, директива //topp
игнорируется.
Когда вы находитесь в сеансе чата, вы можете использовать директиву в качестве последующей подсказки. Например, если вы начали сеанс чата с опцией --terse
ожидая получить короткие ответы от серверной части; но затем вы решаете, что вам нужны более полные ответы, вы можете сделать это:
//config terse? false
Директива выполняется, и можно ввести новое последующее приглашение с более длинным ответом, сгенерированным из серверной части.
Зачем вам нужно/хотите использовать последовательность подсказок в пакетной ситуации. Возможно, у вас есть сложное приглашение, которое превышает ограничения токена вашей модели для ввода, поэтому вам нужно разбить его на несколько частей. Или предположим, что это простое приглашение, но количество токенов на выходе ограничено, и вы не получаете именно тот полный ответ, который искали.
Иногда требуется серия подсказок, чтобы получить желаемый ответ. Ответ на одно приглашение становится контекстом для следующего приглашения. Это легко сделать в сеансе chat
, если вы вручную вводите и настраиваете подсказки, пока не получите желаемый ответ.
Если вам нужно делать это регулярно или в пакетном режиме, вы можете использовать aia
и параметры командной строки --next
и --pipeline
.
Эти две опции определяют последовательность идентификаторов приглашений, которые будут обработаны. Оба параметра доступны для использования в файле подсказки с помощью директивы //config
. Как и все встроенные директивы, вы можете воспользоваться преимуществами интеграции оболочки параметризации и Ruby. Я начинаю чувствовать себя человеком из TIm Tool – больше мощности!
Рассмотрим ситуацию, когда у вас есть 4 идентификатора приглашения, которые необходимо обработать последовательно. Идентификаторы и соответствующие имена файлов подсказок:
Идентификатор запроса | Файл подсказки |
---|---|
один. | один.txt |
два. | два.txt |
три. | три.txt |
четыре. | четыре.txt |
export AIA_OUT_FILE=temp.md
aia one --next two
aia three --next four temp.md
или в каждом из файлов приглашений вы используете директиву конфигурации:
one.txt contains //config next two
two.txt contains //config next three
three.txt contains //config next four
НО если в вашей последовательности более двух запросов, рассмотрите возможность использования опции --pipeline.
Директива //next является сокращением от //config next.
aia one --pipeline two,three,four
или внутри файла приглашения one.txt
используйте эту директиву:
//config pipeline two,three,four
Директива //pipeline является сокращением от //config Pipeline.
Поскольку ответ на одно приглашение передается в следующее приглашение в последовательности, вместо того, чтобы все приглашения записывали свой ответ в один и тот же выходной файл, используйте эти директивы внутри связанных файлов приглашений:
Файл подсказки | Директива |
---|---|
один.txt | //конфигурация out_file one.md |
два.txt | //конфигурация out_file two.md |
три.txt | //конфигурируем выходной_файл Three.md |
четыре.txt | //конфигурация out_file four.md |
Таким образом, вы можете увидеть ответ, сгенерированный для каждого запроса в последовательности.
TODO: преобразование аудио в текст все еще находится в стадии разработки.
Предположим, у вас есть аудиофайл встречи. Вам нужно получить транскрипцию того, что было сказано на этой встрече. Иногда необработанные транскрипции скрывают реальную ценность записи, поэтому вы создали помпю, которая берет необработанные транскрипции и составляет техническое резюме со списком действий.
Создайте два запроса с именами transcribe.txt и tech_summary.txt.
# transcribe.txt
# Desc: takes one audio file
# note that there is no "prompt" text only the directive
//config backend client
//config model whisper-1
//next tech_summary
и
# tech_summary.txt
//config model gpt-4-turbo
//config out_file meeting_summary.md
Review the raw transcript of a technical meeting,
summarize the discussion and
note any action items that were generated.
Format your response in markdown.
Теперь вы можете сделать это:
aia transcribe my_tech_meeting.m4a
Краткое изложение встречи находится в файле meeting_summary.md
Есть два вида подсказок
Этот второй вид подсказки называется ролью. Иногда роль включается в инструкцию. Например: «Как волшебник заставь кролика появиться из шляпы». Для повторного использования одной и той же роли в нескольких подсказках aia
рекомендует вам назначить специальный roles_dir
в который вы помещаете подсказки, специфичные для персонификации — роли.
По умолчанию roles_dir
— это подкаталог именованных ролей prompts_dir
. Однако вы можете поместить файл roles_dir
в любое удобное для вас место.
Опция --role
используется для идентификации запроса персонификации в вашем каталоге ролей, который определяет контекст, в котором LLM должен предоставить свой ответ. Текст идентификатора роли добавляется к тексту основного приглашения, образуя полное приглашение, которое будет обработано серверной частью.
Например, рассмотрим:
aia -r ruby refactor my_class.rb
В каталоге ролей содержимое текстового файла ruby.txt
будет добавлено к содержимому файла refactor.txt
из каталога приглашений для создания полного приглашения. Это полное приглашение будет содержать все параметры, за которыми следуют директивы, обработанные перед отправкой объединенного текста приглашения на серверную часть.
Обратите внимание, что --role
— это просто способ добавить этот текстовый файл приглашения в начало другого текстового файла приглашения. Содержимое приглашения «роль» может быть любым. Это не обязательно должна быть реальная роль.
aia
полностью поддерживает дерево каталогов в папке prompts_dir
как способ организации или классификации различных текстовых файлов подсказок.
aia -r sw_eng doc_the_methods my_class.rb
В этом примере текстовый файл подсказки $AIA_ROLES_DIR/sw_eng.txt
добавляется к текстовому файлу подсказки $AIA_PROMPTS_DIR/doc_the_methods.txt
Поскольку aia
поддерживает параметризованные запросы, вы можете включить в приглашение ключевое слово типа «[ROLE]». Например, рассмотрим эту подсказку:
As a [ROLE] tell me what you think about [SUBJECT]
Когда это приглашение будет обработано, aia
запросит у вас значение ключевого слова «РОЛЬ» и ключевого слова «ТЕМА» для завершения запроса. Поскольку aia
сохраняет историю ваших предыдущих ответов, вы можете просто выбрать что-то, что вы использовали в прошлом, или ответить с совершенно новым значением.
Чтобы установить внешние программы CLI, используемые aia:
варить установку модов fzf rg свечение
fzf Нечеткий поисковик командной строки, написанный на Go https://github.com/junegunn/fzf
моды AI в командной строке https://github.com/charmbracelet/mods
Инструмент поиска rg, такой как grep и The Silver Searcher https://github.com/BurntSushi/ripgrep
свечение Рендеринг уценки в CLI https://github.com/charmbracelet/glow
Текстовый редактор, исполняемый файл которого настроен в переменной системной среды «EDITOR» следующим образом:
экспортировать РЕДАКТОР="subl -w"
llm
llm Access large language models from the command-line
| brew install llm
|__ https://llm.datasette.io/
Начиная с aia v0.5.13
внутренний процессор llm
доступен в ограниченной интеграции. Это очень мощная реализация на основе Python, имеющая собственную систему шаблонов подсказок. Причина, по которой он был включен в среду aia
заключается в его способности использовать местные модели LLM.
sgpt
shell-gpt
также известный как sgpt
также является реализацией инструмента CLI на Python, который обрабатывает запросы через OpenAI. Он имеет меньше возможностей, чем mods
и llm
, и менее гибок.
plz
plz-cli
он же plz
не интегрирован с aia
, однако он заслуживает почетного упоминания за свою способность исключать подсказку, предназначенную для выполнения каких-либо действий в командной строке. Его ответом является команда CLI (иногда конвейерная последовательность), выполняющая задачу, указанную в приглашении. Он вернет команды, которые необходимо выполнить, для файлов данных, которые вы указали в запросе на выполнение команды.
Вы можете настроить функцию завершения в своей оболочке, которая будет завершаться по идентификатору Prompt_id, сохраненному в вашем prompts_dir
— доступны функции для bash
, fish
и zsh
. Чтобы получить копию этих функций, сделайте следующее:
aia --completion bash
Если вы не поклонник «рождения заново», замените bash
одним из других.
Скопируйте функцию в место, где ее можно будет установить в экземпляре вашей оболочки. Это может быть файл .profile
или .bashrc
и т. д.
Это только между нами, так что не рассказывайте об этом всем подряд. Моя самая мощная подсказка находится в файле с именем ad_hoc.txt
. Это выглядит так:
[ЧТО СЕЙЧАС ЧЕЛОВЕЧЕСКОЕ]
Ага. Всего лишь один параметр, для которого я могу указать значение всего, что у меня на уме в данный момент. Его преимущество в том, что я не загрязняю историю команд своей оболочки большим количеством текста.
Как вы думаете, что лучше иметь в файле истории вашей оболочки?
mods " As a certified public accountant specializing in forensic audit and analysis of public company financial statements, what do you think of mine? What is the best way to hide the millions dracma that I've skimmed? " < financial_statement.txt
или
aia ad_hoc financial_statement.txt
Оба делают одно и то же; однако aia
не помещает текст приглашения в файл истории оболочки... конечно, значение ключевого слова/параметра сохраняется в файле JSON приглашения, а приглашение с ответом регистрируется, если не указан --no-log
; но это не портит историю оболочки!
Я использую оболочку bash
. В моем файле .bashrc
я загружаю еще один файл с именем .bashrc__aia
, который выглядит следующим образом:
# ~/.bashic_aia
# AI Assistant
# These are the defaults:
export AIA_PROMPTS_DIR= ~ /.prompts
export AIA_OUT_FILE=./temp.md
export AIA_LOG_FILE= $AIA_PROMPTS_DIR /_prompts.log
export AIA_BACKEND=mods
export AIA_MODEL=gpt-4-1106-preview
# Not a default. Invokes spinner.
export AIA_VERBOSE=true
alias chat= ' aia chat --terse '
# rest of the file is the completion function
Вот как выглядит мой файл подсказки chat
:
# ~/.prompts/chat.txt
# Desc: Start a chat session
//config chat ? = true
[WHAT]
Этот инструмент CLI начал свою жизнь как несколько строк Ruby в файле в моем репозитории сценариев. Я просто продолжал расти, поскольку решил добавить больше возможностей и больше серверных инструментов. Не было настоящей архитектуры, которая могла бы служить ориентиром при проектировании. Остался большой беспорядок в коде, который постепенно реорганизуется во что-то более удобное в сопровождении. Эта работа происходит в ветке develop
. Приветствую вашу помощь. Посмотрите, что творится в той ветке, и пришлите мне пиар против этого.
Конечно, если вы увидите что-то в основной ветке, пришлите мне PR против этого, чтобы мы могли решить проблему для всех.
Отчеты об ошибках и запросы на включение приветствуются на GitHub по адресу https://github.com/MadBomber/aia.
Если вы обнаружите проблемы с aia
отметьте их как проблему. Эта вещь была написана в основном человеком, а вы знаете, насколько люди склонны к ошибкам. Ошибок должно быть много.
Меня не устраивает то, как жестко запрограммированы некоторые параметры командной строки для внешних команд. Я конкретно говорю о том, как используются инструменты rg
и fzf
. Эти параметры определяют основной внешний вид возможностей поиска в командной строке. Возможно, они должны быть частью общей конфигурации, чтобы пользователи могли настраивать свой пользовательский интерфейс так, как им нравится.
Гем доступен с открытым исходным кодом в соответствии с условиями лицензии MIT.