입력, 출력, 메타데이터와 앱을 통해 흐르는 데이터를 추적하는 것은 시스템 성능을 이해하는 데 매우 중요합니다. 하지만 시간에 따라 앱을 버전 관리하는 것 또한 코드나 애플리케이션 파라미터 변경이 출력에 어떤 영향을 주는지 이해하는 데 핵심적입니다. 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에서 트레이스를 보면, weave.op()으로 데코레이션된 모델 함수의 코드뿐만 아니라 모델 파라미터도 함께 추적되는 것을 확인할 수 있습니다. 또한 이 예시에서처럼 모델은 “v21”과 같이 버전이 부여되며, 모델을 클릭하면 해당 버전의 모델을 사용한 모든 호출을 확인할 수 있습니다.
weave.Model 사용 시 참고 사항:
- 원한다면 Weave
Model에서 함수 이름으로 invoke 대신 predict를 사용할 수 있습니다.
- 다른 클래스 메서드도 Weave에서 추적되도록 하려면
weave.op()으로 래핑해야 합니다.
- 밑줄(_)로 시작하는 파라미터는 Weave에서 무시되며 로그로 남지 않습니다.
로그된 weave.Model 내보내기 및 재사용
Weave는 호출된 Model을 저장하고 버전 관리하므로, 이러한 모델을 내보내 재사용할 수 있습니다.
Model ref 가져오기
Weave UI에서 특정 버전에 대한 Model ref를 가져올 수 있습니다.
Model 사용하기
Model 객체의 URI를 얻은 후에는 이를 내보내 재사용할 수 있습니다. 내보낸 모델은 이미 초기화되어 있으며 바로 사용할 수 있습니다:
# the exported weave model is already initialised and ready to be called
new_dinos = weave.ref("weave://morgan/jurassic-park/object/ExtractDinos:ey4udBU2MU23heQFJenkVxLBX4bmDsFk7vsGcOWPjY4").get()
# set the client to the openai client again
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인 버전(v21)이 새로운 입력에 사용된 것을 확인할 수 있습니다: