ݺߣ

ݺߣShare a Scribd company logo
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!
Ad

Recommended

Alla scoperta dei Vector Database e dei RAG
Alla scoperta dei Vector Database e dei RAG
Commit University
ASP.NET performance optimization
ASP.NET performance optimization
Andrea Dottor
Sentiment analysis
Sentiment analysis
Alessandro Pagliaro
Seo e Web Marketing - 1 | WebMaster & WebDesigner
Seo e Web Marketing - 1 | WebMaster & WebDesigner
Matteo Magni
Con Aruba, a lezione di cloud #lezione 12 - parte 1: 'Cloud Object Storage, u...
Con Aruba, a lezione di cloud #lezione 12 - parte 1: 'Cloud Object Storage, u...
Aruba S.p.A.
PHP Serverless in ambiente AWS
PHP Serverless in ambiente AWS
Gianfranco Castro
Thingspeak: integrazione
Thingspeak: integrazione
Augusto Ciuffoletti
SBMT Presentation
SBMT Presentation
Alberico Giardi
CakePhp Linux Day Torino '09
CakePhp Linux Day Torino '09
Francesco Ronchi
Presentazione Cama_Primiceri_Atro
Presentazione Cama_Primiceri_Atro
BernadetteCama
Semantic Search Engine
Semantic Search Engine
Valentina Primiceri
Repository pattern
Repository pattern
Christian Nastasi
Seo e Web Marketing - 1 | WebMaster & WebDesigner
Seo e Web Marketing - 1 | WebMaster & WebDesigner
Matteo Magni
What's New in ASP.NET 4.5 and Visual Studio 2012
What's New in ASP.NET 4.5 and Visual Studio 2012
Andrea Dottor
Sencha touch: Sviluppare un'app - 4° parte
Sencha touch: Sviluppare un'app - 4° parte
Giuseppe Toto
Cloud & No-Coding: come fare su Azure?
Cloud & No-Coding: come fare su Azure?
Andrea Carratta
Database Finders
Database Finders
Silvano Natalizi - ITIS ALESSANDRO VOLTA PERUGIA
Be02 portare la nostra applicazione su azure
Be02 portare la nostra applicazione su azure
DotNetCampus
eZ publish - Introduzione al sistema
eZ publish - Introduzione al sistema
Francesco Trucchia
10 - Ricercare nel web II
10 - Ricercare nel web II
Giuseppe Vizzari
Azure dayroma java, il lato oscuro del cloud
Azure dayroma java, il lato oscuro del cloud
Riccardo Zamana
Wordpress 3/7. temi e plugin
Wordpress 3/7. temi e plugin
City Planner
Swagger per tutti
Swagger per tutti
Nicolò Carandini
Alla scoperta di Zend Framework 1.8
Alla scoperta di Zend Framework 1.8
massimiliano.wosz
Pensiero Analogico e Microservizi
Pensiero Analogico e Microservizi
Consulthinkspa
Introduzione alla localizzazione web
Introduzione alla localizzazione web
Qabiria
Alessandro Forte - ASP.Net 4.0
Alessandro Forte - ASP.Net 4.0
Alessandro Forte
Wordpress 4. come scrivere SEO
Wordpress 4. come scrivere SEO
City Planner
Talks on my machine: Drupal, Storybook e SDC
Talks on my machine: Drupal, Storybook e SDC
sparkfabrik
Talks on my machine: Drupal CMS versus The Cool Kids
Talks on my machine: Drupal CMS versus The Cool Kids
sparkfabrik

More Related Content

Similar to Talks on my machine: Drupal: AI e Typesense come integrare la ricerca semantica (20)

