OpenAI 文本生成
通过OpenAI API,可像使用ChatGPT一样,以提示词让大语言模型生成代码、数学公式、结构化JSON或自然语言文章等文本。直接模型请求推荐使用Responses API。
下面的程序内任务译为:“写一个关于独角兽的睡前故事,只用一句话。”原英文字符串保留。
文本生成(来源示例1,javascript)
// [中文] 使用Responses生成一句独角兽睡前故事;input保留来源的英文任务。
// [中文] 通过SDK文本汇总入口或响应文本项读取结果,不假定output第一项总是正文。
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);
文本生成(来源示例2,python)
## [中文] 使用Responses生成一句独角兽睡前故事;input保留来源的英文任务。
## [中文] 通过SDK文本汇总入口或响应文本项读取结果,不假定output第一项总是正文。
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)
文本生成(来源示例3,go)
// [中文] 使用Responses生成一句独角兽睡前故事;input保留来源的英文任务。
// [中文] 通过SDK文本汇总入口或响应文本项读取结果,不假定output第一项总是正文。
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())
}
文本生成(来源示例4,java)
// [中文] 使用Responses生成一句独角兽睡前故事;input保留来源的英文任务。
// [中文] 通过SDK文本汇总入口或响应文本项读取结果,不假定output第一项总是正文。
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()));
}
}
文本生成(来源示例5,csharp)
// [中文] 使用Responses生成一句独角兽睡前故事;input保留来源的英文任务。
// [中文] 通过SDK文本汇总入口或响应文本项读取结果,不假定output第一项总是正文。
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()}");
文本生成(来源示例6,ruby)
## [中文] 使用Responses生成一句独角兽睡前故事;input保留来源的英文任务。
## [中文] 通过SDK文本汇总入口或响应文本项读取结果,不假定output第一项总是正文。
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)
文本生成(来源示例7,bash)
## [中文] 使用Responses生成一句独角兽睡前故事;input保留来源的英文任务。
## [中文] 通过SDK文本汇总入口或响应文本项读取结果,不假定output第一项总是正文。
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'
文本生成(来源示例8,bash)
## [中文] 使用Responses生成一句独角兽睡前故事;input保留来源的英文任务。
## [中文] 通过SDK文本汇总入口或响应文本项读取结果,不假定output第一项总是正文。
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数组中,本例只有一个输出:
文本生成(来源示例9,json)
[
{
"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": []
}
]
}
]
响应中text的完整中文对照:“在月光柔和的照耀下,独角兽露娜在闪烁着星尘的原野间起舞,为每个熟睡的孩子留下梦的轨迹。”这是示例输出,不表示每次请求都会生成相同句子。
output经常不止一项,还可能含工具调用、推理模型的推理词元相关数据等。不要假定文字总在output[0].content[0].text。部分官方SDK提供output_text,将全部文本输出汇总为一个字符串,便于读取。也可使用结构化输出返回符合约束的JSON。
<a id="prompt-engineering"></a>
提示词工程
提示词工程是编写有效指令,使模型持续生成符合要求内容的过程。模型输出非确定性,提示设计兼具艺术与科学,仍可通过技术与最佳实践稳定改善。
消息角色等技术广泛适用,但不同模型、甚至同家族不同快照可能需要不同提示。复杂应用建议固定模型快照,例如gpt-5.5-2026-04-23,并建立测试和评测集,持续观察提示迭代和模型升级后的行为。
<a id="choosing-models-and-apis"></a>
选择模型与API
OpenAI提供多种模型和API。GPT-6 Astra等推理模型与聊天模型行为不同,适合不同提示;结合Responses通常可获得更好的推理表现。文本生成应用推荐Responses而非较早Chat Completions,推理模型尤其值得迁移到Responses。
<a id="message-roles-and-instruction-following"></a>
消息角色与指令遵循
instructions和消息角色可提供不同优先级的指令。instructions指定语气、目标及正确响应示例等高层行为,优先于input中的提示。以下指令译为“像海盗一样说话”,问题译为“JavaScript中的分号是否可选?”
消息角色与指令遵循(来源示例10,javascript)
// [中文] 通过instructions设置海盗口吻,再把JavaScript分号问题放入input。
// [中文] instructions只约束本次响应;打印生成文本以观察指令效果。
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);
消息角色与指令遵循(来源示例11,python)
## [中文] 通过instructions设置海盗口吻,再把JavaScript分号问题放入input。
## [中文] instructions只约束本次响应;打印生成文本以观察指令效果。
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)
消息角色与指令遵循(来源示例12,go)
// [中文] 通过instructions设置海盗口吻,再把JavaScript分号问题放入input。
// [中文] instructions只约束本次响应;打印生成文本以观察指令效果。
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())
}
消息角色与指令遵循(来源示例13,java)
// [中文] 通过instructions设置海盗口吻,再把JavaScript分号问题放入input。
// [中文] instructions只约束本次响应;打印生成文本以观察指令效果。
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()));
消息角色与指令遵循(来源示例14,csharp)
// [中文] 通过instructions设置海盗口吻,再把JavaScript分号问题放入input。
// [中文] instructions只约束本次响应;打印生成文本以观察指令效果。
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());
消息角色与指令遵循(来源示例15,ruby)
## [中文] 通过instructions设置海盗口吻,再把JavaScript分号问题放入input。
## [中文] instructions只约束本次响应;打印生成文本以观察指令效果。
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)
消息角色与指令遵循(来源示例16,bash)
## [中文] 通过instructions设置海盗口吻,再把JavaScript分号问题放入input。
## [中文] instructions只约束本次响应;打印生成文本以观察指令效果。
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?"
}'
大致等价的消息形式:
消息角色与指令遵循(来源示例17,javascript)
// [中文] 把海盗口吻放入developer消息,分号问题放入user消息,分别表达应用规则与用户输入。
// [中文] 将消息数组提交给Responses并读取生成文本。
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);
消息角色与指令遵循(来源示例18,python)
## [中文] 把海盗口吻放入developer消息,分号问题放入user消息,分别表达应用规则与用户输入。
## [中文] 将消息数组提交给Responses并读取生成文本。
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)
消息角色与指令遵循(来源示例19,go)
// [中文] 把海盗口吻放入developer消息,分号问题放入user消息,分别表达应用规则与用户输入。
// [中文] 将消息数组提交给Responses并读取生成文本。
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())
}
消息角色与指令遵循(来源示例20,java)
// [中文] 把海盗口吻放入developer消息,分号问题放入user消息,分别表达应用规则与用户输入。
// [中文] 将消息数组提交给Responses并读取生成文本。
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()));
消息角色与指令遵循(来源示例21,csharp)
// [中文] 把海盗口吻放入developer消息,分号问题放入user消息,分别表达应用规则与用户输入。
// [中文] 将消息数组提交给Responses并读取生成文本。
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());
消息角色与指令遵循(来源示例22,ruby)
## [中文] 把海盗口吻放入developer消息,分号问题放入user消息,分别表达应用规则与用户输入。
## [中文] 将消息数组提交给Responses并读取生成文本。
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)
消息角色与指令遵循(来源示例23,bash)
## [中文] 把海盗口吻放入developer消息,分号问题放入user消息,分别表达应用规则与用户输入。
## [中文] 将消息数组提交给Responses并读取生成文本。
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不会自动出现在当前上下文。
| 角色 | 含义 |
|---|---|
developer |
应用开发者提供的指令,优先于user |
user |
最终用户指令,优先级低于developer |
assistant |
模型生成的消息 |
多轮对话可含多条此类消息,以及应用和模型提供的其他内容项。可把developer看作函数定义,提供规则和业务逻辑;user像函数参数,提供输入及配置。
<a id="version-prompts-in-code"></a>
在代码中管理提示词版本
生产提示词存入应用代码,不新建可复用提示词对象。这样可用类型化输入、代码审查、测试及常规部署改变模型行为。
OpenAI正弃用提示词对象:2026年6月3日起淡化创建入口,v1/prompts计划于2026年11月30日关闭,时间线见弃用记录。
新工作将构造器放在所支持功能附近的小模块;动态客户数据、文件、任务选项用有类型的参数或Schema;生成的instructions与input直接传给Responses;改生产提示词前加代表性样本、测试、评测;通过部署系统发布,需要分阶段时用功能开关或配置。已有提示词ID或版本的集成按迁移指南搬到代码。
<a id="next-steps"></a>
后续资源
可在Playground开发、迭代提示词;通过结构化输出约束JSON;全部文本生成选项见API参考。

TRAE-AI编程


更多建议: