TellWorldAI 世界档案
问档案English

首页›实践›实践

实践

用大模型 API 做文本生成应用

用 Python 的 openai 库写一个文本生成程序:密钥放在环境变量里,调用 Responses API,再通过提示词、输出长度和温度调整结果。

这篇适合谁,读完能做到什么

适合想把大模型接进自己的小工具或脚本、但还不知道从哪里下手的读者。读完后,你能用 Python 的 openai 库写出一个能生成文本的程序,把用户输入变成提示词的一部分,并调整输出的长度和随机程度。

文本生成应用是什么

平时常见的应用,常见的是命令行形式(你输入固定的命令)或图形界面(你点按钮、填表单)。命令行应用只能执行它支持的命令。[1] 文本生成应用则不同:用户可以直接用自然语言和它交互,不受固定命令或某一种输入语言的限制。它背后连着一个在海量信息上训练过的模型,而传统应用往往只能查到数据库里已有的内容。[1]

典型的例子包括:回答公司及其产品问题的聊天机器人、帮忙总结文本或写简历等文字的助手,以及辅助写代码的编程助手。[1]

准备:账号、Python 和 API 密钥

接入大模型通常有两条路。一条是直接调用 API,自己构造网络请求,把提示词发过去,再取回生成的文字;另一条是使用库,把这些 API 调用封装起来。本文用的是 Python 的 openai 库。[1]

如果使用 Azure OpenAI,需要准备:一个 Azure 账号,已获得 Azure OpenAI 的访问权限(写作时需要申请),安装好 Python,以及一个 Azure OpenAI Service 资源。[1][2] 在资源的「Keys and Endpoint」部分复制「Key 1」的值,就是 API 密钥。[1]

密钥不要写进代码。建议把它设成环境变量,例如 OPENAI_API_KEY:[1]

export OPENAI_API_KEY='sk-...'

安装和配置

用 pip 安装 openai 库:[1]

pip install openai

Azure OpenAI 现在属于 Microsoft Foundry。配置时使用标准的 OpenAI 客户端,指向 Azure OpenAI 的 /openai/v1/ 端点,这种写法可以配合 Responses API 使用,不需要单独管理 api_version。[1]

import os
from openai import OpenAI

client = OpenAI(
    api_key=os.environ["AZURE_OPENAI_API_KEY"],
    base_url=f"{os.environ['AZURE_OPENAI_ENDPOINT'].rstrip('/')}/openai/v1/",
)

这里 api_key 是 Azure 门户或 Microsoft Foundry 门户里的密钥,base_url 是 Foundry 资源的端点,末尾加上 /openai/v1/。[1] 如果用的是普通的 OpenAI,就不写 base_url,并且把部署名换成 gpt-5-mini 这样的模型名。[1]

第一个程序:生成一段文字

生成文本使用 Responses API 的 responses.create 方法,生成的文字通过 response.output_text 读取。[1] 下面的代码让模型续写一句话:

prompt = "Complete the following: Once upon a time there was a"

response = client.responses.create(
    model="gpt-5-mini",  # this is your model deployment name
    input=prompt,
    store=False,
)
print(response.output_text)

练习里把这段逻辑放进名为 app.py 的文件,并先用占位符代替密钥、端点和部署名:[1]

import os
from openai import OpenAI

client = OpenAI(
    api_key="<replace this value with your Azure OpenAI key>",
    base_url="<endpoint found in Azure Portal>/openai/v1/",
)
deployment_name = "<deployment name>"

# add your completion code
prompt = "Complete the following: Once upon a time there was a"

# make a request using the Responses API
response = client.responses.create(model=deployment_name, input=prompt, store=False)

# print response
print(response.output_text)

如果要做多轮对话,可以在 input 里放入一组消息。这部分会在后面的章节继续介绍。[1]

from openai import OpenAI

client = OpenAI(api_key="sk-...")

response = client.responses.create(model="gpt-5-mini", input="Hello world", store=False)
print(response.output_text)

从一个提示词到菜谱生成器

提示词能做的事很多:生成某种文字,比如诗歌或测验题;查找信息;生成代码。[1] 下面用一个菜谱例子看它如何逐步变成小工具。第一步,让模型给出五道用鸡肉、土豆和胡萝卜做的菜,并列出每道菜用到的全部原料。[1]

prompt = "Show me 5 recipes for a dish with the following ingredients: chicken, potatoes, and carrots. Per recipe, list all the ingredients used"

同一个程序每次运行的结果可能不同,因为大语言模型是非确定性的。[1]

