ジェネラティブエージェンツの大嶋です。
「AIエージェントキャッチアップ #23 - OpenEvals / AgentEvals」という勉強会を開催しました。
generative-agents.connpass.com
アーカイブ動画はこちらです。
OpenEvals / AgentEvals
今回は、LangChainが公開したLLMアプリの評価のライブラリ「OpenEvals」と「AgentEvals」について、READMEを読んだり動かしたりしてみました。
OpenEvalsのGitHubリポジトリはこちらです。
AgentEvalsのGitHubリポジトリはこちらです。
今回のポイント
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(軌跡)の評価のために個別のコードを実装する例が掲載されています。
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などあれば教えてください!