「LangChainとGPT-4を使用した多言語対応のFEMAディザスターボットの研究」

Research on multilingual FEMA disaster bot using LangChain and GPT-4

高リスクなチャットアプリケーションにおける検索強化生成(RAG)のメリットとデメリット

prompt「洪水でロボットが周囲を氾濫する激しい川の写真」を使ってDALL-E2が生成した画像

TL;DR

この記事では、洪水、竜巻、山火事、地震、冬の嵐などのような災害に備え、生き残るための多言語対応の米国連邦緊急事態管理庁(FEMA)の災害チャットボットの構築方法を探ります。LangChainとGPT-4を使用して、34のFEMA PDFドキュメントからチャットインターフェースを作成しました。この人気のあるパターンは素晴らしいものですが、災害対応ボットなどの高リスクなアプリケーションでは注意が必要です。大規模言語モデル(LLM)の幻覚は最小限に抑えられますが、ドキュメントの意味的な検索による一般的な問題により、チャットの応答に重要な情報が欠落する可能性があります。この特定の分析のパフォーマンスを向上させるために、ドキュメントのメタデータを埋め込みに組み込む、LLMのゼロショットコンテキスト分類でユーザーの質問を豊かにする、Google翻訳を使用してスワヒリ語などの言語をサポートするための自動言語検出と翻訳など、いくつかの単純な技術をテストしました。適用された技術はかなり基本的なものですが、プロトタイプボットがFEMA PDFドキュメントから情報を効率的に提示できる能力は将来性を示しています。高リスクな状況にこの技術を使用する場合は、テストと検証が必要であり、理想的には自動LLM技術を使用して質問と回答の検証データを作成する必要があります。

数週間前、バーモント州で大規模な洪水が発生しました。私たちの家のそばを明るく流れる小さな小川は、破壊のために猛威を振るう猛獣に変わりました。幸いなことに、私たちはほとんど被害を受けませんでしたが、残念ながら多くの人々が財産と生計を失いました。洪水の際、一時的に避難しなければならない可能性があったため、米国連邦緊急事態管理庁(FEMA)のウェブサイトでアドバイスを確認し始めました。ある程度の準備はしていましたが、トラブルが訪れたときにいくつかのことを再確認したかったのです。FEMAはPDFドキュメントやウェブページに非常に優れた簡潔なリソースを提供しており、私は検索を始めましたが、疑問に思いました…

  • 緊急時に、複数のドキュメントを検索して読む必要がない有益な情報をより速く入手する方法はありますか?

明らかな解決策の1つは、チャットボットに尋ねることです。私はチャットボットが時として過度に使用される傾向があると思いますが、時間が重要な場合には対話インターフェースの方が効率的であることは確かです。

これは新しいアイデアではありません。アメリカン・レッドクロスなどの組織は、災害対応のためのクララなどのボットを開発しています。しかし、最近新たに登場した有望なパターンは、OpenAIのGPT-4、MetaのLLAMA 2、そしてHuggingFaceにある多くのモデルなど、生成型AI大規模言語モデル(LLM)を使用して、指定された一連のドキュメントを索引付けし、対話的にやり取りすることです。Retrieval-Augmented Generation(RAG)と呼ばれるこのモデルは、提供されたコンテンツに応答を制限するため、災害対応などの重要な状況でLLMの幻覚を防ぐことができます。

しかし、命を救う可能性のある情報が取得される場合、これはどれほど安全なのでしょうか?

この記事では、米国連邦緊急事態管理庁(FEMA)の一連のドキュメントに基づいて災害安全に関する質問をするためのLangChain GPT-4チャットインターフェースの作成を簡単に探ります。高リスクな状況でこのテクニックを使用する場合に考慮すべき制限にも触れます。

FEMA災害準備と安全PDFドキュメント

この研究では、FEMAから34のPDFをダウンロードしました(以下にリストされています)。これらのドキュメントは、山火事、竜巻、洪水、地震、冬の嵐などの緊急事態に備えて対応するためのさまざまな災害関連のトピックをカバーしています。これはFEMAが提供する素晴らしいリソースの完全なセットではありませんが、チャットインターフェースのテストには十分なものです。

情報検索のためのドキュメントのインデックス作成

ダウンロードしたドキュメントは、LangChainを使用してPDFドキュメントを読み取ることができます。ドキュメントはテキストのチャンクに分割され、各チャンクには埋め込みモデルを使用して指紋(埋め込み)が与えられます。この分析では、OpenAIの埋め込みを使用しますが、LangChainは他にも多くの埋め込みをサポートしています。

import os
from langchain.document_loaders import PyPDFDirectoryLoader
from langchain.document_loaders import PyPDFLoader

files = 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.pdf
fema_protect-your-home_flooding.pdf
fema_protect-your-property-storm-surge.pdf
fema_protect-your-property_coastal-erosion.pdf
fema_protect-your-property_earthquakes.pdf
fema_protect-your-property_severe-wind.pdf
fema_protect-your-property_wildfire.pdf
fema_safeguard-critical-documents-and-valuables.pdf
fema_scenario_1-active_shooter-01102020.pdf
fema_scenario_10_power_outage_01102020.pdf
fema_scenario_10_power_outage_answer_key_01102020.pdf
fema_scenario_11_winter_storm_01102020.pdf
fema_scenario_11_winter_storm_answer_key_01102020.pdf
fema_scenario_12_small_business_01102020.pdf
fema_scenario_12_small_business_answer_key_01102020.pdf
fema_scenario_1_active_shooter_TTX_answer_key-01102020.pdf
fema_scenario_2-tornado_TTX_answer_key-01102020.pdf
fema_scenario_2_tornado-01102020.pdf
fema_scenario_3-wildfire_TTX_answer_key-01102020.pdf
fema_scenario_3_wildfire-01102020.pdf
fema_scenario_4-hurricane-01102020.pdf
fema_scenario_4_hurricane_flood_TTX_answer_key-01102020.pdf
fema_scenario_5_extreme_heat-01102020.pdf
fema_scenario_5_extreme_heat_TTX_answer_key_01102020.pdf
fema_scenario_6-pet_preparedness_01102020.pdf
fema_scenario_6-pet_preparedness_TTX_answer_key_01102020.pdf
fema_scenario_7-shelter_in_place_TTX_answer_key_01102020.pdf
fema_scenario_7_shelter_in_place_01102020.pdf
fema_scenario_8_earthquake_01102020.pdf
fema_scenario_8_earthquake_answer_key_01102020.pdf
fema_scenario_9_pandemic_Influenza_01102020.pdf
fema_scenario_9_pandemic_answer_key_01102020.pdf
ready_12-ways-to-prepare_postcard.pdf
ready_document-and-insure-your-property.pdf

