RAG con Ollama e Qdrant come motore di ricerca universale per i dati propri

In un mondo di informazioni sempre più confuso, diventa sempre più importante rendere i propri database ricercabili in modo mirato, non attraverso le classiche ricerche full-text, ma attraverso risposte semanticamente rilevanti. È proprio qui che entra in gioco il principio del database RAG, una soluzione di ricerca supportata dall'intelligenza artificiale e composta da due componenti centrali:


Argomenti attuali sull'intelligenza artificiale

  1. un database vettoriale (come Qdrant) in cui qualsiasi contenuto è memorizzato come vettori numerici,
  2. e un modello linguistico (ad esempio tramite Ollama) che combina in modo intelligente le rispettive richieste con il contenuto appropriato.

Invece di lasciare che il modello "indovini", questa architettura utilizza le proprie fonti di conoscenza, ad esempio:

  • documentari autoprodotti,
  • Contenuti dei siti web,
  • manuali tecnici,
  • Database di supporto,
  • Elenchi di FAQ,
  • o qualsiasi fonte di testo archiviata (ad esempio, da vecchi database).

Il fattore decisivo: Tutte queste fonti possono essere preparate in anticipo e "chunked" (cioè suddivise in piccole unità di testo) per poter fornire in un secondo momento gli estratti di testo più rilevanti per una domanda dell'utente.

Che vogliate rendere analizzabile il vostro database di conoscenze, la documentazione interna o un intero archivio di prodotti - con Ollama + Qdrant è possibile farlo sul proprio Mac, senza vincoli di cloud e con il pieno controllo dei dati.

Che cos'è un database RAG e perché il "chunking"?

RAG è l'acronimo di Retrieval-Augmented Generation (generazione aumentata del recupero), in altre parole: un'intelligenza artificiale che genera testo con un recupero assistito delle informazioni. Invece di addestrare un modello linguistico come GPT, Mistral o LLaMA solo su ciò che già "conosce", può accedere a informazioni aggiuntive tramite un database di conoscenza collegato (di solito un cosiddetto database vettoriale).

Esempio:

Se si chiede a un modello linguistico: "Cosa c'è nella mia dichiarazione dei redditi del 2023?", dovrà tirare a indovinare senza avere accesso ai dati originali. Tuttavia, se ha accesso a una rappresentazione vettoriale del documento memorizzata localmente, può recuperare le informazioni pertinenti e incorporarle nella risposta.

Perché i contenuti vengono "spezzettati"

Documenti, siti web o libri sono di solito troppo lunghi per essere elaborati o ricercati in una sola volta. I moderni modelli linguistici hanno anche dei limiti di token, cioè una lunghezza limitata di testo che possono comprendere in una sola volta (spesso circa 4.000-8.000 token, con i modelli più recenti anche 32.000 o più).

Ecco perché RAG utilizza il seguente trucco:

  1. Il testo originale è diviso in piccole sezioni (chunks).
  2. Ciascun chunk viene convertito in un vettore da un modello linguistico (embedding).
  3. Questi vettori sono memorizzati in un database come Qdrant.
  4. Quando l'utente fa una richiesta, anche la domanda viene tradotta in un vettore e vengono recuperati i pezzi più simili.
  5. Questo contenuto viene poi aggiunto al modello linguistico, ad esempio tramite un prompt di sistema o un'iniezione di contesto.

In questo modo si crea un sistema che si comporta come una memoria, ma senza le classiche parole chiave o la ricerca full-text, bensì basandosi esclusivamente sul significato (semantico).

Requisiti e obiettivi

Stiamo costruendo un sistema locale di RAG composto da:

  • un LLM locale via Ollama
  • un database vettoriale chiamato Qdrant
  • uno script Python che suddivide, vettorializza e inserisce i testi nel database
  • Opzionale: un'interfaccia semplice o un'API per l'interrogazione

Piattaforma di destinazione: macOS (Intel o Apple Silicon)

Questo è un prerequisito:

  • macOS 12 o più recente (Monterey o superiore)
  • Conoscenza di base dei terminali
  • Python 3.10 o più recente
  • Opzionale: Homebrew installiert

Fase 1: Ollama 1TP12Animal

Ollama è uno strumento snello che consente di eseguire modelli linguistici locali come Mistral, LLaMA, Gemma o Codellama sul proprio computer, anche senza Internet.

Installazione su Mac:

curl -fsSL https://ollama.com/install.sh | sh

In alternativa, l'Ollama può essere assegnato anche tramite Homebrew install:
brew install ollama

Dopo l'installazione:

