메인 콘텐츠로 건너뛰기
프롬프트를 생성, 평가, 개선하는 일은 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)를 확인할 수 있습니다.
프롬프트 비교 스크린샷