文本生成
使用 OpenAI API,你可以像使用 ChatGPT 一样,借助大语言模型根据提示词生成文本。模型几乎可以生成任何类型的文本响应,例如代码、数学公式、结构化 JSON 数据,或者接近自然语言的长段文字。
对于这类直接向模型发起请求的文本生成场景,建议使用 Responses API。
模型生成的内容会出现在响应的 output 属性中。下面这个简单示例中,只有一个输出项,结构如下:
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": []
}
]
}
]output 数组中通常不止一个元素!
它还可能包含工具调用、由推理模型生成的推理 token 数据,以及其他项目。因此,不能默认认为模型输出文本一定在 output[0].content[0].text 这个位置。
OpenAI 的一些官方 SDK为了方便使用,还会在模型响应对象上提供 output_text 属性,它会把所有文本输出聚合成一个字符串。如果你只想快速获取文本内容,这会是一个很方便的快捷方式。
除了纯文本外,你还可以让模型返回 JSON 格式的结构化数据,这项能力称为 Structured Outputs(结构化输出)。
提示词工程
提示词工程(Prompt engineering) 是指为模型编写高质量指令,使其能够稳定生成符合你要求内容的过程。
由于模型生成内容本身具有非确定性,因此想得到理想输出通常既需要经验,也需要方法。不过,你仍然可以通过一些技巧与最佳实践,持续获得稳定效果。
有些提示词技巧适用于所有模型,例如使用消息角色(message roles)。但不同模型往往需要不同的提示方式,才能发挥最佳效果。即使是同一模型家族下的不同快照版本,也可能表现不同。因此,在构建复杂应用时,我们强烈建议你:
接下来,我们来看看你可以用来构建提示词的一些工具与技巧。
选择模型与 API
OpenAI 提供了许多不同的模型以及多种 API 可供选择。推理模型(例如 o3 和 GPT-5)与传统聊天模型的行为方式不同,它们对提示词的响应方式也不同。一个重要结论是:推理模型在搭配 Responses API 使用时,往往表现更好,也能展现更高智能水平。
如果你正在构建任何文本生成应用,我们建议优先使用 Responses API,而不是较旧的 Chat Completions API。
如果你使用的是推理模型,那么尤其建议你迁移到 Responses API。
消息角色与指令遵循
你可以通过 instructions API 参数,以及不同层级的消息角色优先级,向模型提供不同权重的指令。
instructions 参数可用于向模型提供高层级行为要求,例如语气、目标以及正确回复示例。在这里提供的指令优先级高于 input 参数中的普通提示词。
使用 instructions 生成文本:
javascript
import OpenAI from "openai";
const client = new OpenAI();
const response = await client.responses.create({
model: "gpt-5",
reasoning: { effort: "low" },
instructions: "${semicolonsDevMsg}",
input: "${semicolonsPrompt}",
});
console.log(response.output_text);python
from openai import OpenAI
client = OpenAI()
response = client.responses.create(
model="gpt-5",
reasoning={"effort": "low"},
instructions="${semicolonsDevMsg}",
input="${semicolonsPrompt}",
)
print(response.output_text)bash
curl "https://xikapi.com/v1/responses" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $XIKAPI_API_KEY" \
-d '{
"model": "gpt-5",
"reasoning": {"effort": "low"},
"instructions": "${semicolonsDevMsg}",
"input": "${semicolonsPrompt}"
}'上面的示例,大致等价于在 input 数组中传入以下消息:
使用不同角色消息生成文本:
javascript
import OpenAI from "openai";
const client = new OpenAI();
const response = await client.responses.create({
model: "gpt-5",
reasoning: { effort: "low" },
input: [
{
role: "developer",
content: "${semicolonsDevMsg}"
},
{
role: "user",
content: "${semicolonsPrompt}",
},
],
});
console.log(response.output_text);python
from openai import OpenAI
client = OpenAI()
response = client.responses.create(
model="gpt-5",
reasoning={"effort": "low"},
input=[
{
"role": "developer",
"content": "${semicolonsDevMsg}"
},
{
"role": "user",
"content": "${semicolonsPrompt}"
}
]
)
print(response.output_text)bash
curl "https://xikapi.com/v1/responses" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $XIKAPI_API_KEY" \
-d '{
"model": "gpt-5",
"reasoning": {"effort": "low"},
"input": [
{
"role": "developer",
"content": "${semicolonsDevMsg}"
},
{
"role": "user",
"content": "${semicolonsPrompt}"
}
]
}'请注意,instructions 参数只对当前这一次响应生成请求生效。
如果你正在使用 previous_response_id 参数来管理对话状态,那么之前轮次中使用的 instructions 不会自动保留在当前上下文中。
OpenAI 模型规范说明了不同角色消息在优先级上的差异:
| developer | user | assistant |
|---|---|---|
developer 消息是由应用开发者提供的指令,优先级高于用户消息。 | user 消息是终端用户提供的指令,优先级低于 developer 消息。 | 模型生成的消息会带有 assistant 角色。 |
多轮对话通常会由上述这些类型的多条消息组成,同时也可能包含你与模型双方提供的其他内容类型。可进一步阅读对话状态管理。
你也可以把 developer 和 user 消息理解为编程语言中的“函数定义”和“函数参数”:
developer消息提供系统规则与业务逻辑,类似函数定义user消息提供输入与配置,类似函数调用时传入的参数
可复用提示词
在 OpenAI 控制台中,你可以创建可复用的prompts,并在 API 请求中直接引用,而不必把提示词内容硬编码在代码里。这样你可以更方便地构建、评测和迭代提示词,并且在不修改接入代码的前提下上线更好的提示词版本。
工作方式如下:
- 在 dashboard 中创建一个可复用提示词,并使用像
这样的占位符 - 在 API 请求中使用
prompt参数引用这个提示词。该参数对象包含三个可配置属性:id:提示词唯一标识符,可在 dashboard 中找到version:提示词的具体版本(默认为 dashboard 中设置的 current 版本)variables:用于替换提示词变量的值映射。变量值既可以是字符串,也可以是其他 Response 输入消息类型,例如input_image或input_file。完整 API 参考见此
使用提示词模板生成文本
字符串变量示例
javascript
import OpenAI from "openai";
const client = new OpenAI();
const response = await client.responses.create({
model: "gpt-5",
prompt: {
id: "pmpt_abc123",
version: "2",
variables: {
customer_name: "Jane Doe",
product: "40oz juice box"
}
}
});
console.log(response.output_text);python
from openai import OpenAI
client = OpenAI()
response = client.responses.create(
model="gpt-5",
prompt={
"id": "pmpt_abc123",
"version": "2",
"variables": {
"customer_name": "Jane Doe",
"product": "40oz juice box"
}
}
)
print(response.output_text)bash
curl https://xikapi.com/v1/responses \
-H "Authorization: Bearer $XIKAPI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-5",
"prompt": {
"id": "pmpt_abc123",
"version": "2",
"variables": {
"customer_name": "Jane Doe",
"product": "40oz juice box"
}
}
}'文件变量示例
javascript
import fs from "fs";
import OpenAI from "openai";
const client = new OpenAI();
// Upload a PDF, then reference it in a prompt variable
const file = await client.files.create({
file: fs.createReadStream("draconomicon.pdf"),
purpose: "user_data",
});
const response = await client.responses.create({
model: "gpt-5",
prompt: {
id: "pmpt_abc123",
variables: {
topic: "Dragons",
reference_pdf: {
type: "input_file",
file_id: file.id,
},
},
},
});
console.log(response.output_text);python
import openai, pathlib
client = openai.OpenAI()
# Upload a PDF, then reference it in a variable
file = client.files.create(
file=open("draconomicon.pdf", "rb"),
purpose="user_data",
)
response = client.responses.create(
model="gpt-5",
prompt={
"id": "pmpt_abc123",
"variables": {
"topic": "Dragons",
"reference_pdf": {
"type": "input_file",
"file_id": file.id,
},
},
},
)
print(response.output_text)bash
# Assume you already uploaded the PDF and received FILE_ID
curl https://xikapi.com/v1/responses \
-H "Authorization: Bearer $XIKAPI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-5",
"prompt": {
"id": "pmpt_abc123",
"variables": {
"topic": "Dragons",
"reference_pdf": {
"type": "input_file",
"file_id": "file-abc123"
}
}
}
}'下一步
现在你已经了解了文本输入与输出的基础知识,接下来可以继续查看以下资源: