RAGアプリの精度を確認してみた

背景や目的


1.RAGの精度を確認してみたく、できるだけ一般的な環境で構築をした上で、実験をしてみました。
2.構築方法はこちらにありますので、必要に応じて御覧ください。 
3.この記事では、性能評価のみをピックアップして記載します。

全体構成


・構築したRAGの構成は下図の通りです。

・既存サービス(AWS Kendra)とベクターデータを自前で作成する方法(embeddings)の2通り、試してみました。
・構築自体は前の記事で説明済みです。

実験用データ


検索対象とするデータは以下の2つです。

・ 操作説明書.pdf(全部で22ページのpdf)

・ train_data.xlsx(架空の人物のプロフィール)

 

操作説明書.pdfの内容イメージ

あるアプリの説明書です。

 

train_data.xlsxの内容イメージ

架空の人物(愛上 尾根)のプロフィールを11個記載した内容です。

必要なデータ変換


1.Kendra用

・ 操作説明書.pdf はそのままです。

・ train_data.xlsx はQA部分のみテキストテータで抽出し、pdfに変換します。

2.Embeddings用

・ 操作説明書.pdf はテキストデータ抽出後json形式にし、vectorデータを追加します。

・ train_data.xlsx はQA部分を抽出後json形式にし、vectorデータを追加します。

Kendra用データ(train_data.xlsxのpdf化)の作成手順


1.エクセルファイルの列(質問)と列(回答)をコピーします。

2.メモ帳(等のテキストエディタ)にペーストし、テキストとして保存します。

3.メモ帳の印刷機能(Microsoft Print to PDF)にて、pdf形式に変換します。

Embeddings用データの作成手順


以下の2ファイルをそれぞれ作成します。

1.操作説明書.pdf からvectorデータ付きJSONファイルを作成します。

・テキストエディタを開き、”title”と”body”を要素としたJSONファイルを作成します(下図参照)。

・”title”の値は、 vectorデータにしない参考情報なので図のように記入しておきます。

・” body”の値は、 操作説明書.pdfからテキスト部のみコピー&ペーストにて転記します。

・ファイル名をembeddings_input.txtとして、保存する。元ファイルはこれで完了です。

・次に、Google colabo で、vectorデータを作成する。まずはOpenAIのインストールします。

Python
!pip install --upgrade openai

・ embeddings_input.txtを参照できるように、ファイル設置先をマウントします。

Python
### ドライブをマウントしておく
from google.colab import drive
drive.mount('/content/drive')

・ vectorデータを生成し、それを追記したファイル作成をするスクリプトを書きます。

Python
###embeddings用ファイルを作成
from openai import OpenAI
import json

client = OpenAI(api_key = "sk-******")

with open('/content/drive/MyDrive/llm_tmp/embeddings_input.txt') as f:
    docs = json.load(f)

index = []
for doc in docs:
    print(doc['body'], '-----------')
    response = client.embeddings.create( #embedding(値)を取得
        input=doc['body'],
        model="text-embedding-ada-002"
    )
    print(response.data[0].embedding)
    print('title:', doc['title'], 'body:', doc['body'])
    index.append({#embedding(値)を元データに追加
        'title': doc['title'],
        'body': doc['body'],
        'embedding': response.data[0].embedding
    })

with open('/content/drive/MyDrive/llm_tmp/embeddings_data.json', 'w', encoding="utf-8") as f:
    json.dump(index, f, indent=2, ensure_ascii=False)

・ セルを実行すると、embeddings検索用のjsonファイルが作成されます。

・ ファイルembeddings_data.jsonが作成され、これで完了です。

2.train_data.xlsx からvectorデータ付きJSONファイルを作成します

・操作説明書.pdfと同様に、”title”と”body”JSONファイルを作成します。

・”title”は、 train_data.xlsxの列「質問」の値をセットします(検索では未使用の参考値)。

・” body”は、 同じエクセルの列「回答」の値をセットします(ここが検索対象となる)。

・ファイル名をembeddings_input2.txtとして、保存する。元ファイルはこれで完了です。

・次に、Google colabo で、vectorデータを作成する。方法は前述の通りです。

・スクリプトのセルを実行すると、操作説明書.pdfと同様にjsonファイルが作成されます。

・ ファイルembeddings_data2.jsonが作成され、これで完了です。

・ 最後に、embeddings_data2.jsonの内容をembeddings_data.jsonへ追記し、1つのファイルに全データを収容しておきます。

Lambdaで処理作成


今回作成した処理は、以下の通りです。

1.フロント画面

2.Kendra利用部

3.Embeddings利用部

4.検索後コンテクスト利用ChatGPT回答生成部

5.ChatGPT直接依頼(検索連動無し) ※何かの参考になるかと、これも用意

フロント画面


1.データデコードの関数

・POSTデータを受理する前処理です。

・base64形式でデコードし、urllib.parseでJSONをdict型に変換しておきます。

 ※Lambdaの場合、リクエストbodyはJSON化されたペイロードに含まれる点に注意。 

Python
import json
import urllib.parse
import base64

def decode_body(event_body):
    body_query = base64.b64decode(event_body).decode()
    body_dict = urllib.parse.parse_qs(body_query)
    for key in body_dict: # listからvalueを取り出す
        body_dict[key] = body_dict[key][0]
    return body_dict

2.Lambdaのメイン関数

・URLアクセス受信時に最初に処理される関数です。

・POSTパラメータを受理し、それを使い処理実行し、ベースのHTMLを一部加工し、httpレスポンスを返却しています。

Python
def lambda_handler(event, context):
    # Receive POST param
    question, submit_no = '', '0'
    if ('body' in event):
        request_body = decode_body(event['body'])
        if 'question' in request_body:
            question = request_body['question']
            search_res_list, bot_reply = [], ''
        if question != '':
            if submit_no == '1':
                search_res_list = use_kendra(question, page_size=1, n=3)
                bot_reply = ask_gpt(question, search_res_list)
    # Output HTML
    path = './template1.html'
    with open(path) as f:
        html_body = f.read()
    result_text = ''
    for search_res in search_res_list:
        result_text += search_res + '\n'
    html_body = html_body.replace('%question', question)
    if submit_no == '1':
        html_body = html_body.replace('%search_result1', result_text)
    return {
        'statusCode': 200,
        'headers': {
            'Content-Type': 'text/html',
            'charset': 'UTF-8',
        },
        'body': html_body
    }

Kendra利用部


1.Kendra検索関数

・Kendraの検索実行部、「use_kendra」関数です。

・「DocumentExcerptを、GPT向けのコンテクストに使いました。

Python
import json
import urllib.parse
import base64
import numpy as np
import textwrap
import sys
sys.path.append('/mnt/efs/sklearn')
from sklearn.metrics.pairwise import cosine_similarity
from openai import OpenAI
import boto3

KENDRA_INDEX_ID = '72548c6a-****-****-****-************'

def use_kendra(question: str, page_size, n): # Kendra検索関数。question: 質問、page_size: ページサイズ、n: 個数(1〜)
    ret_list = []
    kendra = boto3.client('kendra')
    response = kendra.query(
        IndexId=KENDRA_INDEX_ID,
        QueryText=question,
        PageSize=page_size,
        AttributeFilter={
            "EqualsTo": {
                "Key": "_language_code",
                "Value": {"StringValue": "ja"},
            },
        },
    )
    results = response['ResultItems'][:n] if response['ResultItems'] else [] # 返却用にKendra結果を最大n個準備
    for item in results:
        excerpt = item.get('DocumentExcerpt').get('Text') # 抜粋情報 これを使う
        document_uri = item.get('DocumentURI') # URL部分 おまけにつけておく
        ret_str = excerpt + '\n' + document_uri
        ret_list.append(ret_str)
    return ret_list

2.Lambdaのメイン関数

・ChatGPT実行部を呼び出す直前で、「use_kendra」関数にて検索実行し、返却値を受理しています。

Python
def lambda_handler(event, context):
    # Receive POST param
    question, submit_no = '', '0'
    if ('body' in event):
        request_body = decode_body(event['body'])
        if 'question' in request_body:
            question = request_body['question']
            search_res_list, bot_reply = [], ''
        if question != '':
            if submit_no == '1':
                search_res_list = use_kendra(question, page_size=1, n=3)
                bot_reply = ask_gpt(question, search_res_list)

Embeddings利用部


1.必要なライブラリ

・embeddings情報作成:OpenAIをimportします。

・コサイン類似度計算:sklearnのcosine_similarityが必要で、その関係で、numpyもimportします。

・外部データ設置用(S3用) :boto3をimportします。

Python
import json
import urllib.parse
import base64
import numpy as np
import textwrap
import sys
sys.path.append('/mnt/efs/sklearn')
from sklearn.metrics.pairwise import cosine_similarity
from openai import OpenAI
import boto3

OPENAI_API_KEY = "sk-**************************************"
BUCKET_NAME = 'tsh-embeddings1'
OBJECT_KEY_NAME = 'embeddings_data.json'

2.embeddings用のベクターDB検索関数

・embeddings検索の実行部、「use_embeddings」関数です。

Python
def use_embeddings(question, similarity, n): # ベクターDB検索関数。question: 質問、similarity: 類似度(-1〜1)、n: 個数(1〜)
    ret_list = []
    openai_client = OpenAI(api_key = OPENAI_API_KEY)
    # 質問文のembedding情報を作成 (A)
    res_gpt = openai_client.embeddings.create(
        input=question,
        model="text-embedding-ada-002"
    )
    query_emb = res_gpt.data[0].embedding
    # S3に設置済の外部情報を読B (B)
    s3_client = boto3.client('s3')
    res_s3 = s3_client.get_object(Bucket=BUCKET_NAME, Key=OBJECT_KEY_NAME)
    f_body = res_s3['Body'].read()
    index = json.loads(f_body.decode('utf-8'))
    # (A)と(B)を対象に、scikit-learn.cosine_similarityでコサイン類似度を計算
    query_emb_np = np.array([query_emb])
    results = map(
        lambda i:{'title': i['title'], 'body': i['body'], 'similarity': cosine_similarity(np.array([i['embedding']]), query_emb_np)}, index
    )
    # コサイン類似度降順でソート
    results = sorted(results, key=lambda i: i['similarity'], reverse=True)
    for i, result in enumerate(results):
        if (i+1 <= n) and (result['similarity'] >= similarity):
            ret_list.append(result['body'])
    return ret_list

3.Lambdaのメイン関数

・ChatGPT実行部を呼び出す直前で、「use_embeddings」関数にて検索実行し、返却値を受理しています。

Python
def lambda_handler(event, context):
    # Receive POST param
    question, submit_no = '', '0'
    if ('body' in event):
        request_body = decode_body(event['body'])
        if 'question' in request_body:
            question = request_body['question']
            search_res_list, bot_reply = [], ''
        if question != '':
            if submit_no == '1':
                search_res_list = use_kendra(question, page_size=1, n=3)
                bot_reply = ask_gpt(question, search_res_list)
            elif submit_no == '2':
                search_res_list = use_embeddings(question, similarity=0.8, n=5)
                bot_reply = ask_gpt(question, search_res_list)

4.検索後コンテクスト利用ChatGPT回答生成部

・ChatGPT回答生成検索の関数です。

・role=systemのcontentで、検索結果利用と幻覚防止の指示を与えています。

Python
from openai import OpenAI
import textwrap

OPENAI_API_KEY = "sk-**************************************"

def ask_gpt(question: str, contexts: list): # gpt回答生成関数。question: 質問, contexts: 回答元ネタ情報
    contexts_str = ''
    for val_str in contexts:
        contexts_str += val_str + '\n'
    system_prompt = textwrap.dedent("""
    あなたは質問に回答するチャットボットです。
    以下のコンテクストを参考にして質問に回答して下さい。
    コンテクストの中に質問に対する答えがない場合や、わからない場合、不確かな情報で回答しないでください。
    わからない場合は正直に「わかりませんでした」と答えてください。

    ## コンテクスト ##
    {}
    """).format(contexts_str)
    # return system_prompt

    openai_client = OpenAI(api_key = OPENAI_API_KEY)
    response_gpt = openai_client.chat.completions.create(
        model="gpt-3.5-turbo-0613",
        messages=[
            {"role": "system", "content": system_prompt},
            {"role": "user", "content": question}
        ],
        # temperature=1
    )
    return response_gpt.choices[0].message.content

5.ChatGPT直接依頼

・質問情報のみ利用したChatGPT回答生成部です。

Python
def ask_only_gpt(question: str): # 単体gpt回答生成探索関数。question: 質問
    system_prompt = textwrap.dedent("""\
    あなたは質問に回答するチャットbotです。
    わからない場合は、不確かな情報で回答しないでください。
    わからない場合は正直に「わかりませんでした」と答えてください。
    """)
    openai_client = OpenAI(api_key = OPENAI_API_KEY)
    response_gpt = openai_client.chat.completions.create(
        model="gpt-3.5-turbo-0613",
        messages=[
            {"role": "system", "content": system_prompt},
            {"role": "user", "content": question}
        ],
        #temperature=1
    )
    return response_gpt.choices[0].message.content

画面


今回作成した画面です。

試験仕様


試験は以下のように実施しました。

1.用意した情報の事を聞く(試験1)

     36件 (素直な聞き方 30件 + 少し違う聞き方6件)

2.用意していない情報の事を聞く(試験2)

     14件

試験結果サマリー


試験結果をサマリーすると、以下の通りです。約80%は良い回答でした。

1.試験1の結果、良い回答  30件(/36件)【83.3%】

2.試験1の結果、悪い回答   6件(/36件)

3.試験2の結果、良い回答  10件(/14件) 【71.4%】

