本周尝试进行多种语言模型接入,使我们的在线对话功能可以支持其他大模型如文心一言、同义千问等,以下是目前查询学习的方法:
使用 LLM API
主要是另外三种大语言模型(ChatGPT、文心一言、讯飞星火)的 API 申请流程和 Python 版本的原生 API 调用方法。
1.1 API 申请指引
获取并配置 OpenAI API key
OpenAI API 调用服务是付费的,每一个开发者都需要首先获取并配置 OpenAI API key,才能在自己构建的应用中访问 ChatGPT。我们将在这部分简述如何获取并配置 OpenAI API key。选择 API
,点击 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'
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!"} ] )
调用该 API 会返回一个 ChatCompletion 对象,其中包括了回答文本、创建时间、id 等属性。一般需要的是回答文本,也就是回答对象中的 content 信息。
2. 使用文心一言
2.1 API 申请指引
获取密钥
将获取到的 API Key
、Secret Key
填写至 .env
文件的 QIANFAN_AK
和 QIANFAN_SK
参数。如果你使用的是安全认证的参数校验,需要在百度智能云控制台-用户账户-安全认证页,查看 Access Key
、Secret Key
,并将获取到的参数相应的填写到 .env
文件的 QIANFAN_ACCESS_KEY
、QIANFAN_SECRET_KEY
。
然后执行以下代码,将密钥加载到环境变量中。
from dotenv import load_dotenv, find_dotenv # 读取本地/项目的环境变量。 # find_dotenv() 寻找并定位 .env 文件的路径 # load_dotenv() 读取该 .env 文件,并将其中的环境变量加载到当前的运行环境中 # 如果你设置的是全局的环境变量,这行代码则没有任何作用。 _ = load_dotenv(find_dotenv())
2.2 调用文心千帆 API
使用 SDK,封装 get_completion
函数供后续使用。
import qianfan def gen_wenxin_messages(prompt): ''' 构造文心模型请求参数 messages 请求参数: prompt: 对应的用户提示词 ''' messages = [{"role": "user", "content": prompt}] return messages def get_completion(prompt, model="ERNIE-Bot", temperature=0.01): ''' 获取文心模型调用结果 请求参数: prompt: 对应的提示词 model: 调用的模型,默认为 ERNIE-Bot,也可以按需选择 Yi-34B-Chat 等其他模型 temperature: 模型输出的温度系数,控制输出的随机程度,取值范围是 0~1.0,且不能设置为 0。温度系数越低,输出内容越一致。 ''' chat_comp = qianfan.ChatCompletion() message = gen_wenxin_messages(prompt) resp = chat_comp.do(messages=message, model=model, temperature = temperature, system="你是一名个人助理-小鲸鱼") return resp["result"]
免费用户在使用上述函数时,在入参中指定一个免费的模型(例如 Yi-34B-Chat
)再运行
3. 使用讯飞星火
通过 SDK 方式调用
执行以下代码,将密钥加载到环境变量中。
import os from dotenv import load_dotenv, find_dotenv # 读取本地/项目的环境变量。 # find_dotenv() 寻找并定位 .env 文件的路径 # load_dotenv() 读取该 .env 文件,并将其中的环境变量加载到当前的运行环境中 # 如果你设置的是全局的环境变量,这行代码则没有任何作用。 _ = load_dotenv(find_dotenv())
使用 SDK,封装一个 get_completion
函数供后续使用。
from sparkai.llm.llm import ChatSparkLLM, ChunkPrintHandler from sparkai.core.messages import ChatMessage def gen_spark_params(model): ''' 构造星火模型请求参数 ''' spark_url_tpl = "wss://spark-api.xf-yun.com/{}/chat" model_params_dict = { # v1.5 版本 "v1.5": { "domain": "general", # 用于配置大模型版本 "spark_url": spark_url_tpl.format("v1.1") # 云端环境的服务地址 }, # v2.0 版本 "v2.0": { "domain": "generalv2", # 用于配置大模型版本 "spark_url": spark_url_tpl.format("v2.1") # 云端环境的服务地址 }, # v3.0 版本 "v3.0": { "domain": "generalv3", # 用于配置大模型版本 "spark_url": spark_url_tpl.format("v3.1") # 云端环境的服务地址 }, # v3.5 版本 "v3.5": { "domain": "generalv3.5", # 用于配置大模型版本 "spark_url": spark_url_tpl.format("v3.5") # 云端环境的服务地址 } } return model_params_dict[model] def gen_spark_messages(prompt): ''' 构造星火模型请求参数 messages 请求参数: prompt: 对应的用户提示词 ''' messages = [ChatMessage(role="user", content=prompt)] return messages def get_completion(prompt, model="v3.5", temperature = 0.1): ''' 获取星火模型调用结果 请求参数: prompt: 对应的提示词 model: 调用的模型,默认为 v3.5,也可以按需选择 v3.0 等其他模型 temperature: 模型输出的温度系数,控制输出的随机程度,取值范围是 0~1.0,且不能设置为 0。温度系数越低,输出内容越一致。 ''' spark_llm = ChatSparkLLM( spark_api_url=gen_spark_params(model)["spark_url"], spark_app_id=os.environ["SPARK_APPID"], spark_api_key=os.environ["SPARK_API_KEY"], spark_api_secret=os.environ["SPARK_API_SECRET"], spark_llm_domain=gen_spark_params(model)["domain"], temperature=temperature, streaming=False, ) messages = gen_spark_messages(prompt) handler = ChunkPrintHandler() # 当 streaming设置为 False的时候, callbacks 并不起作用 resp = spark_llm.generate([messages], callbacks=[handler]) return resp