Gerencie os avisos parametrizados (texto) usados em IA generativa (também conhecida como chatgpt, Openai, et.al. ) usando adaptadores de armazenamento como o FileSystemAdapter, SQLiteAdApter e ActiveRecordAdApter.
Breaking Change na versão 0.3.0 - O valor do hash dos parâmetros para uma palavra -chave agora é uma matriz em vez de um único valor. O último valor na matriz é sempre o valor mais recente usado para a palavra -chave fornecida. Isso foi feito para apoiar o uso de um readline :: History Object Editing in the AIA CLI Tool
Instale a gema e adicione ao GemFile do aplicativo executando:
bundle add prompt_manager
Se o Bundler não estiver sendo usado para gerenciar dependências, instale a gema executando:
gem install prompt_manager
Veja exemplos/simples.rb
Consulte também Exemplos/USTION_SEARCH_PROC.RB
O prompt_manager GEM fornece funcionalidade para gerenciar prompts que possuem palavras -chave e diretrizes para uso com processos generativos de IA.
A Gen-AI lida com a conversão (alguns diriam a execução) de um texto de linguagem natural humana (o "prompt") em algo mais usando o que é conhecido como modelos de idiomas grandes (LLM), como os disponíveis no OpenAI. Um prompt parametrizado é aquele em que existem palavras -chave incorporadas (parâmetros), que são os suportes para que outro texto seja inserido no prompt.
O prompt_manager usa uma expressão regular para identificar essas palavras -chave no prompt. Ele usa as palavras -chave como chaves em um hash parameters que é armazenado com o texto rápido em uma forma serializada - por exemplo, como JSON.
Por padrão, qualquer texto que corresponda ao [UPPERCASE_TEXT] entre colchetes é tratado como uma palavra -chave. [Palavras -chave também podem ter espaços], bem como o caractere sublinhado.
Você pode personalizar o padrão de palavras -chave definindo uma expressão regular diferente:
# Use {{param}} style instead of [PARAM]
PromptManager :: Prompt . parameter_regex = /( { { [A-Za-z_]+ } } )/ O regex deve incluir a captura de parênteses () para extrair a palavra -chave. O regex padrão é /([[AZ _|]+])/ .
Uma diretiva é uma linha no texto rápido que começa com os dois caracteres '//' - Slash Slash - assim como nos velhos tempos da IBM JCL - Language de controle de emprego. Um prompt pode ter zero ou mais diretrizes. As diretivas podem ter parâmetros e podem usar palavras -chave.
O prompt_manager apenas coleta diretivas. Ele extrai palavras -chave das linhas de diretiva e fornece a substituição dessas palavras -chave com outro texto como acontece pelo prompt.
Aqui está um exemplo de arquivo de texto rápido com comentários, diretrizes e palavras -chave:
# 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
Obter diretrizes de um aviso é tão fácil quanto obter os 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 As entradas na matriz retornadas pelo Método prompt.directives estão na ordem em que as diretivas foram definidas no prompt. Cada entrada tem dois elementos:
Como as diretoras são coletadas após a substituição das palavras -chave no prompt por seus valores, é possível ter diretivas geradas dinamicamente como parte de um prompt. Por exemplo:
//[COMMAND] [OPTIONS]
# or
[SOMETHING]
... onde [comando] é substituído por algum nome diretivo. [Algo] pode ser substituído por "// opções de diretiva"
O prompt_manager Gem apenas coleta diretivas. A execução dessas diretrizes é deixada para algum processo de fluxo descendente. Aqui estão algumas idéias sobre como as diretivas podem ser usadas no processo imediato a jusante:
mods .Tudo depende de como seu aplicativo deseja apoiar ou não diretivas.
O prompt_manager Gem ignora comentários. Uma linha que começa com o personagem '#' - libra (também conhecido como hash) - é um comentário de linha. Quaisquer linhas que sigam uma linha que seja ' final no final de um arquivo são consideradas comentários. Basicamente, o ' final ' no final do arquivo. Nada é o processo seguindo essa linha.
A jóia também ignora linhas em branco.
Um adaptador de armazenamento é uma instância de classe que vincula a classe PromptManager::Prompt a uma instalação de armazenamento que mantém os avisos reais. Atualmente, existem 3 adaptadores de armazenamento planejados para implementação.
O PromptManager::Prompt para suportar um pequeno conjunto de métodos. Um adaptador de armazenamento pode fornecer métodos de classe ou instância "extras" que podem ser usados através da classe prompt. Consulte o test/prompt_manager/prompt_test.rb para obter orientações sobre como criar um novo adaptador de armazenamento.
Este é o primeiro adaptador de armazenamento desenvolvido. Ele salva solicitações como arquivos de texto dentro do sistema de arquivos dentro de um prompts_dir (diretório) designado, como ~/.prompts ou onde faz mais sentido para você. Outro exemplo seria ter seu diretório em um sistema de arquivos compartilhado para que outros possam usar os mesmos prompts.
O prompt ID é o nome da base do arquivo de texto. Por exemplo, todo.txt é o arquivo para o ID de prompt (consulte o todo de exemplos.)
Os parâmetros para o ID todo são salvos no mesmo diretório do todo.txt em um arquivo json chamado todo.json (também no diretório de exemplos.)
Use um bloco config para estabelecer a configuração da classe.
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 O bloco config retorna self , o que significa que você pode fazer isso para configurar o adaptador de armazenamento com a classe Prompt:
PromptManager :: Prompt
. storage_adapter =
PromptManager :: Storage :: FileSystemAdapter
. config do | config |
config . prompts_dir = 'path/to/prompts_dir'
end . new Esta é uma String ou um objeto Pathname . Todos os caminhos de arquivo são mantidos na classe como objetos Pathname . Se você fornecer uma String , ela será convertida. Caminhos relativos serão convertidos em caminhos absolutos.
Um ArgumentError será criado quando prompts_dir não existir ou se não for um diretório.
O padrão para search_proc é nulo, o que significa que a pesquisa será pré -formada por um método search padrão que está basicamente lendo todos os arquivos prompts para ver quais contêm o termo de pesquisa. Ele retornará uma matriz de IDs prompts para cada arquivo prompt encontrado que contém o termo de pesquisa. Está pronto para o aplicativo selecionar qual ID de prompt devolvido para usar.
Existem maneiras mais rápidas de pesquisar e selecionar arquivos. Por exemplo, existem utilitários de pesquisa e seleção especializados disponíveis para a linha de comando. O diretório examples contém um script bash chamado rgfzf que usa rg (também conhecido como ripgrep ) para fazer a pesquisa e fzf para fazer a seleção.
Consulte Exemplos/USTION_SEARCH_PROC.RB
Essas duas opções de configuração são objetos String que devem começar com um período "." No entanto, um ArgumentError será levantado.
Atualmente, o FileSystemAdapter suporta apenas um serializador JSON para o hash dos parâmetros. O uso de outros valores para essas extensões causará problemas.
Eles existem para que haja uma plataforma na qual outros adaptadores de armazenamento possam ser construídos ou serializadores adicionados. Atualmente, isso não está no roteiro.
# ~/.prompts/joke.txt
# Desc: Tell some jokes
Tell me a few [KIND] jokes about [SUBJECT]
Observe as linhas de comando na parte superior. Esta é uma convenção que eu uso. Não faz parte do software. Acho útil para documentar o prompt.
{
"[KIND]" : [
" pun " ,
" family friendly "
],
"[SUBJECT]" : [
" parrot " ,
" garbage man " ,
" snowman " ,
" weather girl "
]
}O último valor na matriz da palavra -chave é o valor mais recente usado para essa palavra -chave. Esta é uma funcionalidade estabelecida desde v0.3.0. Seu objetivo é fornecer um histórico de valores dos quais um usuário pode selecionar repetir um valor anterior ou selecionar o valor anterior e editá -lo em algo novo.
O FileSystemAdapter adiciona dois novos métodos para uso pela classe Prompt :
Pathname para o arquivo prompt Use o formulário path(prompt_id) em relação ao Prompt prompt.path você tiver uma instância de um Prompt
O ActiveRecordAdapter assume que já existe um banco de dados configurado pelo programa de aplicativos que exige prompt_manager que possui um modelo que contém conteúdo rápido. Este modelo deve ter pelo menos três colunas que contêm conteúdo para:
O modelo e as colunas para esses três elementos podem ter qualquer nome. Esses nomes são fornecidos ao ActiveRecordAdapter em seu bloco de configuração.
Use um bloco config para estabelecer a configuração da classe.
A classe PromptManager::Prompt espera uma instância de uma classe adaptadora de armazenamento. Por Convenção, os métodos de configuração do adaptador de armazenamento retornarão self , para que um novo new após a configuração estabelecer a instância.
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 O parâmetro de configuração model é o nome da classe real do ActiveRecord::Base ou ApplicationRecord (se você estiver usando um aplicativo Rails) que contém o conteúdo usado para prompts.
O id_column contém o nome da coluna que contém o conteúdo "ID do prompt". Pode ser um valor String ou Symbol .
O text_column contém o nome da coluna que contém o texto bruto real do prompt. Este texto bruto pode incluir as palavras -chave que serão substituídas pelos valores do hash dos parâmetros. O valor do nome da coluna pode ser uma String ou um Symbol .
O parameters_column contém o nome da coluna que contém os parâmetros usados para substituir as palavras -chave no texto prompt. Espera -se que esta coluna no modelo de banco de dados seja serializada. Atualmente, o ActiveRecordAdapter possui um bit de código Kludge que assume que a serialização é feita com o JSON. O valor dos parâmetros_column pode ser uma String ou um Symbol .
TODO: Corrija o kludge para que qualquer serialização possa ser usada.
Existem muitas possibilidades de exemplo, este conceito de plug -in do adaptador de armazenamento. Aqui estão alguns para consideração:
Procurando feedback e colaboradores para aprimorar a capacidade do Prompt_Manager.
Relatórios de bug e solicitações de tração são bem -vindos no github em https://github.com/madbomber/prompt_manager.
A GEM está disponível como código aberto nos termos da licença do MIT.