「人道的な災害状況報告チャットボットの研究−GPT-4-Turboとフルコンテキストプロンプティングの使用」

「美容とファッションのエキスパートが贈る最新トレンド情報!」

要約

この記事では、OpenAIの新しいGPT-4-Turboモデルを探求します。128kトークンのコンテキストウィンドウを使用して、情報検索のために完全なドキュメントコーパスを渡しました。この荒々しい力任せの方法は、より大きなコンテキストウィンドウでのみ可能であり、ドキュメントの埋め込みや意味的検索などのRAGで使用されるものは必要ありません。素晴らしいReliefWebプラットフォームで公開された人道災害状況レポートに適用され、Sparse Priming Representations(SPR)を使用して圧縮された場合、GPT-4-Turboは最近の災害に関する基本的な質問に答えることができます。ただし、OpenAIのトークンコストが最近低下したとしても、この方法は非常に高価であり、プレビューGPT-4-Turboモデルを提示すると非常に遅くなり、応答に最大1分かかる場合があります。すべてのLLM情報検索パターンにおいては、幻覚と情報の欠落を制御するために検証フレームワークを実装することが重要です。とはいえ、性能が向上しコストが低下するにつれて、GPT-4-Turboは能力の大幅な向上を提供し、急速に拡大するLLMツールキットに加わります。

The new GPT-4-Turbo has a larger context window of 128k tokens. Image generated by GPT-4 + Dall-E-3.

ここ数か月の間に、autogenmemgptSemantic Kernal、そしてOpenAIのGPTおよびGPT-4-Turboのリリースなど、驚くほどの速さで開発が進んでいます。それぞれには利点と欠点があり、一部はLarge Language Models(LLMs)の使用方法における潜在的なパラダイムシフトを示しています。非常に素晴らしい時代ですが、これらの新しいテクニックを実世界のアプリケーションで使用することは、最初の探索が示唆するほど簡単ではありません。

OpenAIがGPT-4-Turbo(プレビュー版)をリリース

OpenAIの最近のDevDayでの発表には、ジェネレーティブAIの風景を変える可能性のあるいくつかの新機能が含まれていました。その1つが、128kトークンの増加したコンテキストウィンドウ(プロンプト)制限を持つGPT-4-Turboのリリース(プレビュー版)でした。以前にはClaude AIが最も大きな商用コンテキスト制限である100kトークンを提供していたため、GPT-4-Turboはそれを超えるものとなります。さらに、OpenAIは、新しいモデルが指示に従う能力が向上し、GPT-4の3倍安くなると主張しています。LLMベンチマークのリーダーとして、GPT-4のどんな進歩も重要です。

コンテキストを増やすためのモデルトークン制限の増加

では、トークン制限の増加はなぜ重要なのでしょうか? LLMにプロンプトを提示する際に過去の会話を含めることができますので、即座な利点の1つは、プロンプトごとに会話履歴を提供することで、以前の会話の事実を覚えていることです。これは、現在重要な可能性がある以前の会話の事実を参照するために役立ちます。より大きなコンテキストウィンドウは、ドキュメントの内容やデータなどのサポート情報でチャットを「プリロード」することも可能です。

ただし、デメリットもあります。

トークンが増えると、コストが上昇し、パフォーマンスが低下します。トランスフォーマーアーキテクチャでは、メモリと計算要件が2次的に増加するため(単純な直線よりもはるかに速く)、長いコンテキストウィンドウはLLMの精度を低下させる可能性があるという研究もあります(Liu et al., 2023)。

GPT-4 Turbo の使用方法

この記事執筆時点では、GPT-4 Turbo はプレビューモードのみで利用可能で、モデル名は ‘gpt-4–1106-preview’ です。以下のように openai Python パッケージを使用して呼び出します…

import openaiopenai.api_key = '<YOUR KEY GOES KEY>'def run_llm(query, system_prompt, reference_content):    llm_query = {        "temperature": 1.0,        "max_tokens": 2000,        "top_p": 0.95,        "frequency_penalty": 0,        "presence_penalty": 0,    }    response = openai.ChatCompletion.create(        model=model,        messages=[  {                "role":"system",                "content": system_prompt            },            {                "role":"user",                "content": query            }        ],        temperature=llm_query['temperature'],        max_tokens=llm_query['max_tokens'],        top_p=llm_query['top_p'],        frequency_penalty=llm_query['frequency_penalty'],        presence_penalty=llm_query['presence_penalty'],        stop=None    )      answer = response['choices'][0]['message']['content']    return answer