接下来让输入可以变化。程序用 input() 读取菜谱数量和食材,再把它们填进提示词:[1]

no_recipes = input("No of recipes (for example, 5): ")

ingredients = input("List of ingredients (for example, chicken, potatoes, and carrots): ")

# interpolate the number of recipes into the prompt an ingredients
prompt = f"Show me {no_recipes} recipes for a dish with the following ingredients: {ingredients}. Per recipe, list all the ingredients used"

然后加一个过滤条件。程序再读取一个过滤值,例如素食、纯素或无麸质,并把它以「no」的形式加到提示词末尾:[1]

filter = input("Filter (for example, vegetarian, vegan, or gluten-free): ")

prompt = f"Show me {no_recipes} recipes for a dish with the following ingredients: {ingredients}. Per recipe, list all the ingredients used, no {filter}"

过滤条件要写得足够清楚。例子里,过滤条件写的是「no milk」,结果仍然出现了加了帕尔马干酪碎的菜。对乳糖不耐受的人来说,可能还要把奶酪也过滤掉。[1]

最后是购物清单。这里没有把所有要求塞进一个提示词,而是拆成两步:把第一步的结果作为上下文交给第二个提示词,要求列出购物清单,并且不包括用户家里已有的食材。[1]

old_prompt_result = response.output_text
prompt = "Produce a shopping list for the generated recipes and please don't include ingredients that I already have."

new_prompt = f"{old_prompt_result} {prompt}"
response = client.responses.create(model=deployment_name, input=new_prompt, max_output_tokens=1200, store=False)

# print response
print("Shopping list:")
print(response.output_text)

调整输出长度、随机程度和密钥

密钥和代码分开。 推荐用 python-dotenv 从 .env 文件中读取变量,而不是把密钥写进代码。[1]

import os
from dotenv import load_dotenv
from openai import OpenAI

load_dotenv()

client = OpenAI(api_key=os.environ["OPENAI_API_KEY"])

控制输出长度。 max_output_tokens 参数限制模型生成的 token 数。例子把它设为 100。[1]

response = client.responses.create(model=deployment, input=prompt, max_output_tokens=100, store=False)

token 是要花钱的,所以建议尽量节省,比如把提示词写得能用更少的 token 完成任务。[1]

控制随机程度。 temperature 参数越高,输出越随机;越低,输出越可预测。例子设为 0.5,越接近 1.0,输出越多样。[1]

response = client.responses.create(model=deployment, input=prompt, temperature=0.5, store=False)

推理模型不支持 temperature。 GPT-5 系列和 o 系列是推理模型,它们不支持 temperature 和 top_p,max_tokens 也要换成 max_output_tokens。把 temperature 发给 gpt-5-mini,会得到「不支持该参数」之类的错误。[1] 对这类模型,建议通过提示词工程和推理控制来调整输出。推理控制会在推理深度与延迟、成本之间做取舍。[1]

如果想亲手体验温度的效果,可以换一个仍支持采样参数的模型。Microsoft Foundry 模型目录里有开放模型 Llama-3.3-70B-Instruct;Llama、Mistral、Phi 等模型也仍支持 temperature 和 top_p。[1]

限制和常见问题

  • 结果不稳定:同一个程序每次运行的输出都可能不同,需要人工检查。[1]
  • 过滤不完整:过滤条件要写具体,像「no milk」这样的条件并不会排除所有含奶制品的菜。[1]
  • 费用:token 要花钱,提示词和输出长度都会影响成本。[1]

练习方向

可以尝试三个练习:继续改进菜谱生成器,试试不同的温度和提示词;做一个「学习伙伴」,回答关于 Python 某个主题的问题;做一个历史机器人,让它扮演某位历史人物,回答关于其生平的问题。[1] 挑战是分别把温度设为 0、0.5 和 1 做比较。0 最不多样,1 最多样,看看哪个值最适合你的应用。[1]

下一步

想了解 Azure OpenAI 的访问申请和资源创建,可以阅读 Microsoft Learn 的概述文档。[2]

本文改编自 Microsoft 开源课程《Generative AI for Beginners》第 6 课《Building Text Generation Applications》[1],原文以 MIT 许可证发布。

来源

  1. 1
    Building Text Generation ApplicationsMicrosoft generative-ai-for-beginners (MIT)
  2. 2
    Azure OpenAI overviewMicrosoft Learn

引用本页: 用大模型 API 做文本生成应用. TellWorld, https://www.tellworld.net/zh/practice/practice-genai-text-generation-app. 更新于 2026-11-14

相关动态