LLM アプリケーションを評価するには、フィードバックを収集して分析するためのツールが必要です。W&B Weave は統合されたフィードバックシステムを備えており、ユーザーは UI から直接、または SDK を通じてプログラムから Call に対するフィードバックを提供できます。絵文字のリアクション、テキストコメント、構造化データなど、さまざまな種類のフィードバックがサポートされており、チームは次のことを行えます。
- パフォーマンス監視のための評価用データセットを構築する。
- LLM のコンテンツに関する問題を特定して解決する。
- ファインチューニングのような高度なタスク向けの例を収集する。
このガイドは、Weave で LLM アプリケーションを扱う開発者やレビュアーを対象としています。UI と SDK の両方で Weave のフィードバック機能を使用する方法、フィードバックをクエリして管理する方法、さらに詳細な評価のために人によるアノテーションを使用する方法について説明します。
以下のセクションでは、Call details パネルまたはフィードバック アイコンを使って、Weave UI でフィードバックを送信する方法を説明します。
- Weave プロジェクトのサイドバーで、Traces にアクセスします。
- フィードバックを追加する Call の行を見つけます。
- リンクされた Trace 名をクリックして、トレース ツリーと Call details パネルを開きます。
- Call details のタブバーで、Feedback を選択します。
- フィードバックを追加、表示、または削除します。
- Call details のフィードバックビューの右上にあるアイコンを使って、フィードバックを追加または表示します。
- Call details のフィードバック表でフィードバックを表示または削除します。 該当するフィードバック行の一番右の列にあるごみ箱アイコンをクリックして、フィードバックを削除します。
Traces 表と各 Call details パネルにあるアイコンを使って、リアクションの追加や削除、メモの追加を行えます。
- Traces 表: Traces 表の該当する行の Feedback 列にあります。
- Call details パネル: 各 Call details パネルの右上にあります。
リアクションを追加するには:
- 絵文字アイコンをクリックします。
- サムズアップ、サムズダウンを追加するか、さらに絵文字を表示するには + アイコンをクリックします。
リアクションを削除するには:
- 削除したい絵文字リアクションにカーソルを合わせます。
- そのリアクションをクリックして削除します。
Call details パネルの Feedback 列からフィードバックを削除することもできます。
コメントを追加するには:
- コメントの吹き出しアイコンをクリックします。
- テキストボックスにメモを入力します。フィードバックメモの最大文字数は 1024 文字です。
- メモを保存するには、Enter キーを押します。メモは追加で入力できます。
フィードバックメモの最大文字数は 1024 文字です。メモがこの上限を超えると、Weave は作成しません。
フィードバック収集を自動化したい場合や、評価パイプラインに統合したい場合は、UI で手動でフィードバックを入力する代わりに SDK を使用します。
フィードバックに関する SDK の使用例は、UI の Call details パネルにある Use タブで確認できます。
Weave Python SDK を使用すると、call に対してプログラムから 追加、削除、およびフィードバックのクエリを実行できます。TypeScript SDK はフィードバック機能をサポートしていません。
Weave プロジェクトのフィードバックをクエリする
SDK を使用して、Weave プロジェクトのフィードバックをクエリできます。SDK では、次のフィードバック クエリ操作をサポートしています。
client.get_feedback(): project 内のすべてのフィードバックを返します。
client.get_feedback("[FEEDBACK-UUID]"): [FEEDBACK-UUID] で指定した特定のフィードバック オブジェクトをコレクションとして返します。
client.get_feedback(reaction="[REACTION-TYPE]"): 特定のリアクション タイプに対応するすべてのフィードバック オブジェクトを返します。
また、client.get_feedback() では各フィードバック オブジェクトについて次の情報も取得できます。
id: フィードバック オブジェクトの ID。
created_at: フィードバック オブジェクトの作成時刻。
feedback_type: フィードバックのタイプ (reaction、note、custom) 。
payload: フィードバックのペイロード。
import weave
client = weave.init('intro-example')
# project 内のすべてのフィードバックを取得します
all_feedback = client.get_feedback()
# id で特定のフィードバック オブジェクトを取得します。
# API はコレクションを返し、含まれる項目は最大 1 つであることが想定されます。
one_feedback = client.get_feedback("[FEEDBACK-UUID]")[0]
# 特定のリアクションを持つすべてのフィードバック オブジェクトを検索します。offset と limit を指定できます。
thumbs_up = client.get_feedback(reaction="👍", limit=10)
# 取得後に、個々のフィードバック オブジェクトの詳細を確認します。
for f in client.get_feedback():
print(f.id)
print(f.created_at)
print(f.feedback_type)
print(f.payload)
この機能はまだ TypeScript では利用できません。
Call の UUID を使って、Call にフィードバックを追加できます。UUID を使って特定の Call を取得するには、Call の実行中または実行後に UUID を取得してください。SDK では、Call にフィードバックを追加するために次の操作をサポートしています。
call.feedback.add_reaction("[REACTION-TYPE]"): 👍 など、サポートされている [REACTION-TYPE] の値 (絵文字) を 1 つ追加します。
call.feedback.add_note("[NOTE]"): ノートを追加します。
call.feedback.add("[LABEL]", [OBJECT]): [LABEL] で指定したカスタム フィードバック [OBJECT] を追加します。
フィードバックノートの最大文字数は 1024 文字です。この上限を超えるノートは Weave では作成されません。
import weave
client = weave.init('intro-example')
call = client.get_call("[CALL-UUID]")
# 絵文字リアクションを追加する
call.feedback.add_reaction("👍")
# ノートを追加する
call.feedback.add_note("this is a note")
# カスタムのキー/値ペアを追加する。
# 最初の引数はユーザー定義の "type" string です。
# フィードバックは JSON にシリアライズ可能であり、シリアライズ後のサイズが 1 KB 未満である必要があります。
call.feedback.add("correctness", { "value": 5 })
この機能は TypeScript ではまだ利用できません。
Call の直後にフィードバックを追加しなければならない場合は、Call の実行中または実行後に、プログラムで Call UUID を取得できます。
Call 実行中
Call 実行中に UUID を取得するには、現在の Call を取得し、その ID を返します。
import weave
weave.init("uuid")
@weave.op()
def simple_operation(input_value):
# シンプルな処理を実行します
output = f"Processed {input_value}"
# 現在の Call ID を取得します
current_call = weave.require_current_call()
call_id = current_call.id
return output, call_id
この機能は TypeScript ではまだ利用できません。
Call 実行後
また、call() メソッドを使用すると、オペレーションを実行し、Call 実行後に ID を取得できます。
import weave
weave.init("uuid")
@weave.op()
def simple_operation(input_value):
return f"Processed {input_value}"
# オペレーションを実行し、結果と call ID を取得します
result, call = simple_operation.call("example input")
call_id = call.id
この機能はまだ TypeScript では利用できません。
UUID を指定すると、特定の Call からフィードバックを削除できます。
call.feedback.purge("[FEEDBACK-UUID]")
この機能は、TypeScript ではまだ利用できません。
人によるアノテーションを使用すると、Call に対する、人がレビューした構造化された評価を取得できるため、レビュアーは独自の基準に基づいてモデルの出力をスコアできます。
人によるアノテーションは Weave UI でサポートされています。この機能を使用すると、フィードバックとして追加する人手入力のデータ用に、トレースにカスタムフィールドを作成できます。人によるアノテーションを行うには、まず UI または API を使用して Human Annotation スコアラーを作成する必要があります。その後、UI でそのスコアラーを使用してアノテーションを作成 したり、API を使用してアノテーションスコアラーを変更 したりできます。
UI で Human Annotation スコアラーを作成する
UI で Human Annotation スコアラーを作成するには、次の手順に従います。
- プロジェクトのサイドバーで、Assets にアクセスします。
- Assets のナビゲーションパネルで、Scorers をクリックします。
- Scorers パネルのヘッダーで、New scorer をクリックします。
- Create Scorer モーダルダイアログで、次の項目を設定します。
Scorer type を Human annotation に設定
Name
Description
Type。これにより、boolean や integer など、収集するフィードバックのタイプを決定します。
- Create scorer をクリックします。これで、作成したスコアラーを使用してアノテーションを作成できます。
次の例では、人間のアノテーターが、LLM が読み込んだドキュメントのタイプを選択しています。スコア設定の Type は、指定可能なドキュメントタイプを含む enum です。
UI で Human Annotation スコアラーを使用する
Human Annotation スコアラーを作成すると、Traces ページで使用できるようになります。
スコアラーを使用するには、次の手順を実行します。
-
プロジェクトのサイドバーで、Traces にアクセスします。
-
Human Annotation を追加する対象の Call の行を見つけます。
-
リンクされた Trace 名をクリックして、トレース ツリーと Call details パネルを開きます。
-
Call details タブバーの右上で、Show feedback ボタンをクリックします。
使用可能な Human Annotation スコアラーが、Annotate パネルに表示されます。
-
アノテーションを追加します。
-
Save をクリックします。
-
Call details パネルのタブバーで、Feedback タブをクリックして Feedback 表を表示します。新しいアノテーションが表に表示されます。メインの Traces 表の Annotations 列でもアノテーションを確認できます。
最新の情報を表示するには、Traces 表を更新してください。
API を使用して Human Annotation スコアラーを作成する
API 経由で Human Annotation スコアラーを作成することもできます。各スコアラーはそれぞれ独立したオブジェクトで、個別に作成・更新します。プログラムから Human Annotation スコアラーを作成するには、次の手順を実行します。
weave.flow.annotation_spec から AnnotationSpec クラスをインポートします。
weave の publish method を使用してスコアラーを作成します。
次の例では、2 つのスコアラーを作成します。1 つ目のスコアラー Temperature は、LLM call の知覚温度をスコアリングします。2 つ目のスコアラー Tone は、LLM response のトーンをスコアリングします。各スコアラーは、対応するオブジェクト ID (temperature-scorer と tone-scorer) を指定して save を使用します。
import weave
from weave.flow.annotation_spec import AnnotationSpec
client = weave.init("feedback-example")
spec1 = AnnotationSpec(
name="Temperature",
description="The perceived temperature of the llm call",
field_schema={
"type": "number",
"minimum": -1,
"maximum": 1,
}
)
spec2 = AnnotationSpec(
name="Tone",
description="The tone of the llm response",
field_schema={
"type": "string",
"enum": ["Aggressive", "Neutral", "Polite", "N/A"],
},
)
weave.publish(spec1, "temperature-scorer")
weave.publish(spec2, "tone-scorer")
この機能はまだ TypeScript では利用できません。
API を使用して Human Annotation スコアラーを更新する
API を使用して Human Annotation スコアラーを作成するの続きとして、次の例では publish 時に元のオブジェクト ID (temperature-scorer) を使用し、Temperature スコアラーの更新版を作成します。これにより、すべてのバージョンの履歴を持つ更新済みオブジェクトが作成されます。
Human Annotation スコアラーのオブジェクト履歴は、Human annotations 配下の Scorers タブで確認できます。
import weave
from weave.flow.annotation_spec import AnnotationSpec
client = weave.init("feedback-example")
# スコアラーの新しいバージョンを作成する
spec1 = AnnotationSpec(
name="Temperature",
description="LLM Call の体感温度",
field_schema={
"type": "integer", # <<- タイプを integer に変更
"minimum": -1,
"maximum": 1,
}
)
weave.publish(spec1, "temperature-scorer")
この機能はまだ TypeScript では利用できません。
API を使用して Human Annotation スコアラーを利用する
feedback API では、特別な形式の名前と annotation_ref フィールドを指定することで、Human Annotation スコアラーを使用できます。annotation_spec_ref は、UI で該当するタブを選択して取得するか、AnnotationSpec の作成時に取得できます。
import weave
client = weave.init("feedback-example")
call = client.get_call("[CALL-ID]")
annotation_spec = weave.ref("[ANNOTATION-SPEC-REF-URI]")
call.feedback.add(
feedback_type="wandb.annotation." + annotation_spec.name,
payload={"value": 1},
annotation_ref=annotation_spec.uri(),
)