メインコンテンツへスキップ
見出し画像

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

    次回



     
     

    npaka

     
     
    プログラマー。iPhone / Android / Unity / ROS / AI / AR / VR / RasPi / ロボット / ガジェット。年2冊ペースで技術書を執筆。アニソン / カラオケ / ギター / 猫 twitter : @npaka123

    あなたへのおすすめ