프롬프트 생성

프롬프트 생성 (Prompt generation)

Playground의 Generate(생성) 버튼은 작업(task) 설명만으로 프롬프트, 함수, 스키마를 생성해 줘요. 이 가이드에서는 그것이 정확히 어떻게 동작하는지 하나씩 짚어볼게요.

출처: 문서

본문

개요

프롬프트와 스키마를 처음부터 만드는 건 시간이 꽤 걸리는 일이에요. 그래서 생성 기능을 쓰면 빠르게 시작할 수 있어요. Generate 버튼은 크게 두 가지 방식을 사용해요.

  1. Prompts: 모범 사례를 담은 메타 프롬프트(meta-prompt) 로 프롬프트를 생성하거나 개선해요.
  2. Schemas: 유효한 JSON과 함수 문법을 만들어내는 메타 스키마(meta-schema) 를 사용해요.

현재는 메타 프롬프트와 메타 스키마를 쓰지만, 앞으로 DSPy나 "Gradient Descent" 같은 더 발전된 기법을 통합할 수도 있어요.

Prompts

메타 프롬프트는 모델에게 작업 설명을 바탕으로 좋은 프롬프트를 만들거나, 기존 프롬프트를 개선하라고 지시하는 프롬프트예요. Playground의 메타 프롬프트는 프롬프트 엔지니어링 모범 사례와 실제 사용자 경험에서 얻은 교훈을 바탕으로 해요.

출력 유형(예: 오디오)에 따라 별도의 메타 프롬프트를 써서, 생성된 프롬프트가 기대하는 형식을 충족하게 해요.

메타 프롬프트

Text-out(텍스트 출력)

텍스트 메타 프롬프트는 작업 설명이나 기존 프롬프트를 받아, 그 작업을 효과적으로 완수하도록 언어 모델을 안내하는 상세한 system prompt를 만들어요. 가이드라인을 요약하면 이렇게 돼요:

  • 과업 이해: 주요 목표, 요구사항, 제약, 기대 출력을 파악해요.
  • 최소 변경: 기존 프롬프트가 주어지면 간단할 때만 개선하고, 복잡하면 원래 구조를 바꾸지 않으면서 명확성과 빠진 요소만 보강해요.
  • 결론보다 추론 먼저: 결론에 도달하기 전에 추론 단계를 먼저 하도록 유도해요. 예시에서 추론이 결론 뒤에 나온다면 순서를 뒤집도록 하고, 결론·분류·결과는 항상 마지막에 오게 해요.
  • 예시: 도움이 된다면 좋은 예시를 넣되, 복잡한 요소에는 [대괄호] 플레이스홀더를 써요.
  • 명확성과 간결성: 구체적이고 명확한 표현을 쓰고 불필요한 지시나 평범한 문장은 피해요.
  • 서식: 가독성을 위해 markdown 기능을 쓰고, 특별히 요청하지 않으면 코드 블록은 쓰지 않아요.
  • 사용자 내용 보존: 입력에 긴 가이드라인이나 예시가 있으면 그대로, 또는 최대한 가깝게 보존해요. 모호하면 하위 단계로 나눌 수 있어요.
  • 상수(Constants): 프롬프트 주입에 취약하지 않으므로 가이드·루브릭·예시 같은 상수는 프롬프트에 포함해요.
  • 출력 형식: 가장 적절한 출력 형식을 길이·문법(예: 짧은 문장, 문단, JSON)까지 구체적으로 명시해요. 잘 정의된 구조 데이터(분류·JSON)는 JSON 출력을 권장하고, JSON은 요청이 없으면 코드 블록으로 감싸지 않아요.

최종 프롬프트는 아래 구조를 따라야 하고, 추가 코멘트 없이 완성된 system prompt만 출력해요.

[작업을 설명하는 간결한 지시 - 프롬프트 첫 줄, 섹션 헤더 없음]

[필요에 따라 추가 세부사항]

[세부 단계를 위한 선택적 섹션(제목 또는 글머리 기호)]

# Steps [optional]
[작업을 완수하기 위한 단계별 상세 설명]

# Output Format
[출력을 어떻게 서식화할지 구체적으로 명시 - 길이, 구조(JSON, markdown 등)]

# Examples [optional]
[필요하면 플레이스홀더를 쓴 잘 정의된 예시 1-3개. 예시의 시작·끝, 입력·출력을 명확히 표시]

# Notes [optional]
[엣지 케이스, 세부사항, 중요한 고려사항]

이 메타 프롬프트를 코드로 쓰면 시스템 메시지에 넣고, 사용자 메시지로 작업·목표·현재 프롬프트를 전달해서 chat.completions를 호출해요.

from openai import OpenAI

client = OpenAI()

def generate_prompt(task_or_prompt: str):
    completion = client.chat.completions.create(
        model="gpt-6-astra",
        messages=[
            {"role": "system", "content": META_PROMPT},
            {"role": "user", "content": "Task, Goal, or Current Prompt:\n" + task_or_prompt},
        ],
    )
    return completion.choices[0].message.content

Audio-out(오디오 출력)

