OpenAI API では、大規模言語モデル を使って、ChatGPT と同じようにプロンプトからテキストを生成できます。コード、数式、構造化された JSON データ、人が書いたような自然な文章など、モデルはほぼあらゆる種類のテキストを生成できます。
Responses API を使った簡単な例を見てみましょう。
1
2
3
4
5
6
7
8
9 import OpenAI from "openai" ;
const client = new OpenAI ();
const response = await client.responses. create ({
model: "gpt-6-astra" ,
input: "Write a one-sentence bedtime story about a unicorn." ,
});
console. log (response.output_text); 1
2
3
4
5
6
7
8
9
10 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) 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 package main
import (
"context"
"fmt"
"github.com/openai/openai-go/v3"
"github.com/openai/openai-go/v3/responses"
)
func main() {
client := openai.NewClient()
resp, err := client.Responses.New(context.TODO(), responses.ResponseNewParams{
Model: "gpt-6-astra",
Input: responses.ResponseNewParamsInputUnion{OfString: openai.String("Say this is a test")},
})
if err != nil {
panic(err.Error())
}
fmt.Println(resp.OutputText())
} 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 import com.openai.client.OpenAIClient;
import com.openai.client.okhttp.OpenAIOkHttpClient;
import com.openai.models.responses.Response;
import com.openai.models.responses.ResponseCreateParams;
public class Main {
public static void main(String[] args) {
OpenAIClient client = OpenAIOkHttpClient.fromEnv();
ResponseCreateParams params =
ResponseCreateParams.builder().input("Say this is a test").model("gpt-6-astra").build();
Response response = client.responses().create(params);
response.output().stream()
.flatMap(item -> item.message().stream())
.flatMap(message -> message.content().stream())
.flatMap(content -> content.outputText().stream())
.forEach(outputText -> System.out.println(outputText.text()));
}
} 1
2
3
4
5
6
7
8
9
10
11
12 using OpenAI.Responses;
#pragma warning disable OPENAI001
string key = Environment.GetEnvironmentVariable("OPENAI_API_KEY")!;
ResponsesClient client = new(key);
ResponseResult response = await client.CreateResponseAsync(
"gpt-6-astra",
"Say 'this is a test.'"
);
Console.WriteLine($"[ASSISTANT]: {response.GetOutputText()}"); 1
2
3
4
5
6
7
8
9
10 require "openai"
openai = OpenAI::Client.new
response = 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
5 openai 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
7 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 プロパティには、モデルが生成したコンテンツが配列として格納されます。この例の出力は、次の 1 件だけです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 [
{
"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 プロパティが用意されています。このプロパティを使うと、モデルが出力したすべてのテキストを 1 つの文字列として簡単に取得できます。
プレーンテキストに加えて、JSON 形式の構造化データをモデルに返させることもできます。この機能を構造化出力 と呼びます。
Chat Completions API を使った簡単な例を見てみましょう。
1
2
3
4
5
6
7
8
9
10
11
12
13
14 import OpenAI from "openai" ;
const client = new OpenAI ();
const completion = await client.chat.completions. create ({
model: "gpt-5.5" ,
messages: [
{
role: "user" ,
content: "Write a one-sentence bedtime story about a unicorn." ,
},
],
});
console. log (completion.choices[ 0 ].message.content); 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 from openai import OpenAI
client = OpenAI()
completion = client.chat.completions.create(
model="gpt-5.5",
messages=[
{
"role": "user",
"content": "Write a one-sentence bedtime story about a unicorn.",
}
],
)
print(completion.choices[0].message.content) 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 package main
import (
"context"
"fmt"
"github.com/openai/openai-go/v3"
)
func main() {
client := openai.NewClient()
completion, err := client.Chat.Completions.New(
context.Background(),
openai.ChatCompletionNewParams{
Model: "gpt-6-astra",
Messages: []openai.ChatCompletionMessageParamUnion{
openai.UserMessage("Write a one-sentence bedtime story about a unicorn."),
},
},
)
if err != nil {
panic(err)
}
fmt.Println(completion.Choices[0].Message.Content)
} 1
2
3
4
5
6
7
8
9
10
11
12
13 import com.openai.client.OpenAIClient;
import com.openai.client.okhttp.OpenAIOkHttpClient;
import com.openai.models.chat.completions.ChatCompletionCreateParams;
ChatCompletionCreateParams params =
ChatCompletionCreateParams.builder()
.model("gpt-6-astra")
.addUserMessage("Write a one-sentence bedtime story about a unicorn.")
.build();
client.chat().completions().create(params).choices().stream()
.flatMap(choice -> choice.message().content().stream())
.forEach(System.out::println); 1
2
3
4
5
6
7
8
9
10
11 using OpenAI.Chat;
string key = Environment.GetEnvironmentVariable("OPENAI_API_KEY")!;
string model = "gpt-6-astra";
ChatClient client = new(model, key);
ChatCompletion completion = await client.CompleteChatAsync(
new UserChatMessage("Write a one-sentence bedtime story about a unicorn.")
);
Console.WriteLine(completion.Content[0].Text); 1
2
3
4
5
6
7
8
9
10
11
12
13
14 require "openai"
client = OpenAI::Client.new
completion = client.chat.completions.create(
model: "gpt-6-astra",
messages: [
{
role: :user,
content: "Write a one-sentence bedtime story about a unicorn."
}
]
)
puts(completion.choices.fetch(0).message.content) 1
2
3
4
5
6
7
8
9
10
11
12 curl "https://api.openai.com/v1/chat/completions" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d '{
"model": "gpt-5.5",
"messages": [
{
"role": "user",
"content": "Write a one-sentence bedtime story about a unicorn."
}
]
}' レスポンスの choices プロパティには、モデルが生成したコンテンツが配列として格納されます。この例の出力は、次の 1 件だけです。
1 2 3 4 5 6 7 8 9 10 11 12 [
{
"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)に固定し、動作の一貫性を確保する
プロンプトの挙動を測定するテストと評価スイートを用意し、プロンプトの改善時やモデルのバージョン変更・アップグレード時に性能を追跡できるようにする
ここからは、プロンプトを組み立てるためのツールと手法を見ていきます。
モデルに優先順位の異なる指示 を与えるには、API の instructions パラメータまたはメッセージのロール を使います。
instructions パラメータでは、口調、目標、適切な回答例など、応答を生成する際の基本方針をモデルに伝えます。ここで指定した指示は、input パラメータに含まれるプロンプトよりも優先されます。
1
2
3
4
5
6
7
8
9
10
11 import OpenAI from "openai" ;
const client = new OpenAI ();
const response = await client.responses. create ({
model: "gpt-6-astra" ,
reasoning: { effort: "low" },
instructions: "Talk like a pirate." ,
input: "Are semicolons optional in JavaScript?" ,
});
console. log (response.output_text); 1
2
3
4
5
6
7
8
9
10
11
12 from openai import OpenAI
client = OpenAI()
response = client.responses.create(
model="gpt-6-astra",
reasoning={"effort": "low"},
instructions="Talk like a pirate.",
input="Are semicolons optional in JavaScript?",
)
print(response.output_text) 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 package main
import (
"context"
"fmt"
"github.com/openai/openai-go/v3"
"github.com/openai/openai-go/v3/responses"
)
func main() {
client := openai.NewClient()
response, err := client.Responses.New(context.Background(), responses.ResponseNewParams{
Model: "gpt-6-astra",
Instructions: openai.String("Talk like a pirate."),
Reasoning: responses.ReasoningParam{
Effort: responses.ReasoningEffortLow,
},
Input: responses.ResponseNewParamsInputUnion{
OfString: openai.String("Are semicolons optional in JavaScript?"),
},
})
if err != nil {
panic(err)
}
fmt.Println(response.OutputText())
} 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 import com.openai.client.OpenAIClient;
import com.openai.client.okhttp.OpenAIOkHttpClient;
import com.openai.models.Reasoning;
import com.openai.models.ReasoningEffort;
import com.openai.models.responses.ResponseCreateParams;
String semicolonsDevMsg = "Talk like a pirate.";
String semicolonsPrompt = "Are semicolons optional in JavaScript?";
ResponseCreateParams params =
ResponseCreateParams.builder()
.model("gpt-6-astra")
.input(semicolonsPrompt)
.instructions(semicolonsDevMsg)
.reasoning(Reasoning.builder().effort(ReasoningEffort.LOW).build())
.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
18
19
20
21
22 using OpenAI.Responses;
#pragma warning disable OPENAI001
string key = Environment.GetEnvironmentVariable("OPENAI_API_KEY")!;
ResponsesClient client = new(key);
CreateResponseOptions options = new()
{
Model = "gpt-6-astra",
Instructions = "Talk like a pirate.",
ReasoningOptions = new ResponseReasoningOptions
{
ReasoningEffortLevel = ResponseReasoningEffortLevel.Low,
},
};
options.InputItems.Add(
ResponseItem.CreateUserMessageItem("Are semicolons optional in JavaScript?")
);
ResponseResult response = await client.CreateResponseAsync(options);
Console.WriteLine(response.GetOutputText()); 1
2
3
4
5
6
7
8
9
10
11 require "openai"
client = OpenAI::Client.new
response = client.responses.create(
model: "gpt-6-astra",
instructions: "Talk like a pirate.",
reasoning: { effort: :low },
input: "Are semicolons optional in JavaScript?"
)
puts(response.output_text) 1
2
3
4
5
6
7
8
9 curl "https://api.openai.com/v1/responses" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d '{
"model": "gpt-6-astra",
"reasoning": {"effort": "low"},
"instructions": "Talk like a pirate.",
"input": "Are semicolons optional in JavaScript?"
}' 上の例は、input 配列で次のメッセージを渡す場合とほぼ同じです。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 import OpenAI from "openai" ;
const client = new OpenAI ();
const response = await client.responses. create ({
model: "gpt-6-astra" ,
reasoning: { effort: "low" },
input: [
{
role: "developer" ,
content: "Talk like a pirate." ,
},
{
role: "user" ,
content: "Are semicolons optional in JavaScript?" ,
},
],
});
console. log (response.output_text); 1
2
3
4
5
6
7
8
9
10
11
12
13
14 from openai import OpenAI
client = OpenAI()
response = client.responses.create(
model="gpt-6-astra",
reasoning={"effort": "low"},
input=[
{"role": "developer", "content": "Talk like a pirate."},
{"role": "user", "content": "Are semicolons optional in JavaScript?"},
],
)
print(response.output_text) 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 package main
import (
"context"
"fmt"
"github.com/openai/openai-go/v3"
"github.com/openai/openai-go/v3/responses"
)
func main() {
client := openai.NewClient()
response, err := client.Responses.New(context.Background(), responses.ResponseNewParams{
Model: "gpt-6-astra",
Reasoning: responses.ReasoningParam{
Effort: responses.ReasoningEffortLow,
},
Input: responses.ResponseNewParamsInputUnion{
OfInputItemList: responses.ResponseInputParam{
responses.ResponseInputItemParamOfMessage(
"Talk like a pirate.",
responses.EasyInputMessageRoleDeveloper,
),
responses.ResponseInputItemParamOfMessage(
"Are semicolons optional in JavaScript?",
responses.EasyInputMessageRoleUser,
),
},
},
})
if err != nil {
panic(err)
}
fmt.Println(response.OutputText())
} 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 import com.openai.client.OpenAIClient;
import com.openai.client.okhttp.OpenAIOkHttpClient;
import com.openai.models.Reasoning;
import com.openai.models.ReasoningEffort;
import com.openai.models.responses.EasyInputMessage;
import com.openai.models.responses.ResponseCreateParams;
import com.openai.models.responses.ResponseInputItem;
import java.util.List;
String semicolonsDevMsg = "Talk like a pirate.";
String semicolonsPrompt = "Are semicolons optional in JavaScript?";
ResponseCreateParams params =
ResponseCreateParams.builder()
.model("gpt-6-astra")
.input(
ResponseCreateParams.Input.ofResponse(
List.of(
ResponseInputItem.ofEasyInputMessage(
EasyInputMessage.builder()
.role(EasyInputMessage.Role.DEVELOPER)
.content(semicolonsDevMsg)
.build()),
ResponseInputItem.ofEasyInputMessage(
EasyInputMessage.builder()
.role(EasyInputMessage.Role.USER)
.content(semicolonsPrompt)
.build()))))
.reasoning(Reasoning.builder().effort(ReasoningEffort.LOW).build())
.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
18
19
20
21
22
23
24 using OpenAI.Responses;
#pragma warning disable OPENAI001
string key = Environment.GetEnvironmentVariable("OPENAI_API_KEY")!;
ResponsesClient client = new(key);
CreateResponseOptions options = new()
{
Model = "gpt-6-astra",
ReasoningOptions = new ResponseReasoningOptions
{
ReasoningEffortLevel = ResponseReasoningEffortLevel.Low,
},
};
options.InputItems.Add(
ResponseItem.CreateDeveloperMessageItem("Talk like a pirate.")
);
options.InputItems.Add(
ResponseItem.CreateUserMessageItem("Are semicolons optional in JavaScript?")
);
ResponseResult response = await client.CreateResponseAsync(options);
Console.WriteLine(response.GetOutputText()); 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 require "openai"
client = OpenAI::Client.new
response = client.responses.create(
model: "gpt-6-astra",
reasoning: { effort: :low },
input: [
{
role: :developer,
content: "Talk like a pirate."
},
{
role: :user,
content: "Are semicolons optional in JavaScript?"
}
]
)
puts(response.output_text) 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 curl "https://api.openai.com/v1/responses" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d '{
"model": "gpt-6-astra",
"reasoning": {"effort": "low"},
"input": [
{
"role": "developer",
"content": "Talk like a pirate."
},
{
"role": "user",
"content": "Are semicolons optional in JavaScript?"
}
]
}' instructions パラメータが適用されるのは、現在の応答生成リクエストだけです。会話の状態を管理する 際に previous_response_id パラメータを使っても、以前のターンで指定した instructions はコンテキストに含まれません。
モデルに優先順位の異なる指示 (プロンプト)を与えるには、メッセージのロール を使います。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 import OpenAI from "openai" ;
const client = new OpenAI ();
const completion = await client.chat.completions. create ({
model: "gpt-6-astra" ,
messages: [
{
role: "developer" ,
content: "Talk like a pirate." ,
},
{
role: "user" ,
content: "Are semicolons optional in JavaScript?" ,
},
],
});
console. log (completion.choices[ 0 ].message); 1
2
3
4
5
6
7
8
9
10
11
12
13
14 from openai import OpenAI
client = OpenAI()
completion = client.chat.completions.create(
model="gpt-6-astra",
reasoning_effort="low",
messages=[
{"role": "developer", "content": "Talk like a pirate."},
{"role": "user", "content": "Are semicolons optional in JavaScript?"},
],
)
print(completion.choices[0].message.content) 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 package main
import (
"context"
"fmt"
"github.com/openai/openai-go/v3"
)
func main() {
client := openai.NewClient()
completion, err := client.Chat.Completions.New(context.Background(), openai.ChatCompletionNewParams{
Model: "gpt-6-astra",
Messages: []openai.ChatCompletionMessageParamUnion{
openai.DeveloperMessage("Talk like a pirate."),
openai.UserMessage("Are semicolons optional in JavaScript?"),
},
})
if err != nil {
panic(err)
}
fmt.Println(completion.Choices[0].Message.Content)
} 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 import com.openai.client.OpenAIClient;
import com.openai.client.okhttp.OpenAIOkHttpClient;
import com.openai.models.chat.completions.ChatCompletionCreateParams;
String semicolonsDevMsg = "Talk like a pirate.";
String semicolonsPrompt = "Are semicolons optional in JavaScript?";
ChatCompletionCreateParams params =
ChatCompletionCreateParams.builder()
.model("gpt-6-astra")
.addDeveloperMessage(semicolonsDevMsg)
.addUserMessage(semicolonsPrompt)
.build();
client.chat().completions().create(params).choices().stream()
.flatMap(choice -> choice.message().content().stream())
.forEach(System.out::println); 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 using OpenAI.Chat;
#pragma warning disable OPENAI001
string key = Environment.GetEnvironmentVariable("OPENAI_API_KEY")!;
string model = "gpt-6-astra";
ChatClient client = new(model, key);
ChatCompletion completion = await client.CompleteChatAsync(
[
new DeveloperChatMessage("Talk like a pirate."),
new UserChatMessage("Are semicolons optional in JavaScript?"),
]
);
Console.WriteLine(completion.Content[0].Text); 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 require "openai"
client = OpenAI::Client.new
completion = client.chat.completions.create(
model: "gpt-6-astra",
messages: [
{
role: :developer,
content: "Talk like a pirate."
},
{
role: :user,
content: "Are semicolons optional in JavaScript?"
}
]
)
puts(completion.choices.fetch(0).message.content) 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 curl "https://api.openai.com/v1/chat/completions" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d '{
"model": "gpt-6-astra",
"messages": [
{
"role": "developer",
"content": "Talk like a pirate."
},
{
"role": "user",
"content": "Are semicolons optional in JavaScript?"
}
]
}'
OpenAI Model Spec では、モデルがメッセージのロールに応じて優先順位を決める仕組みを説明しています。
developer
user
assistant
developer メッセージはアプリケーション開発者からの指示で、user メッセージよりも優先されます。
user メッセージはエンドユーザーからの指示で、developer メッセージよりも優先順位が低くなります。
モデルが生成したメッセージのロールは assistant です。
複数ターンの会話には、こうしたメッセージが複数含まれるほか、開発者やモデルが提供する別の種類のコンテンツも含まれることがあります。詳しくは、会話の状態管理 を参照してください。
developer メッセージと user メッセージの関係は、プログラミング言語の関数とその引数にたとえることができます。
developer メッセージは関数の定義に相当し、システムのルールやビジネスロジックを定めます。
user メッセージは関数の引数に相当し、developer メッセージの指示を適用する対象となる入力や設定を渡します。
本番用のプロンプトは、再利用可能なプロンプトオブジェクトを作成する代わりに、アプリケーションのコード内に保存してください。コードで管理すると、型付きの入力、コードレビュー、テスト、通常のデプロイ手順を利用してモデルの動作を変更できます。
OpenAI は、API の再利用可能なプロンプトオブジェクトを段階的に廃止します。2026 年 6 月 3 日以降はプロンプトオブジェクトの新規作成を積極的には推奨せず、2026 年 11 月 30 日に v1/prompts を停止する予定です。最新のスケジュールは廃止予定のページ で確認してください。
新たにプロンプトを設計する際は、次のように進めてください。
プロンプトを組み立てる処理は、それを使う機能のコードの近くに小さなモジュールとしてまとめます。
顧客データ、ファイル、タスクのオプションなどの動的な値には、型付きの関数引数またはスキーマを使います。
生成した instructions と input を Responses API に直接渡します。
本番用のプロンプトを変更する前に、代表的なケースのテストフィクスチャ、テスト、評価項目を追加します。
プロンプトの変更は通常のデプロイシステムを通じてリリースします。段階的にリリースする場合は、機能フラグや設定を利用します。
すでにプロンプト ID やバージョンを指定して保存済みのプロンプトを呼び出している場合は、プロンプトオブジェクトの移行ガイド に沿って、そのプロンプトをコードに移してください。
developer メッセージや user メッセージを書く際に、Markdown の書式と XML タグ を組み合わせると、プロンプトやコンテキストデータの論理的な区切りがモデルに伝わりやすくなります。
Markdown の見出しやリストを使うと、プロンプトの各セクションを区別し、階層構造をモデルに示せます。開発者にとってもプロンプトが読みやすくなります。XML タグは、参考資料など、ひとまとまりのコンテンツの始まりと終わりを明示するのに役立ちます。XML 属性でプロンプト内のコンテンツにメタデータを付け、指示の中で参照することもできます。
開発者メッセージには通常、次のセクションをこの順序で含めます。ただし、最適な内容や順序は、使用するモデルによって変わることがあります。
役割: アシスタントの用途、コミュニケーションのスタイル、全体の目標を示します。
指示: 望ましい応答を生成する方法をモデルに伝えます。守るべきルール、行うべきこと、決して行ってはならないことを明示します。用途に応じて、カスタム関数の呼び出し方 などを個別のサブセクションに分けて説明できます。
例: 想定される入力と、それに対してモデルに期待する出力を対にして示します。
コンテキスト: 学習データに含まれない非公開データや独自データ、タスクとの関連性が特に高いとわかっているデータなど、応答の生成に必要な追加情報を渡します。生成リクエストごとに異なるコンテキストを含めることがあるため、通常はプロンプトの末尾付近に置くのが適しています。
次の例では、Markdown と XML タグを使い、developer メッセージをセクションに分けて、指示を補足する例を加えています。
Example prompt API request プロンプト例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 # Identity
You are coding assistant that helps enforce the use of snake case
variables in JavaScript code, and writing code that will run in
Internet 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 リクエスト
1
2
3
4
5
6
7
8
9
10
11
12
13 import fs from "fs/promises" ;
import OpenAI from "openai" ;
const client = new OpenAI ();
const instructions = await fs. readFile ( "fixtures/prompt.txt" , "utf-8" );
const response = 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
14 from openai import OpenAI
client = 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
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 package main
import (
"context"
"fmt"
"os"
"github.com/openai/openai-go/v3"
"github.com/openai/openai-go/v3/responses"
)
func main() {
client := openai.NewClient()
instructions, err := os.ReadFile("prompt.txt")
if err != nil {
panic(err)
}
response, err := client.Responses.New(context.Background(), responses.ResponseNewParams{
Model: "gpt-6-astra",
Instructions: openai.String(string(instructions)),
Input: responses.ResponseNewParamsInputUnion{
OfString: openai.String("How would I declare a variable for a last name?"),
},
})
if err != nil {
panic(err)
}
fmt.Println(response.OutputText())
} 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 import 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
18 using OpenAI.Responses;
#pragma warning disable OPENAI001
string 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
11 require "openai"
client = OpenAI::Client.new
instructions = 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
8 curl 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」のいずれかのラベルを付けるアシスタントです。
# 指示
* 回答には単語を 1 つだけ出力してください。書式や補足説明は加えないでください。
* 製品レビューに表れている感情に応じて、「Positive」「Negative」「Neutral」のいずれか 1 語だけを返してください。
# 例
<product_review id="example-1">
このヘッドホン、本当に気に入っています。音質が抜群です!
</product_review>
<assistant_response id="example-1">
Positive
</assistant_response>
<product_review id="example-2">
バッテリーの持ちはまずまずですが、イヤーパッドは安っぽく感じます。
</product_review>
<assistant_response id="example-2">
Neutral
</assistant_response>
<product_review id="example-3">
カスタマーサービスの対応がひどかったです。もう二度とここでは買いません。
</product_review>
<assistant_response id="example-3">
Negative
</assistant_response>
モデルに渡すプロンプトには、応答の生成に役立つ追加情報を含めると効果的です。たとえば、次のような目的でコンテキストを追加します。
独自データなど、モデルの学習データセットに含まれないデータをモデルが利用できるようにする
モデルが応答の根拠とする資料を、特に有用と判断したものに限定する
モデルへの生成リクエストに関連するコンテキストを追加する手法は、検索拡張生成(RAG) と呼ばれることがあります。コンテキストを追加する方法はさまざまです。たとえば、ベクトルデータベースを検索して得られたテキストをプロンプトに含める方法や、OpenAI の組み込みのファイル検索ツール を使い、アップロードしたドキュメントに基づいてコンテンツを生成する方法があります。
モデルが 1 回の生成リクエストでコンテキストとして扱えるデータ量には上限があります。この上限をコンテキストウィンドウ と呼び、トークン (テキストや画像などの入力データを分割した単位)の数で表します。
コンテキストウィンドウのサイズはモデルによって異なり、10 万トークン台前半のものから、新しい GPT-4.1 モデルでは 100 万トークンに達するものまであります。各モデルの具体的なサイズは、モデルのドキュメント を参照してください。
gpt-6-astra などの GPT モデルでは、タスクの遂行に必要なロジックとデータをプロンプトに明示し、具体的に指示すると効果的です。最新モデルの能力を引き出すには、まず現行のプロンプトガイドを参照してください。
GPT-6 Astra prompting guide
最新モデルの能力を引き出すプロンプトの書き方を、最新の指針、実践例、移行時の注意点とともに紹介します。
現行の指針を網羅した解説は、最新モデル向けプロンプトのベストプラクティス を参照してください。以下の実践上のポイントも引き続き有効です。
コーディング gpt-6-astra にコーディングを依頼する際は、エージェントの役割を定め、例を示してツールの利用手順を守らせます。また、正しさを確認するための十分なテストを求め、出力を読みやすくするために Markdown の記述ルールを指定すると効果的です。
役割と作業手順の明示
モデルをソフトウェアエンジニアリングのエージェントとして位置づけ、担当する作業を明確にします。コーディングには functions.run などのツールをどう使うかを具体的に指示します。「必要な場合を除き対話的な実行は避ける」など、特定のモードを使わない条件も指定してください。
テストと検証
変更内容を単体テストや Python コマンドでテストするよう指示します。apply_patch などのツールは失敗しても「Done」を返すことがあるため、パッチが正しく適用されたかも慎重に確認させてください。
ツールの使用例
用意された関数を使ってコマンドを呼び出す具体例を含めます。モデルが想定した手順に沿って、より確実に作業を進められるようになります。
Markdown の記述ルール
インラインコード、コードフェンス、リスト、表を用途に応じて使い分け、読みやすく、文書の構造を正しく表す Markdown を生成するよう指示します。ファイルパス、関数名、クラス名はバッククォートで囲むよう指定してください。
コーディングに関する詳しい指針とプロンプト例は、最新モデル向けプロンプトのベストプラクティス を参照してください。
フロントエンド開発 GPT-6 Astra は、フロントエンドを一から構築する作業にも、大規模な既存コードベースでの開発にも適しています。より良い結果を得るには、次のライブラリを推奨します。
スタイリング/UI: Tailwind CSS、shadcn/ui、Radix Themes
アイコン: Lucide、Material Symbols、Heroicons
アニメーション :Motion
Web アプリの新規開発
GPT-5 は、例を示さなくても、ワンショットのプロンプトで Web アプリのフロントエンドを生成できます。次のようなプロンプトを使います。
1 2 3 4 5 6 あなたは世界トップクラスの Web 開発者です。1 つのプロンプトから、見た目にも美しく、インタラクティブで斬新な Web サイトを一から構築できます。ワンショットで質の高い成果物を仕上げることを得意としています。
次の手順で進めてください。
ステップ 1:評価基準を作成し、自信を持って使える基準になるまで見直してください。
ステップ 2:ワンショットで世界トップクラスの Web アプリを作るには何が必要か、あらゆる要素を検討してください。その結果を基に、5~7 項目からなる & lt ; ONE_SHOT_RUBRIC & gt ; を作成してください。この評価基準は内部でのみ使用し、ユーザーには開示しないでください。
ステップ 3:評価基準に照らして改善を繰り返し、与えられたプロンプトに最も適した成果物に仕上げてください。どれか 1 項目でも最高水準に達していなければ、改善して再度評価してください。
ステップ 4:目標をすべて達成しつつ、実装はシンプルに保ってください。Next.js や React などへの外部依存は避けてください。 大規模なコードベースへの統合
大規模なコードベースでフロントエンドを開発する場合は、プロンプトに次の項目について指示を加えると、最も良い結果が得られます。
設計原則: 見た目の品質基準を定め、再利用可能なモジュール式のコンポーネントを使い、デザインの一貫性を保つよう指示します。
UI/UX: タイポグラフィ、配色、余白とレイアウト、各状態(ホバー時、データがないとき、読み込み中)の表示、アクセシビリティを指定します。
構成: 既存のコードに無理なく統合できるよう、ファイルやフォルダーの構成を定めます。
コンポーネント: 再利用できるラッパーの例と、バックエンドの呼び出しを分離する方法を示します。
ページ: よく使うレイアウトのテンプレートを用意します。
エージェントへの指示: 設計上の前提を確認し、プロジェクトのひな形を作成し、基準を守り、API を統合し、各状態の動作をテストし、コードを文書化するようモデルに指示します。
フロントエンド開発に関する詳しい指針とプロンプト例は、最新モデル向けプロンプトのベストプラクティス を参照してください。
エージェントによるタスク gpt-6-astra にエージェントとしての作業や長時間にわたる処理を任せる場合は、プロンプトで次の 3 点を重視します。依頼を最後まで解決できるようにタスクを綿密に計画すること、重要な場面でツールを使う理由を事前に説明すること、TODO ツールで作業手順と進捗を整理して追跡することです。
計画の立案と完了までの遂行
ユーザーに制御を返す前に依頼全体を解決するようモデルに指示します。依頼をサブタスクに分解し、ツールを呼び出すたびに結果を振り返り、未完了の作業がないか確認させます。
あなたはエージェントです。ユーザーの依頼をすべて解決するまで作業を続けてから、ターンを終了してユーザーに制御を返してください。依頼を必要な作業に分け、その一つひとつが完了したことを確認してください。依頼の一部を終えた時点で作業を止めないでください。問題を解決できたと確信した場合にのみ、ターンを終了してください。複数の依頼に対応できるようにしておいてください。やり取りを終了するのは、ほかに依頼がないことをユーザー自身が確認してからにしてください。
次の関数を呼び出す前に、作業手順に沿って綿密に計画を立ててください。関数を呼び出すたびに結果を十分に検討し、ユーザーの依頼と、それに関連する個々の作業がすべて完了したことを確認してください。 ツールを使う理由の事前説明
重要なステップに限り、ツールを呼び出す理由を事前に説明するようモデルに指示します。
ツールを呼び出す前に、そのツールを使う理由を説明してください。 評価基準と TODO リストによる進捗管理
TODO リストを管理するツールや評価基準を使い、手順に沿って計画を立て、作業の抜けを防ぎます。
エージェントの構築に関する詳しい指針とプロンプト例は、最新モデル向けプロンプトのベストプラクティス を参照してください。
リーズニングモデル と GPT モデルでは、効果的な指示の出し方が異なります。一般に、リーズニングモデルでは、大まかな方針だけを示したほうが良い結果が得られます。一方、GPT モデルでは、具体的で正確な指示が効果的です。
リーズニングモデルと GPT モデルの違いは、次のように考えることができます。
リーズニングモデルは、経験豊富な同僚に似ています。達成したい目標を伝えれば、具体的な進め方は任せられます。
GPT モデルは、経験の浅い同僚に似ています。作ってほしい成果物を具体的に示し、明確な指示を与えると、最も力を発揮します。
リーズニングモデルを使う際のベストプラクティスについて詳しくは、こちらのガイド を参照してください。
テキストの入出力の基本を押さえたら、目的に応じて次のリソースを活用してください。
Playground でプロンプトを作成し、試しながら改善できます。
モデルが出力する JSON データを指定の JSON スキーマに準拠させる方法を説明します。
API リファレンスで、テキスト生成に使えるすべてのオプションを確認できます。
プロンプト設計のヒントをさらに探すには、OpenAI Cookbook を参照してください。サンプルコードのほか、次のような外部リソースへのリンクも掲載しています。