4.試験2の結果、悪い回答。  4件(/14件)

試験1(情報が用意された試験)で結果〇だった例


  質問12 「愛上 尾根さんの生年月日を教えてください。 」

  Kendra回答:「愛上 尾根さんの生年月日は1998年9月14日です。 」

  Embeddings回答:「愛上 尾根さんの生年月日は1998年9月14日です。 」

  質問34 「愛上 尾根さんの職業を教えてください。 」

  Kendra回答:「愛上 尾根さんの職業はパティシエです。 」

  Embeddings回答:「愛上 尾根さんの職業は、パティシエです。 」

  質問56 「愛上 尾根さんの性別を教えてください。」

  Kendra回答:「愛上 尾根さんの性別は男性です。」

  Embeddings回答:「愛上 尾根さんの性別は男性です。」

  検索は成功。それを使って回答文が作成されています

質問78 「愛上 尾根さんの出身地を教えてください。」

  Kendra回答:「愛上 尾根さんの出身地は青森県五所川原市です。」

  Embeddings回答:「愛上 尾根さんの出身地は青森県五所川原市です。」

  質問910 「愛上 尾根さんの現在住所を教えてください。」

  Kendra回答:「愛上 尾根さんの現在住所は東京都品川区西五反田8丁目1−5です。」

  Embeddings回答:「愛上 尾根さんの現在住所は、東京都品川区西五反田8丁目1−5です。」

  質問1112 「愛上 尾根さんの出身高校を教えてください。」

  Kendra回答:「愛上 尾根さんの出身高校は五所川原工科高校です。」

  Embeddings回答:「愛上 尾根さんの出身高校は五所川原工科高校です。」

  →検索成功し、それを使って回答文が作成されています。

質問1314 「愛上 尾根さんの出身大学を教えてください。」

  Kendra回答:「愛上 尾根さんの出身大学は日本大学です。」

  Embeddings回答:「愛上 尾根さんの出身大学は、日本大学です。」

  質問1516 「愛上 尾根さんの好きな食べ物を教えてください。」

  Kendra回答:「愛上 尾根さんの好きな食べ物は麻婆豆腐です。辛いものが好きですよ。」

  Embeddings回答:「愛上 尾根さんの好きな食べ物は、麻婆豆腐です。」

  質問1718 「愛上 尾根さんの特技を教えてください。」

  Kendra回答:「愛上 尾根さんの特技はパズルです。」

  Embeddings回答: 「愛上 尾根さんの特技は、パズルです。」

  →このあたりも同様。検索成功し、回答文作成も良好です。

質問1920 「愛上 尾根さんの身長を教えてください。」

  Kendra回答:「愛上 尾根さんの身長は172cmです。」

  Embeddings回答:「愛上 尾根さんの身長は172cmです。」

  質問21 「採寸機能付き報告アプリの報告書作成画面の作成者氏名の入力文字種は何? 」

  Embeddings回答: 「作成者氏名の入力文字種は、「全角」と「半角英文字」です。 」

  質問22 「採寸機能付き報告アプリの報告書作成画面の関係者の入力文字種は何?」

  Embeddings回答:「関係者の入力文字種は全角と半角英数字です。」

   検索は成功し、それを使い、上手に要約されています。GPT利用の良い例か。

質問2324 「採寸機能付き報告アプリの起動方法を教えてください。」

  Kendra回答:「採寸機能付き報告アプリを起動するためには、以下の手順をお試しください。

  1. iPadを起動します。

  2. ホーム画面で左にスワイプし、アプリ一覧を表示します。

  3. 「採寸機能付報告」アプリのアイコンを探し、タップします。

  4. 本アプリのトップ画面「ワークスペース一覧」が表示されます。

  上記の手順でアプリが起動されるはずです。お試しください。 」

  Embeddings回答:「採寸機能付き報告アプリを起動するには、以下の手順をご参照ください。

  1. iPadを起動します。

  2. ホーム画面で左にスワイプし、「採寸機能付報告」アプリのアイコンをタップします。

  3. すると、本アプリのトップ画面「ワークスペース一覧」が表示されます。

  なお、過去のデータが残っている場合は、作成済ワークスペースが表示される場合もあります。」

  → コンテクストの情報を使って、整理し直して回答文が作成されています。

