클래스 기반 서명

클래스 기반 서명 (Class-based Signatures)

문자열 서명도 같은 구조를 표현하지만, 클래스 기반 서명은 둔 뉘앙스를 더할 수 있는 손잡이를 몇 개 더 줘요. 우리가 쓰던 하이쿠 작성기 문자열 서명을 클래스 기반 서명으로 다시 써 볼게요.

class HaikuBot(dspy.Signature):
    """
    Write a classical haiku given the provided inputs.
    """
    location: str = dspy.InputField(desc="The setting of the poem")
    mood: str = dspy.InputField()
    haiku: str = dspy.OutputField()

필드는 똑같아요. location, mood, 출력 haiku가 문자열로 타입이 지정되어 있고요. 다만 이제는 각 필드에 설명(description)을 붙일 수 있어요. 필드 설명은 필드 이름에만 담기 어려운 뉘앙스를 추가하게 해줘요.

클래스 기반 서명은 docstring도 쓸 수 있어요. 클래스 시작 부분의 문자열이 바로 그것인데, DSPy가 프롬프트를 준비할 때 작업 지시문(task instructions)으로 사용해요.

클래스 기반 서명도 문자열 서명처럼 모듈에 넘겨요.

haiku_bot = dspy.Predict(HaikuBot)
result = haiku_bot(location="a quiet library", mood="mysterious")
print(result.haiku)

이 호출은 LM에게 비슷한 지시를 렌더링·전송하되, 두 가지가 달라요. docstring과 각 필드 설명이 시스템 지시를 만들 때 사용돼요. 대략 이런 형태예요.

Your input fields are:
1. `location` (str): The setting of the poem
2. `mood` (str):
Your output fields are:
1. `haiku` (str):
All interactions will be structured in the following way, with the appropriate values filled in.

[[ ## location ## ]]
{location}

[[ ## mood ## ]]
{mood}

[[ ## haiku ## ]]
{haiku}

[[ ## completed ## ]]
In adhering to this structure, your objective is: 
    Write a classical haiku given the provided inputs.

서명 docstring과 필드 설명은 선택 사항이지만, 필드 이름만으로는 작업 맥락이 부족할 때 유용한 손잡이가 돼요. 다만 서명이 이미 말하는 걸 되풀이하거나, 지시형 튜토리얼을 쓰려는 유혹은 참으세요. 광범위한 규칙·주의사항·가이드는 옵티마이저 몫이에요.

한 가지 주의: 필드 설명은 옵타마이저가 건드리지 않아요. 그래서 이름 짓기에 신경 써야 해요. 잘못 고른 필드 이름은 옵티마이저가 고쳐주지 못해요.

더 풍부한 타입으로 서명 필드 다듬기

때로는 평범한 str이 너무 느슨해요. 값이 작은 고정 집합에서 와야 한다면, LM(그리고 호출자)이 그 밖으로 벗어나지 못하도록 꽉 묶어 두고 싶을 거예요. 문자열 하나가 아니라, 정해진 문자열 중 하나라는 것을 분명히 하고 싶다는 얘기예요.

파이썬 표준 라이브러리의 typing을 쓰면 더 풍부한 타입을 붙일 수 있어요.

seasonLiteral["spring", "summer", "autumn", "winter"]로 타입을 붙이면 정확히 그게 돼요. DSPy는 이제 호출 시점과 LM 응답을 파싱할 때 모두 이 네 값만 허용해요.

from typing import Literal

Season = Literal[
    "spring", "summer", "autumn", "winter",
]

class HaikuBot(dspy.Signature):
    """
    Write a classical haiku given the provided inputs.
    """
    location: str = dspy.InputField(desc="The setting of the poem")
    season: Season = dspy.InputField()
    haiku: str = dspy.OutputField()

이렇게 하면 season에는 그 네 계절 값만 들어올 수 있어요. 필드 이름이 아니라 타입 어노테이션으로 허용 범위를 정한 겁니다. LM이 엉뚱한 값을 내면 DSPy가 파싱 단계에서 걸러내요.

더 알아보기 (Learn more)