見出し画像

LangChain の評価機能を試す

「LangChain」の評価機能を試したのでまとめました。

前回

1. 評価

「テキスト生成」は、従来のメトリクスでは評価が難しいことで有名です。それらを評価する新しい方法の1つが、言語モデルを使用する方法です。「LangChain」では、これを支援するためのプロンプトやチェーンを提供しています。

2. 質問応答の評価

Google Colabでの質問応答の評価の手順は、次のとりです。

(1) パッケージのインストール。

# パッケージのインストール
!pip install langchain
!pip install openai

(2) 環境変数の準備。
以下のコードの <OpenAI_APIのトークン> にはOpenAI APIのトークンを指定します。(有料)

import os
os.environ["OPENAI_API_KEY"] = "<OpenAI_APIのトークン>"

(3) 質問応答のLLMチェーンの準備。

from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain
from langchain.llms import OpenAI

# 質問応答のプロンプトテンプレートの準備
prompt = PromptTemplate(
    template="Question: {question}\nAnswer:", 
    input_variables=["question"]
)

# 質問応答のLLMチェーンの準備
chain = LLMChain(
    llm=OpenAI(temperature=0), 
    prompt=prompt
)

(4) 評価データセットの準備。
questionとanswerを持つ辞書のリストになります。

# 評価データセットの準備
examples = [
    {
        "question": "テニスボールが2ケースあります。1ケースにテニスボールが3個入っています。今何個のテニスボールを持っていますか?",
        "answer": "6"
    },
    {
        "question": '次の文はもっともらしいですか?もっともらしくないですか? "カレーは飲み物"',
        "answer": "もっともらしくない"
    }
]

(5) 予測の実行。

# 予測
predictions = chain.apply(examples)
predictions
[
    {'text': ' 6個'}, 
    {'text': ' もっともらしくないです。'}
]

回答を完全に一致させようとすると、言語モデルが回答したものと一致しないことがわかります。

・「6」と「6個」
・「もっともらしくない」と「もっともらしくないです」

しかし、意味的にはどちらの場合も正しいです。これを評価するため、言語モデル自体を使用します。

(6) 言語モデルによる評価。
QAEvalChainのevaluate()を使います。

from langchain.evaluation.qa import QAEvalChain

# 言語モデルによる評価
eval_chain = QAEvalChain.from_llm(
    llm=OpenAI(temperature=0)
)
graded_outputs = eval_chain.evaluate(
    examples, 
    predictions, 
    question_key="question", 
    prediction_key="text"
)
print(graded_outputs)
[
    {'text': ' CORRECT'}, 
    {'text': ' CORRECT'}
]

両方、CORRECT (正しい) と評価されました。

(7) 結果を整形して出力。

# 結果を整形して出力
for i, eg in enumerate(examples):
    print(f"Example {i}:")
    print("Question: " + eg['question'])
    print("Real Answer: " + eg['answer'])
    print("Predicted Answer: " + predictions[i]['text'])
    print("Predicted Grade: " + graded_outputs[i]['text'])
    print()
Example 0:
Question: テニスボールが2ケースあります。1ケースにテニスボールが3個入っています。今何個のテニスボールを持っていますか?
Real Answer: 6
Predicted Answer:  6個
Predicted Grade:  CORRECT

Example 1:
Question: 次の文はもっともらしいですか?もっともらしくないですか? "カレーは飲み物"
Real Answer: もっともらしくない
Predicted Answer:  もっともらしくないです。
Predicted Grade:  CORRECT

次回



この記事が気に入ったらサポートをしてみませんか?