質問2526 「愛上 尾根さんの体重を教えてください。」 ※少し違う聞き方質問

  Kendra回答:「愛上 尾根さんの体重は82kgです。」

  Embeddings回答:「愛上 尾根さんの体重は82kgです。」

  質問2728 「愛上 尾根さんの体重はどの位ですか?」 ※少し違う聞き方質問

  Kendra回答:「愛上 尾根さんの体重は82kgです。」

  Embeddings回答:「愛上 尾根さんの体重は82kgです。」

  質問2930 「愛上 尾根さんの体重は?」 ※少し違う聞き方質問

  Kendra回答:「愛上 尾根さんの体重は82kgです。」

  Embeddings回答:「愛上 尾根さんの体重は、82kgです。」

  → 検索は成功。それを使って回答文が作成されています。

試験1(情報が用意された試験)で結果✕だった例


  質問31: 「採寸機能付き報告アプリの初期設定方法を教えてください。」

  Embeddings回答:「残念ながら、初期設定方法に関する情報が提供されていませんでした。お手数ですが、アプリのマニュアルやヘルプセンターを参照してください。」

  質問32: 「採寸機能付き報告アプリのワークスペース作成方法を教えてください。」

  Embeddings回答:「申し訳ありませんが、提供された情報にはワークスペース作成方法に関する具体的な記述は見当たりません。アプリの操作説明書やサポート情報などを参照して、ワークスペース作成方法について調べることをおすすめします。」

  → 原因は、検索ミス。該当部が抽出されず。

  質問33: 「採寸機能付き報告アプリの初期設定方法を教えてください。」

  Kendra回答:「採寸機能付き報告アプリの初期設定方法を以下に示します。

  1. 「採寸機能付き報告」アプリを起動します。

  2. トップ画面である「ワークスペース一覧」が表示されます。画面上部に「初期設定」ボタンがあるので、それをタップします。

  3. 初期設定画面が表示されます。まずは「ワークスペース名」を入力します。ワークスペース名は報告書を管理するための区別名です。例えば、建築現場の場合は現場名を入力します。

  4. 次に「ワークスペースのパスワード設定」があります。オプションですが、ワークスペースにアクセスする際にパスワードを設定したい場合は、パスワードを入力します。

  5. 「次へ」ボタンをタップします。

  6. 次の画面では、ワークスペースのバックアップ設定があります。バックアップを作成するかどうか選択します。バックアップを作成する場合は、Google ドライブや Dropbox などのクラウドストレージにバックアップを保存することができます。

  7. 「次へ」ボタンをタップします。

  8. 初期設定が完了しました。トップ画面である「ワークスペース一覧」が表示されます。ここから報告書の作成や採寸などの機能を利用することができます。

  以上が採寸機能付き報告アプリの初期設定の流れです。初期設定後は、ワークスペース一覧から必要な操作を選択してください。」 

  → 原因は、検索ミス。該当部が抽出されず。さらに、それっぽく書いてあるのは、幻覚です。

  質問34: 「採寸機能付き報告アプリのワークスペース作成方法を教えてください。」

  Kendra回答:「ワークスペース作成方法は以下の通りです。

  1. トップ画面の「ワークスペース一覧」の中から、「+新規作成」ボタンをタップします。

  2. 「ワークスペース作成」画面が表示されます。必要な情報を入力します。

     – ワークスペース名:作成するワークスペースの名前を入力します。

     – プロジェクト名:関連するプロジェクト名を入力します。

     – 住所:作業場所の住所を入力します。

  3. 入力が完了したら、「保存」ボタンをタップしてワークスペースを作成します。

  作成されたワークスペースは「ワークスペース一覧」に表示されます。報告書作成や採寸  など、他の機能を使用する際に、作成したワークスペースを選択することができます。」

  → 原因は、検索ミス。該当部が抽出されず。これも、説明していますが、デタラメです。

  質問35: 「採寸機能付き報告アプリの報告書作成画面の作成者氏名の入力文字種は何?」

  Kendra回答:「報告書作成画面での作成者氏名の入力文字種は、特に指定されていないため、  一般的には全角の日本語文字や半角の英数字を使用することができます。ただし、具体的  な制限事項や仕様がある場合は操作説明書やアプリの仕様を参照してください。 」

  質問36: 「採寸機能付き報告アプリの報告書作成画面の関係者の入力文字種は何?」

  Kendra回答:「報告書作成画面の関係者の入力文字種は、文章の内容によって異なる可能  性があります。具体的には、関係者の氏名や職種、連絡先などの情報が入力されることが考  えられます。一般的には、アルファベットや漢字、数字などの文字種が使用されるでしょう。ただ  し、具体的な要件や制約によっては、特定の文字種や文字数制限が設けられる場合もあり  ます。詳細な情報が必要な場合は、操作説明書や関連する資料を参照してください。」

  → 原因は、検索ミス。該当部が抽出されず。

