메인 콘텐츠로 건너뛰기
LLM 기반 애플리케이션에는 여러 번의 LLM 호출과, 모니터링이 중요한 추가 데이터 처리 및 검증 로직이 포함되는 경우가 많습니다. 많은 애플리케이션에서 흔히 볼 수 있는 깊게 중첩된 호출 구조에서도, 추적하려는 각 함수에 weave.op()만 추가하면 Weave가 중첩 함수 전반에 걸쳐 부모-자식 관계를 추적합니다. 다음 코드는 퀵스타트 예시를 기반으로, LLM에서 반환된 항목 수를 세고 이를 상위 수준 함수로 감싸는 로직을 추가합니다. 또한 이 예시는 weave.op()을 사용해 각 함수와 그 호출 순서, 부모-자식 관계를 모두 트레이스합니다:
import weave
import json
from openai import OpenAI

client = OpenAI()

@weave.op()
def extract_dinos(sentence: str) -> dict:
    response = client.chat.completions.create(
        model="gpt-4o",
        messages=[
            {
                "role": "system",
                "content": """Extract any dinosaur `name`, their `common_name`, \
names and whether its `diet` is a herbivore or carnivore, in JSON format."""
            },
            {
                "role": "user",
                "content": sentence
            }
            ],
            response_format={ "type": "json_object" }
        )
    return response.choices[0].message.content

@weave.op()
def count_dinos(dino_data: dict) -> int:
    # 반환된 리스트의 항목 수를 셉니다
    k = list(dino_data.keys())[0]
    return len(dino_data[k])

@weave.op()
def dino_tracker(sentence: str) -> dict:
    # LLM을 사용하여 공룡을 추출합니다
    dino_data = extract_dinos(sentence)

    # 반환된 공룡의 수를 셉니다
    dino_data = json.loads(dino_data)
    n_dinos = count_dinos(dino_data)
    return {"n_dinosaurs": n_dinos, "dinosaurs": dino_data}

weave.init('jurassic-park')

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 = dino_tracker(sentence)
print(result)
중첩 함수위 코드를 실행하면 Traces 페이지에서 두 개의 중첩 함수(extract_dinoscount_dinos)의 입력과 출력, 그리고 자동으로 기록된 OpenAI 트레이스를 확인할 수 있습니다.선택된 Call의 상세 패널과 가운데 트레이스 트리 패널이 표시된 중첩 Weave Traces 페이지

메타데이터 추적

weave.attributes 컨텍스트 매니저를 사용하고, 호출 시점에 추적할 메타데이터가 담긴 사전을 전달해서 메타데이터를 추적할 수 있습니다. 위의 예제를 이어서 살펴보겠습니다:
import weave

weave.init('jurassic-park')

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."""

# track metadata alongside our previously defined function
with weave.attributes({'user_id': 'lukas', 'env': 'production'}):
    result = dino_tracker(sentence)
실행 시점에 사용자 ID, 코드가 실행되는 환경 상태(개발, 스테이징, 프로덕션 등)와 같은 메타데이터를 추적할 것을 권장합니다.시스템 프롬프트와 같은 시스템 설정을 추적하려면 Weave Models를 사용할 것을 권장합니다.
attributes 사용에 관한 자세한 내용은 Define and log attributes를 참조하세요.

다음 단계

  • App Versioning 튜토리얼을 따라 임시 프롬프트, 모델, 애플리케이션 변경 사항을 캡처하고 버전 관리하며 체계적으로 정리하세요.