pm83dev/rag-server

demo rag con upload documenti e ricerca embedding

C#

0

4 commits

updated Jul 29, 2026

See the code

README

PM RAG Server

Sistema RAG (Retrieval-Augmented Generation) basato su .NET 8 e Angular per l'indicizzazione di documenti PDF e il retrieval semantico con vettori embedding.

๐Ÿ“‹ Struttura del Progetto

rag-server/
โ”œโ”€โ”€ RagBackend/              # Backend API (.NET 8 ASP.NET Core)
โ”‚   โ”œโ”€โ”€ Services/            # Servizi (Embedding, Chat, VectorStore)
โ”‚   โ”œโ”€โ”€ Models/              # Modelli dati
โ”‚   โ”œโ”€โ”€ Dockerfile           # Container Docker per il backend
โ”‚   โ”œโ”€โ”€ appsettings.json     # Configurazione
โ”‚   โ””โ”€โ”€ web.config           # Configurazione IIS
โ”œโ”€โ”€ rag-frontend/            # Frontend Angular (v22)
โ”‚   โ”œโ”€โ”€ src/app/             # Applicazione Angular
โ”‚   โ””โ”€โ”€ package.json         # Dipendenze frontend
โ”œโ”€โ”€ docker-compose.yml       # Orchestrazione servizi (Qdrant DB)
โ”œโ”€โ”€ _check/                  # Progetto di test check
โ”œโ”€โ”€ _inspect/                # Progetto di test inspect
โ”œโ”€โ”€ _ns/                     # Progetto di test ns
โ””โ”€โ”€ readme.md                # Questo file

๐Ÿ—๏ธ Architettura

Il sistema รจ composto da:

  • RagBackend: API REST in .NET 8 che gestisce indicizzazione, ricerca e chat
  • Qdrant: Vector Database per il storage dei vettori di embedding (container Docker)
  • llama.cpp Server: Server per generazione embedding e chat (configurabile esternamente)
  • Rag-Frontend: Interfaccia Angular per interazione utente

๐Ÿ“ฆ Requisiti

๐Ÿš€ Avvio Rapido

1. Avviare Qdrant (Vector Database)

docker-compose up -d qdrant

Qdrant sarร  disponibile su http://localhost:6333 (gRPC) e http://localhost:6334 (HTTP API).

2. Configurare il Server di Embedding

Avviare il server llama.cpp per gli embedding con il modello nomic-embed-text:

.\llama-server.exe -m .\models\nomic-embed_text-Q8_0.gguf --embedding --host 0.0.0.0 --port 1337

Nota: Aggiornare l'URL in RagBackend/appsettings.json se il server non รจ in locale:

{
  "LlamaCppEmbeddingServer": {
    "Url": "http://your-embedding-server-ip:1337"
  }
}

3. Avviare il Backend

cd RagBackend
dotnet run

Il backend sarร  disponibile su http://localhost:5000 (o la porta configurata).

4. Avviare il Frontend

cd rag-frontend
npm install
ng serve

Il frontend sarร  disponibile su http://localhost:4200.

โš™๏ธ Configurazione

RagBackend/appsettings.json

{
  "Qdrant": {
    "Url": "http://localhost:6334"
  },
  "LlamaCppEmbeddingServer": {
    "Url": "http://100.78.184.121:1337"
  },
  "LlamaCppChatServer": {
    "Url": "http://100.90.112.22:9000"
  },
  "EmbeddingModel": {
    "Name": "nomic-embed-text-v1.5"
  },
  "Cors": {
    "AllowedOrigins": ["*"]
  }
}
SettingDescrizioneDefault
Qdrant:UrlURL del server Qdranthttp://localhost:6334
LlamaCppEmbeddingServer:UrlURL del server embedding llama.cpphttp://100.78.184.121:1337
LlamaCppChatServer:UrlURL del server chat llama.cpphttp://100.90.112.22:9000
EmbeddingModel:NameNome del modello embeddingnomic-embed-text-v1.5
Cors:AllowedOriginsOrigini CORS consentite["*"]

๐Ÿ“ก API Endpoints

Indicizzazione Contenuto Testuale

POST /api/index?content=Testo%20da%20indicizzare
Content-Type: text/plain

Divide il testo in chunk e li indicizza nel vettore store.

Risposta:

{
  "message": "Indicizzati N chunk."
}

Upload PDF

POST /api/upload-pdf
Content-Type: multipart/form-data

file: <pdf_file>

Carica un PDF, estrae il testo, genera embedding e li indicizza in background.

Risposta: (202 Accepted)

{
  "jobId": "unique-job-id"
}

Stato Indicizzazione

GET /api/upload-status/{jobId}

Risposta:

{
  "jobId": "unique-job-id",
  "fileName": "documento.pdf",
  "status": "Processing|Completed|Failed",
  "totalChunks": 10,
  "processedChunks": 5,
  "errorMessage": null
}