ReliefWeb 災害状況レポートの分析

私たちは、ReliefWeb プラットフォーム上の 人道的な災害状況レポート を分析するために、GPT-4 Turbo のトークンの制限の増加を利用します。これらのレポート(Sitreps とも呼ばれる)は、世界中の人道的災害の監視と対応に不可欠です。また、私たちの分析のために GPT-4 Turbo のコンテキストウィンドウに収まるようにテキストコーパスを圧縮(要約)するデータも提供します。

災害レポートのコーパスの作成

ReliefWeb には、コンテンツにアクセスするための本当に素晴らしい APIがありますので、これを使用して災害と状況レポートのリストを抽出します…

import requests  import os  from bs4 import BeautifulSoup import reimport pandas as pdimport PyPDF2 import tracebackimport jsonimport astfrom langchain.text_splitter import RecursiveCharacterTextSplitterimport tiktokendef auto_translate(text):    """    この関数は自動的に言語を検出し、英語に翻訳します    Parameters:        text(str): 翻訳するテキスト    Returns:        text (str): 別の言語の場合は翻訳されたテキスト、それ以外の場合は入力テキスト    """    try:        lang = translator.detect(text)        lang = lang.lang        print(f"検出された言語: {lang}")        q = translator.translate(text, dest='en')        text = q.text    except Exception as e:        print("翻訳中にエラーが発生しました")    return textdef get_safe_name(name):    """    文字列を安全なファイル名に変換するための関数    Parameters:        name (str): 安全なファイル名に変換する文字列    Returns:        name (str): 安全なファイル名    """    name = str(name)    name = re.sub("[^0-9a-zA-Z]+", "_", name)    name = re.sub(r"_$","", name)    if len(name) == 0:        name = 'Unknown'     return namedef download_pdf(url, download_path):      """    URL から PDF をダウンロードしてローカルに保存する関数    Parameters:        url (str): オンライン PDF ファイルの場所        download_path (str): PDF を保存するフォルダ    """    response = requests.get(url)      with open(download_path, 'wb') as f:          f.write(response.content)    def save_text(content, file_path):      """    テキストをローカルファイルに保存する関数    Parameters:        content (str): 保存するテキスト        file_path (str): 保存するフォルダ     """    with open(file_path, 'w') as file:          print(f'{file_path} を保存しています')        file.write(content)    def extract_text_from_pdf(pdf_path):      """    PDF ファイルからテキストを抽出する関数    Parameters:        pdf_path (str): PDF ファイルへのパス    Returns:        text (str): PDF ファイルから抽出されたテキスト    """    print(pdf_path)    pdf_reader = PyPDF2.PdfReader(pdf_path)      text = ''      for page_num in range(len(pdf_reader.pages)):          page_obj = pdf_reader.pages[page_num]        text += page_obj.extract_text()      return text  def get_rw_data(keyword, filter, sort, fields, endpoint, limit=10, \                save_body_to_text=False):      """    ReliefWeb API からデータを抽出する関数。API の詳細については以下を参照してください:    https://apidoc.rwlabs.org/?utm_VoAGI=blog&utm_source=reliefweb+website&utm_campaign=api+doc+launching+2016_06    Parameters:        keyword (str): 検索文字列        filter (dict): ReliefWeb のフィルタ JSON        sort (dict): ReliefWeb のソート JSON        fields (list): 返すフィールドのリスト        endpoint (str): API のエンドポイント(例:reports, disasters)        limit (int): 返す最大レコード数        save_body_to_text (bool) : 本文をテキストファイルに保存するかどうかのフラグ、ページ上の PDF も含む    Returns:        all_data (pandas dataframe): API からのデータのデータフレーム    """    query = {          "appname": "myapp",          "query": {              "value": keyword        },          "filter":filter,        "sort": sort,        "limit": limit,          "fields": fields    }      endpoint = f"{reliefweb_api_url}/{endpoint}?appname=apidoc&query[value]="    print(f"{endpoint} の取得中...")      all_data =[]    response = requests.post(endpoint, json=query)      if response.status_code == 200:          data = response.json()          for article in data["data"]:             article_url = article['fields']['url']               try:                r = article['fields']                print(article_url)                article_response = requests.get(article_url)                  if save_body_to_text:                    soup = BeautifulSoup(article_response.text, 'html.parser')                      main_content = [p.text for p in soup.find_all('p')]                      article_text = ' '.join(main_content)                    save_text(article_text, docs_folder + '/{}.txt'.format(get_safe_name(article['fields']['title'])))                      for link in soup.find_all('a'):                          href = link.get('href')                          if href.endswith('.pdf'):                              download_path = os.path.join(docs_folder, href.split('/')[-1])                              if href.startswith('/attachments'):                                pdf_url = f'{reliefweb_pdf_url}{href}'                            else:                                pdf_url = href                            download_pdf(pdf_url, download_path)                              print(f".    {pdf_url} から PDF {download_path} をダウンロードしました")                            article_text = extract_text_from_pdf(download_path)                    r['article_text'] = article_text                    r['reliefweb_query'] = keyword                all_data.append(r)            except Exception as e:                print(f"{article_url} の抽出中にエラーが発生しました")                tb_str = ''.join(traceback.format_exception(None, e, e.__traceback__))                print(tb_str)        all_data = pd.DataFrame(all_data)        for f in ['disaster','theme']:            if f in list(all_data.columns):                all_data[f] = all_data[f].astype(str)        return all_data      else:          print(f"リクエストが失敗しました。ステータス:{response.status_code} {response.text}")          return None 

