目的
RagasのAnswer sematic similarityが実際に使えるレベルに達しているのかの簡単な検証。
結論
サンプルに従った実装方法での検証では使えるレベルでの精度ではなさそう。
特別な設定変更やパラメータ変更が必要なのかもしれないがそこまでは未検証。
検証内容
「これは猫です」というground truthに対して、さまざまな回答を用意し、それぞれの類似度をRagasにて算出し、それが人間(私)の期待値と合うかを確認し、使えそうかを判断する。
検証方法
- OpenAIのAPIキーを取得する
- 下記「使用ファイル」を任意のディレクターに配置
- 「検証コマンドを実行」
使用ファイル
requirements.txt
requirements.txt
aiohttp==3.9.5
aiosignal==1.3.1
annotated-types==0.7.0
anyio==4.4.0
appdirs==1.4.4
async-timeout==4.0.3
attrs==23.2.0
certifi==2024.2.2
charset-normalizer==3.3.2
dataclasses-json==0.6.6
datasets==2.19.1
dill==0.3.8
distro==1.9.0
exceptiongroup==1.2.1
filelock==3.14.0
frozenlist==1.4.1
fsspec==2024.3.1
greenlet==3.0.3
h11==0.14.0
httpcore==1.0.5
httpx==0.27.0
huggingface-hub==0.23.2
idna==3.7
jsonpatch==1.33
jsonpointer==2.4
langchain==0.2.1
langchain-community==0.2.1
langchain-core==0.2.2
langchain-openai==0.1.8
langchain-text-splitters==0.2.0
langsmith==0.1.63
marshmallow==3.21.2
multidict==6.0.5
multiprocess==0.70.16
mypy-extensions==1.0.0
nest-asyncio==1.6.0
numpy==1.26.4
openai==1.30.5
orjson==3.10.3
packaging==23.2
pandas==2.2.2
pyarrow==16.1.0
pyarrow-hotfix==0.6
pydantic==2.7.2
pydantic_core==2.18.3
pysbd==0.3.4
python-dateutil==2.9.0.post0
pytz==2024.1
PyYAML==6.0.1
ragas==0.1.8
regex==2024.5.15
requests==2.32.3
six==1.16.0
sniffio==1.3.1
SQLAlchemy==2.0.30
tenacity==8.3.0
tiktoken==0.7.0
tqdm==4.66.4
typing-inspect==0.9.0
typing_extensions==4.12.0
tzdata==2024.1
urllib3==2.2.1
xxhash==3.4.1
yarl==1.9.4
main.py
main.py
from datasets import Dataset
from ragas.metrics import answer_similarity
from ragas import evaluate
import os
import pandas as pd
# ここは自分のAPIキーに置き換えてください。
os.environ["OPENAI_API_KEY"] = "XXXXXXXXXXXXXXX"
data_samples = {
# 'question': ['When was the first super bowl?', 'Who won the most super bowls?'],
# 'answer': ['The first superbowl was held on Jan 15, 1967', 'The most super bowls have been won by The New England Patriots'],
# 'ground_truth': ['The first superbowl was held on January 15, 1967', 'The New England Patriots have won the Super Bowl a record six times']
'question': ['それは猫ですか?', 'それは猫ですか?','それは猫ですか?', 'それは猫ですか?', 'それは猫ですか?', 'それは猫ですか?', 'それは猫ですか?', 'それは猫ですか?', 'それは猫ですか?'],
'answer': ['これは猫です', 'これは子猫です', 'これはブリティッシュショートヘアです', 'これは猫ではないです', 'これは犬です', 'これは猫でないわけではないです', 'これは猫型ロボットです', 'これはドラ◯もんです', 'おい何を言ってるんだのび太、しずかちゃんに失礼だろ。おーれはジャイアーンガーキダイショー'],
'ground_truth': ['これは猫です', 'これは猫です', 'これは猫です', 'これは猫です','これは猫です', 'これは猫です', 'これは猫です', 'これは猫です', 'これは猫です']
}
dataset = Dataset.from_dict(data_samples)
score = evaluate(dataset,metrics=[answer_similarity])
df = score.to_pandas()
print(df.to_string())
検証コマンド
$ pip install -r requirements.txt
$ python main.py
実際の出力結果
question answer ground_truth answer_similarity
0 それは猫ですか? これは猫です これは猫です 1.000000
1 それは猫ですか? これは子猫です これは猫です 0.962167
2 それは猫ですか? これはブリティッシュショートヘアです これは猫です 0.839055
3 それは猫ですか? これは猫ではないです これは猫です 0.947429
4 それは猫ですか? これは犬です これは猫です 0.938642
5 それは猫ですか? これは猫でないわけではないです これは猫です 0.925785
6 それは猫ですか? これは猫型ロボットです これは猫です 0.934385
7 それは猫ですか? これはドラ◯もんです これは猫です 0.872793
8 それは猫ですか? おい何を言ってるんだのび太、しずかちゃんに失礼だろ。おーれはジャイアーンガーキダイショー これは猫です 0.816897
各出力に関する考察と判断
「実際の出力結果」の下に「→」で考察を記載
0 それは猫ですか? これは猫です これは猫です 1.000000
→ これは類似度1.0となっており良さそう
1 それは猫ですか? これは子猫です これは猫です 0.962167
→ これは類似度0.96で良さそう
2 それは猫ですか? これはブリティッシュショートヘアです これは猫です 0.839055
→ 猫の種類(ブリティッシュショートヘア)と応えると類似度0.83となる。下記の「猫ではないです」より低くなるのはまずい。猫の種類を理解していないよう。もっと高くてよいはず。
3 それは猫ですか? これは猫ではないです これは猫です 0.947429
→ 「これは猫ではないです」の回答に対して 類似度0.96は高すぎてかなりまずい。ground truthとは逆の回答であるためもっと低いのが期待値。「猫」が含まれているため高くなっているよう。文法を理解していないのか?
4 それは猫ですか? これは犬です これは猫です 0.938642
→ 犬であり猫でないので、少なくとも「ブリティッシュショートヘア」より類似度は低くなることが期待値であるが、実際には高い。
5 それは猫ですか? これは猫でないわけではないです これは猫です 0.925785
→ 微妙な言い回しなのでこのくれいなのかなという感じ。期待値と合っている。
6 それは猫ですか? これは猫型ロボットです これは猫です 0.934385
→ 猫ではなく猫型ロボットなので類似度0.93は高すぎる
7 それは猫ですか? これはドラ◯もんです これは猫です 0.872793
→ 6と7はほぼ一緒かと思うので似たような類似度になることが期待値であるが、それとは異なる。
8 それは猫ですか? おい何を言ってるんだのび太、しずかちゃんに失礼だろ。おーれはジャイアーンガーキダイショー これは猫です 0.816897
→ 全く違う回答で0.81では高すぎる
判断
9項目中、3項目が人間(私)の期待値と合う類似度になっていた。少なくとも期待値の7〜8割くらいは合致していてほしいが、期待値と異なりすぎるため使えないと判断する。