Are you sure you want to delete this task? Once this task is deleted, it cannot be recovered.
|
11 months ago | |
---|---|---|
.. | ||
README.md | 1 year ago | |
inspurai.py | 11 months ago | |
url_config.py | 1 year ago | |
源1.0API调用使用手册-20220506.pdf | 1 year ago |
尊敬的用户:
衷心感谢您选用了浪潮人工智能巨量模型“源1.0”API!
本手册介绍了“源1.0”已开放API的接口说明和使用示例,可使使用者更好地了解本API支持的功能及快速使用方法,充分的发挥开放API的作用。
浪潮(北京)电子信息产业有限公司拥有本手册的版权。
本手册中的内容如有变动恕不另行通知。
如果您对本手册有疑问或建议,请向浪潮(北京)电子信息产业有限公司垂询。
浪潮(北京)电子信息产业有限公司
二零二二年四月
[toc]
“源1.0”,是浪潮信息9月28日在京发布全球最大规模人工智能巨量模型。“源”的单体模型参数量达2457亿,超越美国OpenAI组织研发的GPT-3,成为全球最大规模的单体AI巨量模型。
本文将介绍如何进行“源1.0”API的调用。该API接口主要是针对外网开放,用于第三方用户根据自身需求获取推理结果。
“源1.0”项目尽可能采用了目前python API调用所需的主流依赖库,如果您之前有过相关开发经验,将不需要进行额外安装,如果您的电脑和python环境处于初始化状态,可以采用如下命令安装或确认相关依赖:
pip install requests hashlib json
完成安装后在您的硬盘上任意位置,用如下命令将GitHub上的代码fork下来即可。
git clone https://github.com/Shawn-Inspur/Yuan-1.0.git
需要注意的是,GitHub
上下载的代码包含了三个部分,src
中是模型训练的代码,sandbox
中是web示例开发使用的沙箱代码,需要额外安装yarn
,yuan_api
中是采用API进行推理的示例代码和工具。手册中将重点介绍yuan_api
的使用,并基于此简单介绍如何采用web沙箱进行示例应用创建。
我们开源了“源1.0”的训练代码以及采用API进行推理的代码,为了方便开发者社区的同仁快速上手,我们将推理的API代码进行便捷性封装。参照yuan_api/examples
中的示例代码,可以快速完成不同的NLP应用开发。这里我们将带大家一起,通过构建一个对话机器人来快速上手源推理API开发过程。
首先请确认您的项目工作目录为yuan_api
,然后在examples
目录下新建一个python
文件:dialog.py
。
from inspurai import Yuan, set_yuan_account,Example
代码中首先从inspurai
导入Yuan
和Example
这两个类,以及set_yuan_account
函数。其中Yuan
类中包含了用于提交API
请求以及获取推理结果的各种函数,具体将在后文中进行解释。Example
类用于构建输入输出示例,通过对yuan
实例中添加example
,即可实现one-shot或few-shot。
如果您的API审批申请已经通过,请用申请API时使用的账号和手机号来获得授权。
# 1. set account
set_yuan_account("用户名", "手机号")
初始化Yuan
实例yuan
,并对其加入一个样例:
yuan = Yuan(input_prefix="对话:“",
input_suffix="”",
output_prefix="答:“",
output_suffix="”",)
# 3. add examples if in need.
yuan.add_example(Example(inp="对百雅轩798艺术中心有了解吗?",
out="有些了解,它位于北京798艺术区,创办于2003年。"))
其中input_prefix
和input_suffix
分别为输入的前缀和后缀。output_prefix
和output_suffix
为输出的前缀和后缀。如果对实例yuan
添加了example
,则会在提交query前在example
的输入和输出部分分别添加前缀和后缀。例如上面添加的example
,在提交query时将会被自动修改为以下的样式:
"对话:“对百雅轩798艺术中心有了解吗?”答:“有些了解,它位于北京798艺术区,创办于2003年。”"
如果有需要,实例yuan
中还可以继续添加更多example
,实现few-shot。其他参数将在后面详细介绍。
至此一个问答机器人就已经完成了,接下来就可以提问了。我们把想问的问题放在prompt
变量里,然后提交给yuan
的API。
# 4. get response
prompt = "故宫的珍宝馆里有什么好玩的?"
response = yuan.submit_API(prompt=prompt,trun="”")
其中trun
为截断符,yuan API推理服务返回的生成结果有可能包含重复的答案,通过设置trun
可以在第一次出现该字符时截断返回结果。因为我们在之前设置的输出后缀为‘”’,对于推理返回的结果,我们可以将trun设为‘”’,在返回完第一个完整输出时将其截断。因为截断时最后这个字符并不会被保留,为了保持我们对话机器人输出符号的对称性,我们人为在打印时加上后引号。(注:这种设计是必要的,因为对于更普遍的任务而言,加入的后缀是无意义的,仅作为语句分割用。我们并不希望这种字符被返回。)
为了能够连续进行对话,我们将上面提交prompt和返回结果的过程重构如下:
print("====问答机器人====")
while(1):
print("输入Q退出")
prompt = input("问:")
if prompt.lower() == "q":
break
response = yuan.submit_API(prompt=prompt,trun="”")
print(response+"”")
这样一个简单的问答机器人就开发完毕,您可以在命令行和他互动了!
上一节中我们已经使用一些函数,本节将具体说明本开源代码中所开放的函数用途和参数,可作为技术手册查阅。
2.1 账号设置
yuan
推理API实例化相关的代码都放在inspurai.py
文件中,这里将逐一对其中的函数和类进行介绍。
set_yuan_account(user, phone)
set_yuan_account
函数将用户名和手机号设置为环境变量,并在后续推理时从环境变量中读取这两个参数,实现用户名和手机号验证。
参数名 | 含义 | 取值范围 |
---|---|---|
user | 用户名 | API申请时填写的用户名 |
phone | 手机号 | API申请时填写的手机号 |
2.2 Yuan推理实例
Yuan
类:
Yuan
类为用户调用浪潮“源1.0”API最常用到的类。用户可以通过这个类设置用户信息、添加样例、提送API请求等。实例化方法如下:
yuan = Yuan(engine='base_10B',
temperature=0.9,
max_tokens=100,
input_prefix='',
input_suffix='\n',
output_prefix='答:',
output_suffix='\n\n',
append_output_prefix_to_query=False,
topK=1,
topP=0.9,
frequencyPenalty=1.0,
responsePenalty=1.0,
noRepeatNgramSize=0)
为方便用户设置,所有参数均给定了默认值。
参数名 | 含义 | 取值范围 |
---|---|---|
engine | 大模型后台推理引擎,目前可选的推理引擎有基础模型,古文模型,对话模型和翻译模型 | 'base_10B':基础模型 translate':翻译模型 'dialog':对话模型 ''rhythm_poems':古文模型 |
temprature | 模拟退火温度参数。 值越大,使得概率分布越尖锐,模型的创造性越强,但生成效果不稳定。 值越小,模型的稳定性越强,生成效果稳定 |
float:[0,1] |
max_tokens | 最大生成token长度,数值越大,生成时间越长。不建议超过200。 | int:[0~200] |
input_prefix | 输入序列前缀,如设置,将自动为query和每个样例的输入加上前缀 | 任意字符串 |
input_suffix | 输入序列后缀,如设置,将自动为query和每个样例的输入加上后缀 | 任意字符串 |
output_prefix | 输出序列前缀,如设置,将自动为每个样例的输出加上前缀 | 任意字符串 |
output_suffix | 输出序列后缀,如设置,将自动为每个样例的输出加上后缀 | 任意字符串 |
append_output_prefix_to_query | 如设置,将自动将设定的输出前缀添加到query序列的末尾 | bool型 |
topK | 挑选概率最高的 k 个 token作为候选集。 若k值为1,则答案唯一。 当topK为0时,该参数不起作用。 |
int:[0,-] |
topP | token 的概率累加,从最大概率的 token 往下开始取,当取到累加值大于等于topP时停止。 当topP为0时,该参数不起作用。 |
float:[0,1] |
frequencyPenalty | 重复惩罚参数,基于词出现的次数进行惩罚,出现的次数越多,该词在后文出现的概率越低,同时增强后文的创造性。 当frequencyPenalty小于等于1时,该参数不起作用。 值越大,惩罚度越高,后文重复度越低。一般设置为1.2。 |
float:[1,-] |
responsePenalty | 重复惩罚参数,对出现过的词进行惩罚,降低其在后文出现的概率,同时增强后文的创造性。 当frequencyPenalty大于1或responsePenalty小于等于1时,则该参数不起作用。 值越大,惩罚度越高,后文重复度越低。 |
float:[1,-] |
noRepeatNgramSize | 重复词去除,表示输出中不包含长度为noRepeatNgramSize的重复词。 当noRepeatNgramSize小于1时,则该参数不起作用。 值越大,不能出现的重复词越长。 |
int:[0,-] |
添加样例: |
add_example(ex)
添加示例到Yuan实例。
参数名 | 含义 | 取值范围 |
---|---|---|
ex | Example类的实例 | Example类 |
删除样例:
delete_example(id)
根据样例id删除样例。
参数名 | 含义 | 取值范围 |
---|---|---|
id | Example实例的id | int:uuid |
按照id获取实例中的样例:
get_example(id)
参数名 | 含义 | 取值范围 |
---|---|---|
id | Example实例的id | int:uuid |
return | 返回样例 |
返回实例中所有的样例:
get_all_examples()
参数名 | 含义 | 取值范围 |
---|---|---|
return | 返回样例字典 | 关键字为样例id,值为样例字典 |
将所有样例拼接到输入序列,应为私有函数,不直接使用:
get_prime_text()
参数名 | 含义 | 取值范围 |
---|---|---|
return | 拼接后的字符串 |
获取推理引擎:
get_engine()
参数名 | 含义 | 取值范围 |
---|---|---|
return | 实例所用的推理引擎 | 字符串 |
获取模拟退火温度参数:
get_temperature()
参数名 | 含义 | 取值范围 |
---|---|---|
return | temp值 | float:[0,1] |
获取最大token设置:
get_max_tokens()
参数名 | 含义 | 取值范围 |
---|---|---|
return | 最大输出token数量 | int:[0,-] |
将样例和query拼接成输入序列:
craft_query(prompt)
参数名 | 含义 | 取值范围 |
---|---|---|
prompt | 除样例外,用户输入的内容 | 任意字符串 |
return | query序列 | 任意字符串 |
将前后缀添加到Query和样例中:
format_example(ex)
参数名 | 含义 | 取值范围 |
---|---|---|
ex | 样例实例 |
获取大模型推理API得到的原始结果:
response(query,engine='base_10B',max_tokens=20,temperature=0.9,topP=0.1,topK=1,frequencyPenalty=1.0,responsePenalty=1.0,noRepeatNgramSize=0):
函数会异步调用两个API,首先提交query请求到后台,获取请求id,然后按照id轮询“答复”API端口,直到获取到推理生成的结果或超时。
参数名 | 含义 | 取值范围 |
---|---|---|
query | 包含样例、用户输入、前后缀在内的query字符串。 | 字符串,长度小于2048 |
engine | 大模型后台推理引擎,目前可选的推理引擎有基础模型,对话模型和翻译模型 | 'base_10B':基础模型 'translate':翻译模型 'dialog':对话模型 |
temprature | 模拟退火温度参数。 值越大,使得概率分布越尖锐,模型的创造性越强,但生成效果不稳定。 值越小,模型的稳定性越强,生成效果稳定 |
float:[0,1] |
max_tokens | 最大生成token长度,数值越大,生成时间越长。不建议超过200。 | int:[0~200] |
topK | 挑选概率最高的 k 个 token作为候选集。 若k值为1,则答案唯一。 当topK为0时,该参数不起作用。 |
int:[0,-] |
topP | token 的概率累加,从最大概率的 token 往下开始取,当取到累加值大于等于topP时停止。 当topP为0时,该参数不起作用。 |
float:[0,1] |
frequencyPenalty | 重复惩罚参数,基于词出现的次数进行惩罚,出现的次数越多,该词在后文出现的概率越低,同时增强后文的创造性。 当frequencyPenalty小于等于1时,该参数不起作用。 值越大,惩罚度越高,后文重复度越低。一般设置为1.2。 |
float:[1,-] |
responsePenalty | 重复惩罚参数,对出现过的词进行惩罚,降低其在后文出现的概率,同时增强后文的创造性。 当frequencyPenalty大于1或responsePenalty小于等于1时,则该参数不起作用。 值越大,惩罚度越高,后文重复度越低。 |
float:[1,-] |
noRepeatNgramSize | 重复词去除,表示输出中不包含长度为noRepeatNgramSize的重复词。 当noRepeatNgramSize小于1时,则该参数不起作用。 值越大,不能出现的重复词越长。 |
int:[0,-] |
return | 大模型声称的原始内容 | 任意字符串 |
删除特殊字符:
del_special_chars(msg)
将大模型生成的内容中的特殊字符剔除,如'<unk>', '<eod>', '#', '▃', '▁', '▂', ' '等
参数名 | 含义 | 取值范围 |
---|---|---|
msg | 规范化后的生成文本 | 模型返回的内容 |
return | 剔除后的msg |
将prompt提交到API,并返回处理后的生成结果:
submit_API(prompt, trun=[])
提供用户端使用的方法,将用户输入的内容传递到Yuan的API接口,并返回处理后的生成结果。
参数名 | 含义 | 取值范围 |
---|---|---|
prompt | 问题或其他用户输入的内容(不包括样例) | 任意中文字符串 |
trun | 截断符或截断符列表,用户可输入多个文本序列,文本序列之间属于或关系。设置后结果将在生成内容中第一次出现任一截断序列的地方截断。支持字符串和列表两种输入形式 | 任意字符或任意字符列表 |
2.3 样例实例
Example
类:
用于给推理query添加示例,实例化方法如下:
example = Example(inp="", out="")
参数名 | 含义 | 取值范围 |
---|---|---|
inp | 样例输入 | 任意字符串 |
out | 样例输出 | 任意字符串 |
Example
实例化方法通常与Yuan.add_example()
函数一起使用,为Yuan
的实例添加样例。
获取样例输入:
get_input()
返回example的样例输入。
获取样例输出:
get_output()
返回example的样例输出。
获取样例id:
get_id()
返回样例的id
以字典形式返回样例:
as_dict()
返回以字典形式返回样例
关键字 | 含义 | 取值范围 |
---|---|---|
input | 样例输入 | 字符串 |
output | 样例输出 | 字符串 |
id | 样例id | uuid编码 |
为了便于用户使用,第2节介绍的函数和方法为对底层API的高级封装。本节将介绍模型推理API的底层接口,用户可以基于本节内容,自定义更适合自身业务的API逻辑。
本节介绍的底层API保存在url_config.py
当中。
目前底层API开放两个基础URI:
SUBMIT_URL = "http://api-air.inspur.com:32102/v1/interface/api/infer/getRequestId?"
REPLY_URL = "http://api-air.inspur.com:32102/v1/interface/api/result?"
SUBMIT_URL用于提交用户的query到后端,返回查询id。
REPLY_URL用于根据查询id,异步查询后台是否完成针对用户query的推理生成。
生成后端服务验证所需要的token:
header_generation()
token会放置在head中传递给后台API接口。token会从环境变量中读取用户申请/设定的用户名和手机号,并添加时间戳进行加密。即使token被泄露,一天后token也会失效,需重新生成。
参数 | 含义 | 取值范围 |
---|---|---|
return | url请求的headers | md5加密的字符串 |
提交request:
submit_request(query,temperature,topP,topK,max_tokens,engine)
将最终的query通过requests.get()
方法提交到uri。
参数 | 含义 | 取值范围 |
---|---|---|
query | 包含样例、用户输入、前后缀在内的query字符串。 | 字符串,长度小于2048 |
engine | 大模型后台推理引擎,目前可选的推理引擎有基础模型,对话模型和翻译模型 | 'base_10B':基础模型 'translate':翻译模型 'dialog':对话模型 |
temprature | 模拟退火温度参数。值越大,使得概率分布越尖锐,模型的创造性越强,但生成效果不稳定。值越小,模型的稳定性越强,生成效果稳定 | float:[0,1] |
max_tokens | 最大生成token长度,数值越大,生成时间越长。不建议超过200。 | int:[0~200] |
topK | 挑选概率最高的 k 个 token作为候选集。 若k值为1,则答案唯一。 当topK为0时,该参数不起作用。 |
int:[0,-] |
topP | token 的概率累加,从最大概率的 token 往下开始取,当取到累加值大于等于topP时停止。 当topP为0时,该参数不起作用。 |
float:[0,1] |
frequencyPenalty | 重复惩罚参数,基于词出现的次数进行惩罚,出现的次数越多,该词在后文出现的概率越低,同时增强后文的创造性。 当frequencyPenalty小于等于1时,该参数不起作用。 值越大,惩罚度越高,后文重复度越低。一般设置为1.2。 |
float:[1,-] |
responsePenalty | 重复惩罚参数,对出现过的词进行惩罚,降低其在后文出现的概率,同时增强后文的创造性。 当frequencyPenalty大于1或responsePenalty小于等于1时,则该参数不起作用。 值越大,惩罚度越高,后文重复度越低。 |
float:[1,-] |
noRepeatNgramSize | 重复词去除,表示输出中不包含长度为noRepeatNgramSize的重复词。 当noRepeatNgramSize小于1时,则该参数不起作用。 值越大,不能出现的重复词越长。 |
int:[0,-] |
return:requestId | 请求id,用于异步查询生成结果 |
获取生成结果:
reply_request(requestId,cycle_count=5)
根据requestId查询“结果返回”API接口是否有结果生成。
参数 | 含义 | 取值范围 |
---|---|---|
requestId | submit_request生成的请求id | 字符串 |
cycle_count | 轮询次数,每次间隔3s | int:[1,-] |
return: response_text | 返回生成的结果 | 字符串 |
这里我们汇总了一些简单的应用示例配置方法,以便用户参考。其中未提及的参数均采取了默认值。
序号 | 应用 | 模型 | prompt模板 | 输入前缀 | 输入后缀 | 输出前缀 | 截断符 | 输入示例 | few-shot |
---|---|---|---|---|---|---|---|---|---|
0 | 对话生成 | dialog | 问:“用户输入 ”答:“ |
问:“ | ” | 答:“ | ” | 故宫有什么好玩的? | 支持 |
1 | 内容续写 | base_10B | 用户输入 |
无 | 无 | 无 | 默认 | 徐凤年刚走入京大校门,已经有学生会迎新的同学走到了他面前, | 不建议 |
2 | 诗词生成 | base_10B | 以“用户输入 ”为题作一首诗:“ |
以“ | ”为题作一首诗:“ | 无 | ” | 清风 | 推荐 |
3 | 关键词抽取 | base_10B | 为以下正文提取关键词。正文:用户输入 ;关键词: |
为以下正文提取关键词。正文: | ; | 关键词: | 。 | 帮我写一首诗,描写春天到了,百花盛开。 | 支持 |
4 | 中英互译 | translate | 将下列英文/中文翻译成中文/英文。英文/中文:用户输入 中文/英文:“ |
将下列英文/中文翻译成中文/英文。英文/中文: | 无 | 中文/英文:“ | ” | 自然派的哲学家也被称为“苏格拉底之前的哲学家” 。 | 不建议 |
更多应用敬请期待。
【欧小鹏】辅助社群运营的微信机器人。支持社区问题的QA、文生图、闲聊等。
https://github.com/thomas-yanxin/Wechat_bot
Python Text