Nous avons récemment publié Meta-Prompt, un fichier texte unique qui décrit toutes nos spécifications d'API. Vous pouvez le considérer comme de la documentation pour les LLM, et l'utiliser pour générer automatiquement des intégrations de nos API, notamment Reader, Embeddings, Reranker, et plus encore.
C'est aussi simple que de copier et coller notre prompt dans ChatGPT/Claude, ou de le transmettre à la commande llm
comme prompt système, puis d'ajouter votre propre prompt pour spécifier ce que vous voulez construire (ce que nous faisons ci-dessous). C'est parfait si vous voulez utiliser les LLM pour construire rapidement des applications qui extraient des données du web, travaillent avec des embeddings, ou même des systèmes RAG complets. Tout cela avec des hallucinations minimales.
tagPourquoi aurais-je même besoin d'un Meta-Prompt ?
Imaginons que vous vouliez utiliser un LLM pour générer du code qui utilise les API de Jina. Demandons à GPT-4 de faire exactement cela :
Ça a l'air bien, non ? Il y a le from jina import Client
et tout.
Un petit problème : Le package Jina est en mode maintenance, et ce n'est pas la façon d'accéder à nos API. Même si vous installez effectivement le package Jina, le programme généré plantera lorsque vous essaierez de l'exécuter :
Alors quoi ? On peut simplement demander à GPT de rechercher les APIs de Jina sur le web, n'est-ce pas ? Voici ce que nous obtenons :
Cependant, si vous regardez le code, il n'utilise pas toutes les APIs Jina pertinentes. Il n'a manifestement pas découvert que Reader existe, nous obligeant plutôt à installer BeautifulSoup pour faire le scraping. Et même lorsqu'il pouvait (soi-disant) faire le scraping avec BeautifulSoup, il n'a pas correctement analysé le format de réponse pour Jina Embeddings, ce qui a conduit à un crash :
Pourtant, même si ChatGPT pouvait le faire correctement en effectuant des recherches, de nombreux autres LLM (comme Claude) ne prennent actuellement pas en charge la recherche web, ce qui limite sérieusement vos options.
C'est là que Meta-Prompt excelle. Avec Meta-Prompt, vous pouvez charger tout le contexte et les spécifications des API de Jina dans le LLM. Cela signifie que le LLM peut générer du code qui exploite directement les API de Jina, sans hallucinations ni contournements inutiles, vous donnant du code qui fonctionne du premier coup.
tagExpériences avec Meta-Prompt
Pour mettre Meta-Prompt à l'épreuve, nous avons réalisé quelques expériences et évalué les résultats. Sauf indication contraire, nous avons utilisé Claude-3.5-Sonnet comme LLM.
Pour toutes les expériences, nous avons spécifié les clés API pertinentes (comme JINA_API_KEY
et ANTHROPIC_API_KEY
) comme variables d'environnement avant d'exécuter le code généré.
tagExpérience 1 : Vérification des déclarations avec Meta-Prompt dans ChatGPT
Nous écrivons ceci juste après les élections américaines, où la désinformation était plus présente que jamais. Comment pouvons-nous séparer le signal du bruit dans nos flux et obtenir uniquement les bonnes informations sans les mensonges ?
Disons que nous voulons vérifier si une nouvelle loi britannique est rapportée avec exactitude sur BBC.com, en particulier l'affirmation :
« Le gouvernement britannique a annoncé une nouvelle loi qui obligera les entreprises de médias sociaux à vérifier l'âge de leurs utilisateurs. »
Nous pouvons copier-coller le Meta-Prompt dans ChatGPT, puis taper notre propre prompt pour générer le code nécessaire, comme :
Write the JavaScript code to check the validity
of the following statement on bbc.com:
"The UK government has announced a new law
that will require social media companies to
verify the age of their users."
Nous pouvons ensuite exécuter cela avecnode grounding.js
(après avoir installé les paquets prérequis comme axios). Nous obtenons une sortie comme celle-ci, montrant que l'affirmation est vraie, avec les sources :
tagExpérience 2 : Visualiser Hacker News depuis le CLI
Si vous êtes plutôt du genre à utiliser la ligne de commande, vous pouvez utiliser Meta-Prompt depuis le CLI via cURL. D'abord, vous devrez installer le paquet Python llm
:
pip install llm
Puis le plugin Claude-3 :
llm install llm-claude-3
Pour la dernière étape de configuration, spécifiez votre clé API Anthropic :
export ANTHROPIC_API_KEY=<votre clé>
Maintenant, écrivons un prompt pour visualiser chaque phrase de la page d'accueil de Hacker News :
grab every sentence from hackernews frontpage and
visualize them in a 2d umap using matplotlib
Nous pouvons rediriger cela vers la commande llm
avec :
curl docs.jina.ai | llm -s "grab every sentence from hackernews frontpage and visualize them in a 2d umap using matplotlib" -m claude-3.5-sonnet
Si nous extrayons et exécutons le code généré, nous obtenons quelque chose comme ceci :
requirements.txt
n'est généré. Dans ce cas, nous avions besoin de UMAP et Matplotlib, mais cela peut varier selon vos besoins.tagExpérience 3 : Construction d'un système RAG simple avec stockage JSON
Pour pousser les choses encore plus loin, créons un système RAG simple. Dans mon temps libre, j'apprends SolidPython, nous utiliserons donc le dépôt et le wiki comme base de connaissances. Pour garder les choses simples, nous n'utiliserons pas de base de données, mais nous stockerons plutôt les données dans un fichier JSON.
Voici le prompt, stocké dans le fichier prompt.txt
:
Create a simple RAG system using pages from these sources:
- repo: <https://github.com/jeff-dh/SolidPython>
- wiki: <https://github.com/jeff-dh/SolidPython/wiki> (and all the subpages)
Scrape no other pages.
Instead of using vector database, use JSON file
You can access an LLM with the CLI command: llm 'your prompt' -m claude-3.5-sonnet
After segmenting and indexing all the pages, present a prompt for the user to ask a
question. To answer the question, find the top three segments and pass them to the LLM
with the prompt:
--- prompt start ---
Based on these segments:
- {segment 1}
- {segment 2}
- {segment 3}
Answer the question: {question}
--- prompt end ---
Comme vous pouvez le voir, nous pouvons donner au LLM des outils supplémentaires en les spécifiant dans le prompt. Sans cela, Claude hallucine souvent une façon moins optimale (ou même défectueuse) d'ajouter le LLM au système RAG.
Puisqu'il s'agit d'un très long prompt (avec beaucoup de ponctuation qui pourrait casser n'importe quel pipe que nous utilisons), nous utiliserons le texte $(cat prompt.txt)
plutôt que le prompt lui-même lorsque nous exécuterons notre commande :
curl docs.jina.ai/v4 | llm -s "$(cat prompt.txt)" -m claude-3.5-sonnet
Ouf ! Cela fait beaucoup de sortie. Mais (comme avec l'exemple de Hacker News), c'est pénible d'extraire et d'exécuter le code à partir de ce gros bloc de texte. Bien sûr, il n'y a pas de problème qui ne puisse être résolu en ajoutant simplement plus de LLM, n'est-ce pas ? Alors ajoutons une autre invite pour "dé-bloquer" la sortie originale :
leave just the code in this file, remove all surrounding explanatory text.
do not wrap code in backticks, just return "pure code"
Maintenant, nous ajoutons cela à notre pipeline de commandes et l'exécutons :
curl docs.jina.ai/v4 | llm -s "$(cat prompt.txt)" -m claude-3.5-sonnet | llm -s 'leave just the code in this file, remove all surrounding explanatory text. do not wrap code in backticks, just return "pure code"' -m claude-3.5-sonnet > app.py
> app.py
à la fin de notre commande pour diriger toute la sortie dans un fichier, il n'y a rien à montrer dans une vidéo.Nous pouvons ensuite exécuter cette application avec python app.py
et nous obtenons notre programme RAG. Comme vous pouvez le voir, il peut répondre aux questions et maintenir une mémoire de travail :
tagExpérience 4 : Construire une usine d'applications avec Meta-Prompt
Maintenant que nous pouvons générer des scripts et des applications de manière non interactive, nous pouvons facilement automatiser une "usine d'applications" - un script qui itère sur les invites et produit des scripts Python en sortie. Vous pouvez obtenir le script de l'usine d'applications dans un gist GitHub pour l'instant :

En bref, voici ce qu'il fait :
- Parcourir le répertoire
prompts
qui contient (vous l'avez deviné) des fichiers d'invite. - Transmettre le Meta-Prompt et chaque texte d'invite à Claude-3.5-Sonnet (via
llm
). - Prendre la sortie et la repasser à Claude, cette fois avec l'invite lui demandant de ne garder que le code.
- Écrire cela dans un fichier dans le répertoire
apps
.
Nous montrerions une démo, mais il n'y a pas grand-chose à voir. Il enregistre simplement le nom du fichier d'invite sur lequel il travaille, et fonctionne silencieusement sans sortie intéressante à l'écran.
Pour faire passer l'usine d'applications au niveau supérieur, vous pourriez adopter l'approche complète Factorio et écrire un autre script pour générer des idées d'applications et, à partir de là, générer des prompts à envoyer à l'usine. Nous ne l'avons pas encore fait, mais nous vous laissons cet exercice, à vous, le lecteur.
tagJouer avec Meta-Prompt : Qu'avons-nous découvert ?
Nous avons beaucoup appris en utilisant Meta-Prompt, à la fois sur ce qu'il faut mettre dans nos propres prompts et sur la façon dont différents LLMs génèrent différentes sorties.
tagObservations générales
- Spécialisation API : L'utilisation d'APIs spécifiques à certaines tâches (par exemple, Google Books pour les requêtes liées aux livres) assure des résultats plus cohérents que les APIs de recherche généralistes, ce qui peut réduire l'utilisation des tokens et améliorer la fiabilité.
- Prompts personnalisés pour la réutilisation : Pour les configurations non interactives, sauvegarder les prompts dans des fichiers
.txt
et les rediriger vers le CLI permet d'obtenir efficacement des sorties de code uniquement, sans texte explicatif superflu. - Sortie structurée : Stocker les sorties (généralement au format JSON) et les recharger selon les besoins permet d'économiser des tokens et de rationaliser les tâches comme la génération d'embeddings, où l'utilisation des tokens peut être coûteuse.
tagObservations sur l'utilisation de différents LLMs
GPT
- Problèmes de rétention des prompts : GPT-4 oublie parfois des détails avec des instructions longues, ce qui conduit à des problèmes lorsqu'il "oublie" des éléments clés en cours de discussion. Cela conduit à beaucoup de frustration quand vous devez lui rappeler des choses simples.
- Défis d'intégration API : Dans des cas comme l'intégration de Milvus Lite avec jina-embeddings-v3, même lorsque nous fournissons les instructions de l'API Milvus Lite, GPT-4 échoue complètement et de manière répétée, générant du code qui crée des bases de données dépourvues des embeddings que le code vient de générer, rendant impossibles les applications de recherche sémantique.
Claude
- Limitations des sorties de code : Claude-3.5 produit souvent des scripts qui semblent complets mais contiennent des problèmes silencieux, comme l'absence de gestion des erreurs ou l'oubli de la prise en compte des clés API manquantes. De plus, il se rabat parfois sur des exemples préétablis plutôt que de générer des réponses adaptées aux instructions spécifiques.
- Sortie silencieuse : Avec le code généré par LLM, il est vraiment utile d'avoir une trace de ce qui se passe en coulisses lors de l'exécution du programme, juste pour s'assurer que le modèle n'a pas fait d'erreurs. À moins de le spécifier directement, les applications créées avec Claude s'exécutent souvent silencieusement, vous laissant sans indice sur ce qui se passe.
- Interaction avec le CLI : Vous devez clairement spécifier que les commandes CLI sont des commandes CLI. Si vous dites à Claude qu'il peut utiliser la commande
llm
, souvent il essaiera d'appeler une fonction Pythonllm()
qui n'existe pas. - Claude 3.5-Sonnet est la meilleure option : Claude-3.5-Haiku semblait également bien fonctionner dans les tests initiaux, mais Opus et Sonnet-3 se contentent de résumer les instructions de l'API Jina, sans prendre en compte le prompt de l'utilisateur.
tagConclusion
L'utilisation de Meta-Prompt offre de nouvelles façons d'intégrer les APIs de Jina avec les LLMs, vous permettant d'exécuter des expériences et de construire des applications qui fonctionnent du premier coup. Plus de plantages, de connexions API manquées ou de fonctions hallucinées — Meta-Prompt garantit que le code généré est précis et fonctionnel dès le départ. Que vous vérifiiez des déclarations, génériez des embeddings, construisiez un système RAG léger ou automatisiez la création d'applications, Meta-Prompt transforme les instructions en langage naturel en code actionnable et correct, en évitant les allers-retours typiques avec un LLM pour obtenir des choses qui fonctionnent réellement.
Que vous copiiez Meta-Prompt dans ChatGPT ou que vous l'utilisiez avec une commande LLM personnalisée, il offre un moyen simple et fiable d'exploiter les capacités de Jina. Nos expériences et observations montrent que Meta-Prompt est un outil solide pour une intégration robuste dans vos projets.
Si vous êtes prêt à explorer ce que Meta-Prompt peut faire, rendez-vous sur docs.jina.ai pour la documentation et les ressources les plus récentes.