Ricerca Semantica

GET /api/search?query=testo%20ricerca

Risposta:

[
  {
    "id": "uuid",
    "score": 0.85,
    "metadata": {
      "content": "...",
      "source": "documento.pdf"
    }
  }
]

Chat con Contesto RAG

GET /api/ask?question=La%20tua%20domanda

Combina ricerca semantica e generazione LLM per risposte contestuali.

Risposta:

{
  "answer": "Testo della risposta generata dal modello...",
  "sources": [
    {
      "id": "uuid",
      "score": 0.85
    }
  ]
}

Elenco Documenti Indicizzati

GET /api/documents

Risposta:

[
  {
    "source": "documento.pdf",
    "chunks": 10
  }
]

Eliminazione Documento

DELETE /api/documents/{source}

Elimina tutti i chunk associati a un documento sorgente.

Risposta:

{
  "message": "Eliminati N chunk del documento 'documento.pdf'."
}

๐Ÿ”ง Servizi

IEmbeddingService

Interfaccia per la generazione di vettori embedding. Supporta singolo testo e batch.

IVectorStoreService

Interfaccia per operazioni sul vector store Qdrant (Upsert, Search, DeleteBySource, ListSources).

IChatService

Interfaccia per interazione con il server chat llama.cpp.

๐Ÿณ Docker Deployment

Build e avvio del backend

docker build -t rag-backend -f RagBackend/Dockerfile .
docker run -p 8080:8080 -p 8081:8081 rag-backend

Avvio completo con docker-compose

docker-compose up -d

Questo avvia automaticamente Qdrant. Il backend va avviato separatamente.

๐Ÿ“ Note Tecniche

  • Chunking: I documenti vengono divisi in chunk di max 500 caratterchi con overlap di 50
  • Batch Processing: Gli embedding vengono generati in batch da 20 elementi
  • Background Jobs: L'indicizzazione PDF avviene in background per evitare timeout
  • CORS: Configurabile tramite Cors:AllowedOrigins in appsettings.json
  • Limite File: 200 MB per upload PDF (configurabile)

๐Ÿงช Test Projects

ProgettoDescrizione
_check/Progetto di test per verifiche
_inspect/Progetto di test per ispezione
_ns/Progetto di test ns

๐Ÿ“„ Licenza

[Da specificare]

pm83dev/rag-server

demo rag con upload documenti e ricerca embedding

C#

0

4 commits

updated Jul 29, 2026

See the code

README

PM RAG Server

Sistema RAG (Retrieval-Augmented Generation) basato su .NET 8 e Angular per l'indicizzazione di documenti PDF e il retrieval semantico con vettori embedding.

๐Ÿ“‹ Struttura del Progetto

rag-server/
โ”œโ”€โ”€ RagBackend/              # Backend API (.NET 8 ASP.NET Core)
โ”‚   โ”œโ”€โ”€ Services/            # Servizi (Embedding, Chat, VectorStore)
โ”‚   โ”œโ”€โ”€ Models/              # Modelli dati
โ”‚   โ”œโ”€โ”€ Dockerfile           # Container Docker per il backend
โ”‚   โ”œโ”€โ”€ appsettings.json     # Configurazione
โ”‚   โ””โ”€โ”€ web.config           # Configurazione IIS
โ”œโ”€โ”€ rag-frontend/            # Frontend Angular (v22)
โ”‚   โ”œโ”€โ”€ src/app/             # Applicazione Angular
โ”‚   โ””โ”€โ”€ package.json         # Dipendenze frontend
โ”œโ”€โ”€ docker-compose.yml       # Orchestrazione servizi (Qdrant DB)
โ”œโ”€โ”€ _check/                  # Progetto di test check
โ”œโ”€โ”€ _inspect/                # Progetto di test inspect
โ”œโ”€โ”€ _ns/                     # Progetto di test ns
โ””โ”€โ”€ readme.md                # Questo file

๐Ÿ—๏ธ Architettura

Il sistema รจ composto da:

  • RagBackend: API REST in .NET 8 che gestisce indicizzazione, ricerca e chat
  • Qdrant: Vector Database per il storage dei vettori di embedding (container Docker)
  • llama.cpp Server: Server per generazione embedding e chat (configurabile esternamente)
  • Rag-Frontend: Interfaccia Angular per interazione utente

๐Ÿ“ฆ Requisiti

๐Ÿš€ Avvio Rapido

1. Avviare Qdrant (Vector Database)

docker-compose up -d qdrant

Qdrant sarร  disponibile su http://localhost:6333 (gRPC) e http://localhost:6334 (HTTP API).

2. Configurare il Server di Embedding

Avviare il server llama.cpp per gli embedding con il modello nomic-embed-text:

