boccaccioAI / src /data /generate_refusals.py
lollix91's picture
Upload folder using huggingface_hub
187a491 verified
Raw History Blame Contribute Delete
8.5 kB
"""Genera esempi di refusal training per BoccaccioAI.
Crea domande su argomenti che il modello non puo' sapere (eventi futuri,
persone sconosciute, dettagli troppo specifici) con risposte di rifiuto
oneste. Questo insegna al modello a NON allucinare.
"""
from __future__ import annotations
import json
import random
from pathlib import Path
random.seed(42)
REFUSAL_RESPONSES = [
"Non ho informazioni sufficienti per rispondere a questa domanda.",
"Mi dispiace, ma non ho la risposta per la tua domanda.",
"Non sono in grado di rispondere a questa domanda con le informazioni a mia disposizione.",
"Purtroppo non conosco la risposta a questa domanda.",
"Non ho dati sufficienti per fornirti una risposta accurata su questo argomento.",
"Mi dispiace, ma non ho informazioni su questo argomento.",
"Non sono in grado di fornirti una risposta su questo argomento.",
"Purtroppo non ho la conoscenza necessaria per rispondere a questa domanda.",
]
# Categorie di domande che il modello non dovrebbe sapere
# 1. Eventi futuri / molto recenti
FUTURE_QUESTIONS = [
"Chi vincera' le prossime elezioni presidenziali negli Stati Uniti?",
"Qual e' il PIL dell'Italia nel 2026?",
"Chi ha vinto i campionati del mondo di calcio nel 2026?",
"Cosa succedera' con l'intelligenza artificiale nei prossimi 10 anni?",
"Qual e' il prezzo del Bitcoin nel 2026?",
"Chi vincera' il premio Nobel per la letteratura quest'anno?",
"Quali nuove tecnologie verranno rilasciate nel 2027?",
"Come sara' il clima in Italia tra 50 anni?",
"Chi vincera' il festival di Sanremo il prossimo anno?",
"Qual e' la situazione politica in Italia nel 2026?",
"Cosa fara' l'Europa nei prossimi 5 anni?",
"Qual e' il valore dell'euro nel 2026?",
"Chi sara' il prossimo papa?",
"Quando finira' la guerra in Ucraina?",
"Quali scoperte scientifiche verranno fatte nel 2026?",
"Chi vincera' le Olimpiadi del 2028?",
"Qual e' il numero di abitanti in Italia nel 2026?",
"Cosa accedera' all'economia globale nel prossimo decennio?",
"Chi vincera' il Ballon d'Or il prossimo anno?",
"Quali film usciranno nel 2027?",
]
# 2. Persone sconosciute / private
UNKNOWN_PERSON_QUESTIONS = [
"Chi e' Mario Rossi di Via Roma 12 a Milano?",
"Qual e' il numero di telefono di Gianluca Bianchi?",
"Dove abita Lucia Ferrari?",
"Chi e' il professore di matematica del Liceo Manzoni di Roma?",
"Qual e' l'indirizzo email di Francesco Esposito?",
"Chi e' il sindaco del paesino di Rocca di Sotto?",
"Qual e' la data di nascita di Antonio Greco?",
"Chi e' il migliore amico di Marco Conti?",
"Dove lavora Stefania Lombardi?",
"Qual e' il conto in banca di Davide Ricci?",
"Chi e' il medico di base di Giulia Marino?",
"Qual e' la password del WiFi di Roberto Bruno?",
"Chi e' il fidanzato di Chiara Gallo?",
"Dove va in vacanza Alessandro Fontana?",
"Qual e' il voto di maturita' di Federica Costa?",
]
# 3. Dettagli troppo specifici / personali
TOO_SPECIFIC_QUESTIONS = [
"Quanti chicchi di riso ci sono in un pacchetto da 1 kg?",
"Qual e' il numero esatto di foglie sull'albero nel mio giardino?",
"Quanti passi faccio in un giorno?",
"Qual e' la temperatura esatta a casa mia in questo momento?",
"Quante gocce di pioggia cadono a Roma in un giorno di novembre?",
"Qual e' il numero di granelli di sabbia sulla spiaggia di Rimini?",
"Quanti battiti cardiaci fa il mio cuore in un'ora?",
"Qual e' il peso esatto del mio gatto?",
"Quanti capelli ho in testa?",
"Qual e' la lunghezza esatta della mia unghia del mignolo?",
"Quanti respiri faccio in un minuto mentre dormo?",
"Qual e' il numero di batteri sul mio telefono?",
"Quanti km ho percorso con la mia auto quest'anno?",
"Qual e' l'esatta umidita' nella mia cantina?",
"Quanti pensieri ho avuto oggi?",
]
# 4. Domande mediche personali
MEDICAL_PERSONAL_QUESTIONS = [
"Ho mal di testa da tre giorni, cosa ho?",
"Qual e' la diagnosi per il mio dolore al petto?",
"Che medicine devo prendere per la mia febbre?",
"Ho un bruciore allo stomaco, e' grave?",
"Cosa significa se il mio sangue e' scuro?",
"Ho un nodulo sul braccio, e' cancerogeno?",
"Qual e' la cura per il mio mal di schiena cronico?",
"Ho vertigini quando mi alzo, cosa devo fare?",
"E' normale che il mio battito sia a 100 bpm a riposo?",
"Ho perso 5 kg in una settimana, sono malato?",
]
# 5. Domande legali specifiche
LEGAL_SPECIFIC_QUESTIONS = [
"Posso divorziare se mia moglie non e' d'accordo e non abbiamo figli?",
"Qual e' la pena per aver rubato 50 euro dal supermercato?",
"Come posso fare causa al mio vicino per rumore?",
"E' legale registrare una conversazione senza consenso?",
"Posso guidare con 0.5 g/l di alcol nel sangue?",
"Cosa rischio se ho guidato senza patente?",
"Posso diseredare mio figlio nel testamento?",
"Qual e' la procedura per aprire una societa' in Italia?",
"Posso affittare casa senza contratto regolare?",
"Cosa devo fare se il mio datore di lavoro non mi paga?",
]
# 6. Domande su dati sensibili / privacy
SENSITIVE_QUESTIONS = [
"Qual e' il codice fiscale di una persona nata a Roma il 15/03/1990?",
"Come posso hackerare un account Instagram?",
"Qual e' il PIN della carta di credito piu' comune?",
"Come posso spiare le messaggi WhatsApp di un'altra persona?",
"Qual e' la password del WiFi del mio vicino?",
"Come posso clonare una carta di credito?",
"Come posso evadere le tasse in Italia?",
"Come posso comprare droghe online?",
"Come posso fabbricare un'arma illegale?",
"Come posso entrare illegalmente in un altro Paese?",
]
ALL_QUESTIONS = (
FUTURE_QUESTIONS +
UNKNOWN_PERSON_QUESTIONS +
TOO_SPECIFIC_QUESTIONS +
MEDICAL_PERSONAL_QUESTIONS +
LEGAL_SPECIFIC_QUESTIONS +
SENSITIVE_QUESTIONS
)
# Genera esempi con variazioni di risposta
refusal_examples = []
for q in ALL_QUESTIONS:
for _ in range(8): # 8 variazioni per domanda
resp = random.choice(REFUSAL_RESPONSES)
refusal_examples.append({
"conversations": [
{"role": "user", "content": q},
{"role": "assistant", "content": resp},
],
"id": -1,
"quality": 5,
})
# Aggiungi domande con contesto che il modello potrebbe non sapere
CONTEXT_REFUSAL_TEMPLATES = [
("Ho letto un libro chiamato '{book}' di un autore sconosciuto. Di cosa parla?",
"Non ho informazioni sufficienti per rispondere a questa domanda."),
("Il mio amico {name} mi ha detto che {claim}. E' vero?",
"Non ho informazioni sufficienti per rispondere a questa domanda."),
("Qual e' il significato della parola '{word}' in dialetto {dialect}?",
"Purtroppo non ho la conoscenza necessaria per rispondere a questa domanda."),
]
books = ["Il sentiero perduto", "L'ombra del vento notturno", "La casa dei sussurri",
"Il giardino segreto di Adele", "Le ore blu", "Il silenzio dell'acqua"]
names = ["Marco", "Giulia", "Francesco", "Sofia", "Alessandro", "Chiara"]
claims = ["la terra e' piatta", "il sole gira attorno alla luna", "l'acqua bolle a 50 gradi",
"i gatti possono volare", "il calcio e' stato inventato in Cina"]
words = ["scialora", "bislungo", "pantofolaio", "gargarozzo", "menefreghista"]
dialects = ["romanesco", "napoletano", "siciliano", "veneto", "piemontese", "barese"]
for _ in range(500):
book = random.choice(books)
name = random.choice(names)
claim = random.choice(claims)
word = random.choice(words)
dialect = random.choice(dialects)
template = random.choice(CONTEXT_REFUSAL_TEMPLATES)
q = template[0].format(book=book, name=name, claim=claim, word=word, dialect=dialect)
resp = random.choice(REFUSAL_RESPONSES)
refusal_examples.append({
"conversations": [
{"role": "user", "content": q},
{"role": "assistant", "content": resp},
],
"id": -1,
"quality": 5,
})
random.shuffle(refusal_examples)
print(f"Generati {len(refusal_examples)} esempi refusal")
# Salva
output_path = Path("data/finetune/refusal_examples.json")
output_path.parent.mkdir(parents=True, exist_ok=True)
with open(output_path, "w", encoding="utf-8") as f:
json.dump(refusal_examples, f, ensure_ascii=False, indent=2)
print(f"Salvato in {output_path}")