原文出处:Building Text Generation Applications 原作者:Microsoft · 许可证:MIT License 中文译本由诸葛AI学院整理,仅供学习参考,版权归原作者与微软所有。
构建文本生成应用(上):openai 库与第一个应用
走到这里,你已经见过提示词(prompt)这样的核心概念,甚至还有一门叫"提示工程"(prompt engineering)的学问。你用得到的很多工具,像 ChatGPT、Office 365、Microsoft Power Platform 等等,都支持靠提示词来完成事情。
要给应用加上这样的体验,你得理解提示词、补全(completion)这些概念,再选定一个库来干活。这一课讲的就是这些。
引言
在这节课里,你会:
- 认识 openai 库和它的核心概念。
- 用 openai 做一个文本生成应用。
- 理解怎么靠提示词、温度(temperature)、令牌(token)这些概念搭起一个文本生成应用。
学习目标
学完这节课,你将能够:
- 说清楚什么是文本生成应用。
- 用 openai 构建一个文本生成应用。
- 配置应用多用或少用令牌,还能调整温度,让输出更多样。
什么是文本生成应用?
平时做一个应用,总得有一种界面,常见的像下面这样:
- 命令行式。控制台应用就是那种你输入一条命令、它去执行任务的应用,比如
git。 - 用户界面(UI)。有些应用带图形用户界面(GUI),你点按钮、输文字、选选项。
控制台和界面应用有天花板
对比一下在命令式应用里输入命令这件事:
- 受限。不能想输什么命令就输什么,只有应用支持的命令才算数。
- 绑定语言。有些应用支持多种语言,但默认情况下应用是为某一种语言构建的,哪怕事后能再补语言支持。
文本生成应用的好处
那文本生成应用有什么不同?
在文本生成应用里,你的自由度高得多:不被一组命令或某种输入语言框住,可以直接用自然语言和应用对话。还有一个好处:你打交道的数据源是在海量语料上训练出来的,而传统应用往往被数据库里已有的内容框住。
文本生成应用能做点什么?
能做的东西很多。比如:
- 聊天机器人。回答某个主题的问题,比如你们公司和自家产品的问题,就很合适。
- 小帮手。大语言模型(LLM,Large Language Model)擅长总结文本、从文本里提炼看法、生成简历这类的文字。
- 代码助手。取决于你用的语言模型,可以做一个帮你写代码的助手。比如用 GitHub Copilot 这样的产品,再配上 ChatGPT 来帮你写代码。
怎么开始?
你得找到接入大语言模型的办法,通常是两条路:
- 用 API。你自己构造网络请求,把提示词发过去,拿回生成的文本。
- 用库。库把 API 调用封装起来,用起来更省事。
库 / SDK
接入大语言模型的常见库有这么几个:
- openai。这个库连模型、发提示词都很方便。
还有工作在更高层的库:
- Langchain。名气很大,支持 Python。
- Semantic Kernel。微软出的库,支持 C#、Python 和 Java。
用 openai 搭第一个应用
来看看第一个应用怎么搭:要哪些库、要装多少东西。
安装 openai
和 OpenAI 或 Azure OpenAI 交互的库市面上很多,编程语言也能选 C#、Python、JavaScript、Java 等等。我们选用 openai 这个 Python 库,用 pip 来装:
bash
pip install openai
创建资源
你需要完成下面几步:
- 在 Azure 注册账号 https://azure.microsoft.com/free/。
- 获得 Azure OpenAI 的访问权限。到 https://learn.microsoft.com/azure/ai-foundry/openai/overview#how-do-i-get-access-to-azure-openai 提交申请。
[!NOTE] 写这节课的时候,Azure OpenAI 需要先申请才能获得访问权限。
- 安装 Python https://www.python.org/
- 已经建好一个 Azure OpenAI 资源。创建方法见这份创建资源指南。
找到 API 密钥和端点
到这一步,你要告诉 openai 库该用哪个 API 密钥(API key)。找密钥的办法:进入你的 Azure OpenAI 资源的 "Keys and Endpoint"(密钥与端点)一节,复制 "Key 1" 的值。
这些信息抄好之后,接着让库去用它。
[!NOTE] API 密钥和你的代码最好分开存放。可以用环境变量来做这件事。
- 把环境变量
OPENAI_API_KEY设成你的密钥:export OPENAI_API_KEY='sk-...'
配置 Azure
如果你用的是 Azure OpenAI(现在归入 Microsoft Foundry),配置方法如下。我们把标准的 OpenAI 客户端指向 Azure OpenAI 的 /openai/v1/ 端点(endpoint),它兼容 Responses API,也不需要 api_version:
```python 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/。这个稳定的 v1 端点在 OpenAI 和 Azure OpenAI 上都通用,不用管理api_version。
[!NOTE]
os.environ用来读取环境变量,比如AZURE_OPENAI_API_KEY和AZURE_OPENAI_ENDPOINT。这些变量可以在终端里设置,或者用dotenv这类库来加载。
生成文本
生成文本要用 Responses API 的 responses.create 方法。举个例子:
```python prompt = "Complete the following: Once upon a time there was a"
response = client.responses.create( model="gpt-5-mini", # 这里是你的模型部署名称 input=prompt, store=False, ) print(response.output_text) ```
上面的代码创建了一次响应,传入要用的模型和提示词,然后用 response.output_text 把生成的文本打印出来。
多轮对话
Responses API 单轮文本生成和多轮聊天机器人都合适。往 input 里传一个消息列表,就能把对话一轮轮接下去:
```python 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) ```
这块功能在后面的章节还会细讲。
练习:你的第一个文本生成应用
openai 的安装和配置学完了,该动手搭第一个文本生成应用。按下面步骤来:
- 建一个虚拟环境,装上 openai:
bash
python -m venv venv
source venv/bin/activate
pip install openai
[!NOTE] Windows 下把
source venv/bin/activate换成venv\Scripts\activate。[!NOTE] Azure OpenAI 密钥的找法:打开 https://portal.azure.com/,搜索
Open AI,选中Open AI resource(OpenAI 资源),再进Keys and Endpoint,复制Key 1的值。
- 新建一个 app.py 文件,写入下面的代码:
```python import os from openai import OpenAI
client = OpenAI(
api_key="
# 在这里加上你的文本生成代码 prompt = "Complete the following: Once upon a time there was a"
# 用 Responses API 发起请求 response = client.responses.create(model=deployment_name, input=prompt, store=False)
# 打印响应 print(response.output_text) ```
[!NOTE] 如果你用的是 OpenAI 本体(不是 Azure),客户端写成
client = OpenAI(api_key="<replace this value with your OpenAI key>")(不带base_url),并且传入gpt-5-mini这样的模型名,而不是部署名。
你应该能看到类似这样的输出(模型输出为英文,原样保留):
```output very unhappy _____.
Once upon a time there was a very unhappy mermaid. ```