Abbiamo recentemente pubblicato Meta-Prompt, un singolo file di testo che delinea tutte le nostre specifiche API. Puoi considerarlo come documentazione per i LLM e utilizzarlo per generare automaticamente integrazioni delle nostre API inclusi Reader, Embeddings, Reranker e altro.
È semplice come copiare e incollare il nostro prompt in ChatGPT/Claude, o inserirlo nel comando llm
come prompt di sistema, per poi aggiungere il tuo prompt per specificare cosa vuoi costruire (come facciamo qui sotto). È ottimo se vuoi usare i LLM per costruire rapidamente applicazioni che estraggono dati dal web, lavorano con embeddings o persino sistemi RAG completi. Tutto questo con allucinazioni minime.
tagPerché Dovrei Aver Bisogno di un Meta-Prompt?
Supponiamo che tu voglia usare un LLM per generare codice che utilizza le API di Jina. Chiediamo a GPT-4 di farlo:
Sembra buono, vero? Ha il from jina import Client
e tutto.
Un piccolo problema: Il pacchetto Jina è in modalità di manutenzione e non è il modo per accedere alle nostre API. Anche se installi il pacchetto Jina, il programma generato si bloccherà quando provi a eseguirlo:
E allora? Possiamo semplicemente chiedere a GPT di cercare le API di Jina sul web, giusto? Ecco cosa otteniamo:
Tuttavia, se si guarda il codice, questo non utilizza tutte le API Jina pertinenti. Non ha chiaramente scoperto che Reader è una cosa, invece ci fa installare BeautifulSoup per fare lo scraping. E, anche quando potrebbe (presumibilmente) fare lo scraping con BeautifulSoup, non analizza accuratamente il formato di risposta per Jina Embeddings, portando a un crash:
Tuttavia, anche se ChatGPT potesse farlo correttamente attraverso la ricerca, molti altri LLM (come Claude) attualmente non supportano la ricerca web, limitando severamente le tue opzioni.
È qui che Meta-Prompt brilla. Con Meta-Prompt, puoi caricare tutto il contesto e le specifiche delle API di Jina nell'LLM. Questo significa che l'LLM può generare codice che sfrutta direttamente le API di Jina, senza allucinazioni o soluzioni alternative non necessarie, fornendoti codice che funziona al primo colpo.
tagEsperimenti con Meta-Prompt
Per mettere alla prova Meta-Prompt, abbiamo condotto alcuni esperimenti e valutato i risultati. Se non specificato diversamente, abbiamo utilizzato Claude-3.5-Sonnet come LLM.
Per tutti gli esperimenti, abbiamo specificato le chiavi API rilevanti (come JINA_API_KEY
e ANTHROPIC_API_KEY
) come variabili d'ambiente prima di eseguire il codice generato.
tagEsperimento 1: Verifica delle Affermazioni Usando Meta-Prompt in ChatGPT
Stiamo scrivendo questo subito dopo le elezioni USA, dove la disinformazione circolava più che mai. Come possiamo separare il segnale dal rumore nei nostri feed e ottenere solo le cose buone senza le menzogne?
Supponiamo di voler verificare se una nuova legge del Regno Unito viene riportata accuratamente su BBC.com, in particolare l'affermazione:
"Il governo del Regno Unito ha annunciato una nuova legge che richiederà alle società di social media di verificare l'età dei loro utenti."
Possiamo copiare e incollare il Meta-Prompt in ChatGPT, poi digitare il nostro prompt per generare il codice necessario, tipo:
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."
Possiamo quindi eseguirlo con
node grounding.js
(dopo aver installato i pacchetti prerequisiti come axios). Otteniamo un output come questo, che mostra che l'affermazione è vera, insieme alle fonti:tagEsperimento 2: Visualizzare Hacker News dalla CLI
Se sei più un guerriero della riga di comando, puoi usare Meta-Prompt dalla CLI tramite cURL. Prima, dovrai installare il pacchetto Python llm
:
pip install llm
E poi il plugin Claude-3:
llm install llm-claude-3
Per l'ultima fase della configurazione, specifica la tua chiave API Anthropic:
export ANTHROPIC_API_KEY=<your key>
Ora, scriviamo un prompt per visualizzare ogni frase dalla prima pagina di Hacker News:
grab every sentence from hackernews frontpage and
visualize them in a 2d umap using matplotlib
Possiamo incanalare questo nel comando llm
con:
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
Se estraiamo ed eseguiamo il codice generato, otteniamo qualcosa del genere:
requirements.txt
. In questo caso abbiamo avuto bisogno di UMAP e Matplotlib, anche se le tue esigenze potrebbero variare.tagEsperimento 3: Costruire un Sistema RAG Semplice con Archiviazione JSON
Per spingere le cose ancora più in là, creiamo un semplice sistema RAG. Nel mio tempo libero sto imparando SolidPython quindi useremo il repository e il wiki come base di conoscenza. Per mantenere le cose semplici, non useremo un database, ma memorizzeremo i dati in un file JSON.
Ecco il prompt, salvato nel file 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 ---
Come puoi vedere, possiamo fornire all'LLM strumenti aggiuntivi specificandoli nel prompt. Senza questo, Claude spesso allucina un modo meno ottimale (o addirittura non funzionante) per aggiungere l'LLM al sistema RAG.
Dato che questo è un prompt molto lungo (con molta punteggiatura che potrebbe interrompere qualsiasi pipe in cui lo eseguiamo), useremo il testo $(cat prompt.txt)
invece del prompt stesso quando eseguiremo il nostro comando:
curl docs.jina.ai/v4 | llm -s "$(cat prompt.txt)" -m claude-3.5-sonnet
Uff! È un sacco di output. Ma (come nell'esempio di Hacker News) è fastidioso estrarre ed eseguire il codice da quel grande blocco di testo. Ovviamente, non c'è problema che non possa essere risolto semplicemente aggiungendo più LLM, giusto? Quindi aggiungiamo un altro prompt per "de-blobbificare" l'output originale:
leave just the code in this file, remove all surrounding explanatory text.
do not wrap code in backticks, just return "pure code"
Ora lo aggiungiamo alla nostra pipeline di comandi e lo eseguiamo:
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
alla fine del nostro comando per dirigere tutto l'output in un file, non c'è nulla da mostrare in un video.Possiamo quindi eseguire quell'app con python app.py
e otteniamo il nostro programma RAG. Come puoi vedere, può rispondere alle domande e mantenere una memoria di lavoro:
tagEsperimento 4: Costruire una Factory di App con Meta-Prompt
Ora che possiamo generare script e app in modo non interattivo, possiamo facilmente automatizzare una "factory di app" - uno script che itera sui prompt e produce script Python come output. Puoi trovare lo script della factory di app in un gist GitHub per ora:

In breve, ecco cosa fa:
- Itera attraverso la directory
prompts
che contiene (come avrai intuito) file di prompt. - Passa il Meta-Prompt e ogni testo di prompt a Claude-3.5-Sonnet (tramite
llm
). - Prende l'output e lo passa di nuovo a Claude, questa volta con il prompt che gli dice di lasciare solo il codice.
- Scrive il risultato in un file nella directory
apps
.
Mostreremmo una demo, ma non c'è molto da vedere. Si limita a registrare su quale nome di file prompt sta lavorando e per il resto opera silenziosamente senza output interessanti sullo schermo.
Per portare la fabbrica di app al livello successivo, potresti andare in pieno stile Factorio e scrivere un altro script per generare idee per app e da lì generare prompt da inserire nella fabbrica. Non l'abbiamo ancora fatto, ma lo lasciamo come esercizio a te, lettore.
tagGiocare con Meta-Prompt: Cosa Abbiamo Scoperto?
Abbiamo imparato molto utilizzando Meta-Prompt, sia su cosa inserire nei nostri prompt sia su come diversi LLM generano output differenti.
tagOsservazioni Generali
- Specializzazione API: L'utilizzo di API specifiche per determinate attività (ad esempio, Google Books per query relative ai libri) garantisce risultati più consistenti rispetto alle API di ricerca generiche, riducendo l'utilizzo di token e migliorando l'affidabilità.
- Prompt Personalizzati per il Riutilizzo: Per configurazioni non interattive, salvare i prompt come file
.txt
e inviarli tramite CLI permette di ottenere output di solo codice efficienti senza testo esplicativo superfluo. - Output Strutturato: Memorizzare gli output (solitamente in formato JSON) e ricaricarli secondo necessità risparmia token e semplifica attività come la generazione di embedding, dove l'utilizzo dei token può essere costoso.
tagApprofondimenti sull'Uso di Diversi LLM
GPT
- Problemi di Mantenimento del Prompt: GPT-4o a volte perde dettagli con istruzioni lunghe, portando a problemi quando "dimentica" elementi chiave durante la discussione. Questo porta a molta frustrazione quando devi ricordargli cose semplici.
- Sfide nell'Integrazione API: In casi come l'integrazione di Milvus Lite con jina-embeddings-v3, anche quando forniamo le istruzioni API di Milvus Lite, GPT-4o fallisce completamente e ripetutamente, generando codice che crea database privi degli embedding appena generati, rendendo impossibili le applicazioni di ricerca semantica.
Claude
- Limitazioni nell'Output del Codice: Claude-3.5 spesso produce script che sembrano completi ma contengono problemi silenziosi, come la mancanza di gestione degli errori o il mancato controllo delle chiavi API mancanti. Inoltre, a volte ricade su esempi predefiniti anziché generare risposte su misura per istruzioni specifiche.
- Output Silenzioso: Con il codice generato da LLM è davvero utile avere un log di ciò che sta accadendo dietro le quinte quando esegui il programma, solo per assicurarti che il modello non abbia fatto pasticci. A meno che non lo specifichi direttamente, le app create con Claude spesso vengono eseguite silenziosamente, lasciandoti senza indizi su cosa stia accadendo.
- Interazione con CLI: Devi specificare chiaramente che i comandi CLI sono comandi CLI. Se dici a Claude che può usare il comando
llm
, spesso proverà a chiamare una funzione Pythonllm()
che non esiste. - Claude 3.5-Sonnet è la Strada da Seguire: Anche Claude-3.5-Haiku sembrava funzionare bene nei test iniziali, ma Opus e Sonnet-3 si limitano a riassumere le istruzioni API di Jina, senza tenere conto del prompt dell'utente.
tagConclusione
L'utilizzo di Meta-Prompt fornisce nuovi modi per integrare le API di Jina con gli LLM, permettendoti di eseguire esperimenti e costruire app che funzionano al primo tentativo. Niente più crash, connessioni API mancate o funzioni allucinatorie — Meta-Prompt assicura che il codice generato sia accurato e funzionale fin dall'inizio. Che tu stia verificando affermazioni, generando embedding, costruendo un sistema RAG leggero o automatizzando la creazione di app, Meta-Prompt trasforma le istruzioni in linguaggio naturale in codice utilizzabile e corretto, evitando il tipico botta e risposta con un LLM per ottenere cose che funzionano effettivamente.
Che tu stia copiando Meta-Prompt in ChatGPT o utilizzandolo con un comando LLM personalizzato, offre un modo semplice e affidabile per sfruttare le capacità di Jina. I nostri esperimenti e intuizioni mostrano Meta-Prompt come uno strumento solido per l'integrazione robusta nei tuoi progetti.
Se sei pronto a esplorare cosa può fare Meta-Prompt, visita docs.jina.ai per la documentazione e le risorse più recenti.