动手学大模型应用开发,第2天:调用大模型(上)
一、基本概念
1. Prompt
Prompt 最初是 NLP(自然语言处理)研究者为下游任务设计出来的一种任务专属的输入模板,类似于一种任务(例如:分类,聚类等)会对应一种 Prompt。在 ChatGPT 推出并获得大量应用之后,Prompt 开始被推广为给大模型的所有输入。即,我们每一次访问大模型的输入为一个 Prompt,而大模型给我们的返回结果则被称为 Completion。
例如,在下面示例中,我们给 ChatGPT 的提问 “NLP 中的 Prompt 指什么”是我们的提问,其实也就是我们此次的 Prompt;而 ChatGPT 的返回结果就是此次的 Completion。也就是对于 ChatGPT 模型,该 Prompt 对应的 Completion 是下图的展示。
后续我们都将会使用 Prompt 替代给 LLM 的输入,使用 Completion 替代 LLM 的输出。同时,我们会结合具体案例,介绍如何设计 Prompt 能够充分发挥 LLM 的能力。
2. Temperature
LLM 生成是具有随机性的,在模型的顶层通过选取不同预测概率的预测结果来生成最后的结果。我们一般可以通过控制 Temperature 参数来控制 LLM 生成结果的随机性与创造性。
Temperature 一般取值在 0~1 之间,当取值较低接近0时,预测的随机性会较低,产生更保守、可预测的文本,不太可能生成意想不到或不寻常的词。当取值较高接近1时,预测的随机性会较高,所有词被选择的可能性更大,会产生更有创意、多样化的文本,更有可能生成不寻常或意想不到的词。
例如,当我们使用 ChatGPT 要求其为我们想一个关于跨语言模型的硕士毕业论文选题,当我们将 Temperature 设置为0时,模型回复为:
题目:基于跨语言模型的机器翻译性能优化研究 摘要:随着全球化的发展,跨语言交流的需求日益增长。机器翻译作为一种自动化翻译技术,为跨语言交流提供了便利。然而,由于语言之间的差异性,机器翻译系统在不同语言对之间的性能存在差异。本论文旨在通过研究跨语言模型,探索如何优化机器翻译的性能,提高翻译质量和准确性。 关键词:跨语言模型,机器翻译,性能优化,翻译质量,准确性 1. 引言 1.1 研究背景和意义 1.2 国内外研究现状 1.3 研究目标和内容 2. 跨语言模型的原理和方法 2.1 传统机器翻译方法 2.2 跨语言模型的基本原理 2.3 跨语言模型的常用方法和技术 3. 跨语言模型在机器翻译中的应用 3.1 跨语言模型在机器翻译中的优势和挑战 3.2 跨语言模型在不同语言对上的性能表现比较 3.3 跨语言模型在特定领域机器翻译中的应用案例分析 4. 跨语言模型的性能优化方法 4.1 数据预处理和特征选择 4.2 模型参数调优和训练策略 4.3 跨语言模型与其他技术的结合应用 5. 实验设计与结果分析 5.1 实验设计和数据集介绍 5.2 实验结果分析和对比 5.3 实验结果的可行性和可靠性验证 6. 结论与展望 6.1 研究工作总结 6.2 存在的问题和不足 6.3 进一步研究方向和展望 参考文献 注:以上仅为一个选题示例,具体选题应根据个人兴趣和研究背景进行调整和修改。
当我们将 Temperature 设置为1时,模型回复为:
以下是关于跨语言模型的几个硕士毕业论文选题建议: 1. 跨语言文本分类模型的比较和优化——通过比较不同跨语言模型的性能,分析其在不同语言之间的适应性和准确性,并尝试优化现有模型,提高跨语言文本分类的效果。 2. 基于跨语言模型的机器翻译性能分析——通过比较不同跨语言模型在机器翻译任务中的表现,研究不同语言之间的短板和优势,并探讨如何针对性地改进跨语言机器翻译的性能。 3. 跨语言情感分析模型的构建与应用——使用跨语言模型构建情感分析模型,通过比较模型在不同语言上的准确性和一致性,分析不同语言中情感表达的差异,并探索在多语言场景下的情感分析应用。 4. 多任务学习下的跨语言模型训练——探索多任务学习下跨语言模型的训练方法和效果,通过同时训练多个任务来提高跨语言模型的泛化能力和性能,并验证多任务学习对跨语言模型的影响。 5. 跨语言问答系统的构建与评估——构建跨语言问答系统,通过跨语言模型实现问题的自动解析和答案的生成,并评估系统在多语言环境下的效果和可用性。 6. 基于预训练的跨语言模型的应用于语音识别——将预训练的跨语言模型应用于语音识别任务中,研究其对语音识别准确性和多语种适应性的影响,并比较不同模型对多语种语音数据的处理能力。 选择适合自己兴趣和研究方向的选题,并与导师进行深入讨论和确认。
对于不同的问题与应用场景,我们可能需要设置不同的 Temperature。例如,在本教程搭建的个人知识库助手项目中,我们一般将 Temperature 设置为0,从而保证助手对知识库内容的稳定使用,规避错误内容、模型幻觉;在产品智能客服、科研论文写作等场景中,我们同样更需要稳定性而不是创造性;但在个性化 AI、创意营销文案生成等场景中,我们就更需要创意性,从而更倾向于将 Temperature 设置为较高的值。
3. System Prompt
System Prompt 是随着 ChatGPT API 开放并逐步得到大量使用的一个新兴概念,事实上,它并不在大模型本身训练中得到体现,而是大模型服务方为提升用户体验所设置的一种策略。
具体来说,在使用 ChatGPT API 时,你可以设置两种 Prompt:一种是 System Prompt,该种 Prompt 内容会在整个会话过程中持久地影响模型的回复,且相比于普通 Prompt 具有更高的重要性;另一种是 User Prompt,这更偏向于咱们平时的 Prompt,即需要模型做出回复的输入。
我们一般设置 System Prompt 来对模型进行一些初始化设定,例如,我们可以在 System Prompt 中给模型设定我们希望它具备的人设如一个个人知识库助手等。System Prompt 一般在一个会话中仅有一个。在通过 System Prompt 设定好模型的人设或是初始设置后,我们可以通过 User Prompt 给出模型需要遵循的指令。例如,当我们需要一个幽默风趣的个人知识库助手,并向这个助手提问我今天有什么事时,可以如下地构造 Prompt:
{
"system prompt":"你是一个幽默风趣的个人知识库助手,可以根据给定的知识库内容回答用户的提问,注意,你的回答风格应是幽默风趣的",
"user prompt":"我今天有什么事务?"
}
通过如上 Prompt 的构造,我们可以让模型以幽默风趣的风格回答用户提出的问题。注意,如果有多个用户问题,那么我们只需要添加对应数量的 User Prompt 即可,System Prompt 仅需构造一个。
二、调用 ChatGPT
1. ChatGPT
ChatGPT,发布于2022年11月,是目前火热出圈的大语言模型(Large Language Model,LLM)的代表产品。在2022年底,也正是 ChatGPT 的惊人表现引发了 LLM 的热潮。时至目前,由 OpenAI 发布的 ChatGPT-4 仍然是 LLM 性能上限的代表,ChatGPT 也仍然是目前使用人数最多、使用热度最大、最具发展潜力的 LLM 产品。事实上,在圈外人看来,ChatGPT 即是 LLM 的代称。
OpenAI 除发布了免费的 Web 端产品外,也提供了多种 ChatGPT API,支持开发者通过 Python 或 Request 请求来调用 ChatGPT,向自己的服务中嵌入 LLM 的强大能力。可选择的主要模型包括 ChatGPT-3.5 和 ChatGPT-4,但每个模型也存在多个上下文版本,例如 ChatGPT-3.5 就有最原始的 4K 上下文长度的模型,也有 16K 上下文长度的模型 gpt-turbo-16k-0613。
在本章节,我们将主要讲述两种通过 Python 代码调用 ChatGPT API 的方法:直接调用 OpenAI 的原生接口,或是基于 LangChain 调用 ChatGPT API。
2. 获取并配置 OpenAI API Key
OpenAI API 服务是付费的,每一个开发者都需要首先获取并配置 OpenAI API Key,才能在自己构建的应用中访问 ChatGPT。我们将在这部分简述如何获取并配置 OpenAI API Key。
在获取OpenAI API key之前我们需要openai官网中注册一个账号。这里假设我们已经有了openai账号,先在openai官网登录,登录后如下图所示:
我们选择API
,然后点击右上角的头像,选择View API keys
,如下图所示:
点击Create new secret key
按钮创建OpenAI API key,我们将创建好的OpenAI API key复制以此形式OPENAI_API_KEY="sk-..."
保存到.env
文件中,并将.env
文件保存在项目根目录下。
下面是读取.env
文件的代码
import os
import openai
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'
# 获取环境变量 OPENAI_API_KEY
openai.api_key = os.environ['OPENAI_API_KEY']
3. 调用 OpenAI 原生接口
调用 ChatGPT 需要使用 ChatCompletion API,该 API 提供了 ChatGPT 系列模型的调用,包括 ChatGPT-3.5,ChatGPT-4 等。
ChatCompletion API 调用方法如下:
import openai
# 导入所需库
# 注意,此处我们假设你已根据上文配置了 OpenAI API Key,如没有将访问失败
completion = openai.ChatCompletion.create(
# 创建一个 ChatCompletion
# 调用模型:ChatGPT-3.5
model="gpt-3.5-turbo",
# message 是你的 prompt
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Hello!"}
]
)
调用该 API 会返回一个 ChatCompletion 对象,其中包括了回答文本、创建时间、ID等属性。我们一般需要的是回答文本,也就是回答对象中的 content 信息。
completion
<OpenAIObject chat.completion id=chatcmpl-80QUFny7lXqOcfu5CZMRYhgXqUCv0 at 0x7f1fbc0bd770> JSON: {
"choices": [
{
"finish_reason": "stop",
"index": 0,
"message": {
"content": "Hello! How can I assist you today?",
"role": "assistant"
}
}
],
"created": 1695112507,
"id": "chatcmpl-80QUFny7lXqOcfu5CZMRYhgXqUCv0",
"model": "gpt-3.5-turbo-0613",
"object": "chat.completion",
"usage": {
"completion_tokens": 9,
"prompt_tokens": 19,
"total_tokens": 28
}
}
print(completion["choices"][0]["message"]["content"])
Hello! How can I assist you today?
此处我们详细介绍调用 API 常会用到的几个参数:
- model,即调用的模型,一般取值包括“gpt-3.5-turbo”(ChatGPT-3.5)、“gpt-3.5-16k-0613”(ChatGPT-3.5 16K 版本)、“gpt-4”(ChatGPT-4)。注意,不同模型的成本是不一样的。
- message,即我们的 prompt。ChatCompletion 的 message 需要传入一个列表,列表中包括多个不同角色的 prompt。我们可以选择的角色一般包括 system:即前文中提到的 system prompt;user:用户输入的 prompt;assitance:助手,一般是模型历史回复,作为给模型参考的示例。
- temperature,温度。即前文中提到的 Temperature 系数。
- max_tokens,最大 token 数,即模型输出的最大 token 数。OpenAI 计算 token 数是合并计算 Prompt 和 Completion 的总 token 数,要求总 token 数不能超过模型上限(如默认模型 token 上限为 4096)。因此,如果输入的 prompt 较长,需要设置较小的 max_token 值,否则会报错超出限制长度。
OpenAI 提供了充分的自定义空间,支持我们通过自定义 prompt 来提升模型效果,但我们一般不需要使用到 system prompt 与 assistance prompt,因此我们会给出如下一个函数,对 OpenAI API 做了一定封装,支持我们直接传入 Prompt 并获得模型的输出:
# 一个封装 OpenAI 接口的函数,参数为 Prompt,返回对应结果
def get_completion(prompt, model="gpt-3.5-turbo", temperature = 0):
'''
prompt: 对应的提示词
model: 调用的模型,默认为 gpt-3.5-turbo(ChatGPT),有内测资格的用户可以选择 gpt-4
'''
messages = [{"role": "user", "content": prompt}]
response = openai.ChatCompletion.create(
model=model,
messages=messages,
temperature=temperature, # 模型输出的温度系数,控制输出的随机程度
)
# 调用 OpenAI 的 ChatCompletion 接口
return response.choices[0].message["content"]
在上述函数中,我们封装了 messages 的细节,仅使用 user prompt 来实现调用。事实上,在简单场景中,该函数完全足够使用。我们后续将该函数封装在项目 /project/llm/call_llm.py 文件中,支持以相同方式访问不同底层模型,具体代码逻辑同此处。
3. 基于 LangChain 调用 ChatGPT
LangChain 提供了对于多种大模型的封装,基于 LangChain 的接口可以便捷地调用 ChatGPT 并将其集合在以 LangChain 为基础框架搭建的个人应用中。我们在此简述如何使用 LangChain 接口来调用 ChatGPT。
注意,基于 LangChain 接口调用 ChatGPT 同样需要配置你的个人密钥,配置方法同上。
从langchain.chat_models
导入OpenAI
的对话模型ChatOpenAI
。 除去OpenAI以外,langchain.chat_models
还集成了其他对话模型,更多细节可以查看Langchain官方文档。
from langchain.chat_models import ChatOpenAI
接下来你需要实例化一个 ChatOpenAI 类,可以在实例化时传入超参数来控制回答,例如 temperature
参数。
# 这里我们将参数temperature设置为0.0,从而减少生成答案的随机性。
# 如果你想要每次得到不一样的有新意的答案,可以尝试调整该参数。
chat = ChatOpenAI(temperature=0.0)
chat
ChatOpenAI(cache=None, verbose=False, callbacks=None, callback_manager=None, tags=None, metadata=None, client=<class 'openai.api_resources.chat_completion.ChatCompletion'>, model_name='gpt-3.5-turbo', temperature=0.0, model_kwargs={}, openai_api_key='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', openai_api_base='', openai_organization='', openai_proxy='', request_timeout=None, max_retries=6, streaming=False, n=1, max_tokens=None, tiktoken_model_name=None)
可以看到,默认调用的是 ChatGPT-3.5 模型。
几种常用的超参数设置包括:
- model_name:所要使用的模型,默认为 ‘gpt-3.5-turbo’,参数设置与 OpenAI 原生接口参数设置一致。
- temperature:温度系数,取值同原生接口。
- openai_api_key:OpenAI API key,如果不使用环境变量设置 API Key,也可以在实例化时设置。
- openai_proxy:设置代理,如果不使用环境变量设置代理,也可以在实例化时设置。
- streaming:是否使用流式传输,即逐字输出模型回答,默认为 False,此处不赘述。
- max_tokens:模型输出的最大 token 数,意义及取值同上。
为了便于开发者使用,LangChain 设置了 Template 来设置 Prompt。Template,即模板,是 LangChain 设置好的一种 Prompt 格式,开发者可以直接调用 Template 向里面填充个性化任务,来便捷地完成个性化任务的 Prompt 设置。Template 实则是一个包括 Python 字符串范式的字符,可以使用 format 方法进行填充。
我们需要先构造一个个性化 Template:
from langchain.prompts import ChatPromptTemplate
# 这里我们要求模型对给定文本进行中文翻译
template_string = """Translate the text \
that is delimited by triple backticks \
into a Chinese. \
text: ```{text}```
"""
# 接着将 Template 实例化
chat_template = ChatPromptTemplate.from_template(template_string)
此处我们设置了一个用于文本翻译的 Template,这样的写法是一种定式,可以较大程度发挥模型性能。在之后我们会详细介绍设计 Prompt 的原则与技巧。
在上文 Template 中,我们设置了一个变量 text,作为用户的输入即需要进行中文翻译的给定文本。在每一次调用中,我们可以改变 text 的值,从而自动化实现任务部署和分发。
在完成 Template 后,我们需要针对模型调用 format 方法,将 template 转化为模型输入的形式。例如,在调用 ChatGPT 时,我们实则是要将 Template 转化为上文实现过的 message 格式。
# 我们首先设置变量值
text = "Today is a nice day."
# 接着调用 format_messages 将 template 转化为 message 格式
message = chat_template.format_messages(text=text)
print(message)
[HumanMessage(content='Translate the text that is delimited by triple backticks into a Chinses. text: ```Today is a nice day.```\n', additional_kwargs={}, example=False)]
可以看到,转化之后是 LangChain 设定好的一种专用于调用类似于 ChatGPT 的模型格式的数据类型。接着,我们可以使用实例化的类型直接传入我们设定好的 prompt:
response = chat(message) response
AIMessage(content='今天是个好天气。', additional_kwargs={}, example=False)
可以看到,返回值的 content 属性即为模型的返回文本。
三、调用百度文心
1. 文心一言
文心一言,由百度于2023年3月27日推出的中文大模型,是目前国内大语言模型的代表产品。受限于中文语料质量差异及国内计算资源、计算技术瓶颈,文心一言在整体性能上距离 ChatGPT 仍有一定差异,但在中文语境下已展现出了较为优越的性能。文心一言所考虑的落地场景包括多模态生成、文学创作等多种商业场景,其目标是在中文语境下赶超 ChatGPT。当然,要真正战胜 ChatGPT,百度还有很长的路要走;但在生成式 AI 监管较为严格的国内,作为第一批被允许向公众开放的生成式 AI 应用,文心一言相对无法被公开使用的 ChatGPT 还是具备一定商业上的优势。
百度同样提供了文心一言的 API 接口,其于推出大模型的同时推出了文心千帆企业级大语言模型服务平台,包括了百度整套大语言模型开发工作链。对于不具备大模型实际落地能力的中小企业或传统企业,考虑文心千帆是一个可行的选择。当然,本教程仅包括通过文心千帆平台调用文心一言 API,对于其他企业级服务不予讨论。不过,值得额外注意的事,国内大模型厂商对于 API 的服务相对疏忽,文心一言 API 的实际性能与其 Web 应用所展现出来的能力还存在一定差异。
在本章节中,我们同样将讲述两种通过 Python 代码调用百度文心一言大模型的方法:直接调用百度文心原生接口;使用 LangChain 调用百度文心接口。
2. 获取文心一言调用秘钥
同样,要调用文心一言 API,需要先获取文心一言调用秘钥,在代码中需要配置自己的秘钥才能实现对模型的调用。
百度文心有两层秘钥认证,第一层是拥有调用权限的账户可以从账户中获取的 API_Key 和 Secret_Key,每一个账户可以创建若干个应用,每个应用会对应一个 API_Key 和 Secret_Key。
在获取完成 API_Key 和 Secret_Key 后,还需要基于这两个 Key 去获取 access_token 值。access_token 是第二层认证,基于 access_token 即可调用百度文心大模型,而 access_token 是可以控制基于时间或流量过期的。通过上述两层秘钥认证,可以进一步提高企业服务的安全性。
当然,在本教程中,我们并不需要将两层秘钥分离。我们将在该部分简述如何获取 API_Key、Secret_Key 以及如何基于 Key 获取 access_token 值,后续我们将直接通过 access_token 来调用文心大模型。
首先我们需要进入文心千帆服务平台,点击上述应用接入按钮,创建一个调用文心大模型的应用。注意,你需要首先有一个经过实名认证的百度账号。
接着点击“去创建”按钮,进入应用创建界面:
简单输入基本信息,选择默认配置,创建应用即可。
创建完成后,我们可以在控制台看到创建的应用的 AppID
、API Key
、Secret Key
。使用这里的 API Key
和 Secret Key
即可进行 access_token 的获取。
access_token 需要通过代码 post 访问指定网址得到:
import requests
import json
def get_access_token():
"""
使用 API Key,Secret Key 获取access_token,替换下列示例中的应用API Key、应用Secret Key
"""
# 指定网址
url = "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id={api_key}&client_secret={secret_key}"
# 设置 POST 访问
payload = json.dumps("")
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
# 通过 POST 访问获取账户对应的 access_token
response = requests.request("POST", url, headers=headers, data=payload)
return response.json().get("access_token")
通过上述代码,即可获取到账户对应的 access_token,后续使用 access_token 即可调用百度文心大模型。
3. 调用百度文心原生接口
在完成 access_token 的获取后,可以同样通过 POST 访问来调用百度文心原生接口:
def get_wenxin(prompt):
# 调用接口
url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/eb-instant?access_token={access_token}"
# 配置 POST 参数
payload = json.dumps({
"messages": [
{
"role": "user",# user prompt
"content": "{}".format(prompt)# 输入的 prompt
}
]
})
headers = {
'Content-Type': 'application/json'
}
# 发起请求
response = requests.request("POST", url, headers=headers, data=payload)
# 返回的是一个 Json 字符串
js = json.loads(response.text)
print(js["result"])
百度文心的 Prompt 格式同 OpenAI 的 Prompt 格式相似,但文心并没有提供 system prompt 级别的配置,仅支持 user、assistant 两个级别,可以在传入参数的 message 中配置。我们此处仅使用 user prompt 来实现调用。
同时,百度文心返回的数据也是一个 Json 字符串,我们可以调用其中的 result 属性来获取返回数据。
get_wenxin("你好")
您好!我是百度研发的知识增强大语言模型,中文名是文心一言,英文名是ERNIE Bot。我能够与人对话互动,回答问题,协助创作,高效便捷地帮助人们获取信息、知识和灵感。
百度千帆提供了多种模型接口供调用,此处我们主要使用 ERNIE-Bot-turbo
模型的 chat 接口,也就是常说的百度文心大模型。此处简要介绍文心大模型接口的常用参数:
· messages,即调用的 Prompt。文心的 messages 配置与 ChatGPT 有一定区别,其不支持 max_token 参数,由模型自行控制最大 token 数,content 总长度不能超过11200字符,否则模型就会自行对前文依次遗忘。文心的 messages 有以下几点要求:① 一个成员为单轮对话,多个成员为多轮对话;② 最后一个 message 为当前对话,前面的 message 为历史对话;③ 必须为奇数个对象,message 中的 role 必须依次是 user、assistant。
· stream,是否使用流式传输。
· temperature:温度系数,默认0.95,文心的 temperature 参数要求范围在0~1之间,不能设置为0。
我们同样封装一个调用百度文心大模型的函数供之后使用:
# 一个封装 Wenxin 接口的函数,参数为 Prompt,返回对应结果
def get_completion_weixin(prompt, temperature = 0.1, access_token = ""):
'''
prompt: 对应的提示词
temperature:温度系数
access_token:已获取到的秘钥
'''
url = f"https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/eb-instant?access_token={access_token}"
# 配置 POST 参数
payload = json.dumps({
"messages": [
{
"role": "user",# user prompt
"content": "{}".format(prompt)# 输入的 prompt
}
],
"temperature" : temperature
})
headers = {
'Content-Type': 'application/json'
}
# 发起请求
response = requests.request("POST", url, headers=headers, data=payload)
# 返回的是一个 Json 字符串
js = json.loads(response.text)
# print(js)
return js["result"]
prompt = "你好"
access_token = "xxx"
get_completion_weixin(prompt, access_token=access_token)
'您好!我是百度研发的知识增强大语言模型,中文名是文心一言,英文名是ERNIE Bot。我能够与人对话互动,回答问题,协助创作,高效便捷地帮助人们获取信息、知识和灵感。'
4. 使用 LangChain 调用百度文心
我们同样可以通过 LangChain 框架来调用百度文心大模型,以将文心模型接入到我们的应用框架中。
但是,原生的 LangChain 是不支持文心调用的,我们需要自定义一个支持文心模型调用的 LLM。在《附一 LangChain自定义LLM》中,我们简述了如何自定义 LLM。
此处,我们可以直接调用已自定义好的 Wenxin_LLM。
from wenxin_llm import Wenxin_LLM
我们希望像调用 ChatGPT 那样直接将秘钥存储在 .env 文件中,并将其加载到环境变量,从而隐藏秘钥的具体细节,保证安全性。因此,我们需要在 .env 文件中配置 wenxin_api_key
和 wenxin_secret_key
,并使用以下代码加载:
from dotenv import find_dotenv, load_dotenv
import os
# 读取本地/项目的环境变量。
# find_dotenv()寻找并定位.env文件的路径
# load_dotenv()读取该.env文件,并将其中的环境变量加载到当前的运行环境中
# 如果你设置的是全局的环境变量,这行代码则没有任何作用。
_ = load_dotenv(find_dotenv())
# 获取环境变量 OPENAI_API_KEY
wenxin_api_key = os.environ["wenxin_api_key"]
wenxin_secret_key = os.environ["wenxin_secret_key"]
llm = Wenxin_LLM(api_key=wenxin_api_key, secret_key=wenxin_secret_key)
llm("你好")
'您好!我是百度研发的知识增强大语言模型,中文名是文心一言,英文名是ERNIE Bot。我能够与人对话互动,回答问题,协助创作,高效便捷地帮助人们获取信息、知识和灵感。'
从而我们可以将文心大模型加入到 LangChain 架构中,实现在应用中对文心大模型的调用。
四、调用讯飞星火
1. 讯飞星火认知大模型
讯飞星火认知大模型,由科大讯飞于2023年5月推出的中文大模型,也是国内大模型的代表产品之一。同样,受限于中文语境与算力资源,星火在使用体验上与 ChatGPT 还存在差异,但是,作为与文心不分伯仲的国内中文大模型,仍然值得期待与尝试。相较于存在显著资源、技术优势的百度,科大讯飞想要杀出重围,成为国内大模型的佼佼者,需要充分利用相对优势,至少目前来看,星火并未掉队。同时,不知道是否因为讯飞 API 还没有全面开放,讯飞 API 的测试使用效果比文心更好,值得期待。
目前,讯飞星火大模型 API 已进入 ββ 测试阶段,每一个讯飞账户都可以申请若干 token 的试用。但是,相对于文心与 GPT 几乎完全一致的 API 调用方式,星火 API 需要使用 WebSocket 来进行调用,对企业友好,但对初学者、新手开发者来说调用难度较大。本章节将指导开发者如何将星火 API 封装为可直接通过 request 调用的 API 接口从而和其他大模型保持一致,也将介绍如何将其封装成个性化 LLM 嵌入 LangChain 使用。
2. 申请调用权限
相对于文心复杂的申请流程,讯飞的权限申请显得简单易操作得多:
我们可以使用 Datawhale 提供的专属链接,通过该链接进入可以获得更多的免费额度,点击“免费试用”:
如果是没有领取过免费试用包的用户,可以领取到 100000 token 的试用量;如果已领取过,就会自动跳转到下方购买产品的页面。完成领取后,点击上文中的“服务管理”即可进入控制台:
在该界面,我们就可以看到我们获取到的 APPID
、APISecret
和 APIKey
了。
3. 调用原生星火 API
星火 API 需要通过 WebSocket 进行连接,相对来说配置较为复杂,讯飞给出了配置示例 SparkApi.py 和连接示例 test.py,此处我们仅讲解 test.py 里的调用逻辑,配置示例代码直接使用即可。
注意,需要在环境中安装配置示例中的所需第三方库。
首先我们需要配置秘钥信息:
import SparkApi
#以下密钥信息从控制台获取
appid = "" #填写控制台中获取的 APPID 信息
api_secret = "" #填写控制台中获取的 APISecret 信息
api_key ="" #填写控制台中获取的 APIKey 信息
#用于配置大模型版本,默认“general/generalv2”
domain = "general" # v1.5版本
# domain = "generalv2" # v2.0版本
#云端环境的服务地址
Spark_url = "ws://spark-api.xf-yun.com/v1.1/chat" # v1.5环境的地址
# Spark_url = "ws://spark-api.xf-yun.com/v2.1/chat" # v2.0环境的地址
星火的调用传参和文心类似,也需要传入一个列表,列表中包括 role 和 prompt,我们首先定义一个从用户输入 prompt 生成传入参数的函数:
def getText(role, content, text = []):
# role 是指定角色,content 是 prompt 内容
jsoncon = {}
jsoncon["role"] = role
jsoncon["content"] = content
text.append(jsoncon)
return text
接着,我们将一个用户输入 prompt 封装为这样一个传入参数列表:
question = getText("user", "你好")
question
[{'role': 'user', 'content': '你好'}]
然后再调用 SparkApi.py 中封装的 main 函数即可:
response = SparkApi.main(appid,api_key,api_secret,Spark_url,domain,question) response
你好!很高兴为您提供帮助。请问有什么问题我可以帮您解答吗?
4. 统一 API 调用方式
由于星火使用了 WebSocket 连接,不能直接使用 request 来进行访问,同其他大模型 API 访问方式具有一定差异。我们可以通过 FastAPI 将星火 API 封装成本地 API,从而实现统一的模型调用方式。我们在《附2 将大模型 API 封装成本地 API》中讲解了如何实现本地 API 的封装,此处仅讲解如何启动并调用本地 API。
在我们完成本地 API 的封装后(spark_api.py),我们可以通过 uvicorn 命令启动:
! uvicorn spark_api:app
启动之后,默认会在本地 8000 端口开启 API 服务。
启动 API 之后,我们可以向本地 8000 端口发起 Request 请求来访问 API:
import requests
api_url = "http://127.0.0.1:8000/spark"
headers = {"Content-Type": "application/json"}
data = {
"prompt" : "你好",
"temperature" : 0.2,
"max_tokens" : 3096}
response = requests.post(api_url, headers=headers, json=data)
response.text
'"你好!有什么我可以帮助你的吗?"'
同样,我们可以用一个函数来封装 requests 访问的细节:
def get_completion_spark(prompt, temperature = 0.1, max_tokens = 4096):
api_url = "http://127.0.0.1:8000/spark"
headers = {"Content-Type": "application/json"}
data = {
"prompt" : prompt,
"temperature" : temperature,
"max_tokens" : max_tokens}
response = requests.post(api_url, headers=headers, json=data)
return response.text
get_completion_spark("你好")
'"你好!有什么我可以帮助你的吗?"'
星火 API 同样可以制作成自定义 LLM 并接入 LangChain,制作方式同文心大模型,此处就不再赘述,如有需要可查看项目代码/project/llm/spark_llm。
__EOF__
优秀不够,你是否无可替代
软件测试交流QQ群:721256703,期待你的加入!!
欢迎关注我的微信公众号:软件测试君
![](https://www.cnblogs.com/images/cnblogs_com/longronglang/1061549/o_QQ%E6%88%AA%E5%9B%BE20190728134401.jpg)
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 本地部署 DeepSeek:小白也能轻松搞定!
· 传国玉玺易主,ai.com竟然跳转到国产AI
· 自己如何在本地电脑从零搭建DeepSeek!手把手教学,快来看看! (建议收藏)
· 我们是如何解决abp身上的几个痛点
· 如何基于DeepSeek开展AI项目
2022-01-31 为什么要做接口自动化,怎样做