AI e Typesense
Come integrare la ricerca semantica in Drupal
1
About me
Drupal / PHP developer @ SparkFabrik
Drupal contributor (Search API Typesense, Iubenda
Integration, DDEV sqlsrv add-on)
Drupal.org: https://www.drupal.org/u/robertoperuzzo
LinkedIn: www.linkedin.com/in/robertoperuzzo
Slack (drupal.slack.com): robertoperuzzo
Mastodon: @robertoperuzzo@mastodon.social
@robertoperuzzo
3
Agenda
1. Ricerca Tradizionale vs. Ricerca Semantica
2. Introduzione a Retrieval-Augmented Generation (RAG)
3. Perché Typesense?
4. Il modulo Drupal Search API Typesense
Ricerca tradizionale
4
La ricerca tradizionale recupera rapidamente
corrispondenze esatte per parole chiave, concentrandosi su
efficienza e velocità per fornire risultati precisi facendo
corrispondere direttamente i termini nei dati.
Ricerca nel core di Drupal
5
No errori di battitura
6
No dialogo
7
Ricerca Semantica
8
La ricerca semantica utilizza l'AI per interpretare l'intento e il
contesto della query, fornendo risultati basati sul significato
piuttosto che sulle parole chiave esatte.
9
10
Caratteristiche Ricerca Tradizionale Ricerca Semantica
Dipendenza dalle parole
chiave
Richiede corrispondenze esatte Riconosce sinonimi e termini correlati
Comprensione del contesto Comprensione limitata Interpreta l'intento e il contesto dell'utente
Query in linguaggio naturale Difficoltà con query lunghe e
conversazionali
Elabora efficacemente frasi e domande
complesse
Gestione errori di battitura Fallisce con errori di ortografia o variazioni Permette tolleranza agli errori e correzione
ortografica
Corrispondenza
sinonimi/concetti
Limitata alle corrispondenze esatte Identifica termini e concetti correlati
Logica di ricerca Non si adatta senza aggiornamenti manuali Impara e si adatta al comportamento utente e
ai cambiamenti dei contenuti
Ricerca Tradizionale vs Ricerca Semantica
Alcune applicazioni pratiche
11
➔ Ricerca e raccomandazioni prodotti
➔ Ricerca documenti
➔ Chatbot per supporto clienti
➔ Personalizzazione dei risultati
RAG
12
Retrieval-Augmented Generation
RAG è il processo di ottimizzazione dell'output di un modello
linguistico di grandi dimensioni, in modo che faccia
riferimento a una base di conoscenza autorevole al di fuori
delle sue fonti di dati di addestramento prima di generare
una risposta.
13
Source: https://aws.amazon.com/it/what-is/retrieval-augmented-generation/
Vector Databases
14
➔ Memorizzano il significato semantico del testo
➔ Cattura astratta non solo di 3 dimensioni, ma
migliaia: es. emozione, sentimento, tono, dimensione,
ecc.
➔ Suddivisione in “chunks” per catturare significati
ancora più specifici
15
Source: https://www.cloudraft.io/blog/top-5-vector-databases
LM
Come funziona?
16
Source:
https://scriv.ai/guides/retrieval-augmented-generation-overview/
17
Cosa serve?
➔ Contenuti per la “Base di conoscenza”
➔ Vector database
➔ LLM
Typesense
18
Open Source Alternative to Algolia + Pinecone
19
“Il nostro obiettivo è ridurre il time-to-market per creare
un'esperienza eccezionale di ricerca istantanea che
fornisca risultati pertinenti fin da subito.”
Source: https://typesense.org/docs/overview/why-typesense.html
20
"Abbiamo anche fornito valori predefiniti sensati per ogni
parametro di configurazione, in modo che il motore
funzioni immediatamente per la maggior parte dei casi
d'uso. Questo è ciò che intendiamo con 'batterie incluse'."
Source: https://typesense.org/docs/overview/why-typesense.html
Source: https://typesense.org
21
22
C++
+20k stelle su Github
Self-hosted o SaaS
Semplice da impostare
➔ La versione corrente è v27.1
➔ Una nuova release ogni 2-3
mesi
Roadmap pubblica
https://github.com/orgs/typesense/projects/1/views/1
23
Esistono integrazioni per molte piattaforme
24
Source: https://typesense.org
Tristemente
manca
Drupal qui…
Search API Typesense
There’s a module for that™
https://www.drupal.org/project/search_api_typesense
25
Try Typesense on DDEV
26
https://github.com/kevinquillen/ddev-typesense
➔ La chiave API di amministrazione viene impostata
all'avvio del server Typesense
➔ Typesense è distribuito, qui puoi impostare tutti i
nodi disponibili
➔ Il nodo più vicino è quello per sfruttare Search
Delivery Network in Typesense Cloud
➔ La configurazione mostrata è quella per connettersi
a un server Typesense gestito da DDEV
27
Connettiti al server
28
Nuovi tabs per la
configurazione del Search API
server
29
Configurazione dei campi
➔ Search API Typesense definisce un set di
nuovi tipi di campo, è obbligatorio utilizzarli
quando si indicizzano i dati su Typesense
➔ I tipi di campo supportati da Typesense sono:
◆ string
◆ string[]
◆ int32
◆ int32[]
◆ int64
◆ int64[]
◆ float
◆ float[]
◆ bool
◆ bool[]
30
➔ Per ogni campo aggiunto alla Search API dobbiamo
configurare come verrà esposto a Typesense
➔ Una collection verrà creata nel server Typesense
solo al salvataggio dello schema
Configurazione dello schema
➔ Gli Embeds vengono generati utilizzando un LLM (sia
localmente che con un provider remoto, come
OpenAI)
➔ Gli Embeds vengono salvati in un campo float[]
denominato embedding
➔ Il contenuto dei campi embedding viene
concatenato insieme e poi suddiviso in blocchi detti
chunks
➔ È possibile configurare la dimensione dei chunks e la
sovrapposizione tra chunks consecutivi
Abilitare la ricerca Semantica
31
Ricerca Semantica
curl 'http://localhost:8108/multi_search' 
-H "X-TYPESENSE-API-KEY: ${TYPESENSE_API_KEY}" 
-X POST 
-d '{
"searches": [
{
"q": "device to type things on",
"query_by": "embedding",
"collection": "products",
"prefix": "false",
"exclude_fields": "embedding",
"per_page": 1
}
]
}'
32
➔ Typesense genererà l’embedding
per la chiave di ricerca e
utilizzerà la similarità del coseno
per trovare documenti simili
➔ Di solito vogliamo escludere il
campo di embedding dai risultati
perché è solo un enorme vettore
di numeri float
33
34
search_api_typesense module doesn’t have an
integration with Views…
…and probably never will.
35
Source: https://typesense.org/docs/overview/why-typesense.html
36
InstantSearch.js è una libreria UI open source per
Vanilla JS che consente di creare un'interfaccia di
ricerca nella tua app frontend
Source: https://www.algolia.com/doc/guides/building-search-ui/widgets/showcase/js/
➔ Il team di Typesense ha
sviluppato un adattatore per
rendere le chiamate API di
instantsearch compatibili con il
server Typesense
➔ Con Instantsearch, un client
(esempio un browser) comunica
direttamente con Typesense,
senza Drupal nel mezzo
➔ Importante: la chiave API deve
essere una che consenta solo
l'azione documents:search sulle
collections desiderate
instantsearch.js
import instantsearch from "instantsearch.js";
import { searchBox, hits } from "instantsearch.js/es/widgets";
import TypesenseInstantSearchAdapter from "typesense-instantsearch-adapter";
const typesenseInstantsearchAdapter = new TypesenseInstantSearchAdapter({
server: {
apiKey: "S6Af42wX9HmxF5Ar36ajNNawNywAYwGr",
nodes: [
{
host: "search-api-typesense.ddev.site",
port: "8108",
protocol: "https",
},
],
},
additionalSearchParameters: {
query_by: "body",
},
});
const searchClient = typesenseInstantsearchAdapter.searchClient;
37
38
https://youtu.be/xg_TmFj8UrI?si=otjdQHcyZ-f9AxMN
The page loads in 174 ms
39
https://youtu.be/xg_TmFj8UrI?si=otjdQHcyZ-f9AxMN
Get the results in 15ms
https://www.drupal.org/project/search_api_typesense/issues/3459544
40
PDF Embeddings
41
LLPhant
foreach ($attachments as $attachment) {
$file = $this->getPdfFileEntity
(
$field_storage
,
$attachment['target_id'],
);
if ($file === NULL) {
continue;
}
$reader = new FileDataReader(
DRUPAL_ROOT . $file->createFileUrl()
);
$documents = EmbeddingFormatter::formatEmbeddings(
$reader->getDocuments()
);
}
42
https://github.com/theodo-group/LLPhant
➔ FileDataReader, ci aiuta a
leggere il contenuto da file .pdf,
.docx e di testo.
➔ EmbeddingFormatter, ti
consente di aggiungere
informazioni preziose
nell'intestazione (come ad
esempio l'autore del documento,
la data del documento, ecc.)
Ci siamo quasi!!
43
With Cohere re-ranking
44
Image Embeddings
45
➔ Usiamo il modulo AI per
chiedere a ChatGPT di
descrivere nel dettaglio
un'immagine
➔ prendiamo il risultato e lo
salviamo in un campo
"description" del media.
➔ i media sono indicizzati su
Typesense e il campo
description è usato per fare
l'embedding.
➔ Infine miglioriamo il risultato
applicando un algoritmo di
re-ranking al risultato di
Typesense (usando Cohere
https://www.drupal.org/projec
t/ai/issues/3488114 ).
GRAZIE E CIAO!

