メインコンテンツへスキップ
実行中のコードを Weave で詳細なトレースとして可視化するには、Calls を作成します。これを行う方法は大きく 3 つあります。

1. LLM ライブラリ呼び出しの自動トラッキング

Weave は、openaianthropiccoheremistralLangChain などの一般的なインテグレーションやフレームワークと自動的に連携します。 LLM またはフレームワークのライブラリをインポートして Weave プロジェクトを初期化すると、追加のコード変更なしで、LLM やプラットフォームへのすべての呼び出しが自動的にプロジェクトへトレースされます。 サポートされているライブラリインテグレーションの一覧については、Integrations overview を参照してください。
import weave

from openai import OpenAI
client = OpenAI()

# Weave トレーシングを初期化
weave.init('intro-example')

response = client.chat.completions.create(
    model="gpt-4",
    messages=[
        {
            "role": "user",
            "content": "How are you?"
        }
    ],
    temperature=0.8,
    max_tokens=64,
    top_p=1,
)
自動動作をさらに細かく制御したい場合は、自動 LLM 呼び出しトラッキングの設定 を参照してください。

2. カスタム関数のトラッキング

多くの場合、LLM アプリケーションには、トラッキングしたい追加のロジック (前処理・後処理、プロンプトなど) が含まれます。
Weave では、@weave.op デコレーターを使って、これらの呼び出しを手動でトラッキングできます。例えば:
import weave

# Weave Tracing を初期化
weave.init('intro-example')

# 関数をデコレート
@weave.op
def my_function(name: str):
    return f"Hello, {name}!"

# 関数を呼び出す -- Weave が自動的に入力と出力をトラッキング
print(my_function("World"))
クラスのメソッド をトラッキングすることもできます。

クラスおよびオブジェクト メソッドのトラッキング

クラスおよびオブジェクト メソッドもトラッキングできます。クラス内の任意のメソッドを weave.op でデコレートすることで、そのメソッドをトラッキングできます。
import weave

# Weave Tracing を初期化
weave.init("intro-example")

class MyClass:
    # メソッドをデコレート
    @weave.op
    def my_method(self, name: str):
        return f"Hello, {name}!"

instance = MyClass()

# メソッドを呼び出すと、Weave が自動的に入力と出力をトラッキングする
print(instance.my_method("World"))

並列 (マルチスレッド) 関数呼び出しのトレース

デフォルトでは、並列な Call はすべて Weave 上では個別の root Call として表示されます。同じ親 Op の下に正しくネストさせるには、ThreadPoolExecutor を使用します。
次のコードサンプルは、ThreadPoolExecutor の使用例を示しています。 最初の関数 func は、x を受け取って x+1 を返すシンプルな Op です。2 つ目の関数 outer は、入力リストを受け取る別の Op です。 outer の中で ThreadPoolExecutorexc.map(func, inputs) を使用することで、各 func 呼び出しは同じ親の trace コンテキストを保持したまま実行されます。
import weave

@weave.op
def func(x):
    return x+1

@weave.op
def outer(inputs):
    with weave.ThreadPoolExecutor() as exc:
        exc.map(func, inputs)

# Weave プロジェクト名を更新する
client = weave.init('my-weave-project')
outer([1,2,3,4,5])
Weave UI では、これにより 1 つの親 Call の下に 5 つの子 Call がネストされた形で表示されるため、インクリメントが並列で実行されていても、完全に階層的な trace を得ることができます。 Trace UI。outer の単一の親 Call の下に 5 つの子 Call がネストされている様子。

3. Manual Call tracking

API を直接使用して Call を手動で作成することもできます。
import weave

# Initialize Weave Tracing
client = weave.init('intro-example')

def my_function(name: str):
    # Start a Call
    call = client.create_call(op="my_function", inputs={"name": name})

    # ... your function code ...

    # End a Call
    client.finish_call(call, output="Hello, World!")

    # Call your function
    print(my_function("World"))