메인 콘텐츠로 건너뛰기
프롬프트를 생성하고, 평가하고, 개선하는 작업은 AI 엔지니어의 핵심 활동입니다. 프롬프트의 작은 변경도 애플리케이션 동작에 큰 영향을 줄 수 있습니다. W&B Weave를 사용하면 프롬프트를 생성하고, 저장 및 조회하며, 시간이 지남에 따라 발전시킬 수 있습니다. Weave는 프롬프트를 어떻게 구성해야 하는지에 대해 특정한 방식을 강요하지 않습니다. 요구 사항이 단순하다면, 내장된 weave.StringPrompt 또는 weave.MessagesPrompt 클래스를 사용할 수 있습니다. 요구 사항이 더 복잡하다면, 이들 클래스나 기본 클래스인 weave.Prompt를 상속받아 format 메서드를 오버라이드할 수 있습니다. 이러한 객체 중 하나를 weave.publish로 게시하면, Weave 프로젝트의 Prompts 페이지에 표시됩니다.

StringPrompt

StringPrompt는 시스템 메시지, 사용자 쿼리, 또는 LLM에 사용하는 단독 텍스트 입력 등 단일 문자열 프롬프트를 로깅합니다. 여러 메시지로 구성된 대화 형태까지는 필요하지 않은 개별 프롬프트 문자열을 관리할 때 StringPrompt 사용을 권장합니다.
import weave
weave.init('intro-example')

system_prompt = weave.StringPrompt("You speak like a pirate")
weave.publish(system_prompt, name="pirate_prompt")

from openai import OpenAI
client = OpenAI()

response = client.chat.completions.create(
  model="gpt-4o",
  messages=[
    {
      "role": "system",
      "content": system_prompt.format()
    },
    {
      "role": "user",
      "content": "Explain general relativity in one paragraph."
    }
  ],
)

MessagesPrompt

MessagesPrompt를 사용하면 멀티턴 대화와 채팅 기반 프롬프트를 로깅할 수 있습니다. 이 객체는 전체 대화 흐름을 나타내는 메시지 객체 배열을 저장하며, 각 메시지는 “system”, “user”, “assistant” 같은 role을 가집니다. 여러 메시지에 걸쳐 컨텍스트를 유지해야 하거나, 특정 대화 패턴을 정의하거나, 재사용 가능한 대화 템플릿을 만들어야 하는 채팅 기반 LLM에는 이 방식을 사용할 것을 권장합니다.
import weave
weave.init('intro-example')

prompt = weave.MessagesPrompt([
    {
        "role": "system",
        "content": "You are a stegosaurus, but don't be too obvious about it."
    },
    {
        "role": "user",
        "content": "What's good to eat around here?"
    }
])
weave.publish(prompt, name="dino_prompt")

from openai import OpenAI
client = OpenAI()

response = client.chat.completions.create(
  model="gpt-4o",
  messages=prompt.format(),
)

프롬프트 매개변수화

StringPromptMessagesPrompt 모두 매개변수화를 통해 동적인 내용을 지원합니다. 이를 사용하면 {variable} 구문을 사용하는 플레이스홀더가 포함된 유연하고 재사용 가능한 프롬프트 템플릿을 만들 수 있고, 런타임에 서로 다른 값으로 채워 넣을 수 있습니다. 이는 프롬프트가 일관된 구조를 유지하면서도 다양한 입력, 사용자 데이터, 컨텍스트에 맞게 변화해야 하는 확장 가능한 애플리케이션을 구축할 때 유용합니다. format() 메서드는 이러한 플레이스홀더를 실제 값으로 치환하기 위한 키-값 쌍을 인수로 받습니다.
import weave
weave.init('intro-example')

prompt = weave.StringPrompt("Solve the equation {equation}")
weave.publish(prompt, name="calculator_prompt")

from openai import OpenAI
client = OpenAI()

response = client.chat.completions.create(
  model="gpt-4o",
  messages=[
    {
      "role": "user",
      "content": prompt.format(equation="1 + 1 = ?")
    }
  ],
)
이는 MessagesPrompt에도 동일하게 적용됩니다.
import weave
weave.init('intro-example')

prompt = weave.MessagesPrompt([
{
    "role": "system",
    "content": "You will be provided with a description of a scene and your task is to provide a single word that best describes an associated emotion."
},
{
    "role": "user",
    "content": "{scene}"
}
])
weave.publish(prompt, name="emotion_prompt")

from openai import OpenAI
client = OpenAI()

response = client.chat.completions.create(
  model="gpt-4o",
  messages=prompt.format(scene="A dog is lying on a dock next to a fisherman."),
)

프롬프트 버전 보기 및 비교

Weave는 프롬프트의 모든 버전을 자동으로 추적하여, 프롬프트가 어떻게 발전해 왔는지에 대한 완전한 이력을 남깁니다. 이 버전 관리 시스템은 프롬프트 엔지니어링 워크플로에서 매우 중요하며, 안전하게 실험하고, 어떤 변경이 성능을 개선하거나 저하시켰는지 추적하며, 필요할 경우 이전 버전으로 쉽게 롤백할 수 있도록 해 줍니다. 동일한 이름으로 프롬프트를 발행하되 내용이 달라질 때마다, Weave는 이전 버전은 모두 보존한 채 새로운 버전을 생성합니다. UI에서 프롬프트 버전을 보려면 다음을 수행합니다:
  1. UI에서 프로젝트를 연 다음 왼쪽 메뉴에서 Assets 버튼을 클릭합니다. Assets 페이지가 열립니다.
  2. Assets 페이지에서 Prompts를 클릭합니다. 프로젝트의 프롬프트 목록이 표시되는 Prompts 페이지가 열립니다.
  3. Versions 열에서, 확인하려는 프롬프트의 (x) Versions를 클릭합니다. 그러면 해당 프롬프트의 버전 목록이 열립니다.
프롬프트 객체 보기 스크린샷
  1. (선택 사항) 목록에 있는 프롬프트 옆의 체크박스를 선택한 후 Compare 버튼을 클릭하여 프롬프트 버전들을 비교할 수 있습니다. 이를 통해 프롬프트 간 차이(diff)를 확인할 수 있습니다.
프롬프트 비교 스크린샷