上記の機能について、興味深い点がいくつかあります…

  1. ReliefWebのコンテンツがPDFを参照している場合、そのテキストを抽出します
  2. テキストはGoogle Translate APIを使用して自動的に英語に翻訳されます
  3. 原典のために常にソースをキャプチャします
  4. このクイック分析では、APIレスポンスのページネーションは無視しています

2023年11月1日以降の災害状況レポートを取得するための関数の呼び出し方法は次のとおりです…

filter = {    "operator": "AND",    "conditions": [        {            "field": "disaster.status",            "value": "ongoing"        },        {            "field": "format.name",            "value": "Situation Report"        },        {            "field": "date.created",            "value": {                "from": "2023-11-01T00:00:00+00:00",                "to": "2023-11-30T23:59:59+00:00"            }        }    ]}sort = ["date.created:desc"]endpoint = "reports"fields = {      "include": ["title", "body", "url", "source", "date", "format", "theme",     "country", "status", "primary_country", "disaster", "language", "id"] }  reliefweb_query = ""articles = get_rw_data(reliefweb_query, filter, sort, fields, endpoint, 1000, True)

状況レポートはテキストファイルとしてファイルシステムに保存されます…

for index, row in articles.iterrows():    date = row['date']['created']    source = row['source'][0]['name']    title = row['title']    id = row['id']    filename = f'{get_safe_name(title)}__{id}_{get_safe_name(date)}.txt'    text = f'''        title: {title}        source: {source}        date: {date}        id: {id}        {row['article_text']}    '''    text = text.encode('utf-8','ignore').decode('utf-8','ignore')    print(text)    save_text(text, docs_folder + '/' + filename) 

Sparse Priming Representations (SPR)を使用したコンテンツの圧縮

状況レポートから生のテキストをGPT-4-Turboに提示することもできます。ただし、そのテキストの大部分は関連性がない(ストップワード、ヘッダー、フッターなど)ため、それらをすべて含めると、GPT-4-Turboの拡張トークン制限を超える恐れが非常に高くなります。その代わりに、Sparse Priming Representations (SPR)という技術を使用してドキュメントをキーファクトに圧縮します。量的情報を保存するため、若干修正します。

私たちはGPT-4-Turboに提供するシステムプロンプトは次のようになります…

