Jina AI ha rilasciato i suoi modelli di embedding bilingue open-source all'avanguardia per le coppie linguistiche tedesco-inglese e cinese-inglese tramite Hugging Face.


In questo tutorial, esamineremo un'installazione e un caso d'uso molto semplici che copriranno:
- Il download dei modelli Jina Embedding da Hugging Face.
- L'utilizzo dei modelli per ottenere codifiche da testi in tedesco e inglese.
- La creazione di un motore di ricerca neurale molto rudimentale basato su embedding per query multilingue.
Ti mostreremo come utilizzare Jina Embeddings per scrivere query in inglese che recuperano testi corrispondenti in tedesco e viceversa.
Questo tutorial funziona allo stesso modo per il modello cinese. Segui semplicemente le istruzioni nella sezione (verso la fine) intitolata Querying in Chinese per ottenere il modello bilingue cinese-inglese e un esempio di documento in cinese.


tagModelli di Embedding Bilingue
Un modello di embedding bilingue è un modello che mappa testi in due lingue — tedesco e inglese in questo tutorial, cinese e inglese per il modello cinese — nello stesso spazio di embedding. E lo fa in modo tale che se un testo tedesco e un testo inglese significano la stessa cosa, i loro vettori di embedding corrispondenti saranno vicini tra loro.
Modelli come questo sono molto adatti alle applicazioni di recupero di informazioni cross-linguistiche, come mostreremo in questo tutorial, ma possono anche servire come base per chatbot basati su RAG, categorizzazione di testo multilingue, riassunti, analisi del sentiment e qualsiasi altra applicazione che utilizzi embedding. Utilizzando modelli come questi, puoi trattare i testi in entrambe le lingue come se fossero scritti nella stessa lingua.
Sebbene molti modelli linguistici giganti dichiarino di supportare molte lingue diverse, non le supportano tutte allo stesso modo. Ci sono crescenti domande sul bias causato dalla dominanza dell'inglese su Internet e sulle fonti di input distorte dalla diffusa pubblicazione online di testi tradotti automaticamente. Concentrandoci su due lingue, possiamo controllare meglio la qualità dell'embedding per entrambe, minimizzando il bias producendo modelli molto più piccoli con prestazioni simili o superiori rispetto ai modelli giganti che pretendono di gestire decine di lingue.
I modelli bilingue Jina Embeddings v2 supportano 8.192 token di input contestuale, permettendo loro non solo di supportare due lingue, ma anche di gestire segmenti di testo relativamente grandi rispetto a modelli comparabili. Questo li rende ideali per casi d'uso più complessi in cui è necessario processare in embedding molta più informazione testuale.
tagSegui su Google Colab
Questo tutorial ha un notebook di accompagnamento che puoi eseguire su Google Colab, o localmente sul tuo sistema.

tagInstallazione dei Prerequisiti
Assicurati che l'ambiente attuale abbia le librerie necessarie installate. Avrai bisogno dell'ultima versione di transformers
, quindi anche se è già installata, esegui:
pip install -U transformers
Questo tutorial utilizzerà la libreria FAISS di Meta per la ricerca e il confronto di vettori. Per installarla, esegui:
pip install faiss-cpu
Useremo anche Beautiful Soup per elaborare i dati di input in questo tutorial, quindi assicurati che sia installato:
pip install bs4
tagAccesso a Hugging Face
Avrai bisogno di accesso a Hugging Face, in particolare di un account e un token di accesso per scaricare i modelli.
Se non hai un account su Hugging Face:
Vai su https://huggingface.co/ e dovresti vedere un pulsante "Sign Up" in alto a destra della pagina. Cliccalo e segui le istruzioni per creare un nuovo account.

Dopo aver effettuato l'accesso al tuo account:
Segui le istruzioni sul sito web di Hugging Face per ottenere un token di accesso.

Devi copiare questo token in una variabile d'ambiente chiamata HF_TOKEN
. Se stai lavorando in un notebook (su Google Colab, per esempio) o lo stai impostando internamente in un programma Python, usa il seguente codice Python:
import os
os.environ['HF_TOKEN'] = "<your token here>"
Nella shell, usa la sintassi fornita per impostare una variabile d'ambiente. In bash
:
export HF_TOKEN="<your token here>"
tagScarica Jina Embeddings v2 per tedesco e inglese
Una volta impostato il token, puoi scaricare il modello bilingue tedesco-inglese Jina Embeddings usando la libreria transformers
:
from transformers import AutoModel
model = AutoModel.from_pretrained('jinaai/jina-embeddings-v2-base-de', trust_remote_code=True)
Questo potrebbe richiedere diversi minuti la prima volta che lo fai, ma il modello verrà memorizzato localmente dopo, quindi non preoccuparti se riavvii questo tutorial più tardi.
tagScarica i dati in lingua inglese
Per questo tutorial, prenderemo la versione in lingua inglese del libro Pro Git: Everything You Need to Know About Git. Questo libro è disponibile anche in cinese e tedesco, che useremo più avanti in questo tutorial.
Per scaricare la versione EPUB, esegui il seguente comando:
wget -O progit-en.epub https://open.umn.edu/opentextbooks/formats/3437
Questo copia il libro in un file chiamato progit-en.epub
nella directory locale.