データの抽出を見ると、1つのドキュメントの情報は次の通りです。https://www.fema.gov/sites/default/files/2020-11/fema_protect-your-home_flooding.pdf …

import json

for 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 \n洪水から財産を守る\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- - -\n物件を所有することは、人々が人生で最も重要な投資の1つを行うことです。私たちは家と将来を提供するために一生懸命働いています。悪天候が近くに迫るときにそれを失うリスクをなぜ冒すのでしょうか?洪水はアメリカ合衆国で最も一般的かつ高額な自然災害で、どこでも発生する可能性があります。たった1インチの水でも、家に25000ドルの損害を与えることができます。自然災害を防ぐことはできませんが、被害を最小限に抑え、家と将来を守るために財産を確保する方法はあります。まず、自宅の基準洪水高(BFE)を確定します。 BFEは、高リスク地域での洪水時の水位の予想です。自宅がBFEよりも高い位置に建設されるべきか、他の建物がどの程度BFEよりも高い位置に建設されるべきかなど、地域の洪水管理規制に影響を与えるため、

私たちは、ドキュメントをページごとに分割していることがわかります。FEMAのドキュメントでは、各ページが独立したトピックである非常に簡潔なガイドであるため、これは合理的なアプローチですが、他のアプリケーションでは、LangChainのテキスト分割機能を使用してより詳細なレベルでテキストを分割する方が通常は良いです。

これで、テキストの抜粋を使用して埋め込みのデータベースを作成できます...

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()

埋め込みをファイルシステムに保存するために、シンプルなオプションを選択しましたが、パフォーマンスが問題となる大量のドキュメントがある場合には、Chromaはより多くのオプションをサポートしていることに注意してください。

対話インターフェースの設定

最初に1つのPDFを使用するため、結果を確認しやすくします...

import shutil
from langchain.chains import ConversationalRetrievalChain
from langchain.memory import ConversationBufferMemory
from langchain.llms import OpenAI
from langchain.chat_models import ChatOpenAI
from langchain import PromptTemplate, LLMChain
from dotenv import load_dotenv

def setup_model(vecs_dir: str, docs_sublist: list, all_docs: list) -> ConversationalRetrievalChain:
    docs = []
    for d in all_docs:
        d_dict = vars(d)
    if os.path.exists(vecs_dir):
        shutil.rmtree(vecs_dir)
    os.makedirs(vecs_dir)
    embedding_model = OpenAIEmbeddings()
    chat_model = ChatOpenAI(temperature=temperature, model_name="gpt-4")
    embeddings = OpenAIEmbeddings()
    vectordb = Chroma.from_documents(docs, embedding=embedding_model, persist_directory=vecs_dir)
    vectordb.persist()
    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_qa

vecs_dir = './vector_dbs/one_flood_doc'
docs = all_docs
docs_sublist = ['fema_protect-your-home_flooding.pdf']
pdf_qa = setup_model(vecs_dir, docs_sublist, docs)

上記では、チャットモデルにGPT-4を選択し、APIキーは.envファイルでOPENAI_API_KEYという変数で定義されていることを選択しました。LangChainは他にも多くのモデルをサポートしています。

わずか数行のコードで、ドキュメントのセットに対して対話インターフェースを設定し、LLMsのすべての機能を備えたチャットボットを作成しました。私は何年もの間、チャットボットを開発してきましたが、この簡潔なパターンは非常に多くの複雑さを軽減します。

素晴らしいLangChainパッケージに感謝します!

最初の質問をする

チャットの応答を検証するために参照するドキュメントも表示したいので、LangChainのメソッドをわずかに調整する必要があります(この解決策はこちらで提案されています)...

# A little mod to enable using memory *and* getting docs. See: https://github.com/langchain-ai/langchain/issues/2256#issuecomment-1665188576
import langchain
from typing import Dict, Any, Tuple
from langchain.memory.utils import get_prompt_input_key

def _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、今度は1つのPDFドキュメントについて質問する準備が整いました!

def ask_question(    query: str,    qa: object,    output_docs: bool = True) -> dict:    print(f"\n質問:\n{query}")    result = qa({"question": query})        print(f"\n回答:\n{result['answer']}")    if output_docs:        for doc in result['source_documents']:            print('\n')            print(json.dumps(vars(doc), indent=4))    return resultask_question("洪水に備えて自宅をどのように準備すればよいですか?", pdf_qa)

