OpenAI 文本生成

2026-11-04 17:17 更新

通过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参考。

以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号