> ## Documentation Index
> Fetch the complete documentation index at: https://docs.coreweave.com/llms.txt
> Use this file to discover all available pages before exploring further.

# ジェネレーター関数をトレースする

> W&B Weave のトレースで同期および非同期のジェネレーター関数をトラッキングします

W\&B Weave は、深くネストされたパターンを含め、同期および非同期のジェネレーター関数のトレースをサポートしています。このページでは、ジェネレーター関数を `@weave.op` でデコレートし、その入力、yield された出力、ネストされた Call の階層全体を Weave が取得できるようにする方法を説明します。ストリーミング処理や遅延評価を行うコードパスがあり、その出力を他のトレースと一緒に Weights & Biases UI で確認したい場合に活用してください。

<Warning>
  ジェネレーターは値を遅延的に yield するため、Weave が出力をログするのは、ジェネレーターを完全に消費したとき (たとえば、リストに変換したとき) だけです。
  トレースに出力が確実に記録されるよう、ジェネレーターを完全に消費してください (たとえば、`list()` を使用します)。
</Warning>

<Tabs>
  <Tab title="Python">
    ```python theme={"system"}
    from typing import Generator
    import weave

    weave.init("my-project")

    # この関数は同期ジェネレーターを使用します。
    # Weave は Call とその入力 (`x`) をトレースしますが、
    # 出力値はジェネレーターが消費された時点 (たとえば `list()` を使用した場合) で初めて取得されます。
    @weave.op
    def basic_gen(x: int) -> Generator[int, None, None]:
        yield from range(x)

    # ジェネレーターのパイプライン内で使用される通常の同期関数です。
    # この関数の Call も Weave によって個別にトレースされます。
    @weave.op
    def inner(x: int) -> int:
        return x + 1

    # 別のトレース対象関数 (`inner`) を呼び出す同期ジェネレーターです。
    # yield される各値は、`inner` に対する個別のトレース対象 Call から得られます。
    @weave.op
    def nested_generator(x: int) -> Generator[int, None, None]:
        for i in range(x):
            yield inner(i)

    # 上記のジェネレーターを組み合わせたジェネレーターです。
    # これをトレースすると、次のような階層的な Call ツリーが生成されます。
    # - `deeply_nested_generator` (親)
    #   - `nested_generator` (子)
    #     - `inner` (孫)
    @weave.op
    def deeply_nested_generator(x: int) -> Generator[int, None, None]:
        for i in range(x):
            for j in nested_generator(i):
                yield j

    # Weave が出力を取得するには、ジェネレーターを*消費*する必要があります。
    # これは同期ジェネレーターと非同期ジェネレーターのどちらにも当てはまります。
    res = deeply_nested_generator(4)
    list(res)  # ネストされたすべての Call と yield のトレースをトリガーします
    ```
  </Tab>

  <Tab title="TypeScript">
    ```plaintext theme={"system"}
    This feature is not available in the TypeScript SDK yet.
    ```
  </Tab>
</Tabs>

次のスクリーンショットは、前述のコードのトレースを選択した状態の **Traces** ページです。中央のパネルには、選択したトレースのトレース ツリーが表示されます。トレース ツリーの階層には、`deeply_nested_generator`、`nested_generator`、`inner` の各 Op が表示されています。

<img src="https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/weave/_media/generators.png?fit=max&auto=format&n=3Dv_sw2eg8feUJlx&q=85&s=58e76a5d5bdd84e1efa37433e780180f" alt="深くネストされた Op を示すトレース ツリーが選択された Weave トレース ページ" width="1966" height="1134" data-path="products/wandb/weave/_media/generators.png" />

<h2 id="consume-generators">
  ジェネレーターを消費する
</h2>

このセクションでは、Weave でジェネレーターの出力を記録するにはジェネレーターを消費する必要がある理由と、有効な消費パターンについて説明します。

Weave がジェネレーターの出力を取得するのは、ジェネレーターを最後まで消費した後に限られます。ジェネレーターは反復処理によって消費します (例：`list()`、`for` ループ、または要素がなくなるまで `next()` を呼び出す) 。非同期ジェネレーターの場合も同様に、`async for` などの方法で消費する必要があります。

`@weave.op` で関数やメソッドをデコレートする方法の詳細については、[Call を作成する](/ja/products/wandb/weave/guides/tracking/create-call)を参照してください。

<h2 id="accumulate-yielded-values-into-a-single-trace">
  yield された値を 1 つのトレースに集約する
</h2>

yield された値の生のシーケンスではなく、結合した結果 (連結した string やリストなど) を Weave に記録させたい場合は、アキュムレーターを使用します。

`weave.op` の `accumulator` パラメーターを使用すると、ジェネレーター関数から yield された値をどのように結合するかをカスタマイズできます。たとえば、ストリーミングされたテキストトークンを 1 つの string に連結できます。アキュムレーターは 2 つの引数を取る関数です。Weave は yield された値ごとにこの関数を 1 回呼び出し、結果を段階的に構築します。

<Note>
  `accumulator` パラメーターは TypeScript では使用できません。
</Note>

次の例は、yield された各値をリストに追加するカスタムアキュムレーターです。ジェネレーターを最後まで消費すると、Weave はこのリストを Call の出力として記録します。

```python theme={"system"}
from typing import Generator
import weave

weave.init("your-team-name/your-project-name")

# Weave は yield のたびにこの関数を呼び出します。初回の呼び出しでは acc は None です。
# 最後に返した値が、トレースされる Op の出力になります。
def list_accumulator(acc, value):
    if acc is None:
        acc = []
    acc.append(value)
    return acc

# accumulator パラメーターを設定します
@weave.op(accumulator=list_accumulator)
def basic_gen_with_accumulator(x: int) -> Generator[int, None, None]:
    yield from range(x)

# 最後まで反復処理すると、すべての yield が実行され、accumulator がトレース対象の最終出力を生成できるようになります。
result = list(basic_gen_with_accumulator(3))
print(result)
```


## Related topics

- [エージェントをトレースする](/ja/products/wandb/weave/guides/tracking/trace-agents.md)
