LES BUNKERS

Comment utiliser Espanso pour QUINTUPLER ta productivité avec ChatGPT?

Si tu as lu mon dernier article — 6 astuces pour doubler ta productivité avec ChatGPT — tu sais qu’un bon prompt peut être assez long à rédiger.

ChatGPT, c’est un peu comme un employé — tu ne peux pas t’attendre à ce qu’il lise dans ta tête! Si tu veux qu’il fasse quelque chose, tu dois présenter le contexte, fournir des instructions, préciser les contraintes, fournir un modèle de ce à quoi doit ressembler son travail, etc. ChatGPT a beau être puissant, il ne peut quand même pas deviner tes intentions. Il n’est pas magique!

Je sais, je sais… c’est long! Tu ne veux pas devoir prendre 10 minutes pour demander à ChatGPT de t’écrire un bout de texte qui t’aurait toi-même pris 5 minutes à écrire.

C’est entre autres pour cette raison que j’ai toujours eu de la difficulté à déléguer… c’est souvent plus rapide de faire la tâche toi-même que de décrire le processus nécessaire pour la compléter!

Mais ChatGPT n’est pas un humain, mais un ordinateur. Et, comme avec tout ce qui touche les ordinateurs, il existe un moyen de travailler 5 à 10 fois plus rapidement.

Tu me connais… La productivité, c’est une religion pour moi! Tu te souviens de mon livre Double ta valeur? Dans la 2e partie, je partage une série d’outils qui permettent à n’importe qui de décupler leur vitesse de travail. Aujourd’hui, tu vas découvrir comment utiliser un de ces outils de concert avec ChatGPT — les text-expander. Plus précisément, Espanso.

Qu’est-ce que Espanso? À quoi ça sert?

Espanso est un text-expander gratuit et open-source disponible sur Linux, Mac et Windows.

Il détecte lorsque tu écris un mot clef et remplace le texte automatiquement.

Cette fonction de “search and repace” se fait bien sûr à partir d’un répertoire d’expression que tu peux personnaliser.

C’est génial si tu répètes souvent les mêmes choses et que tu aimerais sauver du temps. Exemple, pour accélérer tes réponses par courriels, tu pourrais remplacer :bye par "N'hésite pas si tu as des questions! Ça va me faire plaisir d'y répondre, je suis là pour ça. À bientôt, Olivier Lambert".

À eux-mêmes, les text-expanders sont très puissant. Mais lorsqu’on les combine avec des outils comme ChatGPT?

J’imagine que tu me vois venir… Ça veut dire que tu peux l’utiliser pour coller tes prompts dans ChatGPT sans avoir à garder tes prompts dans un document texte quelque part sur ton ordinateur.

Et, puisqu’il y a une fonction “recherche rapide” (ALT+SPACE), même pas besoin de te rappeler d’un paquet de raccourcis obscurs.

Espanso peut faire beaucoup plus que simplement remplacer du texte, il peut faire apparaître un formulaire et intégrer les réponses dans la portion de texte remplacé.

Mais ça ne s’arrête pas là… On peut aussi exécuter un script Python et utiliser la réponse de notre script dans le remplacement. Si tu as lu l’article où j’explore le CLI de OpenAI, ta réaction ressemble probablement à celle-ci:

Des scripts Python? Est-ce que tu dis ce que je pense que tu dis?

Yep, ça veut dire que tu peux communiquer avec OpenAi directement à partir de N’IMPORTE QUEL CHAMP TEXTE! 🤯

Si ce que je viens de dire sonne comme du chinois, voici un petit exemple concret qui va t’aider à comprendre.

J’ai configuré un script qui fait apparaître cette boîte de dialogue lorsque je fais ???

Le script prend ce qui se trouve dans mon presse-papier et exécute l'action que j’ai sélectionnée dans le menu déroulant.

Voici un petit exemple pour le correcteur:

  • Texte avant a correction: Cesi es une phrase écrite avec un mauvais ortografe.
  • Texte après correction: Ceci est une phrase écrite avec une mauvaise orthographe.

Pour que ce soit facile de comparer, toutes les modifications apportées sont en gras. (Le gras est appliqué en Markdown, ce qui fonctionne bien avec des éditeurs comme Notion et Obsidian)

Et juste comme ça, bye bye Antidote! 👋

Bref, dans cet article, je vais t’expliquer comment installer et configurer Espanso pour que tu puisses facilement l’utiliser avec ChatGPT!

1. Installer & configurer Espanso

L’installation est assez simple, il ne suffit de 1) te rendre au espanso.org/install/ 2) télécharger et 3) exécuter l’installateur.