試験2(情報が用意されない試験)で結果〇だった例


  質問12 「愛上 尾根さんの婚姻状況を教えてください。」

  Kendra回答:「残念ながら、愛上尾根さんの婚姻状況についての情報はありません。」

  Embeddings回答:「愛上 尾根さんの婚姻状況についての情報は提供されていません。

  そのため、現在の婚姻状況についてはわかりません。」

  質問34 「愛上 尾根さんの息子の名前を教えてください。」

  Kendra回答:「申し訳ありませんが、愛上尾根さんの息子の名前についての情報  は提供されていません。」

  Embeddings回答:「愛上 尾根さんの息子の名前は、わかりませんでした。」

  → 情報無い事を認識し、素直に分かりませんと言っています。

  質問56 「採寸機能付き報告アプリのバージョンは何ですか?」

  Kendra回答:「提供されたコンテクストには、採寸機能付き報告アプリのバージョン  に関する情報は含まれていません。バージョンについては、コンテクストに記載さ  れている資料やソースコードを参照する必要があります。お手数ですが、資料や  ソースコードを確認してください。」

  Embeddings回答:「提供された情報では、採寸機能付き報告アプリのバージョンについては言及されていません。私にはその情報がわかりません。すみません。」

→ 元情報に存在せず、当然コンテクストにも存在していない。その事を認識し、素直に分かりませんと言っています。

  質問78 「採寸機能付き報告アプリのLiDAR操作方法を説明してください。」

  Kendra回答:「申し訳ありませんが、コンテクストにはLiDAR操作方法に関する情  報は記載されていませんでした。詳細な操作方法については、提供されたリンク  先の操作説明書をご確認ください。不明な点があれば、改めてお知らせください。」

  Embeddings回答:「申し訳ありませんが、提供されたコンテクストにはLiDARに  関する情報は含まれていません。LiDARに関する操作方法について詳細な情  報を提供することができません。他の質問がありましたら、お答えできるかもしれ  ませんのでお知らせください。」

  → 元情報に存在せず、当然コンテクストにも存在していない。その事を認識し、素直に分かりませんと言っています。

  質問910 「愛上隆史さんの体重を教えてください。 」

  Kendra回答:「愛上隆史さんの体重については、提供されている情報がありません  でした。申し訳ありません。」

  Embeddings回答:「愛上隆史さんの体重に関する情報は提供されておりません。」

  → 似た名前の人を訊ねたが、情報が無い事を認識し、素直に分かりませんと  言っています。

試験2(情報が用意されない試験)で結果✕だった例


  質問11と12: 「愛上尾和さんの体重を教えてください。」

  Kendra回答:「愛上尾和さんの体重は82kgです。」 

  Embeddings回答:「愛上 尾和さんの体重は、82kgです。 」 

  → 一文字違いの人を同一人物と誤解。

質問13: 「進捗管理アプリのワークスペース作成方法を教えてください。」

  Kendra回答:「ワークスペース作成の方法を教えます。

  1. 「ワークスペース一覧」画面に移動します。

  2. 「+ボタン」をタップします。

  3. 「ワークスペース作成」画面が表示されるので、以下の情報を入力します。

     – ワークスペース名: 作成するワークスペースの名前を入力します。

     – 設定: オプションで設定を調整することができます。

  4. 入力が完了したら、「作成」ボタンをタップします。

  これで新しいワークスペースが作成されます。作成したワークスペースは「ワークスペース一  覧」画面に表示されますので、そこからアクセスすることができます。詳しい操作説明につ  いては、提供された操作説明書を参照してください。」 

  → アプリ名が違うのに、回答しています。 

質問14: 「進捗管理アプリのワークスペース作成方法を教えてください。」

  Embeddings回答:「ワークスペース作成の手順は以下の通りです。

  1.起動: iPadを起動し、ホーム画面で左にスワイプし、「採寸機能付報告」アプリのアイコンをタップ  します。

  2. トップ画面表示: 本アプリのトップ画面「ワークスペース一覧」が表示されます。過去のデータが残ってい  る場合は、作成済ワークスペースが表示されます。

  3. ワークスペース作成: ワークスペース一覧画面で、「新しいワークスペースを作成します」か「+」を  タップ  します。すぐに新しいワークスペースが作成されます。上部に表示されたワークスペース名は仮の名前です。

     4.ワークスペース一覧表示: そのワークスペース画面では「<」をタップし、ワークスペース一覧画面に  戻ると、  今作成したワークスペースが追加されています。

  5. ワークスペースの設定: 追加されたワークスペースの右上「・・・」をタップすると、名称変更、削除、  のメニューが表示されます。そこで「名称変更」をタップすると、名前を変更する小画面が表示されま  す。

  6. 名前変更: 変更する場合、その名称を入力欄に入力し、「名前変更」をタップすると変更され、ワーク  スペース一覧に戻ります(名前が変更されています)。

  以上がワークスペース作成の手順になります。」

  → これも同じ。アプリ名の違いに気づいてくれないです。

