AI学习:文本对话 -通义千问
Z ! 2024-07-03 09:31:03 阅读 98
通义千问是阿里云自主研发的大语言模型。
模型具备的能力包括但不限于:
创作文字,如写故事、写公文、写邮件、写剧本、写诗歌等编写代码提供各类语言的翻译服务,如英语、日语、法语、西班牙语等进行文本润色和文本摘要等工作扮演角色进行对话制作图表
通义千问以用户以文本形式输入的指令(<code>prompt)以及不定轮次的对话历史(
history
)作为输入,返回模型生成的回复作为输出。在这一过程中,文本将被转换为语言模型可以处理的token序列。Token是模型用来表示自然语言文本的基本单位,可以直观的理解为“字”或“词”。对于中文文本来说,1个token通常对应一个汉字;对于英文文本来说,1个token通常对应3至4个字母或1个单词。例如,中文文本“你好,我是通义千问”会被转换成序列[‘你’, ‘好’, ‘,’, ‘我’, ‘是’, ‘通’, ‘义’, ‘千’, ‘问’],而英文文本"Nice to meet you."则会被转换成[‘Nice’, ’ to’, ’ meet’, ’ you’, ‘.’]。
由于模型调用的计算量与token序列长度相关,输入或输出token数量越多,模型的计算时间越长,我们将根据模型输入和输出的token数量计费。可以从API返回结果的 usage 字段中了解到您每次调用时使用的token数量。您也可以使用 Token计算器 或者调用 Token计算API 来预估文本对应的token数量。
模型名 | 模型简介 | 模型输入输出限制 |
---|---|---|
qwen-turbo | 超大规模语言模型,支持中文英文等不同语言输入 | 支持 8k tokens上下文,API限定用户输入为6k tokens |
qwen-plus | 超大规模语言模型增强版,支持中文英文等不同语言输入 | 支持 32k tokens上下文,API限定用户输入为 30k tokens |
qwen-max | 千亿级别超大规模语言模型,支持中文英文等不同语言输入。随着模型的升级,qwen-max将滚动更新升级,如果希望使用稳定版本,请使用qwen-max-1201 | 支持 8k tokens上下文,API限定用户输入为6k tokens |
qwen-max-1201 | 千亿级别超大规模语言模型,支持中文英文等不同语言输入。该模型为qwen-max的快照稳定版本,预期维护到下个快照版本发布时间(待定)后一个月 | 支持 8k tokens上下文,API限定用户输入为6k tokens。 |
qwen-max-longcontext | 千亿级别超大规模语言模型,支持中文英文等不同语言输入 | 支持 30k tokens上下文,API限定用户输入为 28k tokens |
注:您可以在调用时按需选择不同版本的模型。但请您注意,不同模型版本的计费规则不一致,点此查看计量计费。
配置
开通DashScope并创建API-KEY。
安装 SDK
# pip 安装
pip install dashscope
# API-KEY设置
export DASHSCOPE_API_KEY=sk-########################
SDK 使用
单轮对话
messages调用
import random
from http import HTTPStatus
import dashscope
def call_with_messages():
messages = [{ 'role': 'system', 'content': 'You are a helpful assistant.'},
{ 'role': 'user', 'content': '如何做西红柿炒鸡蛋?'}]
response = dashscope.Generation.call(
dashscope.Generation.Models.qwen_turbo,
messages=messages,
# set the random seed, optional, default to 1234 if not set
seed=random.randint(1, 10000),
result_format='message', # set the result to be "message" format.code>
)
if response.status_code == HTTPStatus.OK:
print(response)
else:
print('Request id: %s, Status code: %s, error code: %s, error message: %s' % (
response.request_id, response.status_code,
response.code, response.message
))
if __name__ == '__main__':
call_with_messages()
prompt 调用
# For prerequisites running the following sample, visit https://help.aliyun.com/document_detail/611472.html
from http import HTTPStatus
import dashscope
def call_with_prompt():
response = dashscope.Generation.call(
model=dashscope.Generation.Models.qwen_turbo,
prompt='如何做炒西红柿鸡蛋?'code>
)
# The response status_code is HTTPStatus.OK indicate success,
# otherwise indicate request is failed, you can get error code
# and message from code and message.
if response.status_code == HTTPStatus.OK:
print(response.output) # The output text
print(response.usage) # The usage information
else:
print(response.code) # The error code.
print(response.message) # The error message.
if __name__ == '__main__':
call_with_prompt()
多轮会话
messages调用
from http import HTTPStatus
from dashscope import Generation
from dashscope.api_entities.dashscope_response import Role
def conversation_with_messages():
messages = [{ 'role': Role.SYSTEM, 'content': 'You are a helpful assistant.'},
{ 'role': Role.USER, 'content': '如何做西红柿炖牛腩?'}]
response = Generation.call(
Generation.Models.qwen_turbo,
messages=messages,
result_format='message', # set the result to be "message" format.code>
)
if response.status_code == HTTPStatus.OK:
print(response)
# append result to messages.
messages.append({ 'role': response.output.choices[0]['message']['role'],
'content': response.output.choices[0]['message']['content']})
else:
print('Request id: %s, Status code: %s, error code: %s, error message: %s' % (
response.request_id, response.status_code,
response.code, response.message
))
messages.append({ 'role': Role.USER, 'content': '不放糖可以吗?'})
# make second round call
response = Generation.call(
Generation.Models.qwen_turbo,
messages=messages,
result_format='message', # set the result to be "message" format.code>
)
if response.status_code == HTTPStatus.OK:
print(response)
else:
print('Request id: %s, Status code: %s, error code: %s, error message: %s' % (
response.request_id, response.status_code,
response.code, response.message
))
if __name__ == '__main__':
conversation_with_messages()
流式输出
from http import HTTPStatus
from dashscope import Generation
def call_with_stream():
messages = [
{ 'role': 'user', 'content': '如何做西红柿炖牛腩?'}]
responses = Generation.call(
Generation.Models.qwen_turbo,
messages=messages,
result_format='message', # set the result to be "message" format.code>
stream=True,
incremental_output=True # get streaming output incrementally
)
full_content = '' # with incrementally we need to merge output.
for response in responses:
if response.status_code == HTTPStatus.OK:
full_content += response.output.choices[0]['message']['content']
print(response)
else:
print('Request id: %s, Status code: %s, error code: %s, error message: %s' % (
response.request_id, response.status_code,
response.code, response.message
))
print('Full response:\n' + full_content)
if __name__ == '__main__':
call_with_stream()
参数配置
参数 | 类型 | 默认值 | 说明 |
---|---|---|---|
model | string | 指定用于对话的通义千问模型名,目前可选择qwen-turbo 、qwen-plus 、qwen-max 、qwen-max-1201 和qwen-max-longcontext | |
messages | array | messages指用户与模型的对话历史。list中的每个元素形式为{“role”:角色, “content”: 内容}。角色当前可选值:system、user、assistant,其中,仅messages[0]中支持role为system,user和assistant需要交替出现。prompt指用户当前输入的期望模型执行指令。messages和prompt二选一使用。chat场景中推荐优先使用messages参数 | |
prompt | string | messages指用户与模型的对话历史。list中的每个元素形式为{“role”:角色, “content”: 内容}。角色当前可选值:system、user、assistant,其中,仅messages[0]中支持role为system,user和assistant需要交替出现。prompt指用户当前输入的期望模型执行指令。messages和prompt二选一使用。chat场景中推荐优先使用messages参数 | |
seed (可选) | int | 1234 | 生成时,随机数的种子,用于控制模型生成的随机性。如果使用相同的种子,每次运行生成的结果都将相同;当需要复现模型的生成结果时,可以使用相同的种子。seed参数支持无符号64位整数类型。默认值 1234 |
max_tokens(可选) | int | 1500 | 用于限制模型生成token的数量,max_tokens设置的是生成上限,并不表示一定会生成这么多的token数量。其中qwen-turbo 和 qwen-max-longcontext 最大值和默认值均为1500, qwen-max、qwen-max-1201 和 qwen-plus最大值和默认值均为2048。 |
top_p (可选) | float | 0.8 | 生成过程中核采样方法概率阈值,例如,取值为0.8时,仅保留概率加起来大于等于0.8的最可能token的最小集合作为候选集。取值范围为(0,1.0),取值越大,生成的随机性越高;取值越低,生成的确定性越高。 |
top_k (可选) | int | None | 生成时,采样候选集的大小。例如,取值为50时,仅将单次生成中得分最高的50个token组成随机采样的候选集。取值越大,生成的随机性越高;取值越小,生成的确定性越高。默认不传递该参数,取值为None或当top_k大于100时,表示不启用top_k策略,此时,仅有top_p策略生效。 |
repetition_penalty (可选) | float | 1.1 | 用于控制模型生成时的重复度。提高repetition_penalty时可以降低模型生成的重复度。1.0表示不做惩罚。 |
temperature (可选) | float | 1.0 | 用于控制随机性和多样性的程度。具体来说,temperature值控制了生成文本时对每个候选词的概率分布进行平滑的程度。较高的temperature值会降低概率分布的峰值,使得更多的低概率词被选择,生成结果更加多样化;而较低的temperature值则会增强概率分布的峰值,使得高概率词更容易被选择,生成结果更加确定。取值范围: [0, 2] |
stop (可选) | str/list[str]用于指定字符串;list[int]/list[list[int]]用于指定token_ids | None | 用于控制生成时遇到某些内容则停止。如果指定了字符串或者token_ids,模型将要生成指定字符串或者token_ids时会停止生成,生成结果不包含指定的内容。例如指定stop为"你好",表示将要生成"你好"时停止;指定stop为[37763, 367],表示将要生成"Observation"时停止。同时,stop参数支持以list方式传入字符串数组或者token_ids数组,以期支持使用多个stop的场景。注意,list模式下不支持字符串和token_ids混用,list模式下元素类型要相同 |
stream (可选) | bool | False | 是否使用流式输出。当以stream模式输出结果时,接口返回结果为generator,需要通过迭代获取结果,默认每次输出为当前生成的整个序列,最后一次输出为最终全部生成结果,可以通过参数incremental_output为False改变输出模式为非增量输出。 |
enable_search (可选) | bool | False | 生成时,是否参考搜索的结果。注意:打开搜索并不意味着一定会使用搜索结果;如果打开搜索,模型会将搜索结果作为prompt,进而“自行判断”是否生成结合搜索结果的文本,默认为false |
result_format (可选) | string | text | [text |
incremental_output (可选) | bool | False | 控制流式输出模式,即后面内容会包含已经输出的内容;设置为True,将开启增量输出模式,后面输出不会包含已经输出的内容,您需要自行拼接整体输出,参考流式输出示例代码。默认False:I、I like、i like apple、True:、I、like,apple 该参数只能与stream输出模式配合使用。 |
返回结果
message 结果示例
{
"status_code": 200,
"request_id": "05dc83af-7185-9e14-9b0b-4466de159d6a",
"code": "",
"message": "",
"output": {
"text": null,
"finish_reason": null,
"choices": [
{
"finish_reason": "stop",
"message": {
"role": "assistant",
"content": "首先,准备两个鸡蛋,一个西红柿,适量的盐、糖、料酒和生抽。将鸡蛋打入碗中,搅拌均匀,西红柿切块。锅中加油,油热后加入鸡蛋液,炒至金黄色,盛出备用。锅中加油,油热后加入西红柿块,翻炒均匀,加入适量的盐、糖、料酒和生抽,炒至西红柿软烂,加入炒好的鸡蛋,翻炒均匀即可。"
}
}
]
},
"usage": {
"input_tokens": 12,
"output_tokens": 98,
"total_tokens": 110
}
}
text 结果示例
{
"status_code": 200,
"request_id": "e3472c22-274a-9551-b197-f6510608fe1b",
"code": "",
"message": "",
"output": {
"text": "材料:\n西红柿2个,鸡蛋3个,葱花适量,盐适量,糖适量,食用油适量\n\n做法:\n1. 西红柿洗净切块,鸡蛋打入碗中搅拌均匀备用。\n2. 热锅凉油,油热后加入葱花爆香。\n3. 加入西红柿块翻炒,炒至西红柿出汁。\n4. 加入适量的盐和糖,继续翻炒均匀。\n5. 倒入鸡蛋液,用铲子快速翻炒均匀,使鸡蛋液均匀地裹在西红柿上。\n6. 炒至鸡蛋熟透即可出锅。\n\n提示:\n1. 炒西红柿时可以适当加一些水,可以使西红柿更加鲜美。\n2. 炒鸡蛋时要快速翻炒,使鸡蛋均匀地裹在西红柿上,避免炒糊。\n3. 可以根据个人口味调整盐和糖的用量。",
"finish_reason": "stop",
"choices": null
},
"usage": {
"input_tokens": 6,
"output_tokens": 193,
"total_tokens": 199
}
}
返回参数说明
返回参数 | 类型 | 说明 | 备注 |
---|---|---|---|
status_code | int | 200(HTTPStatus.OK)表示请求成功,否则表示请求失败,可以通过code获取错误码,通过message字段获取错误详细信息。异常信息为code,message内容 | |
request_Id | string | 系统生成的标志本次调用的id。 | |
code | string | 表示请求失败,表示错误码,成功忽略。 | |
message | string | 失败,表示失败详细信息,成功忽略。 | |
output | dict | 调用结果信息,对于千问模型,包含输出text。 | |
usage | dict | 计量信息,表示本次请求计量数据。 | |
output.text | string | 模型生成回复。 | |
output.finish_reason | string | 有三种情况:正在生成时为null,生成结束时如果由于停止token导致则为stop,生成结束时如果因为生成长度过长导致则为length。 | |
usage.input_tokens | int | 用户输入文本转换成Token后的长度。 | |
usage.output_tokens | int | 模型生成回复转换为Token后的长度。 | |
choices | List | [] | 当result_format为message输出choices |
choices[i].finish_reason | string | 有三种情况:正在生成时为null,生成结束时如果由于停止token导致则为stop,生成结束时如果因为生成长度过长导致则为length。 | |
choices[i].message | dict | 模型生成消息输出 | 当result_format为message输出choices |
message.role | string | 模型生成消息输出 | 模型role,固定为assistant |
message.content | string | 模型生成消息输出 | |
模型生成的文本 |
参考文档:包括上面的内容和HTTP调用接口进行功能描述。
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。