Skip to content

文本生成

使用 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)。但不同模型往往需要不同的提示方式,才能发挥最佳效果。即使是同一模型家族下的不同快照版本,也可能表现不同。因此,在构建复杂应用时,我们强烈建议你:

  • 将生产环境固定到特定的模型快照版本,例如 gpt-5-2025-08-07,以确保行为一致
  • 构建评测(evals),持续衡量提示词表现,以便你在迭代提示词或升级模型版本时监控效果变化

接下来,我们来看看你可以用来构建提示词的一些工具与技巧。

选择模型与 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 模型规范说明了不同角色消息在优先级上的差异:

developeruserassistant
developer 消息是由应用开发者提供的指令,优先级高于用户消息。 user 消息是终端用户提供的指令,优先级低于 developer 消息。 模型生成的消息会带有 assistant 角色。

多轮对话通常会由上述这些类型的多条消息组成,同时也可能包含你与模型双方提供的其他内容类型。可进一步阅读对话状态管理

你也可以把 developeruser 消息理解为编程语言中的“函数定义”和“函数参数”:

  • developer 消息提供系统规则与业务逻辑,类似函数定义
  • user 消息提供输入与配置,类似函数调用时传入的参数

可复用提示词

在 OpenAI 控制台中,你可以创建可复用的prompts,并在 API 请求中直接引用,而不必把提示词内容硬编码在代码里。这样你可以更方便地构建、评测和迭代提示词,并且在不修改接入代码的前提下上线更好的提示词版本。

工作方式如下:

  1. dashboard 中创建一个可复用提示词,并使用像 这样的占位符
  2. 在 API 请求中使用 prompt 参数引用这个提示词。该参数对象包含三个可配置属性:
    • id:提示词唯一标识符,可在 dashboard 中找到
    • version:提示词的具体版本(默认为 dashboard 中设置的 current 版本)
    • variables:用于替换提示词变量的值映射。变量值既可以是字符串,也可以是其他 Response 输入消息类型,例如 input_imageinput_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"
        }
      }
    }
  }'

下一步

现在你已经了解了文本输入与输出的基础知识,接下来可以继续查看以下资源: