評価駆動型LLMアプリケーション開発は、一貫した厳選された例を使用して体系的に動作を測定することで、LLMアプリケーションを体系的に改善するのに役立ちます。 Weaveでは、ワークフローの中核はEvaluationオブジェクトであり、以下を定義します: 一度Evaluationを定義したら、ModelオブジェクトまたはLLMアプリケーションロジックを含むカスタム関数に対して実行できます。.evaluate()の各呼び出しは評価実行をトリガーします。Evaluationオブジェクトを設計図として、各実行をそのセットアップの下でアプリケーションがどのようにパフォーマンスを発揮するかの測定と考えてください。 評価を開始するには、次の手順を完了してください:
  1. オブジェクトを作成するEvaluationオブジェクト
  2. 例のデータセットを定義する
  3. スコアリング関数を定義する
  4. 評価するModelを定義する
  5. 評価を実行する
完全な評価コードサンプルはこちらで見つけることができます。また、高度な評価機能保存されたビュー命令型評価など)についても詳しく学ぶことができます。

1. Evaluationオブジェクトを作成する

オブジェクトを作成することは、評価設定をセットアップする最初のステップです。Evaluationは、例データ、スコアリングロジック、およびオプションの前処理で構成されています。後で、これを使用して1つ以上の評価を実行します。EvaluationWeaveは各例を取り、アプリケーションを通じて渡し、複数のカスタムスコアリング関数で出力をスコアリングします。これにより、アプリケーションのパフォーマンスの概要と、個々の出力とスコアを詳しく調査するための豊富なUIが得られます。 Weaveは各例を取り、アプリケーションを通じて渡し、複数のカスタムスコアリング関数で出力をスコアリングします。これにより、アプリケーションのパフォーマンスの概要と、個々の出力とスコアを詳しく調査するための豊富なUIが得られます。

(オプション)カスタム命名

評価フローにはカスタマイズ可能な名前の2種類があります:

名前を付ける Evaluation オブジェクト

オブジェクト Evaluation 自体に名前を付けるには、evaluation_name パラメータを Evaluation クラスに渡します。この名前は、コードとUIリストで評価を識別するのに役立ちます。
evaluation = Evaluation(
    dataset=examples, scorers=[match_score1], evaluation_name="My Evaluation"
)

個々の評価実行に名前を付ける

特定の評価実行(evaluate()の呼び出し)に名前を付けるには、__weave 辞書に display_nameを使用します。これはその実行のUIに表示される内容に影響します。
evaluation = Evaluation(
    dataset=examples, scorers=[match_score1]
)
evaluation.evaluate(model, __weave={"display_name": "My Evaluation Run"})

2. テスト例のデータセットを定義する

まず、Dataset オブジェクトまたは評価される例のコレクションを持つ辞書のリストを定義します。これらの例は、テストしたい失敗ケースであることが多く、テスト駆動開発(TDD)の単体テストに似ています。 以下の例は、辞書のリストとして定義されたデータセットを示しています:
examples = [
    {"question": "What is the capital of France?", "expected": "Paris"},
    {"question": "Who wrote 'To Kill a Mockingbird'?", "expected": "Harper Lee"},
    {"question": "What is the square root of 64?", "expected": "8"},
]

3. スコアリング関数を定義する

次に、1つ以上の スコアリング関数を作成します。これらは Datasetの各例をスコアリングするために使用されます。各スコアリング関数には outputが必要で、スコアを含む辞書を返す必要があります。オプションで、例から他の入力を含めることもできます。 スコアリング関数には output キーワード引数が必要ですが、他の引数はユーザー定義であり、データセット例から取得されます。引数名に基づいた辞書キーを使用して、必要なキーのみを取得します。
スコアラーが output 引数を期待しているのに受け取っていない場合は、レガシーの model_output キーを使用している可能性があるかどうかを確認してください。これを修正するには、スコアラー関数を更新して、outputをキーワード引数として使用するようにします。
以下のサンプルスコアラー関数 match_score1expected の値を examples 辞書からスコアリングに使用します。
import weave

