메인 콘텐츠로 건너뛰기
실행 중인 코드를 Weave에서 상세한 trace로 보려면 Call을 생성해야 합니다. 이 작업은 크게 세 가지 방법으로 할 수 있습니다:

1. LLM 라이브러리 호출 자동 추적

Weave는 openai, anthropic, cohere, mistral, LangChain과 같은 다양한 인테그레이션 및 프레임워크와 자동으로 연동됩니다. LLM 또는 프레임워크 라이브러리를 임포트하고 Weave 프로젝트를 초기화하기만 하면, 추가 코드 변경 없이도 Weave가 LLM 또는 플랫폼으로의 모든 호출을 자동으로 추적하여 프로젝트에 기록합니다. 지원되는 라이브러리 인테그레이션의 전체 목록은 Integrations overview를 참조하세요.
import weave

from openai import OpenAI
client = OpenAI()

# Weave Tracing 초기화
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에서 각각 별도의 루트 Call로 표시됩니다. 동일한 상위 Op 아래에 올바르게 중첩되도록 하려면 ThreadPoolExecutor를 사용하세요.
아래 코드 예시는 ThreadPoolExecutor의 사용 예를 보여줍니다. 첫 번째 함수 funcx를 입력으로 받아 x+1을 반환하는 단순한 Op입니다. 두 번째 함수 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에서는 하나의 상위 Call 아래에 다섯 개의 하위 Call이 중첩된 형태로 표시되므로, 증가 연산이 병렬로 실행되더라도 완전히 계층적인 trace를 얻을 수 있습니다. Trace UI에서 outer에 대한 단일 상위 Call과, 그 아래 중첩된 다섯 개의 하위 Call을 보여주는 화면.

3. 수동 Call 추적

API를 직접 사용해 Call을 수동으로 생성할 수도 있습니다.
import weave

# Weave Tracing 초기화
client = weave.init('intro-example')

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

    # ... 함수 코드 ...

    # Call 종료
    client.finish_call(call, output="Hello, World!")

    # 함수 호출
    print(my_function("World"))