aia
是一個命令列實用程序,可促進與 AI 模型的互動。它可以自動管理預作文提示,並利用現代法學碩士增加的上下文視窗大小,在這些提示上執行生成人工智慧 (Gen-AI) 命令。
它利用prompt_manager
gem 來管理mods
和sgpt
CLI 實用程式的提示。它利用“ripgrep”來搜尋提示檔。它使用fzf
基於搜尋字詞和模糊匹配進行提示選擇。
最近的變更:請參閱變更日誌
僅供參考...我正在
develop
分支工作,以消除對後端 LLM 處理器(如 mods 和 llm)的依賴。我正在重構 aia 以使用我自己的通用客戶端 gem,稱為 ai_client,它可以存取所有模型和所有提供者。
aia
特定指令命令llm
sgpt
plz
透過執行以下命令安裝 gem:
gem install aia
透過執行以下命令安裝命令列實用程式:
brew install mods fzf ripgrep
您還需要在檔案系統中建立目錄,用於保存提示文字檔案、上次使用的參數和使用日誌檔案。
設定名為「AIA_PROMPTS_DIR」的系統環境變數 (envar),該變數指向提示目錄。預設位於名為“.prompts”的主目錄中。 envar「AIA_ROLES_DIR」指向您的角色目錄,其中有提示定義您希望 LLM 在執行其工作時承擔的不同角色。預設角色目錄位於提示目錄內。它的名字是「角色」。
您可能還想為您的 shell 安裝完成腳本。若要取得完成腳本的副本,請執行以下操作:
aia --completion bash
fish
和zsh
也可用。
使用-h
或--help
所獲得的使用報告實作為標準man
頁。您可以同時使用-h -v
的--help --verbose
來不僅取得aia
手冊頁,還可以取得backend
LLM 處理工具的使用情況報告。
$ aia --help
aia
配置預設值可以被系統環境變數(envars)覆蓋,前綴為“AIA_”,後面跟著大寫的配置項目名稱。所有配置項都可以透過 envar 以這種方式覆蓋。下表顯示了一些範例。
配置項 | 預設值 | 恩瓦爾鍵 |
---|---|---|
後端 | 模組 | AIA_BACKEND |
設定檔 | 零 | AIA_配置_文件 |
偵錯 | 錯誤的 | AIA_調試 |
編輯 | 錯誤的 | AIA_編輯 |
額外的 | 」 | AIA_額外 |
模糊 | 錯誤的 | AIA_模糊 |
記錄檔 | 〜/.prompts/_prompts.log | AIA_日誌_文件 |
降價 | 真的 | AIA_MARKDOWN |
模型 | gpt-4-1106-預覽 | AIA_模型 |
輸出檔案 | 標準輸出 | AIA_輸出_文件 |
提示目錄 | ~/.提示符 | AIA_PROMPTS_DIR |
語音_模型。 | tts-1 | AIA_SPEECH_MODEL |
冗長的 | 錯誤的 | AIA_VERBOSE |
嗓音 | 合金 | 友邦語音 |
有關完整列表,請參閱cli.rb
檔案中的@options
哈希。有一些配置項不一定適合用作 envar 覆蓋。例如,如果您設定了export AIA_DUMP_FILE=config.yaml
,那麼aia
將轉儲目前設定config.yaml並在每次執行時退出,直到您最終unset AIA_DUMP_FILE
除了aia
的這些配置項目之外,還可以使用帶有“AIA_”前綴的環境變數來設定後端提示處理實用程式(mods 和 sgpt)的可選命令列參數。例如,當 mods 實用程式用作後端處理器時,「export AIA_TOPP=1.0」將為mods
實用程式設定「--topp 1.0」命令列選項。
使用選項--shell
使aia
能夠從提示文字內部存取終端的 shell 環境。
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
選項啟動聊天工作階段時,shell 整合將在後續提示中可用。假設您使用一卷「Ruby Expert」啟動了一個聊天會話,希望討論可以對特定類別進行的更改,但在開始時您忘記了將類別來源檔案作為上下文的一部分包含在內。您可以輸入此內容作為後續提示以繼續:
The class I want to chat about refactoring is this one: $(cat my_class.rb)
這會將整個類別來源檔案插入後續提示中。您可以繼續與 AI 助理討論課程的變更。
透過--shell
選項提供的 shell 整合包含動態內容非常重要。 aia
也在提示文字中提供了嵌入式 Ruby 程式碼處理的全部功能。
--erb
選項將提示文字檔案轉換為功能齊全的 ERB 範本。嵌入式 Ruby (ERB) 模板語法 (2024) 很好地概述了 ERB 的語法和功能。
大多數提供有關 ERB 資訊的網站都會提供如何使用 ERB 為基於 Web 的應用程式產生動態 HTML 內容的範例。這是 ERB 的常見用例。另一方面, aia
使用 ERB 產生動態提示文字。
在聊天會話中,無論是由--chat
選項啟動還是由提示文字檔案中的指令等效啟動,其綁定和局部變數分配的行為都略有不同。由於聊天會話根據定義有多個提示,因此在一個提示中設定局部變數並期望它在後續提示中可用是行不通的。你需要使用實例變數來完成這個提示,提示訊息的結轉。
此外,由於後續提示預計是一個單一的事物(句子或段落),並以單一返回結束,因此 ERB 增強可能會帶來好處;但是,您可能會發現它的用處。
下游處理指令已新增至au
在 0.4.1 版本中使用的prompt_manager
gem 中。這些指令是提示文字檔案中以“//”開頭的行,具有以下模式:
//command parameters
“//”和指令之間沒有空格。
當您將提示指令與提示參數和 shell envar 替換結合起來時,您可以獲得一些強大的組合提示。
這是一個純通用指令的範例。
//[DIRECTIVE_NAME] [DIRECTIVE_PARAMS]
當提示符號運作時,系統會要求您提供每個參數的值。如果您想要 PI 的不良近似值,您可以回答「shell」作為指令名稱,並回答「calc 22/7」。
試試這個提示檔:
//shell calc [FORMULA]
What does that number mean to you?
aia
特定指令命令目前aia
只有少數指令,詳細資料如下。
提示文字檔案中的//config
指令用於自訂提示的特定設定環境。所有配置項都可以變更其值。配置項的賦值順序從預設值開始,預設值被 envar 值替換,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
預計 shell 命令將傳回一些文字到 STDOUT,該文字將放在提示檔案中現有的提示文字之前。
shell 指令的內容沒有限制。例如,如果您想要繞過從文件中刪除註釋和指令,您可以執行以下操作:
//shell cat path_to_file
它的作用與//include
指令基本相同,只是它使用文件的全部內容。對於相對檔案路徑,同樣的情況也適用。文件的路徑將相對於 PWD。
請參閱後端支援的指令的原始程式碼,這些指令目前也是基於配置的。
例如mods
有一個設定項topp
,可以直接透過提示文字檔中的指令設定。
//topp 1.5
如果mods
不是後端,則//topp
指令將被忽略。
當您處於聊天會話中時,您可以使用指令作為後續提示。例如,如果您使用選項--terse
開始聊天會話,希望從後端獲得簡短的答案;但是,然後您決定想要更全面的答案,您可以這樣做:
//config terse? false
該指令被執行,並且可以輸入新的後續提示以及從後端產生的更長的回應。
為什麼您需要/想要在批次情況下使用一系列提示。也許您有一個複雜的提示,超出了模型輸入的標記限制,因此您需要將其分成多個部分。或者假設它是一個簡單的提示,但輸出上的標記數量有限,而且您沒有得到您正在尋找的那種完整響應。
有時需要一系列提示才能獲得您想要的回應。一個提示的回應將成為下一個提示的上下文。如果您手動輸入並調整提示,直到您獲得所需的回應,那麼在chat
會話中很容易做到這一點。
如果您需要定期或批次執行此操作,可以使用aia
以及--next
和--pipeline
命令列選項。
這兩個選項指定要處理的提示 ID 的順序。這兩個選項都可以透過//config
指令在提示檔中使用。與所有嵌入式指令一樣,您可以利用參數化 shell 整合和 Ruby。我開始感覺自己像 TIm Tool man - 更強大!
考慮這樣的情況:您有 4 個提示 ID 需要依序處理。 ID 和關聯的提示檔案名稱是:
提示ID | 提示文件 |
---|---|
一。 | 一.txt |
二。 | 二.txt |
三。 | 三.txt |
四。 | 四.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
但如果序列中有兩個以上的提示,請考慮使用 --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二.md |
三.txt | //配置out_file三.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 提供其回應的上下文。角色 ID 的文字附加在主提示文字之前,以形成要由後端處理的完整提示。
例如考慮:
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
將要求您提供關鍵字「ROLE」和關鍵字「SUBJECT」的值以完成提示。由於aia
保留了您先前答案的歷史記錄,因此您可以選擇過去使用過的內容或使用全新的值來回答。
要安裝 aia 使用的外部 CLI 程式:
釀造安裝 fzf mods rg 發光
fzf 用 Go 寫的命令列模糊查找器 https://github.com/junegunn/fzf
命令列上的 mods 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 命令(有時是管道序列),用於完成提示中規定的任務。它將傳回要根據您透過查詢指定的資料檔案執行的命令來執行命令。
您可以在 shell 中設定一個完成函數,該函數將在您的prompts_dir
目錄中儲存的提示 ID 上完成 - bash
、 fish
和zsh
的函數可用。若要取得這些函數的副本,請執行下列操作:
aia --completion bash
如果您不喜歡“重生”,請將bash
替換為其他之一。
將該函數複製到您的 shell 實例中可以安裝的位置。這可能是.profile
或.bashrc
檔案等。
這只是你我之間的事,所以不要向所有人閒聊。我最強大的提示位於名為ad_hoc.txt
的檔案中。它看起來像這樣:
[現在的人類]
是的。只是一個參數,我可以提供我當時想到的任何值。它的優點是我不會用大量文字污染 shell 的命令歷史記錄。
您認為 shell 的歷史文件包含哪個比較好?
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
不會將提示文字放入 shell 的歷史文件中......當然,關鍵字/參數值會保存在提示的 JSON 檔案中,並且會記錄帶有回應的提示,除非指定--no-log
;但是,它並沒有弄亂 shell 歷史!
我使用bash
shell。在我的.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。
當然,如果您在主分支中看到某些內容,請向我發送針對該內容的 PR,以便我們可以解決所有人的問題。
歡迎在 GitHub 上提交錯誤報告和拉取請求:https://github.com/MadBomber/aia。
當您發現aia
有問題時,請將其記為問題。這東西主要是由人類寫的,你知道人類是多麼容易出錯。應該有很多錯誤可以發現。
我對外部命令的某些命令列選項的硬編碼方式不滿意。我具體談論rg
和fzf
工具的使用方式。這些選項決定了命令列上搜尋功能的基本外觀和感覺。也許它們應該成為整體配置的一部分,以便用戶可以按照自己喜歡的方式調整 UI。
該 gem 根據 MIT 授權條款作為開源提供。