ollama run mistral

Questo scarica il modello Mistral 7B e lo avvia localmente. La Ollama è dotata di un'API REST, che verrà utilizzata in seguito per la vettorializzazione. Naturalmente è possibile utilizzare anche altri modelli, come Gemma3 (12B), Mistral Small (24B) o altri LLM.

Fase 2: animali Qdrant 1TP12 (database vettoriale locale)

Qdrant è un database vettoriale velocissimo basato su Rust. È gratuito, open source e facile da avviare sul Mac, preferibilmente tramite Docker. Se non avete ancora installato Docker sul vostro Mac 1TP12, potete scaricarlo dal sito Sito web di Docker gratuitamente ed eseguirlo sul Mac come una normale applicazione desktop installieren. In alternativa, è possibile installare Docker tramite Homebrew install se si utilizza già Homebrew:

brew install --cask docker

Quindi avviare Qdrant tramite Docker:

docker run -p 6333:6333 -v qdrant_storage:/qdrant/storage qdrant/qdrant

Qdrant è raggiungibile all'indirizzo

http://localhost:6333

Per i test:

curl http://localhost:6333/collections

Passo 3: Preparare l'ambiente Python

Abbiamo bisogno di Python per il chunking, l'embedding e la comunicazione con Qdrant.

Preparazione:

python3 -m venv rag-env
source rag-env/bin/activate
pip install qdrant-client sentence-transformers ollama numpy

Se ollama non è riconosciuto come pacchetto Python, utilizzare l'API REST direttamente tramite le richieste:

pip install requests

Fase 4: Chunking e embedding

Di seguito è riportato un esempio di script che divide un documento di testo in pezzi, crea embeddings tramite Ollama e li inserisce in Qdrant:

import requests
from qdrant_client import QdrantClient
from qdrant_client.models import PointStruct
import uuid

# Konfiguration
CHUNK_SIZE = 500 # Zeichen
COLLECTION_NAME = "mein_rag_wissen"

# Text vorbereiten
with open("mein_text.txt", "r") as f:
text = f.read()

chunks = [text[i:i+CHUNK_SIZE] for i in range(0, len(text), CHUNK_SIZE)]

# Qdrant vorbereiten
client = QdrantClient("localhost", port=6333)

# Neue Collection anlegen (falls noch nicht vorhanden)
client.recreate_collection(
collection_name=COLLECTION_NAME,
vectors_config={"size": 4096, "distance": "Cosine"}
)

def get_embedding_ollama(text):
response = requests.post(
"http://localhost:11434/api/embeddings",
json={"model": "mistral", "prompt": text}
)
return response.json()["embedding"]

# Embeddings erzeugen und in Qdrant speichern
points = []
for i, chunk in enumerate(chunks):
vector = get_embedding_ollama(chunk)
points.append(PointStruct(
id=str(uuid.uuid4()),
vector=vector,
payload={"text": chunk}
))

client.upsert(collection_name=COLLECTION_NAME, points=points)
print(f"{len(points)} Chunks erfolgreich eingefügt.")

Fase 5: Interrogazione tramite ricerca semantica

È ora possibile inviare a Qdrant le query come vettore e fargli trovare le sezioni di testo più rilevanti:

query = "Wie funktioniert ein RAG-System?"
query_vector = get_embedding_ollama(query)

results = client.search(
collection_name=COLLECTION_NAME,
query_vector=query_vector,
limit=3
)

for r in results:
print(r.payload["text"])

È quindi possibile passare questi pezzi all'Ollama tramite un prompt di sistema, ad esempio, e farli formulare come risposta legata al contesto.

Chunking + esportazione JSON in FileMaker e altri database

In molti casi, il chunking può già avvenire in una soluzione di database esistente, ad esempio in FileMaker. Nel mio ambiente di lavoro funziona esattamente così: i dati di partenza, come i contenuti del sito web, le voci di supporto o gli articoli tecnici, sono già disponibili in forma strutturata in FileMaker.

Ecco come funziona il processo:

  1. I testi vengono suddivisi in sezioni di 300-500 caratteri all'interno di FileMaker, utilizzando la sua logica di chunking.
  2. A ogni brano viene assegnato il proprio ID e, se applicabile, i metadati (titolo, categoria, fonte, lingua, ecc.).
  3. Tutti i chunk vengono esportati automaticamente come file JSON, ad esempio in una directory specifica su un'unità di rete o direttamente sul disco rigido del server AI.
  4. Uno script Python sul server legge questi file JSON e li salva nel database Qdrant.

