Studiando un bot multilingue per disastri FEMA utilizzando LangChain e GPT-4

Studying a multilingual bot for FEMA disasters using LangChain and GPT-4.

Alcuni pro e contro della Generazione Augmentata dal Recupero (RAG) per le applicazioni di chat ad alto rischio

Immagine generata da DALL-E2 utilizzando il prompt “Una foto di un fiume in piena che allaga un robot”

TL;DR

In questo articolo, esploriamo come costruire un chatbot multilingue dell’Agenzia Federale per la Gestione delle Emergenze degli Stati Uniti (FEMA) per aiutare le persone a prepararsi e a sopravvivere a disastri come alluvioni, tornado, incendi, terremoti e tempeste invernali. È stata creata un’interfaccia di chat da 34 documenti in formato PDF della FEMA utilizzando LangChain e GPT-4. Nonostante sia un modello di pattern molto popolare, è necessaria attenzione nelle applicazioni ad alto rischio come i bot di risposta a disastri. Nonostante le allucinazioni dei grandi modelli di linguaggio (LLM) siano ridotte al minimo, problemi comuni relativi alla ricerca semantica dei documenti possono portare all’esclusione di informazioni critiche nelle risposte della chat. Abbiamo testato alcune semplici tecniche per migliorare le prestazioni in questa specifica analisi, come l’incorporazione dei metadati del documento nelle incastonature, l’arricchimento delle domande degli utenti con la classificazione contestuale LLM a zero-shot e il rilevamento automatico della lingua e la traduzione utilizzando Google Translate per supportare meglio lingue come lo Swahili. Le tecniche applicate sono piuttosto basiche, ma la capacità del bot prototipo di estrarre informazioni in modo efficiente dai documenti in formato PDF della FEMA mostra promesse. Ovviamente, se si utilizza questa tecnica in situazioni ad alto rischio, sarebbero necessari test e convalida, possibilmente utilizzando tecniche LLM automatizzate per creare dati di convalida domanda-risposta.

Qualche settimana fa abbiamo avuto un grave evento di alluvione in Vermont. Il piccolo ruscello che scorre allegro di fronte alla nostra casa si è trasformato in un mostro furioso deciso a distruggere. Fortunatamente, non siamo stati danneggiati gravemente, ma purtroppo molte persone hanno perso beni e mezzi di sostentamento. Ad un certo punto durante l’alluvione, sembrava che dovessimo evacuare, quindi ho iniziato a controllare il sito web dell’Agenzia Federale per la Gestione delle Emergenze degli Stati Uniti (FEMA) per consigli. Avevo già preparato in parte, ma quando è arrivato il problema volevo confermare alcune cose. La FEMA ha risorse davvero eccellenti e concise in documenti in formato PDF e pagine web che ho iniziato a cercare, ma mi chiedevo …

  • In caso di emergenza, esiste un modo più rapido per ottenere informazioni utili che non richieda la ricerca e la lettura di documenti multipli?

Una soluzione ovvia potrebbe essere quella di chiedere a un chatbot. Penso che i chatbot possano essere un po’ troppo utilizzati a volte, ma questo sembra essere un caso d’uso solido poiché un’interfaccia conversazionale può essere più efficiente quando il tempo è essenziale.

Non è una novità, organizzazioni come la Croce Rossa Americana hanno sviluppato bot come Clara per la risposta a disastri. Tuttavia, di recente è emerso un nuovo pattern promettente che utilizza i Grandi Modelli di Linguaggio Generativi dell’AI (LLM) come GPT-4 di OpenAI, LLAMA 2 di Meta e una crescente varietà di modelli su HuggingFace. Questi modelli possono essere utilizzati per indicizzare un insieme specificato di documenti e interagire con essi in modo conversazionale. Chiamato Retrieval-Augmented Generation (RAG), ci sono centinaia di tutorial sul web che lo dimostrano con il fantastico pacchetto Python LangChain e mi aspetto pienamente che questa tecnica appaia presto nel software che usiamo ogni giorno. Quello che è interessante è che limita le risposte ai contenuti forniti e quindi è meno incline alle allucinazioni che possono impedire l’utilizzo di LLM in situazioni critiche come la risposta a disastri.

Ma quanto è sicuro in casi in cui le informazioni recuperate potrebbero salvare vite?

In questo articolo, esplorerò brevemente la creazione di un’interfaccia di chat LangChain GPT-4 per fare domande sulla sicurezza in caso di disastri basata su un insieme di documenti dell’Agenzia Federale per la Gestione delle Emergenze degli Stati Uniti (FEMA). Affronteremo alcune delle limitazioni che devono essere prese in considerazione se si utilizza questa tecnica in situazioni ad alto rischio.

Documenti PDF di Preparazione e Sicurezza per i Disastri della FEMA

Per questo studio, ho scaricato 34 PDF dalla FEMA (elencati qui) che coprono una vasta gamma di argomenti legati ai disastri per prepararsi e reagire alle emergenze come incendi, tornado, alluvioni, terremoti e tempeste invernali. Questo non è l’insieme completo delle incredibili risorse offerte dalla FEMA, ma dovrebbe essere sufficiente per testare la nostra interfaccia di chat.

Indicizzazione dei Documenti per il Recupero delle Informazioni

Una volta scaricati, possiamo utilizzare LangChain per leggere i documenti PDF. I documenti vengono suddivisi in frammenti di testo e a ciascuno viene assegnata un’impronta digitale (incastonature) utilizzando un modello di incastonamento. In questa analisi, utilizzeremo le incastonature di OpenAI, ma LangChain supporta molte altre.

import osfrom langchain.document_loaders import PyPDFDirectoryLoaderfrom langchain.document_loaders import PyPDFLoaderfiles = os.listdir(pdf_folder_path)files.sort()all_docs_list =[]for file in files:    if file.endswith('.pdf'):        print(file)        all_docs_list.append(file)loader = PyPDFDirectoryLoader(pdf_folder_path)all_docs = loader.load()print(pdf_folder_path)

cfpb_adult-fin-edyour-disaster-checklist.pdffema_protect-your-home_flooding.pdffema_protect-your-property-storm-surge.pdffema_protect-your-property_coastal-erosion.pdffema_protect-your-property_earthquakes.pdffema_protect-your-property_severe-wind.pdffema_protect-your-property_wildfire.pdffema_safeguard-critical-documents-and-valuables.pdffema_scenario_1-active_shooter-01102020.pdffema_scenario_10_power_outage_01102020.pdffema_scenario_10_power_outage_answer_key_01102020.pdffema_scenario_11_winter_storm_01102020.pdffema_scenario_11_winter_storm_answer_key_01102020.pdffema_scenario_12_small_business_01102020.pdffema_scenario_12_small_business_answer_key_01102020.pdffema_scenario_1_active_shooter_TTX_answer_key-01102020.pdffema_scenario_2-tornado_TTX_answer_key-01102020.pdffema_scenario_2_tornado-01102020.pdffema_scenario_3-wildfire_TTX_answer_key-01102020.pdffema_scenario_3_wildfire-01102020.pdffema_scenario_4-hurricane-01102020.pdffema_scenario_4_hurricane_flood_TTX_answer_key-01102020.pdffema_scenario_5_extreme_heat-01102020.pdffema_scenario_5_extreme_heat_TTX_answer_key_01102020.pdffema_scenario_6-pet_preparedness_01102020.pdffema_scenario_6-pet_preparedness_TTX_answer_key_01102020.pdffema_scenario_7-shelter_in_place_TTX_answer_key_01102020.pdffema_scenario_7_shelter_in_place_01102020.pdffema_scenario_8_earthquake_01102020.pdffema_scenario_8_earthquake_answer_key_01102020.pdffema_scenario_9_pandemic_Influenza_01102020.pdffema_scenario_9_pandemic_answer_key_01102020.pdfready_12-ways-to-prepare_postcard.pdfready_document-and-insure-your-property.pdf

Sto guardando i dati estratti per un documento https://www.fema.gov/sites/default/files/2020-11/fema_protect-your-home_flooding.pdf …

import jsonfor d in all_docs:    if 'fema_protect-your-home_flooding.pdf' in d.metadata['source']:        print('\n')        print(json.dumps(vars(d), indent=4))