# ミッションあなたはSparse Priming Representation (SPR)ライターです。SPRは、最新の大規模言語モデル(LLM)に特に有用なNLP、NLU、およびNLGのタスクのための言語の特定の使用方法です。ユーザーから情報を提供され、それをSPRとしてレンダリングする必要があります。# 理論LLMは一種のディープニューラルネットワークです。それらは推論から計画、さらには心の理論まで、理論能力や概念などの知識や能力を埋め込むことが示されています。これらは潜在的な能力と潜在的なコンテンツと呼ばれ、潜在空間として総称されます。 LLMの潜在空間は、正しい単語のシリーズを入力として使用することでアクティブ化され、ニューラルネットワークの有用な内部状態を作成します。これは、適切なショートカットキューが人間の心を特定の方法でプライムするのと似ています。人間の心と同様に、LLMは連想的であり、正しい関連性を使用するだけで別のモデルを同じように「プライム」することができます。ただし、定量的なメトリックは保存する必要があります。# 方法論入力を簡潔な主張、関連、概念、類推、比喩のリストとしてレンダリングします。コンセプチュアルにできるだけ多くのものをキャプチャしますが、なるべく少ない単語で済ませるようにします。定量的な詳細をすべて保存しながら、あなたの理解に合わせて書いてください。将来の受け手は別の言語モデルであり、人間ではありません。

これにより、「アフリカポリオ研究所ネットワークの通報(2023年第1週-第42週)」というタイトルの状況レポートが次のように要約されます…

- 情報は世界保健機関から提供されています。- 週ごとのデング熱の症例は減少し、今週は12,634件が報告されました。- 今週は78人のデング熱関連の死亡がありました。- 2023年1月以来の累積症例数は267,680件で、死亡率は1,333件です。- シレットを除くすべての地域で症例は減少しています。- ファリドプール、クルナ、ラージシャヒ、ラージバリの地区でデング熱の症例が増加しています。- 10月26日にダッカでエントモロジストのためのWHOのオリエンテーションセッションが開催されました。- 全体的な症例致死率(CFR)は0.5%ですが、今週は0.62%です。- ダッカ地域が最も多くの症例と死亡を報告しています。- 今週は治療後に13,430人が退院しました。- 男女の死亡比率:43%対57%。- 最も多い死亡者は16-55歳の年齢グループです。- 4つのデング熱ウイルスが循環しています:DENV-1(2.2%)、DENV-2(68.1%)、DENV-3(25.4%)、DENV-4(0.2%)。- 10月29日から11月4日まで全国的にデング熱予防および清掃週間が開催されました。- アウトブレイク対応の技術サポートのためにWHOの専門的なエントモロジストがバングラデシュに派遣されました。- ロヒンギャ難民キャンプでは、週ごとのデング熱の症例数が減少し続けています。累積症例数は12,969件で、死亡数は17件(CFR:0.1%)です。

原文書よりもはるかに少ないテキストです。

情報の欠落を制御するための重要な分析とチェックを行わずにこの圧縮を使用することはお勧めしませんが、テストでは十分です。

ここにレポートを圧縮するためのコードがあります…

