aia
AI モデルとの対話を容易にするコマンドライン ユーティリティです。合成前のプロンプトの管理を自動化し、コンテキスト ウィンドウ サイズが増加した最新の LLM を利用して、それらのプロンプト上で生成 AI (Gen-AI) コマンドを実行します。
これは、 prompt_manager
gem を利用して、 mods
およびsgpt
CLI ユーティリティのプロンプトを管理します。プロンプトファイルの検索には「ripgrep」を利用します。検索語とあいまい一致に基づいてプロンプト選択を行うためにfzf
使用します。
最新の変更: 変更ログを参照してください。
参考までに…私は
develop
ブランチで、 mod や llm などのバックエンド LLM プロセッサへの依存関係を削除する作業を行っています。私は aia をリファクタリングして、すべてのモデルとすべてのプロバイダーにアクセスできる ai_client という独自のユニバーサル クライアント gem を使用します。
aia
固有の指令コマンドllm
sgpt
plz
以下を実行して gem をインストールします。
gem install aia
次のコマンドを実行して、コマンドライン ユーティリティをインストールします。
brew install mods fzf ripgrep
また、プロンプト テキスト ファイル、最後に使用したパラメータ、使用状況ログ ファイルを保存するファイル システム内にディレクトリを確立する必要もあります。
プロンプト ディレクトリを指す「AIA_PROMPTS_DIR」という名前のシステム環境変数 (envar) を設定します。デフォルトは「.prompts」という名前の HOME ディレクトリにあります。環境変数「AIA_ROLES_DIR」は、LLM が作業を行うときに引き受けるさまざまな役割を定義するプロンプトが含まれる役割ディレクトリを指します。デフォルトのロール ディレクトリは、プロンプト ディレクトリ内にあります。その名も「ロール」。
シェルの完了スクリプトをインストールすることもできます。完了スクリプトのコピーを取得するには、次の手順を実行します。
aia --completion bash
fish
とzsh
も利用できます。
-h
または--help
を使用して取得された使用状況レポートは、標準のman
ページとして実装されます。 --help --verbose
と-h -v
一緒に使用すると、 aia
マニュアル ページだけでなく、 backend
LLM 処理ツールから使用状況レポートも取得できます。
$ aia --help
aia
設定のデフォルトは、プレフィックス「AIA_」の後に大文字の設定項目名を付けたシステム環境変数(envar)によって上書きできます。すべての設定項目は、この方法で envar によって上書きできます。次の表にいくつかの例を示します。
構成アイテム | デフォルト値 | 環境キー |
---|---|---|
バックエンド | 改造 | AIA_BACKEND |
構成ファイル | なし | AIA_CONFIG_FILE |
デバッグ | 間違い | AIA_DEBUG |
編集 | 間違い | AIA_編集 |
余分な | 」 | AIA_EXTRA |
ファジー | 間違い | AIA_FUZZY |
ログファイル | ~/.prompts/_prompts.log | AIA_LOG_FILE |
値下げ | 真実 | AIA_MARKDOWN |
モデル | gpt-4-1106-プレビュー | AIA_MODEL |
出力ファイル | 標準出力 | AIA_OUT_FILE |
プロンプト_ディレクトリ | ~/.プロンプト | AIA_PROMPTS_DIR |
スピーチモデル。 | tts-1 | AIA_SPEECH_MODEL |
冗長な | 間違い | AIA_VERBOSE |
声 | 合金 | AIA_VOICE |
完全なリストについては、 cli.rb
ファイルの@options
ハッシュを参照してください。一部の構成項目は、envar オーバーライドとして使用するのが必ずしも意味をなさないものがあります。たとえば、 export AIA_DUMP_FILE=config.yaml
を設定した場合、 aia
現在の構成 config.yaml をダンプし、最終的にunset AIA_DUMP_FILE
まで、実行されるたびに終了します。
aia
のこれらの構成項目に加えて、バックエンド プロンプト処理ユーティリティ (mods および sgpt) のオプションのコマンド ライン パラメーターも、接頭辞「AIA_」が付いた envars を使用して設定できます。たとえば、「export AIA_TOPP=1.0」は、バックエンド プロセッサとして使用される場合、 mods
ユーティリティのコマンド ライン オプション「--topp 1.0」を設定します。
オプション--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 アシスタントとのチャットを続けることができます。
--shell
オプションによって提供されるシェル統合による動的コンテンツの組み込みは重要です。 aia
プロンプト テキスト内に埋め込まれた Ruby コード処理の全機能も提供します。
--erb
オプションを使用すると、プロンプト テキスト ファイルが完全に機能する ERB テンプレートに変わります。 Embedded Ruby (ERB) テンプレート構文 (2024) は、ERB の構文と機能の概要を示しています。
ERB に関する情報を掲載しているほとんどの Web サイトには、ERB を使用して Web ベースのアプリケーション用の動的な HTML コンテンツを生成する方法の例が記載されています。これは ERB の一般的な使用例です。一方、 aia
ERB を使用して動的なプロンプト テキストを生成します。
チャット セッションでは、 --chat
オプションによって開始されるか、プロンプト テキスト ファイル内のディレクティブを使用した同等のオプションによって開始されるかにかかわらず、そのバインドとローカル変数の割り当てに応じて動作が少し異なります。チャット セッションには定義上複数のプロンプトがあるため、1 つのプロンプトでローカル変数を設定し、それが後続のプロンプトで使用できることを期待しても機能しません。情報の引き継ぎを促すこのプロンプトを実行するには、インスタンス変数を使用する必要があります。
また、フォローアップ プロンプトは単一のもの (文または段落) で 1 回のリターンで終了することが予想されるため、ERB の強化が役立つ可能性があります。ただし、用途が見つかるかもしれません。
ダウンストリーム処理ディレクティブは、バージョン 0.4.1 でau
が使用するprompt_manager
gem に追加されました。これらのディレクティブは、次のパターンを持つ「//」で始まるプロンプト テキスト ファイル内の行です。
//command parameters
「//」とコマンドの間にスペースは入れません。
プロンプト ディレクティブをプロンプト パラメータおよびシェル環境変数置換と組み合わせると、強力な構成プロンプトを取得できます。
以下は純粋な汎用ディレクティブの例です。
//[DIRECTIVE_NAME] [DIRECTIVE_PARAMS]
プロンプトが実行されると、各パラメーターの値を指定するように求められます。ディレクティブ名として「shell」と答え、PI の正確な近似値が必要な場合は「calc 22/7」と答えることができます。
このプロンプト ファイルを試してください。
//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 が含まれている場合は、 --shell
CLI オプションを使用して、ディレクティブ内の envar を実際の値に置き換える必要があります。
インクルードされるファイルには、コメントやディレクティブが除外されます。ファイルはテキスト ファイルであることが想定されているため、その内容は既存のプロンプトの前に追加できます。ただし、ファイルがソース コード ファイル (例: file.rb) の場合、ソース コードは含まれますが、コメント行や「//」で始まる行は除外されます。
TODO: コマンド ライン オプション--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
ディレクティブが実行され、バックエンドから生成されたより長い応答とともに新しいフォローアップ プロンプトを入力できます。
バッチ状況で一連のプロンプトを使用する必要があるのはなぜですか。おそらく、入力用のモデルのトークン制限を超える複雑なプロンプトがあるため、それを複数の部分に分割する必要があると考えられます。または、これは単純なプロンプトですが、出力上のトークンの数が制限されており、探していた種類の完全な応答が正確に得られないとします。
必要な種類の応答を得るには、一連のプロンプトが必要な場合があります。 1 つのプロンプトからの応答は、次のプロンプトのコンテキストになります。これは、希望する種類の応答が得られるまで手動でプロンプトを入力して調整する場合、 chat
セッション内で簡単に行うことができます。
これを定期的に、またはバッチ内で行う必要がある場合は、 aia
、 --next
、および--pipeline
コマンド ライン オプションを使用できます。
これら 2 つのオプションは、処理するプロンプト ID のシーケンスを指定します。どちらのオプションも、 //config
ディレクティブを使用してプロンプト ファイル内で使用できます。すべての埋め込みディレクティブと同様に、パラメータ化シェルの統合と Ruby を利用できます。私は TIm ツールマンになったように感じ始めています - さらにパワーアップ!
順番に処理する必要があるプロンプト ID が 4 つある状況を考えてみましょう。 ID と関連するプロンプト ファイル名は次のとおりです。
プロンプトID | プロンプトファイル |
---|---|
1つ。 | one.txt |
二。 | 2.txt |
三つ。 | 3.txt |
4つ。 | 4.txt |
export AIA_OUT_FILE=temp.md
aia one --next two
aia three --next four temp.md
または、各プロンプト ファイル内で config ディレクティブを使用します。
one.txt contains //config next two
two.txt contains //config next three
three.txt contains //config next four
ただし、シーケンス内に 3 つ以上のプロンプトがある場合は、--pipeline オプションの使用を検討してください。
ディレクティブ //next は //config next の短縮形です。
aia one --pipeline two,three,four
または、 one.txt
プロンプト ファイル内で次のディレクティブを使用します。
//config pipeline two,three,four
ディレクティブ //pipeline は、//config Pipeline の短縮形です。
すべてのプロンプトに同じ出力ファイルに応答を書き込むのではなく、1 つのプロンプトの応答がシーケンス内の次のプロンプトに供給されるため、関連するプロンプト ファイル内で次のディレクティブを使用します。
プロンプトファイル | 指令 |
---|---|
one.txt | //out_file one.md を設定します |
2.txt | //out_file two.md を設定します |
3.txt | //out_file three.md を設定します |
4.txt | //out_file four.md を設定します |
こうすることで、シーケンス内の各プロンプトに対して生成された応答を確認できます。
TODO: 音声からテキストへの変換はまだ開発中です。
会議の音声ファイルがあるとします。その会議で話された内容の文字起こしを入手するにはどうすればよいでしょうか。生の文字起こしでは録音の本当の価値が隠されている場合があるため、生の文字起こしを取得し、アクション アイテムのリストを使用して技術的な概要を示すポンプを作成しました。
transcribe.txt と tech_summary.txt という名前の 2 つのプロンプトを作成します。
# 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
ファイルにあります。
プロンプトには 2 種類あります
2 番目の種類のプロンプトはロールと呼ばれます。場合によっては、その役割が指導に組み込まれることもあります。たとえば、「マジシャンとして、帽子からウサギを出現させます。」複数のプロンプトで同じロールを再利用するには、 aia
擬人化 (ロール) に固有のプロンプトを入れる特別なroles_dir
指定することをお勧めします。
デフォルトのroles_dir
、rolesという名前のprompts_dir
のサブディレクトリです。ただし、 roles_dir
、自分にとってわかりやすい場所であればどこにでも置くことができます。
--role
オプションは、LLM が応答を提供するコンテキストを定義する、roles ディレクトリ内の擬人化プロンプトを識別するために使用されます。ロール ID のテキストがプライマリ プロンプトのテキストの前に追加され、バックエンドで処理される完全なプロンプトが形成されます。
たとえば、次のことを考えてみましょう。
aia -r ruby refactor my_class.rb
完全なプロンプトを生成するために、roles ディレクトリ内では、テキスト ファイルruby.txt
の内容が、prompts ディレクトリの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
プロンプトを完了するためにキーワード「ROLE」とキーワード「SUBJECT」の値を要求します。 aia
以前の回答の履歴を保持しているため、過去に使用したものを選択することも、まったく新しい値で回答することもできます。
aia で使用される外部 CLI プログラムをインストールするには、次の手順を実行します。
brew install fzf mods rg グロー
fzf Go で書かれたコマンドライン ファジー ファインダー https://github.com/junegunn/fzf
コマンドラインでの mods AI https://github.com/charmbracelet/mods
grep や The Silver Searcher のような rg 検索ツール https://github.com/BurntSushi/ripgrep
Glow 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
も、OpenAI を通じてプロンプトを処理する CLI ツールの Python 実装です。 mods
やllm
よりも機能が少なく、柔軟性も劣ります。
plz
plz-cli
別名plz
aia
と統合されていませんが、コマンドラインで何かを行うのに合わせたプロンプトを除外する機能が高く評価されています。その応答は、プロンプトに示されたタスクを実行する CLI コマンド (パイプされたシーケンスである場合もあります) です。コマンドを実行するためのクエリで指定したデータ ファイルに対して実行されるコマンドが返されます。
prompts_dir
に保存されたプロンプト ID で完了する完了関数をシェルでセットアップできます。 bash
、 fish
、およびzsh
の関数が利用可能です。これらの関数のコピーを取得するには、次の操作を実行します。
aia --completion bash
「生まれ変わる」のファンではない場合は、 bash
他のものに置き換えてください。
関数をシェルのインスタンスにインストールできる場所にコピーします。これは、 .profile
または.bashrc
ファイルなどである可能性があります。
これはあなたと私の間だけの話なので、みんなにこのことを話さないでください。私の最も強力なプロンプトは、 ad_hoc.txt
という名前のファイルにあります。次のようになります。
【今の人間とは】
はい。その時点で考えている値を指定できる 1 つのパラメーターだけです。その利点は、シェルのコマンド履歴を大量のテキストで汚さないことです。
シェルの履歴ファイルに含めるのはどれが良いと思いますか?
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 ツールは、私のスクリプト リポジトリ内のファイル内の数行のルビとして誕生しました。より多くの機能とバックエンド ツールを追加することに決めたので、私は成長を続けています。設計をガイドする実際のアーキテクチャはありませんでした。残ったのは大規模なコードの混乱ですが、より保守しやすいものに徐々にリファクタリングされています。その作業はdevelop
ブランチで行われます。助けていただければ幸いです。そのブランチで何が起こっているかを調べて、それに対する PR を私に送ってください。
もちろん、メイン ブランチで何かを見つけた場合は、そのブランチに対する PR を私に送ってください。そうすれば、全員の問題を解決できるようになります。
バグレポートとプルリクエストは、GitHub (https://github.com/MadBomber/aia) で受け付けています。
aia
に関する問題を見つけた場合は、それを問題として記録してください。これは主に人間によって書かれたものであり、人間がいかに間違いを起こしやすいかをご存知でしょう。たくさんのエラーが見つかるはずです。
外部コマンドの一部のコマンド ライン オプションがハードコーディングされている方法に満足していません。具体的には、 rg
ツールとfzf
ツールの使用方法について説明します。これらのオプションにより、コマンド ラインでの検索機能の基本的な外観と操作性が決まります。ユーザーが好みに合わせて UI を調整できるように、それらは全体的な構成の一部である必要があるかもしれません。
この gem は、MIT ライセンスの条件に基づいてオープン ソースとして利用できます。