Guida Progetto · Percorso Python

Chatbot Documentale con RAG

Costruisci un assistente che risponde a domande sui tuoi documenti, invece che sulla sua memoria generica.

0 di 6 passaggi completati

01Obiettivo del Progetto

Cosa costruirai

Un piccolo assistente che legge un documento di testo a tua scelta (i tuoi appunti, una dispensa, un manuale), lo indicizza in un vector database, e risponde alle tue domande basandosi solo su quel contenuto — non su ciò che il modello "ricorda" genericamente.

Prerequisiti — guide da cui questo progetto attinge

Guida 6Gestione File — per leggere il documento
Guida 18API e SDK Anthropic
Guida 19Embeddings e Vector Database
Guida 20Costruire un sistema RAG

02Passo dopo Passo

Spunta ogni passaggio man mano che lo completi: sbloccherai l'attestato del progetto al termine.

Passo 1 — Codice

with open("appunti.txt", "r", encoding="utf-8") as f:
    testo = f.read()

print(f"Documento caricato: {len(testo)} caratteri")
1. Carica il tuo documentoPrepara un file .txt di almeno 500 parole (appunti, dispensa) e leggilo, come nel passo sopra.

Passo 2 — Codice

def dividi_in_chunk(testo, dimensione=150):
    parole = testo.split()
    return [" ".join(parole[i:i+dimensione]) for i in range(0, len(parole), dimensione)]

chunk = dividi_in_chunk(testo)
print(f"{len(chunk)} chunk creati")
2. Dividi il documento in chunkApplica il chunking come nel Passo 2 (dimensione consigliata: 100-200 parole).

Passo 3 — Codice

import chromadb

client = chromadb.Client()
collezione = client.create_collection("i_miei_appunti")
collezione.add(
    documents=chunk,
    ids=[f"chunk_{i}" for i in range(len(chunk))]
)
3. Indicizza i chunk in ChromaCrea la collezione e aggiungi i chunk come nel Passo 3.

Passo 4 — Codice

def recupera_contesto(domanda, n=3):
    risultati = collezione.query(query_texts=[domanda], n_results=n)
    return "\n\n".join(risultati["documents"][0])
4. Scrivi la funzione di recuperoCrea recupera_contesto() come nel Passo 4.

Passo 5 — Codice

import anthropic
client = anthropic.Anthropic(api_key=chiave)

def chiedi(domanda):
    contesto = recupera_contesto(domanda)
    prompt = f"""Rispondi alla domanda usando solo queste informazioni.
Se non trovi la risposta nel testo, dillo chiaramente.

Contesto:
{contesto}

Domanda: {domanda}"""
    risposta = client.messages.create(
        model="claude-sonnet-4-5", max_tokens=400,
        messages=[{"role": "user", "content": prompt}]
    )
    return risposta.content[0].text
5. Costruisci la funzione chiedi()Combina recupero e chiamata al modello come nel Passo 5.

Passo 6 — Codice

while True:
    domanda = input("\nFai una domanda (o scrivi 'esci'): ")
    if domanda.lower() == "esci":
        break
    print(chiedi(domanda))
6. Crea il ciclo di conversazioneUsa un ciclo while per interrogare ripetutamente il tuo chatbot, come nel Passo 6.

03Sfide ed Estensioni

Sfida 1

Cita la fonte

Modifica la funzione chiedi() per stampare anche quale chunk è stato usato per rispondere, così puoi verificare la tracciabilità della risposta.

⏱ 20 minuti🖥️ Individuale
Sfida 2

Documenti multipli

Estendi il progetto per indicizzare 2-3 documenti diversi nella stessa collezione, aggiungendo un campo "fonte" a ogni chunk per sapere da quale documento proviene ogni risposta.

⏱ 30 minuti🖥️ Individuale
Sfida 3

Interfaccia Streamlit

Usando quanto imparato nella guida sul Deployment, trasforma questo chatbot da riga di comando a una piccola app web con Streamlit.

⏱ 40 minuti🖥️ Individuale

🎓 Attestato di completamento progetto

Completa tutti i 6 passaggi per sbloccare il tuo attestato in PDF.

0 / 6 passaggi completati