【动手学大模型开发】使用 LLM API:ChatGPT
目录
1. 使用 ChatGPT
1.1 API 申请指引
获取并配置 OpenAI API key
1.2 调用 OpenAI API
本章节主要介绍四种大语言模型(ChatGPTAPI、文心一言、讯飞星火、智谱 GLM)的 API 申请指引和 Python 版本的原生 API 调用方法,读者按照实际情况选择一种自己可以申请的 API 进行阅读学习即可。如果你需要在 LangChain 中使用 LLM,可以参照LLM 接入 LangChain中的调用方式。
- ChatGPT:推荐可科学上网的读者使用;
- 文心一言:当前无赠送新用户 tokens 的活动,推荐已有文心 tokens 额度用户和付费用户使用;
- 讯飞星火:新用户赠送 tokens,推荐免费用户使用;
- 智谱 GLM:新用户赠送 tokens,推荐免费用户使用。
1. 使用 ChatGPT
ChatGPT,发布于 2022 年 11 月,是目前火热出圈的大语言模型(Large Language Model,LLM)的代表产品。在 2022 年底,也正是 ChatGPT 的惊人表现引发了 LLM 的热潮。时至目前,由 OpenAI 发布的 GPT-4 仍然是 LLM 性能上限的代表,ChatGPT 也仍然是目前使用人数最多、使用热度最大、最具发展潜力的 LLM 产品。事实上,在圈外人看来,ChatGPT 即是 LLM 的代称。
OpenAI 除发布了免费的 Web 端产品外,也提供了多种 ChatGPT API,支持开发者通过 Python 或 Request 请求来调用 ChatGPT,向自己的服务中嵌入 LLM 的强大能力。可选择的主要模型包括 ChatGPT-3.5 和 GPT-4,并且每个模型也存在多个上下文版本,例如 ChatGPT-3.5 就有最原始的 4K 上下文长度的模型,也有 16K 上下文长度的模型 gpt-turbo-16k-0613。
1.1 API 申请指引
获取并配置 OpenAI API key
OpenAI API 调用服务是付费的,每一个开发者都需要首先获取并配置 OpenAI API key,才能在自己构建的应用中访问 ChatGPT。我们将在这部分简述如何获取并配置 OpenAI API key。
在获取 OpenAI API key 之前我们需要在OpenAI 官网注册一个账号。这里假设我们已经有了 OpenAI 账号,在OpenAI 官网登录,登录后如下图所示:
我们选择 API
,然后点击左侧边栏的 API keys
,如下图所示:
点击 Create new secret key
按钮创建 OpenAI API key ,我们将创建好的 OpenAI API key 复制以此形式 OPENAI_API_KEY="sk-..."
保存到 .env
文件中,并将 .env
文件保存在项目根目录下。
下面是读取 .env
文件的代码:
import os
from dotenv import load_dotenv, find_dotenv# 读取本地/项目的环境变量。# find_dotenv() 寻找并定位 .env 文件的路径
# load_dotenv() 读取该 .env 文件,并将其中的环境变量加载到当前的运行环境中
# 如果你设置的是全局的环境变量,这行代码则没有任何作用。
_ = load_dotenv(find_dotenv())# 如果你需要通过代理端口访问,还需要做如下配置
os.environ['HTTPS_PROXY'] = 'http://127.0.0.1:7890'
os.environ["HTTP_PROXY"] = 'http://127.0.0.1:7890'
Copy to clipboardErrorCopied
1.2 调用 OpenAI API
调用 ChatGPT 需要使用 ChatCompletion API,该 API 提供了 ChatGPT 系列模型的调用,包括 ChatGPT-3.5,GPT-4 等。
ChatCompletion API 调用方法如下:
from openai import OpenAIclient = OpenAI(# This is the default and can be omittedapi_key=os.environ.get("OPENAI_API_KEY"),
)# 导入所需库
# 注意,此处我们假设你已根据上文配置了 OpenAI API Key,如没有将访问失败
completion = client.chat.completions.create(# 调用模型:ChatGPT-3.5model="gpt-3.5-turbo",# messages 是对话列表messages=[{"role": "system", "content": "You are a helpful assistant."},{"role": "user", "content": "Hello!"}]
)
Copy to clipboardErrorCopied
调用该 API 会返回一个 ChatCompletion 对象,其中包括了回答文本、创建时间、id 等属性。我们一般需要的是回答文本,也就是回答对象中的 content 信息。
completion
Copy to clipboardErrorCopied
ChatCompletion(id='chatcmpl-9FA5aO72SD9X0XTpc1HCNZkSFCf7C', choices=[Choice(finish_reason='stop', index=0, logprobs=None, message=ChatCompletionMessage(content='Hello! How can I assist you today?', role='assistant', function_call=None, tool_calls=None))], created=1713400730, model='gpt-3.5-turbo-0125', object='chat.completion', system_fingerprint='fp_c2295e73ad', usage=CompletionUsage(completion_tokens=9, prompt_tokens=19, total_tokens=28))
Copy to clipboardErrorCopied
print(completion.choices[0].message.content)
Copy to clipboardErrorCopied
Hello! How can I assist you today?
Copy to clipboardErrorCopied
此处我们详细介绍调用 API 常会用到的几个参数:
· model,即调用的模型,一般取值包括“gpt-3.5-turbo”(ChatGPT-3.5)、“gpt-3.5-turbo-16k-0613”(ChatGPT-3.5 16K 版本)、“gpt-4”(ChatGPT-4)。注意,不同模型的成本是不一样的。· messages,即我们的 prompt。ChatCompletion 的 messages 需要传入一个列表,列表中包括多个不同角色的 prompt。我们可以选择的角色一般包括 system:即前文中提到的 system prompt;user:用户输入的 prompt;assistant:助手,一般是模型历史回复,作为提供给模型的参考内容。· temperature,温度。即前文中提到的 Temperature 系数。· max_tokens,最大 token 数,即模型输出的最大 token 数。OpenAI 计算 token 数是合并计算 Prompt 和 Completion 的总 token 数,要求总 token 数不能超过模型上限(如默认模型 token 上限为 4096)。因此,如果输入的 prompt 较长,需要设置较大的 max_token 值,否则会报错超出限制长度。
Copy to clipboardErrorCopied
OpenAI 提供了充分的自定义空间,支持我们通过自定义 prompt 来提升模型回答效果,如下是一个简单的封装 OpenAI 接口的函数,支持我们直接传入 prompt 并获得模型的输出:
from openai import OpenAIclient = OpenAI(# This is the default and can be omittedapi_key=os.environ.get("OPENAI_API_KEY"),
)def gen_gpt_messages(prompt):'''构造 GPT 模型请求参数 messages请求参数:prompt: 对应的用户提示词'''messages = [{"role": "user", "content": prompt}]return messagesdef get_completion(prompt, model="gpt-3.5-turbo", temperature = 0):'''获取 GPT 模型调用结果请求参数:prompt: 对应的提示词model: 调用的模型,默认为 gpt-3.5-turbo,也可以按需选择 gpt-4 等其他模型temperature: 模型输出的温度系数,控制输出的随机程度,取值范围是 0~2。温度系数越低,输出内容越一致。'''response = client.chat.completions.create(model=model,messages=gen_gpt_messages(prompt),temperature=temperature,)if len(response.choices) > 0:return response.choices[0].message.contentreturn "generate answer error"
Copy to clipboardErrorCopied
get_completion("你好")
Copy to clipboardErrorCopied
'你好!有什么可以帮助你的吗?'
Copy to clipboardErrorCopied
在上述函数中,我们封装了 messages 的细节,仅使用 user prompt 来实现调用。在简单场景中,该函数足够满足使用需求。