Esempio di un file chunk esportato (chunk_00017.json)

{
"id": "00017",
"text": "Dies ist ein einzelner Textabschnitt mit ca. 400 Zeichen, der aus einer größeren Quelle stammt. Er wurde in FileMaker vorbereitet und enthält alle relevanten Inhalte, die für eine semantische Suche benötigt werden.",
"metadata": {
"source": "support_center",
"category": "Fehlermeldung",
"language": "de",
"title": "Drucker wird nicht erkannt"
}
}

Lo script di importazione successivo può essere eseguito automaticamente o regolarmente tramite il terminale, ad esempio tramite un cron job o una chiamata manuale:

python3 import_json_chunks.py /Users/markus/Desktop/chunks/

Lo script legge ogni pezzo JSON, genera il vettore corrispondente (ad esempio, tramite Ollama o SentenceTransformers) e trasferisce la voce al database Qdrant.

Questo metodo non solo è trasparente, ma può anche essere combinato molto bene con le strutture informatiche esistenti, soprattutto nelle aziende che già utilizzano l'FileMaker o che amano mappare tutto a livello centrale e controllato visivamente per motivi di chiarezza dei processi.

Collegare qualsiasi database all'AI locale

Con Ollama e Qdrant è possibile configurare in breve tempo un sistema RAG completo e ad alte prestazioni sul Mac:

  • Locale, senza cloud o abbonamento
  • Espandibile, con i propri contenuti
  • I dati sono al sicuro, poiché nulla lascia il computer
  • Efficienza, poiché Qdrant rimane veloce anche su grandi quantità di dati

Se volete usare la vostra IA non solo per chattare, ma come un vero e proprio sistema di conoscenza e memoria, questa combinazione è un must. E funziona con poco sforzo, con il pieno controllo dei propri dati.


Indagine in corso sull'uso dei sistemi di intelligenza artificiale locali

Cosa ne pensate del software di intelligenza artificiale in esecuzione locale, come MLX o Ollama?

Prospettive: Cosa è possibile con RAG, Ollama e Qdrant

L'impostazione descritta in questo articolo costituisce la base tecnica per un nuovo modo di gestire la conoscenza - locale, controllata ed espandibile in modo flessibile. Ma il viaggio non finisce qui. Una volta compresa l'interazione tra chunking, embedding, ricerca semantica e modelli linguistici, ci si renderà rapidamente conto della versatilità di questa architettura nella pratica.

1. connessione ai propri database

Che si tratti di FileMaker, MySQL, PostgreSQL o MongoDB, qualsiasi contenuto può essere regolarmente estratto, spezzettato e inserito automaticamente nel database vettoriale mediante query mirate. Questo trasforma un database classico in una fonte di conoscenza ricercabile semanticamente. Soprattutto nei sistemi di supporto, negli archivi di prodotti o nelle biblioteche digitali, questo apre opzioni di accesso completamente nuove per i dipendenti o i clienti.

2. Importazione automatica di pagine web, PDF o documenti.

I contenuti non devono essere trasferiti manualmente. Con strumenti come BeautifulSoup, readability, pdfplumber o docx2txt, è possibile importare automaticamente interi siti web, manuali PDF o documenti Word, convertirli in forma di testo e prepararli per il chunking. Ad esempio, i wiki tecnici, i portali dei clienti o la documentazione online possono essere aggiornati regolarmente e inseriti nel database RAG.

3. costruzione di conoscenze a lungo termine attraverso la strutturazione

A differenza di un'applicazione AI classica, che parte da zero a ogni domanda, una configurazione RAG consente di espandere e curare passo dopo passo la conoscenza sottostante. La selezione e la preparazione mirata dei pezzi crea una propria memoria semantica, che diventa più preziosa a ogni inserimento.

4. connessione con i grafi della conoscenza (Neo4j)

Se volete fare un ulteriore passo avanti, potete non solo memorizzare le informazioni in modo semantico, ma anche collegarle logicamente. Con Neo4j, un database a grafo, le relazioni tra termini, persone, argomenti o categorie possono essere visualizzate e interrogate in modo specifico. Questo trasforma una raccolta di testi in un grafo di conoscenza strutturato che può essere utilizzato sia dall'uomo che dall'intelligenza artificiale, ad esempio per visualizzare catene causali, sequenze temporali o cluster tematici.

5. utilizzare nei propri strumenti, app o chatbot

Una volta configurata, la logica RAG può essere integrata in quasi tutte le applicazioni: come funzione di ricerca semantica in un'applicazione web interna, come ausilio intelligente per l'inserimento di dati in un sistema CRM o come chatbot con le proprie competenze sul sito web aziendale. Grazie all'utilizzo di API locali (ad esempio Ollama REST e Qdrant gRPC), tutti i componenti rimangono flessibili ed espandibili, anche al di là dei confini aziendali tradizionali.

Coloro che hanno il coraggio di familiarizzare con questi strumenti creano le basi per sistemi di IA indipendenti e locali con un reale valore di utilità - in uno spirito di controllo, sovranità e chiarezza tecnica.


Argomenti attuali sul software ERP

Domande frequenti su RAG con Ollama + Qdrant

1. Cos'è un database RAG e a cosa serve?

Un database RAG (Retrieval Augmented Generation) combina un database vettoriale con un modello linguistico. Consente di rendere semanticamente ricercabili i propri contenuti, ad esempio la documentazione o i siti web, in modo che i modelli di intelligenza artificiale possano accedere in modo specifico alle sezioni pertinenti del proprio database.

2 Cosa significa "chunking" in questo contesto?

Il chunking consiste nel suddividere testi lunghi in sezioni (chunks) più piccole e coerenti, di solito tra i 200 e i 500 caratteri. In questo modo, le singole sezioni di testo possono essere salvate in modo efficiente nel database vettoriale e recuperate in un secondo momento in caso di domande.

3. Perché non è possibile salvare interi testi in Qdrant?

Perché i modelli di intelligenza artificiale e le ricerche vettoriali funzionano con testi di lunghezza limitata. Documenti di grandi dimensioni potrebbero "nascondere" contenuti importanti o renderli imprecisi. Il chunking aumenta l'accuratezza perché vengono confrontate sezioni specifiche anziché testi completi.

4. Posso utilizzare contenuti provenienti da qualsiasi fonte?

Sì, purché si disponga di testi in forma modificabile (ad esempio come testo semplice, HTML, Markdown, PDF, voci FileMaker, ecc.), è possibile prepararli, suddividerli e integrarli in Qdrant. Sono possibili anche fonti miste.

5. Devo essere in grado di programmare per costruire un sistema di questo tipo?

La conoscenza di base del terminale e di Python è utile, ma non essenziale. Molti passaggi (ad esempio, il chunking in FileMaker, l'esportazione JSON) possono essere implementati visivamente e automaticamente. Lo script di importazione di Qdrant può essere facilmente personalizzato.

6. Posso gestire anche più documenti o categorie?

Sì, ogni brano può contenere metadati, ad esempio titolo, fonte, lingua o categoria. Questi possono essere presi in considerazione durante la ricerca per filtrare i risultati in modo più specifico.

7 Quali modelli sono adatti alla generazione di embedding?

È possibile utilizzare un modello locale tramite Ollama (ad esempio mistral, llama2, gemma) o un modello di incorporamento separato, come all-MiniLM di sentence-transformers. È importante che il modello generi gli output di incorporazione come vettori.

8. Come si avvia Qdrant sul Mac?

Il modo più semplice è tramite il comando Docker:

docker run -p 6333:6333 -v qdrant_storage:/qdrant/storage qdrant/qdrant

Qdrant viene quindi eseguito sotto http://localhost:6333

9. Quanto possono essere grandi i miei volumi di dati?

Qdrant è molto performante e può facilmente gestire decine o centinaia di migliaia di chunk. La limitazione principale è rappresentata dalla RAM e dallo spazio di archiviazione, non dal numero.

10. funziona anche con l'FileMaker?

Sì, è possibile eseguire tutte le operazioni di chunking e di esportazione JSON direttamente in FileMaker. I chunks vengono esportati come singoli file JSON, che vengono poi importati in Qdrant tramite uno script Python, in modo completamente indipendente dal sistema originale.

11. Posso eseguire questa operazione anche su un altro server invece che su Mac?

Assolutamente sì. La configurazione funziona anche su server Linux, Raspberry Pi o nel cloud (se lo si desidera). Docker lo rende indipendente dalla piattaforma. Per un uso produttivo, di solito si consiglia un server con più RAM e supporto GPU.

12. Come posso combinare la ricerca vettoriale con Ollama?

Per prima cosa si crea un vettore per una domanda dell'utente tramite Ollama (Embedding API), lo si utilizza per cercare i pezzi più rilevanti in Qdrant e li si fornisce al modello linguistico come contesto. Ollama elabora quindi la domanda + le informazioni rilevanti per il contesto e genera una risposta fondata.

Immagine (c) geralt @ pixabay

Lascia un commento