.\llama-server.exe -m .\models\nomic-embed_text-Q8_0.gguf --embedding --host 0.0.0.0 --port 1337

Nota: Aggiornare l'URL in RagBackend/appsettings.json se il server non รจ in locale:

{
  "LlamaCppEmbeddingServer": {
    "Url": "http://your-embedding-server-ip:1337"
  }
}

3. Avviare il Backend

cd RagBackend
dotnet run

Il backend sarร  disponibile su http://localhost:5000 (o la porta configurata).

4. Avviare il Frontend

cd rag-frontend
npm install
ng serve

Il frontend sarร  disponibile su http://localhost:4200.

โš™๏ธ Configurazione

RagBackend/appsettings.json

{
  "Qdrant": {
    "Url": "http://localhost:6334"
  },
  "LlamaCppEmbeddingServer": {
    "Url": "http://100.78.184.121:1337"
  },
  "LlamaCppChatServer": {
    "Url": "http://100.90.112.22:9000"
  },
  "EmbeddingModel": {
    "Name": "nomic-embed-text-v1.5"
  },
  "Cors": {
    "AllowedOrigins": ["*"]
  }
}
SettingDescrizioneDefault
Qdrant:UrlURL del server Qdranthttp://localhost:6334
LlamaCppEmbeddingServer:UrlURL del server embedding llama.cpphttp://100.78.184.121:1337
LlamaCppChatServer:UrlURL del server chat llama.cpphttp://100.90.112.22:9000
EmbeddingModel:NameNome del modello embeddingnomic-embed-text-v1.5
Cors:AllowedOriginsOrigini CORS consentite["*"]

๐Ÿ“ก API Endpoints

Indicizzazione Contenuto Testuale

POST /api/index?content=Testo%20da%20indicizzare
Content-Type: text/plain

Divide il testo in chunk e li indicizza nel vettore store.

Risposta:

{
  "message": "Indicizzati N chunk."
}

Upload PDF

POST /api/upload-pdf
Content-Type: multipart/form-data

file: <pdf_file>

Carica un PDF, estrae il testo, genera embedding e li indicizza in background.

Risposta: (202 Accepted)

{
  "jobId": "unique-job-id"
}

Stato Indicizzazione

GET /api/upload-status/{jobId}

Risposta:

{
  "jobId": "unique-job-id",
  "fileName": "documento.pdf",
  "status": "Processing|Completed|Failed",
  "totalChunks": 10,
  "processedChunks": 5,
  "errorMessage": null
}

Ricerca Semantica

GET /api/search?query=testo%20ricerca

Risposta:

[
  {
    "id": "uuid",
    "score": 0.85,
    "metadata": {
      "content": "...",
      "source": "documento.pdf"
    }
  }
]

Chat con Contesto RAG

GET /api/ask?question=La%20tua%20domanda

Combina ricerca semantica e generazione LLM per risposte contestuali.

Risposta:

{
  "answer": "Testo della risposta generata dal modello...",
  "sources": [
    {
      "id": "uuid",
      "score": 0.85
    }
  ]
}

Elenco Documenti Indicizzati

GET /api/documents

Risposta:

[
  {
    "source": "documento.pdf",
    "chunks": 10
  }
]

Eliminazione Documento

DELETE /api/documents/{source}

Elimina tutti i chunk associati a un documento sorgente.

Risposta:

{
  "message": "Eliminati N chunk del documento 'documento.pdf'."
}

๐Ÿ”ง Servizi

IEmbeddingService

Interfaccia per la generazione di vettori embedding. Supporta singolo testo e batch.

IVectorStoreService

Interfaccia per operazioni sul vector store Qdrant (Upsert, Search, DeleteBySource, ListSources).

IChatService

Interfaccia per interazione con il server chat llama.cpp.

๐Ÿณ Docker Deployment

Build e avvio del backend

docker build -t rag-backend -f RagBackend/Dockerfile .
docker run -p 8080:8080 -p 8081:8081 rag-backend

Avvio completo con docker-compose

docker-compose up -d

Questo avvia automaticamente Qdrant. Il backend va avviato separatamente.

๐Ÿ“ Note Tecniche

  • Chunking: I documenti vengono divisi in chunk di max 500 caratterchi con overlap di 50
  • Batch Processing: Gli embedding vengono generati in batch da 20 elementi
  • Background Jobs: L'indicizzazione PDF avviene in background per evitare timeout
  • CORS: Configurabile tramite Cors:AllowedOrigins in appsettings.json
  • Limite File: 200 MB per upload PDF (configurabile)

๐Ÿงช Test Projects

ProgettoDescrizione
_check/Progetto di test per verifiche
_inspect/Progetto di test per ispezione
_ns/Progetto di test ns

๐Ÿ“„ Licenza

[Da specificare]