Une fois installé, tu peux tester le logiciel en écrivant :espanso dans un champ texte quelque part, ce qui devrait faire apparaître Hi there!.

Pour ajouter/modifier des “triggers” (ce qui déclenche l’expander), il faut éditer un fichier texte.

Sur Windows, ce fichier se trouve ici: C:/Users/%USERNAME%/AppData/Roaming/espanso/match/base.yml

Bien sûr, il faut remplacer %USERNAME% par le nom d’utilisateur de ta session Windows.

Pour y accéder plus facilement, tu peux simplement exécuter espanso edit dans ta console.

Pour accéder à ta console, fais win + r , inscris CMD et appuie sur OK.

Ensuite, écris espanso edit et fais enter. En plus d’ouvrir ton document dans notepad, ça va aussi te montrer le chemin dans ta console.

Le document notepad ressemble à ceci:

Si tu as Visual Code Studio (si tu ne l'as pas, je te recommande fortement de l'installer), tu peux également ouvrir un nouvel environnement de travail. Je te recommande de l'ouvrir à partir du dossier C:/Users/%USERNAME%/AppData/Roaming/espanso. Comme ça, tu vas pouvoir facilement éditer les fichiers qui se trouvent dans config, match et scripts.

Les prochaines fois que tu voudras y accéder, tu n'auras qu'à aller dans tes projets récents:

Bref, tu vas remarquer que les fichiers de configurations sont au format *.yml (YAML). Si tu ne connais pas ça, voici une petite explication générée par Robolivier!

Robolivier :

YALM, qui signifie "Yet Another Markup Language" (encore un autre langage de balisage), est un moyen simple et facile à lire pour stocker et échanger des données dans un format structuré. Imaginez que vous ayez besoin de noter les ingrédients et les étapes d'une recette. Au lieu d'écrire tout cela dans un long paragraphe, vous pouvez utiliser YALM pour organiser les informations de manière claire et lisible.

YALM utilise des tirets, des deux-points et des espacements pour structurer les données, ce qui rend le format facile à comprendre pour les humains. Par exemple, voici une recette de gâteau au chocolat en YALM :

recette:
  nom: Gâteau au chocolat
  ingredients:
    - farine: 200g
    - sucre: 150g
    - beurre: 100g
    - oeufs: 3
    - chocolat: 100g
  etapes:
    - Préchauffer le four à 180°C.
    - Mélanger les ingrédients secs.
    - Ajouter le beurre, les oeufs et le chocolat fondu.
    - Verser dans un moule et cuire 30 minutes.

Ainsi, YALM permet de structurer et d'organiser des données de manière claire et simple, ce qui facilite la lecture et la compréhension pour les humains, ainsi que l'échange et le traitement par les ordinateurs.

Bref, il ne s'agit que d'un format pour structurer des données. Avant de poursuivre la lecture de cet article, je te recommande de prendre une ou deux minutes pour survoler la documentation d'espanso.

Pour tester si tu comprends bien, essaie d'ajouter un nouveau trigger dans ton fichier. Voici un petit exemple que tu peux ajouter:

  - trigger: ":bye"
    replace: "N'hésite pas si tu as des questions! Ça va me faire plaisir d'y répondre, je suis là pour ça. À bientôt!"

À noter que l'indentation est importante! Tu peux indenter une ligne de texte en appuyant sur la touche tab de ton clavier. Sur VSCode (pas sur notepad) tu peux également faire shift + tab pour retirer une indentation.

La structure du document va comme suit:

matches:
  - trigger: ":trigger_1"
    replace: "Salut!"

  - trigger: ":trigger_2"
    replace: "Comment ça va?"

Important, matches: ne dois être présent qu'une seule fois en haut du document.

Enregistre ton fichier, attends 2 ou 3 secondes et va le tester!

2. Comment ton text-expander pour tes prompts?

Si tes prompts sont le moindrement complexes, comme celles que j'ai partagées dans mon dernier article) tu ne pourras pas simplement les copier/coller dans la section "replace". Puisqu'il y a des retours de ligne et des caractères spéciaux, ça va briser la structure de ton fichier YAML.

Pour remédier au problème, tu peux passer ton texte dans cescaper.com.

Ne suffit que de coller ton texte dans la boîte du haut et appuyer sur "Escape" en bas à droite.

Ensuite, tu copie ce qui se trouve dans "escaped string". Ça va avoir "échappé" tous les guillemets et remplacé les caractères invisibles (comme les retours de ligne) de sorte que ça te donne une très longue ligne qui contient toutes les informations de ton prompt.