質問:洪水に備えて自宅をどのように準備すればよいですか?回答:洪水に備えて自宅を準備するためには、以下の手順を踏むことができます:1. 自宅の基本洪水水位(BFE)を決定します。これは高リスク地域での洪水時に水位がどれくらい上昇するかを示します。地元の洪水管理者にこの情報を見つけるのを手伝ってもらいましょう。2. 建物から水を遠ざけます。土地が建物から離れるように坂道になっていることを確認し、水が排水できる場所があることを確認します。雨樋をきれいにし、排水の問題を評価したり、雨水をバレルに集めたりします。3. 洪水で燃料タンクが転倒したり浮かんだりしないように、燃料タンクを固定します。4. 洪水から家を守るために、耐水性のある外部の壁材を追加し、浅い洪水が家に被害を与えるのを防ぐためにそれらをシールします。5. 浮揚、崩壊、または横方向の移動に対抗するために、製造住宅を永久的な基礎に固定します。6. 家の中で、保険請求のための財産のリストを準備または更新します。7. 洪水被害はほとんどの火災保険の補償対象外ですので、洪水保険を加入しましょう。8. 貴重品や重要な書類は、BFEより上の防水または耐水性のある容器に保管します。9. ユーティリティをBFEより上に据え付けます。10. カーペットをタイルに置き換えます。タイルは洪水に強いです。11. 地下室には、防水化合物で壁をシールし、排水ポンプの設置を検討します。12. 基礎壁、ガレージ、その他の閉鎖された場所に洪水用の換気口を設置し、水の流れを通して排水し、流出させます。13. 洪水に耐性のある断熱材と乾式壁を使用します。14. 下水の逆流を防ぐために、配管業者と相談し、該当する場合は下水の逆流防止弁を導入します。変更を加える前に、保険代理店、建築家、技術者、建設業者、または設計および建設の専門家などの専門家に相談することを忘れないでください。

それは非常に合理的に思えますので、この要約を生成するために使用されたコンテンツを確認してみましょう...

