La prima domanda che ci si potrebbe chiedere è perché non utilizzare semplicemente l’interfaccia ChatGPT e porre domande. È stato addestrato su un enorme volume di dati Internet generati fino al 2021, quindi gli è noto un corpus di testi come il Mahabharata.
Questo è stato il mio primo approccio. Ho posto al ChatGPT diverse domande sul Mahabharata. Ho avuto buone risposte ad alcune domande. Tuttavia, nella maggior parte dei casi mancano di rigore. E questo è previsto. Il GPT viene addestrato su set di dati generali. Può benissimo comprendere e interpretare i linguaggi naturali. Può anche ragionare abbastanza bene. Tuttavia, non è un esperto in alcun dominio specifico. Quindi, anche se potrebbe avere una certa conoscenza del Mahabharata, potrebbe non rispondere con risposte approfondite. A volte il GPT potrebbe non avere alcuna risposta. In questi casi, o si rifiuta umilmente di rispondere alla domanda, oppure la inventa con sicurezza (allucinazioni).
Il secondo modo più ovvio per ottenere KBQA è utilizzare un prompt QA di recupero. È qui che LangChain inizia ad essere estremamente utile.
QA sul recupero
Per chi non ha familiarità con la libreria LangChain, è uno dei modi migliori per utilizzare LLM come GPT nel codice. Ecco un’implementazione di KBQA utilizzando LangChain.
Per riassumere, ecco i passaggi per ottenere KBQA su qualsiasi corpo di documenti
- Suddividi la knowledge base in blocchi di testo.
- Crea una rappresentazione numerica (Embeddings) per ogni blocco e salvala in un database vettoriale.
Se i tuoi dati sono statici, i passaggi 1 e 2 sono operazioni una tantum. - Esegui una ricerca semantica utilizzando la query dell’utente su questo database e recupera blocchi di testo rilevanti.
- Invia questi blocchi di testo a LLM insieme alle domande dell’utente e chiedi loro di rispondere.
Ecco una rappresentazione grafica di questo processo.
Allora perché andare oltre? Sembra un problema risolto!
Non proprio 🙁
Questo approccio funziona bene per domande semplici su una base di conoscenze semplice e fattuale. Tuttavia, non funziona per una base di conoscenza più complessa e per domande più complicate che richiedono un ragionamento più profondo e multi-hop. Il ragionamento multi-hop si riferisce a un processo in cui vengono eseguiti più passaggi di inferenza logica o contestuale per arrivare a una conclusione o rispondere a una domanda.
Inoltre, gli LLM sono limitati nella lunghezza del testo che possono masticare in un unico prompt. Ovviamente puoi inviare i documenti uno alla volta e poi ‘perfezionare’ o ‘ridurre’ la risposta ad ogni chiamata. Tuttavia, questo approccio non consente un ragionamento complesso “multi-hop”. In alcuni casi, i risultati ottenuti utilizzando l’approccio “perfeziona” o “riduci” sono migliori rispetto al semplice inserimento di tutti i documenti in un unico prompt, ma non con un margine elevato.
Per una base di conoscenza complessa, la domanda degli utenti da sola potrebbe non essere sufficiente per trovare tutti i documenti rilevanti che possano aiutare il LLM ad arrivare a una risposta accurata.
Per esempio:
Chi era Arjuna?
Questa è una domanda semplice e si può rispondere con un contesto limitato. Tuttavia, la seguente domanda:
Perché è scoppiata la guerra del Mahabharata?
È una domanda che ha il suo contesto distribuito in tutto il corpus testuale. La domanda stessa ha informazioni limitate sul suo contesto. Trovare le porzioni di testo rilevanti e poi ragionare in base a ciò potrebbe non funzionare.
Quindi che succede adesso?
Agenti dell’intelligenza artificiale
Questo è uno dei concetti più interessanti emersi dopo l’avvento dell’intelligenza artificiale. Se non conosci il concetto di agente IA, non vedo l’ora di spiegartelo, ma potrei comunque non riuscire a trasmetterne la bellezza. Permettimi di usare ChatGPT per spiegarlo prima.
Un agente AI, noto anche semplicemente come “agente”, si riferisce a un programma o sistema software in grado di percepire autonomamente il proprio ambiente, prendere decisioni e intraprendere azioni per raggiungere obiettivi specifici. Gli agenti di intelligenza artificiale sono progettati per imitare il comportamento umano nelle attività di risoluzione dei problemi e di presa di decisioni. Operano all’interno di un ambiente definito e interagiscono con quell’ambiente per ottenere i risultati desiderati.
In parole povere, un agente è un programma che prende un problema, decide come risolverlo e poi lo risolve. L’agente viene fornito con una serie di strumenti come funzioni, metodi, chiamate API, ecc. Può utilizzarne uno qualsiasi se sceglie di farlo nella sequenza che ritiene opportuna. Confrontatelo con il software convenzionale, in cui la sequenza di passaggi necessari per risolvere il problema è preprogrammata. Si tratta ovviamente di una definizione molto vaga. Ma probabilmente ormai avrai capito come funziona.
Ecco i due diversi agenti che ho provato per il nostro caso d’uso KBQA.
Reagire
Questo agente utilizza a Stile di ragionamento ‘ReAct’ (Ragione e Azione). decidere quale strumento utilizzare per il problema dato.
Ecco l’implementazione langChain di un ReAct Agent:
Ho fornito all’agente i seguenti strumenti tra cui scegliere:
- Catena di QA di recupero con un archivio documenti.
- La ricerca nel glossario dei caratteri (ho creato un glossario con il riconoscimento delle entità nominate utilizzando un modello pre-addestrato)
- Ricerca su Wikipedia.
L’agente reattivo non mi ha dato buoni risultati e per la maggior parte del tempo non è riuscito a raggiungere alcuna risposta. Non funziona bene con GPT 3.5. Potrebbe funzionare meglio con GPT 4, che è 20-30 volte più costoso di GPT 3.5, quindi potrebbe non essere ancora un’opzione.
Anche quando convergeva, non sono riuscito a ottenere buoni risultati. Qualcuno più esperto nella creazione di prompt di “reazione” probabilmente avrebbe fatto meglio.
Agente che si chiede da solo
Questo agente pone domande di follow-up basate sulla domanda originale e quindi tenta di trovare le risposte intermedie. Utilizzando queste risposte intermedie si arriva finalmente ad una risposta finale. Ecco un articolo che spiega l’agente Self-Ask
Questo approccio mi ha dato dei buoni risultati. Funziona bene per un motivo Single-hop. Ma anche questo fallisce per le domande che richiedono più salti.
Ad esempio, le domande:
Chi ha ucciso Karna e perché?
È relativamente facile rispondere con questo approccio
La domanda
Perché Arjuna ha ucciso Karna, il suo fratellastro?
È molto più difficile rispondere. È necessario che il LLM sappia il fatto che Arjuna non sapeva che Karna era il suo fratellastro. Il LLM non può sapere di aver bisogno di conoscere questo fatto, né comprendendo la domanda né ponendo ulteriori domande basate sulla domanda originale.