{    "page_content": "  \n  \n \nPROTEGGI LA TUA \nPROPRIETÀ DALL'ALLAGAMENTO\n \n",    "metadata": {        "source": "docs_data/fema_protect-your-home_flooding.pdf",        "page": 0    }}{    "page_content": " \n \n \n  \n  \n \n \n \n \n \n \n \n \n \n \n -\n—\n- - -\nPossedere una proprietà è uno degli investimenti più importanti che la maggior parte delle persone fa \n nella propria vita. Lavoriamo duramente per fornire una casa e un futuro per noi stessi e i nostri cari. Perché rischiare di perderlo quando il maltempo si avvicina a casa? \nL'allagamento è il disastro naturale più comune e costoso negli Stati Uniti \ne può accadere ovunque. Appena un pollice d'acqua può causare danni per $25,000 alla tua casa. \nSebbene non si possa prevenire un disastro naturale, ci sono modi per proteggere \nla tua proprietà al fine di ridurre i danni e mantenere al sicuro la tua casa e il tuo futuro. \nInnanzitutto, determina l'Elevazione di Allagamento di Base (BFE) per la tua casa. L'BFE rappresenta l'altezza a cui si prevede che l'acqua si alzi durante l'allagamento nelle aree ad alto rischio. È necessario conoscere il tuo BFE perché viene utilizzato nei regolamenti sulla gestione delle pianure alluvionali nella tua comunità che potrebbero influire sulla tua casa, ad esempio, l'altezza sopra l'BFE a cui una casa o un altro edificio dovrebbe essere costruito. Il tuo responsabile locale delle pianure alluvionali può aiutarti a trovare queste informazioni. Se hai bisogno di aiuto per trovare il tuo responsabile delle pianure alluvionali, contatta l'FEMA's Flood Mapping and Insurance eXchange\n a\nt FEMAMapSpecialist@ \nr\niskmapcds.com

Possiamo vedere che il documento è stato diviso per pagina. Accade che questo non è un approccio irragionevole per i documenti FEMA che stiamo elaborando, che sono guide molto concise in cui ogni pagina è un argomento distinto, ma per altre applicazioni è generalmente meglio dividere il testo a un livello più granulare utilizzando il text_splitter di LangChain.

Ora possiamo utilizzare le nostre estratti di testo per creare un database di embedding ...

from langchain.embeddings import OpenAIEmbeddings from langchain.vectorstores import Chroma embedding_model = OpenAIEmbeddings()embeddings = OpenAIEmbeddings()vectordb = Chroma.from_documents(all_docs, embedding=embedding_model,persist_directory=vecs_dir)vectordb.persist()

Abbiamo scelto un'opzione semplice per persistere gli embedding nel file system, ma vale la pena notare che Chroma supporta altre opzioni nel caso in cui si abbiano un grande numero di documenti, in cui le prestazioni possono essere un problema.

Configurazione dell'interfaccia di conversazione

Utilizzeremo solo un PDF per iniziare in modo da facilitare la verifica dei risultati ...

import shutilfrom langchain.chains import ConversationalRetrievalChainfrom langchain.memory import ConversationBufferMemoryfrom langchain.llms import OpenAIfrom langchain.chat_models import ChatOpenAIfrom langchain import PromptTemplate, LLMChain# Carica OPENAI_API_KEY da un file .envfrom dotenv import load_dotenvdef setup_model(    vecs_dir: str,    docs_sublist: list,    all_docs: list) -> ConversationalRetrievalChain:    # Sottocampioni per i documenti di interesse    docs = []    for d in all_docs:                d_dict = vars(d)    # Crea la directory del database vettoriale    if os.path.exists(vecs_dir):        shutil.rmtree(vecs_dir)    os.makedirs(vecs_dir)    # Scegli i nostri modelli    embedding_model = OpenAIEmbeddings()    chat_model = ChatOpenAI(temperature=temperature,model_name="gpt-4")    # Calcola gli embedding    embeddings = OpenAIEmbeddings()    vectordb = Chroma.from_documents(docs, embedding=embedding_model,persist_directory=vecs_dir)    vectordb.persist()        # Configura la conversazione    memory = ConversationBufferMemory(memory_key="chat_history", input_key='question', output_key='answer', return_messages=True)    pdf_qa = ConversationalRetrievalChain.from_llm(chat_model, vectordb.as_retriever(), memory=memory, \                                                   return_source_documents=True)    return pdf_qavecs_dir = './vector_dbs/one_flood_doc'docs = all_docs# Sottocampioni a un documento.docs_sublist = ['fema_protect-your-home_flooding.pdf']pdf_qa = setup_model(vecs_dir, docs_sublist, docs)

Nell'esempio sopra, abbiamo scelto GPT-4 per il modello di chat in cui la chiave API è stata definita in un file .env con la variabile OPENAI_API_KEY. LangChain offre supporto anche per molti altri modelli.

Con poche righe di codice, abbiamo configurato un'interfaccia di conversazione su un insieme di documenti, che include tutta la potenza degli LLM. Ho sviluppato chatbot nel corso degli anni e posso dire che questo pattern conciso riduce molta complessità.

Merito dell'incredibile pacchetto LangChain!

Facciamo la nostra prima domanda

Dato che vorremmo anche vedere i documenti cui si fa riferimento per convalidare le risposte della chat, è necessario apportare una piccola modifica a un metodo di LangChain per gestire un problema durante il recupero dei documenti corrispondenti quando si utilizza anche la memoria della chat (la soluzione è stata suggerita qui) ...

# Una piccola modifica per abilitare l'uso di memoria *e* ottenere i documenti. Vedere: https://github.com/langchain-ai/langchain/issues/2256#issuecomment-1665188576import langchainfrom typing import Dict, Any, Tuplefrom langchain.memory.utils import get_prompt_input_keydef _get_input_output(    self, inputs: Dict[str, Any], outputs: Dict[str, str]) -> Tuple[str, str]:    if self.input_key is None:        prompt_input_key = get_prompt_input_key(inputs, self.memory_variables)    else:        prompt_input_key = self.input_key    if self.output_key is None:        output_key = list(outputs.keys())[0]    else:        output_key = self.output_key    return inputs[prompt_input_key], outputs[output_key]  langchain.memory.chat_memory.BaseChatMemory._get_input_output = _get_input_output

OK, ora siamo pronti per fare una domanda sul nostro documento PDF!

def ask_question(query: str, qa: object, output_docs: bool = True) -> dict:
    print(f"\nDomanda: \n{query}")
    result = qa({"question": query})
    print(f"\nRisposta:\n{result['answer']}")
    if output_docs:
        for doc in result['source_documents']:
            print('\n')
            print(json.dumps(vars(doc), indent=4))
    return result

ask_question("Come posso preparare la mia casa per le alluvioni?", pdf_qa)

Sembra molto ragionevole, vediamo quale contenuto è stato utilizzato per generare questo riassunto …

{    "page_content": " \n \n \nPROTEGGI LA TUA \nPROPRIETÀ DALLE ALLUVIONI\n \n",    "metadata": {        "page": 0,        "source": "docs_data/fema_protect-your-home_flooding.pdf"    }}{    "page_content": " \n \n \n  \n  \n \n \n \n \n \n \n \n \n \n \n \n -\n—\n- - -\nPossedere una proprietà è uno degli investimenti più importanti che la maggior parte delle persone fa nella propria vita. Lavoriamo duramente per fornire una casa e un futuro a noi stessi e alle persone a cui vogliamo bene. Perché rischiare di perderli quando il maltempo si avvicina a casa nostra? Le alluvioni sono il disastro naturale più comune e costoso negli Stati Uniti e possono verificarsi ovunque. Un solo pollice di acqua può causare danni fino a $ 25.000 alla tua casa. Sebbene non si possa prevenire un disastro naturale, ci sono modi per proteggere la tua proprietà e ridurre al minimo i danni, mantenendo al sicuro la tua casa e il tuo futuro. Prima di tutto, determina l'Elevazione di Alluvione di Base (BFE) per la tua casa. L'BFE è l'altezza a cui ci si aspetta che l'acqua si alzi durante le alluvioni nelle aree ad alto rischio. Devi conoscere il tuo BFE perché viene utilizzato nelle normative di gestione delle alluvioni nella tua comunità che potrebbero influire sulla tua casa, ad esempio, l'altezza sopra l'BFE a cui una casa o un altro edificio dovrebbe essere costruito. Il responsabile delle alluvioni locale può aiutarti a trovare queste informazioni. Se hai bisogno di aiuto per trovare il tuo responsabile delle alluvioni, contatta il Flood Mapping and Insurance eXchange della FEMA all'indirizzo [email protected] o al numero (877) FEMA MAP (1 877 336 2627). Di seguito sono riportati alcuni passaggi aggiuntivi che puoi seguire per proteggere te stesso e la tua proprietà dalle alluvioni. ",    "metadata": {        "page": 1,        "source": "docs_data/fema_protect-your-home_flooding.pdf"    }}{    "page_content": " \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n  \n  \n \n \n \n \n \n \n \n \n  \n \n \n  \nDIRIGI L'ACQUA \nLONTANO DALLE STRUTTURE Se hai una casa unifamiliare, assicurati che il tuo cortile scenda lontano dagli edifici sulla tua proprietà e che l'acqua abbia un luogo in cui defluire. Pulisci le grondaie, valuta i problemi di drenaggio o raccogli l'acqua in botti per la pioggia. \nANCORA I \nSERBATOI DI \nCARBURANTE Ancora tutti i serbatoi di carburante alla base per evitare che si rovescino o galleggino in caso di alluvione. Il carburante versato potrebbe diventare un pericolo di incendio. Assicurati che le prese d'aria e le aperture di riempimento siano al di sopra dell'BFE. Nota: potrebbe essere necessaria l'autorizzazione del tuo fornitore di carburante. \nIMPERMEABILIZZA \nLE MURA Aggiungi rivestimenti esterni resistenti all'acqua sulle pareti e sigillale per evitare che allagamenti superficiali danneggino la tua casa. Copri le aperture al di sotto dell'BFE e sigilla tutte le aperture esterne intorno alle pompe e alle attrezzature. \nFISSA \nLE CASE \nMOBILI Se hai una casa mobile e desideri un'assicurazione contro le alluvioni dal National Flood Insurance Program, la tua casa deve essere fissata a una fondazione permanente in modo che le ruote e gli assi non sostengano il suo peso e resistano al galleggiamento, al crollo o al movimento laterale. Il responsabile delle alluvioni locale può aiutarti a comprendere i requisiti e un ingegnere o architetto professionista può assicurarsi che il sistema di ancoraggio sia progettato e installato correttamente. RICORDA: alcune di queste indicazioni possono funzionare meglio insieme rispetto ad altre. Le misure di mitigazione devono essere adattate alla tua proprietà. Inoltre, non tutte queste opzioni funzionano insieme, quindi parla con un esperto che può aiutarti a individuare le opzioni che funzionano meglio per te. Consulta sempre professionisti come il tuo agente di assicurazione, architetti, ingegneri, imprenditori o altri esperti di progettazione e costruzione prima di apportare modifiche alla tua casa. Il tuo ufficio di pianificazione e zona o il dipartimento edilizio locale è un buon punto di partenza per ottenere consigli. Infine, sii gentile con i tuoi vicini! Parla con i proprietari di immobili adiacenti prima di apportare modifiche, poiché alcune azioni sulla tua proprietà potrebbero influire sulla loro.

La risposta sembra ottima e ha riassunto brillantemente gli estratti che sono stati abbinati. Tuttavia, sembra che abbia perso una pagina nel documento di origine. Questo PDF è un documento breve in cui *tutto* ciò che contiene è rilevante per la preparazione alle inondazioni, quindi perdere delle pagine è effettivamente significativo.

Questo dimostra che accettare ciecamente i modelli LLM sul web può fornire risultati che sembrano straordinari, ma è necessario un lavoro per renderli davvero utili.

Il contesto del documento (metadata) può essere importante

In questo scenario, abbiamo un documento che riguarda un argomento, le inondazioni, anche se le singole sezioni di testo potrebbero non menzionarlo esplicitamente. Potremmo ottenere risultati migliori se forniamo un contesto con ciascun estratto di testo, ad esempio alcune metadata del documento.

Per il nostro semplice test, proviamo ad aggiungere un prefisso a tutti gli estratti di testo con il nome del file (fema-protect-your-home-flooding.pdf) con la punteggiatura e il suffisso rimossi, oltre a un testo che dice "Questo estratto riguarda". Il prefisso finale sarà "Questo estratto riguarda fema protect your home flooding:", che fornisce un po' più di contesto all'LLM ...

def setup_model(    vecs_dir: str,    docs_sublist: list,    all_docs: list,    prefix_file_name_to_chunks: bool = False,    temperature: float = 0.0,    extra_prefix: str = '',) -> ConversationalRetrievalChain:    # Sottogruppo per i documenti di nostro interesse    docs = []    for d in all_docs:                d_dict = vars(d)        if d_dict['metadata']['source'].replace('docs_data/','') in docs_sublist:            if len(d.page_content) > 20:                # Aggiungi il nome del file al contenuto per avere più contesto                if prefix_file_name_to_chunks:                    file_clean = re.sub(r'docs_data\/|\.pdf', '', d_dict['metadata']['source'])                      file_clean = re.sub(r'\-|\_', ' ', file_clean)                                    d.page_content = f"{extra_prefix} {file_clean}: {d.page_content}"                docs.append(d)    # Crea la directory del database vettoriale    if os.path.exists(vecs_dir):        shutil.rmtree(vecs_dir)    os.makedirs(vecs_dir)    # Scegli i nostri modelli    embedding_model = OpenAIEmbeddings()    chat_model = ChatOpenAI(temperature=temperature,model_name="gpt-4")    # Calcola gli embedding    embeddings = OpenAIEmbeddings()    vectordb = Chroma.from_documents(docs, embedding=embedding_model,persist_directory=vecs_dir)    vectordb.persist()        # Configura la chat    memory = ConversationBufferMemory(memory_key="chat_history", input_key='question', output_key='answer', return_messages=True)    pdf_qa = ConversationalRetrievalChain.from_llm(chat_model, vectordb.as_retriever(), memory=memory, \                                                   return_source_documents=True)    return pdf_q

Bingo! Sembra che abbia catturato le pagine importanti dal PDF e le abbia riassunte in modo chiaro. Ovviamente, si tratta di un approccio molto rudimentale. Un metodo più formale che utilizza i metadati invece del solo nome del file sarebbe migliore. Potrebbe essere anche più elegante utilizzare un modello anziché solo un prefisso, ma questo illustra come un po' di contesto come questo possa essere utile.

Cosa succede se ora utilizziamo tutti i documenti nel nostro set...

vecs_dir = './vector_dbs/all_docs'docs = all_docs# Nota l'argomento prefix_file_name_to_chunks=Truepdf_qa = setup_model(vecs_dir, all_docs_list, docs, prefix_file_name_to_chunks=True, extra_prefix="Questo frammento riguarda ")result = ask_question("Come posso preparare la mia casa per le alluvioni?", pdf_qa)

Domanda: Come posso preparare la mia casa per le alluvioni?Risposta:Ecco alcuni passi che puoi seguire per preparare la tua casa per le alluvioni:1. Crea un piano di emergenza per la tua famiglia e praticalolo regolarmente. Quando si avvicina una tempesta, evacua e sposta la tua auto in un luogo più alto.2. Acquista un'assicurazione contro le alluvioni per la tua casa e i suoi contenuti, anche se non vivi in una zona a rischio di alluvione.3. Documenta i tuoi beni. Questo ti aiuterà nel processo di assicurazione se dovessi presentare una richiesta.4. Conserva oggetti di valore e documenti importanti sopra il livello di alluvione di base (BFE) in contenitori impermeabili o resistenti all'acqua.5. Eleva elettrodomestici e servizi come scaldabagni, lavatrici, asciugatrici e quadri elettrici ai piani superiori per evitare che vengano danneggiati dall'acqua di alluvione.6. Utilizza materiali resistenti alle alluvioni per l'isolamento, le pareti in cartongesso e le coperture del pavimento, come le piastrelle, per ridurre i danni.7. Assicurati che il tuo cortile si inclini lontano dagli edifici sulla tua proprietà e che l'acqua abbia un luogo in cui defluire.8. Ancora eventuali serbatoi di carburante per evitare che si ribaltino o galleggino in caso di alluvione.9. Aggiungi rivestimenti esterni resistenti all'acqua sulle pareti e sigillale per evitare che l'acqua di alluvione danneggi la tua casa.10. Se hai una casa prefabbricata, assicurati che sia fissata a una fondazione permanente.11. Eleva la tua casa sopra il BFE.12. Fissa gli oggetti nel tuo cortile ancorandoli o attaccandoli a strutture più solide.13. Controlla la guarnizione intorno a finestre e porte per assicurarti che non sia crepata, rotta o mancante. Riempire eventuali buchi o fessure intorno a tubi e cavi che entrano nel tuo edificio.14. Costruisci la tua casa, il garage, il capanno o altri edifici lontano dai canali fluviali e dalle linee di costa. Se possibile, costruisci su terreno più alto.15. Sostituisci la moquette con le piastrelle, poiché sono più resistenti alle alluvioni.16. Impermeabilizza il tuo seminterrato e sigilla le pareti con composti impermeabilizzanti. Valuta l'installazione di una pompa di scarico.17. Installa aperture per le alluvioni nelle pareti di fondazione, nei garage e in altre aree chiuse per consentire all'acqua di defluire, drenare e ridurre il rischio di danni strutturali.18. Utilizza isolanti e cartongesso resistenti alle alluvioni.19. Prevenire il reflusso delle acque reflue consultando un idraulico e investendo in una valvola di reflusso delle acque reflue, se applicabile.Ricorda di consultare professionisti come il tuo agente di assicurazione, architetti, ingegneri, appaltatori o altri esperti di progettazione e costruzione prima di apportare modifiche alla tua casa.

Ha svolto un ottimo lavoro, ha recuperato informazioni dai nostri articoli chiave in https://www.fema.gov/sites/default/files/2020-11/fema_protect-your-home_flooding.pdf, oltre a un articolo da https://www.fema.gov/sites/default/files/documents/fema_protect-your-property-storm-surge.pdf, l'unico altro documento nel set che menziona allagamenti.

Lunghezza della richiesta di recupero

A questo punto, vale la pena notare che la richiesta di sintesi finale che trasforma i frammenti del documento in una bella risposta può essere piuttosto lunga a seconda della dimensione e del numero dei frammenti. Una battaglia continua con LLM consiste nel raggiungere i nostri obiettivi senza superare i limiti di token. Anche se non ha avuto un effetto significativo per il nostro caso d'uso, in altri scenari potrebbero essere necessari metodi di compressione contestuale.

Il contesto della domanda può essere importante

Abbiamo intenzionalmente mescolato documenti relativi a (i) la pianificazione per i disastri e (ii) la reazione immediata agli eventi pericolosi. Ciò può comportare risposte confuse che mescolano entrambi i contesti...

result = ask_question("Vivo accanto a un canale e vedo l'acqua che sta salendo in questo momento, cosa dovrei fare?", pdf_qa, output_docs=True)

Domanda: Vivo accanto a un canale e vedo l'acqua che sta salendo in questo momento, cosa dovrei fare?Risposta: Se noti un aumento immediato del livello dell'acqua, è importante dare priorità alla tua sicurezza. Ecco alcuni passi che puoi seguire:1. Evacua: Se il livello dell'acqua sta salendo rapidamente, è fondamentale evacuare verso un terreno più alto il prima possibile.2. Sposta la tua auto: Se hai tempo, sposta la tua auto in un luogo più alto. Secondo il National Weather Service, appena due piedi d'acqua possono spostare un veicolo.3. Proteggi la tua casa: Se hai tempo, proteggi la tua casa spostando oggetti di valore e documenti importanti a un piano superiore o almeno sopra il livello di allagamento di base (BFE). Mettili in contenitori impermeabili o resistenti all'acqua.4. Comunica: Informa familiari, amici e vicini della situazione. Se hai un punto di incontro predefinito, recati lì o informa gli altri dei tuoi piani di evacuazione.5. Contatta le autorità: Informa le autorità locali della situazione. Possono fornire indicazioni e avvisare altre persone a rischio.6. Controlla le mappe degli allagamenti: Se hai accesso a Internet, controlla le mappe degli allagamenti per la tua zona per capire il rischio potenziale.Ricorda, questi passaggi sono linee guida generali. Segui sempre i consigli delle autorità locali e dei servizi di emergenza durante una situazione di allagamento.

La risposta è ora un po' un misto, con alcuni punti che si riferiscono all'azione immediata "Sposta la tua auto in un luogo più alto" e alcuni alla preparazione "Acquista un'assicurazione contro gli allagamenti". Quando le persone sono stressate durante un'emergenza, probabilmente non stanno pensando all'ingegneria della richiesta e quindi possiamo aspettarci input leggermente ambigui.

Potremmo ovviamente risolvere questo problema utilizzando più metadati del documento per suddividere in sottogruppi, ma questo richiede lavoro se tali metadati non sono disponibili. Un'altra opzione è fornire più contesto alla domanda per indicare se l'utente è interessato alla preparazione per il disastro o ha bisogno di aiuto immediato. Potremmo costruire un classificatore per questo, ma in questi giorni di potenti LLM utilizziamo la classificazione zero-shot con GPT-4...

def get_time_context(question):    template = """La seguente domanda riguarda "la pianificazione" o "l'azione immediata": {question}    Rispondi con una delle seguenti opzioni: 'Sto pianificando in anticipo:', 'Devo agire immediatamente:' o 'ambiguo'"""    prompt = PromptTemplate(template=template, input_variables=["question"])    llm = OpenAI()    llm_chain = LLMChain(prompt=prompt, llm=llm)    answer = llm_chain.run(question)    return answerquestions = [    "Vivo accanto a un canale e l'acqua sta salendo, cosa dovrei fare?",    "Aiuto, il mio tetto sta volando via!",    "Come posso evitare che il mio tetto voli via durante un uragano?",    "Cane",    "Come posso preparare la mia casa per gli allagamenti?"]for q in questions:    print(f"Domanda: {q}")    answer = get_time_context(q)    print(answer.strip(), "\n")

Domanda: Vivo accanto a un canale e l'acqua sta salendo, cosa dovrei fare?Devo agire immediatamente: Domanda: Aiuto, il mio tetto sta volando via!Devo agire immediatamente: Domanda: Come posso evitare che il mio tetto voli via durante un uragano?Sto pianificando in anticipo. Domanda: CaneDomanda ambigua: Come posso preparare la mia casa per gli allagamenti?Sto pianificando in anticipo. 

Bel lavoro! Con uno sforzo minimo possiamo facilmente determinare se una domanda riguarda la pianificazione o l'azione immediata.

Ora possiamo prefissare la domanda dell'utente con questo ...

def get_time_context(question: str) -> str:
    template = """La seguente domanda riguarda la 'pianificazione' o 'l'azione immediata': {question}
Rispondi con una delle seguenti opzioni: 'Sto pianificando in anticipo:' o 'Devo prendere un'azione immediata:' o 'ambiguo'"""
    prompt = PromptTemplate(template=template, input_variables=["question"])
    llm = OpenAI()
    llm_chain = LLMChain(prompt=prompt, llm=llm)
    answer = llm_chain.run(question)
    return answerdef ask_question(
    query: str,
    qa: object,
    output_docs: bool = True,
    preprocess_time_context: bool = False) -> dict:
    # Prima otteniamo il contesto temporale
    if preprocess_time_context:
        time_context = get_time_context(query)
        if 'pianificare' in time_context.lower():
            query = f"Sto pianificando in anticipo: {query}"
        elif 'prendere un'azione immediata' in time_context.lower():
            query = f"Devo prendere un'azione immediata: {query}"
    print(f"\nDomanda: \n{query}")
    result = qa({"question": query})
    print(f"\nRisposta:\n{result['answer']}")
    if output_docs:
        for doc in result['source_documents']:
            print('\n')
            print(json.dumps(vars(doc), indent=4))
    return resultresult = ask_question("Vivo vicino a un canale e vedo l'acqua che sale, cosa dovrei fare?", pdf_qa, output_docs=False, preprocess_time_context=True)

Che dà ...

Domanda: Devo prendere un'azione immediata: Vivo vicino a un canale e vedo l'acqua che sale, cosa dovrei fare?
Risposta:Se vedi l'acqua che sale accanto al tuo canale, dovresti immediatamente mettere in atto il tuo piano di emergenza. Ciò include evacuare la tua casa e spostare la tua auto in un luogo più alto, poiché solo due piedi di acqua possono spostare un veicolo. Dovresti anche assicurarti che i tuoi beni di valore e i documenti importanti siano conservati al di sopra dell'Elevazione di Alluvione Base (BFE), preferibilmente al piano superiore, e riposti in contenitori impermeabili o resistenti all'acqua. Se hai tempo, considera di spostare elettrodomestici e servizi come scaldabagni, lavatrici, asciugatrici e quadri elettrici ai piani superiori per evitare che si danneggino o si rovinino a causa dell'acqua di inondazione. Dai sempre la priorità alla tua sicurezza e a quella della tua famiglia rispetto alla protezione della proprietà.

Grande, ha funzionato bene e non ha cercato di venderci alcuna assicurazione, ha dato consigli che potevano essere messi in pratica immediatamente.

Testiamo il contrario ...

result = ask_question("Cosa posso fare per rendere la mia casa resistente agli incendi boschivi?", pdf_qa, output_docs=False, preprocess_time_context=True)

Domanda: Sto pianificando in anticipo: Cosa posso fare per rendere la mia casa resistente agli incendi boschivi?
Risposta:Puoi prendere diverse misure per rendere la tua casa resistente agli incendi boschivi:1. Installa o sostituisci il tetto con un tetto di Classe A con coperture non combustibili. Il tetto è la parte più a rischio di una casa in un incendio boschivo a causa delle sue dimensioni e orientamento.2. Installa e sostituisci le coperture delle pareti esterne con materiali non combustibili o ignifughi. Si consiglia una classificazione di resistenza al fuoco minima di un'ora per l'assemblaggio delle pareti.3. Crea uno spazio difensibile di 30 piedi intorno alla tua casa riducendo o rimuovendo vegetazione infiammabile e utilizzando materiali non combustibili come ghiaia, mattoni o cemento.4. Pulisci regolarmente il tetto e le grondaie per ridurre la probabilità che qualcosa prenda fuoco sulla tua casa.5. Chiudi la fondazione della tua casa per ridurre la possibilità che le braci portate dal vento si infilino sotto la tua casa.6. Pianifica l'accesso all'acqua acquistando e installando sistemi di irrigazione esterni con fonti di alimentazione dedicate o un serbatoio d'acqua.7. Proteggi le grandi finestre dal calore radente installando finestre con più pannelli, vetro di sicurezza temperato o persiane antincendio.8. Installa segnali stradali altamente visibili e indirizzi di proprietà per aiutare i pompieri e altri soccorritori a trovare rapidamente la tua proprietà.9. Sigilla le fessure intorno alle aperture nelle pareti esterne e nei tetti con mastice ignifugo, malta o schiuma espandente protettiva antincendio.10. Copri le aperture del solaio e le aperture sotto il cornicione con una rete metallica di dimensioni non superiori a 1/8 di pollice per tenere lontane le braci.11. Installa un blocco antincendio nello spazio tra la parte superiore delle pareti in telaio e la fondazione della casa per privare il fuoco di ossigeno e impedirne la propagazione.Ricorda, questi suggerimenti possono funzionare meglio se combinati e devono essere adattati alla tua proprietà. Consulta sempre professionisti come il tuo agente assicurativo, architetti, ingegneri, appaltatori o altri esperti di progettazione e costruzione prima di apportare modifiche alla tua casa.

Perfetto, ha fornito informazioni sulla preparazione degli incendi boschivi.

Ovviamente, ciò richiederebbe molti test per qualsiasi cosa ad alto rischio che potrebbe essere utilizzata in un'emergenza reale, ma illustra un modo in cui possiamo migliorare le prestazioni arricchendo l'input dell'utente.

Assicurarsi che le risposte provengano solo dai documenti forniti

Per un'applicazione in cui le informazioni possono influire sulla sicurezza, è importante che le informazioni presentate provengano solo dai documenti forniti. Allucinazioni contenenti informazioni errate potrebbero avere effetti davvero gravi.

Proviamo a chiedere qualcosa di completamente non correlato ai disastri...

result = ask_question("Come faccio a fare una torta di spugna?", pdf_qa, output_docs=False)

Che restituisce...

Domanda: Come faccio a fare una torta di spugna?Risposta: Mi dispiace, ma il contesto fornito non contiene informazioni su come fare una torta di spugna.

Anche se sono un po' triste di non scoprire come fare una deliziosa torta, LangChain si è occupato bene di questo scenario e determina che la domanda non è correlata alle informazioni presenti nelle guide in formato PDF fornite.

È una buona cosa, niente allucinazioni gravi! L'ultima cosa che vorrei in caso di disastro è che mi venga detto di fare una torta di spugna e pilotare una navicella spaziale o qualcosa del genere. 😊

Cronologia della conversazione

Una grande caratteristica di LangChain è che si occupa in modo trasparente della cronologia della conversazione. Con una sola riga di codice, il modello può riprendere le domande precedenti...

result = ask_question("Sta arrivando un uragano, cosa dovrei fare?", pdf_qa, output_docs=False)Domanda: Devo agire immediatamente: c'è una previsione di uragano, cosa dovrei fare?Risposta: Se c'è una previsione di uragano, dovresti prendere le seguenti misure immediate:1. Verifica il rischio di alluvione per la tua zona. Puoi farlo visitando https://msc.fema.gov/portal/home e inserendo l'indirizzo della tua casa.2. Comprendi la differenza tra un Avviso di Uragano e un Avviso di Tempesta di Uragano. Un Avviso di Uragano significa che sono possibili condizioni di uragano all'interno di un'area specifica ed è emesso 48 ore prima dell'inizio previsto dei venti di tempesta tropicale. Un Avviso di Tempesta di Uragano significa che sono previste condizioni di uragano all'interno di un'area specifica ed è emesso 36 ore prima dell'inizio previsto dei venti di tempesta tropicale.3. Prendi misure intorno alla tua casa per ridurre l'impatto di un evento di alluvione. Ciò potrebbe includere il posizionamento di sacchi di sabbia nelle aree più a rischio di alluvione e l'elevazione di dispositivi meccanici come condizionatori d'aria, generatori e interruttori di circuito per ridurre al minimo il rischio di impatto da onde di tempesta.4. Stabilisci un punto di incontro centrale in modo che, se manca l'elettricità, le persone sappiano dove incontrarsi con i propri cari.5. Prepara un kit di emergenza che dovrebbe includere acqua, un kit di pronto soccorso, una torcia, batterie, una radio a manovella/alimentata a energia solare, cibo non deperibile, contanti, una chiave inglese, disinfettante per le mani, una coperta di mylar, tappi per le orecchie e un libro e/o un mazzo di carte.6. Assicurati di avere oggetti e servizi pronti prima che venga emesso un avviso o un avviso di uragano. Ciò potrebbe includere il confezionamento di oggetti di conforto per i propri cari e assicurarsi che eventuali parenti che necessitano di terapia regolarmente programmata per la salute mentale siano a conoscenza della posizione del rifugio.7. Conserva i documenti importanti in buste Ziploc e tienili in un luogo sicuro. In alternativa, puoi conservarli su un drive cloud, su una chiavetta USB tenuta in un luogo alternativo o in una cassetta di sicurezza.8. Crea un kit di emergenza per il tuo animale domestico con articoli essenziali, tra cui cibo, acqua, farmaci e giocattoli preferiti. Assicurati che il tuo animale domestico abbia un microchip o almeno mostri targhette di identificazione.9. Familiarizza con le rotte di evacuazione costiere predefinite nella tua zona.10. Pianifica metodi di comunicazione nel caso in cui le linee telefoniche e le torri cellulari vengano danneggiate. Ciò potrebbe includere l'invio di messaggi di testo o l'utilizzo di piattaforme di social media come Twitter, Facebook, Instagram, ecc.

Poi chiedigli una domanda che si riferisce a 'It' (l'uragano)...

result = ask_question("Sta per arrivare, aiuto!", pdf_qa, output_docs=False, preprocess_time_context=True)Domanda: Sta per arrivare, aiuto!Risposta:Ecco alcune azioni immediate che dovresti intraprendere per la tua sicurezza:1. Se ti trovi in una zona alluvionale, considera l'evacuazione verso una posizione più sicura. Se l'evacuazione non è possibile, spostati in una zona più alta all'interno della tua casa.2. Assicura la tua casa chiudendo e coprendo le finestre. Rimuovi eventuali oggetti all'aperto che potrebbero essere sollevati dal vento.3. Raccogli le tue forniture di emergenza, compreso il tuo kit di emergenza che dovrebbe includere acqua, un kit di pronto soccorso, una torcia, batterie, una radio a manovella/alimentata a energia solare, cibo non deperibile, contanti, una chiave inglese, disinfettante per le mani, una coperta di mylar, tappi per le orecchie e un libro e/o un mazzo di carte.4. Se hai animali domestici, assicurati di avere un kit di emergenza anche per loro, compreso cibo, acqua, farmaci e giocattoli preferiti. Assicurati che abbiano un microchip o targhette di identificazione.5. Assicurati che la tua auto sia piena di carburante e pronta a partire nel caso in cui tu debba evacuare.6. Scollega tutti gli elettrodomestici per evitare danni da sovratensione.7. Rimani informato sul percorso e l'intensità della tempesta ascoltando la radio o controllando siti web affidabili.8. Comunica con i membri della famiglia e assicurati che tutti conoscano il piano. Se possibile, stabilisci un punto di incontro centrale nel caso in cui vi separiate.9. Conserva oggetti di valore e documenti importanti in un luogo sicuro e alto o in contenitori impermeabili.10. Se hai tempo, posiziona sacchi di sabbia nelle aree più a rischio di alluvione. Ricorda, la tua sicurezza è la cosa più importante. Gli oggetti materiali possono essere sostituiti, ma le vite umane no.

Perfetto, mantiene una cronologia e sa a cosa mi sto riferendo. Sotto pressione, ci si potrebbe aspettare che l'utente faccia domande di approfondimento, quindi questa capacità, implementata con sole 2 righe di codice, è molto importante.

Traduzione

Per rendere il chatbot più versatile, possiamo esplorare il supporto multilingue. Molti dei principali LLM come GPT-4 offrono supporto nativo per le principali lingue, ma le prestazioni possono variare a seconda della lingua.

Iniziamo con il portoghese...

from googletrans import Translatortranslator = Translator()q = translator.translate("Come preparare la mia casa per le inondazioni?", dest='pt')print("================ RAW =================")pdf_qa = setup_model(vecs_dir, all_docs_list, docs, prefix_file_name_to_chunks=True, extra_prefix="Questo frammento si riferisce a ")result = ask_question(q.text, pdf_qa, output_docs=True, preprocess_time_context=True)q = translator.translate(result['answer'], dest='en')print("\n\n=============== TRADOTTO IN INGLESE USANDO GOOGLE TRANSLATE =================\n")print(q.text)

================ RAW =================Domanda: Sto pianificando in anticipo: Como preparar minha casa para enchentes?Risposta: Ci sono diversi modi per preparare la tua casa per le inondazioni:1. Avere un piano di emergenza: Crea un piano di emergenza per la tua famiglia e pratical° regolarmente. Quando si avvicina una tempesta, evacua e sposta la tua auto in un terreno più alto.2. Ottenere un'assicurazione contro le inondazioni: La maggior parte delle polizze assicurative per la casa non copre i danni causati dalle inondazioni. Proteggi il tuo investimento acquistando un'assicurazione contro le inondazioni per la tua casa e i tuoi contenuti.3. Prepara o aggiorna un elenco dei contenuti della tua casa: Documenta i tuoi beni. Questo ti darà tranquillità e aiuterà nel processo di assicurazione se dovessi mai presentare una richiesta.4. Conserva oggetti di valore: Conserva oggetti di valore e documenti importanti sopra il BFE (preferibilmente al piano superiore). Mettili in contenitori impermeabili o resistenti all'acqua.5. Eleva elettrodomestici e servizi sopra il BFE: Mantieni elettrodomestici e servizi come scaldabagni, lavatrici, asciugatrici e quadri elettrici ai piani superiori. Questo può evitare che vengano danneggiati o rovinati dall'acqua delle inondazioni.6. Usa materiali resistenti alle inondazioni: L'isolamento resistente alle inondazioni, il cartongesso e i rivestimenti per pavimenti come le piastrelle aiuteranno a ridurre i danni e sono più facili da pulire e sanificare.7. Conosci la tua proprietà e il quartiere: Se ti stai trasferendo vicino a un grande lago o all'oceano, parla con i tuoi vicini. Scopri eventuali problemi che hanno avuto o quali misure di mitigazione hanno adottato.8. Eleva la tua casa: Sebbene sia un investimento, elevare la tua casa prepara la tua proprietà alle inondazioni e riduce i premi dell'assicurazione contro le inondazioni.9. Proteggi gli oggetti del tuo giardino: Gli oggetti non sicuri possono essere portati via o danneggiati dalle acque delle inondazioni. Possono anche essere portati all'interno della tua casa, causando danni.10. Sigilla crepe e fessure: Controlla la sigillatura intorno alle finestre e alle porte per assicurarti che non sia crepata, rotta o mancante. Riempire eventuali buchi o fessure intorno a tubi e fili che entrano nel tuo edificio.Ricorda, consulta sempre professionisti come il tuo agente assicurativo, architetti, ingegneri, appaltatori o altri esperti di design e costruzione prima di apportare modifiche alla tua casa.

Qual è l'informazione corretta. Tuttavia, con lo swahili ...

q = translator.translate("Come preparo la mia casa per le alluvioni?", dest='sw')print("================ RAW =================")pdf_qa = setup_model(vecs_dir, all_docs_list, docs, prefix_file_name_to_chunks=True, extra_prefix="Questo frammento riguarda ")result = ask_question(q.text, pdf_qa, output_docs=True, preprocess_time_context=True)q = translator.translate(result['answer'], dest='en')print("\n\n=============== TRADOTTO IN INGLESE UTILIZZANDO GOOGLE TRANSLATE =================\n")print(q.text)

================ RAW =================Domanda: Je, ninatayarishaje nyumba yangu kwa mafuriko?Risposta: Kuna diverse misure che puoi prendere per proteggere la tua casa dalle alluvioni:1. Devia l'acqua lontano dagli edifici: Assicurati che la tua area sia rivolta lontano dagli edifici sulla tua proprietà e che l'acqua abbia un luogo in cui defluire. Pulisci le grondaie, valuta i problemi di drenaggio o raccogli l'acqua in barili per la pioggia.2. Ancora i serbatoi di olio: Ancora eventuali serbatoi di olio a una pedana per evitarne il ribaltamento o il galleggiamento in caso di alluvione. L'olio versato può rappresentare un pericolo di incendio. Assicurati che le aperture di ventilazione e di riempimento siano al di sopra del BFE (Base Flood Elevation). Nota: potrebbe essere necessaria l'autorizzazione del tuo fornitore di carburante.3. Proteggi le pareti dalle alluvioni: Aggiungi rivestimenti impermeabili alle pareti e sigillale per evitare che alluvioni superficiali danneggino la tua casa. Copri l'apertura sotto il BFE e copri tutte le aperture esterne intorno alla pompa e all'attrezzatura.4. Verifica le case prefabbricate: Se hai una casa prefabbricata e desideri assicurarla contro le alluvioni tramite il National Flood Insurance Program, la tua casa deve essere posizionata su una fondazione permanente in modo che le ruote e gli assali non ne riducano il peso e ne impediscono il galleggiamento, la caduta o i movimenti laterali.5. Nota: alcuni di questi suggerimenti possono funzionare meglio se combinati. Le misure di mitigazione devono essere personalizzate per la tua proprietà. Inoltre, non tutte le opzioni funzionano insieme, quindi parla con un professionista che può aiutarti a capire quali opzioni funzionano meglio per te.Consulta sempre professionisti come il tuo agente assicurativo, architetti, ingegneri, appaltatori o altri professionisti nel campo del design e della costruzione prima di apportare modifiche alla tua casa. L'ufficio di pianificazione e sviluppo locale o il dipartimento edilizio sono un buon punto di partenza per ottenere consigli.In conclusione, sii gentile con i tuoi vicini! Parla con i proprietari delle proprietà vicine prima di apportare modifiche, in quanto alcune azioni sulla tua proprietà potrebbero influire sulla loro.

I risultati sembrano molto plausibili ma mancano informazioni importanti. I brani di testo corrispondenti mancano di alcune sezioni chiave sulle inondazioni e abbiamo anche frammenti relativi agli incendi quando abbiamo chiesto informazioni sulle inondazioni. Fondamentalmente, l'utilizzo di embedding creati da documenti in inglese con domande in swahili non funziona bene. Non irragionevole, anche se ha funzionato bene per una lingua latina come il portoghese.

Forse un approccio più robusto sarebbe prima rilevare la lingua e tradurla in inglese con Google Translate, quindi convertire la risposta nella lingua originale.

Aggiungiamo questo alla nostra interfaccia di chat...

def get_time_context(question: str) -> str:    template = """La seguente domanda si riferisce a 'pianificazione' o 'azione immediata': {question}    Rispondi con una delle seguenti: 'Sto pianificando:' o 'Ho bisogno di agire immediatamente:' o 'ambiguo'"""    prompt = PromptTemplate(template=template, input_variables=["question"])    llm = OpenAI()    llm_chain = LLMChain(prompt=prompt, llm=llm)    answer = llm_chain.run(question)    return answerdef ask_question(    query: str,    qa: object,    output_docs: bool = True,    preprocess_time_context: bool = False,    auto_translate: bool = False,) -> dict:    # Auto-traduzione    if auto_translate:        lang = translator.detect(query)        lang = lang.lang        print(f"Lingua rilevata: {lang}")        q = translator.translate(query, dest='en')        query = q.text    # Ottieni prima il contesto temporale    if preprocess_time_context:        time_context = get_time_context(query)        if 'pianificazione' in time_context.lower():            query = f"Sto pianificando: {query}"        elif 'azione immediata' in time_context.lower():            query = f"Ho bisogno di agire immediatamente: {query}"    print(f"\nDomanda: \n{query}")    result = qa({"question": query})    # Traduci di nuovo nella lingua originale    if auto_translate:        q = translator.translate(result['answer'], dest=lang)        result['answer'] = q.text        print(f"\nRisposta:\n{result['answer']}")    if output_docs:        for doc in result['source_documents']:            print('\n')            print(json.dumps(vars(doc), indent=4))    return result# Traduci in swahiliq = translator.translate("Come preparo la mia casa per le inondazioni?", dest='sw')print("================ ORIGINALE =================")result = ask_question(q.text, pdf_qa, output_docs=False, preprocess_time_context=True, auto_translate=True)q = translator.translate(result['answer'], dest='en')print("\n\n=============== TRADOTTO IN INGLESE USANDO GOOGLE TRANSLATE =================\n")print(q.text)

================ ORIGINALE =================Lingua rilevata: swDomanda: Sto pianificando: Come preparo la mia casa per le inondazioni?Risposta:Ecco alcuni passaggi che puoi fare per preparare la tua casa per possibili inondazioni:1. Crea un piano di emergenza per la tua famiglia e lavoraci regolarmente. Quando si avvicina una tempesta, esci e sposta la tua auto in alto.2. Acquista un'assicurazione contro le inondazioni per la tua casa e i contenuti, anche se non vivi in una zona ad alto rischio di alluvione.3. Scrivi i tuoi oggetti. Questo aiuterà nel processo di assicurazione se dovessi presentare una richiesta.4. Conserva oggetti di valore e documenti importanti sopra l'Elevazione di Base delle Inondazioni (BFE), preferibilmente al piano superiore, in contenitori impermeabili o a tenuta d'acqua.5. Eleva attrezzature e servizi come scaldabagni, lavatrici, asciugatrici e quadri elettrici al piano superiore per evitare che vengano danneggiati dall'acqua di inondazione.6. Utilizza materiali resistenti alle inondazioni nella tua casa.7. Assicurati che il tuo giardino sia inclinato lontano dagli edifici sulla tua proprietà e che l'acqua abbia un luogo in cui defluire.8. Ancora eventuali serbatoi di carburante per evitarne il ribaltamento o il galleggiamento in caso di inondazione.9. Aggiungi guaine esterne impermeabili alle pareti e sigillale per evitare che le inondazioni profonde danneggino la tua casa.10. Se hai una casa prefabbricata, assicurati che sia posizionata su una fondazione permanente.11. Solleva la tua casa sopra l'Elevazione di Base delle Inondazioni (BFE).12. Fissa gli oggetti nel tuo giardino ancorandoli o attaccandoli a strutture più grandi.13. Controlla le finestre e le porte per assicurarti che non siano rotte, danneggiate o mancanti. Riempire eventuali buchi o fessure attorno a tubi e cavi che entrano nel tuo edificio.14. Costruisci la tua casa, il garage, il capanno o altri edifici lontano da fiumi e spiagge. Se possibile, costruisci su terreno più alto.Ricorda di consultare professionisti come il tuo agente assicurativo, architetti, ingegneri, appaltatori o altri professionisti del design e della costruzione prima di apportare modifiche alla tua casa.=============== TRADOTTO IN INGLESE USANDO GOOGLE TRANSLATE =================Ecco alcuni passaggi che puoi seguire per preparare la tua casa alle possibili inondazioni:1. Crea un piano di emergenza per la tua famiglia e lavoraci regolarmente. Quando si avvicina una tempesta, esci e sposta la tua auto in alto.2. Acquista un'assicurazione contro le inondazioni per la tua casa e i contenuti, anche se non vivi in una zona ad alto rischio di alluvione.3. Scrivi i tuoi oggetti. Questo aiuterà nel processo di assicurazione se dovessi presentare un reclamo.4. Conserva oggetti di valore e documenti importanti sopra l'Elevazione di Base delle Inondazioni (BFE), preferibilmente al piano superiore, in contenitori impermeabili o a tenuta d'acqua.5. Eleva attrezzature e servizi come scaldabagni, lavatrici, asciugatrici e pannelli elettrici al piano superiore per evitare che vengano danneggiati dall'acqua di inondazione.6. Utilizza materiali resistenti alle inondazioni nella tua casa.7. Assicurati che il tuo giardino sia inclinato lontano dagli edifici sulla tua proprietà e che l'acqua abbia un luogo in cui defluire.8. Ancora eventuali serbatoi di carburante per evitarne il ribaltamento o il galleggiamento in caso di inondazione.9. Aggiungi guaine esterne impermeabili alle pareti e sigillale per evitare che le inondazioni profonde danneggino la tua casa.10. Se hai una casa prefabbricata, assicurati che sia posizionata su una fondazione permanente.11. Solleva la tua casa sopra l'Elevazione di Base delle Inondazioni (BFE).12. Fissa gli oggetti nel tuo giardino ancorandoli o attaccandoli a strutture più grandi.13. Controlla le finestre e le porte per assicurarti che non siano rotte, danneggiate o mancanti. Riempire eventuali buchi o fessure attorno a tubi e cavi che entrano nel tuo edificio.14. Costruisci la tua casa, il garage, il capanno o altri edifici lontano da fiumi e spiagge. Se possibile, costruisci su terreno più alto.Ricorda di consultare professionisti come il tuo agente assicurativo, architetti, ingegneri, appaltatori o altri professionisti del design e della costruzione prima di apportare modifiche alla tua casa.

Molto meglio, utilizzando Google Translate per tradurre automaticamente lo swahili in inglese e poi tradurre la risposta nuovamente in swahili, otteniamo tutte le informazioni necessarie dal nostro set di PDF. Per un caso d'uso ad alto rischio come la risposta a un disastro, questo richiederebbe molte prove con madrelingua per garantire la sicurezza, ma mostra promesse verso il multilinguismo.

Chiedere un set più ampio di domande

OK, proviamo la versione finale e facciamo più domande legate ai disastri...

# Imposta di nuovo il modello o verrà utilizzata la cronologia della conversazione in swahilidir_vecs = './vector_dbs/all_docs'docs = all_docspdf_qa = setup_model(dir_vecs, all_docs_list, docs, prefix_file_name_to_chunks=True, extra_prefix="Questo frammento è relativo a ")domande = [    "Cosa dovrei fare per gli animali domestici in caso di incendio nella foresta?",    "Il mio tetto sta volando via!!! Aiuto, cosa dovrei fare?!!!",    "Vivo vicino a un ruscello, dovrei preoccuparmi delle alluvioni?",    "Se vivo nell'entroterra, l'innalzamento del livello del mare mi influenzerà?",    "Esiste un modo economico per ottenere un'assicurazione contro le alluvioni?",    "Siamo in un terremoto, cosa dobbiamo fare!!???",    "Quali cose dovrei avere in un kit di emergenza?",]for domanda in domande:    print("\n ===================== ")    fai_domanda(domanda, pdf_qa, output_docs=False, preprocess_time_context=True, auto_translate=True)

===================== Lingua rilevata: enDomanda: Devo agire immediatamente: Cosa dovrei fare per gli animali domestici in caso di incendio nella foresta?Risposta: In caso di incendio nella foresta, dovresti avere un kit di emergenza per il tuo animale domestico/i che includa cibo, acqua, medicinali, cartelle cliniche conservate in sacchetti Ziploc e giocattoli preferiti (se applicabile). Includi le informazioni di contatto del tuo veterinario e assicurati che il tuo animale domestico abbia un microchip o almeno i giusti tag di identificazione. Se devi evacuare, porta con te il tuo animale domestico se possibile. Se non puoi portare con te il tuo animale domestico, assicurati che sia in un luogo sicuro con accesso a cibo e acqua. ===================== Lingua rilevata: enDomanda: Devo agire immediatamente: Il mio tetto sta volando via!!! Aiuto, cosa dovrei fare?!!!Risposta: I volantini FEMA non forniscono istruzioni specifiche per un'azione immediata se il tuo tetto sta volando via. Tuttavia, in generale si consiglia di cercare riparo immediato in un'area sicura della tua casa, lontano dalle finestre e dai possibili detriti che cadono. Dopo l'evento di vento forte, dovresti contattare un professionista per valutare e riparare i danni. È anche importante contattare la tua compagnia di assicurazioni per segnalare i danni. ===================== Lingua rilevata: enDomanda: Vivo vicino a un ruscello, dovrei preoccuparmi delle alluvioni?Risposta:Sì, dovresti preoccuparti delle alluvioni se vivi vicino a un ruscello. Le alluvioni possono verificarsi ovunque e non sono limitate alle zone ad alto rischio. Forti piogge o un cattivo drenaggio possono causare alluvioni, specialmente nelle zone basse. È importante prendere precauzioni per proteggere la tua casa, come elevare la tua abitazione, assicurare gli oggetti del cortile e garantire un adeguato drenaggio. Dovresti anche considerare l'acquisto di un'assicurazione contro le alluvioni, poiché l'assistenza federale in caso di disastro potrebbe essere limitata o non disponibile senza una dichiarazione di disastro presidenziale. ===================== Lingua rilevata: enDomanda: Se vivo nell'entroterra, l'innalzamento del livello del mare mi influenzerà?Risposta: I cambiamenti del livello del mare influiscono principalmente sulle zone costiere, causando un aumento delle alluvioni, dell'erosione e dei danni da tempesta. Tuttavia, se vivi nell'entroterra, potresti comunque subire effetti indiretti. I cambiamenti del livello del mare possono alterare i modelli meteorologici, portando potenzialmente a un aumento delle precipitazioni o della siccità in alcune aree. Inoltre, se dipendi da risorse provenienti dalle zone costiere, come frutti di mare o turismo, i cambiamenti del livello del mare potrebbero influire su queste industrie. Tuttavia, il frammento non fornisce informazioni specifiche su come i cambiamenti del livello del mare potrebbero influire su coloro che vivono nell'entroterra. ===================== Lingua rilevata: enDomanda: Sto pianificando in anticipo: Esiste un modo economico per ottenere un'assicurazione contro le alluvioni?Risposta: Sì, puoi acquistare un'assicurazione contro le alluvioni tramite il Programma nazionale di assicurazione contro le alluvioni. La maggior parte delle polizze assicurative per la casa non copre i danni da alluvione, quindi è importante proteggere il tuo investimento acquistando un'assicurazione contro le alluvioni per la tua casa e i suoi contenuti. Questo è consigliato anche se non vivi in una zona ad alto rischio di alluvione. Per ulteriori informazioni sull'acquisto di un'assicurazione contro le alluvioni, puoi visitare FloodSmart.gov o contattare il tuo agente assicurativo per ottenere una copertura. Pianificare in anticipo e acquistare un'assicurazione contro le alluvioni prima di un evento di tempesta o alluvione è un modo conveniente per proteggere la tua proprietà. ===================== Lingua rilevata: enDomanda: Devo agire immediatamente: Siamo in un terremoto, cosa dobbiamo fare!!???Risposta: Quando inizia un terremoto, dovresti "Cadere, Coprire e Aggrapparti!" Ciò significa che dovresti cadere a terra, coprire la testa e il collo con le braccia e, se c'è un luogo più sicuro nelle vicinanze, strisciare verso di esso e aggrapparti. Se sei a letto, resta lì e copri la testa e il collo con un cuscino. Se ti trovi in ​​un veicolo in movimento, fermati il più velocemente e in sicurezza possibile e rimani nel veicolo. Evita di fermarti vicino o sotto edifici, alberi, cavalcavia e fili elettrici. Procedi con cautela una volta che il terremoto si è fermato, evitando strade, ponti o rampe che il terremoto potrebbe aver danneggiato. ===================== Lingua rilevata: enDomanda: Sto pianificando in anticipo: Quali cose dovrei avere in un kit di emergenza?Risposta: Un kit di emergenza dovrebbe includere i seguenti elementi: - Acqua (un gallone per persona al giorno) e/o compresse per la potabilizzazione dell'acqua- Un kit di pronto soccorso- Una torcia- Batterie- Una radio a manovella/energia solare- Cibo non deperibile- Medicinali/occhiali da prescrizione- Contanti (in piccoli tagli)- Una chiave inglese (per chiudere gli impianti)- Disinfettante per le mani- Una coperta Mylar- Tappi per le orecchie- Un libro/mazzo di carteSe hai un bambino, includi cibo per bambini, pannolini, formula, ecc. Se hai animali domestici, considera di avere un kit che includa cibo, acqua, medicinali, cartelle cliniche e un giocattolo preferito per loro. Inoltre, considera l'inclusione di dispositivi di ricarica portatili nel tuo kit, in quanto ti permetteranno di caricare da un veicolo a motore. Se un tuo caro si sente confortato da un determinato oggetto (una coperta, una fotografia, un peluche, ecc.), assicurati di inserire l'oggetto durante l'evacuazione. Se un parente richiede una terapia regolare di salute mentale, assicurati che il suo operatore sanitario sia a conoscenza della posizione del rifugio.

Penso che siano abbastanza sorprendenti, ho controllato alcuni e sembrano catturare i contenuti chiave nei documenti PDF utilizzati.

[ Sulla base di quanto sopra, il mio kit di emergenza ora ha tappi per le orecchie! ]

Valutazione delle prestazioni

In questa analisi, abbiamo solo controllato alcuni punti per verificare quanto bene la nostra interfaccia di chat restituisce informazioni critiche per un piccolo insieme di documenti PDF di FEMA. Questo è utile per illustrare alcuni concetti, ma per un'applicazione di produzione avremmo bisogno di qualcosa di meglio del semplice controllo. Fortunatamente, LangChain ha fornito un insieme di valutatori, e di particolare interesse è un'applicazione Streamlit che genera automaticamente coppie domanda-risposta e poi utilizza queste per valutare le catene di recupero, consentendo agli sviluppatori di sperimentare alcuni dei parametri coinvolti. Non ho ancora provato questo, ma l'idea di generare dati di valutazione automaticamente utilizzando LLM sembra un ottimo modo per costruire una struttura per un approccio più sistematico per testare il nostro bot di emergenza FEMA.

Conclusioni

Utilizzando un insieme di 34 documenti PDF sul sito web di FEMA, siamo stati in grado di costruire facilmente un'interfaccia conversazionale multilingue utilizzando LangChain e GPT-4 che era in grado di rispondere a una vasta gamma di domande relative alla preparazione per le emergenze e ai protocolli di sicurezza. Tuttavia, l'utilizzo di questo modello comune di recupero dei documenti LangChain per un chatbot di sicurezza ad alto rischio affronta le stesse sfide riscontrate con la ricerca semantica. Anche con gli avanzati embedding LLM che catturano più sfumature nel linguaggio naturale, è ancora abbastanza facile perdere contenuti importanti.

Per il nostro caso d'uso del bot di emergenza FEMA, ciò è dovuto a:

  • Documenti con contesti misti - Senza includere i metadati del documento, le risposte mescolavano informazioni da contesti diversi. Semplicemente aggiungendo il prefisso dei nomi dei documenti, le prestazioni sono migliorate per il nostro scenario, e potrebbero essere applicate strategie di metadati più sofisticate. Inoltre, l'aggiunta di un classificatore LLM zero-shot per arricchire la domanda dell'utente è stata utile.
  • Lingue poco rappresentate negli LLM - Fidarsi della traduzione LLM può comportare prestazioni scadenti per lingue meno rappresentate come lo swahili. L'aggiunta della traduzione automatica di Google ha migliorato le prestazioni per il nostro caso d'uso.

Abbiamo esplorato metodi approssimativi per affrontare le questioni sopra descritte, ma per un chatbot di produzione sarebbero necessarie tecniche più avanzate e altre misure di mitigazione trovate attraverso test e convalida.

Tuttavia, è ancora sorprendente cosa possono fare gli LLM oggigiorno!

Riferimenti

Puoi trovare un notebook con tutto il codice qui.