# Collect your examples
examples = [
    {"question": "What is the capital of France?", "expected": "Paris"},
    {"question": "Who wrote 'To Kill a Mockingbird'?", "expected": "Harper Lee"},
    {"question": "What is the square root of 64?", "expected": "8"},
]

# Define any custom scoring function
@weave.op()
def match_score1(expected: str, output: dict) -> dict:
    # Here is where you'd define the logic to score the model output
    return {'match': expected == output['generated_text']}

(オプション)カスタム Scorer クラスを定義する

一部のアプリケーションでは、カスタム Scorer クラスを作成したい場合があります - 例えば、標準化された LLMJudge クラスを特定のパラメータ(例:チャットモデル、プロンプト)、各行の特定のスコアリング、および集計スコアの特定の計算で作成する必要がある場合などです。 詳細については、Scorer クラスの定義に関するチュートリアルを RAGアプリケーションのモデルベース評価 で参照してください。

4. 評価する Model を定義する

を評価するには、Modelに対して evaluate を呼び出し、Evaluationを使用します。Models は、実験したいパラメータがあり、weaveでキャプチャしたい場合に使用されます。
from weave import Model, Evaluation
import asyncio

class MyModel(Model):
    prompt: str

    @weave.op()
    def predict(self, question: str):
        # here's where you would add your LLM call and return the output
        return {'generated_text': 'Hello, ' + self.prompt}

model = MyModel(prompt='World')

evaluation = Evaluation(
    dataset=examples, scorers=[match_score1]
)
weave.init('intro-example') # begin tracking results with weave
asyncio.run(evaluation.evaluate(model))
これにより、各例に対して predict が実行され、各スコアリング関数で出力がスコアリングされます。

(オプション)評価する関数を定義する

あるいは、@weave.op()でトラッキングされたカスタム関数を評価することもできます。
@weave.op
def function_to_evaluate(question: str):
    # here's where you would add your LLM call and return the output
    return  {'generated_text': 'some response'}

asyncio.run(evaluation.evaluate(function_to_evaluate))

5. 評価を実行する

評価を実行するには、評価したいオブジェクトに対して .evaluate() を呼び出します。 例えば、Evaluation オブジェクトが evaluation という名前で、評価する Model オブジェクトが model という名前の場合、以下のコードで評価実行をインスタンス化します。
asyncio.run(evaluation.evaluate(model))
評価実行のヒント
  1. evaluate() メソッドはすべての例にわたる結果の要約を返します。出力とスコアを含むスコアリングされた行の完全なセットにアクセスするには、get_eval_results()を使用します。
  2. display_name を呼び出す際に .evaluate() を提供しない場合、Weaveは日付とランダムな覚えやすい名前を使用して自動的に生成します。詳細については、個々の評価実行に名前を付ける方法を参照してください。
  3. .evaluate に渡されるモデルは Model または @weave.op でトラッキングされた関数である必要があります。通常のPython関数は @weave.op でラップされていない限りサポートされていません。

(オプション)複数の試行を実行する

trials パラメータを Evaluation オブジェクトに設定して、各例を複数回実行することができます。
evaluation = Evaluation(dataset=examples, scorers=[match_score], trials=3)
各例は model に3回渡され、各実行は個別にスコアリングされ、Weaveに表示されます。

完全な評価コードサンプル

