模型插件调用需"申请体验"并通过后才可使用,否则API调用将返回错误状态码。
Dashscope插件功能能够使得大模型的生成内容与外部三方应用结合,使得模型生成的内容更加准确和丰富,模型将拥有更好的生成能力。您也可以通过开发自定义插件,来使得模型生成更符合您预期的结果。
使用插件功能,大模型生成可以在如下几个方面得到更好的扩展:
可以获得更加实时性的消息,比如体育赛事报道、实时、热点新闻
可以让用户获得更多的能力,比如查询酒店信息,预定酒店、预定机票
可以让用户构建专属的信息库
插件模型概览
支持模型 | 模型英文名 | 支持插件中文名 | 支持插件英文名 |
通义千问 | qwen-plus | 文字识别 | ocr |
计算器 | calculator | ||
图片生成 | text_to_image | ||
万豪酒店预定推荐 | haozhu_recommend_hotel | ||
PDF解析 | pdf_extracter | ||
Python代码解释器 | code_interpreter |
插件使用
您可以在插件广场申请需要使用开通的插件,申请通过后才能使用相应插件功能。
与不使用插件只调用大模型的情况相似,您可以通过SDK和HTTP请求两种方法,让大模型在插件的支持下,返回生成结果。
本文详细描述了输入输出参数的含义,若您希望获得调用具体插件的例子,请查阅调用样例。
SDK使用
前提条件
已开通服务并获得API-KEY:API-KEY的获取与配置。
已安装最新版Python SDK:安装DashScope SDK,Java暂不支持插件功能。
示例代码
说明
需要使用您的API-KEY替换示例中的YOUR_DASHSCOPE_API_KEY
同时满足:
Python SDK version: dashscope>=1.13.1
代码才能正常运行。
注意
Java暂不支持插件功能。
API-KEY设置
export DASHSCOPE_API_KEY=YOUR_DASHSCOPE_API_KEY
单轮问答
以下示例展示了调用通义千问模型对一个用户指令进行响应的代码。
from http import HTTPStatus
import dashscope
def call_with_messages():
plugins = {'calculator': {}} # choose the desired plugin(s).
messages = [{'role': 'system', 'content': 'You are a helpful assistant.'},
{'role': 'user', 'content': '12345*98765是多少'}]
response = dashscope.Generation.call(
model='qwen-plus',
messages=messages,
result_format='message', # set the result to be "message" format.
plugins=plugins,
)
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()
多轮会话
from http import HTTPStatus
import dashscope
from dashscope.api_entities.dashscope_response import Role
def call_with_messages():
plugins = {'calculator': {}} # choose the desired plugin(s).
messages = [{'role': 'system', 'content': 'You are a helpful assistant.'},
{'role': 'user', 'content': '12345 * 98765是多少'}]
response = dashscope.Generation.call(
model='qwen-plus',
messages=messages,
result_format='message', # set the result to be "message" format.
plugins=plugins,
)
if response.status_code == HTTPStatus.OK:
print(response)
messages.extend(response.output.choices[0]['messages'])
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': '调用插件计算一下再加上22222是多少'})
response = dashscope.Generation.call(
model='qwen-plus',
messages=messages,
result_format='message', # set the result to be "message" format.
plugins=plugins,
)
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()
流式输出
from http import HTTPStatus
import dashscope
def call_with_messages():
plugins = {'calculator': {}} # choose the desired plugin(s).
messages = [{'role': 'system', 'content': 'You are a helpful assistant.'},
{'role': 'user', 'content': '12345*98765是多少'}]
responses = dashscope.Generation.call(
model='qwen-plus',
messages=messages,
result_format='message', # set the result to be "message" format.
plugins=plugins,
stream=True,
)
for response in responses:
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()
输入参数说明
参数 | 类型 | 默认值 | 说明 |
model | string | - | 指定用于对话的通义千问模型名,若需使用插件,请指定为qwen-plus。 |
messages | array | - | 用户与模型的对话历史。list中的每个元素形式为{"role":角色, "content": 内容}。角色当前可选值:system、user、assistant,其中,仅messages[0]中支持role为system,user和assistant需要交替出现 |
prompt | string | - | 用户当前输入的期望模型执行指令。 |
plugins | dict | - | 指定候选插件列表。具体参数填写详见插件参数说明 |
history (可选) | list[dict] | [] | 即将废弃,请使用messages字段,用户与模型的对话历史,list中的每个元素是形式为{"user":"用户输入","bot":"模型输出"}的一轮对话,多轮对话按时间正序排列。 |
top_p (可选) | float | 0.5 | 生成过程中核采样方法概率阈值,例如,取值为0.8时,仅保留概率加起来大于等于0.8的最可能token的最小集合作为候选集。取值范围为(0,1.0),取值越大,生成的随机性越高;取值越低,生成的确定性越高。 |
stream(可选) | bool | False | 是否使用流式输出。当以stream模式输出结果时,接口返回结果为generator,需要通过迭代获取结果,每个输出为当前生成的整个序列,最后一次输出为最终全部生成结果。 |
top_k | int | 0 | 生成时,采样候选集的大小。例如,取值为50时,仅将单次生成中得分最高的50个token组成随机采样的候选集。取值越大,生成的随机性越高;取值越小,生成的确定性越高。默认值为0,表示不启用top_k策略,此时,仅有top_p策略生效。 |
enable_search | bool | False | 生成时,是否参考搜索的结果。注意:打开搜索并不意味着一定会使用搜索结果;如果打开搜索,模型会将搜索结果作为prompt,进而“自行判断”是否生成结合搜索结果的文本,默认为false |
seed | int | 1234 | 生成时,随机数的种子,用于控制模型生成的随机性。如果使用相同的种子,每次运行生成的结果都将相同;当需要复现模型的生成结果时,可以使用相同的种子。seed参数支持无符号64位整数类型。默认值 1234 |
temperature | float | 1.0 | 用于控制随机性和多样性的程度。具体来说,temperature值控制了生成文本时对每个候选词的概率分布进行平滑的程度。较高的temperature值会降低概率分布的峰值,使得更多的低概率词被选择,生成结果更加多样化;而较低的temperature值则会增强概率分布的峰值,使得高概率词更容易被选择,生成结果更加确定。 取值范围:(0, 2) python version >=1.10.1 java version >= 2.5.1 |
result_format | String | text | [text|message],默认为text。建议使用插件时,使用message类型,输出参考message结果示例 |
返回结果
第一轮对话返回结果如下。
{
"status_code": 200,
"request_id": "1ba713ab-b05a-914e-b4a6-72258ec1d5d8",
"code": "",
"message": "",
"output": {
"text": null,
"finish_reason": null,
"choices": [
{
"finish_reason": "stop",
"message": null,
"messages": [
{
"role": "assistant",
"plugin_call": {
"name": "calculator",
"arguments": "{\"payload__input__text\": \"12345*98765\", \"header__request_id\": \"f275e6\"}"
},
"content": "Thought: 我需要进行乘法运算,需要用到计算器API。"
},
{
"role": "plugin",
"name": "calculator",
"content": "{\"equations\": [\"12345 * 98765\"], \"results\": [1219253925.0]}",
"status": {
"code": 200,
"name": "Success",
"message": "success"
}
},
{
"role": "assistant",
"content": "Thought: 这个问题的答案是1219253925.0。\nFinal Answer: 1219253925.0"
}
]
}
]
},
"usage": {
"input_tokens": 22,
"output_tokens": 130,
"total_tokens": 152
}
}
若使用上述的多轮对话例子,第二轮对话返回结果如下。
{
"status_code": 200,
"request_id": "c9a32395-562f-91a8-ae75-87fb149b4595",
"code": "",
"message": "",
"output": {
"text": null,
"finish_reason": null,
"choices": [
{
"finish_reason": "stop",
"message": null,
"messages": [
{
"role": "assistant",
"plugin_call": {
"name": "calculator",
"arguments": "{\"payload__input__text\": \"1219253925+22222\", \"header__request_id\": \"2\"}"
},
"content": "Thought: 首先我需要将1219253925.0与22222相加,然后再使用计算器API来进行这个运算。"
},
{
"role": "plugin",
"name": "calculator",
"content": "{\"equations\": [\"1219253925 + 22222\"], \"results\": [1219276147.0]}",
"status": {
"code": 200,
"name": "Success",
"message": "success"
}
},
{
"role": "assistant",
"content": "Thought: 现在我知道了结果。\nFinal Answer: 1219276147.0"
}
]
}
]
},
"usage": {
"input_tokens": 86,
"output_tokens": 147,
"total_tokens": 233
}
}
返回参数说明
返回参数 | 类型 | 说明 | 返回条件 |
status_code | int | 200(HTTPStatus.OK)表示请求成功,否则表示请求失败,可以通过code获取错误码,通过message字段获取错误详细信息。 python才有这个字段,java失败会抛异常,异常信息为code,message内容 | |
request_Id | string | 系统生成的标志本次调用的id。 | |
code | string | 表示请求失败,表示错误码,成功忽略。 python only | |
message | string | 失败,表示失败详细信息,成功忽略。 python only | |
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。 | 当result_format为message 输出choices |
choices[i].message | dict | 模型生成消息输出,message/messages仅一个字段有值。 返回message字段表示单条message。 当模型触发插件调用时,返回messages字段表示多条message,用List方式表示。 | 当result_format为message 输出choices |
choices[i].messages | List | ||
message.role | String | 模型role,大模型生成的文本内容为assistant,触发插件调用为plugin | |
message.plugin_call | dict | 模型生成的插件调用信息,包括插件名和参数,仅当模型认为需要调用插件时生成 | 当message.role为assistant时 |
message.content | String | 模型生成的文本 | |
message.name | List | 调用的插件名 | 当message.role为plugin时 |
message.status | dict | 调用插件的状态,包括状态码和状态信息 | |
message.content | String | 插件返回的结果 |
HTTP使用
前提条件
已开通服务并获得API-KEY:API-KEY的获取与配置。
请求地址
POST https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation
入参描述
传参方式 | 字段 | 类型 | 必选 | 描述 | 示例值 |
Header | Content-Type | String | 是 | 请求类型:application/json 或者text/event-stream(开启 SSE 响应) | application/json |
Authorization | String | 是 | API-Key,例如:Bearer d1**2a | Bearer d1**2a | |
X-DashScope-SSE | String | 否 | 跟Accept: text/event-stream 二选一即可启用SSE响应 | enable | |
X-DashScope-Plugin | String | 否 | 可用的插件列表,与插件相关的参数信息,详见插件参数说明 | {"haozhu_recommend_hotel":{},"general_information_retrieval":{"user_token": "eyJhbG……"}} | |
Body | model | String | 是 | 指明需要调用的模型,调用插件请指定为qwen-plus | qwen-plus |
input.prompt | String | 是 | 用户当前输入的期望模型执行指令,支持中英文。 qwen-turbo prompt字段支持 6.5k Tokens 长度; qwen-plus prompt字段支持 6.5k Tokens 长度 | 哪个公园距离我更近 | |
input.history | List | 否 | 用户与模型的对话历史,list中的每个元素是形式为{"user":"用户输入","bot":"模型输出"}的一轮对话,多轮对话按时间正序排列。 | "history": [ { "user":"今天天气好吗?", "bot":"今天天气不错,要出去玩玩嘛?" }, { "user":"那你有什么地方推荐?", "bot":"我建议你去公园,春天来了,花朵开了,很美丽。" } ] | |
input.messages | List | 否 | 用户与模型的对话历史,对话接口未来都会有message传输,不过prompt和history会持续兼容,list中的每个元素形式为{"role":角色, "content": 内容}。角色当前可选值:system、user、assistant。未来可以扩展到更多role。 | "input":{ "messages":[ { "role": "system", "content": "You are a helpful assistant." }, { "role": "user", "content": "你好,附近哪里有博物馆?" }] } | |
input.messages.role | String | message存在的时候不能缺省 | |||
input.messages.content | String | ||||
parameters.result_format | String | 否 | "text"表示旧版本的text "message"表示兼容openai的message | "text" | |
parameters.top_p | Float | 否 | 生成时,核采样方法的概率阈值。例如,取值为0.8时,仅保留累计概率之和大于等于0.8的概率分布中的token,作为随机采样的候选集。取值范围为(0,1.0),取值越大,生成的随机性越高;取值越低,生成的随机性越低。默认值 0.5。注意,取值不要大于等于1 | 0.5 | |
parameters.top_k | Integer | 否 | 生成时,采样候选集的大小。例如,取值为50时,仅将单次生成中得分最高的50个token组成随机采样的候选集。取值越大,生成的随机性越高;取值越小,生成的确定性越高。注意:如果top_k的值大于100,top_k将采用默认值0,表示不启用top_k策略,此时仅有top_p策略生效。 | 50 | |
parameters.seed | Integer | 否 | 生成时,随机数的种子,用于控制模型生成的随机性。如果使用相同的种子,每次运行生成的结果都将相同;当需要复现模型的生成结果时,可以使用相同的种子。seed参数支持无符号64位整数类型。默认值 1234 | 65535 | |
parameters.enable_search | Bool | 否 | 生成时,是否参考搜索的结果。注意:打开搜索并不意味着一定会使用搜索结果;如果打开搜索,模型会将搜索结果作为prompt,进而“自行判断”是否生成结合搜索结果的文本,默认为false | true 或者 false |
出参描述
字段 | 类型 | 输出格式 | 描述 | 示例值 |
output.text | String | 入参result_format=text时候的返回值 | 包含本次请求的算法输出内容。 | 我建议你去颐和园 |
output.finish_reason | String | 有三种情况:正在生成时为null,生成结束时如果由于停止token导致则为stop,生成结束时如果因为生成长度过长导致则为length。 | stop | |
output.choise[list] | List | 入参result_format=message时候的返回值 | 入参result_format=message时候的返回值 | "choices": [ { "finish_reason":"null", "message": { "role": "bot", "content": "周围的咖啡馆在...", } ] |
output.choise[x].finish_reason | String | 停止原因,null:生成过程中 stop:stop token导致结束 length:生成长度导致结束 | ||
output.choise[x].message | Dict | 返回message字段表示单条message。 当模型触发插件调用时,返回messages字段表示多条message,用List方式表示。 | ||
output.choise[x].messages | List | |||
message.role | String | 入参result_format=message时候的返回值 | 角色当前可选值:system、user、assistant、plugin。 作为输出时,大模型生成的文本内容为assistant,触发插件调用为plugin。 | "messages": [ { "role": "assistant", "plugin_call": { "name": "calculator", "arguments": "{\"payload__input__text\": \"12345*98765\", \"header__request_id\": \"f275e6\"}" }, "content": "Thought: 我需要进行乘法运算,需要用到计算器API。" }, { "role": "plugin", "name": "calculator", "content": "{\"equations\": [\"12345 * 98765\"], \"results\": [1219253925.0]}", "status": { "code": 200, "name": "Success", "message": "success" } }, { "role": "assistant", "content": "Thought: 这个问题的答案是1219253925.0。\nFinal Answer: 1219253925.0" } ] |
message.content | String | 当message.role为assistant时,为模型生成的文本 当message.role为plugin时,为插件返回的结果 | ||
message.plugin_call | Dict | 入参result_format=message,并且使用了插件时候的返回值 | 当message.role为assistant时,模型生成的插件调用信息,包括插件名和参数,仅当模型认为需要调用插件时生成。 | |
message.name | List | 当message.role为plugin时,调用的插件名 | ||
message.status | String | 当message.role为plugin时,调用插件的状态,包括状态码和状态信息 | ||
usage.output_tokens | Integer | 通用 | 本次请求算法输出内容的 token 数目。 | 380 |
usage.input_tokens | Integer | 本次请求输入内容的 token 数目。在打开了搜索的情况下,输入的 token 数目因为还需要添加搜索相关内容支持,所以会超出客户在请求中的输入。 | 633 | |
request_id | String | 本次请求的系统唯一码 | 7574ee8f-38a3-4b1e-9280-11c33ab46e51 |
请求示例(SSE关闭)
以下示例展示通过CURL命令来调用通义千问模型的脚本(SSE 关闭)。SSE关闭意味着服务端将一次性返回所有结果。
说明
需要使用您的API-KEY替换示例中的<your-dashscope-api-key> ,代码才能正常运行。
curl -v --location --request POST 'https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation' \
--header 'Authorization: Bearer <your-dashscope-api-key>' \
--header 'Content-Type: application/json' \
--header 'X-DashScope-Plugin: {"calculator":{}}' \
--data-raw '{
"model": "qwen-plus",
"input": {
"messages": [
{
"role": "system",
"content": "You are a helpful assistant."
},
{
"role": "user",
"content": "12345*98765是多少"
}
]
},
"parameters": {
"result_format": "message",
"seed": 42
}
}'
响应示例(SSE关闭)
{
"status_code": 200,
"request_id": "1ba713ab-b05a-914e-b4a6-72258ec1d5d8",
"code": "",
"message": "",
"output": {
"text": null,
"finish_reason": null,
"choices": [
{
"finish_reason": "stop",
"message": null,
"messages": [
{
"role": "assistant",
"plugin_call": {
"name": "calculator",
"arguments": "{\"payload__input__text\": \"12345*98765\", \"header__request_id\": \"f275e6\"}"
},
"content": "Thought: 我需要进行乘法运算,需要用到计算器API。"
},
{
"role": "plugin",
"name": "calculator",
"content": "{\"equations\": [\"12345 * 98765\"], \"results\": [1219253925.0]}",
"status": {
"code": 200,
"name": "Success",
"message": "success"
}
},
{
"role": "assistant",
"content": "Thought: 这个问题的答案是1219253925.0。\nFinal Answer: 1219253925.0"
}
]
}
]
},
"usage": {
"input_tokens": 22,
"output_tokens": 130,
"total_tokens": 152
}
}
上述代码会在整体文本生成完成后,一次性返回所有输出结果。
请求示例(SSE开启)
通过代码--header 'X-DashScope-SSE: enable'
在HTTP header中设置SSE开启,让大模型一边生成一边输出,即通过流式输出的方式尽快地将中间结果显示在屏幕上。
以下示例展示通过CURL命令来调用通义千问模型的脚本(SSE 开启)。
curl -v --location --request POST 'https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation' \
--header 'Authorization: Bearer <your-dashscope-api-key>' \
--header 'X-DashScope-SSE: enable' \
--header 'Content-Type: application/json' \
--header 'X-DashScope-Plugin: {"calculator":{}}' \
--data-raw '{
"model": "qwen-plus",
"input": {
"messages": [
{
"role": "system",
"content": "You are a helpful assistant."
},
{
"role": "user",
"content": "12345*98765是多少"
}
]
},
"parameters": {
"result_format": "message",
"seed": 42
}
}'
响应示例(SSE开启)
id:1
event:result
:HTTP_STATUS/200
data:{"output":{"choices":[{"messages":[{"content":"Thought: ","role":"assistant"}],"finish_reason":"null"}]},"usage":{"total_tokens":25,"input_tokens":22,"output_tokens":3},"request_id":"3a072613-a0e9-9980-a93d-32bb1fbe6f99"}
id:2
event:result
:HTTP_STATUS/200
data:{"output":{"choices":[{"messages":[{"content":"Thought: 我需要使用计算器API来进行数学运算","role":"assistant"}],"finish_reason":"null"}]},"usage":{"total_tokens":33,"input_tokens":22,"output_tokens":11},"request_id":"3a072613-a0e9-9980-a93d-32bb1fbe6f99"}
... ... ... ...
... ... ... ...
id:15
event:result
:HTTP_STATUS/200
data:{"output":{"choices":[{"messages":[{"plugin_call":{"name":"calculator","arguments":"{\"payload__input__text\": \"12345*98765\", \"header__request_id\": \"\"}"},"content":"Thought: 我需要使用计算器API来进行数学运算。","role":"assistant"},{"name":"calculator","role":"plugin","content":"{\"equations\": [\"12345 * 98765\"], \"results\": [1219253925.0]}","status":{"name":"Success","message":"success","code":200}},{"content":"Thought: 这个结果是正确的,我可以告诉用户12345乘以98765等于多少了。\nFinal Answer: 1219253925","role":"assistant"}],"finish_reason":"stop"}]},"usage":{"total_tokens":148,"input_tokens":22,"output_tokens":126},"request_id":"3a072613-a0e9-9980-a93d-32bb1fbe6f99"}
状态码说明
DashScope通用状态码请查阅:返回状态码说明