使用存儲適配器(例如Filesystemadapter,sqliteadapter和activeRecordAdapter)來管理生成AI(又名Chatgpt,OpenAi等)中使用的參數化提示(文本)。
版本0.3.0的打破變化- 關鍵字的參數哈希值現在是數組而不是單個值。數組中的最後一個值始終是給定關鍵字的最新值。這樣做是為了支持使用readline ::歷史對像在AIA CLI工具中編輯
通過執行:安裝寶石並添加到應用程序的Gemfile:
bundle add prompt_manager
如果不使用Bundler來管理依賴項,請通過執行來安裝GEM:
gem install prompt_manager
請參閱示例/simple.rb
另請參見示例/used_search_proc.rb
prompt_manager GEM提供了功能來管理具有生成AI進程的關鍵字和指令的提示。
Gen-AI涉及人類自然語言文本(“提示”)的轉換(有些人會說執行)使用所謂的大語言模型(LLM),例如從Openai獲得的內容。參數化的提示是有一個嵌入式關鍵字(參數)的提示,它們是將其他文本插入提示符的位置持有人。
提示_manager使用正則表達式在提示中識別這些關鍵字。它將關鍵字用作parameters哈希中的鍵,該鍵以序列化形式存儲在及時文本中 - 例如,作為JSON。
默認情況下,在方括號中包含的任何匹配[UPPERCASE_TEXT]的文本都被視為關鍵字。 [關鍵字也可以具有空格]以及下劃線字符。
您可以通過設置不同的正則表達式來自定義關鍵字模式:
# Use {{param}} style instead of [PARAM]
PromptManager :: Prompt . parameter_regex = /( { { [A-Za-z_]+ } } )/正則必須包括捕獲括號()以提取關鍵字。默認的正則是/([[AZ _|]+])/ 。
指令是及時文本中的一行,從兩個字符'//' - 斜線斜線開頭 - 就像在IBM JCL的過去一樣 - 工作控制語言。提示可以具有零或更多指令。指令可以具有參數,並且可以使用關鍵字。
prompt_manager僅收集指令。它從指令線提取關鍵字,並像提示一樣,用其他文本替換這些關鍵字。
這是帶有註釋,指令和關鍵字的示例提示文本文件:
# prompts/sing_a_song.txt
# Desc: Has the computer sing a song
//TextToSpeech [LANGUAGE] [VOICE NAME]
Say the lyrics to the song [SONG NAME]. Please provide only the lyrics without commentary.
__END__
Computers will never replace Frank Sinatra
從提示中獲取指令就像獲取Kewyords一樣容易:
prompt = PromptManager :: Prompt . new ( ... )
prompt . keywords #=> an Array
prompt . directives #=> an Array of entries like: ['directive', 'parameters']
# to_s builds the prompt by substituting
# values for keywords amd removing comments.
# The resulting text contains directives and
# prompt text ready for the LLM process.
puts prompt . to_s prompt.directives返回的數組中的條目是按照提示中定義指令的順序。每個條目都有兩個元素:
由於在提示中的關鍵字被替換為其值之後收集了指示,因此可以將動態生成的指令作為提示的一部分。例如:
//[COMMAND] [OPTIONS]
# or
[SOMETHING]
... [命令]被某個指令名稱所取代。 [某物]可以用“ //指令選項”代替
prompt_manager GEM僅收集指令。執行這些指令的流程流程。以下是有關如何在下游過程中使用指令的一些想法:
mods實用程序。這完全取決於您的應用程序想要如何支持指令。
prompt_manager寶石忽略了評論。以“#” - 磅(aka hash)字符開頭的行是一條評論。遵循文件末尾的行的任何行都被視為註釋。基本上是“末端”文件的末尾。該行之後沒有任何過程。
寶石還忽略了空白線。
存儲適配器是一個類實例,它將PromptManager::Prompt類綁定到保存實際提示的存儲設施。目前,計劃實施3個存儲適配器。
PromptManager::Prompt支持一小部分方法。存儲適配器可以提供可以通過提示類使用的“額外”類或實例方法。有關創建新的存儲適配器的指南,請參見test/prompt_manager/prompt_test.rb 。
這是開發的第一個存儲適配器。它將提示在文件系統中保存在指定的prompts_dir (目錄)中的文件系統中,例如~/.prompts或對您最有意義的地方。另一個示例是將您的目錄在共享文件系統上放置,以便其他人可以使用相同的提示。
prompt ID是文本文件的Basename。例如, todo.txt是提示ID todo的文件(請參閱示例目錄。)
todo提示ID的參數保存在名為todo.json的JSON文件中的與todo.txt相同的目錄中(也在示例目錄中。)。
使用config Block建立課程的配置。
PromptManager :: Storage :: FileSystemAdapter . config do | o |
o . prompts_dir = "path/to/prompts_directory"
o . search_proc = nil # default
o . prompt_extension = '.txt' # default
o . params_extension = '.json' # default
end config塊返回self ,這樣您就可以使用提示類來設置存儲適配器:
PromptManager :: Prompt
. storage_adapter =
PromptManager :: Storage :: FileSystemAdapter
. config do | config |
config . prompts_dir = 'path/to/prompts_dir'
end . new 這是String或Pathname對象。所有文件路徑均以Pathname對象保持在類中。如果提供一個String ,它將被轉換。相對路徑將轉換為絕對路徑。
當prompts_dir不存在或不是目錄時,將提高ArgumentError 。
search_proc的默認值為nil,這意味著搜索將通過默認search方法預先形成,該方法基本上正在讀取所有提示文件,以查看哪個文件包含搜索詞。它將為每個提示文件返回包含搜索詞的每個提示文件的提示ID數組。它可以按照應用程序選擇要使用的返回的提示ID。
搜索和選擇文件的方法更快。例如,有專門的搜索和選擇實用程序可用於命令行。 examples目錄包含一個名為rgfzf的bash腳本,該腳本使用rg (又稱ripgrep )進行搜索和fzf進行選擇。
請參閱示例/used_search_proc.rb
這兩個配置選項是必須從一個週期開始的String對象。將提出一個ArgumentError 。
當前, FileSystemAdapter僅支持JSON Serialializer的參數哈希。使用這些擴展的任何其他值都會引起問題。
它們存在,以便可以在某些平台上構建其他存儲適配器或添加序列化器。目前不在路線圖上。
# ~/.prompts/joke.txt
# Desc: Tell some jokes
Tell me a few [KIND] jokes about [SUBJECT]
注意頂部的命令行。這是我使用的慣例。它不是軟件的一部分。我發現它有助於記錄提示。
{
"[KIND]" : [
" pun " ,
" family friendly "
],
"[SUBJECT]" : [
" parrot " ,
" garbage man " ,
" snowman " ,
" weather girl "
]
}關鍵字數組中的最後一個值是該關鍵字的最新值。這是自v0.3.0以來建立的功能。其目的是提供一個值的歷史記錄,用戶可以從中選擇重複一個先前的值或選擇先前的值並將其編輯為新事物。
FileSystemAdapter添加了兩種新方法,以在Prompt類中使用:
Pathname對象返回到提示文件使用path(prompt_id)表格與Prompt Prompt使用prompt.path
ActiveRecordAdapter假設應用程序已經配置了一個數據庫,該數據庫需要prompt_manager ,該數據庫具有包含提示內容的模型。該模型必須至少具有三列,其中包含:
這三個元素的模型和列可以具有任何名稱。這些名稱在其配置塊中提供給ActiveRecordAdapter 。
使用config Block建立課程的配置。
PromptManager::Prompt類期望存儲適配器類的實例。通過慣例存儲適配器類配置方法將返回self ,以便在配置建立實例之後的簡單new 。
PromptManager :: Prompt
. storage_adapter =
PromptManager :: Storage :: ActiveRecordAdapter . config do | config |
config . model = DbPromptModel # any ActiveRecord::Base model
config . id_column = :prompt_name
config . text_column = :prompt_text
config . parameters_column = :prompt_params
end . new # adapters an instances of the adapter class model配置參數是ActiveRecord::Base或ApplicationRecord的實際類名(如果您使用的是Rails應用程序),其中包含用於提示的內容。
id_column包含包含“提示ID”內容的列的名稱。它可以是String或Symbol值。
text_column包含包含提示的實際原始文本的列的名稱。此原始文本可以包括關鍵字,這些關鍵字將被參數哈希中的值所取代。列名值可以是String或Symbol 。
parameters_column包含包含用於替換提示文本中關鍵字的參數的列的名稱。數據庫模型中的此列預計將被序列化。 ActiveRecordAdapter當前具有一定的代碼,假定該序列化是使用JSON完成的。參數的值_column可以是String或Symbol 。
TODO:修復kludge,以便可以使用任何序列化。
有很多可能性可以示例存儲適配器的插件概念。這裡有一些要考慮的地方:
尋找反饋和貢獻者以增強提示_Manager的功能。
歡迎在https://github.com/madbomber/prompt_manager上的GitHub上的錯誤報告和拉動請求。
根據MIT許可證的條款,該寶石可作為開源。