参考)ChatGPT直接依頼(検索無し)


検索結果をコンテキストに含めず、質問文だけで回答生成させる実験も試してみました。

質問1~17  「愛上尾根さん」の事を質問した17件

  回答抜粋:

   (回答1)「申し訳ありませんが、愛上尾根さんの生年月日については情報が見つかりま  せんでした。」

   (回答5)「申し訳ありませんが、私は個人の住所情報を提供することはできません。プラ  イバシーの保護と個人情報の安全性を考慮しています。住所を知りたい場合は、  本人に直接お尋ねいただくか、公的な手続きを通じて確認してください。 」

   (回答8)「申し訳ありませんが、私のデータベースには愛上尾根さんの情報がありませので  出身高校についてはわかりません。お手数ですが、他の情報源をご利用ください。」

   (回答12)「私は愛上 尾根さんの情報を持っていません。したがって、彼の好きな食べ  物を教えることはできません。申し訳ありません。」

   (回答16)「愛上 尾根さんの体重については情報がありません。正確な体重に関する  情報がないため、答えることはできません。申し訳ありません。」

  →情報無い事を認識し、素直に分かりませんと言っています。

質問18~25 「採寸機能付き報告アプリ」の事を質問した8件

  回答抜粋:

   (回答18)「採寸機能付き報告アプリという具体的なアプリケーションを指しているのでしょうか?もしそうであれば、それぞれのアプリによって起動方法は異なる可能性があります。一般的なアプリの起動方法については、(・・途中略)ダウンロード/インストールを行った後、アプリアイコンをタップして起動することもあります。具体的なアプリ名やデバイスの種類など、(・・途中略)公式のマニュアルやサポート情報を参照することをおすすめします。」

   (回答22)「申し訳ありませんが、私は一般的な情報を提供するAIであり、特定のアプリケーションのバージョン情報を持っていません。アプリケーションのバージョンについては、開発者の公式ウェブサイト  やアプリストアで確認してください。」

   (回答25)「進捗管理アプリのワークスペースの作成方法は、アプリによって異なりますが、一般的な手順を以下に示します。(・・途中略) ただし、具体的なアプリやツールについての情報が提供されていないため、上記の手順が完全に適用できるかどうかはわかりません。 (・・途中略)ドキュメントを参照するか、アプリのサポートチームに問い合わせることをお勧めします。」

  → 情報無い事をまず認識し、免責も考慮し、良い対応をしています。

追加:最新環境で再確認 


モデルとしては「テキスト生成」と「ベクター生成」の2つがあり、それぞれの最新版がありました。

モデル
gpt-4o-2024-05-13テキスト生成最新版
text-embedding-3-largeベクター生成最新版
2024年6月24日時点の状況

AWS Kendraは、最新状態(バージョン等は不明)で再度試してみます。

前回最新
AWS Kendra2024年1月16日版2024年6月24日版

追加:最新環境で再実験


上記のモデル、Kendraで再試験してみました。

前回NGだった8件(検索問題=4個、テキスト生成問題=4個)のうち、3件改善しました。

最新テキスト生成LLMで改善 2件(/テキスト生成問題4件)→1文字違いの人を分別
最新ベクター生成LLMで改善 1件 (/検索問題2件)→期待する情報の順位向上
最新Kendraで改善     0件(/検索問題2件)→改善されません

念のため、前回OKだった6件も試し、全て同様にOKでした。

Embeddings結果表

Embeddingsの結果詳細です。採用条件の「similarity」は0.8から0.6に変更しました。

質問期待値前回問題最新環境の回答
(4oと3-large)
結果
〇:改善
△:同じ
愛上 尾根さんの生年月日を教えてください。「1998年9月14日です。」問題無し「愛上 尾根さんの生年月日は、1998年9月14日です。」
採寸機能付き報告アプリの初期設定方法を教えてください。回答内容が外部データ記載のテキスト。[検索ミス]
該当部が抽出されず。
はい、採寸機能付き報告アプリの初期設定方法は以下の通りです:

1. 左上の三本線「☰
」をタップします。
2. 「マーカー設定」を選択して、マーカー設定の内容を確認します。
3. 別途用意したマーカーパネル(印刷物)を準備します。
4. マーカーパネルのコード部分(四角形)の上部と左部の辺の長さを物差しで計測します。
5. 計測した値を入力欄に入力し、「設定」をタップします。