# gpt4 turbo is 128k chunk_size = 100000llm_query = {    "prompt": "",    "temperature": 1.0,    "max_tokens": 2000,    "top_p": 0.95,    "frequency_penalty": 0,    "presence_penalty": 0,    "system_prompt":"""        # ミッション        あなたはSparse Priming Representation(SPR)ライターです。 SPRは、NLP、NLU、およびNLGの高度なタスクにおける特定の言語の使用方法です。最新世代の大規模言語モデル(LLM)に特に役立ちます。ユーザーから情報を受け取り、SPRとしてレンダリングする役割があります。        # 理論        LLMは深層ニューラルネットワークの一種です。これらは推論から計画、さらには心の理論まで、さまざまな知識、能力、概念を埋め込むことが実証されています。これらは潜在的能力と潜在的内容と呼ばれ、共に潜在空間として参照されます。 LLMの潜在空間は、正しい単語のシリーズを入力として使用することで活性化することができます。これにより、ニューラルネットワークの有用な内部状態が作成されます。これは、適切な手短な手がかりが人間の思考を特定の方法に導かせるのと似ています。人間の心と同様に、LLMも連想的であり、同じ方法で思考するために正しい関連性だけを使用する必要があります。例外は定量的な指標であり、これは必ず保存する必要があります。        # 方法論        入力を、簡潔な文、主張、関連、概念、類比、および比喩の蒸留されたリストとしてレンダリングします。可能な限りコンセプトを捉える一方で、できるだけ少ない言葉で書きますが、すべての定量的な詳細を保持します。将来の観客は人間ではなく、別の言語モデルであるため、あなた自身に意味をなすように書いてください。    """}# Save textsfor index, row in articles.iterrows():    date = row['date']['created']    source = row['source'][0]['name']    report = row['title']    id = row['id']    text = row['article_text']    primary_country = row['primary_country']['name']    disaster = ''    disaster_types = ''    for d in ast.literal_eval(row['disaster']):        disaster += f"{d['name']}; "        for t in d['type']:            if 'primary' in t and t['primary'] == True:                disaster_types += f"{t['name']}; "    d = {        "disaster": disaster,        "date": date,        "disaster_types": disaster_types    }    prefix = ""    filename = f'{get_safe_name(report)}__{id}_{get_safe_name(date)}.txt'    header = f'- report: "{report}"\n- disaster: "{disaster}"\n' + \             f'- disaster_types: "{disaster_types}"\n' + \             f'- primary_country: "{primary_country}"\n- source: "{source}"\n' + \             f'- date: "{date}"\n- id: "{id}"\n'    text_splitter = RecursiveCharacterTextSplitter.from_tiktoken_encoder(        chunk_size=chunk_size, chunk_overlap=100    )    texts = text_splitter.split_text(text)    print(f"\n\n================ {report} =================\n")    print(primary_country)    print(disaster)    print(len(texts))    summarized_text = ''    for i, t in enumerate(texts):        response = openai.ChatCompletion.create(        model=model,        messages=[  {                "role":"system",                "content":llm_query['system_prompt']            },            {                "role":"user",                "content":t            }        ],        temperature=llm_query['temperature'],        max_tokens=llm_query['max_tokens'],        top_p=llm_query['top_p'],        frequency_penalty=llm_query['frequency_penalty'],        presence_penalty=llm_query['presence_penalty'],        stop=None)          summary = response['choices'][0]['message']['content']        summarized_text += "\n" + summary    summarized_text = auto_translate(summarized_text)    summarized_text = header + summarized_text    summarized_text = summarized_text.split("\n")    summarized_text_prefixed = ''    for s in summarized_text:        summarized_text_prefixed += f"{prefix}{s}\n"    print(summarized_text_prefixed)    save_text(summarized_text_prefixed, docs_folder2 + '/' + filename)

上記では、GPT-4-Turboによって返されたSPRの要約と報告に関するメタデータを追加しました。圧縮されたレポートはテキストファイルとして保存されます。

災害の大まかなリストの抽出

ReliefWebからも、情報リクエストの支援として、システムのプロンプトで使用するために、災害の大まかなリストを抽出します…

filter = {    "operator": "AND",    "conditions": [        {            "field": "status",            "value": "ongoing"        },        {            "field": "date.event",            "value": {                "from": "2020-01-01T00:00:00+00:00",                "to": "2023-11-30T23:59:59+00:00"            }        }    ]}sort = ["date.event:desc"]endpoint = "disasters"fields = {      "include": ["name", "description", "date", "url", "id","status","glide"] } reliefweb_query = ""disasters = get_rw_data(reliefweb_query, filter, sort, fields, endpoint, 1000, False)display(disasters)disasters.to_csv('disasters.csv')

これにより、簡潔なリストが得られます…

List of disasters as extracted using ReleiefWeb API disasters endpoint

GPT-4-Turbo用のプロンプトの作成

現在、災害のリストと圧縮された状況レポートを持っています- 11月1日から11月10日までの重要な事実をリストアップしています。

それらを1つのテキストファイルに結合し、GPT-4-Turboのシステムプロンプトの一部として使用します…

disasters = pd.read_csv('disasters.csv')concatenated_content = "=========== このセクションは災害のリストを示しています =========== \n\n "+ disasters.to_csv() concatenated_content += "\n\n=========== このセクションは各災害のレポートを提供します =========== "for f in os.listdir(docs_folder2):  with open(f"{docs_folder2}/{f}", "r") as file:      file_content = file.read()      concatenated_content += f"\n\n----- レポート:{f} ----- \n\n"      concatenated_content += file_content + "\n\n"

トークン数とコストはどれくらいですか?

def num_tokens_from_string(string: str, encoding_name: str) -> int:    encoding = tiktoken.get_encoding(encoding_name)    num_tokens = len(encoding.encode(string))    gpt4_token_cost_per_1000 = 0.01    cost = (num_tokens/1000.0)*gpt4_token_cost_per_1000    return num_tokens, costtokens, cost = num_tokens_from_string(concatenated_content,"cl100k_base")OpenAIトークン数:82001($0.82001)