CakePhp Linux Day Torino '09
CakePhp Linux Day Torino '09
Francesco Ronchi
Presentazione Cama_Primiceri_Atro
Presentazione Cama_Primiceri_Atro
BernadetteCama
Semantic Search Engine
Semantic Search Engine
Valentina Primiceri
Repository pattern
Repository pattern
Christian Nastasi
Seo e Web Marketing - 1 | WebMaster & WebDesigner
Seo e Web Marketing - 1 | WebMaster & WebDesigner
Matteo Magni
What's New in ASP.NET 4.5 and Visual Studio 2012
What's New in ASP.NET 4.5 and Visual Studio 2012
Andrea Dottor
Sencha touch: Sviluppare un'app - 4° parte
Sencha touch: Sviluppare un'app - 4° parte
Giuseppe Toto
Cloud & No-Coding: come fare su Azure?
Cloud & No-Coding: come fare su Azure?
Andrea Carratta
Database Finders
Database Finders
Silvano Natalizi - ITIS ALESSANDRO VOLTA PERUGIA
Be02 portare la nostra applicazione su azure
Be02 portare la nostra applicazione su azure
DotNetCampus
eZ publish - Introduzione al sistema
eZ publish - Introduzione al sistema
Francesco Trucchia
10 - Ricercare nel web II
10 - Ricercare nel web II
Giuseppe Vizzari
Azure dayroma java, il lato oscuro del cloud
Azure dayroma java, il lato oscuro del cloud
Riccardo Zamana
Wordpress 3/7. temi e plugin
Wordpress 3/7. temi e plugin
City Planner
Swagger per tutti
Swagger per tutti
Nicolò Carandini
Alla scoperta di Zend Framework 1.8
Alla scoperta di Zend Framework 1.8
massimiliano.wosz
Pensiero Analogico e Microservizi
Pensiero Analogico e Microservizi
Consulthinkspa
Introduzione alla localizzazione web
Introduzione alla localizzazione web
Qabiria
Alessandro Forte - ASP.Net 4.0
Alessandro Forte - ASP.Net 4.0
Alessandro Forte
Wordpress 4. come scrivere SEO
Wordpress 4. come scrivere SEO
City Planner
Presentazione Cama_Primiceri_Atro
Presentazione Cama_Primiceri_Atro
BernadetteCama
Seo e Web Marketing - 1 | WebMaster & WebDesigner
Seo e Web Marketing - 1 | WebMaster & WebDesigner
Matteo Magni
What's New in ASP.NET 4.5 and Visual Studio 2012
What's New in ASP.NET 4.5 and Visual Studio 2012
Andrea Dottor
Sencha touch: Sviluppare un'app - 4° parte
Sencha touch: Sviluppare un'app - 4° parte
Giuseppe Toto
Cloud & No-Coding: come fare su Azure?
Cloud & No-Coding: come fare su Azure?
Andrea Carratta
Be02 portare la nostra applicazione su azure
Be02 portare la nostra applicazione su azure
DotNetCampus
eZ publish - Introduzione al sistema
eZ publish - Introduzione al sistema
Francesco Trucchia
Azure dayroma java, il lato oscuro del cloud
Azure dayroma java, il lato oscuro del cloud
Riccardo Zamana
Wordpress 3/7. temi e plugin
Wordpress 3/7. temi e plugin
City Planner
Alla scoperta di Zend Framework 1.8
Alla scoperta di Zend Framework 1.8
massimiliano.wosz
Pensiero Analogico e Microservizi
Pensiero Analogico e Microservizi
Consulthinkspa
Introduzione alla localizzazione web
Introduzione alla localizzazione web
Qabiria
Wordpress 4. come scrivere SEO
Wordpress 4. come scrivere SEO
City Planner

More from sparkfabrik (20)