以上で初期設定が完了します。
採寸機能付き報告アプリのワークスペース作成方法を教えてください。回答内容が外部データ記載のテキスト。[検索ミス]
該当部が抽出されず。
「申し訳ありませんが、採寸機能付き報告アプリのワークスペース作成方法についての具体的な手順は、コンテクストの中に記載されていないため、わかりませんでした。」
採寸機能付き報告アプリのバージョンは何ですか?「わかりません」問題無し「わかりませんでした。」
愛上尾和さんの体重を教えてください。「わかりません」[TEXT生成ミス]
一文字違いの人を同一人物と誤解。
「わかりませんでした。」
愛上隆史さんの体重を教えてください。「わかりません」問題無し申し訳ありませんが、愛上隆史さんの体重に関する情報はわかりませんでした。
進捗管理アプリのワークスペース作成方法を教えてください。「わかりません」[TEXT生成ミス]アプリ名の違いに気づいてくれない。“ワークスペースの作成方法は以下の通りです:
ワークスペース一覧画面で、「新しいワークスペースを作成します」または「+」をタップします。
すぐに新しいワークスペースが作成され、上部に仮の名前が表示されます。
そのワークスペース画面で”<”をタップし、ワークスペース一覧画面に戻ると、今作成したワークスペースが追加されています。
追加されたワークスペースの右上「・・・」をタップすると、名称変更や削除のメニューが表示されます。
「名称変更」をタップすると、名前を変更する小画面が表示されます。
変更する名称を入力欄に入力し、「名前変更」をタップすると名称が変更され、ワークスペース一覧に戻り、名前が変更されています。
以上がワークスペースの作成手順です。”

Kendra結果表

Kendraの結果詳細です。

質問期待値前回問題最新環境の回答(4oとKendra 2024/6/24版)結果
〇:改善
△:同じ
愛上 尾根さんの生年月日を教えてください。「1998年9月14日です。」問題無し「愛上 尾根さんの生年月日は1998年9月14日です。」
採寸機能付き報告アプリの初期設定方法を教えてください。回答内容が外部データ記載のテキスト。[検索ミス]
該当部が抽出されず。
「申し訳ありませんが、提供されたコンテクストには「初期設定」についての詳細情報が含まれていませんので、具体的な初期設定方法についてはお答えできませんでした。詳しい情報を得るためには、操作説明書の該当部分を参照することをお勧めします。」
採寸機能付き報告アプリのワークスペース作成方法を教えてください。回答内容が外部データ記載のテキスト。[検索ミス]
該当部が抽出されず。
「申し訳ありませんが、ワークスペース作成方法についての具体的な情報はコンテクストに含まれていませんでした。詳細な手順については、操作説明書の該当部分を確認していただくか、サポート窓口にお問い合わせください。」
採寸機能付き報告アプリのバージョンは何ですか?「わかりません」問題無し「わかりませんでした。操作説明書にはアプリのバージョンに関する情報が記載されていません。」
愛上尾和さんの体重を教えてください。「わかりません」[TEXT生成ミス]一文字違いの人を同一人物と誤解。「わかりませんでした。」
愛上隆史さんの体重を教えてください。「わかりません」問題無し「わかりませんでした。」
進捗管理アプリのワークスペース作成方法を教えてください。「わかりません」[TEXT生成ミス]アプリ名の違いに気づいてくれない。「「採寸機能付き報告アプリ」の操作説明書のコンテクストには、ワークスペース作成方法についての詳細は含まれていませんでした。該当の操作手順が不明なため、「わかりませんでした」とお伝えします。他の情報源や公式のサポートを確認してみてください。」

まとめ


・独自情報について質問し、回答させる事は、概ね可能な感じでした。

・実現方法により精度の差はありそうで、検索部のKendraは現時点では難しい印象です。

・検索は、text-embedding-3-large等を使ったベクター検索の方法が良さそうです。検索で、意中のデータを逃してしまうと、2次的な問題が出てきてしまうので、検索漏れしないようプログラムの工夫は必要そうです。

・(検索結果をコンテキストに利用した)テキスト生成は、LLMの発展でどんどん質が良くなっている印象です。幻覚も減っていますね。

・次は、もう少し具体的なデータ(本番で使うような)で、精度を試してみたいと思います。VectorStoreをどうするか、等の生成AI利用開発の具体的な問題も見えてもきそうです。

ご連絡フォーム


フィードバックを是非お願いします。
本記事の方法での問題点や、よりよい方法のアイデアを頂けると大変助かります。

この記事に関して

その他のご連絡

DevAIsをもっと見る

今すぐ購読し、続きを読んで、すべてのアーカイブにアクセスしましょう。

続きを読む