텍스트 생성

텍스트 생성 (Text Generation)

OpenAI API의 가장 기본적인 쓰임새는 프롬프트를 주고 모델이 텍스트를 만들어내는 거예요. 코드, 수학 식, 구조화된 JSON, 사람이 쓴 것 같은 문장까지 거의 모든 종류의 응답을 만들 수 있죠. 단순한 요청이라면 최신 Responses API로 바로 호출하는 걸 권해요.

출처: Text generation - OpenAI Docs

간단한 프롬프트로 텍스트 생성하기

가장 단순한 형태는 modelinput만 담아 responses.create를 호출하는 거예요. 아래 예시는 유니콘에 관한 한 문장 동화를 쓰라고 한 경우예요.

from openai import OpenAI

client = OpenAI()

response = client.responses.create(
    model="gpt-6-astra",
    input="Write a one-sentence bedtime story about a unicorn.",
)

print(response.output_text)
curl "https://api.openai.com/v1/responses" \
    -H "Content-Type: application/json" \
    -H "Authorization: Bearer $OPENAI_API_KEY" \
    -d '{
        "model": "gpt-6-astra",
        "input": "Write a one-sentence bedtime story about a unicorn."
    }'

모델이 만든 내용은 응답의 output 배열에 들어 있어요. 이 배열에는 메시지만 있는 게 아니라 도구 호출(tool call)이나 reasoning 토큰 정보 같은 항목도 함께 실릴 수 있어요. 그래서 텍스트가 항상 output[0].content[0].text에 있다고 가정하면 안 돼요. 공식 SDK 중 일부는 output_text 속성을 제공해 텍스트 출력만 하나의 문자열로 모아주니, 간단한 경우엔 이걸 쓰면 편해요.

프롬프트 엔지니어링

프롬프트 엔지니어링은 모델이 원하는 내용을 꾸준히 만들어내도록 효과적인 지시를 작성하는 과정이에요. 모델 결과는 결정적이지 않아서, 원하는 출력을 얻으려면 예술과 과학이 섞여요. 다만 몇 가지 기법과 모범 사례를 적용하면 좋은 결과를 꾸준히 얻을 수 있어요.

일부 기법(예: 메시지 역할 사용)은 모든 모델에 적용되지만, 모델마다 프롬프트 방식이 달라질 수 있어요. 같은 계열의 다른 스냅숏이라도 결과가 다를 수 있어요. 실제 서비스라면 다음을 강하게 권해요.

  • 특정 모델 스냅숏(예: gpt-5.5-2026-04-23)에 고정해 일관된 동작을 보장
  • 프롬프트 동작을 측정하는 테스트·평가 스위트를 만들어, 버전을 올리거나 바꿀 때 성능을 모니터링

모델과 API 선택

OpenAI는 다양한 모델과 여러 API를 제공해요. gpt-6-astra 같은 reasoning 모델은 챗 모델과 동작이 달라서 다른 프롬프트에 더 잘 반응해요. 텍스트 생성 앱을 새로 만든다면 기존 Chat Completions보다 Responses API를 쓰는 걸 권장하고, reasoning 모델이라면 Responses로 마이그레이션하는 게 특히 유리해요.

메시지 역할과 지시 따르기

instructions 파라미터와 메시지 역할을 쓰면 모델에 서로 다른 권한 수준으로 지시를 줄 수 있어요. instructions는 모델이 응답할 때 어떻게 행동해야 하는지(톤, 목표, 올바른 응답 예시)를 알려주는 최상위 지시이고, input의 프롬프트보다 우선해요.

response = client.responses.create(
    model="gpt-6-astra",
    reasoning={"effort": "low"},
    instructions="Talk like a pirate.",
    input="Are semicolons optional in JavaScript?",
)

주요 역할은 세 가지예요.

developer user assistant
애플리케이션 개발자가 제공하는 지시. user 메시지보다 우선. 최종 사용자가 제공하는 지시. developer 메시지보다 뒤에 처리. 모델이 생성한 메시지에 붙는 역할.

developer와 user를 프로그래밍 언어의 함수와 인자로 생각하면 이해가 쉬워요. developer는 함수 정의처럼 시스템 규칙·비즈니스 로직을, user는 그 함수에 넘겨지는 인자처럼 입력·설정을 담당해요. instructions는 현재 요청에만 적용돼요. previous_response_id로 대화 상태를 관리하면 이전 턴의 instructions는 컨텍스트에 남지 않는다는 점도 기억해 두세요.

프롬프트를 코드로 버전 관리하기

재사용 가능한 프롬프트 객체 대신, 프로덕션 프롬프트는 애플리케이션 코드에 저장하는 걸 권장해요. 코드로 관리하면 타입 있는 입력, 코드 리뷰, 테스트, 평소 배포 프로세스로 모델 동작을 바꿀 수 있어요. OpenAI는 API의 재사용 가능한 프롬프트 객체를 폐기하고 있어요. 프롬프트 생성은 2026년 6월 3일부터 비중이 줄고, v1/prompts는 2026년 11월 30일에 종료될 예정이에요. 폐기 일정을 따로 확인해 보세요.

새 텍스트 생성 작업에서는 다음과 같이 구성해요.

  • 프롬프트 빌더를 지원하는 기능 옆의 작은 모듈에 유지
  • 고객 데이터·파일·작업 옵션 같은 동적 값은 타입 있는 함수 인자나 스키마로 처리
  • 생성된 instructionsinputResponses API에 바로 전달
  • 프로덕션 프롬프트를 바꾸기 전에 대표 픽스처·테스트·평가를 추가
  • 프롬프트 변경은 배포 시스템(기능 플래그나 설정)으로 단계적 배포

이미 저장된 프롬프트를 ID나 버전으로 호출 중이라면 프롬프트 객체 마이그레이션 가이드를 참고해 코드로 옮기세요.

마크다운과 XML로 메시지 꾸미기

developer·user 메시지를 쓸 때 MarkdownXML 태그를 섞으면 프롬프트와 컨텍스트 데이터의 논리적 경계를 모델이 이해하기 쉬워져요. Markdown 헤더·리스트는 섹션 구분과 계층 전달에, XML 태그는 참고 문서처럼 한 콘텐츠가 어디서 시작·끝나는지 알려주는 데 좋아요. XML 속성으로 프롬프트 내 콘텐츠에 대한 메타데이터를 정의할 수도 있어요.

developer 메시지는 보통 다음 순서로 구성돼요(모델에 따라 최적 구성은 달라질 수 있어요).

  • Identity: 어시스턴트의 목적, 커뮤니케이션 스타일, 상위 목표
  • Instructions: 원하는 응답을 만들 지침. 규칙, 해야 할 일과 하지 말아야 할 일
  • Examples: 가능한 입력과 기대 출력 예시
  • Context: 학습 데이터 밖의 사유 데이터처럼 응답에 필요한 추가 정보. 요청마다 다른 컨텍스트를 넣을 수 있어 보통 프롬프트 끝에 둬요

프로덕션 최적화

프롬프트 앞부분에 반복 사용할 콘텐츠를 두면 프롬프트 캐싱으로 비용과 지연을 아낄 수 있어요. 몇 개의 입력·출력 예시를 프롬프트에 포함해 새 작업을 유도하는 few-shot learning도 유용해요. 또 모델이 응답에 활용할 추가 컨텍스트를 넣는 기법은 retrieval-augmented generation(RAG)라고 불러요. 단, 모델이 한 번에 처리할 수 있는 컨텍스트는 컨텍스트 윈도우라는 토큰 한계 안으로 제한된다는 점을 계획에 반영하세요.

더 알아보기