Voici ce que ça donne en YAML:

  - trigger: "prompt:seo"
    replace: "Contexte: Tu travailles pour La Tranchée (https://www.latranchee.com/accueil), une communauté en ligne offrant des articles de blog, un podcast, un forum et des formations en ligne pour aider les entrepreneurs francophones à développer leur entreprise. Les gens peuvent s\'abonner en payant un montant mensuel. Une fois abonnés, ils peuvent participer au forum et effectuer des missions générées par le système pour obtenir des crédits et des points d\'expérience. Les points d\'expérience débloquent des bonus et les crédits peuvent être utilisés comme rabais sur les formations. Les sujets couverts par le blog, le forum et les formations incluent la publicité sur Facebook et Google, le SEO, la création de contenu, l\'automatisation, le marketing et l\'écriture persuasive, etc.\r\n\r\nObjectif: L’entreprise doit améliorer son référencement web. Pour se faire, elle doit optimiser le titre et la méta-description de chacune de ses pages web.\r\n\r\nInstruction: Je vais te donner l’URL d’un de nos articles de blogue. Tu dois charger & analyser le contenu de la page afin d\'en extraire les éléments importants.\r\n\r\nUne fois que tu es confiant d\'avoir analyser le contenu de la page web de façon suffisante, tu dois rédiger un nouveau titre ainsi qu\'une méta-description optimisée pour le référencement sur Google ainsi qu\'un titre et une description pour Facebook optimiser pour piquer la curiosité des gens et générer des clics et partages.\r\n\r\nPour Facebook, tu dois me fournir 3 suggestions de textes de 100 à 300 caractères à utilier pour partager l’article sur notre page.\r\n\r\nTu dois également en choisir un et m’expliquer pourquoi il s’agit de ton préféré.\r\n\r\nSi tu comprends les instructions, réponds avec: “Compris, veuillez inscrire l’URL de la page cible.”\r\n\r\nContraintes:\r\n\r\nLes titre doivent contenir un maximum de 60 caractères.\r\n\r\nLes description doivent contenir un maximum de 155 caractères.\r\n\r\nLe titre et/ou la descriptions doivent contenir une ou plusieurs requête de recherche potentiellement populaire.\r\n\r\nN’utilise pas de termes évidents comme “cliquez ici”.\r\n\r\nN’utilise pas de langage de templating comme [lien]. Les suggestions doivent être final et ne nécessiter aucune retouche.\r\n\r\nInterdiction de rédiger autre chose que du JSON. Aucune intro et conclusion acceptée.\r\n\r\nStyle:\r\n\r\nRédigé à la première personne\r\n\r\nBref et concis\r\n\r\nTon informel et enthousiaste\r\n\r\nLangage canadien/québecois.\r\n\r\nFormat attendue:\r\n\r\nTa réponse doit être dans un seul fil JSON à l’intérieur d’un bloc de code.\r\n\r\nLe JSON doit être espacé de façon à faciliter la lecture.\r\n\r\nChaque réponse doit contenir un indice de confiance où tu évalues ta propre performance sur la tâche donnée.\r\n\r\nChaque réponse doit contenir un indice qui évalue le titre et la description en fonction de sa capacité à générer des clics. Tes réponses doivent obtenir un score supérieur à 0.95.\r\n\r\nExemple de réponse acceptable:\r\n\r\n{\r\n  \"google\":{\r\n\t\t\"title\": String (60),\r\n\t\t\"description\": String (155),\r\n\t\t\"confiance\": Number (0-1),\r\n      \t\"clickality\": Number between 0-1\r\n\t},\r\n\t\"facebook\":{\r\n\t\t\"title\": String (60),\r\n\t\t\"description\": String (155),\r\n\t\t\"confiance\": Number (0-1),\r\n\t\t\"clickality\": Number (0-1),\r\n\t\t\"posts\": {\r\n\t\t\t\"suggestions\": [ Strings (100-500) * 3],\r\n\t\t  \"favorite\": {\r\n\t\t\t\t\t\"index\": Position in suggestions array,\r\n\t\t\t\t\t\"reason\": String\r\n     }\r\n  }\r\n}"

C'est pratique pour enregistrer de longs prompts, mais tu peux également t'en servir pour créer des "chunks" de prompts.

