Ora che le raccolte sono finalmente popolate con i vettori, possiamo iniziare a interrogare il database. Esistono molti modi in cui possiamo inserire informazioni per interrogare il database, ma penso che ci siano 2 input molto utili che possiamo utilizzare:
- Un testo di input
- Un ID vettore di input
3.1 Interrogazione di vettori con un vettore di input
Diciamo che abbiamo creato questo database vettoriale da utilizzare in un motore di ricerca. In questo caso, ci aspettiamo che l’input dell’utente sia un testo di input e dobbiamo restituire gli elementi più rilevanti.
Poiché tutte le operazioni in un database vettoriale vengono eseguite con….VETTORI, dobbiamo prima trasformare il testo immesso dall’utente in un vettore in modo da poter trovare elementi simili in base a quell’input. Ricordiamo che abbiamo utilizzato Sentence Transformers per codificare i dati testuali negli incorporamenti, quindi possiamo utilizzare lo stesso codificatore per generare una rappresentazione numerica per il testo di input dell’utente.
Poiché l’NPR contiene articoli di notizie, supponiamo che l’utente abbia digitato “Donald Trump” per conoscere le elezioni americane:
query_text = "Donald Trump"
query_vector = encoder.encode(query_text).tolist()
print (query_vector)
# output: (-0.048, -0.120, 0.695, ...)
Una volta calcolato il vettore della query di input, possiamo cercare i vettori più vicini nella raccolta e definire quale tipo di output vogliamo da quei vettori, come il loro newsId, titolo, E temi:
from qdrant_client.models import Filter
from qdrant_client.http import modelsclient.search(
collection_name="news-articles",
query_vector=query_vector,
with_payload=("newsId", "title", "topics"),
query_filter=None
)
Nota: per impostazione predefinita, Qdrant utilizza i vicini più vicini approssimati per cercare rapidamente gli incorporamenti, ma puoi anche fare una scansione completa e portare esattamente i vicini più vicini – tieni presente che questa è un’operazione molto più costosa.
Dopo aver eseguito questa operazione, ecco i titoli di output generati (tradotti in inglese per una migliore comprensione):
- Frase di input: Donald Trump
- Uscita 1: I paraguaiani andranno alle urne questa domenica (30) per scegliere un nuovo presidente
- Uscita 2: Gli elettori sostengono che Biden e Trump non dovrebbero candidarsi nel 2024, secondo un sondaggio Reuters/Ipsos
- Uscita 3: La scrittrice accusa Trump di averla abusata sessualmente negli anni ’90
- Uscita 4: Mike Pence, ex vicepresidente di Donald Trump, rende una testimonianza in tribunale che potrebbe complicare l’ex presidente
Sembra che oltre a portare notizie relative allo stesso Trump, il modello di embedding sia riuscito a rappresentare anche temi legati alle elezioni presidenziali. Si noti che nel primo output non c’è alcun riferimento diretto al termine di input “Donald Trump” a parte le elezioni presidenziali.
Inoltre, ho omesso a query_filtro parametri. Questo è uno strumento molto utile se vuoi specificare che l’output deve soddisfare una determinata condizione. Ad esempio, in un portale di notizie, è spesso importante filtrare solo gli articoli più recenti (ad esempio dagli ultimi 7 giorni in poi). Pertanto, potresti eseguire una query per articoli di notizie che soddisfano un timestamp di pubblicazione minimo.
Nota: nel contesto delle raccomandazioni sulle notizie, ci sono molteplici aspetti preoccupanti da considerare come l’equità e la diversità. Questo è un argomento di discussione aperto ma, se sei interessato a quest’area, dai un’occhiata agli articoli del Workshop NORMalizzazione.
3.2 Interrogazione di vettori con un ID vettore di input
Infine, possiamo chiedere al database vettoriale di “raccomandare” elementi che sono più vicini ad alcuni ID di vettore desiderati ma lontani da ID di vettore indesiderati. Vengono richiamati gli ID desiderati e quelli indesiderati positivo E negativo esempi, rispettivamente, e sono pensati come semi per la raccomandazione.
Ad esempio, supponiamo di avere il seguente ID positivo:
seed_id = '8bc22460-532c-449b-ad71-28dd86790ca2'
# title (translated): 'Learn why Joe Biden launched his bid for re-election this Tuesday'
Possiamo quindi richiedere elementi simili a questo esempio:
client.recommend(
collection_name="news-articles",
positive=(seed_id),
negative=None,
with_payload=("newsId", "title", "topics")
)
Dopo aver eseguito questa operazione, ecco i titoli di output tradotti:
- Elemento di input: Scopri perché Joe Biden ha lanciato la sua candidatura per la rielezione questo martedì
- Uscita 1: Biden annuncia che si candiderà alla rielezione
- Uscita 2: USA: i 4 motivi che hanno portato Biden a candidarsi alla rielezione
- Uscita 3: Gli elettori sostengono che Biden e Trump non dovrebbero candidarsi nel 2024, secondo un sondaggio Reuters/Ipsos
- Uscita 4: La gaffe del consigliere di Biden che ha sollevato dubbi su un possibile secondo governo dopo le elezioni
Fonte: towardsdatascience.com