Download src/data/generate_refusals.py from lollix91/boccaccioAI: direct link, hf CLI and curl.
- Browser
- Download file 8.5 kB
-
https://huggingface.co/lollix91/boccaccioAI/resolve/main/src/data/generate_refusals.py
- Command line
-
hf download hf://lollix91/boccaccioAI/src/data/generate_refusals.py
-
curl -L -o generate_refusals.py https://huggingface.co/lollix91/boccaccioAI/resolve/main/src/data/generate_refusals.py
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}") | |