Par exemple, tu pourrais avoir un chunk pour le style et la personnalité de ton robot.

  - trigger: "prompt:style"
    replace: "Tu es un coach d'affaires canadien français reconnu. Tu as écrit plusieurs livres de non-fiction qui sont devenus des best-sellers grâce à ton style d'écriture bref et concis. Tes textes sont écrits à la première personne et tu emploies un ton informel et enthousiaste. Les gens apprécient que tu utilises des figures de style comme des métaphores, similes, oxymores, rimes, etc. Tes textes sont faciles à lire pour des non-experts. C'est simple, mais pas simpliste. Tu ne prends pas les gens pour des cons."
  - trigger: "prompt:email"
    replace: "Tâche: Tu travailles pour La Tranchée, une communauté en ligne pour entrepreneur qui offre podcast, forum, blogue et formation. Tu dois répondre à un utilisateur par courriel."

L'idée est d'enchaîner les différents "chunks" de prompts, ce qui va te permettre d'être BEAUCOUP plus rapide lorsque tu parles à ChatGPT.

3. Intermédiaire: configurer un script python de base

Tu es un accro de la productivité qui veut repousser ses limites? J'ai exactement ce qu'il te faut!

Afin d'exécuter des fichiers Python à l'aide d'Espanso, tu devras bien sûr installer Python. Une fois que c'est fait, assure-toi de mettre PIP à jour en pip install --upgrade pip.

On va garder les choses simples pour notre premier exemple. Dans ton projet VS Code, créer un nouveau fichier dans le dossier scripts et nomme le sum.py.

Voici le code à utiliser dans ce document:

# sum_args.py
import sys

if len(sys.argv) != 3:
    print("Usage: python sum_args.py num1 num2")
    sys.exit(1)

num1 = float(sys.argv[1])
num2 = float(sys.argv[2])

result = num1 + num2
print(f"The sum of {num1} and {num2} is {result}")

Ce script est très simple, il ne fait qu'additionner 2 chiffres. À la fin de ton fichier base.yml voici la configuration que tu dois ajouter:

  - trigger: ":sum"
    replace: "{{output}}"
    vars:
      - name: "data"
        type: form
        params:
          layout: "[[number_1]] + [[number_2]]"
      - name: output
        type: shell
        params:
          cmd: "python C:/Users/olivierLambert/AppData/Roaming/espanso/scripts/sum.py {{data.number_1}} {{data.number_2}}"

Bien sûr, prends le temps de remplacer /olivierLambert/ par la bonne valeur pour ton ordinateur.

Maintenant, lorsque tu écris :sum, cette fenêtre va apparaître:

Si tu examines bien ta configuration YAML, tu peux voir qu'on a créé une variable dont le nom est data qui contient 2 paramètres, soit number_1 et number_2. Lorsqu'on exécute le script, ces 2 paramètres sont ajoutés à la fin de notre script en tant qu'arguments (data.number_1 data.number_2).

Dans notre script python, on utilise sys.argv[1] pour aller chercher le 1er et sys.argv[2] pour aller chercher le 2e argument.

Je suis curieux... Qui a réussi à se rendre jusqu'ici? Si c'est ton cas, fais-moi signe dans les commentaires!

Avancé: ajoute du AI à ton text-expander!

Dans cette dernière section, je vais t'expliquer j'ai fait pour créer mon script qui corrige le texte que j'ai dans mon presse papier!

Avant de poursuivre, c'est important d'avoir ta clef d'API d'OpenAi! Si tu ne l'as pas encore, c'est par ici.

Bon... Voici ma configuration Espanso:

  - trigger: "???"
    replace: "{{output}}"
    vars:
      - name: "formulaire"
        type: form
        params:
          layout: "Type: [[type]]"
          fields:
            type:
              type: list
              values:
                - correct
                - synonymes
                - translate
      - name: output
        type: script
        params:
          args:
            - python
            - "%CONFIG%/scripts/{{formulaire.type}}.py"

Comme tu peux voir, cette configuration est un peu plus complexe. Ne t'inquiète pas, ça reste simple à comprendre si on prend le temps de lire chaque ligne.

Tout ce que j'ai fait, c'est créer une variable au nom de formulaire qui est de type form. Comme dans l'exemple précédant, layout va faire apparaître un formulaire et les valeurs de ce formulaire sont enregistrés dans la variable qu'on a déclarée (formulaire).

Ne t'inquiète pas, je ne sors pas tout ça de mon cul! 🍑 J'ai simplement été lire la documentation.

Tu vas remarquer que la façon que j'exécute le script est un peu différente. Pour faire la somme, on avait une variable de type shell; maintenant, on a une variable de type script.

La raison est simple: on peut passer des arguments dans une commande shell (nos deux chiffres) alors qu'on ne peut pas quand il s'agit d'un type script. (Si tu sais comment, dis-le-moi dans les commentaires!)

