使用存储适配器(例如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许可证的条款,该宝石可作为开源。