ジェネラティブエージェンツの大嶋です。
「AIエージェントキャッチアップ #59 - W&B Weave」という勉強会を開催しました。
generative-agents.connpass.com
アーカイブ動画はこちらです。
W&B Weave
今回は、LLMアプリケーションのトレースや評価の機能を持つ「W&B Weave」をキャッチアップしました。
W&B Weaveの公式ドキュメントはこちらです。
今回のポイント
W&B Weaveとは
W&B Weaveは、LLMアプリケーションのトレースや評価などの機能を持つサービスです。 近い立ち位置のサービスとしては、LangSmithやLangfuseがあります。
クラウドまたはプライベートホストプランで利用可能です。 料金の詳細は以下のWebページを参照してください。
Weaveでのトレースの基本
Weaveをさわる第一歩としてトレース機能を試しました。
uv add weaveでWeaveのクライアントをインストールし、以下のようなコードを実行します。
import weave from openai import OpenAI client = OpenAI() @weave.op() def extract_dinos(sentence: str) -> dict: response = client.chat.completions.create( model="gpt-4o", : weave.init("jurassic-park") result = extract_dinos("...")
すると以下のように、Weaveにトレースが記録されます。

@weave.op()のようにデコレーターをつけた関数に加えて、OpenAIのPythonクライアントやLangChainなどの主要なライブラリの呼び出しが自動的にトレースされるとのことです。
LangChainのトレース
LangChainでのトレースも試しました。 サンプルコードは以下のようになります。
import weave from langchain.chat_models import init_chat_model from langchain.messages import HumanMessage, SystemMessage @weave.op() def generate_answer(question: str) -> str: model = init_chat_model(model="openai:gpt-5-nano", reasoning_effort="low") answer = model.invoke( [ SystemMessage(content="You are a helpful assistant."), HumanMessage(content=question), ], ) reflection = model.invoke( [ SystemMessage(content="回答が正しいかチェックしてください"), HumanMessage(content=f"回答: {answer}\n質問: {question}"), ], ) return answer.content weave.init("jurassic-park") answer = generate_answer("日本の首都は?")
LangChainでのモデルの呼び出しも自動でトレースされています。

ちなみに、Weaveでは実行された関数のコードまで自動で記録されるようです。

このあたりは、Pythonのメタプログラミング的な機能が使われているのかもしれません。
「Model」機能
Weaveの特徴的な機能の1つは「Model」です。
LLMの種類やプロンプトのテンプレートをWeaveの「Model」というオブジェクトにまとめてバージョン管理できます。 プロンプトだけでなくLLMの種類やtemperatureといった設定までバージョン管理できるのは他のプラットフォームではあまり見ない機能です。
Weaveの「Model」は、以下のように定義します。
import weave class ExtractFruitsModel(weave.Model): model_name: str prompt_template: str temperature: float @weave.op() async def predict(self, sentence: str) -> dict: :
複数のプロンプトを1つの「Model」としてまとめて管理することもできるそうです。
データセット管理
Weaveには評価に関する機能もあります。
以下のようにデータセットを用意してweave.publish(dataset)でWeave上に保存できます。
import weave examples = [ {'id': '0', 'sentence': '...', 'target': {'fruit': 'neoskizzles', ...}}, {'id': '1', 'sentence': '...', 'target': {'fruit': 'pounits', ...}}, {'id': '2', 'sentence': '...', 'target': {'fruit': 'glowls', ...}}, ] weave.init('intro-example') dataset = weave.Dataset(name='fruits', rows=examples) weave.publish(dataset)

このコードは同じ内容で実行しても何も起こりませんが、コード上のデータを変更するとデータセットのバージョンが上がります。 つまり、差分検知による自動バージョニング機能が実装されています。
オフライン評価の実行
Weaveでのオフライン評価の実行も試しました。
以下のようにScorerを実装してweave.Evaluationを使用すると評価を実行できます。
import weave from weave.scorers import MultiTaskBinaryClassificationF1 @weave.op() def fruit_name_score(target: dict, output: dict) -> dict: return {'correct': target['fruit'] == output['fruit']} weave.init('intro-example') evaluation = weave.Evaluation( name='fruit_eval', dataset=dataset, scorers=[ MultiTaskBinaryClassificationF1(class_names=["fruit", "color", "flavor"]), fruit_name_score ], ) await evaluation.evaluate(model)
何度か実行すると、評価結果の比較も可能です。 各評価のスコアだけでなく、レイテンシーも可視化されます。

Weaveでは、Evaluation自体もバージョニングされるようになっており、データセットやModelが変わるとEvaluationのバージョンが自動で上がります。 そのため、LLMの種類やプロンプトを変更した際、変更があったことが簡単に分かるようになっています。

このあたりは、実験管理で有名なW&Bらしい機能だと感じました。
次回のご案内
以上、今回は「W&B Weave」をキャッチアップしました。
次回は「AIエージェントキャッチアップ #60 - Microsoft Agent Framework」ということで、Semantic KernelやAutoGenからアイデアをまとめ拡張された「Microsoft Agent Framework」がテーマです!
generative-agents.connpass.com
ご興味・お時間ある方はぜひご参加ください!
また、その次の回以降のテーマも募集しているので、気になるエージェントのOSSなどあれば教えてください!