{    "page_content": "  \n  \n \n洪水からあなたの\n財産を保護する\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- - -\n物件を所有することは、多くの人々が人生で最も重要な投資の一つです。私たちは自分自身や家族の将来のために家と未来を提供するために一生懸命働いています。悪天候が身近に迫るときにそれを失うリスクをなぜ冒すのでしょうか?洪水はアメリカ合衆国で最も一般的で費用のかかる自然災害であり、どこでも発生する可能性があります。たった1インチの水でも、家に25000ドルの被害をもたらすことがあります。自然災害を防ぐことはできませんが、被害を最小限に抑え、自宅と将来を守るための方法があります。まず、自宅の基本洪水水位(BFE)を決定します。BFEは高リスク地域での洪水時に水位がどれくらい上昇するかを示します。BFEは、例えば、地域の洪水原管理規制に使用されるため、家やその他の建物がどれくらいBFEより高く建てるべきかなどに影響を与える可能性があります。地元の洪水原管理者にこの情報を見つけるのを手伝ってもらいましょう。洪水原管理者の検索に困っている場合は、FEMAの洪水マッピングおよび保険交換([email protected]または(877)FEMA MAP(1 877 336 2627))に連絡してください。以下に、洪水から自分自身と財産を守るために取ることができるいくつかの追加の手順があります。",    "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 

回答は素晴らしく、マッチした抜粋を見事に要約しています。ただし、ソースドキュメントの1ページを見落としているようです。このPDFは、洪水対策に関連する内容だけが含まれている短いドキュメントですので、ページを見落とすことは実際には重要です。

これは、ウェブ上のLLMパターンを盲目的に受け入れると見栄えの良い結果を得ることができますが、それらを本当に有用にするためには作業が必要です。

ドキュメントの文脈(メタデータ)は重要です

このシナリオでは、個々のテキストセクションが明示的にそれを言及していない場合でも、洪水に関連するドキュメントがあります。テキストの抜粋ごとにいくつかの文書メタデータ、つまり文書の文脈を提供すると、より良い結果が得られるかもしれません。

単純なテストでは、すべてのテキストの抜粋にファイル名(fema-protect-your-home-flooding.pdf)を前置詞として付け加え、句読点とサフィックスを削除し、「このスニペットはfema protect your home floodingに関連しています」というテキストを追加します。最終的な接頭辞は「このスニペットはfema protect your home floodingに関連しています」となります。これにより、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:    # インタレストがあるドキュメントのサブセット    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:                # より多くの文脈のためにコンテンツにファイル名を追加                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)    # ベクトルDBディレクトリの作成    if os.path.exists(vecs_dir):       

ビンゴ!それはPDFから重要なページをキャプチャし、うまく要約しているように思えます。もちろん、非常に荒っぽいアプローチですが、ファイル名だけでなくメタデータを使用するよりも形式的な方法の方が良いでしょう。また、プレフィックスではなくテンプレートを使用する方がよりエレガントかもしれませんが、このような文脈が少しでも役立つことを示しています。

では、セット内のすべてのドキュメントを使用するとどうなりますか...

vecs_dir = './vector_dbs/all_docs'docs = all_docs# Note the argument prefix_file_name_to_chunks=Truepdf_qa = setup_model(vecs_dir, all_docs_list, docs, prefix_file_name_to_chunks=True, extra_prefix="This snippet relates to ")result = ask_question("How do I prepare my home for floods?", pdf_qa)

質問:家を洪水に備えるにはどうすればよいですか?回答:家を洪水に備えるためには、次の手順を踏むことができます。1. 家族のための緊急計画を作成し、定期的に練習します。嵐が接近している場合は、避難し、車を高い場所に移動します。2. 高リスクの洪水地域に住んでいない場合でも、家とその中身の洪水保険を購入してください。3. 貴重品を文書化しておきます。必要な場合に保険の手続きをスムーズに進めるのに役立ちます。4. 貴重品や重要な文書をベース洪水高度(BFE)以上の防水または耐水性のある容器に保管します。5. 洪水による損傷を防ぐために、給湯器、洗濯機、乾燥機、電気パネルなどの家電製品や設備を上階に設置します。6. 断熱材、内装用のドライウォール、タイルなどの洪水に耐性のある材料を使用して、損傷を最小限に抑えます。7. ヤードが建物から離れ、水が排水できる場所があることを確認します。8. 燃料タンクを固定して、洪水による転倒や浮遊を防止します。9. 壁に洪水に耐性のある外装シースを追加し、ポンプや設備周りのすべての外部開口部をシールします。10. 造成された住宅を所有している場合は、永久的な基礎に固定されていることを確認してください。11. 自宅をBFEよりも高い位置に設置します。12. ヤード内のアイテムをアンカーで固定するか、より頑丈な構造

それは素晴らしい仕事をしました。https://www.fema.gov/sites/default/files/2020-11/fema_protect-your-home_flooding.pdf の主要な記事から情報を引き出し、さらに https://www.fema.gov/sites/default/files/documents/fema_protect-your-property-storm-surge.pdf の記事も引き出しました。これは洪水に言及しているセット内の他のドキュメントです。

検索プロンプトの長さ

この時点で、ドキュメントの抜粋を素敵な回答に変換する最終的な要約プロンプトは、抜粋のサイズと数に応じてかなり長くなることに注意する価値があります。LLM(Language Model)との持続的な戦いは、トークンの制限を超えることなく目標を達成することです。私たちのユースケースではほとんど影響がなかったものの、他のシナリオでは文脈の圧縮手法を使用する必要があるかもしれません。

質問の文脈は重要です

われわれは故意に、(i) 災害に備えること、および (ii) 危険な出来事に直ちに対応することに関連するドキュメントを混在させました。これにより、両方の文脈を混ぜた混乱した回答が生じる可能性があります...

result = ask_question("私は運河の隣に住んでおり、水位が今上昇しています。どうすればよいですか?", pdf_qa, output_docs=True)

質問: 私は運河の隣に住んでおり、水位が今上昇しています。どうすればよいですか?回答:水位が急速に上昇している場合は、安全を最優先に考えることが重要です。以下にいくつかの手順を示します:1. 避難: 水位が急速に上昇している場合は、できるだけ早く高い場所に避難することが重要です。2. 車を移動させる: 時間がある場合は、車を高い場所に移動させてください。全米気象局によると、わずか2フィートの水でも車を動かすことができます。3. 家を安全にする: 時間がある場合は、貴重品や重要な書類を上の階または少なくとも基準洪水高(BFE)より上に移動させてください。防水または耐水性のある容器に入れてください。4. 連絡を取る: 家族や友人、近所の人に状況を知らせてください。事前に決められた集合場所がある場合は、そこに向かうか、他の人に避難計画を伝えてください。5. 当局に連絡する: 地元の当局に状況を知らせてください。彼らは案内を提供し、危険にさらされている他の人にも警戒を呼びかけることができます。6. 洪水地図を確認する: インターネットにアクセスできる場合は、地域の洪水地図を確認して潜在的なリスクを把握してください。これらの手順は一般的なガイドラインです。洪水の状況では常に地元の当局や緊急サービスの助言に従ってください。

回答は今や少し混乱しており、「車を高い場所に移動させる」という即時の行動に関連するポイントと、「洪水保険を購入する」という準備に関連するポイントが混在しています。緊急時には人々がストレスを感じているため、プロンプトエンジニアリングを考えることはおそらくありません。したがって、われわれはやや曖昧な入力が予想されます。

もちろん、この問題はより多くのドキュメントメタデータを使用してサブグループに分割することで解決することもできますが、そのメタデータが利用できない場合は作業が必要です。別のオプションとして、質問により多くの文脈を提供して、ユーザーが災害の準備に興味があるのか、即座のヘルプが必要なのかを示すことが考えられます。これには分類器を構築することもできますが、強力なLLM(Language Model)の時代には、GPT-4を使用したゼロショット分類を使用しましょう...

def get_time_context(question):    template = """次の質問は「計画」または「即時の対応」に関連していますか?: {question}    次のいずれかで回答してください: '私は前もって計画しています:'、'私は即時の対応が必要です:'、または '曖昧です'"""    prompt = PromptTemplate(template=template, input_variables=["question"])    llm = OpenAI()    llm_chain = LLMChain(prompt=prompt, llm=llm)    answer = llm_chain.run(question)    return answerquestions = [    "私は運河の隣に住んでおり、水位が今上昇しています。どうすればよいですか?",    "助けて!私の屋根が飛ばされています!",    "ハリケーンで屋根が飛ばされるのを防ぐにはどうすればよいですか?",    "犬",    "洪水に備えて家を準備する方法は?"]for q in questions:    print(f"質問: {q}")    answer = get_time_context(q)    print(answer.strip(), "\n")

質問: 私は運河の隣に住んでおり、水位が今上昇しています。どうすればよいですか?私は即時の対応が必要です: 質問: 助けて!私の屋根が飛ばされています!私は即時の対応が必要です: 質問: ハリケーンで屋根が飛ばされるのを防ぐにはどうすればよいですか?私は前もって計画しています。 質問: 犬曖昧 質問: 洪水に備えて家を準備する方法は?私は前もって計画しています。 

素晴らしい!非常に最小限の努力で、質問が計画に関連しているのか、直ちに行動を起こすのかを簡単に判断することができます。

これで、ユーザーの質問の前に次のものを付け加えることができます...

def get_time_context(question: str) -> str:    template = """次の質問は「計画」に関連しているのか、「直ちに行動を起こす」のかを判断してください:{question}    以下のいずれかで回答してください:「私は事前に計画中です:」、「直ちに行動を起こさなければなりません:」、「曖昧です」"""    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:    # 最初に時間の文脈を取得する    if preprocess_time_context:        time_context = get_time_context(query)        if 'planning' in time_context.lower():            query = f"私は事前に計画中です:{query}"        elif 'take immediate action' in time_context.lower():            query = f"直ちに行動を起こさなければなりません:{query}"    print(f"\n質問:\n{query}")    result = qa({"question": query})        print(f"\n回答:\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("私は運河の隣に住んでおり、水が上昇しているのを見ています。何をすべきですか?", pdf_qa, output_docs=False, preprocess_time_context=True)

以下の結果が得られます...

質問:直ちに行動を起こさなければなりません:私は運河の隣に住んでおり、水が上昇しているのを見ています。何をすべきですか?回答:もし運河の隣で水位が上昇している場合は、緊急時の計画を即座に実行する必要があります。これには、自宅から避難し、車をより高い場所に移動するなどが含まれます。わずか2フィートの水でも車が流される可能性があるため注意が必要です。また、貴重品や重要な書類を洪水の基準水面高(BFE)より上の位置、できれば上階に保管し、防水または耐水性のある容器に入れることも重要です。時間がある場合は、給湯器、洗濯機、乾燥機、電気パネルなどの家電製品や設備を高い階に移動して、洪水の被害を防ぐようにしましょう。常に安全と家族の安全を最優先に考えてください。

素晴らしい、うまく機能し、保険を売り込もうとしなかったので、即座に行動できるアドバイスが得られました。

逆のテストを行いましょう...

result = ask_question("私の家を山火事に耐えるようにするためには何ができますか?", pdf_qa, output_docs=False, preprocess_time_context=True)

質問:私は事前に計画中です:私の家を山火事に耐えるようにするためには何ができますか?回答:以下の手順を踏むことで、家を山火事に耐えるようにすることができます:1. 非可燃性のカバリングを持つClass A-ratedの屋根を設置または交換します。屋根は山火事で最も危険な部分であり、そのサイズと方向性のためにリスクが高まります。2. 非可燃性または耐火性の材料で外壁カバリングを設置または交換します。壁の集合体の最低火災耐性評価は1時間が推奨されます。3. 家の周囲に30フィートの防御可能な空間を作り、可燃性の植生を減らすか除去し、砂利、レンガ、またはコンクリートなどの非可燃性材料を使用します。4. 屋根とガターから定期的に清掃し、屋根の上での火災の発生を減らします。5. 家の基礎を覆い、風で吹き飛ばされる燃えやすい炭素が家の下に入り込むのを防ぎます。6. 外部噴水システムや水タンクなどの専用電源を備えた外部散水システムを購入・設置することで、水へのアクセスを確保します。7. 大きな窓を放射熱から保護するために、マルチペインウィンドウ、強化安全ガラス、または防火シャッターを設置します。8. 消防士やその他の緊急対応者が迅速にあなたの物件を見つけるのを助けるために、目立つ通りの看板と物件の住所を設置します。9. 外壁や屋根の開口部周りの隙間を耐火性のシーリング材、モルタル、または耐火性の膨張性フォームで埋めます。10. 屋根裏の換気口や軒下の換気口を、火の粉が侵入しないように1/8インチ以下の金属ワイヤーメッシュで覆います。11. 枠壁の上部と家の基礎の間の隙間に防火壁を設置し、酸素を奪い火災の拡大を防ぎます。これらのヒントは、他のヒントと組み合わせて使用するとより効果的であり、あなたの物件に合わせて調整する必要があります。変更を行う前に、必ず保険代理店、建築家、エンジニア、請負業者、または他の設計と建設の専門家に相談してください。

完璧ですね、森林火災の準備情報を提供してくれました。

明らかに、実際の緊急時に使用される可能性のある高リスクなものについては、多くのテストが必要ですが、ユーザーのプロンプトを豊かにすることでパフォーマンスを向上させる方法の一つを示しています。

提供されたドキュメントからの回答のみを保証する

安全に影響を与える可能性のあるアプリケーションでは、提示される情報が提供されたドキュメントからのみ取得されることが重要です。誤った情報を含む幻覚は、非常に深刻な影響を与える可能性があります。

災害とはまったく関係のない質問をしてみましょう...

result = ask_question("スポンジケーキの作り方は?", pdf_qa, output_docs=False)

結果は次のとおりです...

質問:スポンジケーキの作り方は?回答:申し訳ありませんが、提供された文脈にはスポンジケーキの作り方に関する情報は含まれていません。

おいしいケーキの作り方を見つけられなかったことは少し悲しいですが、LangChainはこのシナリオをうまく処理し、質問が提供されたPDFガイドの情報と関連していないと判断しました。

それは良いことです、大きな幻覚はありません!災害時にスポンジケーキを作って宇宙船を飛ばすように言われたくないですからね。😊

会話履歴

LangChainの素晴らしい機能の一つは、会話履歴をシームレスに扱えることです。わずかなコードで、モデルは以前の質問を把握することができます...

result = ask_question("ハリケーンが来ています、どうすればいいですか?", pdf_qa, output_docs=False)質問:緊急措置が必要です:ハリケーンの予報があります、どうすればいいですか?回答:ハリケーンの予報がある場合、以下の緊急措置を取る必要があります:1. あなたの地域の洪水のリスクを確認します。これは、https://msc.fema.gov/portal/homeにアクセスし、自宅の住所を入力することで行うことができます。2. ハリケーンウォッチとハリケーンウォーニングの違いを理解します。ハリケーンウォッチは、特定の地域でハリケーンの状況が可能であり、トロピカルストームフォースの風の予想される開始の48時間前に発行されます。ハリケーンウォーニングは、特定の地域でハリケーンの状況が予想され、トロピカルストームフォースの風の予想される開始の36時間前に発行されます。3. 家の周りで洪水の影響を軽減するための対策を取ります。これには、洪水のリスクが最も高い場所に砂袋を置くことや、エアコン、発電機、サーキットブレーカーなどの機械装置を高く設置して、暴風潮による影響のリスクを最小限に抑えることが含まれます。4. 電力が落ちた場合に人々が所在を把握できるよう、中央の集合場所を設定します。5. 水、応急処置キット、懐中電灯、電池、手回し/太陽光発電ラジオ、非常食、現金、レンチ、ハンドサニタイザー、ミラーブランケット、耳栓、本やトランプのデッキなどを含むGo-Kitを準備します。6. ハリケーンウォッチまたはハリケーンウォーニングが発令される前に、アイテムとサービスを用意してください。これには、愛する人のための快適なアイテムを詰め込んだり、定期的なメンタルヘルスセラピーが必要な親戚が避難所の場所を知っていることを保証したりすることが含まれます。7. 重要な文書をジップロックバッグに保管し、安全な場所に保管します。または、クラウドドライブ、代替の場所に保管されたフラッシュドライブ、または安全な預金箱に保存することもできます。8. ペット用のGo-Kitを作成し、食べ物、水、薬品、お気に入りのおもちゃなどを含めます。マイクロチップを埋め込んでいるか、少なくともIDタグを表示していることを確認してください。9. 地域の事前に定められた沿岸避難経路について把握してください。10. 電話回線や携帯電話の基地局が損傷された場合の通信方法を計画してください。これには、テキストメッセージやTwitter、Facebook、Instagramなどのソーシャルメディアプラットフォームの使用が含まれます。

それから、「それ」(ハリケーン)に言及する質問をしてみてください...

result = ask_question("もうすぐ到着します、助けてください!", pdf_qa, output_docs=False, preprocess_time_context=True)質問:もうすぐ到着します、助けてください!回答:以下は安全のために取るべきいくつかの緊急措置です:1. 洪水地域にいる場合は、安全な場所への避難を考慮してください。避難が不可能な場合は、自宅内の高い場所に移動してください。2. 窓を閉め、板で覆って家を固定してください。風で持ち上げられる屋外のアイテムを取り除いてください。3. 緊急用品を用意しましょう。これには、水、応急処置キット、懐中電灯、電池、手回し/太陽光発電ラジオ、非常食、現金、レンチ、ハンドサニタイザー、ミラーブランケット、耳栓、本やトランプのデッキなどを含むGo-Kitが必要です。4. ペットを飼っている場合は、それらのためのGo-Kitも用意しましょう。これには、食べ物、水、薬品、お気に入りのおもちゃなどが含まれます。マイクロチップを埋め込んでいるか、IDタグをつけていることを確認してください。5. 車にガソリンを満タンにし、避難が必要な場合に備えて準備しておきましょう。6. 電化製品の電源を抜いて、サージの被害を防ぎましょう。7. ラジオを聞いたり、信頼できるウェブサイトを確認するなどして、嵐の進路と強度について情報を把握しましょう。8. 家族とコミュニケーションを取り、みんなが計画を知っていることを確認しましょう。可能であれば、離れ離れになった場合の中央の集合場所を設定してください。9. 貴重品や重要な文書を安全で高い場所に保管するか、防水容器に入れて保管してください。10. 時間があれば、洪水のリスクが最も高い場所に砂袋を置いてください。覚えておいてください、あなたの安全が最も重要です。物質的なものは置き換えることができますが、命は置き換えることはできません。

完璧ですね、履歴を保持していて、私が何を指しているのかを知っています。プレッシャーの中で、ユーザーが追加の質問をすることが予想されるため、この能力は非常に重要です。たった2行のコードで実装されています!

翻訳

チャットボットをより多機能にするために、多言語対応を検討することができます。GPT-4などの多くの主要なLLMは、主要な言語にネイティブサポートを提供していますが、言語によって性能は異なる場合があります。

まずはポルトガル語から始めましょう...

from googletrans import Translatortranslator = Translator()q = translator.translate("How do I prepare my home for floods?", dest='pt')print("================ RAW =================")pdf_qa = setup_model(vecs_dir, all_docs_list, docs, prefix_file_name_to_chunks=True, extra_prefix="This snippet relates to ")result = ask_question(q.text, pdf_qa, output_docs=True, preprocess_time_context=True)q = translator.translate(result['answer'], dest='en')print("\n\n=============== TRANSLATED TO ENGLISH USING GOOGLE TRANSLATE =================\n")print(q.text)

================ RAW =================質問: 事前に計画しています: Como preparar minha casa para enchentes?回答:家を洪水に備えるためのいくつかの方法があります。1. 緊急時の計画を立てる: 家族のために緊急時の計画を作成し、定期的に練習してください。嵐が近づいてきたら、避難し、車を高い場所に移動させてください。2. 洪水保険を取得する: ほとんどの住宅保険は洪水の被害をカバーしていません。家と中身を洪水保険で保護してください。3. 家庭の持ち物のリストを作成または更新する: 所有物を文書化してください。これにより、保険の手続きがスムーズになり、クレームを提出する必要がある場合に役立ちます。4. 貴重品を保管する: 貴重品や重要な書類をBFE(できれば上の階)に保管してください。防水または耐水性のある容器に入れてください。5. 家電製品やユーティリティをBFEより上に配置する: 給湯器、洗濯機、乾燥機、電気パネルなどの家電製品やユーティリティを上の階に配置してください。これにより、洪水による損傷や破損を防ぐことができます。6. 洪水に耐える材料を使用する: 洪水に耐える断熱材、ドライウォール、タイルなどの床材を使用すると、損傷を最小限に抑えることができ、清掃や衛生管理が容易になります。7. 所有地と近隣を知る: 大きな湖や海に近くに引っ越す場合は、近所の人と話をしてください。彼らが抱えている問題や彼らが取った緩和策について調べてください。8. 家を高くする: 投資ではありますが、家を高くすることで洪水に対する所有地を準備し、洪水保険の保険料を削減することができます。9. 庭のアイテムを保護する: 安全でないアイテムは洪水によって流されたり損傷を受けたりする可能性があります。また、それらは家の中に持ち込まれ、損傷を引き起こす可能性があります。10. 亀裂や隙間を封じる: 窓やドアの周りのシーリングが割れていないか、壊れていないか、欠けていないかを確認してください。建物に入るパイプやワイヤーの周りの穴や隙間を埋めてください。常に専門家(保険代理店、建築家、エンジニア、請負業者、または他のデザインおよび建設の専門家)と相談してから、家の変更を行ってください。

正しい情報はどれですか。しかし、スワヒリ語では...

q = translator.translate("How do I prepare my home for floods?", dest='sw')print("================ RAW =================")pdf_qa = setup_model(vecs_dir, all_docs_list, docs, prefix_file_name_to_chunks=True, extra_prefix="This snippet relates to ")result = ask_question(q.text, pdf_qa, output_docs=True, preprocess_time_context=True)q = translator.translate(result['answer'], dest='en')print("\n\n=============== TRANSLATED TO ENGLISH USING GOOGLE TRANSLATE =================\n")print(q.text)

================ RAW =================質問: Mafuriko yanajitayarishaje nyumbani kwangu?答え:洪水から家を守るために取ることができるいくつかの手順があります:1. 建物から水を遠ざける:あなたの敷地内の建物から離れるようにエリアを確保し、水が排水する場所があることを確認してください。 雨水バレルには、雨水を集めるために、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨水バレルには、雨

結果は非常に妥当に見えますが、重要な情報が欠落しています。テキストの抜粋は、洪水の重要なセクションのいくつかを欠いており、洪水について質問したときには山火事に関連するスニペットもあります。基本的には、スワヒリ語の質問に対して英語のドキュメントから作成された埋め込みを使用すると、うまく機能しません。それは合理的ではありませんが、ラテン語系のポルトガル語ではうまく機能しました。

おそらくより堅牢なアプローチは、まず言語を検出してGoogle翻訳で英語に翻訳し、その後応答を元の言語に変換することです。

これをチャットインターフェースに追加しましょう...

def get_time_context(question: str) -> str:    template = """以下の質問は「計画」または「直ちに行動を起こす」と関連していますか?: {question}以下のいづれかで答えてください:「私は計画をしています:」または「直ちに行動を起こさなければなりません:」または「曖昧」"""    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:    # 自動翻訳    if auto_translate:        lang = translator.detect(query)        lang = lang.lang        print(f"検出された言語:{lang}")        q = translator.translate(query, dest='en')        query = q.text    # 時間コンテキストを最初に取得    if preprocess_time_context:        time_context = get_time_context(query)        if '計画' in time_context.lower():            query = f"私は計画をしています:{query}"        elif '直ちに行動を起こす' in time_context.lower():            query = f"直ちに行動を起こさなければなりません:{query}"    print(f"\n質問:\n{query}")    result = qa({"question": query})    # ソース言語に戻す    if auto_translate:        q = translator.translate(result['answer'], dest=lang)        result['answer'] = q.text        print(f"\n回答:\n{result['answer']}")    if output_docs:        for doc in result['source_documents']:            print('\n')            print(json.dumps(vars(doc), indent=4))    return result# スワヒリ語に翻訳するq = translator.translate("How do I prepare my home for floods?", dest='sw')print("================ 生のデータ =================")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=============== Google翻訳を使って英語に翻訳 =================\n")print(q.text)

Google Translateを使用してスワヒリ語を自動的に英語に翻訳し、その回答をスワヒリ語に戻すことで、PDFのセットから必要な情報をすべて取得することができます。災害対応のようなリスクの高いユースケースでは、もちろんネイティブスピーカーとの大量のテストが必要ですが、多言語対応への可能性を示しています。

より広い範囲の質問をする

では、最終バージョンを試して、さらに災害関連の質問をしてみましょう...

# Swahiliの会話履歴が使用されないように、モデルを再設定するvecs_dir = './vector_dbs/all_docs'docs = all_docspdf_qa = setup_model(vecs_dir, all_docs_list, docs, prefix_file_name_to_chunks=True, extra_prefix="This snippet relates to ")questions = [    "森林火災の場合、ペットにはどのような対策を取るべきですか?",    "屋根が吹き飛んでいます!助けて、どうすればいいですか?!!!",    "私は川のそばに住んでいます。洪水の心配はすべきですか?",    "内陸に住んでいる場合、海面の変化は影響を与えますか?",    "洪水保険を安く手に入れる方法はありますか?",    "地震が発生した場合、私たちはどうすればいいですか!!??",    "緊急キットにはどのようなものが必要ですか?",]for q in questions:    print("\n ===================== ")    ask_question(q, pdf_qa, output_docs=False, preprocess_time_context=True, auto_translate=True)

===================== 言語の検出: en質問: 即座に行動を起こす必要があります: 森林火災の場合、ペットにはどのような対策を取るべきですか?回答:森林火災が発生した場合、ペットのためにGo-Kitを用意する必要があります。これには食べ物、水、薬、Ziplocバッグに入れた医療記録、お気に入りのおもちゃ(該当する場合)などが含まれます。獣医の連絡先情報も含め、ペットにマイクロチップが埋め込まれているか、適切なIDタグが表示されていることを確認してください。避難する必要がある場合は、可能な限りペットを連れて行ってください。ペットを連れて行けない場合は、食べ物と水が利用可能な安全な場所にいるようにしてください。

より広い範囲の質問をする

では、最終バージョンを試して、さらに災害関連の質問をしてみましょう...

# Swahiliの会話履歴が使用されないように、モデルを再設定するvecs_dir = './vector_dbs/all_docs'docs = all_docspdf_qa = setup_model(vecs_dir, all_docs_list, docs, prefix_file_name_to_chunks=True, extra_prefix="This snippet relates to ")questions = [    "森林火災の場合、ペットにはどのような対策を取るべきですか?",    "屋根が吹き飛んでいます!助けて、どうすればいいですか?!!!",    "私は川のそばに住んでいます。洪水の心配はすべきですか?",    "内陸に住んでいる場合、海面の変化は影響を与えますか?",    "洪水保険を安く手に入れる方法はありますか?",    "地震が発生した場合、私たちはどうすればいいですか!!??",    "緊急キットにはどのようなものが必要ですか?",]for q in questions:    print("\n ===================== ")    ask_question(q, pdf_qa, output_docs=False, preprocess_time_context=True, auto_translate=True)

===================== 言語の検出: en質問: 即座に行動を起こす必要があります: 森林火災の場合、ペットにはどのような対策を取るべきですか?回答:森林火災が発生した場合、ペットのためにGo-Kitを用意する必要があります。これには食べ物、水、薬、Ziplocバッグに入れた医療記録、お気に入りのおもちゃ(該当する場合)などが含まれます。獣医の連絡先情報も含め、ペットにマイクロチップが埋め込まれているか、適切なIDタグが表示されていることを確認してください。避難する必要がある場合は、可能な限りペットを連れて行ってください。ペットを連れて行けない場合は、食べ物と水が利用可能な安全な場所にいるようにしてください。

これらはかなり素晴らしいと思います。いくつかの点検をしてみましたが、使用されているPDFドキュメントの主要なコンテンツをキャプチャしているようです。

[ 上記に基づいて、私の災害キットにはイヤープラグがあります! ]

パフォーマンスの評価

この分析では、チャットインタフェースがFEMAの一部のPDFドキュメントに対していかに重要な情報を返しているかを、一部のみ点検しました。これはいくつかの概念を示すのに役立ちますが、本番アプリケーションでは点検よりも優れたものが必要です。幸いにも、LangChainはいくつかの評価ツールを提供しており、特にストリームリットアプリケーションは自動的に質問応答ペアを生成し、これを使用してリトリーバルチェーンを評価することができ、開発者は関連するパラメータを試すことができます。私はまだこれを試していませんが、LLMを使用して評価データを自動的に生成するアイデアは、FEMA災害ボットのテストのためのより体系的なアプローチのための足場を構築するための素晴らしい方法のように思えます。

結論

FEMAのウェブサイト上の34のPDFドキュメントセットを使用して、LangChainとGPT-4を使用して、災害の備えと安全規則に関連するさまざまな質問に答えることができる多言語の会話インターフェースを簡単に構築することができました。ただし、高リスクの安全性に関わるチャットボットのためのこの一般的なドキュメントリトリーバルLangChainのパターンは、セマンティックサーチと同様の課題に直面しています。自然言語のニュアンスをより詳細に捉えるための高度なLLMエンベッディングを使用しても、重要なコンテンツを見落とすことは非常に簡単です。

FEMA災害ボットの使用例では、以下の理由により、重要なコンテンツが見落とされました:

  • 混合コンテキストのドキュメント — ドキュメントのメタデータを含めない場合、応答は異なるコンテキストの情報を混在させました。ドキュメント名を接頭辞として追加するだけで、シナリオのパフォーマンスが向上し、より洗練されたメタデータ戦略を適用することもできます。また、ゼロショットLLM分類器を追加して、ユーザーの質問を豊かにすることも役立ちました。
  • LLMで表現されていない言語 — LLM翻訳に頼ると、スワヒリ語などの表現が少ない言語のパフォーマンスが低下することがあります。自動的なGoogle翻訳の追加により、使用例のパフォーマンスが向上しました。

上記の問題に対処するための大まかな方法を探索しましたが、本番用のチャットボットでは、より高度な技術やテストと検証を通じて見つかる他の緩和策が必要です。

それでも、LLMが今日何ができるかはかなり驚くべきことです!

参考文献

こちらにすべてのコードのノートブックがあります。

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

データサイエンス

「ゼロからLLMを構築する方法」

「これは、大規模言語モデル(LLM)を実践的に使用するシリーズの6番目の記事です以前の記事では、プロンプトエンジニアリン...

機械学習

新技術における公共の利益の定義

新しいオンラインジャーナルが、テクノロジーを設計、実装、評価する個人の社会的責任について議論するために、MITコミュニテ...

機械学習

ニューラルネットワークの簡単な歴史

生物学的なニューロンからLLMsへ:AIが賢くなるまでの道のり

AIニュース

「GoogleはニュースのためのAIを宣伝し、ジャーナリストは置き換えられないと主張する」

「テック巨人は、AIによるツールはニュース報道の重要な役割を果たすジャーナリストの代替とする意図はないと述べています」

AIニュース

「2023年最高のAIプレゼンテーションツール」

現代のプレゼンテーションソフトウェアは、静止画のスライドと基本的なトランジションの時代を超えています。人工知能(AI)...

データサイエンス

Generating AI(AIを生成する) vs マシンラーニング(機械学習):区別の解読

「ジェネラティブAIと機械学習を使ってデータ駆動型の意思決定の世界を探検しましょうデータ変換におけるそれぞれの違いと役...