OpenAI API에서는 대규모 언어 모델에 프롬프트를 보내 텍스트를 생성할 수 있습니다. ChatGPT를 사용할 때와 같은 방식입니다. 모델은 코드, 수식, 구조화된 JSON 데이터, 사람이 쓴 듯한 자연스러운 글 등 거의 모든 종류의 텍스트 응답을 생성할 수 있습니다.
1
2
3
4
5
6
7
8
9
10require "openai"openai = OpenAI::Client.newresponse = openai.responses.create( model: "gpt-6-astra", input: "Write a one-sentence bedtime story about a unicorn.")puts(response.output_text)
1
2
3
4
5openai responses create \ --model "gpt-6-astra" \ --input "Write a one-sentence bedtime story about a unicorn." \ --raw-output \ --transform 'output.#(type=="message").content.0.text'
1
2
3
4
5
6
7curl "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 속성에는 모델이 생성한 콘텐츠가 배열로 담깁니다. 이 예시에서는 다음과 같이 출력 항목이 하나뿐입니다.
1234567891011121314[ { "id": "msg_67b73f697ba4819183a15cc17d011509", "type": "message", "role": "assistant", "content": [ { "type": "output_text", "text": "Under the soft glow of the moon, Luna the unicorn danced through fields of twinkling stardust, leaving trails of dreams for every child asleep.", "annotations": [] } ] }]
output 배열에는 항목이 여러 개 들어가는 경우가 많습니다. 도구 호출, 추론 모델이 생성한 추론 토큰에 관한 데이터 등 다양한 항목이 포함될 수 있습니다. 따라서 모델이 출력한 텍스트가 항상 output[0].content[0].text에 있다고 가정하면 안 됩니다.
일부 공식 SDK는 모델 응답에 output_text 속성을 제공합니다. 이 속성은 모델이 출력한 모든 텍스트를 하나의 문자열로 모아 주므로 텍스트 출력에 간편하게 접근할 수 있습니다.
일반 텍스트 외에도 모델이 JSON 형식의 구조화된 데이터를 반환하도록 할 수 있습니다. 이 기능을 구조화된 출력값이라고 합니다.
응답의 choices 속성에는 모델이 생성한 콘텐츠가 배열로 담깁니다. 이 예시에서는 다음과 같이 출력 항목이 하나뿐입니다.
123456789101112[ { "index": 0, "message": { "role": "assistant", "content": "Under the soft glow of the moon, Luna the unicorn danced through fields of twinkling stardust, leaving trails of dreams for every child asleep.", "refusal": null }, "logprobs": null, "finish_reason": "stop" }]
일반 텍스트 외에도 모델이 JSON 형식의 구조화된 데이터를 반환하도록 할 수 있습니다. 이 기능을 구조화된 출력값이라고 합니다.
모델 선택하기
API로 콘텐츠를 생성할 때는 먼저 어떤 모델을 사용할지 정해야 합니다. 위 코드 예시에서는 model 매개변수로 모델을 지정합니다. 사용 가능한 모델 전체 목록을 확인하세요. 텍스트 생성용 모델을 선택할 때는 다음 사항을 고려하세요.
추론 모델은 내부 추론 과정을 통해 입력 프롬프트를 분석하며, 복잡한 작업을 이해하고 여러 단계에 걸친 계획을 세우는 데 뛰어납니다. 일반적으로 GPT 모델보다 느리고 사용 비용이 높습니다.
GPT 모델은 빠르고 비용 효율적이며 성능이 뛰어납니다. 작업 수행 방법을 구체적으로 지시하면 더 좋은 결과를 얻을 수 있습니다.
대형 모델과 소형 모델(mini 또는 nano)은 속도, 비용, 문제 해결 능력 면에서 각각 장단점이 있습니다. 대형 모델은 프롬프트를 이해하고 다양한 분야의 문제를 해결하는 데 더 뛰어나며, 소형 모델은 일반적으로 더 빠르고 사용 비용이 낮습니다.
어떤 모델을 선택할지 확신이 서지 않는다면 범용 텍스트 생성과 프롬프트 개선에는 gpt-6-astra부터 사용해 보세요.
프롬프트 엔지니어링
프롬프트 엔지니어링은 모델이 요구 사항에 맞는 콘텐츠를 일관되게 생성하도록 효과적인 지침을 작성하는 과정입니다.
같은 입력에도 모델이 생성하는 콘텐츠는 달라질 수 있습니다. 따라서 원하는 출력을 얻는 프롬프트를 작성하려면 체계적인 접근과 감각이 모두 필요합니다. 여러 기법과 모범 사례를 적용하면 꾸준히 좋은 결과를 얻을 수 있습니다.
메시지 역할을 사용하는 것처럼 모든 모델에 통하는 프롬프트 엔지니어링 기법도 있습니다. 하지만 추론 모델과 GPT 모델처럼 유형이 다르면 최적의 결과를 내는 프롬프트 작성 방식도 달라질 수 있습니다. 같은 모델 제품군에서도 스냅샷에 따라 결과가 달라질 수 있습니다. 따라서 복잡한 애플리케이션을 개발할 때는 다음 두 가지를 적극 권장합니다.
프로덕션 애플리케이션이 일관되게 동작하도록 특정 모델 스냅샷(예: gpt-4.1-2025-04-14)을 지정해 사용하세요.
프롬프트가 어떻게 동작하는지 측정하는 테스트와 평가 모음을 마련하세요. 프롬프트를 개선하거나 모델 버전을 변경 또는 업그레이드할 때 성능을 추적할 수 있습니다.
이제 프롬프트를 구성하는 데 사용할 수 있는 도구와 기법을 살펴보겠습니다.
메시지 역할과 지침 준수
모델에 전달하는 지침의 권한 수준은 instructions API 매개변수나 메시지 역할로 구분할 수 있습니다.
instructions 매개변수는 모델이 응답을 생성할 때 따를 전반적인 지침을 제공합니다. 여기에는 어조, 목표, 올바른 응답의 예시 등을 포함할 수 있습니다. 이 방식으로 전달한 지침은 input 매개변수에 담긴 프롬프트보다 우선합니다.
OpenAI 모델 사양은 모델이 메시지의 역할에 따라 우선순위를 어떻게 정하는지 설명합니다.
developer
user
assistant
developer 메시지는 애플리케이션 개발자가 제공하는 지침으로, user 메시지보다 우선합니다.
user 메시지는 최종 사용자가 제공하는 지침으로, developer 메시지보다 우선순위가 낮습니다.
모델이 생성한 메시지의 역할은 assistant입니다.
여러 턴에 걸친 대화에는 이런 유형의 메시지가 여러 개 포함될 수 있으며, 개발자와 모델이 제공하는 다른 유형의 콘텐츠도 함께 들어갈 수 있습니다. 자세한 내용은 대화 상태 관리를 참고하세요.
developer 메시지와 user 메시지의 관계는 프로그래밍 언어에서 함수와 인수의 관계에 비유할 수 있습니다.
developer 메시지는 함수 정의처럼 시스템의 규칙과 비즈니스 로직을 제공합니다.
user 메시지는 함수의 인수처럼 developer 메시지의 지침을 적용할 입력과 설정을 제공합니다.
코드에서 프롬프트 버전 관리하기
재사용 가능한 프롬프트 객체를 만드는 대신 프로덕션 프롬프트를 애플리케이션 코드에 저장하세요. 프롬프트를 코드로 관리하면 타입이 지정된 입력, 코드 리뷰, 테스트, 기존 배포 절차를 활용해 모델 동작을 변경할 수 있습니다.
OpenAI API의 재사용 가능한 프롬프트 객체는 사용 중단 예정(deprecated)입니다. 2026년 6월 3일부터 프롬프트 객체 생성 기능의 비중이 줄어들며, v1/prompts는 2026년 11월 30일에 종료될 예정입니다. 최신 일정은 사용 중단 일정 페이지에서 확인하세요.
새로 프롬프트를 설계할 때는 다음과 같이 진행하세요.
프롬프트를 구성하는 코드는 해당 기능의 코드와 가까운 곳에 작은 모듈로 두세요.
고객 데이터, 파일, 작업 옵션처럼 요청마다 달라지는 값에는 타입이 지정된 함수 인수나 스키마를 사용하세요.
프로덕션 프롬프트를 변경하기 전에 대표적인 테스트 픽스처, 테스트, 평가 항목을 추가하세요.
기존 배포 시스템으로 프롬프트 변경 사항을 배포하세요. 단계적으로 릴리스해야 한다면 기능 플래그나 설정을 활용하세요.
이미 프롬프트 ID나 버전으로 저장된 프롬프트를 호출하고 있다면 프롬프트 객체 마이그레이션 가이드에 따라 해당 프롬프트를 코드로 옮기세요.
Markdown과 XML로 메시지 구성하기
developer 메시지와 user 메시지를 작성할 때 Markdown 서식과 XML 태그를 함께 사용하면 모델이 프롬프트와 컨텍스트 데이터에서 각 부분의 경계를 파악하기 쉽습니다.
Markdown 제목과 목록은 프롬프트를 여러 섹션으로 구분하고 모델에 계층 구조를 전달하는 데 유용합니다. 개발 중에 프롬프트를 읽기도 한결 쉬워집니다. XML 태그로는 참고 문서와 같은 개별 콘텐츠의 시작과 끝을 표시할 수 있습니다. XML 속성에 프롬프트 콘텐츠의 메타데이터를 정의해 두면 지침에서 이를 참조할 수 있습니다.
개발자 메시지는 일반적으로 다음 섹션을 아래 순서로 구성합니다. 가장 효과적인 내용과 순서는 사용하는 모델에 따라 달라질 수 있습니다.
역할: 어시스턴트의 목적, 의사소통 방식, 전반적인 목표를 설명하세요.
지침: 원하는 응답을 어떻게 생성할지 모델에 안내하세요. 어떤 규칙을 따라야 하나요? 무엇을 해야 하고 무엇을 절대 해서는 안 되나요? 사용 사례에 따라 모델이 사용자 정의 함수를 호출하는 방법 등 여러 하위 섹션을 둘 수 있습니다.
예시: 가능한 입력과 그에 대해 모델이 생성해야 할 출력을 함께 제시하세요.
컨텍스트: 모델이 응답을 생성하는 데 필요한 추가 정보를 제공하세요. 학습 데이터에 없는 비공개 데이터나 독점 데이터, 해당 요청과 특히 관련이 깊다고 판단한 데이터 등이 여기에 해당합니다. 생성 요청마다 필요한 컨텍스트가 달라질 수 있으므로 보통 프롬프트 끝부분에 배치하는 것이 좋습니다.
다음 예시는 Markdown과 XML 태그를 사용해 developer 메시지를 섹션별로 나누고 지침을 뒷받침하는 예시를 포함하는 방법을 보여 줍니다.
프롬프트 예시
코드 생성을 위한 개발자 메시지
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24# IdentityYou are coding assistant that helps enforce the use of snake casevariables in JavaScript code, and writing code that will run inInternet Explorer version 6.# Instructions* When defining variables, use snake case names (e.g. my_variable) instead of camel case names (e.g. myVariable).* To support old browsers, declare variables using the older "var" keyword.* Do not give responses with Markdown formatting, just return the code as requested.# Examples<user_query>How do I declare a string variable for a first name?</user_query><assistant_response>var first_name = "Anna";</assistant_response>
API 요청
API로 코드 생성 프롬프트 보내기
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13import fs from"fs/promises";import OpenAI from"openai";constclient=newOpenAI();constinstructions=await fs.readFile("fixtures/prompt.txt", "utf-8");constresponse=await client.responses.create({ model: "gpt-6-astra", instructions, input: "How would I declare a variable for a last name?",});console.log(response.output_text);
1
2
3
4
5
6
7
8
9
10
11
12
13
14from openai import OpenAIclient = OpenAI()with open("prompt.txt", "r", encoding="utf-8") as f: instructions = f.read()response = client.responses.create( model="gpt-6-astra", instructions=instructions, input="How would I declare a variable for a last name?",)print(response.output_text)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17import com.openai.client.OpenAIClient;import com.openai.client.okhttp.OpenAIOkHttpClient;import com.openai.models.responses.ResponseCreateParams;ResponseCreateParams params = ResponseCreateParams.builder() .model("gpt-6-astra") .instructions( "You are a coding assistant. Answer with concise JavaScript examples and use semicolons.") .input("How would I declare a variable for a last name?") .build();client.responses().create(params).output().stream() .flatMap(item -> item.message().stream()) .flatMap(message -> message.content().stream()) .flatMap(content -> content.outputText().stream()) .forEach(text -> System.out.println(text.text()));
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18using OpenAI.Responses;#pragma warning disable OPENAI001string key = Environment.GetEnvironmentVariable("OPENAI_API_KEY")!;ResponsesClient client = new(key);string instructions = await File.ReadAllTextAsync("prompt.txt");CreateResponseOptions options = new(){ Model = "gpt-6-astra", Instructions = instructions,};options.InputItems.Add( ResponseItem.CreateUserMessageItem("How would I declare a variable for a last name?"));ResponseResult response = await client.CreateResponseAsync(options);Console.WriteLine(response.GetOutputText());
1
2
3
4
5
6
7
8
9
10
11require "openai"client = OpenAI::Client.newinstructions = File.read(File.join(__dir__, "prompt.txt"))response = client.responses.create( model: "gpt-6-astra", instructions: instructions, input: "How would I declare a variable for a last name?")puts(response.output_text)
1
2
3
4
5
6
7
8curl https://api.openai.com/v1/responses \ -H "Authorization: Bearer $OPENAI_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "gpt-6-astra", "instructions": "'"$(< prompt.txt)"'", "input": "How would I declare a variable for a last name?" }'
프롬프트 캐싱으로 비용과 지연 시간 줄이기
메시지를 구성할 때 여러 API 요청에서 반복해서 사용할 콘텐츠는 프롬프트 앞부분에 두세요. 또한Chat Completions나 Responses에 보내는 JSON 요청 본문에서도 이 콘텐츠가 담긴 API 매개변수를 앞쪽에 배치하세요. 이렇게 하면 프롬프트 캐싱을 활용해 비용과 지연 시간을 최대한 줄일 수 있습니다.
퓨샷 학습
퓨샷 학습은 프롬프트에 몇 가지 입력과 출력 예시를 넣어 대규모 언어 모델이 새로운 작업을 수행하도록 유도하는 방법입니다. 모델을 별도로 파인튜닝할 필요 없이 모델이 예시에서 패턴을 파악해 프롬프트에 적용합니다. 예시를 작성할 때는 다양한 입력과 각 입력에 대해 원하는 출력을 함께 보여 주세요.
일반적으로 예시는 API 요청의 developer 메시지에 포함합니다. 다음 developer 메시지는 고객 서비스 리뷰를 긍정 또는 부정으로 분류하는 방법을 예시로 보여 줍니다.
# 역할당신은 짧은 제품 리뷰에 Positive, Negative, Neutral 중 하나의 레이블을 붙이는 어시스턴트입니다.# 지침* 응답에는 서식이나 설명을 덧붙이지 말고 단어 하나만 출력하세요.* 주어진 제품 리뷰에 나타난 감정에 따라 반드시 "Positive", "Negative", "Neutral" 중 하나로 응답하세요.# 예시<product_review id="example-1">I absolutely love this headphones — sound quality is amazing!</product_review><assistant_response id="example-1">Positive</assistant_response><product_review id="example-2">Battery life is okay, but the ear pads feel cheap.</product_review><assistant_response id="example-2">Neutral</assistant_response><product_review id="example-3">Terrible customer service, I'll never buy from them again.</product_review><assistant_response id="example-3">Negative</assistant_response>
관련 컨텍스트 정보 포함하기
프롬프트에 모델이 응답 생성에 활용할 컨텍스트를 추가하면 유용한 경우가 많습니다. 대표적인 이유는 다음과 같습니다.
모델이 독점 데이터나 학습 데이터셋에 없는 다른 데이터를 활용할 수 있게 합니다.
개발자가 가장 유용하다고 판단한 자료만 바탕으로 모델이 응답하도록 범위를 제한합니다.
모델에 보내는 생성 요청에 관련 컨텍스트를 추가하는 기법을 검색 증강 생성(RAG)이라고도 합니다. 프롬프트에 컨텍스트를 추가하는 방법은 다양합니다. 벡터 데이터베이스를 조회해 반환된 텍스트를 프롬프트에 넣거나, OpenAI의 내장 파일 검색 도구를 사용해 업로드한 문서를 바탕으로 콘텐츠를 생성할 수 있습니다.
컨텍스트 윈도우 크기 고려하기
모델이 한 번의 생성 요청에서 컨텍스트로 처리할 수 있는 데이터의 양에는 한계가 있습니다. 이 메모리 한도를 컨텍스트 윈도우라고 하며, 크기는 토큰 수로 나타냅니다. 토큰은 텍스트부터 이미지까지 모델에 전달하는 데이터를 나눈 단위입니다.
컨텍스트 윈도우 크기는 모델에 따라 10만 토큰대 초반부터 최신 GPT-4.1 모델의 경우 최대 100만 토큰까지 다양합니다. 모델별 정확한 컨텍스트 윈도우 크기는 모델 문서에서 확인하세요.
최신 모델용 프롬프트 작성하기
gpt-6-astra 같은 GPT 모델은 작업에 필요한 로직과 데이터를 프롬프트에 명시하고 정확한 지침을 제공할 때 더 좋은 결과를 냅니다. 최신 모델을 효과적으로 활용하려면 먼저 최신 프롬프트 작성 가이드를 살펴보세요.
코딩 작업을 위해 gpt-6-astra에 프롬프트를 작성할 때는 에이전트의 역할을 정의하고, 예시를 통해 정해진 방식으로 도구를 사용하도록 하세요. 코드가 올바르게 동작하는지 철저히 테스트하도록 요구하고, 출력을 깔끔하게 정리할 수 있도록 Markdown 작성 기준을 지정하세요.
명확한 역할과 워크플로우 지침
모델에 소프트웨어 엔지니어링 에이전트 역할을 부여하고 책임 범위를 명확히 정의하세요. 코딩 작업에서 functions.run 같은 도구를 사용하는 방법을 구체적으로 안내하고, 특정 모드를 피해야 할 때도 명시하세요. 예를 들어 꼭 필요한 경우에만 대화형 실행을 사용하도록 지시할 수 있습니다.
테스트와 검증
모델이 단위 테스트나 Python 명령어로 변경 사항을 테스트하고 패치를 꼼꼼히 검증하도록 지시하세요. apply_patch 같은 도구는 실패해도 “Done”을 반환할 수 있습니다.
도구 사용 예시
제공된 함수로 명령어를 호출하는 구체적인 예시를 포함하세요. 그러면 모델이 도구를 더 안정적으로 사용하고 의도한 워크플로우를 따르는 데 도움이 됩니다.
Markdown 작성 기준
모델이 인라인 코드, 코드 블록, 목록, 표를 용도에 맞게 사용해 깔끔하고 의미 구조가 올바른 Markdown을 작성하도록 안내하세요. 파일 경로, 함수, 클래스는 백틱으로 감싸도록 하세요.
모델은 프런트엔드를 처음부터 구축하는 작업과 기존 대규모 코드베이스에서 개발하는 작업 모두에 뛰어납니다. 최상의 결과를 얻으려면 다음 라이브러리를 사용하는 것이 좋습니다.
스타일링 / UI: Tailwind CSS, shadcn/ui, Radix Themes
아이콘: Lucide, Material Symbols, Heroicons
애니메이션: Motion
웹 앱을 처음부터 만들기
GPT-5는 예시 없이도 프롬프트 하나로 프런트엔드 웹 앱을 생성할 수 있습니다. 다음은 프롬프트 예시입니다.
123456당신은 프롬프트 하나만으로 시각적으로 뛰어나고 상호작용이 풍부한 혁신적인 웹사이트를 처음부터 만들 수 있는 세계적인 웹 개발자입니다. 완성도 높은 원샷 솔루션을 구현하는 데 능숙합니다.다음 순서로 작업하세요.1단계: 평가 기준표를 작성하고, 기준에 충분한 확신이 들 때까지 다듬으세요.2단계: 세계적인 수준의 원샷 웹 앱이 갖춰야 할 요소를 빠짐없이 검토하세요. 이를 바탕으로 5~7개 평가 영역으로 구성된 <ONE_SHOT_RUBRIC>을 작성하세요. 이 기준표는 내부 평가에만 사용하고 공개하지 마세요.3단계: 기준표를 적용해 주어진 프롬프트에 가장 적합한 결과가 나올 때까지 개선하세요. 어느 한 영역이라도 최고 기준에 미치지 못하면 결과물을 다듬고 다시 평가하세요.4단계: 목표를 빠짐없이 달성하면서 구현은 단순하게 유지하세요. Next.js나 React 같은 외부 종속성은 피하세요.
대규모 코드베이스와 통합하기
대규모 코드베이스에서 프런트엔드를 개발할 때는 다음 항목에 관한 지침을 프롬프트에 추가했을 때 가장 좋은 결과를 얻었습니다.
원칙: 시각적 품질 기준을 정하고, 모듈화되어 재사용할 수 있는 컴포넌트를 사용하며, 디자인의 일관성을 유지하세요.
UI/UX: 타이포그래피, 색상, 간격과 레이아웃, 상호작용 상태(마우스를 올렸을 때, 데이터가 없을 때, 로딩 중일 때), 접근성 요구 사항을 명시하세요.
구조: 기존 코드와 쉽게 통합할 수 있도록 파일과 폴더 구조를 정의하세요.
컴포넌트: 재사용 가능한 래퍼 예시와 백엔드 호출 로직을 분리하는 방법을 제시하세요.
페이지: 자주 사용하는 레이아웃의 템플릿을 제공하세요.
에이전트 지침: 모델에 디자인의 전제 조건 확인, 프로젝트 기본 구조 생성, 표준 준수, API 통합, 상태별 테스트, 코드 문서화를 요청하세요.
gpt-6-astra로 에이전트 작업이나 장시간 실행되는 작업을 수행할 때는 프롬프트에서 세 가지를 강조하세요. 요청을 끝까지 해결할 수 있도록 작업을 충분히 계획하고, 도구 사용에 관한 중요한 결정을 내릴 때는 그 이유를 미리 설명하며, 할 일 관리 도구로 워크플로우와 진행 상황을 체계적으로 추적하도록 하세요.
계획 수립과 작업 완수
모델이 사용자에게 제어권을 돌려주기 전에 요청 전체를 해결하도록 지시하세요. 요청을 하위 작업으로 나누고 도구를 호출할 때마다 결과를 검토해 빠짐없이 처리했는지 확인하도록 하세요.
당신은 에이전트입니다. 사용자의 요청을 완전히 해결할 때까지 작업을 계속한 뒤 턴을 마치고 사용자에게 제어권을 돌려주세요. 요청을 처리하는 데 필요한 하위 작업을 모두 파악하고 각각 완료했는지 확인하세요. 요청의 일부만 처리한 상태에서 멈추지 마세요. 문제가 해결되었다고 확신할 때만 턴을 마치세요. 여러 요청에 답할 준비를 하고, 사용자가 더 이상 요청할 사항이 없다고 확인한 후에만 대화를 종료하세요.다음 함수를 호출하기 전에 워크플로우 단계에 따라 충분히 계획을 세우세요. 함수를 호출할 때마다 결과를 면밀히 검토해 사용자의 요청과 관련 하위 작업을 모두 해결했는지 확인하세요.
도구 호출 이유 미리 설명하기
중요한 단계에서만 모델이 도구를 호출하는 이유를 미리 설명하도록 요청하세요.
도구를 호출하기 전에 그 도구를 호출하는 이유를 설명하세요.
평가 기준표와 할 일 목록으로 진행 상황 추적하기
할 일 목록 도구나 평가 기준표를 사용해 계획을 체계적으로 세우고 빠뜨린 단계가 없도록 하세요.