青训营课程中,我们从《快速入门》开始,并且分析它的结构。
第一节
import os
from openai import OpenAI
# os.environ["OPENAI_API_KEY"] = '你的OpenAI API Key'
# os.environ["OPENAI_BASE_URL"] = 'OpenAI 的 API URL'
-
os模块:用于读取和操作操作系统的环境变量。 -
openai模块:导入了 OpenAI 的 Python SDK,并假设其中包含一个OpenAI类,用于与 OpenAI API 进行交互。 -
注释部分代码表示需要设置
OPENAI_API_KEY和OPENAI_BASE_URL环境变量。OPENAI_API_KEY是访问 OpenAI API 的密钥。OPENAI_BASE_URL是 OpenAI 服务的基础 URL,可能指向官方 URL 或企业内部部署的 API 网关。
-
这些环境变量的目的是配置 API 客户端所需的验证信息和访问路径。
client = OpenAI()
-
创建一个 OpenAI 客户端对象
client。 -
该对象内置了与 OpenAI API 交互的功能,比如发送请求、接收响应等。
response = client.completions.create(
model=os.environ.get("LLM_MODELEND"),
temperature=0.5,
max_tokens=100,
prompt="请给我的花店起个名",
)
print(response.choices[0].text.strip())
这是程序的核心部分,调用 OpenAI API 生成一个文本补全。以下是参数的含义:
-
model=os.environ.get("LLM_MODELEND")- 使用
os.environ.get("LLM_MODELEND")获取环境变量LLM_MODELEND,该变量指定了使用的模型名称(如"text-davinci-003"或"gpt-3.5-turbo")。 - 这允许模型灵活配置,支持切换不同版本。
- 使用
-
temperature=0.5- 控制生成文本的随机性。
- 值越低(如 0),生成的内容越确定;值越高(如 1),生成的内容越多样化。
-
max_tokens=100- 限制生成文本的最大长度(以 token 为单位,约等于单词数)。
-
prompt="请给我的花店起个名"- 提供模型的输入提示。模型根据这个提示生成相应的文本。
返回的结果存储在变量 response 中。
-
从 API 的响应中提取生成的文本:
response.choices:响应中的多个生成选项列表。[0]:选择第一个生成的结果。.text:获取生成的具体文本内容。.strip():去掉文本开头和结尾的多余空格或换行符。
-
最后,将处理后的生成结果打印到控制台。
整体逻辑流程
- 导入模块:引入系统和 OpenAI SDK。
- 配置环境变量:准备好 API 调用所需的密钥和基础 URL。
- 初始化客户端:创建 OpenAI 客户端实例。
- 调用生成方法:使用
completions.create方法发送请求,传入模型名称、提示词等参数。 - 处理并输出结果:从返回值中提取生成文本,去除多余符号并打印。
第二节
重复的部分不再赘述。
response = client.chat.completions.create(
model=os.environ.get("LLM_MODELEND"),
messages=[
{"role": "system", "content": "You are a creative AI."},
{"role": "user", "content": "请给我的花店起个名"},
],
temperature=0.8,
max_tokens=600,
)
这里是实现功能的核心代码。
调用了 client.chat.completions.create 方法,生成聊天对话内容。以下是参数的详细说明:
-
model=os.environ.get("LLM_MODELEND")- 通过环境变量
LLM_MODELEND获取模型名称,灵活选择不同的 OpenAI 模型(如"gpt-3.5-turbo"或"gpt-4")。 - 未设置时可能会导致错误,需要确保环境变量存在,或者提供默认值。
- 通过环境变量
-
messages-
这是聊天接口的核心参数,用于模拟对话历史。
-
格式为一个列表,每个元素是一个字典,包含以下关键字段:
-
"role":定义消息发送方,常见值包括:"system":系统角色,用于设定模型的行为或上下文信息。"user":用户角色,用于表示用户的输入。"assistant":AI 回复的角色,通常由 API 自动生成。
-
"content":消息的具体内容。
-
-
本例中,
messages列表有两个消息:{"role": "system", "content": "You are a creative AI."}:告知 AI 它是一个富有创造力的助手。{"role": "user", "content": "请给我的花店起个名"}:用户请求为花店命名。
-
-
temperature=0.8-
控制生成内容的随机性和创造性:
- 值越低(如 0.2):生成内容更具确定性,适合精确任务。
- 值越高(如 0.8):生成内容更具随机性和创造性,适合需要发散思维的任务。
-
-
max_tokens=600- 限制生成回复的最大长度(以 token 为单位,1 token 大致相当于 4 个字符或 0.75 个单词)。
- 设置为 600,允许较长的回复,适合生成多个命名建议或详细解释。
前后程序的区别
1. 调用的 API 接口类型
-
上一个程序:调用的是
client.completions.create接口,用于生成文本补全(completion)。- 适用场景:基于提示词生成一段连贯的文本结果(如写一段描述或完成某句话)。
- 工作方式:通过一个
prompt提供输入,模型以此生成一个连续的输出。
-
当前程序:调用的是
client.chat.completions.create接口,用于支持多轮对话(chat)。- 适用场景:设计模拟聊天交互的任务(如问答、角色扮演)。
- 工作方式:通过
messages提供对话上下文,模型根据历史消息生成更自然的聊天回复。
核心区别:
- 上一个程序:基于单个提示(
prompt),适合单一任务的文本生成。 - 当前程序:基于多轮对话(
messages),更适合动态交互和上下文依赖的任务。
2. 输入参数的形式
-
上一个程序:
response = client.completions.create( model=os.environ.get("LLM_MODELEND"), temperature=0.5, max_tokens=100, prompt="请给我的花店起个名", )- 使用
prompt:一个字符串作为输入(如 "请给我的花店起个名")。 - 上下文缺失:无法包含多轮对话,生成的内容只基于这一段提示。
- 使用
-
当前程序:
response = client.chat.completions.create( model=os.environ.get("LLM_MODELEND"), messages=[ {"role": "system", "content": "You are a creative AI."}, {"role": "user", "content": "请给我的花店起个名"}, ], temperature=0.8, max_tokens=600, )- 使用
messages:一个列表记录了对话的上下文(包含系统角色、用户输入等)。 - 上下文保留:支持多轮对话,模型可以基于之前的消息生成更连贯的回复。
- 使用
核心区别:
- 上一个程序以单个字符串为输入。
- 当前程序以对话历史(消息列表)为输入,具有上下文感知能力。
3. 模型的角色和行为设定
-
上一个程序:
- 没有显式设定 AI 的角色或行为。
- 模型只根据
prompt提供结果,输出的风格完全依赖提示词。
-
当前程序:
-
通过
messages中的"system"消息显式设定 AI 的角色:python 复制代码 {"role": "system", "content": "You are a creative AI."} -
模型行为会更贴近 "creative AI" 的角色设定,输出可能更加丰富和富有想象力。
-
核心区别:
- 上一个程序无法直接控制模型的角色或行为。
- 当前程序通过
system消息灵活设定模型的角色、任务背景等。