Talks on my machine: Drupal, Storybook e SDC
Talks on my machine: Drupal, Storybook e SDC
sparkfabrik
Talks on my machine: Drupal CMS versus The Cool Kids
Talks on my machine: Drupal CMS versus The Cool Kids
sparkfabrik
KCD Italy 2023 - Secure Software Supply chain for OCI Artifact on Kubernetes
KCD Italy 2023 - Secure Software Supply chain for OCI Artifact on Kubernetes
sparkfabrik
20231129 - Platform @ localhost 2023 - Application-driven infrastructure with...
20231129 - Platform @ localhost 2023 - Application-driven infrastructure with...
sparkfabrik
IAD 2023 - 22 Years of Agile and all I got is this lousy t-shirt
IAD 2023 - 22 Years of Agile and all I got is this lousy t-shirt
sparkfabrik
2023 - Drupalcon - How Drupal builds your pages
2023 - Drupalcon - How Drupal builds your pages
sparkfabrik
2023 - TAC23 - Agile HR - Racconti dal fronte
2023 - TAC23 - Agile HR - Racconti dal fronte
sparkfabrik
CodeMotion 2023 - Deep dive nella supply chain della nostra infrastruttura cl...
CodeMotion 2023 - Deep dive nella supply chain della nostra infrastruttura cl...
sparkfabrik
What is the Secure Supply Chain and the Current State of the PHP Ecosystem
What is the Secure Supply Chain and the Current State of the PHP Ecosystem
sparkfabrik
UX e Web sostenibile (UXday 2023).pdf
UX e Web sostenibile (UXday 2023).pdf
sparkfabrik
Drupal Dev Days Vienna 2023 - What is the secure software supply chain and th...
Drupal Dev Days Vienna 2023 - What is the secure software supply chain and th...
sparkfabrik
Deep dive nella supply chain della nostra infrastruttura cloud
Deep dive nella supply chain della nostra infrastruttura cloud
sparkfabrik
KCD Italy 2022 - Application driven infrastructure with Crossplane
KCD Italy 2022 - Application driven infrastructure with Crossplane
sparkfabrik
Come Drupal costruisce le tue pagine
Come Drupal costruisce le tue pagine
sparkfabrik
Drupal 10: un framework PHP di sviluppo Cloud Native moderno
Drupal 10: un framework PHP di sviluppo Cloud Native moderno
sparkfabrik
Do you know what your Drupal is doing Observe it! (DrupalCon Prague 2022)
Do you know what your Drupal is doing Observe it! (DrupalCon Prague 2022)
sparkfabrik
Do you know what your Drupal is doing_ Observe it!
Do you know what your Drupal is doing_ Observe it!
sparkfabrik
Progettare e sviluppare soluzioni serverless con AWS
Progettare e sviluppare soluzioni serverless con AWS
sparkfabrik
From React to React Native - Things I wish I knew when I started
From React to React Native - Things I wish I knew when I started
sparkfabrik
Headless Drupal: A modern approach to (micro)services and APIs
Headless Drupal: A modern approach to (micro)services and APIs
sparkfabrik
Talks on my machine: Drupal, Storybook e SDC
Talks on my machine: Drupal, Storybook e SDC
sparkfabrik
Talks on my machine: Drupal CMS versus The Cool Kids
Talks on my machine: Drupal CMS versus The Cool Kids
sparkfabrik
KCD Italy 2023 - Secure Software Supply chain for OCI Artifact on Kubernetes
KCD Italy 2023 - Secure Software Supply chain for OCI Artifact on Kubernetes
sparkfabrik
20231129 - Platform @ localhost 2023 - Application-driven infrastructure with...
20231129 - Platform @ localhost 2023 - Application-driven infrastructure with...
sparkfabrik
IAD 2023 - 22 Years of Agile and all I got is this lousy t-shirt
IAD 2023 - 22 Years of Agile and all I got is this lousy t-shirt
sparkfabrik
2023 - Drupalcon - How Drupal builds your pages
2023 - Drupalcon - How Drupal builds your pages
sparkfabrik
2023 - TAC23 - Agile HR - Racconti dal fronte
2023 - TAC23 - Agile HR - Racconti dal fronte
sparkfabrik
CodeMotion 2023 - Deep dive nella supply chain della nostra infrastruttura cl...
CodeMotion 2023 - Deep dive nella supply chain della nostra infrastruttura cl...
sparkfabrik
What is the Secure Supply Chain and the Current State of the PHP Ecosystem
What is the Secure Supply Chain and the Current State of the PHP Ecosystem
sparkfabrik
UX e Web sostenibile (UXday 2023).pdf
UX e Web sostenibile (UXday 2023).pdf
sparkfabrik
Drupal Dev Days Vienna 2023 - What is the secure software supply chain and th...
Drupal Dev Days Vienna 2023 - What is the secure software supply chain and th...
sparkfabrik
Deep dive nella supply chain della nostra infrastruttura cloud
Deep dive nella supply chain della nostra infrastruttura cloud
sparkfabrik
KCD Italy 2022 - Application driven infrastructure with Crossplane
KCD Italy 2022 - Application driven infrastructure with Crossplane
sparkfabrik
Come Drupal costruisce le tue pagine
Come Drupal costruisce le tue pagine
sparkfabrik
Drupal 10: un framework PHP di sviluppo Cloud Native moderno
Drupal 10: un framework PHP di sviluppo Cloud Native moderno
sparkfabrik
Do you know what your Drupal is doing Observe it! (DrupalCon Prague 2022)
Do you know what your Drupal is doing Observe it! (DrupalCon Prague 2022)
sparkfabrik
Do you know what your Drupal is doing_ Observe it!
Do you know what your Drupal is doing_ Observe it!
sparkfabrik
Progettare e sviluppare soluzioni serverless con AWS
Progettare e sviluppare soluzioni serverless con AWS
sparkfabrik
From React to React Native - Things I wish I knew when I started
From React to React Native - Things I wish I knew when I started
sparkfabrik
Headless Drupal: A modern approach to (micro)services and APIs
Headless Drupal: A modern approach to (micro)services and APIs
sparkfabrik
Ad

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

  • 1. AI e Typesense Come integrare 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 Tradizionale vs. Ricerca Semantica 2. Introduzione a Retrieval-Augmented Generation (RAG) 3. Perché Typesense? 4. Il modulo Drupal Search API Typesense
  • 4. 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.
  • 5. Ricerca nel core di Drupal 5
  • 6. No errori di battitura 6
  • 8. 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. 9
  • 10. 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
  • 11. Alcune applicazioni pratiche 11 ➔ Ricerca e raccomandazioni prodotti ➔ Ricerca documenti ➔ Chatbot per supporto clienti ➔ Personalizzazione dei risultati
  • 13. 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/
  • 14. 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
  • 17. 17 Cosa serve? ➔ Contenuti per la “Base di conoscenza” ➔ Vector database ➔ LLM
  • 18. Typesense 18 Open Source Alternative to Algolia + Pinecone
  • 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 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
  • 22. 22 C++ +20k stelle su Github Self-hosted o SaaS Semplice da impostare
  • 23. ➔ La versione corrente è v27.1 ➔ Una nuova release ogni 2-3 mesi Roadmap pubblica https://github.com/orgs/typesense/projects/1/views/1 23
  • 24. Esistono integrazioni per molte piattaforme 24 Source: https://typesense.org Tristemente manca Drupal qui…
  • 25. Search API Typesense There’s a module for that™ https://www.drupal.org/project/search_api_typesense 25
  • 26. Try Typesense on DDEV 26 https://github.com/kevinquillen/ddev-typesense
  • 27. ➔ 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. 28 Nuovi tabs per la 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 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
  • 31. ➔ 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
  • 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. 33
  • 34. 34
  • 35. 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. 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/
  • 37. ➔ 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
  • 41. 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.)
  • 45. 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 ).