したがって、1,000トークンあたり$0.01のコストがかかるとして、上記で作成されたテキストのコストは$0.82です。また、完了トークンのコストもありますが、入力コストよりもずっと少ないはずです。

痛い!

私たちはこの力ずくの技術が私たちの特定のタスクに対処する最善の方法ではないことを知っていましたが、高いコストも別の理由です。

今、テキストが揃ったので、システムのプロンプトを作成できます…

def run_llm(query, reference_content):    llm_query = {        "temperature": 1.0,        "max_tokens": 2000,        "top_p": 0.95,        "frequency_penalty": 0,        "presence_penalty": 0,    }    response = openai.ChatCompletion.create(        model=model,        messages=[  {                "role":"system",                "content": f"""あなたはReliefWebの災害ボットです。                                 災害に関する情報を提供します。                                 災害のリストが求められた場合、'Disasters'セクションのみを提供してください。                                 災害の詳細が求められた場合は、'Situation Reports'セクションからその情報を抽出してください。                                   {reference_content}"""            },            {                "role":"user",                "content": query            }        ],        temperature=llm_query['temperature'],        max_tokens=llm_query['max_tokens'],        top_p=llm_query['top_p'],        frequency_penalty=llm_query['frequency_penalty'],        presence_penalty=llm_query['presence_penalty'],        stop=None    )      answer = response['choices'][0]['message']['content']    return answer

連結したテキスト内の異なる情報の種類に関する指示が、システムのプロンプトに含まれていることに気付くでしょう。素早いプロンプトの実験によって、これによりより良い結果が生み出されました。

人道的な災害状況報告ボットのテスト

さあ、始めましょう…

answer = run_llm("今年のネパール地震の最新の状況は何ですか?", concatenated_content)print(answer)

2023年11月現在のネパール地震に関する最新の状況は以下のとおりです:- 地震: 西ネパール、マグニチュード6.4、2023年11月3日に発生、震源地はJajarkotのRamidanda地区です。- 死者: 154人の死者、364人以上の負傷者。- 避難: 約25万人が影響を受け、多数の家屋が損壊または破壊されました。- インフラ: 13地区にわたって6.2万棟以上の家屋が損傷を受けました(完全に損傷したのは26,557棟、部分的に損傷したのは35,455棟)。いくつかの政府建物も被害を受けました。- 人道支援: 国連および他の人道機関による救援活動が活発に行われ、医療テント、子供向けのスペース、水衛生供給品、心理社会的サポートなどが提供されています。- 回復・復興: 回復・復興の段階では、国際的な支援が協調と戦略の策定において到着しています。- 教育と健康サービス: 約8万人の子供たちが被災により教育が中断され、保健サービスにも影響が出ており、栄養失調のリスクが増大し、母子医療のケアが複雑化しています。なお、これは2023年11月10日までの利用可能なデータの簡略なまとめであり、状況が変化し、さらなる評価が行われるにつれて、さらなる情報が更新される可能性があります。

全体的には、これは災害に関するかなり良いまとめです。事実がReliefWebの災害ページと(この記事作成時から変更される可能性があるが)これらの研究のために使用された最新の状況報告とよく一致しています。

ただし、1つの事実はわずかにずれており、データによれば153人が亡くなったとされていますが、モデルは154人と返答しました。

answer = run_llm("2023年のネパール地震で亡くなった人は何人いますか?", concatenated_content)print(answer)2023年11月のネパール地震で死者は153人です。

したがって、最初のプロンプトでは「知られている」が、幻覚が起こっていました。LLMのすべての応用において、検証とチェックが重要で、こうした問題を検知するための鍵となります。

では、状況報告書を作成している組織についての情報を得ましょう(11月1日から10日までの期間について)…

answer = run_llm("ネパール地震の状況報告書(sitrep)を提供している組織をリストアップしてください", concatenated_content)print(answer)ネパール地震の状況報告書(sitrep)を提供している組織には以下が含まれます:- 人道問題調整事務所(OCHA)- ネパール赤十字社- 国際連赤十字・赤新月社連盟(IFRC)- 国連ネパール駐在協調事務所- 世界保健機関(WHO)- 国連児童基金(UNICEF)- ネパール国連チーム

