メインコンテンツへスキップ
入力、出力、メタデータのトラッキングや、アプリケーション内を流れるデータの把握は、システムのパフォーマンスを理解するうえで不可欠です。時間の経過に伴ってアプリケーションをバージョン管理することも同様に重要です。これにより、コードやパラメーターの変更が出力にどのような影響を与えるかを確認できます。Weave の Model クラスは、こうした変更をトラッキングします。 このチュートリアルは、LLM アプリケーションの異なるバージョン間で結果を比較し、再現したい開発者向けです。最後には、アプリケーションのパラメーターとコードを保持する、バージョン管理された Weave Model を作成できるようになります。また、以前のバージョンを取得して再利用する方法も学べます。 このチュートリアルでは、次の内容を学びます。
  • Weave Model を使用して、アプリケーションとそのパラメーターをトラッキングし、バージョン管理する方法。
  • すでにログした Weave Model をエクスポート、変更、再利用する方法。

weave.Model の使用

weave.Model クラスは Python でのみサポートされています。
Weave モデル を使用すると、モデルベンダー ID、プロンプト、temperature などのパラメーターが、変更時に保存されてバージョン管理されます。 Weave で Model を作成するには、次のものが必要です。
  • weave.Model を継承するクラス
  • すべてのクラスフィールドの型定義
  • @weave.op() デコレーターが付いた、型付きの invoke 関数
クラスフィールドやモデルを定義するコードを変更すると、それらの変更はログされ、バージョンが更新されます。これにより、アプリの異なるバージョン間で生成結果を比較できます。 以下の例では、モデル名、temperature、system prompt がトラッキングされ、バージョン管理されます
import json
from openai import OpenAI

import weave

@weave.op()
def extract_dinos(wmodel: weave.Model, sentence: str) -> dict:
    response = wmodel.client.chat.completions.create(
        model=wmodel.model_name,
        temperature=wmodel.temperature,
        messages=[
            {
                "role": "system",
                "content": wmodel.system_prompt
            },
            {
                "role": "user",
                "content": sentence
            }
            ],
            response_format={ "type": "json_object" }
        )
    return response.choices[0].message.content

# weave.Model を使ったサブクラス
class ExtractDinos(weave.Model):
    client: OpenAI = None
    model_name: str
    temperature: float
    system_prompt: str

    # 関数名は `invoke` または `predict` にしてください
    @weave.op()
    def invoke(self, sentence: str) -> dict:
        dino_data  = extract_dinos(self, sentence)
        return json.loads(dino_data)
これで、invoke を使ってモデルをインスタンス化し、呼び出せます。
weave.init('jurassic-park')
client = OpenAI()

system_prompt = """Extract any dinosaur `name`, their `common_name`, \
names and whether its `diet` is a herbivore or carnivore, in JSON format."""

dinos = ExtractDinos(
    client=client,
    model_name='gpt-4o',
    temperature=0.4,
    system_prompt=system_prompt
)

sentence = """I watched as a Tyrannosaurus rex (T. rex) chased after a Triceratops (Trike), \
both carnivore and herbivore locked in an ancient dance. Meanwhile, a gentle giant \
Brachiosaurus (Brachi) calmly munched on treetops, blissfully unaware of the chaos below."""

result = dinos.invoke(sentence)
print(result)
.invoke() を呼び出した後、Weave のトレースでは、weave.op() でデコレートされたモデル関数のコードとあわせて、モデルパラメーターもトラッキングされます。モデル自体もバージョン管理されており (この場合は v21) 、モデルをクリックすると、そのバージョンを使用した すべての Call を確認できます。 weave model の再利用 weave.Model の使用に関する注意:
  • 必要に応じて、Weave Model 内の関数名には invoke の代わりに predict を使用できます。
  • 他のクラスメソッドを Weave でトラッキングするには、weave.op() でラップします。
  • アンダースコアで始まるパラメーターは Weave によって無視され、ログされません。

ログした weave.Model をエクスポートして再利用する

これで、モデルは Weave でバージョン管理されるため、コード内で再定義しなくても、以前の任意のバージョンを取得して再実行できます。これは、過去の結果を再現したり、特定のモデル バージョンを他のユーザーと共有したりする際に役立ちます。 Weave では、呼び出した Models が保存され、バージョン管理されるため、それらをエクスポートして再利用できます。

モデル ref を取得する

Weave UI では、特定のバージョンの モデル ref を取得できます。

モデル を使用する

モデル object の URI を取得したら、それをエクスポートして再利用できます。なお、エクスポートされたモデルはすでに初期化されており、すぐに使用できます。
# エクスポートした weave model はすでに初期化されており、すぐに呼び出せます
new_dinos = weave.ref("weave://morgan/jurassic-park/object/ExtractDinos:ey4udBU2MU23heQFJenkVxLBX4bmDsFk7vsGcOWPjY4").get()

# client を再び openai client に設定します
new_dinos.client = client

new_sentence = """I also saw an Ankylosaurus grazing on giant ferns"""
new_result = new_dinos.invoke(new_sentence)
print(new_result)
ここで、新しい入力で同じモデル バージョン (v21) が使用されていることを確認できます。 weave モデルの再利用 これで、アプリケーションの異なるバージョン間で反復、取得、再利用できる、バージョン管理された Weave Model ができました。

次のステップ