Gérez les invites paramétrées (texte) utilisées dans Generative AI (AKA Chatgpt, Openai, et.Al. ) à l'aide d'adaptateurs de stockage tels que FileSystemAdapter, SqliTeadapter et ActiveRecordAdapter.
Breaking Change dans la version 0.3.0 - La valeur du hachage des paramètres pour un mot-clé est désormais un tableau au lieu d'une seule valeur. La dernière valeur du tableau est toujours la valeur la plus récente utilisée pour le mot clé donné. Cela a été fait pour soutenir l'utilisation d'une lecture :: Édition d'objets d'histoire dans l'outil AIA CLI
Installez la gemme et ajoutez au gemfile de l'application en exécutant:
bundle add prompt_manager
Si Bundler n'est pas utilisé pour gérer les dépendances, installez la gemme en exécutant:
gem install prompt_manager
Voir des exemples / Simple.rb
Voir aussi Exemples / USSUSE_SEARCH_PROC.RB
Le GEM prompt_manager fournit des fonctionnalités pour gérer les invites qui ont des mots clés et des directives à utiliser avec des processus d'IA génératifs.
Gen-AI traite de la conversion (certains diraient l'exécution) d'un texte de langue naturelle humaine (l'invite ") en quelque chose en utilisant ce qui est connu comme des modèles de grand langage (LLM) tels que ceux disponibles d'Openai. Une invite paramétrée est celle dans laquelle il existe des mots clés intégrés (paramètres) qui sont des porte-plats pour que d'autres texte soient insérés dans l'invite.
Le prompt_manager utilise une expression régulière pour identifier ces mots clés dans l'invite. Il utilise les mots clés comme touches dans un hachage parameters qui est stocké avec le texte invite sous une forme sérialisée - par exemple en tant que JSON.
Par défaut, tout texte correspondant [UPPERCASE_TEXT] enfermé entre crochets est traité comme un mot-clé. [Les mots clés peuvent également avoir des espaces] ainsi que le caractère de soulignement.
Vous pouvez personnaliser le modèle de mot-clé en définissant une expression régulière différente:
# Use {{param}} style instead of [PARAM]
PromptManager :: Prompt . parameter_regex = /( { { [A-Za-z_]+ } } )/ Le regex doit inclure la capture de parenthèses () pour extraire le mot-clé. Le regex par défaut est /([[AZ _|]+])/ .
Une directive est une ligne dans le texte rapide qui commence par les deux caractères // '- Slash Slash - tout comme dans les temps anciens d'IBM JCL - Langage de contrôle de l'emploi. Une invite peut avoir zéro ou plus de directives. Les directives peuvent avoir des paramètres et utiliser des mots clés.
Le prompt_manager ne collecte que des directives. Il extrait les mots clés des lignes de directive et fournit la substitution de ces mots clés avec un autre texte comme il le fait pour l'invite.
Voici un exemple de fichier texte invite avec des commentaires, des directives et des mots clés:
# 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
Obtenir des directives à partir d'une invite est aussi simple que d'obtenir les 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 Les entrées du tableau renvoyées par la méthode prompt.directives sont dans l'ordre que les directives ont été définies dans l'invite. Chaque entrée a deux éléments:
Étant donné que les direties sont collectées après que les mots clés de l'invite ont été remplacés par leurs valeurs, il est possible d'avoir des directives générées dynamiquement dans le cadre d'une invite. Par exemple:
//[COMMAND] [OPTIONS]
# or
[SOMETHING]
... où [commande] est remplacé par un nom de directif. [Quelque chose] pourrait être remplacé par "// options directives"
Le gemme prompt_manager ne collecte que des directives. L'exécution de ces directives est laissée à un processus en baisse. Voici quelques idées sur la façon dont les directives pourraient être utilisées dans un processus invite en aval:
mods .Tout est à la hauteur de la façon dont votre application souhaite prendre en charge les directives ou non.
Le gemm prompt_manager ignore les commentaires. Une ligne qui commence par le caractère '#' - livre (aka hash) - est un commentaire en ligne. Toutes les lignes qui suivent une ligne qui se termine à la fin d'un fichier est considérée comme des commentaires. Fondamentalement, la « fin » la fin du fichier. Rien n'est un processus suivant cette ligne.
La gemme ignore également les lignes vierges.
Un adaptateur de stockage est une instance de classe qui attache la classe PromptManager::Prompt d'une installation de stockage qui contient les invites réelles. Actuellement, 3 adaptateurs de stockage sont prévus pour la mise en œuvre.
The PromptManager::Prompt pour prendre en charge un petit ensemble de méthodes. Un adaptateur de stockage peut fournir des méthodes de classe ou d'instance "supplémentaires" qui peuvent être utilisées via la classe invite. Voir le test/prompt_manager/prompt_test.rb pour des conseils sur la création d'un nouvel adaptateur de stockage.
Il s'agit du premier adaptateur de stockage développé. Il enregistre les invites sous forme de fichiers texte dans le système de fichiers à l'intérieur d'un prompts_dir (répertoire) désigné tel que ~/.prompts ou où il vous est le plus logique. Un autre exemple serait d'avoir votre répertoire sur un système de fichiers partagé afin que d'autres puissent utiliser les mêmes invites.
L' prompt ID est le nom de base du fichier texte. Par exemple, todo.txt est le fichier de l'ID d'invite todo (voir le répertoire des exemples.)
Les paramètres de l'ID d'invite todo sont enregistrés dans le même répertoire que todo.txt dans un fichier JSON nommé todo.json (également dans le répertoire d'exemples.)
Utilisez un bloc config pour établir la configuration de la 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 Le bloc config renvoie self , ce qui signifie que vous pouvez le faire pour configurer l'adaptateur de stockage avec la classe invite:
PromptManager :: Prompt
. storage_adapter =
PromptManager :: Storage :: FileSystemAdapter
. config do | config |
config . prompts_dir = 'path/to/prompts_dir'
end . new Il s'agit d'une String ou d'un objet Pathname . Tous les chemins de fichier sont maintenus dans la classe en tant qu'objets Pathname . Si vous fournissez une String il sera converti. Les chemins relatifs seront convertis en chemins absolus.
Un ArgumentError sera soulevé lorsque prompts_dir n'existe pas ou s'il ne s'agit pas d'un répertoire.
La valeur par défaut pour search_proc est nulle, ce qui signifie que la recherche sera préformée par une méthode search par défaut qui lise essentiellement tous les fichiers d'invite pour voir lesquels contiennent le terme de recherche. Il renverra un tableau d'IDS d'invite pour chaque fichier d'invite trouvé qui contient le terme de recherche. C'est à la hauteur de l'application pour sélectionner l'identifiant d'invite renvoyé à utiliser.
Il existe des moyens plus rapides de rechercher et de sélectionner des fichiers. Par exemple, il existe des utilitaires de recherche et de sélection spécialisés qui sont disponibles pour la ligne de commande. Le répertoire examples contient un script bash nommé rgfzf qui utilise rg (aka ripgrep ) pour effectuer la recherche et fzf pour faire la sélection.
Voir des exemples / using_search_proc.rb
Ces deux options de configuration sont des objets String qui doivent commencer par une période "." Autrement dit, un ArgumentError sera soulevé.
Actuellement, le FileSystemAdapter ne prend en charge qu'un sérialiseur JSON pour son hachage de paramètres. L'utilisation de toute autre valeur pour ces extensions entraînera des problèmes.
Ils existent de sorte qu'il existe une plate-forme sur laquelle d'autres adaptateurs de stockage peuvent être construits ou des sérialiseurs ajoutés. Ce n'est pas actuellement sur la feuille de route.
# ~/.prompts/joke.txt
# Desc: Tell some jokes
Tell me a few [KIND] jokes about [SUBJECT]
Notez les lignes de commande en haut. Ceci est une convention que j'utilise. Cela ne fait pas partie du logiciel. Je le trouve utile pour documenter l'invite.
{
"[KIND]" : [
" pun " ,
" family friendly "
],
"[SUBJECT]" : [
" parrot " ,
" garbage man " ,
" snowman " ,
" weather girl "
]
}La dernière valeur du tableau du mot-clé est la valeur la plus récente utilisée pour ce mot-clé. Il s'agit d'une fonctionnalité établie depuis V0.3.0. Son objectif est de fournir un historique des valeurs à partir desquelles un utilisateur peut sélectionner pour répéter une valeur précédente ou pour sélectionner la valeur précédente TA et la modifier dans quelque chose de nouveau.
Le FileSystemAdapter ajoute deux nouvelles méthodes à utiliser par la classe Prompt :
Pathname dans le fichier prompt Utilisez le formulaire path(prompt_id) contre la classe Prompt Utilisez prompt.path lorsque vous avez une instance d'une Prompt
L' ActiveRecordAdapter suppose qu'il existe une base de données déjà configurée par le programme d'application qui nécessite prompt_manager qui dispose d'un modèle contenant du contenu Prompt. Ce modèle doit avoir au moins trois colonnes qui contiennent du contenu pour:
Le modèle et les colonnes de ces trois éléments peuvent avoir n'importe quel nom. Ces noms sont fournis à l' ActiveRecordAdapter dans son bloc de configuration.
Utilisez un bloc config pour établir la configuration de la classe.
La classe PromptManager::Prompt s'attend à une instance d'une classe d'adaptateur de stockage. Par les méthodes de configuration de la classe d'adaptateur de stockage de convention, renvoie self de sorte qu'un new après la configuration établira l'instance.
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 Le paramètre de configuration model est le nom de classe réel de l' ActiveRecord::Base ou ApplicationRecord (si vous utilisez une application Rails) qui contient le contenu utilisé pour les invites.
L' id_column contient le nom de la colonne qui contient le contenu "IDMOP ID". Il peut s'agir d'une String ou d'une valeur Symbol .
Le text_column contient le nom de la colonne qui contient le texte brut réel de l'invite. Ce texte brut peut inclure les mots clés qui seront remplacés par des valeurs du hachage des paramètres. La valeur de nom de colonne peut être une String ou un Symbol .
Le parameters_column contient le nom de la colonne qui contient les paramètres utilisés pour remplacer les mots clés dans le texte de l'invite. Cette colonne du modèle de base de données devrait être sérialisée. L' ActiveRecordAdapter a actuellement un bit de code Kludge qui suppose que la sérialisation est effectuée avec JSON. La valeur du paramètres_column peut être une String ou un Symbol .
TODO: fixer le kludge afin que toute sérialisation puisse être utilisée.
Il existe de nombreuses possibilités d'exemple ce concept de plugin de l'adaptateur de stockage. En voici quelques-uns pour considérer:
À la recherche de commentaires et de contributeurs pour améliorer la capacité de prompt_manager.
Les rapports de bogues et les demandes de traction sont les bienvenus sur GitHub à https://github.com/madbomber/prompt_manager.
Le GEM est disponible en open source en vertu des termes de la licence du MIT.