aia
est un utilitaire de ligne de commande qui facilite l'interaction avec les modèles d'IA. Il automatise la gestion des invites pré-compositionnelles et exécute des commandes d'IA générative (Gen-AI) sur ces invites en tirant parti de la taille accrue de la fenêtre contextuelle des LLM modernes.
Il exploite la gemme prompt_manager
pour gérer les invites pour les mods
et les utilitaires CLI sgpt
. Il utilise "ripgrep" pour rechercher des fichiers d'invite. Il utilise fzf
pour une sélection rapide basée sur un terme de recherche et une correspondance floue.
Modification la plus récente : reportez-vous au journal des modifications
Juste pour information... Je travaille dans la branche
develop
pour supprimer la dépendance aux processeurs backend LLM comme les mods et llm. Je suis en train de refactoriser aia pour utiliser ma propre gemme client universelle appelée ai_client qui donne accès à tous les modèles et à tous les fournisseurs.
aia
llm
sgpt
du processeur back-endplz
Installez la gemme en exécutant :
gem install aia
Installez les utilitaires de ligne de commande en exécutant :
brew install mods fzf ripgrep
Vous devrez également créer un répertoire dans votre système de fichiers où sont conservés vos fichiers texte d'invite, les derniers paramètres utilisés et les fichiers journaux d'utilisation.
Configurez une variable d'environnement système (envar) nommée "AIA_PROMPTS_DIR" qui pointe vers votre répertoire d'invites. La valeur par défaut se trouve dans votre répertoire HOME nommé ".prompts". L'envar "AIA_ROLES_DIR" pointe vers votre répertoire de rôles où vous avez des invites qui définissent les différents rôles que vous souhaitez que le LLM assume lorsqu'il effectue son travail. Le répertoire des rôles par défaut se trouve dans le répertoire des invites. Son nom est « rôles ».
Vous souhaiterez peut-être également installer le script de complétion pour votre shell. Pour obtenir une copie du script de complétion, procédez :
aia --completion bash
fish
et zsh
sont également disponibles.
Le rapport d'utilisation obtenu à l'aide de -h
ou --help
est implémenté sous forme de page man
standard. Vous pouvez utiliser les deux --help --verbose
et -h -v
ensemble pour obtenir non seulement la page de manuel aia
mais également le rapport d'utilisation de l'outil de traitement LLM backend
.
$ aia --help
Les valeurs par défaut de la configuration aia
peuvent être remplacées par des variables d'environnement système (envars) avec le préfixe "AIA_" suivi du nom de l'élément de configuration également en majuscules. Tous les éléments de configuration peuvent être remplacés de cette manière par un envar. Le tableau suivant montre quelques exemples.
Élément de configuration | Valeur par défaut | clé envar |
---|---|---|
back-end | mods | AIA_BACKEND |
fichier_config | néant | AIA_CONFIG_FILE |
déboguer | FAUX | AIA_DEBUG |
modifier | FAUX | AIA_EDIT |
supplémentaire | '' | AIA_EXTRA |
flou | FAUX | AIA_FUZZY |
fichier_journal | ~/.prompts/_prompts.log | AIA_LOG_FILE |
réduction | vrai | AIA_MARKDOWN |
modèle | gpt-4-1106-aperçu | AIA_MODÈLE |
fichier_out | SORTIE STD | AIA_OUT_FILE |
invites_dir | ~/.invites | AIA_PROMPTS_DIR |
modèle_parole. | tts-1 | AIA_SPEECH_MODEL |
verbeux | FAUX | AIA_VERBOSE |
voix | alliage | AIA_VOICE |
Consultez le hachage @options
dans le fichier cli.rb
pour une liste complète. Certains éléments de configuration n'ont pas nécessairement de sens pour être utilisés comme remplacement d'envar. Par exemple, si vous définissez export AIA_DUMP_FILE=config.yaml
, aia
videra la configuration actuelle config.yaml et se fermera à chaque exécution jusqu'à ce que vous unset AIA_DUMP_FILE
En plus de ces éléments de configuration pour aia
les paramètres de ligne de commande facultatifs pour les utilitaires de traitement des invites backend (mods et sgpt) peuvent également être définis à l'aide d'envars avec le préfixe "AIA_". Par exemple, "export AIA_TOPP=1.0" définira l'option de ligne de commande "--topp 1.0" pour l'utilitaire mods
lorsqu'il est utilisé comme processeur principal.
L'utilisation de l'option --shell
permet aia
d'accéder à l'environnement shell de votre terminal depuis le texte d'invite.
aia
peut remplacer n'importe quelle référence à une variable d'environnement système (envar) dans le texte d'invite par la valeur de l'envar. Des modèles comme
Le contenu dynamique peut être inséré dans l'invite à l'aide du modèle
Considérez la possibilité d'adapter une invite à votre système d'exploitation spécifique :
As a system administration on a $(uname -v) platform what is the best way to [DO_SOMETHING]
ou insérez le contenu d'un fichier dans votre répertoire personnel :
Given the following constraints $(cat ~/3_laws_of_robotics.txt) determine the best way to instruct my roomba to clean my kids room.
Lorsque vous utilisez l'option --shell
pour démarrer une session de discussion, l'intégration du shell est disponible dans vos invites de suivi. Supposons que vous ayez démarré une session de discussion en utilisant un rouleau de "Ruby Expert" dans l'espoir de discuter des modifications qui pourraient être apportées à une classe spécifique MAIS vous avez oublié d'inclure le fichier source de la classe dans le contexte lorsque vous avez commencé. Vous pouvez saisir ceci comme invite de suivi pour continuer :
The class I want to chat about refactoring is this one: $(cat my_class.rb)
Cela insère l'intégralité du fichier source de la classe dans votre invite de suivi. Vous pouvez continuer à discuter avec votre AI Assistant concernant les modifications apportées à la classe.
L'inclusion de contenu dynamique via l'intégration shell fournie par l'option --shell
est significative. aia
fournit également toute la puissance du traitement du code Ruby intégré dans le texte d'invite.
L'option --erb
transforme le fichier texte d'invite en un modèle ERB entièrement fonctionnel. La syntaxe du modèle Embedded Ruby (ERB) (2024) fournit un bon aperçu de la syntaxe et de la puissance d'ERB.
La plupart des sites Web contenant des informations sur ERB donneront des exemples d'utilisation d'ERB pour générer du contenu HTML dynamique pour les applications Web. Il s’agit d’un cas d’utilisation courant d’ERB. aia
d'autre part, utilise ERB pour générer un texte d'invite dynamique.
Dans une session de discussion, qu'elle soit démarrée par l'option --chat
ou son équivalent avec une directive dans un fichier texte d'invite, se comporte un peu différemment en ce qui concerne ses affectations de liaison et de variables locales. Étant donné qu'une session de discussion comporte par définition plusieurs invites, définir une variable locale dans une invite et s'attendre à ce qu'elle soit disponible dans une invite ultérieure ne fonctionne pas. Vous devez utiliser des variables d'instance pour accomplir cette invite afin d'inviter le transfert des informations.
De plus, étant donné que les invites de suivi sont censées être une seule chose - une phrase ou un paragraphe - terminée par un seul retour, il est probable que l'amélioration de l'ERB sera bénéfique ; mais vous en trouverez peut-être une utilité.
Des directives de traitement en aval ont été ajoutées à la gemme prompt_manager
utilisée par au
dans la version 0.4.1. Ces directives sont des lignes du fichier texte d'invite qui commencent par "//" et ont ce modèle :
//command parameters
Il n'y a pas d'espace entre le "//" et la commande.
Lorsque vous combinez des directives d'invite avec des paramètres d'invite et des substitutions d'envar du shell, vous pouvez obtenir de puissantes invites de composition.
Voici un exemple de directive générique pure.
//[DIRECTIVE_NAME] [DIRECTIVE_PARAMS]
Lorsque l'invite s'exécute, il vous sera demandé de fournir une valeur pour chacun des paramètres. Vous pouvez répondre "shell" pour le nom de la directive et "calc 22/7" si vous vouliez une mauvaise approximation de PI.
Essayez ce fichier d'invite :
//shell calc [FORMULA]
What does that number mean to you?
aia
A l’heure actuelle, aia
ne dispose que de quelques directives détaillées ci-dessous.
La directive //config
dans un fichier texte d'invite est utilisée pour personnaliser l'environnement de configuration spécifique de l'invite. Tous les éléments de configuration peuvent modifier leurs valeurs. L'ordre d'attribution des valeurs pour un élément de configuration commence par la valeur par défaut qui est remplacée par la valeur envar qui est remplacée par la valeur de l'option de ligne de commande qui est remplacée par la valeur du fichier de configuration.
Le //config
est le dernier et dernier moyen de modifier la valeur d'un élément de configuration pour une invite spécifique.
Les options de commutation sont traitées comme des booléens. Ils sont soit true
, soit false
. Leur nom dans le contexte d'une directive //config
se termine toujours par un "?" personnage - point d'interrogation.
Pour définir la valeur d'un commutateur en utilisant ``//config for example
--terse` ou `--chat` à ceci :
//config chat? = true
//config terse? = true
Un élément de configuration tel que --out_file
ou --model
a une valeur associée sur la ligne de commande. Pour définir cette valeur avec la directive //config
procédez comme ceci :
//config model = gpt-3.5-turbo
//config out_file = temp.md
//config backend = mods
BTW : le "=" est complètement des options. Il est en fait ignoré, tout comme ":=" si vous deviez le choisir comme opérateur d'affectation. De plus, le nombre d'espaces entre l'élément et la valeur est totalement arbitraire. J'aime aligner les choses pour que cette syntaxe soit tout aussi valable :
//config model gpt-3.5-turbo
//config out_file temp.md
//config backend mods
//config chat? true
//config terse? true
//config model gpt-4
REMARQUE : si vous spécifiez le même nom d'élément de configuration plusieurs fois dans le fichier d'invite, c'est le dernier qui sera défini lorsque l'invite sera finalement traitée via le LLM. Par exemple dans l’exemple ci-dessus, gpt-4
sera le modèle utilisé. Être le premier ne compte pas dans ce cas.
Exemple:
//include path_to_file
Le path_to_file
peut être absolu ou relatif. Si elle est relative, elle est ancrée chez les personnes handicapées. Si le path_to_file
inclut des envars, l'option CLI --shell
doit être utilisée pour remplacer l'envar dans la directive par sa valeur réelle.
Le fichier inclus ne comportera aucun commentaire ou directive. Il est prévu que le fichier soit un fichier texte afin que son contenu puisse être ajouté au début de l'invite existante ; cependant, si le fichier est un fichier de code source (ex : fichier.rb) le code source sera inclus CEPENDANT toute ligne de commentaire ou ligne commençant par "//" sera exclue.
À FAIRE : Pensez à ajouter une option de ligne de commande --include_dir
pour spécifier l'endroit d'où doivent provenir les fichiers relatifs.
Exemple:
//ruby any_code_that_returns_an_instance_of_String
Cette directive s’ajoute à l’ERB. À ce stade, la directive //ruby
est limitée par la liaison actuelle qui se trouve dans la méthode AIA::Directives#ruby
. En tant que tel, il est peu probable qu’il soit très utile.
Cependant, comme il est implémenté sous la forme d'un simple eval(code)
, il existe un potentiel d'utilisation comme celui-ci :
//ruby load(some_ruby_file); execute_some_method
Chaque exécution d'une directive //ruby
sera une nouvelle exécution de la méthode AIA::Directives#ruby
, vous ne pourrez donc pas transporter de variables locales d'une invocation à une autre ; cependant, vous pouvez faire quelque chose avec des variables d'instance ou des variables globales. Vous pouvez même ajouter quelque chose à l'objet AIA.config
à coller lors de la prochaine invocation de la directive dans le contexte de la même invite.
Exemple:
//shell some_shell_command
Il est prévu que la commande shell renvoie du texte à STDOUT qui sera placé en pré-attente du texte d'invite existant dans le fichier d'invite.
Il n'y a aucune limitation sur ce que peut être la commande shell. Par exemple, si vous souhaitez contourner la suppression des commentaires et des directives d'un fichier, vous pouvez faire quelque chose comme ceci :
//shell cat path_to_file
Ce qui fait fondamentalement la même chose que la directive //include
, sauf qu'elle utilise tout le contenu du fichier. Pour les chemins de fichiers relatifs, la même chose s'applique. Le chemin du fichier sera relatif au PWD.
Consultez le code source pour les directives prises en charge par les backends qui, pour le moment, sont également basées sur la configuration.
Par exemple, mods
ont un élément de configuration topp
qui peut être défini directement par une directive dans un fichier texte d'invite.
//topp 1.5
Si mods
n'est pas le backend, la directive //topp
est ignorée.
Lorsque vous êtes dans une session de discussion, vous pouvez utiliser une directive comme invite de suivi. Par exemple, si vous avez démarré la session de discussion avec l'option --terse
en attendant d'obtenir des réponses courtes du backend ; mais ensuite vous décidez que vous voulez des réponses plus complètes, vous pouvez faire ceci :
//config terse? false
La directive est exécutée et une nouvelle invite de suivi peut être saisie avec une réponse plus longue générée par le backend.
Pourquoi auriez-vous besoin/vouloir utiliser une séquence d'invites dans une situation de traitement par lots. Peut-être avez-vous une invite complexe qui dépasse les limites de jetons de votre modèle pour la saisie, vous devez donc la diviser en plusieurs parties. Ou supposons qu'il s'agisse d'une simple invite mais que le nombre de jetons sur la sortie est limité et que vous n'obtenez pas exactement le type de réponse complète que vous recherchiez.
Parfois, il faut une série d’invites pour obtenir le type de réponse souhaitée. La réponse à une invite devient un contexte pour l'invite suivante. Ceci est facile à faire au cours d'une session chat
où vous saisissez et ajustez manuellement vos invites jusqu'à ce que vous obteniez le type de réponse souhaitée.
Si vous devez le faire régulièrement ou au sein d'un lot, vous pouvez utiliser aia
et les options de ligne de commande --next
et --pipeline
.
Ces deux options spécifient la séquence d'ID d'invite à traiter. Les deux options peuvent être utilisées dans un fichier d'invite à l'aide de la directive //config
. Comme toutes les directives intégrées, vous pouvez profiter de l'intégration du shell de paramétrage et de Ruby. Je commence à me sentir comme l'homme de TIm Tool : plus de puissance !
Considérez la condition dans laquelle vous disposez de 4 ID d’invite qui doivent être traités dans l’ordre. Les ID et les noms de fichiers d'invite associés sont :
ID d'invite | Fichier d'invite |
---|---|
un. | un.txt |
deux. | deux.txt |
trois. | trois.txt |
quatre. | quatre.txt |
export AIA_OUT_FILE=temp.md
aia one --next two
aia three --next four temp.md
ou dans chacun des fichiers d'invite, vous utilisez la directive config :
one.txt contains //config next two
two.txt contains //config next three
three.txt contains //config next four
MAIS si vous avez plus de deux invites dans votre séquence, envisagez d'utiliser l'option --pipeline.
La directive //next est l'abréviation de //config next
aia one --pipeline two,three,four
ou à l'intérieur du fichier d'invite one.txt
, utilisez cette directive :
//config pipeline two,three,four
La directive //pipeline est l'abréviation de //config pipeline
Étant donné que la réponse d'une invite est introduite dans l'invite suivante dans la séquence au lieu que toutes les invites écrivent leur réponse dans le même fichier de sortie, utilisez ces directives dans les fichiers d'invite associés :
Fichier d'invite | Directif |
---|---|
un.txt | //config out_file one.md |
deux.txt | //config out_file deux.md |
trois.txt | //config out_file trois.md |
quatre.txt | //config out_file four.md |
De cette façon, vous pouvez voir la réponse générée pour chaque invite de la séquence.
À FAIRE : l'audio-to-text est encore en développement.
Supposons que vous disposiez d'un fichier audio d'une réunion. Vous devez obtenir une transcription de ce qui a été dit lors de cette réunion. Parfois, les transcriptions brutes cachent la valeur réelle de l'enregistrement. Vous avez donc créé une pompe qui prend les transcriptions brutes et fait un résumé technique avec une liste d'actions à entreprendre.
Créez deux invites nommées transcribe.txt et 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
et
# 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.
Maintenant, vous pouvez faire ceci :
aia transcribe my_tech_meeting.m4a
Votre résumé de la réunion se trouve dans le fichier meeting_summary.md
Il existe deux types d'invites
Ce deuxième type d’invite s’appelle un rôle. Parfois, le rôle est intégré à l’instruction. Par exemple "En tant que magicien, faites apparaître un lapin d'un chapeau." Pour réutiliser le même rôle dans plusieurs invites, aia
vous encourage à désigner un roles_dir
spécial dans lequel vous placez les invites spécifiques aux rôles de personnification.
Le roles_dir
par défaut est un sous-répertoire du prompts_dir
nommé rôles. Vous pouvez cependant placer votre roles_dir
n'importe où qui vous semble logique.
L'option --role
est utilisée pour identifier une invite de personnification dans votre répertoire de rôles qui définit le contexte dans lequel le LLM doit fournir sa réponse. Le texte de l'ID de rôle est ajouté au texte de l'invite principale pour former une invite complète à traiter par le backend.
Par exemple, considérons :
aia -r ruby refactor my_class.rb
Dans le répertoire des rôles, le contenu du fichier texte ruby.txt
sera pré-ajouté au contenu du fichier refactor.txt
du répertoire des invites pour produire une invite complète. Cette invite complète aura tous les paramètres suivis des directives traitées avant d'envoyer le texte d'invite combiné au backend.
Notez que --role
est simplement une façon de dire d'ajouter ce fichier texte d'invite au début de cet autre fichier texte d'invite. Le contenu de l'invite « rôle » peut être n'importe quoi. Il ne s’agit pas nécessairement d’un rôle réel.
aia
prend entièrement en charge une arborescence de répertoires dans prompts_dir
comme moyen d'organisation ou de classification de vos différents fichiers texte d'invite.
aia -r sw_eng doc_the_methods my_class.rb
Dans cet exemple, le fichier texte d'invite $AIA_ROLES_DIR/sw_eng.txt
est ajouté au fichier texte d'invite $AIA_PROMPTS_DIR/doc_the_methods.txt
Étant donné aia
prend en charge les invites paramétrées, vous pouvez intégrer un mot-clé tel que "[ROLE]" à votre invite. Par exemple, considérons cette invite :
As a [ROLE] tell me what you think about [SUBJECT]
Lorsque cette invite est traitée, aia
vous demandera une valeur pour le mot-clé « RÔLE » et le mot-clé « SUJET » pour compléter l'invite. Puisque aia
conserve un historique de vos réponses précédentes, vous pouvez simplement choisir quelque chose que vous avez utilisé dans le passé ou répondre avec une valeur complètement nouvelle.
Pour installer les programmes CLI externes utilisés par aia :
Brew installer les mods fzf rg glow
fzf Recherche floue en ligne de commande écrite en Go https://github.com/junegunn/fzf
mods AI sur la ligne de commande https://github.com/charmbracelet/mods
rg Outil de recherche comme grep et The Silver Searcher https://github.com/BurntSushi/ripgrep
glow Rendu markdown sur la CLI https://github.com/charmbracelet/glow
Un éditeur de texte dont l'exécutable est configuré dans la variable d'environnement système 'EDITOR' comme ceci :
export EDITOR="subl -w"
llm
llm Access large language models from the command-line
| brew install llm
|__ https://llm.datasette.io/
Depuis aia v0.5.13
le processeur backend llm
est disponible dans une intégration limitée. Il s'agit d'une implémentation très puissante basée sur Python qui possède son propre système de modèles d'invite. La raison pour laquelle il est inclus dans l'environnement aia
est sa capacité à utiliser des modèles LLM locaux.
sgpt
du processeur back-end shell-gpt
alias sgpt
est également une implémentation python d'un outil CLI qui traite les invites via OpenAI. Il a moins de fonctionnalités que les mods
et llm
et est moins flexible.
plz
plz-cli
alias plz
n'est pas intégré à aia
, cependant, il obtient une mention honorable pour sa capacité à exclure une invite adaptée pour faire quelque chose sur la ligne de commande. Sa réponse est une commande CLI (parfois une séquence redirigée) qui accomplit la tâche définie dans l'invite. Il renverra les commandes à exécuter sur les fichiers de données que vous avez spécifiés avec une requête pour exécuter la commande.
Vous pouvez configurer une fonction de complétion dans votre shell qui se terminera sur le prompt_id enregistré dans votre prompts_dir
- les fonctions pour bash
, fish
et zsh
sont disponibles. Pour obtenir une copie de ces fonctions, procédez comme suit :
aia --completion bash
Si vous n'êtes pas fan de "born Again", remplacez bash
par l'un des autres.
Copiez la fonction à un endroit où elle peut être installée dans l'instance de votre shell. Il peut s'agir d'un fichier .profile
ou .bashrc
, etc.
C'est juste entre toi et moi, alors n'allez pas en parler à tout le monde. Mon invite la plus puissante se trouve dans un fichier nommé ad_hoc.txt
. Cela ressemble à ceci :
[QUOI MAINTENANT HUMAIN]
Ouais. Juste un seul paramètre pour lequel je peux fournir une valeur de tout ce que je pense à ce moment-là. Son avantage est que je ne pollue pas l'historique des commandes de mon shell avec beaucoup de texte.
Selon vous, qu'est-ce qu'il est préférable d'avoir dans le fichier historique de votre 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
ou
aia ad_hoc financial_statement.txt
Les deux font la même chose ; cependant, aia
ne place pas le texte de l'invite dans le fichier historique du shell... bien sûr, la valeur du mot-clé/paramètre est enregistrée dans le fichier JSON de l'invite et l'invite avec la réponse est enregistrée à moins que --no-log
ne soit spécifié. ; mais cela ne gâche pas l’histoire du shell !
J'utilise le shell bash
. Dans mon fichier .bashrc
, je recherche un autre fichier nommé .bashrc__aia
qui ressemble à ceci :
# ~/.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
Voici à quoi ressemble mon fichier d'invite chat
:
# ~/.prompts/chat.txt
# Desc: Start a chat session
//config chat ? = true
[WHAT]
Cet outil CLI a commencé avec quelques lignes de Ruby dans un fichier de mon dépôt de scripts. J'ai continué à grandir à mesure que j'ai décidé d'ajouter plus de fonctionnalités et plus d'outils backend. Il n’y avait pas de véritable architecture pour guider la conception. Ce qui reste est un gros désordre de code qui est lentement remanié en quelque chose de plus maintenable. Ce travail se déroule dans la branche develop
. J'apprécie votre aide. Jetez un œil à ce qui se passe dans cette branche et envoyez-moi un PR contre cela.
Bien sûr, si vous voyez quelque chose dans la branche principale, envoyez-moi un PR contre celui-ci afin que nous puissions résoudre le problème pour tous.
Les rapports de bogues et les demandes d'extraction sont les bienvenus sur GitHub à l'adresse https://github.com/MadBomber/aia.
Lorsque vous rencontrez des problèmes avec aia
veuillez les noter comme un problème. Cette chose a été écrite principalement par un humain et vous savez à quel point les humains sont sujets aux erreurs. Il devrait y avoir beaucoup d'erreurs à trouver.
Je ne suis pas satisfait de la manière dont certaines options de ligne de commande pour les commandes externes sont codées en dur. Je parle spécifiquement de la manière dont les outils rg
et fzf
sont utilisés. Ces options déterminent l'apparence de base de la capacité de recherche sur la ligne de commande. Peut-être devraient-ils faire partie de la configuration globale afin que les utilisateurs puissent ajuster leur interface utilisateur comme ils le souhaitent.
La gemme est disponible en open source selon les termes de la licence MIT.