ReliefWebの同じクエリと比較すると、これは正しいようです。

さらに詳細な質問をしてみましょう…

answer = run_llm("避難された人々の中で子供は何人いますか?", concatenated_content)print(answer)提供されたデータでは、異なる報告書において災害の影響を受けた子供について言及されていますが、避難した子供の具体的な数値はいずれの抜粋にも直接記載されていません。避難により影響を受ける子供の数を正確に把握するには、より詳細な報告書や子供の避難人数を特にフォーカスしたデータソースを検討する必要があります。

状況報告書を見ても、この情報を見つけることはできませんでした。これは真実であることを確認するために、より詳細なバックチェックが必要です。

次に、可能な疾病と健康への影響について尋ねてみましょう…

answer = run_llm("2023年のネパール地震における疾病リスクは何ですか?", concatenated_content)print(answer)2023年のネパール地震による疾病リスクは、UNICEFが公表した人道的な状況報告書第2号によれば、主に栄養失調(特に5歳未満の子供の間で)と被災者の心理的ストレスに集中しています。地震による医療および水衛生(WASH)サービスの混乱が、健康リスクをさらに悪化させています。主な疾病リスクや健康上の懸念事項は以下の通りです:1. 栄養失調: 食糧供給チェーンの混乱により、特に子供などの脆弱な人口において栄養失調のリスクが高まります。2. 母子保健: 妊婦や新生児は、医療サービスの混乱と必要な医療ケアや施設へのアクセスの欠如により、健康リスクが増加する可能性があります。3. 心理的ストレス: 地震、愛する人の喪失、避難によるトラウマは、重要な心理的ストレスと精神的健康問題を引き起こす可能性があります。4. 怪我と身体的健康: 多くの人々が負傷し、身体的なけがやトラウマの治療が増加しています。 5. 伝染病: 一時的な避難所の過密状態が、適切な衛生設備のない状況下で伝染病の感染を引き起こす可能性があります。6. 給水・蚊媒介疾患: 清潔な水と衛生の不足は、下痢、コレラ、赤痢などの水系感染症のリスクを高めます。また、マラリアやデング熱などの蚊媒介疾患への懸念もあります。7. 非伝染性疾患: 定期的な健康サービスの混乱は、慢性非伝染性疾患の管理や治療に影響を与える可能性があります。8. 定期的な予防接種の中断: 定期的な予防接種サービスの中断が、ワクチンによって予防可能な疾患のリスクを増加さ

データとしてのUNICEFレポートを見ると、私たちのSPF要約でも上記は主要なポイントを捉えているように思えます。ただし、ここで使用されているデータにはレポート番号1しかありませんが、上記ではレポート番号2が言及されています。また、自動的なバックチェックが必要なLLMの返答の一部の妄想も、再び示されています。

結論

GPT-4-Turbo - 128kのコンテキストウィンドウの増加と改善された指示の追従能力を備えています - が情報検索のために必要なすべてのテキストデータをシステムプロンプトとして含めることで、非常に短時間で分析のアイデアを得るという目的のための非常に素早い分析です。この力技的なアプローチが私たちの課題に対して最善の技術でしょうか?

おそらくまだそうではありません。

パフォーマンスは重要な考慮事項です。プロンプトには30秒以上かかっており、ユーザーエクスペリエンスには適していません。

コストも制約があります。各プロンプトでフルコーパスを提供するために必要なトークンが増えるため、この分析では1回のプロンプトごとに$0.82かかります!そのため、LLMのコストが高い限り、他の技術が多くの組織にとってより魅力的になることは間違いありません。ただし、私は年々減少するストレージのコストを思い出しますし、おそらく時間の経過とともにLLMのコストも同様に減少するでしょう。

コードを生成してデータをクエリする代わりに、LLMに登録された関数を使用し、結果を検証するための複数のエージェントを使用するなど、より安価で正確なオプションが他にもあるかもしれません。これにより、文書を圧縮してコーパスをコンテキストウィンドウに収める必要がなくなり、情報の損失を回避できます。

それにもかかわらず、私たちはGPT-4-Turboをプロンプトとして与えられた圧縮された文書のコーパス上で基本的な情報検索をサポートすることができました。これには実装が非常に容易であるという利点があります - すべての情報を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