aia
es una utilidad de línea de comandos que facilita la interacción con modelos de IA. Automatiza la gestión de indicaciones previas a la composición y ejecuta comandos de IA generativa (Gen-AI) en esas indicaciones aprovechando el mayor tamaño de ventana de contexto de los LLM modernos.
Aprovecha la gema prompt_manager
para administrar las indicaciones de las mods
y las utilidades CLI sgpt
. Utiliza "ripgrep" para buscar archivos de aviso. Utiliza fzf
para una selección rápida basada en un término de búsqueda y coincidencias aproximadas.
Cambio más reciente : consulte el registro de cambios
Solo para su información... Estoy trabajando en la rama
develop
para eliminar la dependencia de los procesadores LLM backend como mods y llm. Estoy refactorizando aia para usar mi propia joya de cliente universal llamada ai_client que brinda acceso a todos los modelos y todos los proveedores.
aia
Comandos directivos específicosllm
sgpt
de procesador backendplz
Instale la gema ejecutando:
gem install aia
Instale las utilidades de línea de comandos ejecutando:
brew install mods fzf ripgrep
También necesitará establecer un directorio en su sistema de archivos donde se guarden los archivos de texto de aviso, los últimos parámetros utilizados y los archivos de registro de uso.
Configure una variable de entorno del sistema (envar) llamada "AIA_PROMPTS_DIR" que apunte a su directorio de mensajes. El valor predeterminado está en su directorio INICIO llamado ".prompts". El envar "AIA_ROLES_DIR" apunta a su directorio de funciones donde tiene indicaciones que definen las diferentes funciones que desea que asuma el LLM cuando realiza su trabajo. El directorio de roles predeterminado está dentro del directorio de indicaciones. Su nombre es "roles".
Es posible que también desee instalar el script de finalización para su shell. Para obtener una copia del guión de finalización, haga lo siguiente:
aia --completion bash
fish
y zsh
también están disponibles.
El informe de uso obtenido utilizando -h
o --help
se implementa como una página man
estándar. Puede usar ambos --help --verbose
o -h -v
juntos para obtener no solo la página de manual aia
sino también el informe de uso de la herramienta de procesamiento LLM backend
.
$ aia --help
Los valores predeterminados de configuración aia
pueden ser anulados por variables de entorno del sistema (envars) con el prefijo "AIA_" seguido del nombre del elemento de configuración también en mayúsculas. Todos los elementos de configuración se pueden anular de esta manera mediante un envar. La siguiente tabla muestra algunos ejemplos.
Elemento de configuración | Valor predeterminado | clave envar |
---|---|---|
backend | modificaciones | AIA_BACKEND |
archivo_configuración | nulo | AIA_CONFIG_FILE |
depurar | FALSO | AIA_DEBUG |
editar | FALSO | AIA_EDITAR |
extra | '' | AIA_EXTRA |
difuso | FALSO | AIA_FUZZY |
archivo_registro | ~/.prompts/_prompts.log | AIA_LOG_FILE |
reducción | verdadero | AIA_MARKDOWN |
modelo | gpt-4-1106-vista previa | AIA_MODEL |
archivo_salida | SALIDA ESTÁNDAR | AIA_OUT_FILE |
avisos_dir | ~/.indicaciones | AIA_PROMPTS_DIR |
modelo_de_habla. | tts-1 | AIA_SPEECH_MODEL |
verboso | FALSO | AIA_VERBOSE |
voz | aleación | AIA_VOICE |
Consulte el hash @options
en el archivo cli.rb
para obtener una lista completa. Hay algunos elementos de configuración que no necesariamente tienen sentido para su uso como anulación de envar. Por ejemplo, si configura export AIA_DUMP_FILE=config.yaml
, entonces aia
volcará la configuración actual config.yaml y saldrá cada vez que se ejecute hasta que finalmente unset AIA_DUMP_FILE
Además de estos elementos de configuración para aia
los parámetros opcionales de la línea de comando para las utilidades de procesamiento de mensajes de backend (mods y sgpt) también se pueden configurar usando envars con el prefijo "AIA_". Por ejemplo, "exportar AIA_TOPP=1.0" establecerá la opción de línea de comando "--topp 1.0" para la utilidad mods
cuando se use como procesador backend.
El uso de la opción --shell
permite aia
acceder al entorno de shell de su terminal desde dentro del texto del mensaje.
aia
puede reemplazar cualquier referencia a la variable de entorno del sistema (envar) en el texto del mensaje con el valor de envar. Patrones como
El contenido dinámico se puede insertar en el mensaje usando el patrón.
Considere el poder de adaptar un mensaje a su sistema operativo específico:
As a system administration on a $(uname -v) platform what is the best way to [DO_SOMETHING]
o inserte contenido de un archivo en su directorio de inicio:
Given the following constraints $(cat ~/3_laws_of_robotics.txt) determine the best way to instruct my roomba to clean my kids room.
Cuando utiliza la opción --shell
para iniciar una sesión de chat, la integración del shell está disponible en sus mensajes de seguimiento. Supongamos que inició una sesión de chat usando un rollo de "Ruby Expert" esperando conversar sobre los cambios que podrían realizarse en una clase específica, PERO olvidó incluir el archivo fuente de la clase como parte del contexto cuando comenzó. Puede ingresar esto como mensaje de seguimiento para continuar:
The class I want to chat about refactoring is this one: $(cat my_class.rb)
Eso inserta el archivo fuente completo de la clase en su mensaje de seguimiento. Puede continuar charlando con su Asistente de IA sobre los cambios en la clase.
La inclusión de contenido dinámico a través de la integración de shell proporcionada por la opción --shell
es importante. aia
también proporciona todo el poder del procesamiento de código Ruby integrado dentro del texto del mensaje.
La opción --erb
convierte el archivo de texto del mensaje en una plantilla ERB completamente funcional. La sintaxis de la plantilla Embedded Ruby (ERB) (2024) proporciona una buena descripción general de la sintaxis y el poder de ERB.
La mayoría de los sitios web que tienen información sobre ERB darán ejemplos de cómo utilizar ERB para generar contenido HTML dinámico para aplicaciones basadas en web. Ese es un caso de uso común para ERB. aia
por otro lado, utiliza ERB para generar texto de aviso dinámico.
En una sesión de chat, ya sea iniciada por la opción --chat
o su equivalente con una directiva dentro de un archivo de texto, se comporta de manera un poco diferente con sus asignaciones de variables locales y vinculantes. Dado que una sesión de chat por definición tiene múltiples mensajes, configurar una variable local en un mensaje y esperar que esté disponible en un mensaje posterior no funciona. Debe utilizar variables de instancia para realizar este mensaje para solicitar la transferencia de información.
Además, dado que se espera que las indicaciones de seguimiento sean una sola cosa (frase o párrafo) terminadas con una sola respuesta, es probable que la mejora de ERB sea beneficiosa; pero es posible que le encuentres utilidad.
Se agregaron directivas de procesamiento posterior a la gema prompt_manager
utilizada por au
en la versión 0.4.1. Estas directivas son líneas en el archivo de texto del mensaje que comienzan con "//" y tienen este patrón:
//command parameters
No hay espacio entre "//" y el comando.
Cuando combina directivas de solicitud con parámetros de solicitud y sustituciones de envar de shell, puede obtener algunas indicaciones de composición potentes.
A continuación se muestra un ejemplo de una directiva genérica pura.
//[DIRECTIVE_NAME] [DIRECTIVE_PARAMS]
Cuando se ejecute el mensaje, se le pedirá que proporcione un valor para cada uno de los parámetros. Podrías responder "shell" para el nombre de la directiva y "calc 22/7" si quisieras una mala aproximación de PI.
Pruebe este archivo de aviso:
//shell calc [FORMULA]
What does that number mean to you?
aia
Comandos directivos específicos En este momento aia
sólo tiene unas pocas directivas que se detallan a continuación.
La directiva //config
dentro de un archivo de texto de solicitud se utiliza para adaptar el entorno de configuración específico para la solicitud. Todos los elementos de configuración están disponibles para cambiar sus valores. El orden de asignación de valores para un elemento de configuración comienza con el valor predeterminado que se reemplaza por el valor envar que se reemplaza por el valor de la opción de línea de comando que se reemplaza por el valor del archivo de configuración.
//config
es la última y última forma de cambiar el valor de un elemento de configuración para un mensaje específico.
Las opciones de cambio se tratan como booleanas. Son true
o false
. Su nombre dentro del contexto de una directiva //config
siempre termina con un "?" personaje - signo de interrogación.
Para establecer el valor de un interruptor usando ``//config for example
--terse` o `--chat` a esto:
//config chat? = true
//config terse? = true
Un elemento de configuración como --out_file
o --model
tiene un valor asociado en la línea de comando. Para establecer ese valor con la directiva //config
hazlo así:
//config model = gpt-3.5-turbo
//config out_file = temp.md
//config backend = mods
Por cierto: el "=" son completamente opciones. En realidad, se ignora como ":=" si tuviera que elegirlo como su operador de asignación. Además, el número de espacios entre el artículo y el valor es completamente arbitrario. Me gusta alinear las cosas para que esta sintaxis sea igual de válida:
//config model gpt-3.5-turbo
//config out_file temp.md
//config backend mods
//config chat? true
//config terse? true
//config model gpt-4
NOTA: si especifica el mismo nombre del elemento de configuración más de una vez dentro del archivo de solicitud, será el último el que se establecerá cuando la solicitud finalmente se procese a través del LLM. Por ejemplo, en el ejemplo anterior, gpt-4
será el modelo utilizado. Ser primero no cuenta en este caso.
Ejemplo:
//include path_to_file
La path_to_file
puede ser absoluta o relativa. Si es relativo, está anclado en la PWD. Si path_to_file
incluye envars, se debe usar la opción --shell
CLI para reemplazar el envar en la directiva con su valor real.
El archivo que se incluya tendrá excluidos todos los comentarios o directivas. Se espera que el archivo sea un archivo de texto para que su contenido pueda anteponerse al mensaje existente; sin embargo, si el archivo es un archivo de código fuente (por ejemplo: file.rb), el código fuente se incluirá SIN EMBARGO, se excluirá cualquier línea de comentario o línea que comience con "//".
TODO: Considere agregar una opción de línea de comando --include_dir
para especificar el lugar de donde provendrán los archivos relativos.
Ejemplo:
//ruby any_code_that_returns_an_instance_of_String
Esta directiva es adicional a la del ERB. En este punto, la directiva //ruby
está limitada por el enlace actual que se encuentra dentro del método AIA::Directives#ruby
. Como tal, no es probable que tenga mucha utilidad.
Sin embargo, dado que se implementó como un simple eval(code)
existe la posibilidad de usarlo como este:
//ruby load(some_ruby_file); execute_some_method
Cada ejecución de una directiva //ruby
será una nueva ejecución del método AIA::Directives#ruby
, por lo que no se pueden transferir variables locales de una invocación a otra; sin embargo, podrías hacer algo con variables de instancia o variables globales. Incluso podría agregar algo al objeto AIA.config
para pegarlo en la siguiente invocación de la directiva dentro del contexto del mismo mensaje.
Ejemplo:
//shell some_shell_command
Se espera que el comando de shell devuelva algo de texto a STDOUT que estará pendiente del texto de solicitud existente dentro del archivo de solicitud.
No hay limitaciones sobre lo que puede ser el comando de shell. Por ejemplo, si desea evitar la eliminación de comentarios y directivas de un archivo, puede hacer algo como esto:
//shell cat path_to_file
Que hace básicamente lo mismo que la directiva //include
, excepto que usa todo el contenido del archivo. Para rutas de archivos relativas se aplica lo mismo. La ruta del archivo será relativa a la PWD.
Consulte el código fuente para conocer las directivas admitidas por los backends que en este momento también se basan en la configuración.
Por ejemplo, mods
tiene un elemento de configuración topp
que se puede establecer mediante una directiva en un archivo de texto de solicitud directamente.
//topp 1.5
Si mods
no es el backend, se ignora la directiva //topp
.
Cuando esté en una sesión de chat, puede utilizar una directiva como mensaje de seguimiento. Por ejemplo, si inició la sesión de chat con la opción --terse
esperando obtener respuestas breves del backend; pero luego decide que desea respuestas más completas, puede hacer esto:
//config terse? false
La directiva se ejecuta y se puede ingresar un nuevo mensaje de seguimiento con una respuesta más larga generada desde el backend.
¿Por qué necesitaría/querría utilizar una secuencia de indicaciones en una situación por lotes? Tal vez tenga un mensaje complejo que exceda las limitaciones simbólicas de su modelo para la entrada, por lo que necesita dividirlo en varias partes. O supongamos que es un mensaje simple pero el número de tokens en la salida es limitado y no obtiene exactamente el tipo de respuesta completa que estaba buscando.
A veces se necesitan una serie de indicaciones para obtener el tipo de respuesta que desea. La respuesta de un mensaje se convierte en un contexto para el siguiente mensaje. Esto es fácil de hacer dentro de una sesión chat
en la que ingresa y ajusta manualmente sus indicaciones hasta obtener el tipo de respuesta que desea.
Si necesita hacer esto de forma regular o dentro de un lote, puede usar aia
y las opciones de línea de comando --next
y --pipeline
.
Estas dos opciones especifican la secuencia de ID de solicitud que se procesarán. Ambas opciones están disponibles para usarse dentro de un archivo de solicitud usando la directiva //config
. Como todas las directivas integradas, puede aprovechar la integración del shell de parametrización y Ruby. Estoy empezando a sentirme como TIm Tool man: ¡más poder!
Considere la condición en la que tiene 4 ID de aviso que deben procesarse en secuencia. Los ID y los nombres de los archivos de avisos asociados son:
ID de aviso | Archivo rápido |
---|---|
uno. | uno.txt |
dos. | dos.txt |
tres. | tres.txt |
cuatro. | cuatro.txt |
export AIA_OUT_FILE=temp.md
aia one --next two
aia three --next four temp.md
o dentro de cada uno de los archivos de solicitud, utilice la directiva de configuración:
one.txt contains //config next two
two.txt contains //config next three
three.txt contains //config next four
PERO si tiene más de dos mensajes en su secuencia, considere usar la opción --pipeline.
La directiva //next es la abreviatura de //config next
aia one --pipeline two,three,four
o dentro del archivo de solicitud one.txt
, use esta directiva:
//config pipeline two,three,four
La directiva //pipeline es la abreviatura de //config pipeline
Dado que la respuesta de un mensaje se introduce en el siguiente mensaje dentro de la secuencia en lugar de que todos los mensajes escriban su respuesta en el mismo archivo de salida, utilice estas directivas dentro de los archivos de mensajes asociados:
Archivo rápido | Directiva |
---|---|
uno.txt | //config out_file one.md |
dos.txt | //config out_file dos.md |
tres.txt | //config out_file tres.md |
cuatro.txt | //config out_file cuatro.md |
De esta manera puede ver la respuesta que se generó para cada mensaje de la secuencia.
TODO: la conversión de audio a texto aún está en desarrollo.
Supongamos que tiene un archivo de audio de una reunión. Usted qué obtener una transcripción de lo que se dijo en esa reunión. A veces, las transcripciones sin procesar ocultan el valor real de la grabación, por lo que has elaborado un pompt que toma las transcripciones sin procesar y hace un resumen técnico con una lista de elementos de acción.
Cree dos mensajes llamados transcribe.txt y tech_summary.txt
# transcribe.txt
# Desc: takes one audio file
# note that there is no "prompt" text only the directive
//config backend client
//config model whisper-1
//next tech_summary
y
# tech_summary.txt
//config model gpt-4-turbo
//config out_file meeting_summary.md
Review the raw transcript of a technical meeting,
summarize the discussion and
note any action items that were generated.
Format your response in markdown.
Ahora puedes hacer esto:
aia transcribe my_tech_meeting.m4a
Su resumen de la reunión se encuentra en el archivo meeting_summary.md
Hay dos tipos de indicaciones.
Ese segundo tipo de indicación se llama rol. A veces el papel se incorpora a la instrucción. Por ejemplo "Como mago, haz aparecer un conejo de un sombrero". Para reutilizar el mismo rol en múltiples mensajes, aia
lo alienta a designar un roles_dir
especial en el que coloque mensajes que sean específicos de la personificación: roles.
El valor predeterminado roles_dir
es un subdirectorio de los roles denominados prompts_dir
. Sin embargo, puedes colocar tu roles_dir
en cualquier lugar que tenga sentido para ti.
La opción --role
se utiliza para identificar un mensaje de personificación dentro de su directorio de roles que define el contexto dentro del cual el LLM debe proporcionar su respuesta. El texto del ID de la función se antepone al texto del mensaje principal para formar un mensaje completo que será procesado por el backend.
Por ejemplo considere:
aia -r ruby refactor my_class.rb
Dentro del directorio de roles, el contenido del archivo de texto ruby.txt
se antepondrá al contenido del archivo refactor.txt
desde el directorio de avisos para producir un aviso completo. Ese mensaje completo tendrá todos los parámetros seguidos de directivas procesadas antes de enviar el texto del mensaje combinado al backend.
Tenga en cuenta que --role
es solo una forma de decir agregar este archivo de texto de solicitud al frente de este otro archivo de texto de solicitud. El contenido del mensaje "rol" puede ser cualquier cosa. No necesariamente tiene que ser un papel real.
aia
admite totalmente un árbol de directorios dentro de prompts_dir
como una forma de organización o clasificación de sus diferentes archivos de texto de aviso.
aia -r sw_eng doc_the_methods my_class.rb
En este ejemplo, el archivo de texto de solicitud $AIA_ROLES_DIR/sw_eng.txt
se antepone al archivo de texto de solicitud $AIA_PROMPTS_DIR/doc_the_methods.txt
Dado que aia
admite mensajes parametrizados, puede hacer que una palabra clave como "[ROLE]" sea parte de su mensaje. Por ejemplo, considere este mensaje:
As a [ROLE] tell me what you think about [SUBJECT]
Cuando se procese este mensaje, aia
le pedirá un valor para la palabra clave "ROL" y la palabra clave "SUJETO" para completar el mensaje. Dado que aia
mantiene un historial de sus respuestas anteriores, puede elegir algo que haya usado en el pasado o responder con un valor completamente nuevo.
Para instalar los programas CLI externos utilizados por aia:
instalar cerveza fzf mods rg resplandor
fzf Buscador difuso de línea de comandos escrito en Go https://github.com/junegunn/fzf
mods AI en la línea de comandos https://github.com/charmbracelet/mods
rg Herramienta de búsqueda como grep y The Silver Searcher https://github.com/BurntSushi/ripgrep
Glow Renderizado de rebajas en la CLI https://github.com/charmbracelet/glow
Un editor de texto cuyo ejecutable se configura en la variable de entorno del sistema 'EDITOR' de esta manera:
exportar EDITOR="subl -w"
llm
llm Access large language models from the command-line
| brew install llm
|__ https://llm.datasette.io/
A partir de aia v0.5.13
el procesador backend llm
está disponible en una integración limitada. Es una implementación muy poderosa basada en Python que tiene su propio sistema de plantillas. La razón por la que se incluye dentro del entorno aia
es por su capacidad para utilizar modelos LLM locales.
sgpt
de procesador backend shell-gpt
también conocido como sgpt
también es una implementación en Python de una herramienta CLI que procesa solicitudes a través de OpenAI. Tiene menos funciones que mods
y llm
y es menos flexible.
plz
plz-cli
también conocido como plz
, no está integrado con aia
sin embargo, recibe una mención de honor por su capacidad para aceptar un mensaje adaptado a hacer algo en la línea de comando. Su respuesta es un comando CLI (a veces una secuencia canalizada) que realiza la tarea establecida en el mensaje. Devolverá los comandos que se ejecutarán contra los archivos de datos que especificó con una consulta para ejecutar el comando.
Puede configurar una función de finalización en su shell que se completará en el Prompt_id guardado en su prompts_dir
; las funciones para bash
, fish
y zsh
están disponibles. Para obtener una copia de estas funciones, haga esto:
aia --completion bash
Si no eres fanático de "nacido de nuevo", reemplaza bash
con uno de los otros.
Copie la función a un lugar donde pueda instalarse en la instancia de su shell. Podría ser un archivo .profile
o .bashrc
, etc.
Esto es sólo entre tú y yo, así que no le cuentes esto a todo el mundo. Mi mensaje más potente se encuentra en un archivo llamado ad_hoc.txt
. Se parece a esto:
[QUE AHORA HUMANO]
Sí. Solo un parámetro para el cual puedo proporcionar un valor de cualquier cosa que tenga en mente en ese momento. Su ventaja es que no contamino el historial de comandos de mi shell con mucho texto.
¿Cuál crees que es mejor tener en el archivo de historial de tu shell?
mods " As a certified public accountant specializing in forensic audit and analysis of public company financial statements, what do you think of mine? What is the best way to hide the millions dracma that I've skimmed? " < financial_statement.txt
o
aia ad_hoc financial_statement.txt
Ambos hacen lo mismo; sin embargo, aia
no coloca el texto del mensaje en el archivo histórico del shell.... por supuesto, el valor de la palabra clave/parámetro se guarda en el archivo JSON del mensaje y el mensaje con la respuesta se registra a menos que se especifique --no-log
; ¡pero no está arruinando el historial del shell!
Yo uso el shell bash
. En mi archivo .bashrc
obtengo otro archivo llamado .bashrc__aia
que se ve así:
# ~/.bashic_aia
# AI Assistant
# These are the defaults:
export AIA_PROMPTS_DIR= ~ /.prompts
export AIA_OUT_FILE=./temp.md
export AIA_LOG_FILE= $AIA_PROMPTS_DIR /_prompts.log
export AIA_BACKEND=mods
export AIA_MODEL=gpt-4-1106-preview
# Not a default. Invokes spinner.
export AIA_VERBOSE=true
alias chat= ' aia chat --terse '
# rest of the file is the completion function
Así es como se ve mi archivo de mensajes chat
:
# ~/.prompts/chat.txt
# Desc: Start a chat session
//config chat ? = true
[WHAT]
Esta herramienta CLI comenzó como unas pocas líneas de Ruby en un archivo en mi repositorio de scripts. Seguí creciendo mientras decidí agregar más capacidades y más herramientas de backend. No había una arquitectura real que guiara el diseño. Lo que quedó es un gran lío de código que poco a poco se está refactorizando para convertirlo en algo más fácil de mantener. Ese trabajo se está llevando a cabo en la rama develop
. Le agradezco su ayuda. Eche un vistazo a lo que está sucediendo en esa sucursal y envíeme un PR al respecto.
Por supuesto, si ve algo en la rama principal, envíeme un PR contra ese para que podamos solucionar el problema para todos.
Los informes de errores y las solicitudes de extracción son bienvenidos en GitHub en https://github.com/MadBomber/aia.
Cuando encuentre problemas con aia
anótelos como un problema. Esto fue escrito principalmente por un humano y ya sabes lo propensos que son los humanos a cometer errores. Debería haber muchos errores que encontrar.
No estoy contento con la forma en que algunas opciones de línea de comando para comandos externos están codificadas. Soy específico hablando de la forma en que se utilizan las herramientas rg
y fzf
. Hay opciones que deciden la apariencia básica de la capacidad de búsqueda en la línea de comando. Tal vez deberían ser parte de la configuración general para que los usuarios puedan ajustar su interfaz de usuario como quieran.
La gema está disponible como código abierto según los términos de la licencia MIT.