Talks on my machine: Drupal: AI e Typesense come integrare la ricerca semantica

  • 1.
    AI e Typesense Comeintegrare la ricerca semantica in Drupal 1
  • 2.
    About me Drupal /PHP developer @ SparkFabrik Drupal contributor (Search API Typesense, Iubenda Integration, DDEV sqlsrv add-on) Drupal.org: https://www.drupal.org/u/robertoperuzzo LinkedIn: www.linkedin.com/in/robertoperuzzo Slack (drupal.slack.com): robertoperuzzo Mastodon: @robertoperuzzo@mastodon.social @robertoperuzzo
  • 3.
    3 Agenda 1. Ricerca Tradizionalevs. Ricerca Semantica 2. Introduzione a Retrieval-Augmented Generation (RAG) 3. Perché Typesense? 4. Il modulo Drupal Search API Typesense
  • 4.
    Ricerca tradizionale 4 La ricercatradizionale recupera rapidamente corrispondenze esatte per parole chiave, concentrandosi su efficienza e velocità per fornire risultati precisi facendo corrispondere direttamente i termini nei dati.
  • 5.
    Ricerca nel coredi Drupal 5
  • 6.
    No errori dibattitura 6
  • 7.
  • 8.
    Ricerca Semantica 8 La ricercasemantica utilizza l'AI per interpretare l'intento e il contesto della query, fornendo risultati basati sul significato piuttosto che sulle parole chiave esatte.
  • 9.
  • 10.
    10 Caratteristiche Ricerca TradizionaleRicerca Semantica Dipendenza dalle parole chiave Richiede corrispondenze esatte Riconosce sinonimi e termini correlati Comprensione del contesto Comprensione limitata Interpreta l'intento e il contesto dell'utente Query in linguaggio naturale Difficoltà con query lunghe e conversazionali Elabora efficacemente frasi e domande complesse Gestione errori di battitura Fallisce con errori di ortografia o variazioni Permette tolleranza agli errori e correzione ortografica Corrispondenza sinonimi/concetti Limitata alle corrispondenze esatte Identifica termini e concetti correlati Logica di ricerca Non si adatta senza aggiornamenti manuali Impara e si adatta al comportamento utente e ai cambiamenti dei contenuti Ricerca Tradizionale vs Ricerca Semantica
  • 11.
    Alcune applicazioni pratiche 11 ➔Ricerca e raccomandazioni prodotti ➔ Ricerca documenti ➔ Chatbot per supporto clienti ➔ Personalizzazione dei risultati
  • 12.
  • 13.
    RAG è ilprocesso di ottimizzazione dell'output di un modello linguistico di grandi dimensioni, in modo che faccia riferimento a una base di conoscenza autorevole al di fuori delle sue fonti di dati di addestramento prima di generare una risposta. 13 Source: https://aws.amazon.com/it/what-is/retrieval-augmented-generation/
  • 14.
    Vector Databases 14 ➔ Memorizzanoil significato semantico del testo ➔ Cattura astratta non solo di 3 dimensioni, ma migliaia: es. emozione, sentimento, tono, dimensione, ecc. ➔ Suddivisione in “chunks” per catturare significati ancora più specifici
  • 15.
  • 16.
  • 17.
    17 Cosa serve? ➔ Contenutiper la “Base di conoscenza” ➔ Vector database ➔ LLM
  • 18.
  • 19.
    19 “Il nostro obiettivoè ridurre il time-to-market per creare un'esperienza eccezionale di ricerca istantanea che fornisca risultati pertinenti fin da subito.” Source: https://typesense.org/docs/overview/why-typesense.html
  • 20.
    20 "Abbiamo anche fornitovalori predefiniti sensati per ogni parametro di configurazione, in modo che il motore funzioni immediatamente per la maggior parte dei casi d'uso. Questo è ciò che intendiamo con 'batterie incluse'." Source: https://typesense.org/docs/overview/why-typesense.html
  • 21.
  • 22.
    22 C++ +20k stelle suGithub Self-hosted o SaaS Semplice da impostare
  • 23.
    ➔ La versionecorrente è v27.1 ➔ Una nuova release ogni 2-3 mesi Roadmap pubblica https://github.com/orgs/typesense/projects/1/views/1 23
  • 24.
    Esistono integrazioni permolte piattaforme 24 Source: https://typesense.org Tristemente manca Drupal qui…
  • 25.
    Search API Typesense There’sa module for that™ https://www.drupal.org/project/search_api_typesense 25
  • 26.
    Try Typesense onDDEV 26 https://github.com/kevinquillen/ddev-typesense
  • 27.
    ➔ La chiaveAPI di amministrazione viene impostata all'avvio del server Typesense ➔ Typesense è distribuito, qui puoi impostare tutti i nodi disponibili ➔ Il nodo più vicino è quello per sfruttare Search Delivery Network in Typesense Cloud ➔ La configurazione mostrata è quella per connettersi a un server Typesense gestito da DDEV 27 Connettiti al server
  • 28.
    28 Nuovi tabs perla configurazione del Search API server
  • 29.
    29 Configurazione dei campi ➔Search API Typesense definisce un set di nuovi tipi di campo, è obbligatorio utilizzarli quando si indicizzano i dati su Typesense ➔ I tipi di campo supportati da Typesense sono: ◆ string ◆ string[] ◆ int32 ◆ int32[] ◆ int64 ◆ int64[] ◆ float ◆ float[] ◆ bool ◆ bool[]
  • 30.
    30 ➔ Per ognicampo aggiunto alla Search API dobbiamo configurare come verrà esposto a Typesense ➔ Una collection verrà creata nel server Typesense solo al salvataggio dello schema Configurazione dello schema
  • 31.
    ➔ Gli Embedsvengono generati utilizzando un LLM (sia localmente che con un provider remoto, come OpenAI) ➔ Gli Embeds vengono salvati in un campo float[] denominato embedding ➔ Il contenuto dei campi embedding viene concatenato insieme e poi suddiviso in blocchi detti chunks ➔ È possibile configurare la dimensione dei chunks e la sovrapposizione tra chunks consecutivi Abilitare la ricerca Semantica 31
  • 32.
    Ricerca Semantica curl 'http://localhost:8108/multi_search' -H "X-TYPESENSE-API-KEY: ${TYPESENSE_API_KEY}" -X POST -d '{ "searches": [ { "q": "device to type things on", "query_by": "embedding", "collection": "products", "prefix": "false", "exclude_fields": "embedding", "per_page": 1 } ] }' 32 ➔ Typesense genererà l’embedding per la chiave di ricerca e utilizzerà la similarità del coseno per trovare documenti simili ➔ Di solito vogliamo escludere il campo di embedding dai risultati perché è solo un enorme vettore di numeri float
  • 33.
  • 34.
  • 35.
    search_api_typesense module doesn’thave an integration with Views… …and probably never will. 35 Source: https://typesense.org/docs/overview/why-typesense.html
  • 36.
    36 InstantSearch.js è unalibreria UI open source per Vanilla JS che consente di creare un'interfaccia di ricerca nella tua app frontend Source: https://www.algolia.com/doc/guides/building-search-ui/widgets/showcase/js/
  • 37.
    ➔ Il teamdi Typesense ha sviluppato un adattatore per rendere le chiamate API di instantsearch compatibili con il server Typesense ➔ Con Instantsearch, un client (esempio un browser) comunica direttamente con Typesense, senza Drupal nel mezzo ➔ Importante: la chiave API deve essere una che consenta solo l'azione documents:search sulle collections desiderate instantsearch.js import instantsearch from "instantsearch.js"; import { searchBox, hits } from "instantsearch.js/es/widgets"; import TypesenseInstantSearchAdapter from "typesense-instantsearch-adapter"; const typesenseInstantsearchAdapter = new TypesenseInstantSearchAdapter({ server: { apiKey: "S6Af42wX9HmxF5Ar36ajNNawNywAYwGr", nodes: [ { host: "search-api-typesense.ddev.site", port: "8108", protocol: "https", }, ], }, additionalSearchParameters: { query_by: "body", }, }); const searchClient = typesenseInstantsearchAdapter.searchClient; 37
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
    LLPhant foreach ($attachments as$attachment) { $file = $this->getPdfFileEntity ( $field_storage , $attachment['target_id'], ); if ($file === NULL) { continue; } $reader = new FileDataReader( DRUPAL_ROOT . $file->createFileUrl() ); $documents = EmbeddingFormatter::formatEmbeddings( $reader->getDocuments() ); } 42 https://github.com/theodo-group/LLPhant ➔ FileDataReader, ci aiuta a leggere il contenuto da file .pdf, .docx e di testo. ➔ EmbeddingFormatter, ti consente di aggiungere informazioni preziose nell'intestazione (come ad esempio l'autore del documento, la data del documento, ecc.)
  • 43.
  • 44.
  • 45.
    45 ➔ Usiamo ilmodulo AI per chiedere a ChatGPT di descrivere nel dettaglio un'immagine ➔ prendiamo il risultato e lo salviamo in un campo "description" del media. ➔ i media sono indicizzati su Typesense e il campo description è usato per fare l'embedding. ➔ Infine miglioriamo il risultato applicando un algoritmo di re-ranking al risultato di Typesense (usando Cohere https://www.drupal.org/projec t/ai/issues/3488114 ).
  • 46.