文章目录
api key设置
import os
import openai
# OPENAI_API_KEY是自己设定的环境变量名
openai.api_key = os.getenv("OPENAI_API_KEY")
# 明文
openai.api_key = *************
问题描述:您尝试读取环境变量 “OPENAI_API_KEY” 时,返回 None
或引发 KeyError
。
可能原因:
- 环境变量未正确设置。
- 您在设置环境变量后没有重新启动终端或 Python 环境。
解决:
重启一下python编辑器,如果还不行可以重启一下电脑。
设置环境变量apikey详见:
小白如何设置openai api key的环境变量 - 知乎 (zhihu.com)
测试
import openai
import os
openai.api_key = os.getenv("OPENAI_API_KEY")
# key = os.getenv("OPENAI_API_KEY")
prompt = '主题: 早餐 风\n只有两句话的句子:'
response = openai.Completion.create(
model='text-davinci-003',
prompt=prompt,
max_tokens=100,
temperature=0.9, # 新颖度
frequency_penalty=0.5, # 生成文本时控制模型是否应该生成高频词汇 设置为0.5,表示模型更有可能避免生成常见的单词。
)
print(response.choices[0].text)
调用两次,如果输入接口不一样,则说明调用成功。
查看所有模型
import os
import openai
openai.api_key = os.getenv("OPENAI_API_KEY")
openai.Model.list()
模型说明:
https://platform.openai.com/docs/models/overview
常用方法
ChatCompletion | Completion | |
---|---|---|
区别 | 专为生成对话和聊天场景而设计。 | 是一个通用的自然语言生成接口,支持生成各种类型的文本,包括段落、摘要、建议、答案等等。 |
适用场景 | ChatCompletion接口生成的文本通常会更具有人类对话的风格和语调,可以用于智能客服、聊天机器人等场景,以及在日常聊天中帮助用户自动生成回复。 | Completion接口的输出更为多样化,可能会更加严谨和专业,适用于各种文本生成场景,例如文章创作、信息提取、机器翻译、自然语言问题回答等等。 |
token
在 API 处理提示之前,输入将分解为tokens。这些tokens并不是在单词开始或结束的地方被分割的——tokens可以包括尾随空格甚至子单词。
详见:
(8条消息) tokens是什么以及如何计算_瓦匠工人的博客-CSDN博客
ChatCompletion
openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Who won the world series in 2020?"},
{"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},
{"role": "user", "content": "Where was it played?"}
]
)
role参数
-
system消息有助于设置聊天AI助手的行为。在上面的例子中,被指示“你是一个乐于助人的助手”。
-
user消息有助于指示助手。它们可以由应用程序的最终用户生成,也可以由开发人员设置为指令。
-
assistant消息有助于存储先前的响应。它们也可以由开发人员编写,以帮助提供所需行为的示例。
上下文引用
请求是无状态的,可以存储之前问题的答案(GhatGPT的回答).
在本次请求时,将之前的答案和本次的问题一起发送给GhatGPT
import openai
import os
openai.api_key = os.environ.get("OPENAI_API_KEY")
class Conversation:
def __init__(self, prompt, num_of_round):
self.prompt = prompt
self.num_of_round = num_of_round
self.messages = []
self.messages.append({"role": "system", "content": self.prompt})
def ask(self, question):
try:
self.messages.append({"role": "user", "content": question})
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=self.messages,
temperature=0.5,
max_tokens=2048,
top_p=1,
)
except Exception as e:
print(e)
return e
message = response["choices"][0]["message"]["content"]
self.messages.append({"role": "assistant", "content": message})
if len(self.messages) > self.num_of_round*2 + 1:
del self.messages[1:3] //Remove the first round conversation left.
return message
prompt:本次的问题
num_of_round:设置最大轮次,当超过后,截取最新的答案进行发送。
返回参数 finish_reason
{
'id': 'chatcmpl-6p9XYPYSTTRi0xEviKjjilqrWU2Ve',
'object': 'chat.completion',
'created': 1677649420,
'model': 'gpt-3.5-turbo',
'usage': {'prompt_tokens': 56, 'completion_tokens': 31, 'total_tokens': 87},
'choices': [
{
'message': {
'role': 'assistant',
'content': 'The 2020 World Series was played in Arlington, Texas at the Globe Life Field, which was the new home stadium for the Texas Rangers.'},
'finish_reason': 'stop',
'index': 0
}
]
}
- stop:API 返回完整的模型输出
- length:由于参数或令牌限制max_tokens模型输出不完整
- content_filter:由于内容过滤器中的标志而遗漏了内容
- null:API 响应仍在进行中或不完整
详见: https://time.geekbang.com/column/article/643915
https://github.com/xuwenhao/geektime-ai-course/blob/main/06_chatgpt_and_application.ipynb
OpenAI.Completion.create
import openai
import os
openai.api_key = os.getenv("OPENAI_API_KEY")
# key = os.getenv("OPENAI_API_KEY")
prompt = '主题: 早餐 风\n只有两句话的句子:'
response = openai.Completion.create(
model='text-davinci-003',
prompt=prompt,
max_tokens=100,
temperature=0.9, # 新颖度
frequency_penalty=0.5, # 生成文本时控制模型是否应该生成高频词汇 设置为0.5,表示模型更有可能避免生成常见的单词。
)
print(response.choices[0].text)
常用参数
prompt
你提问的内同或回答结果的提示文本。
数据类型可以是字符串或数组
max_tokens
生成结果时的最大token数,默认值为16。
不能超过模型的上下文长度(大多数模型的上下文长度为 2048 个token)
suffix
用于模型生成后添加一段固定的后缀。
如添加表示文本结束的符号
最终文本将输出类似的内容。
max_tokens:生成结果时的最大token数字,每个模型的上下文有不同的默认值。
temperature
生成文本的创造性
越高文本越新颖。
n
API返回模型的候选文本的数量。
会快速消耗token限额
输出如下:
for choice in response.choices:
print(choice.text)
stream
是否以流传输回部分进度。
输出
for chunk in response:
text = chunk["text"]
print(text)
frequency_penalty
生成文本时控制模型是否应该生成高频词汇
设置为0, ,表示完全忽略单词的出现频率。这将导致模型更有可能生成一些常见的单词。
设置为0.5,表示模型更有可能避免生成常见的单词。
设置为1,表示模型完全避免生成常见的单词。
详见:
OpenAI.Completion.create 接口参数说明 (qq.com)
来源:
OpenAI.ChatCompletion.create 接口参数说明 - 蝈蝈俊 - 博客园 (cnblogs.com)
https://time.geekbang.com/column/article/643915
https://github.com/xuwenhao/geektime-ai-course/blob/main/06_chatgpt_and_application.ipynb