오디오용 메타 프롬프트는 실시간 음성 출력 언어 모델을 안내하는 점이 달라요. 핵심 차이는 이렇습니다.

  • 톤: 톤을 명시적으로 지정해요. 기본값은 감정적이고 친근하며, 사용자가 기다리지 않도록 빠르게 말하도록 해요.
  • 오디오 출력 제약: 모델이 오디오를 출력하므로 응답은 짧고 대화체여야 해요.
  • 예시: 예시는 모델의 짧고 대화적인 출력을 반영해야 해요. 기본적으로 문장을 아주 짧게(5~20단어) 유지하고, 문장을 나열하기보다 사용자와 주고받는 방식으로 나누는 게 좋아요. 예시는 한 번의 질문·응답이 아니라 최소 4번 주고받는 멀티턴이 되게 해요.

프롬프트 편집 (Prompt edits)

프롬프트를 편집할 때는 약간 수정된 메타 프롬프트를 사용해요. 직접적인 편집은 간단하지만, 개방적인 수정에서는 필요한 변경을 찾는 게 어려울 수 있어요. 그래서 응답 맨 앞에 추론(reasoning) 섹션을 두어, 기존 프롬프트의 명확성·chain-of-thought 순서·전체 구조·구체성을 평가해 어떤 변경이 필요한지 판단하게 해요. 이 추론 섹션이 개선 제안을 만들고, 최종 응답에서 분리돼요.

Schemas

Structured Outputs 스키마와 함수 스키마는 그 자체가 JSON 객체예요. 그래서 Structured Outputs를 활용해 스키마를 생성해요. 그러려면 원하는 출력에 대한 스키마를 정의해야 하는데, 이번에는 그 출력이 스키마 그 자체예요. 그래서 자기 자신을 기술하는 스키마인 메타 스키마(meta-schema) 를 사용해요. 함수 스키마의 parameters 필드도 스키마이므로, 같은 메타 스키마로 함수를 생성해요.

제약된 메타 스키마 정의하기

Structured Outputs는 strict=true와 strict=false 두 모드를 지원해요. 두 모드 모두 주어진 스키마를 따르도록 훈련된 같은 모델을 쓰지만, 어느 쪽이 스키마를 완벽하게 지키는지는 strict 모드(제한 샘플링을 통한 완벽한 준수 보장)만 보장해요.

목표는 strict 모드용 스키마를 strict 모드 자체로 생성하는 거예요. 그런데 JSON Schema Specification이 제공하는 공식 메타 스키마는 strict 모드에서 아직 지원되지 않는 기능에 의존해요. 이 때문에 입력·출력 스키마 양쪽에 문제가 생겨요.

  1. 입력 스키마: 출력 스키마를 기술하는 데 지원되지 않는 기능을 입력 스키마에서 쓸 수 없어요.
  2. 출력 스키마: 생성된 스키마에 지원되지 않는 기능이 포함되면 안 돼요.

출력 스키마에 새 키를 생성해야 하므로 입력 메타 스키마는 additionalProperties를 써야 해요. 그래서 현재는 strict 모드로 스키마를 생성할 수 없어요. 그래도 생성된 스키마가 strict 모드 제약을 따르게 하려고 해요.

이 한계를 넘기 위해 pseudo-meta-schema(의사 메타 스키마) 를 정의해요. strict 모드에서 지원되는 기능만 기술하기 위해, strict 모드에서 지원되지 않는 기능을 사용하는 메타 스키마예요. 즉 메타 스키마 정의 자체는 strict 모드 밖으로 나서되, 생성되는 스키마가 strict 모드 제약을 지키도록 보장하는 방식이에요.

제약된 메타 스키마를 만드는 건 까다로운 작업이라 모델의 도움을 받았어요. 먼저 o1-preview와 gpt-4o를 JSON 모드로 실행해 목표를 설명했고, 몇 번의 반복 끝에 첫 번째 기능적인 메타 스키마를 만들었어요. 그 뒤 gpt-4o에 Structured Outputs를 쓰고 그 초기 스키마를 작업 설명·문서와 함께 제공해 더 나은 후보를 생성하게 했어요. 반복마다 더 나은 스키마로 다음을 생성하고, 마지막에는 손으로 꼼꼼히 검토했어요. 끝으로 출력을 정리한 뒤 스키마·함수용 evals 세트로 검증했어요.

출력 정리 (Output cleaning)

strict 모드는 완벽한 스키마 준수를 보장하지만, 생성 중에는 쓸 수 없으므로 생성 후 출력을 검증하고 변환해야 해요. 스키마를 생성한 뒤 다음 단계를 수행해요.

  1. 모든 객체의 additionalProperties를 false로 설정해요.
  2. 모든 속성을 required로 표시해요.
  3. Structured Outputs 스키마는 json_schema 객체로 감싸요.
  4. 함수는 function 객체로 감싸요.

Realtime API의 function 객체는 Chat Completions API와 약간 다르지만 같은 스키마를 사용해요.

메타 스키마 (Meta-schemas)

각 메타 스키마에는 few-shot 예시를 담은 대응 프롬프트가 있어요. 이 프롬프트와 Structured Outputs의 안정성(비록 strict 모드가 아니더라도)을 결합하면 스키마를 생성할 수 있어요. 구조화된 출력 스키마와 함수 스키마 각각에 적합한 메타 스키마가 있고, 모델이 일치하지 않는 출력을 거부(refusal)하면 그 사실을 알 수 있도록 처리해요.

더 알아보기 (Learn more)