「AIエージェントキャッチアップ #23 - OpenEvals / AgentEvals」を開催しました

ジェネラティブエージェンツの大嶋です。

「AIエージェントキャッチアップ #23 - OpenEvals / AgentEvals」という勉強会を開催しました。

generative-agents.connpass.com

アーカイブ動画はこちらです。

www.youtube.com

OpenEvals / AgentEvals

今回は、LangChainが公開したLLMアプリの評価のライブラリ「OpenEvals」と「AgentEvals」について、READMEを読んだり動かしたりしてみました。

OpenEvalsのGitHubリポジトリはこちらです。

github.com

AgentEvalsのGitHubリポジトリはこちらです。

github.com

今回のポイント

OpenEvalsの概要

OpenEvalsは、LangChainが公開した評価のためのライブラリです。

OpenEvalsでは、LLM-as-a-Judge、構造化出力の評価、距離ベースの評価などを簡単に実装できるようになっています。

これらの評価を自前で実装するとボイラープレートがある程度必要になりますが、OpenEvalsはその部分をライブラリ化しているという印象です。

OpenEvalsの基本的な使い方

OpenEvalsでLLM-as-a-Judgeを実行する例は以下のようになります。

from openevals.llm import create_llm_as_judge
from openevals.prompts import CORRECTNESS_PROMPT

correctness_evaluator = create_llm_as_judge(
    prompt=CORRECTNESS_PROMPT,
    model="openai:o3-mini",
)

inputs = "日本で一番高い山は?"
outputs = "エベレストです。"
reference_outputs = "富士山です。"

eval_result = correctness_evaluator(
    inputs=inputs,
    outputs=outputs,
    reference_outputs=reference_outputs,
)

print(eval_result)

上記の例では「CORRECTNESS_PROMPT」というOpenEvals組み込みのプロンプトでo3-miniを使ったLLM-as-a-Judgeを実行しています。

実行結果は以下のようになります。

{'key': 'score', 'score': False, 'comment': 'The provided response incorrectly states that Mount Everest is the highest mountain in Japan, whereas the correct answer is Mount Fuji. This contains a factual error and does not match the reference output. Thus, the score should be: false.'}

ここではスコアがTrue/Falseで出力されていますが、0〜1のスコアで出力させるといった設定も可能です。

LangSmithの評価機能との連携

OpenEvalsでは、LangSmithの評価機能との統合も提供されています。

LangSmithのpytest統合機能を使うと、以下のようなコードで評価を実行して、その結果をLangSmithに保存できます。

import pytest
from langsmith import testing as t
    :
@pytest.mark.langsmith
def test_correctness():
    inputs = "日本で一番高い山は?"
    outputs = "エベレストです。"
    reference_outputs = "富士山です。"
    t.log_inputs({"question": inputs})
    t.log_outputs({"answer": outputs})
    t.log_reference_outputs({"answer": reference_outputs})

    correctness_evaluator(
        inputs=inputs,
        outputs=outputs,
        reference_outputs=reference_outputs,
    )

AgentEvalsの概要

続いてAgentEvalsについてです。

AgentEvalsは、エージェントの動作のTrajectory(軌跡)を評価するためのライブラリです。

LangChainはエージェントの評価には、「Final Response(最終出力)」「Single step(各ステップ)」「Trajectory(軌跡)」の3つの観点があると言っています。

「Final Response(最終出力)」「Single step(各ステップ)」についてはOpenEvalsで対応できますが、Trajectory(軌跡)の評価にはより特化したAgentEvalsが公開されている、という関係です。

LangSmithの公式ドキュメントでは、Trajectory(軌跡)の評価のために個別のコードを実装する例が掲載されています。

docs.smith.langchain.com

AgentEvalsはこの処理をライブラリ化したものだと言えます。

AgentEvalsの基本的な使い方

AgentEvalsの基本的な使い方は以下のようになります。

from agentevals.trajectory.llm import (TRAJECTORY_ACCURACY_PROMPT, create_trajectory_llm_as_judge)

trajectory_evaluator = create_trajectory_llm_as_judge(
    prompt=TRAJECTORY_ACCURACY_PROMPT,
    model="openai:o3-mini",
)

outputs = [
    {"role": "user", "content": ...},
    {"role": "assistant", "tool_calls": ...},
    {"role": "tool", "content": ...},
    {"role": "assistant", "content": ...},
]

eval_result = trajectory_evaluator(
    outputs=outputs,
)

print(eval_result)

この例では、ユーザーがある入力をしたときのエージェントのツール呼び出しの流れ(Trajectory)が適切かo3-miniで評価しています。

他にもLangGraphのノードの遷移を評価するといった機能もあります。

次回のご案内

以上、今回は「OpenEvals」と「AgentEvals」をキャッチアップしました。

次回は「AIエージェントキャッチアップ #24 - Giskard」ということで、LLMアプリのパフォーマンス・バイアス・セキュリティなどの評価フレームワーク「Giskard」がテーマです!

generative-agents.connpass.com

ご興味・お時間ある方はぜひご参加ください!

また、その次の回以降のテーマも募集しているので、気になるエージェントのOSSなどあれば教えてください!