W&B Weave는 깊게 중첩된 패턴을 포함해 동기 및 비동기 제너레이터 함수를 모두 트레이싱할 수 있습니다.
제너레이터는 값을 지연 생성하므로, Weave는 제너레이터가 완전히 소비된 경우에만 출력값을 로그합니다(예: 목록으로 변환할 때).
Weave가 트레이스에서 출력값을 캡처하도록 하려면 제너레이터를 완전히 소비하세요(예: list() 사용).
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에 대한 트레이싱을 트리거합니다
이 기능은 아직 TypeScript SDK에서 사용할 수 없습니다.
다음 스크린샷은 앞선 코드에서 선택한 트레이스가 표시된 Traces 페이지를 보여줍니다. 가운데 패널에는 선택한 트레이스의 트레이스 트리가 표시됩니다. 트레이스 트리에는 deeply_nested_generator, nested_generator, inner Ops가 계층 구조로 표시됩니다.
Weave는 제너레이터를 완전히 소비한 후에만 제너레이터 출력을 캡처합니다. 제너레이터는 반복 순회하여 소비하세요(예: list(), for 루프 또는 모두 소진될 때까지 next() 사용). async for 또는 이에 준하는 소비 방식을 사용할 때는 비동기 제너레이터에도 동일하게 적용됩니다.
함수와 메서드에 @weave.op를 데코레이터로 적용하는 방법에 대한 자세한 내용은 call 생성을 참조하세요.