con chatGPT mi sono scritto una webapi a cui passo una richiesta in linguaggio naturale e che mi restituisce un json di registrazioni contabili semi-pronte.
Esempio:
{
“conversationId”: “58c7db19…”,
“text”: “da cancelleria a cassa 25,50€ 5 blocchi notes grandi”,
“sender”: “user”,
“operation”: “prima_nota_intent”,
“ui”: {
“screen”: “PrimaNota”,
“mode”: “inserimento”,
“recordId”: “”,
“tab”: “registrazioni”
}
}
in ui passo lo stato, la mia form, la modalità, eventuale id della prima nota corrente, e la tab della tabbed, sto andando per tentativi.
Response body
{
"conversationId": "58c7db1928d24f3b89b4dce6fb934d4a",
"answer": "",
"jsonOutput": "{\"dataRegistrazione\":null,\"esercizio\":null,\"causaleSuggerita\":\"Acquisto cancelleria pagato in contanti\",\"descrizione\":\"5 blocchi notes grandi\",\"importo\":25.5,\"contoDareTesto\":\"Cancelleria\",\"contoAvereTesto\":\"Cassa\",\"missingFields\":[\"dataRegistrazione\"]}",
"intent": {
"dataRegistrazione": null,
"esercizio": null,
"causaleSuggerita": "Acquisto cancelleria pagato in contanti",
"descrizione": "5 blocchi notes grandi",
"importo": 25.5,
"contoDareTesto": "Cancelleria",
"contoAvereTesto": "Cassa",
"missingFields": [
"dataRegistrazione"
]
},
"parseError": null,
"ok": true,
"error": null
}
al momento non ho aggiunto la ricerca dei conti (Cancelleria e Cassa) anche perché se devo dare all’LLM un tool per cercarli tanto vale che me li cerco con InDe, però InDe non mi interpreta il linguaggio naturale cosa che faccio fare all’LLM e già questo è un aiuto notevole.
Mi sono fatto scrivere una webapi .NET CORE, non ho capito molto di quello che ho scritto (bovinamente) però non è che mi interessi molto, funziona!!! Diciamo che l’ha scritto un mio collega esperto in .NET!!! Io sono lo sviluppatore InDe. ![]()
Adesso in InDe ho i dati per la mia registrazione:
cerco i conti nel PDC, la causale, aggiorno la videata e lascio che l’utente la confermi o modifichi.
Response body
{
"conversationId": "58c7db1928d24f3b89b4dce6fb934d4a",
"answer": "",
"jsonOutput": "{\"dataRegistrazione\":null,\"esercizio\":null,\"causaleSuggerita\":\"Acquisto cancelleria pagato in contanti\",\"descrizione\":\"5 blocchi notes grandi\",\"importo\":25.5,\"contoDareTesto\":\"Cancelleria\",\"contoAvereTesto\":\"Cassa\",\"missingFields\":[\"dataRegistrazione\"]}",
"intent": {
"dataRegistrazione": null,
"esercizio": null,
"causaleSuggerita": "Acquisto cancelleria pagato in contanti",
"descrizione": "5 blocchi notes grandi",
"importo": 25.5,
"contoDareTesto": "Cancelleria",
"contoAvereTesto": "Cassa",
"missingFields": [
"dataRegistrazione"
]
},
"parseError": null,
"ok": true,
"error": null
}
ho provato anche così, senza specificare i conti
“text”: “registra 25,50€ in contanti per 5 blocchi notes grandi”
Risultato
"intent": {
"dataRegistrazione": null,
"esercizio": null,
"causaleSuggerita": "Acquisto cancelleria pagata in contanti",
"contoDareMastro": null,
"contoDareConto": null,
"contoDareSottoconto": null,
"contoAvereMastro": 10,
"contoAvereConto": 1,
"contoAvereSottoconto": 1,
"descrizione": "Acquisto 5 blocchi notes grandi pagati in contanti",
"importo": 25.5,
"contoDareTesto": "Spese cancelleria / materiale di consumo (da verificare nel piano dei conti)",
"contoAvereTesto": "Cassa contanti",
"missingFields": [
"dataRegistrazione",
"contoDare (codice non trovato: non esiste una voce 'cancelleria' nel piano dei conti)"
]
}
Rendere lo strumento generico
Siccome è fatica costruire lo strumento ho chiesto a chatGPT di renderlo generico, quindi devo poterlo usare con un DB qualsias, e non solo per la contabilità ma per qualsiasi applicativo.
Dopo le modifiche i tests e le correzioni e le ottimizzaizoni e tutti i consigli ricevuti da chatGPT funziona ancora, interessante la diagnostica:
Questa è la mia chiamata in cui ho inserito nel contesto l'esercizio perché l'utente di sicuro non lo scrive e l'LLM lo usa perché nle PDC fa parte della chiave:
{
"conversationId": "14b535a415ff4fa9abf9e7dbbbed0d5a",
"text": "da cancelleria a cassa 25,50€ 5 blocchi notes grandi",
"mode": "production",
"draftDocId": "",
"sender": "user",
"operation": "prima_nota_intent",
"ui": {
"screen": "PrimaNota",
"mode": "inserimento",
"recordId": "",
"tab": "registrazioni"
},
"context": {
"esercizio": 2025
}
}
"intent": {
"dataRegistrazione": null,
"esercizio": "2025",
"causaleSuggerita": "Acquisto cancelleria pagato in contanti",
"contoDareMastro": null,
"contoDareConto": null,
"contoDareSottoconto": null,
"contoAvereMastro": 10,
"contoAvereConto": 1,
"contoAvereSottoconto": 1,
"descrizione": "Acquisto 5 blocchi notes grandi (cancelleria) pagato in cassa",
"importo": 25.5,
"contoDareTesto": "Cancelleria",
"contoAvereTesto": "Cassa contanti",
"missingFields": [
"dataRegistrazione",
"contoDare",
"contoAvere"
],
"diagnostics": [
"La data di registrazione non è indicata: senza data non posso valorizzare dataRegistrazione.",
"I codici Mastro/Conto/Sottoconto per 'Cancelleria' non sono presenti nel contesto: servono dal piano dei conti aziendale (da cercare su DB/manuale) per compilare contoDare*."
]