입력, 출력, 메타데이터와 애플리케이션을 통해 흐르는 데이터를 추적하는 것은 시스템 성능을 이해하는 데 매우 중요합니다. 하지만 시간에 따라 애플리케이션 버전을 관리하는 것 역시 코드나 애플리케이션 파라미터의 변경이 출력에 어떤 영향을 미치는지 이해하는 데 중요합니다. Weave의 Model 클래스는 이러한 변경 사항을 Weave에서 추적하는 데 사용됩니다.
이 튜토리얼에서 배우게 될 내용은 다음과 같습니다:
- Weave
Model을 사용해 애플리케이션과 그 파라미터를 추적하고 버전 관리하는 방법
- 이미 로그된 Weave
Model을 내보내고, 수정하고, 재사용하는 방법
weave.Model 클래스는 현재 Python에서만 지원됩니다.
Weave Model을 사용하면 모델 제공업체 ID, 프롬프트, temperature 등과 같은 파라미터가 변경될 때마다 저장 및 버전 관리됩니다.
Weave에서 Model을 생성하려면 다음이 필요합니다:
weave.Model을 상속하는 클래스
- 모든 클래스 필드에 대한 타입 정의
@weave.op() 데코레이터가 달린 타입이 지정된 invoke 함수
클래스 필드나 모델을 정의하는 코드를 변경하면 이 변경 내용이 로깅되고 버전이 업데이트됩니다. 이렇게 하면 앱의 서로 다른 버전 간에 생성 결과를 비교할 수 있습니다.
아래 예제에서는 모델 이름, temperature, system prompt가 추적 및 버전 관리됩니다:
import json
from openai import OpenAI
import weave
@weave.op()
def extract_dinos(wmodel: weave.Model, sentence: str) -> dict:
response = wmodel.client.chat.completions.create(
model=wmodel.model_name,
temperature=wmodel.temperature,
messages=[
{
"role": "system",
"content": wmodel.system_prompt
},
{
"role": "user",
"content": sentence
}
],
response_format={ "type": "json_object" }
)
return response.choices[0].message.content
# weave.Model을 상속한 하위 클래스
class ExtractDinos(weave.Model):
client: OpenAI = None
model_name: str
temperature: float
system_prompt: str
# 함수 이름은 반드시 `invoke` 또는 `predict`로 지정하세요
@weave.op()
def invoke(self, sentence: str) -> dict:
dino_data = extract_dinos(self, sentence)
return json.loads(dino_data)
이 기능은 아직 TypeScript에서 사용할 수 없습니다. 업데이트를 기다려 주세요!
이제 invoke를 사용해 모델을 인스턴스화하고 호출할 수 있습니다:
weave.init('jurassic-park')
client = OpenAI()
system_prompt = """Extract any dinosaur `name`, their `common_name`, \
names and whether its `diet` is a herbivore or carnivore, in JSON format."""
dinos = ExtractDinos(
client=client,
model_name='gpt-4o',
temperature=0.4,
system_prompt=system_prompt
)
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 = dinos.invoke(sentence)
print(result)
이 기능은 아직 TypeScript에서 사용할 수 없습니다. 업데이트를 기다려 주세요!
이제 .invoke를 호출한 후 Weave의 trace에서 weave.op()으로 데코레이트된 모델 함수의 코드뿐만 아니라 모델 파라미터까지 함께 추적되는 것을 확인할 수 있습니다. 이 예시에서 모델에는 “v21”처럼 버전이 매겨지며, 모델을 클릭하면 해당 버전의 모델을 사용한 모든 호출을 확인할 수 있습니다.
weave.Model 사용 시 참고 사항:
- 원한다면 Weave
Model에서 함수 이름을 invoke 대신 predict로 사용할 수 있습니다.
- 다른 클래스 메서드를 weave에서 추적하려면
weave.op()으로 감싸야 합니다.
- 밑줄로 시작하는 파라미터는 weave에서 무시되며 로깅되지 않습니다.
로그된 weave.Model 내보내기 및 재사용
Weave는 호출된 Models를 저장하고 버전을 관리하므로, 이러한 모델을 내보내고 재사용할 수 있습니다.
Model ref 가져오기
Weave UI에서 특정 버전에 대한 Model ref를 가져올 수 있습니다.
Model 사용하기
Model 객체의 URI를 얻으면, 이를 내보내고 재사용할 수 있습니다. 내보낸 모델은 이미 초기화되어 있어 바로 사용할 수 있습니다:
# 내보낸 weave 모델은 이미 초기화되어 있으며 바로 호출할 수 있습니다
new_dinos = weave.ref("weave://morgan/jurassic-park/object/ExtractDinos:ey4udBU2MU23heQFJenkVxLBX4bmDsFk7vsGcOWPjY4").get()
# 클라이언트를 다시 openai 클라이언트로 설정합니다
new_dinos.client = client
new_sentence = """I also saw an Ankylosaurus grazing on giant ferns"""
new_result = new_dinos.invoke(new_sentence)
print(new_result)
이 기능은 아직 TypeScript에서는 사용할 수 없습니다. 계속 지켜봐 주세요!
여기에서 이름이 Model version (v21)인 것이 새 입력과 함께 사용된 것을 확인할 수 있습니다: