目录
本章节主要介绍四种大语言模型(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 OpenAI
client = OpenAI(
# This is the default and can be omitted
api_key=os.environ.get("OPENAI_API_KEY"),
)
# 导入所需库
# 注意,此处我们假设你已根据上文配置了 OpenAI API Key,如没有将访问失败
completion = client.chat.completions.create(
# 调用模型:ChatGPT-3.5
model="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 OpenAI
client = OpenAI(
# This is the default and can be omitted
api_key=os.environ.get("OPENAI_API_KEY"),
)
def gen_gpt_messages(prompt):
'''
构造 GPT 模型请求参数 messages
请求参数:
prompt: 对应的用户提示词
'''
messages = [{"role": "user", "content": prompt}]
return messages
def 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.content
return "generate answer error"
Copy to clipboardErrorCopied
get_completion("你好")
Copy to clipboardErrorCopied
'你好!有什么可以帮助你的吗?'
Copy to clipboardErrorCopied
在上述函数中,我们封装了 messages 的细节,仅使用 user prompt 来实现调用。在简单场景中,该函数足够满足使用需求。