以下のコードサンプルは、最初から最後までの完全な評価実行を示しています。examples 辞書は match_score1 および match_score2 スコアリング関数によって使用され、MyModel の値に基づいて prompt を評価し、カスタム関数 function_to_evaluate も評価します。Model と関数の両方の評価実行は asyncio.run(evaluation.evaluate() を介して呼び出されます。
from weave import Evaluation, Model
import weave
import asyncio
weave.init('intro-example')
examples = [
    {"question": "What is the capital of France?", "expected": "Paris"},
    {"question": "Who wrote 'To Kill a Mockingbird'?", "expected": "Harper Lee"},
    {"question": "What is the square root of 64?", "expected": "8"},
]

@weave.op()
def match_score1(expected: str, output: dict) -> dict:
    return {'match': expected == output['generated_text']}

@weave.op()
def match_score2(expected: dict, output: dict) -> dict:
    return {'match': expected == output['generated_text']}

class MyModel(Model):
    prompt: str

    @weave.op()
    def predict(self, question: str):
        # here's where you would add your LLM call and return the output
        return {'generated_text': 'Hello, ' + question + self.prompt}

model = MyModel(prompt='World')
evaluation = Evaluation(dataset=examples, scorers=[match_score1, match_score2])

asyncio.run(evaluation.evaluate(model))

@weave.op()
def function_to_evaluate(question: str):
    # here's where you would add your LLM call and return the output
    return  {'generated_text': 'some response' + question}

asyncio.run(evaluation.evaluate(function_to_evaluate("What is the capitol of France?")))
Evals hero

高度な評価の使用法

評価前にデータセット行をフォーマットする

preprocess_model_input 関数は、モデルの予測関数に渡す前に入力にのみ適用されます。スコアラー関数は常に、前処理が適用されていない元のデータセット例を受け取ります。
preprocess_model_input パラメータを使用すると、評価関数に渡される前にデータセット例を変換できます。これは以下の場合に役立ちます:
  • モデルの予想される入力と一致するようにフィールドの名前を変更する
  • データを正しい形式に変換する
  • フィールドを追加または削除する
  • 各例の追加データを読み込む
以下は preprocess_model_input を使用してフィールドの名前を変更する方法を示す簡単な例です:
import weave
from weave import Evaluation
import asyncio

# Our dataset has "input_text" but our model expects "question"
examples = [
    {"input_text": "What is the capital of France?", "expected": "Paris"},
    {"input_text": "Who wrote 'To Kill a Mockingbird'?", "expected": "Harper Lee"},
    {"input_text": "What is the square root of 64?", "expected": "8"},
]

@weave.op()
def preprocess_example(example):
    # Rename input_text to question
    return {
        "question": example["input_text"]
    }

@weave.op()
def match_score(expected: str, output: dict) -> dict:
    return {'match': expected == output['generated_text']}

@weave.op()
def function_to_evaluate(question: str):
    return {'generated_text': f'Answer to: {question}'}

# Create evaluation with preprocessing
evaluation = Evaluation(
    dataset=examples,
    scorers=[match_score],
    preprocess_model_input=preprocess_example
)

# Run the evaluation
weave.init('preprocessing-example')
asyncio.run(evaluation.evaluate(function_to_evaluate))
この例では、データセットには input_text フィールドを持つ例が含まれていますが、評価関数は question パラメータを期待しています。preprocess_example 関数はフィールドの名前を変更することで各例を変換し、評価が正しく機能するようにします。 前処理関数は:
  1. データセットから生の例を受け取ります
  2. モデルが期待するフィールドを持つ辞書を返します
  3. 評価関数に渡される前に各例に適用されます
これは、モデルが期待するものとは異なるフィールド名や構造を持つ可能性がある外部データセットを扱う場合に特に役立ちます。

評価でHuggingFaceデータセットを使用する

私たちはサードパーティのサービスやライブラリとの統合を継続的に改善しています。 より円滑な統合を構築している間、preprocess_model_input を一時的な回避策としてWeave評価でHuggingFace Datasetsを使用することができます。 現在のアプローチについては、評価でHuggingFaceデータセットを使用するクックブック を参照してください。

保存されたビュー

Evalsテーブルの設定、フィルター、並べ替えを保存されたビューとして保存し、お好みの設定にすぐにアクセスできます。UIとPython SDKを通じて保存されたビューを設定およびアクセスできます。詳細については、Saved Viewsをご覧ください。

命令型評価(EvaluationLogger

より柔軟な評価フレームワークを希望する場合は、WeaveのEvaluationLoggerをご確認ください。命令型アプローチは複雑なワークフローに対してより柔軟性を提供し、標準評価フレームワークはより構造化されたガイダンスを提供します。