Je préfère utiliser le type script puisqu'on peut utiliser la variable %CONFIG% dans le chemin de notre script. Comme ça, on peut facilement copier/coller la configuration de l'expander d'un ordinateur à l'autre!

Bref, on a un formulaire qui propose 3 choix: correct, synonymes et translate. Lorsqu'on en choisit un, le texte de cette variable est dynamiquement inséré dans le nom du document python à exécuter.

%CONFIG%/scripts/.py

Dans VS Code, il faut simplement créer les fichiers:

Tu te demandes sûrement comment on va faire pour utiliser le contenu du presse-papier, n'est-ce pas?

Tu vas voir, c'est assez simple! Voici le contenu du fichier correct.py:

import pyperclip
import io
import requests

import sys
# UTF-8 pour supporter les caractères spéciaux!
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf8')

# Copie le contenu du presse-papier
user_message = pyperclip.paste()

# Remplace 'api_key' avec ta clef d'API!
api_key = 'api_key'

headers = {
    'Content-Type': 'application/json',
    'Authorization': f'Bearer {api_key}'
}

url = 'https://api.openai.com/v1/chat/completions'

data = {
    # gpt-4-0314
    'model': 'gpt-3.5-turbo',
    'messages': [{"role": "system",
                  "content": "You are the author of multiple best selling business novel and non-fiction books. Your task is to fix the grammar of whatever is given to you as an input. NEVER ask for more context, simply edit the content as you think best. Your answer has to be formatted in markdown. All individual edits needs to be bolded. For example 'Commant ça va mon ammii?' would return '**Comment ** ça va mon ** ami **?' The result have to be extremely well written and grammatically correct."
                  },
                 {"role": "user", "content": "Correct everything after this:" + user_message}],
    'max_tokens': 3000,
    'n': 1,
    'stop': None,
    'temperature': 0.5
}

response = requests.post(url, headers=headers, json=data)

if response.status_code == 200:
    choice = response.json()['choices'][0]
    text = choice['message']['content'].strip()
    print(text)
else:
    print(f"Error: {response.status_code}, {response.text}")

Le script se base sur 3 dépendances. Pyperclip (pour accéder au presse-papier), requests (pour appeler OpenAi), Io et Sys (pour que l'encodage du fichier soit compatible avec les caractères francophones).

Io et sys sont des packages de base avec Python, donc pas besoin de les installer. Par contre, tu vas devoir installer les deux premiers. Tu vas voir, c'est super simple, il faut juste exécuter ces deux lignes de codes dans ta console:

pip install pyperclip
pip install requests

Voilà! Si tu as suivi les étapes correctement, tu devrais maintenant être en mesure de corriger le texte qui se trouve dans ton presse papier.

Comment te sens-tu avec tes nouveaux pouvoirs?

Pour le script de synonymes et de traductions, voici les prompts que j'utilise:

You are the author of multiple best selling business novel and non-fiction books. Your task is to find synonyms to use for whatever is given to you as an input. NEVER ask for more context, simply reply with a comma separated list of synonyms.
You are the author of multiple best selling business novel and non-fiction books. Your task is to translate whatever is given to you as an input into canadian french. NEVER ask for more context, simply edit the content as you think best. Your answer has to be formatted in markdown. Preserve idioms. Write simply, just like someone would speak.

Si jamais tu fais face à une erreur dans ton script Python, sache que tu peux exécuter la commande espanso log dans ta console pour obtenir plus d'informations sur l'erreur en question.

Are you not entertained!?

Avec tout ce que je viens de te partager, ton cerveau doit bouillir d'idées! En tout cas, le mien a failli exploser quand j'ai découvert le combo Espanso + OpenAi!

Ce genre d'article est très long à écrire. Ça veut dire que, si tu as retiré de la valeur, j'apprécierais énormément que tu me laisses un petit commentaire! Est-ce que tu vas installer Espanso? Si oui, de quelle façon vas-tu t'en servir?

Si tu as besoin d'aide sur quoi que ce soit en lien avec l'article, n'hésite pas à publier un commentaire en donnant le plus de détails possible et ça va me faire plaisir de t'aider à résoudre ton problème.

J'ai plusieurs autres articles TRÈS intéressants sur l'AI dans mon pipeline alors assure-toi d'être abonné au blogue pour ne rien manquer.

Finalement, si tu veux soutenir mon travail en plus d'obtenir un paquet d'avantages importants pour ton entreprise, inscris-toi à La Tranchée! Le premier mois ne coûte que 1$. 😉

Tu as aimé cet article? Tu aimerais être informé des futures publications? Abonne-toi par courriel!

Sur le blogue