生成AIの評価手法〜LangChain, guidance, Azure AI Studioの比較・統合
生成AIを活用したアプリケーション開発が急増しています。そんな中、開発におけるプロンプト・チューニングの手法は広まりましたが、テストについての知見は情報が散在しています。
そこで、生成AIアプリケーションの開発ツールとして注目されている、LangChain, guidance, Azure AI Studioを比較しながら、ツールに依存しない評価手法として統合していきます。(GoogleのGenerative AI Studioも要注目ですが、現時点では評価機能が弱いので対象外)
なぜ生成AIアプリケーションの評価が重要なのか?
なにを評価するのか?
どのように評価するのか?
はじめに
生成AIの基盤モデルである、GPT-4、Gemini、Llama2などの基礎性能を比較する上では、一般的なベンチマークが参考になります。例えば、Geminiの技術レポートでは、32個のベンチマークによって、他の基盤モデルと比較していました。
一方で、あるユースケースに特化した生成AIアプリケーションを評価するには、汎用的なベンチマークを活用できません。そこで、生成AIアプリケーションの開発ツールにおける評価機能やガイドを参考にしつつ、ツールに依存しない一般的な評価手法としてまとめてみます。
多くの人が使うツールには、さまざまなユースケースで検証された知見が溜まっています。
LangChain : 最も人気のある機能が豊富なOSSライブラリ
guidance : 比較的安定したMicrosoftによるOSSライブラリ
Azure AI Studio : Microsoftによるクラウド開発ツール
しかし、各ツールは特徴が異なるので、それらを体系的に再構成することで、網羅性の高い評価手法としてまとめてみます。
LangChain (Evaluation) : 機能も情報も豊富だが、情報が散在して読み解くのが困難
guidance (test) : 機能は少ないが、評価プロセスでLLMを徹底活用
Azure AI Studio (Evaluate Apps) : 機能は最低限だが、解説が分かりやすくプロンプト例も豊富
なぜ、生成AIアプリを評価するのか?
いままでのルールベースのプログラミングの世界では、仕様通りに設計・実装して、テストではその仕様に沿っているかを確認する、硬いアプローチを取っていました。
一方、生成AIの世界では、さまざまな不確定要素があります。
プロンプトに対する生成AIは回答は、確率的に揺らぐ
ユーザーからのプロンプトは多様であり、かつ、想定していないプロンプトにも回答できてしまう(生成AIの汎用性ゆえ)
つまり、事前に想定した仕様が柔らかいままで、設計・実装できてしまい、そうせざるを得ません。だからこそ、生成AIアプリケーションを開発した後に、テストによって仕様を明らかにするという、柔らかいアプローチになります。
開発した後にテストで仕様を明らかにするというのは、いままでの常識と前後関係が逆であり、新たな発想が必要になります。これがパラダイムシフトであり、生成AIの基盤モデルで既に起きている現象です。例えば、GPTを開発したOpenAI社は、あくまで大量のデータをAIに学習させただけであり、GPTの仕様を完全に理解しているわけではありません。世界中の研究者・開発者がこぞってGPTをテストしたことで、その能力が明らかになってきています。
また、生成AIアプリケーションの開発でプロンプト・チューニングをしていると、多くの人がある疑問を持つのではないでしょうか。
「このプロンプト(テンプレート)は最適解なのか?」
自分が思いつくプロンプトでテストをして、その回答を確認しながら少しずつ改善しても、最適解に近づいている確証を得るのが難しいです。そのような定性評価には限界があり、何らかの定量評価が必要になります。
なにを、生成AIアプリで評価するのか?
定量評価をするには、何らかの指標が必要です。いままでの機械学習における指標も利用できますし、生成AIの登場により測定可能になった新しい指標もあります。
従来の機械学習の指標
生成AIは確率的な回答をするので、従来の機械学習の指標がいくつか役立ちます。生成AIの回答と期待する回答が、どれだけ近いかを測ります。
完全一致:テキストの完全一致。最も厳密な評価。
正規表現一致:正規表現(例:YYYY-MM-DD)レベルでの一致
単語の類似度:単語レベルでの一致(例:F値の比率)
文字列の類似度:例えば、レーベンシュタイン距離(1文字の挿入・削除・置換によって、一方の文字列をもう一方の文字列に変形するのに必要な手順の最小回数)
意味的な類似度:テキストの埋め込みベクトルでの近さ(例:コサインやユークリッド距離など)
LangChainとAzure AI Studioのデフォルト機能での対応状況は、以下の通りです。
生成AIならではの新たな指標
生成AIならではの新たな指標もあります。それは、生成AIの回答を生成AI自身で評価する手法です。例えば、生成AIの回答が「簡潔なのか」を、生成AIで評価します。
しかし、生成AIの回答を生成AI自身で評価することに、違和感を感じるかもしれません。それに関しては、以下の解説が分かりやすいです。
具体的な手法は、LangChain、Azure AI Studio、guidanceで、それぞれ指標名などの方針が異なるようです。
LangChainのデフォルトの指標である基準と評価プロンプトは、以下の通りです。
一方、Azure AI Studioのデフォルトの指標であるAI支援メトリックについて、定義とプロンプトは以下の通りです。
You will be presented with a CONTEXT and an ANSWER about that CONTEXT. You need to decide whether the ANSWER is entailed by the CONTEXT by choosing one of the following rating:
1. 5: The ANSWER follows logically from the information contained in the CONTEXT.
2. 1: The ANSWER is logically false from the information contained in the CONTEXT.
3. an integer score between 1 and 5 and if such integer score does not exist,
use 1: It is not possible to determine whether the ANSWER is true or false without further information.
Read the passage of information thoroughly and select the correct answer from the three answer labels.
Read the CONTEXT thoroughly to ensure you know what the CONTEXT entails.
Note the ANSWER is generated by a computer system, it can contain certain symbols, which should not be a negative factor in the evaluation.
Relevance measures how well the answer addresses the main aspects of the question, based on the context. Consider whether all and only the important aspects are contained in the answer when evaluating relevance. Given the context and question, score the relevance of the answer between one to five stars using the following rating scale:
One star: the answer completely lacks relevance
Two stars: the answer mostly lacks relevance
Three stars: the answer is partially relevant
Four stars: the answer is mostly relevant
Five stars: the answer has perfect relevance
This rating value should always be an integer between 1 and 5. So the rating produced should be 1 or 2 or 3 or 4 or 5.
Coherence of an answer is measured by how well all the sentences fit together and sound naturally as a whole. Consider the overall quality of the answer when evaluating coherence. Given the question and answer, score the coherence of answer between one to five stars using the following rating scale:
One star: the answer completely lacks coherence
Two stars: the answer mostly lacks coherence
Three stars: the answer is partially coherent
Four stars: the answer is mostly coherent
Five stars: the answer has perfect coherency
This rating value should always be an integer between 1 and 5. So the rating produced should be 1 or 2 or 3 or 4 or 5.
Fluency measures the quality of individual sentences in the answer, and whether they are well-written and grammatically correct. Consider the quality of individual sentences when evaluating fluency. Given the question and answer, score the fluency of the answer between one to five stars using the following rating scale:
One star: the answer completely lacks fluency
Two stars: the answer mostly lacks fluency
Three stars: the answer is partially fluent
Four stars: the answer is mostly fluent
Five stars: the answer has perfect fluency
This rating value should always be an integer between 1 and 5. So the rating produced should be 1 or 2 or 3 or 4 or 5.
GPT-Similarity, as a metric, measures the similarity between the predicted answer and the correct answer. If the information and content in the predicted answer is similar or equivalent to the correct answer, then the value of the Equivalence metric should be high, else it should be low. Given the question, correct answer, and predicted answer, determine the value of Equivalence metric using the following rating scale:
One star: the predicted answer is not at all similar to the correct answer
Two stars: the predicted answer is mostly not similar to the correct answer
Three stars: the predicted answer is somewhat similar to the correct answer
Four stars: the predicted answer is mostly similar to the correct answer
Five stars: the predicted answer is completely similar to the correct answer
This rating value should always be an integer between 1 and 5. So the rating produced should be 1 or 2 or 3 or 4 or 5.
A chat history between user and bot is shown below
A list of documents is shown below in json format, and each document has one unique id.
These listed documents are used as contex to answer the given question.
The task is to score the relevance between the documents and the potential answer to the given question in the range of 1 to 5.
1 means none of the documents is relevant to the question at all. 5 means either one of the document or combination of a few documents is ideal for answering the given question.
Think through step by step:
- Summarize each given document first
- Determine the underlying intent of the given question, when the question is ambiguous, refer to the given chat history
- Measure how suitable each document to the given question, list the document id and the corresponding relevance score.
- Summarize the overall relevance of given list of documents to the given question after # Overall Reason, note that the answer to the question can soley from single document or a combination of multiple documents.
- Finally, output "# Result" followed by a score from 1 to 5.
# Question
{{ query }}
# Chat History
{{ history }}
# Documents
---BEGIN RETRIEVED DOCUMENTS---
{{ FullBody }}
---END RETRIEVED DOCUMENTS---
どのように、生成AIアプリを評価するのか?
評価指標をどのように測定するか確認します。ここでは、評価の指針、評価のステップ、評価のパターンを考えます。
評価の指針
評価を始める前に、まず大きな指針を確認します。いままでの機械学習における知見もあれば、生成AIならではの考慮事項もあります。
評価のステップ
評価のステップを3つに分けて、各ステップの詳細を確認します。各ステップで、生成AIをフル活用します。
テストデータの準備
テストの実施
テスト結果の確認・改善
1.テストデータの準備
評価には、テストデータが必要です。アプリケーションのリリース後なら本番環境のユーザー・データを利用できますが、リリース前ではテストデータを作成する必要があります。ここでは、リリース前のテストデータ作成を生成AIで行うために、LangChainとguidanceの手法を紹介します。(Azure AI Studioにはテストデータの生成に関する記述なし)
1.a. テストデータの作成 by LangChain
テストデータを準備する2つの方法を考えます。(プロンプト例は長文なので、引用元を参照してください)
1.b. テストデータの作成 by guidance
1.b.1. ユースケースを列挙する
テストデータを作るために、生成AIでユースケースを列挙します。
(以下は、電子メールの支援ツールを評価する場合のプロンプト)
question = ''ユーザーの電子メールを支援するツールがあります。
ユーザーは、受信した電子メールまたは作成中の下書き内の文または大きな塊を強調表示します。 次に、ユーザーが自然言語の命令を記述すると、ツールは強調表示されたテキストに対して必要な操作を実行します。
たとえば、ユーザーはドラフト全体を強調表示し、システムに「より簡潔にする」ように要求することができます。 あるいは、ユーザーは受信した電子メールを強調表示し、システムに「丁重に断る返答を書く」よう要求することもできます。
このようなツールの具体的なユースケースを 5 つ挙げてください。 それぞれの例について、次のように指定してください。
- シナリオ、つまりユーザーがツールを使って何をしたいのか。
- 彼らは何を強調しましたか?
- ユーザーはどのような種類の電子メールを作成または返信しようとしていますか?
- ユーザーの作成に役立つ指示の例''
1.b.2.データを生成する
ユースケース毎に、生成AIでテストデータを生成します。
instruction = '''誰かが受信する可能性のある典型的な電子メールと、誰かが書く可能性のある典型的な電子メールのデータセットを作成してください。
データセットは長さとトピックの点で多様である必要があり、10 件の電子メールが含まれている必要があります。 これには実名が含まれ、電子メールの本文のみで構成されている必要があります (ヘッダーやアドレスは含まれません)。
次の形式を使用してください。
EMAIL: <電子メール本文>
---
EMAIL: <電子メール本文>
---
And so on'''
dataset = ask_LLM(input=instruction, silent=False, temperature=1)
dataset = dataset(input='Please give me 10 more, but make them a bit longer', silent=False, temperature=1)
dataset = dataset(input='Please give me 10 more, but make them very short', silent=False, temperature=1)
1.b.3. ユースケース毎の属性を考えて、テストケースを書く
ユースケース毎に、評価すべき属性を考えて、テストケースを書きます。ここでも生成AIをフル活用します。(プロンプト例は長文なので、引用元を参照してください)
2.テストの実施
準備したテストデータで、テストを実施します。あるプロンプトを特定の基盤モデルで評価したり、同じプロンプトを複数の基盤モデル (GPT-4, Gemini, Lama2など) で比較したり、さまざまなパターンがあります。この評価のパターンは、後ほど整理します。
3.テスト結果の確認・改善
テストを実施した後、結果を確認し、必要に応じてバグを改善します。定量評価でエラー率が期待より高いテストケースについて、プロンプトと結果を深堀していきます。
このステップにおける作業は、アプリケーションやテストケース毎に大きく異なります。参考までに、guidanceにある電子メールの支援ツールの例を紹介します。
question = f'''私は電子メールを受け取り、重要な情報を失わずにメールをより簡潔にするツールを持っています。
出力に重要な情報が欠落しているため、ツールが機能しなかった電子メールをいくつか紹介します。 あなたの目標は、ツールが失敗するであろうより多くの電子メールを見つけ出すことです。
FAILURES:
{fails}
----
これらの電子メールがどのように結び付けられているのかを推論し、ツールが失敗する電子メールをさらに 20 件考え出してください。
上記と同じ形式を使用してください。つまり、ヘッダーや件名なしでメール本文のみを使用し、各メールを「EMAIL:」で始めてください。
'''
評価のパターン
プロンプト、基盤モデル、RAGの有無で、さまざまな評価のパターンが考えられます。
プロンプト
単一のプロンプト
複数のプロンプト(2種類のプロンプトのA/Bテストなど)
マルチターン(チャット形式によるプロンプトと回答の連続)
基盤モデル
単一の基盤モデル
複数の基盤モデル(GPT-4とGeminiの比較、GPT-4の異なる温度設定の比較など)
RAG
RAGなし
RAGあり
$$
\begin{array}{|l|l|l|l|} \hline
パターン & プロンプト & 基盤モデル & RAG \\ \hline
A1.単純 & 単一 & 単一 & なし \\ \hline
A2.単純RAG & 単一 & 単一 & あり \\ \hline
B.モデル比較 & 単一 & 複数 & なし/あり \\ \hline
C.プロンプト比較 & 複数 & 単一 & なし/あり \\ \hline
D.チャット & マルチターン & 単一 & なし/あり \\ \hline
\end{array}
$$
パターンA1.単純
単一のプロンプトを、単一の基盤モデルで評価する、最も単純なパターンです。これまでに紹介した手法で評価します。LangChainとAzure AI Studioのデフォルト機能で対応しています。
<LangChain>
from langchain.smith import RunEvalConfig
eval_config = RunEvalConfig(
evaluators=["qa"],
# If you want to configure the eval LLM:
# eval_llm=ChatAnthropic(model="claude-2", temperature=0)
)
_ = await client.arun_on_dataset(
dataset_name=dataset_name,
llm_or_chain_factory=lambda: chain,
evaluation=eval_config,
)
<Azure AI Studio>
パターンA2.単純RAG
パターンA1に、RAGを追加した応用パターンです。LangChainとAzure AI Studioでの対応方法を紹介します。
<LangChain>
self.evaluator = load_evaluator(
"labeled_score_string",
criteria={"faithful": "How faithful is the submission to the reference context?"},
normalize_by=10,
)
<Azure AI Studio>
パターンB.モデル比較
複数の基盤モデル (GPT-4, Gemini, Lama2など) を比較するパターンです。パターンAの単純な評価を、それぞれの基盤モデルで個別に実施した上で、さらに、高度な比較をします。LangChainはペアワイズ比較に対応しています。
パターンC.プロンプト比較
2種類のプロンプトのA/Bテストなど、複数のプロンプトを比較するパターンです。プロンプトを改善していく際に、Before/Afterの性能を評価するケースは、このパターンです。基本的には、パターンB.モデル比較と同様の手順です。
パターンD.チャット
チャット形式で会話が続き、プロンプトと結果がマルチターンになるパターンです。最初のプロンプトと最後の結果だけでなく、中間ステップの会話履歴も評価対象に加えます。LangChainが対応しています。(プロンプト例は長文なので、引用元を参照してください)
さいごに
なぜ生成AIアプリケーションの評価が重要なのかを再確認し、なにを評価するのか(従来の機械学習の指標と生成AIならではの指標)を知り、どのように評価するのか(指針、ステップ、パターン)を学びました。
具体的には、生成AIアプリケーションの開発ツールであるLangChain, guidance, Azure AI Studioを比較しながら、ツールに依存しない評価手法としてまとめした。各ツールの詳細な機能やガイドは、以下のリンク先のドキュメントを確認してください。
LangChain
guidance
Azure AI Studio
なお、各ツールは生まれて間もないこともあり、機能の増減が激しく、破壊的な変更が行われるリスクもあります。なので、今回解説したようにツールの中身を読み解くことで、独自実装するのもリスク回避の一手です。
後回しにしがちなテストを体系的に理解した上で、生成AIアプリケーションの開発を楽しみましょう!
いただいたサポートは、note執筆の調査費等に利用させていただきます