In alternativa, puoi semplicemente visitare il link https://open.umn.edu/opentextbooks/formats/3437 per scaricarlo sul tuo disco locale. È disponibile sotto la licenza Creative Commons Attribution Non Commercial Share Alike 3.0.
tagElaborazione dei dati
Questo testo particolare ha una struttura interna di sezioni gerarchiche, che possiamo facilmente trovare cercando il tag <section>
nei dati XHTML sottostanti. Il codice seguente legge il file EPUB e lo divide usando la struttura interna di un file EPUB e il tag <section>
, poi converte ogni sezione in testo semplice senza tag XHTML. Crea un dizionario Python le cui chiavi sono un insieme di stringhe che indicano la posizione di ogni sezione nel libro, e i cui valori sono i contenuti in testo semplice di quella sezione.
from zipfile import ZipFile
from bs4 import BeautifulSoup
import copy
def decompose_epub(file_name):
def to_top_text(section):
selected = copy.copy(section)
while next_section := selected.find("section"):
next_section.decompose()
return selected.get_text().strip()
ret = {}
with ZipFile(file_name, 'r') as zip:
for name in zip.namelist():
if name.endswith(".xhtml"):
data = zip.read(name)
doc = BeautifulSoup(data.decode('utf-8'), 'html.parser')
ret[name + ":top"] = to_top_text(doc)
for num, sect in enumerate(doc.find_all("section")):
ret[name + f"::{num}"] = to_top_text(sect)
return ret
Quindi, esegui la funzione decompose_epub
sul file EPUB che hai scaricato prima:
book_data = decompose_epub("progit-en.epub")
La variabile book_data
avrà ora 583 sezioni. Per esempio:
print(book_data['EPUB/ch01-getting-started.xhtml::12'])
Risultato:
The Command Line
There are a lot of different ways to use Git.
There are the original command-line tools, and there are many graphical user interfaces of varying capabilities.
For this book, we will be using Git on the command line.
For one, the command line is the only place you can run all Git commands — most of the GUIs implement only a partial subset of Git functionality for simplicity.
If you know how to run the command-line version, you can probably also figure out how to run the GUI version, while the opposite is not necessarily true.
Also, while your choice of graphical client is a matter of personal taste, all users will have the command-line tools installed and available.
So we will expect you to know how to open Terminal in macOS or Command Prompt or PowerShell in Windows.
If you don't know what we're talking about here, you may need to stop and research that quickly so that you can follow the rest of the examples and descriptions in this book.
tagGenerazione e indicizzazione degli embedding con Jina Embeddings v2 e FAISS
Per ciascuna delle 583 sezioni, genereremo un embedding e lo memorizzeremo in un indice FAISS. I modelli Jina Embeddings v2 accettano input fino a 8192 token, abbastanza grandi che per un libro come questo, non abbiamo bisogno di fare ulteriore segmentazione del testo o controllare se qualche sezione ha troppi token. La sezione più lunga del libro ha circa 12.000 caratteri, che, per l'inglese normale, dovrebbe essere ben al di sotto del limite di 8k token.
Per generare un singolo embedding, usi il metodo encode
del modello che abbiamo scaricato. Per esempio:
model.encode([book_data['EPUB/ch01-getting-started.xhtml::12']])
Questo restituisce un array contenente un singolo vettore a 768 dimensioni:
array([[ 6.11135997e-02, 1.67829826e-01, -1.94809273e-01,
4.45595086e-02, 3.28837298e-02, -1.33441269e-01,
1.35364473e-01, -1.23119736e-02, 7.51526654e-02,
-4.25386652e-02, -6.91794455e-02, 1.03527725e-01,
-2.90831417e-01, -6.21018047e-03, -2.16205455e-02,
-2.20803712e-02, 1.50471330e-01, -3.31433356e-01,
-1.48741454e-01, -2.10959971e-01, 8.80039856e-02,
....
Questo è un embedding.
I modelli Jina Embeddings sono configurati per consentire l'elaborazione in batch. La dimensione ottimale del batch dipende dall'hardware che usi durante l'esecuzione. Una dimensione del batch troppo grande rischia di esaurire la memoria. Una dimensione del batch piccola impiegherà più tempo per l'elaborazione.
batch_size=5
ha funzionato su Google Colab nel livello gratuito senza GPU, e ha impiegato circa un'ora per generare l'intero set di embedding.In produzione, raccomandiamo di utilizzare hardware molto più potente o di utilizzare il servizio API Embedding di Jina AI. Segui il link qui sotto per scoprire come funziona e come iniziare con l'accesso gratuito.

Il codice seguente genera gli embedding e li memorizza in un indice FAISS. Imposta la variabile batch_size
in base alle tue risorse.
import faiss
batch_size = 5
vector_data = []
faiss_index = faiss.IndexFlatIP(768)
data = [(key, txt) for key, txt in book_data.items()]
batches = [data[i:i + batch_size] for i in range(0, len(data), batch_size)]
for ind, batch in enumerate(batches):
print(f"Processing batch {ind + 1} of {len(batches)}")
batch_embeddings = model.encode([x[1] for x in batch], normalize_embeddings=True)
vector_data.extend(batch)
faiss_index.add(batch_embeddings)
Quando si lavora in un ambiente di produzione, un dizionario Python non è un modo adeguato o performante per gestire documenti ed embedding. Dovresti utilizzare un database vettoriale dedicato, che avrà le proprie istruzioni per l'inserimento dei dati.
tagQuery in tedesco per risultati in inglese
Quando facciamo una query su questo set di testi, ecco cosa succederà:
- Il modello Jina Embeddings tedesco-inglese creerà un embedding per la query.
- Useremo l'indice FAISS (
faiss_index
) per ottenere l'embedding memorizzato con il coseno più alto rispetto all'embedding della query e restituire la sua posizione nell'indice. - Cercheremo il testo corrispondente nell'array dei dati vettoriali (
vector_data
) e stamperemo il coseno, la posizione del testo e il testo stesso.
Questo è ciò che fa la funzione query
qui sotto.
def query(query_str):
query = model.encode([query_str], normalize_embeddings=True)
cosine, index = faiss_index.search(query, 1)
print(f"Cosine: {cosine[0][0]}")
loc, txt = vector_data[index[0][0]]
print(f"Location: {loc}\\nText:\\n\\n{txt}")
Ora proviamolo.
# Translation: "How do I roll back to a previous version?"
query("Wie kann ich auf eine frühere Version zurücksetzen?")
Risultato:
Cosine: 0.5202275514602661
Location: EPUB/ch02-git-basics-chapter.xhtml::20
Text:
Undoing things with git restore
Git version 2.23.0 introduced a new command: git restore.
It's basically an alternative to git reset which we just covered.
From Git version 2.23.0 onwards, Git will use git restore instead of git reset for many undo operations.
Let's retrace our steps, and undo things with git restore instead of git reset.
Questa è una scelta abbastanza buona per rispondere alla domanda. Proviamone un'altra:
# Translation: "What does 'version control' mean?"
query("Was bedeutet 'Versionsverwaltung'?")
Risultato:
Cosine: 0.5001817941665649
Location: EPUB/ch01-getting-started.xhtml::1
Text:
About Version Control
What is "version control", and why should you care?
Version control is a system that records changes to a file or set of files over time so that you can recall specific versions later.
For the examples in this book, you will use software source code as the files being version controlled, though in reality you can do this with nearly any type of file on a computer.
If you are a graphic or web designer and want to keep every version of an image or layout (which you would most certainly want to), a Version Control System (VCS) is a very wise thing to use.
It allows you to revert selected files back to a previous state, revert the entire project back to a previous state, compare changes over time, see who last modified something that might be causing a problem, who introduced an issue and when, and more.
Using a VCS also generally means that if you screw things up or lose files, you can easily recover.
In addition, you get all this for very little overhead.
Prova con le tue domande in tedesco per vedere quanto funziona bene. Come pratica generale, quando si ha a che fare con il recupero di informazioni testuali, è consigliabile chiedere da tre a cinque risposte invece di una sola. La risposta migliore spesso non è la prima.
tagInvertire i Ruoli: Interrogare documenti tedeschi in inglese
Il libro Pro Git: Everything You Need to Know About Git è disponibile anche in tedesco. Possiamo utilizzare lo stesso modello per fare questa dimostrazione con le lingue invertite.
Scaricare l'ebook:
wget -O progit-de.epub https://open.umn.edu/opentextbooks/formats/3454
Questo copia il libro in un file chiamato progit-de.epub
. Lo elaboriamo poi allo stesso modo del libro in inglese:
book_data = decompose_epub("progit-de.epub")
E poi generiamo gli embedding allo stesso modo di prima:
batch_size = 5
vector_data = []
faiss_index = faiss.IndexFlatIP(768)
data = [(key, txt) for key, txt in book_data.items()]
batches = [data[i:i + batch_size] for i in range(0, len(data), batch_size)]
for ind, batch in enumerate(batches):
print(f"Processing batch {ind + 1} of {len(batches)}")
batch_embeddings = model.encode([x[1] for x in batch], normalize_embeddings=True)
vector_data.extend(batch)
faiss_index.add(batch_embeddings)
Ora possiamo utilizzare la stessa funzione query
per cercare in inglese risposte in tedesco:
query("What is version control?")
Risultato:
Cosine: 0.6719034910202026
Location: EPUB/ch01-getting-started.xhtml::1
Text:
Was ist Versionsverwaltung?
Was ist „Versionsverwaltung", und warum sollten Sie sich dafür interessieren?
Versionsverwaltung ist ein System, welches die Änderungen an einer oder einer Reihe von Dateien über die Zeit hinweg protokolliert, sodass man später auf eine bestimmte Version zurückgreifen kann.
Die Dateien, die in den Beispielen in diesem Buch unter Versionsverwaltung gestellt werden, enthalten Quelltext von Software, tatsächlich kann in der Praxis nahezu jede Art von Datei per Versionsverwaltung nachverfolgt werden.
Als Grafik- oder Webdesigner möchte man zum Beispiel in der Lage sein, jede Version eines Bildes oder Layouts nachverfolgen zu können. Als solcher wäre es deshalb ratsam, ein Versionsverwaltungssystem (engl. Version Control System, VCS) einzusetzen.
Ein solches System erlaubt es, einzelne Dateien oder auch ein ganzes Projekt in einen früheren Zustand zurückzuversetzen, nachzuvollziehen, wer zuletzt welche Änderungen vorgenommen hat, die möglicherweise Probleme verursachen, herauszufinden wer eine Änderung ursprünglich vorgenommen hat und viele weitere Dinge.
Ein Versionsverwaltungssystem bietet allgemein die Möglichkeit, jederzeit zu einem vorherigen, funktionierenden Zustand zurückzukehren, auch wenn man einmal Mist gebaut oder aus irgendeinem Grund Dateien verloren hat.
All diese Vorteile erhält man für einen nur sehr geringen, zusätzlichen Aufwand.
Il titolo di questa sezione si traduce come "Che cos'è il controllo versione?", quindi questa è una buona risposta.
tagInterrogare in Cinese
Questi esempi funzioneranno esattamente allo stesso modo con Jina Embeddings v2 per cinese e inglese. Per utilizzare invece il modello cinese, basta eseguire quanto segue:
from transformers import AutoModel
model = AutoModel.from_pretrained('jinaai/jina-embeddings-v2-base-zh', trust_remote_code=True)
E per ottenere l'edizione cinese di Pro Git: Everything You Need to Know About Git:
wget -O progit-zh.epub https://open.umn.edu/opentextbooks/formats/3455
Quindi, elaborare il libro cinese:
book_data = decompose_epub("progit-zh.epub")
Tutto il resto del codice in questo tutorial funzionerà allo stesso modo.
tagIl Futuro: Più Lingue, inclusa la Programmazione
Rilasceremo altri modelli bilingue nell'immediato futuro, con spagnolo e giapponese già in lavorazione, così come un modello che supporta l'inglese e diversi linguaggi di programmazione importanti. Questi modelli sono idealmente adatti alle imprese internazionali che gestiscono informazioni multilingue, e possono servire come pietra angolare per il recupero di informazioni basato su AI e modelli linguistici generativi basati su RAG, inserendosi in una varietà di casi d'uso AI all'avanguardia.
I modelli di Jina AI sono compatti e si collocano tra i migliori della loro classe, dimostrando che non è necessario il modello più grande per ottenere le migliori prestazioni. Concentrandoci sulle prestazioni bilingue, produciamo modelli che sono sia migliori in quelle lingue, più facili da adattare e più convenienti rispetto ai grandi modelli addestrati su dati non curati.
Jina Embeddings sono disponibili su Hugging Face, nel marketplace AWS per l'uso in Sagemaker, e tramite l'API web Jina Embeddings. Sono completamente integrati in molti framework di processo AI e database vettoriali.
Visita il sito web Jina Embeddings per maggiori informazioni, o contattaci per discutere di come le soluzioni di Jina AI possono adattarsi ai tuoi processi aziendali.
