QEUR23_LMABYS8: (BLUEではない)回答の品質評価を目指して
~ 実は、この程度は(業界の)常識レベルです ~
QEU:FOUNDER : “これから、本格的にLLM(大規模言語)モデルの評価を行います。・・・でもね、評価指標がないと意味がないですよね。これから、この開発を始めましょう。”
D先生 : “文章の品質指標としてBLEUがありますよね。”
QEU:FOUNDER : “BLEUって、文章翻訳の品質評価指標でしょ?翻訳なので、文章の内容や文章のサイズには大きな変化がないことが前提です。LLMモデルの回答品質では、内容やサイズはかなり変わってきます。”
D先生 : “確かに・・・。GPTのQAの場合には回答文の量が大きくなったとして、これは高評価になることは十分にありますよね。じゃあ、どの方法を使うんですか?”
QEU:FOUNDER : “LangChainではsentence transformerというのを使ったでしょ?あれを類似度のために使いましょう。”
(GPTへの質問) 大規模言語モデルにおけるsentence transformerとは何ですか?代表的な用途を教えてください。
(GPTの回答) Sentence Transformerは、大規模な言語モデルを使用して、文章をベクトル空間に埋め込むためのフレームワークです。このフレームワークは、文章を入力として受け取り、それらを意味的に類似した文章と比較することができる埋め込みを生成します。これは、意味的なテキストの類似性、意味的な検索、またはパラフレーズの採掘などに役立ちます。 Sentence Transformerは、さまざまな用途に使用できます。例えば、文章のクラスタリング、セマンティック検索、パラフレーズの採掘、並列文の採掘、画像検索、テキストの要約などがあります2。これらの用途は、文章の意味的な類似性を利用しています。例えば、セマンティック検索では、入力された文章に意味的に類似した文章を大量のコレクションから検索することができます。
D先生 : “なるほど、LangChainでは、Chunkの意味抽出のためにSentence Transformerを使ったわけですね。”
QEU:FOUNDER : “じゃあ、回答の評価プログラムに行きましょう。”
# -----
# BLEUに代る回答品質の評価指標を作りたい
# 2つの文の類似度を比較するためのプログラム
import numpy as np
from transformers import AutoTokenizer, AutoModel
import torch
import torch.nn.functional as F
# Mean Pooling - Take attention mask into account for correct averaging
def mean_pooling(model_output, attention_mask):
token_embeddings = model_output[0] #First element of model_output contains all token embed-dings
input_mask_expanded = attention_mask.unsqueeze(-1).expand(token_embeddings.size()).float()
return torch.sum(token_embeddings * input_mask_expanded, 1) / torch.clamp(input_mask_expanded.sum(1), min=1e-9)
# Load model from HuggingFace Hub
tokenizer = AutoTokenizer.from_pretrained('sentence-transformers/all-MiniLM-L6-v2')
model = AutoModel.from_pretrained('sentence-transformers/all-MiniLM-L6-v2')
# -----
# 文全体をベクトル化する
def create_embedding(sentences):
# Tokenize sentences
encoded_input = tokenizer(sentences, padding=True, truncation=True, return_tensors='pt')
# Compute token embeddings
with torch.no_grad():
model_output = model(**encoded_input)
# Perform pooling
sentence_embeddings = mean_pooling(model_output, encoded_input['attention_mask'])
# Normalize embeddings
sentence_embeddings = F.normalize(sentence_embeddings, p=2, dim=1)
return sentence_embeddings
# -----
# コサイン類似度計算
def cons_similarity(sentences):
# -----
# ベクトル化
sentence_embeddings = create_embedding(sentences)
#print("Sentence embeddings:")
#print(sentence_embeddings)
# -----
# NUMPY変換、配列の大きさを確認する
mx_embedding = np.array(sentence_embeddings)
#print(mx_embedding.shape)
a = mx_embedding[0]
b = mx_embedding[1]
cos = np.dot(a, b)/(np.sqrt(np.dot(a, a))*np.sqrt(np.dot(b, b)))
return cos
# -----
# 文章の比較の実行(その1)
# Sentences we want sentence embeddings for
sentences = ['Abe Sinzo is Great Politician', 'Japan economy is declining year by year by Abenomics']
cos = cons_similarity(sentences)
print("-----")
print(f"ベース文: {sentences[0]}, 比較文: {sentences[1]}")
print(f"コサイン類似度: {cos}")
# -----
# 次の事例の比較を行う(その2)
sentences = ['There is a pen on my table.', 'I have a pen.']
cos = cons_similarity(sentences)
print("-----")
print(f"ベース文: {sentences[0]}, 比較文: {sentences[1]}")
print(f"コサイン類似度: {cos}")
# -----
# 次の事例の比較を行う(その3)
sentences = ['There is a pen on my table.', 'A pen is on my desk.']
cos = cons_similarity(sentences)
print("-----")
print(f"ベース文: {sentences[0]}, 比較文: {sentences[1]}")
print(f"コサイン類似度: {cos}")
# -----
# 次の事例の比較を行う(その4)
sentences = ['There is a pen on my table.', 'A pen is on my table.']
cos = cons_similarity(sentences)
print("-----")
print(f"ベース文: {sentences[0]}, 比較文: {sentences[1]}")
print(f"コサイン類似度: {cos}")
D先生 : “さすがに、これほど文が似てくると類似度が上がってくるでしょうね。”
D先生 : “ほお・・・。第4問では、2文は全く同じ意味なんですが類似度は1.0まではいかないんですね。コレ、かなり良い評価指標のようですね。”
QEU:FOUNDER : “Attentionを使っているので、文の長さにかかわらず重要な語句に注目して評価しているんですよ。その意味で類似度を見ると面白いですよ・・・。”
- 文に「my」を付けた : 0.70 → 0.81
- 「desk」の代わりに「table」に変えた : 0.81 → 0.98
D先生 : “なるほどね。”
~ まとめ ~
QEU:FOUNDER : “C大先生・・・。あの人(↓)たち、いまでもあの話を言ってるの?”
C部長 : “いやァ・・・、私も知りません。最近は全然、関連の番組を見てないので・・・。”
QEU:FOUNDER : “まあ、「J国スゴイ」系の人たちなので、現状を見誤る懸念があるんですよ。こんな感じで・・・。”
(2005年)
C部長 : “ああ、懐かしい。2005年時点では、J国も落ちたとはいえ、かなりイケてたんですよね。”
QEU:FOUNDER : “それが、時間と共に「こんな風(↓)」になってきた・・・。”
(2012年)
(2016年)
(2019年)
C部長 : “J国スゴイ!!瀕死の〇国・・・。”
QEU:FOUNDER : “二度と同じ間違いを繰り返しませんように・・・。”
コメント
コメントを投稿