Administre las indicaciones parametrizadas (texto) utilizadas en IA generativa (también conocido como ChatGPT, OpenAI, et.al. ) utilizando adaptadores de almacenamiento como FileSystemAdapter, SQLiteAdapter y ActiverecordAdapter.
Cambio de ruptura en la versión 0.3.0: el valor del hash de los parámetros para una palabra clave ahora es una matriz en lugar de un solo valor. El último valor en la matriz es siempre el valor más reciente utilizado para la palabra clave dada. Esto se hizo para respaldar el uso de una edición de objetos de lectura :: Historia en la herramienta AIA CLI
Instale la gema y agregue al archivo gem de la aplicación ejecutando:
bundle add prompt_manager
Si no se está utilizando Bundler para administrar las dependencias, instale la gema ejecutando:
gem install prompt_manager
Ver ejemplos/sencillo.rb
Consulte también ejemplos/usando_search_proc.rb
La gema prompt_manager proporciona funcionalidad para administrar indicaciones que tienen palabras clave y directivas para su uso con procesos de IA generativos.
Gen-AI se ocupa de la conversión (algunos dirían que la ejecución) de un texto del lenguaje natural humano (el "aviso") en otra cosa que usa lo que se conoce como modelos de idiomas grandes (LLM), como los disponibles de OpenAI. Un mensaje parametrizado es uno en el que hay palabras clave incrustadas (parámetros) que son titulares de lugar para que otro texto se inserta en el indicador.
El indic_manager utiliza una expresión regular para identificar estas palabras clave dentro del mensaje. Utiliza las palabras clave como claves en un hash parameters que se almacena con el texto de inmediato en forma serializada, por ejemplo, como JSON.
Por defecto, cualquier texto que coincida con [UPPERCASE_TEXT] encerrado en soportes cuadrados se trata como una palabra clave. [Las palabras clave también pueden tener espacios], así como el carácter inferior.
Puede personalizar el patrón de palabras clave estableciendo una expresión regular diferente:
# Use {{param}} style instead of [PARAM]
PromptManager :: Prompt . parameter_regex = /( { { [A-Za-z_]+ } } )/ El Regex debe incluir capturar paréntesis () para extraer la palabra clave. El Regex predeterminado es /([[AZ _|]+])/ .
Una directiva es una línea en el texto inmediato que comienza con los dos caracteres '//' - Slash Slash - al igual que en los viejos tiempos de IBM JCL - Lenguaje de control de trabajo. Un aviso puede tener cero o más directivas. Las directivas pueden tener parámetros y pueden hacer uso de palabras clave.
El prompt_manager solo recopila directivas. Extrae palabras clave de las líneas de directiva y proporciona la sustitución de esas palabras clave con otro texto como lo hace para el mensaje.
Aquí hay un ejemplo de archivo de texto con comentarios con comentarios, directivas y palabras clave:
# 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
Obtener directivas de un aviso es tan fácil como obtener el 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 Las entradas en la matriz devuelta por el método prompt.directives . Cada entrada tiene dos elementos:
Dado que los directores se recopilan después de que las palabras clave en el mensaje se han sustituido por sus valores, es posible tener directivas generadas dinámicamente como parte de un aviso. Por ejemplo:
//[COMMAND] [OPTIONS]
# or
[SOMETHING]
... donde [el comando] se reemplaza por algún nombre de directiva. [Algo] podría ser reemplazado por "// opciones de directiva"
La gema prompt_manager solo recopila directivas. La ejecución de esas directivas se deja hasta algún proceso de flujo hacia abajo. Aquí hay algunas ideas sobre cómo las directivas podrían usarse en el proceso posterior aguas abajo:
mods .Todo depende de cómo su aplicación quiere admitir directivas o no.
La gema prompt_manager ignora los comentarios. Una línea que comienza con el personaje '#' - libra (también conocido como hash) - es un comentario de línea. Cualquier línea que siga una línea que termine al final de un archivo se consideran comentarios. Básicamente el ' final ' el final del archivo. Nada es el proceso siguiendo esa línea.
La gema también ignora las líneas en blanco.
Un adaptador de almacenamiento es una instancia de clase que vincula la clase PromptManager::Prompt a una instalación de almacenamiento que contiene las indicaciones reales. Actualmente hay 3 adaptadores de almacenamiento planeados para la implementación.
El PromptManager::Prompt para admitir un pequeño conjunto de métodos. Un adaptador de almacenamiento puede proporcionar métodos de clase o instancia "adicionales" que se pueden utilizar a través de la clase rápida. Consulte el test/prompt_manager/prompt_test.rb para obtener orientación sobre la creación de un nuevo adaptador de almacenamiento.
Este es el primer adaptador de almacenamiento desarrollado. Guarda indicaciones como archivos de texto dentro del sistema de archivos dentro de un prompts_dir designado_dir (directorio) como ~/.prompts o donde tiene más sentido para usted. Otro ejemplo sería tener su directorio en un sistema de archivos compartidos para que otros puedan usar las mismas indicaciones.
El prompt ID es el nombre de base del archivo de texto. Por ejemplo, todo.txt es el archivo para la ID de inmediato todo (consulte el directorio de ejemplos).
Los parámetros para el ID de inmediato todo se guardan en el mismo directorio que todo.txt en un archivo JSON llamado todo.json (también en el directorio de ejemplos).
Use un bloque config para establecer la configuración para la clase.
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 El bloque config devuelve self , eso significa que puede hacer esto para configurar el adaptador de almacenamiento con la clase rápida:
PromptManager :: Prompt
. storage_adapter =
PromptManager :: Storage :: FileSystemAdapter
. config do | config |
config . prompts_dir = 'path/to/prompts_dir'
end . new Este es una String o un objeto Pathname . Todas las rutas de archivo se mantienen en la clase como objetos Pathname . Si proporciona una String , se convertirá. Las rutas relativas se convertirán en rutas absolutas.
Un ArgumentError se planteará cuando prompts_dir no exista o si no es un directorio.
El valor predeterminado para search_proc es NIL, lo que significa que la búsqueda se preformará mediante un método search predeterminado que básicamente está leyendo todos los archivos de solicitud para ver cuáles contienen el término de búsqueda. Devolverá una matriz de ID de inmediato para cada archivo de inmediato que contiene el término de búsqueda. Depende de la aplicación para seleccionar qué ID de solicitud devuelto para usar.
Hay formas más rápidas de buscar y seleccionar archivos. Por ejemplo, hay utilidades especializadas de búsqueda y selección que están disponibles para la línea de comandos. El directorio examples contiene un script bash llamado rgfzf que usa rg (también conocido como ripgrep ) para hacer la búsqueda y fzf para seleccionar.
Ver ejemplos/usando_search_proc.rb
Estas dos opciones de configuración son objetos String que deben comenzar con un período ". Utherwise se planteará un ArgumentError .
Actualmente, el FileSystemAdapter solo admite un serializador JSON para sus parámetros hash. El uso de cualquier otro valor para estas extensiones causará problemas.
Existen para que haya una plataforma en la que se puedan construir otros adaptadores de almacenamiento o agregar serializadores. Esto no está actualmente en la hoja de ruta.
# ~/.prompts/joke.txt
# Desc: Tell some jokes
Tell me a few [KIND] jokes about [SUBJECT]
Tenga en cuenta las líneas de comando en la parte superior. Esta es una convención que uso. No es parte del software. Me parece útil al documentar el aviso.
{
"[KIND]" : [
" pun " ,
" family friendly "
],
"[SUBJECT]" : [
" parrot " ,
" garbage man " ,
" snowman " ,
" weather girl "
]
}El último valor en la matriz de la palabra clave es el valor más reciente utilizado para esa palabra clave. Esta es una funcionalidad establecida desde V0.3.0. Su propósito es proporcionar un historial de valores desde el cual un usuario puede seleccionar repetir un valor anterior o seleccionar TA Valor anterior y editarlo en algo nuevo.
FileSystemAdapter agrega dos nuevos métodos para usar por la clase Prompt :
Pathname al archivo de solicitud Use el formulario path(prompt_id) en la clase Prompt use prompt.path cuando tenga una instancia de un Prompt
El ActiveRecordAdapter supone que hay una base de datos ya configurada por el programa de aplicación que requiere prompt_manager que tiene un modelo que contiene contenido rápido. Este modelo debe tener al menos tres columnas que contienen contenido para:
El modelo y las columnas para estos tres elementos pueden tener cualquier nombre. Esos nombres se proporcionan al ActiveRecordAdapter en su bloque de configuración.
Use un bloque config para establecer la configuración para la clase.
La clase PromptManager::Prompt espera una instancia de una clase de adaptador de almacenamiento. Por el almacenamiento de la convención, los métodos de configuración del adaptador de almacenamiento se devolverán self para que un new simple después de la configuración establezca la instancia.
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 El parámetro de configuración model es el nombre de clase real del ActiveRecord::Base o ApplicationRecord (si está utilizando una aplicación Rails) que contiene el contenido utilizado para las indicaciones.
La id_column contiene el nombre de la columna que contiene el contenido de "ID de inmediato". Puede ser un valor String o Symbol .
La text_column contiene el nombre de la columna que contiene el texto en bruto real de la solicitud. Este texto sin procesar puede incluir las palabras clave que serán reemplazadas por valores del hash de parámetros. El valor del nombre de la columna puede ser una String o un Symbol .
El parameters_column contiene el nombre de la columna que contiene los parámetros utilizados para reemplazar las palabras clave en el texto de inmediato. Se espera que esta columna en el modelo de base de datos se sea serializada. Actualmente, el ActiveRecordAdapter tiene un bit de código Kludge que supone que la serialización se realiza con JSON. El valor de los parámetros_column puede ser una String o un Symbol .
TODO: Arregle el Kludge para que se pueda usar cualquier serialización.
Existen muchas posibilidades para ejemplo este concepto de complemento del adaptador de almacenamiento. Aquí hay algunos para considerar:
Buscando comentarios y contribuyentes para mejorar la capacidad de Prompt_Manager.
Los informes de errores y las solicitudes de extracción son bienvenidas en GitHub en https://github.com/madbomber/prompt_manager.
La gema está disponible como código abierto bajo los términos de la licencia MIT.