智慧图问
注意:插件应用相关功能已于2024年7月31日迁移至AppBuilder,如有需要请查看AppBulier。本文内容不再更新,且于2024年7月19日下线。
功能介绍
图片解析插件,主要功能为图片理解与识别,并对图片内容进行总结概述,输出用户可理解的自然语言文本描述(句子或段落)。识别能力包含文字OCR解析、人物识别、植物识别、商品识别、车辆识别等。
- 文字OCR可对网页截图、办公文档、表格、题目公式、海报广告等进行解析;
- 人物识别包含演员、歌手、企业家等公众人物,可参考百度百科词条人物(不包含国内国际政要等敏感人物);
- 植物识别能力可识别常见的树木、花卉、农作物等;
- 商品识别能力可输出常见商品名称;
- 车辆识别包含常见车型、品牌以及颜色等属性。
针对通用图片,图片解析插件插件可输出简要图片内容描述,包含图片人物的表情动作描述、物品状态属性描述、景物风景描述等。满足智能AI应用在视觉感知能力的扩展与交互。
本文介绍了实现对智慧图问插件的调用使用说明。
注意事项
调用智慧图问API前,需确保已安装智慧图问插件,安装方式请查看插件列表。
SDK调用
功能介绍
SDK支持使用平台插件能力,以帮助用户快速构建 LLM 应用或将 LLM 应用到自建程序中。在使用这一功能前需要先创建应用、设定服务地址、将服务地址作为参数传入千帆 SDK。
该插件可以实现OCR能力。
使用说明
- 调用本文API,需使用应用AK/SK鉴权,调用流程及鉴权介绍详见SDK安装及使用流程。
调用示例(非流式)
import os
import qianfan
# 使用安全认证AK/SK鉴权,通过环境变量方式初始化;替换下列示例中参数,安全认证Access Key替换your_iam_ak,Secret Key替换your_iam_sk
os.environ["QIANFAN_ACCESS_KEY"] = "your_iam_ak"
os.environ["QIANFAN_SECRET_KEY"] = "your_iam_sk"
# Plugin 通过endpoint参数指定插件服务,将your_endpoint替换为服务地址后缀,例如服务地址为https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/plugin/testxxx/,则your_endpoint替换为testxxx,更多介绍详见本文插件服务地址说明
plugin = qianfan.Plugin(endpoint="your_endpoint")
# 智慧图问展示
resp = plugin.do(plugins=["uuid-chatocr"], query="这上面有什么文字?",fileurl="https://xxx.bcebos.com/xxx/xxx.jpeg")
print(resp)
返回示例(非流式)
QfResponse(
code=200,
headers={...},
body={
'result': "根据提供的资料,图像中可以识别出的文字如下:\n\n'25种最有营养价值的水果 百香果 榴莲 葡萄 香蕉 芒果 草莓 沃柑 樱桃 柿子 西瓜 荔枝 蓝莓 杨梅 番石榴 冬枣 橙子 山竹 火龙果 猕猴桃 牛油果 小红 香梨 哈密瓜 桂圆 苹果 小红书 水蜜桃 7 '",
'log_id': 3927637630508236109
}, statistic={}, request=QfRequest(...)
)
调用示例(流式)
import os
import qianfan
# 使用安全认证AK/SK鉴权,通过环境变量方式初始化;替换下列示例中参数,安全认证Access Key替换your_iam_ak,Secret Key替换your_iam_sk
os.environ["QIANFAN_ACCESS_KEY"] = "your_iam_ak"
os.environ["QIANFAN_SECRET_KEY"] = "your_iam_sk"
# Plugin 通过endpoint参数指定插件服务,将your_endpoint替换为服务地址后缀,例如服务地址为https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/plugin/testxxx/,则your_endpoint替换为testxxx,更多介绍详见本文插件服务地址说明
plugin = qianfan.Plugin(endpoint="your_endpoint")
# 智慧图问展示
resp = plugin.do(plugins=["uuid-chatocr"], stream=True, query="这上面的牛是什么颜色的", verbose=True, fileurl="https://xxx.bcebos.com/xxx")
for r in resp:
print(r)
返回示例(流式)
QfResponse(
code=200,
headers={...},
body={
'plugin_id': 'uuid-chatocr',
'request': {
'query': '这上面有什么文字?',
'filename': '9d54a81a19504359b81d4e13f75ace0b.jpeg'
},
'response': {
'error_no': 0,
'error_msg': 'success',
'format': 'json',
'result': {
'llm_result': "根据提供的资料,图像中可以识别出的文字如下:\n\n'25种最有营养价值的水果 百香果 榴莲 葡萄 香蕉 芒果 草莓 沃柑 樱桃 柿子 西瓜 荔枝 蓝莓 杨梅 番石榴 冬枣 橙子 山竹 火龙果 猕猴桃 牛油果 小红 香梨 哈密瓜 桂圆 苹果 小红书 水蜜桃 7 '\n\n这些文字主要描述了25种有营养的水果,以及一些其他信息。",
'ocr_result': [
{'rect': {'left': 73, 'top': 103, 'width': 925, 'height': 130}, 'word': '25种最有营养价值的水果'},
{'rect': {'left': 101, 'top': 460, 'width': 138, 'height': 49}, 'word': '百香果'}, ...
],
'classify_ret': None
},
'logid': 3397643593
},
'log_id': 6954105891819143907
},
statistic={...},
request=QfRequest(...)
)
插件服务地址说明
调用插件SDK时,需通过参数endpoint指定插件服务,endpoint值可以通过插件服务地址获取。
(1)配置插件应用服务成功后,可以查看服务地址等信息。如何配置插件应用服务,详见插件编排使用说明。
说明:只有服务状态为上线状态,才可以查看自动生成的服务地址。
(2)在千帆ModelBuilder控制台-系统配置-插件编排页面,点击某插件服务详情。
(3)在插件的详情页中,查看完整的服务地址。
(4)获取endpoint值。
例如,插件服务地址为https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/plugin/testxxx/
,则endpoint值为testxxx。
请求参数
名称 | 类型 | 必填 | 描述 |
---|---|---|---|
query | string | 是 | 查询信息。说明: (1)成员不能为空 (2)长度不能超过1000个字符 |
plugins | list[string] | 否 | 需要调用的插件ID列表,说明: (1)如果使用智慧图问插件,该字段必填,且为固定值["uuid-chatocr"] (2)如果不填写该字段,是在插件编排时配置范围内进行意图识别,使用模型进行回答 |
fileurl | string | 是 | 文件的URL地址,说明: (1)图片要求是百度BOS上的图片,即用户必须现将图片上传至百度BOS,图片url地址包含bcebos.com;只有在访问北京区域BOS,才不会产生BOS的外网流出流量费用 (2)图片支持jpg、jpeg、png,必须带后缀名 (3)图像尺寸最小为80*80,如果图像小于该尺寸,则无法识别 |
stream | bool | 否 | 是否以流式接口的形式返回数据,默认false,可选值如下: (1)true: 是,以流式接口的形式返回数据 (2)false:否,非流式接口形式返回数据 |
llm | dict | 否 | llm相关参数,不指定参数时,使用调试过程中的默认值。 参数示例: "llm":{"temperature":0.1,"top_p":1,"penalty_score":1} |
input_variables | dict | 否 | 说明: (1)如果prompt中使用了变量,推理时可以填写具体值; (2)如果prompt中未使用变量,该字段不填。 参数示例: "input_variables":{"key1":"value1","key2":"value2",} key1、key2为配置时prompt中使用了变量key |
history | dict | 否 | 聊天上下文信息。 参数示例: [{"role":"user","content":"..."},{"role":"assistant","content":"..."},...] |
verbose | bool | 否 | 是否返回插件的原始请求信息,默认false,可选值如下: true:是,返回插件的原始请求信息meta_info false:否,不返回插件的原始请求信息meta_info |
返回参数
名称 | 类型 | 描述 |
---|---|---|
log_id | int | 唯一,用于问题定位 |
result | string | 插件返回结果 |
sentence_id | int | 表示当前子句的序号,只有在流式接口模式下会返回该字段 |
is_end | bool | 表示当前子句是否是最后一句,只有在流式接口模式下会返回该字段 |
meta_info | dict | 插件的原始请求信息 |
meta_info说明
名称 | 类型 | 描述 |
---|---|---|
plugin_id | string | 插件名 |
request | dict | 原始请求参数 |
response | dict | 原始返回结果 |
request说明
名称 | 类型 | 描述 |
---|---|---|
query | string | 用于查询用户请求 |
filename | string | 从文件地址中解析出的文件名称 |
response说明
名称 | 类型 | 描述 |
---|---|---|
error_no | int | 错误码 |
error_msg | string | 错误信息 |
format | string | 当前返回的数据格式,可忽略 |
result | dict | OCR 返回的识别信息 |
logid | int | 唯一的log id,用于问题定位 |
result说明
名称 | 类型 | 描述 |
---|---|---|
llm_result | string | 用户请求的实际返回结果 |
ocr_result | list[dict] | OCR 接口返回的识别文字信息 |
ocr_result说明
名称 | 类型 | 描述 |
---|---|---|
rect | dict | 文字所在的位置,识别为矩形框 |
word | string | 文字内容 |
rect说明
名称 | 类型 | 描述 |
---|---|---|
left | int | 文字框左上角相对于图片左上角的横向偏移量,单位为像素 |
top | int | 文字框左上角相对于图片左上角的纵向偏移量,单位为像素 |
width | int | 文字框的宽度,单位为像素 |
height | int | 文字框的高度,单位为像素 |
HTTP调用
鉴权说明
本文API,支持2种鉴权方式。不同鉴权方式,调用方式不同,使用Header、Query参数不同,详见本文请求说明。开发者可以选择以下任一种方式进行鉴权。
请求说明
- 基本信息
请求地址: https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/plugin/{服务地址后缀名称}/
请求方式: POST
- 服务地址说明
配置插件应用服务成功后,可以查看服务地址等信息。如何配置插件应用服务,详见插件编排使用说明。
说明:只有服务状态为上线状态,才可以查看自动生成的服务地址。
在插件的详情页中,查看完整的服务地址。
- Header参数
根据不同鉴权方式,查看对应Header参数。
访问凭证access_token鉴权
名称 | 类型 | 必填 | 描述 |
---|---|---|---|
Content-Type | string | 是 | 固定值application/json |
基于安全认证AK/SK进行签名计算鉴权
名称 | 类型 | 必填 | 描述 |
---|---|---|---|
Content-Type | string | 是 | 固定值application/json |
x-bce-date | string | 否 | 当前时间,遵循ISO8601规范,格式如2016-04-06T08:23:49Z |
Authorization | string | 是 | 用于验证请求合法性的认证信息,更多内容请参考鉴权认证机制,签名工具可参考IAM签名工具 |
- Query参数
只有访问凭证access_token鉴权方式,需使用Query参数。
访问凭证access_token鉴权
名称 | 类型 | 必填 | 描述 |
---|---|---|---|
access_token | string | 是 | 通过API Key和Secret Key获取的access_token,参考Access Token获取 |
- Body参数
名称 | 类型 | 必填 | 描述 |
---|---|---|---|
query | string | 是 | 查询信息。说明: (1)成员不能为空 (2)长度不能超过1000个字符 |
plugins | list[string] | 否 | 需要调用的插件ID列表,说明: (1)如果使用智慧图问插件,该字段必填,且固定值为["uuid-chatocr"] ,参数示例:"plugins":["uuid-chatocr"] (2)如果不填写该字段,是在插件编排时配置范围内进行意图识别,使用模型进行回答 |
fileurl | string | 是 | 文件URL地址,说明: (1)图片要求是百度BOS上的图片,即用户必须现将图片上传至百度BOS,图片url地址包含bcebos.com;只有在访问北京区域BOS,才不会产生BOS的外网流出流量费用 (2)图片支持jpg、jpeg、png,必须带后缀名 (3)图像尺寸最小为80*80,如果图像小于该尺寸,则无法识别 |
stream | bool | 否 | 是否以流式接口的形式返回数据,默认false,可选值如下: (1)true: 是,以流式接口的形式返回数据 (2)false:否,非流式接口形式返回数据 |
llm | object | 否 | llm相关参数,不指定参数时,使用调试过程中的默认值。 参数示例: "llm":{"temperature":0.1,"top_p":1,"penalty_score":1} |
input_variables | object | 否 | 说明: (1)如果prompt中使用了变量,推理时可以填写具体值; (2)如果prompt中未使用变量,该字段不填。 参数示例: "input_variables":{"key1":"value1","key2":"value2",} key1、key2为配置时prompt中使用了变量key |
history | object | 否 | 聊天上下文信息。 参数示例: [{"role":"user","content":"..."},{"role":"assistant","content":"..."},...] |
verbose | bool | 否 | 是否返回插件的原始请求信息,默认false,可选值如下: true:是,返回插件的原始请求信息meta_info false:否,不返回插件的原始请求信息meta_info |
响应说明
名称 | 类型 | 描述 |
---|---|---|
log_id | number | 唯一,用于问题定位 |
result | string | 插件返回结果 |
meta_info | object | 插件的原始请求信息 |
sentence_id | int | 表示当前子句的序号,只有在流式接口模式下会返回该字段 |
is_end | bool | 表示当前子句是否是最后一句,只有在流式接口模式下会返回该字段 |
meta_info说明
名称 | 类型 | 描述 |
---|---|---|
plugin_id | string | 插件名 |
request | object | 原始请求参数 |
response | object | 原始返回结果 |
request说明
名称 | 类型 | 描述 |
---|---|---|
query | string | 用于查询用户请求 |
filename | string | 从文件地址中解析出的文件名称 |
response说明
名称 | 类型 | 描述 |
---|---|---|
error_no | Integer | 错误码 |
error_msg | string | 错误信息 |
format | string | 当前返回的数据格式,可忽略 |
result | object | OCR 返回的识别信息 |
logid | number | 唯一的logid,用于问题定位 |
result说明
名称 | 类型 | 描述 |
---|---|---|
llm_result | string | 用户请求的实际返回结果 |
ocr_result | list[object] | OCR 接口返回的识别文字信息 |
ocr_result说明
名称 | 类型 | 描述 |
---|---|---|
rect | object | 文字所在的位置,识别为矩形框 |
word | string | 文字内容 |
rect说明
名称 | 类型 | 描述 |
---|---|---|
left | Integer | 文字框左上角相对于图片左上角的横向偏移量,单位为像素 |
top | Integer | 文字框左上角相对于图片左上角的纵向偏移量,单位为像素 |
width | Integer | 文字框的宽度,单位为像素 |
height | Integer | 文字框的高度,单位为像素 |
请求示例(非流式)
以访问凭证access_token鉴权方式为例,说明如何调用API,示例如下。
# 步骤一,获取access_token,替换下列示例中的API Key与Secret Key
curl 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=[API Key]&client_secret=[Secret Key]'
# 步骤二,调用本文API,使用步骤一获取的access_token,替换下列示例中的“调用接口获取的access_token”
curl 'https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/plugin/[服务后缀名称]/?access_token=[步骤一调用接口获取的access_token]'
--data '{"query": "请解析这张图片,并告诉我通知书上的大学是","plugins":["uuid-chatocr"],"verbose":true,"fileurl":"http://xxxx"}'
-H 'Content-Type: application/json'
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]"
payload = json.dumps("")
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
return response.json().get("access_token")
def main():
url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/plugin/[服务后缀名称]/?access_token=" + get_access_token()
payload = json.dumps({
"query": "请解析这张图片,并告诉我通知书上的大学是",
"plugins":["uuid-chatocr"],
"verbose":true,
"fileurl":"http://xxxx"
})
headers = {
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
if __name__ == '__main__':
main()
响应示例(非流式)
{
"log_id": 46009xxxxxx8777,
"result": "根据提供的图像文字信息,通知书上的大学是“某某大学”。",
"meta_info": {
"requests": {
"query": "通知书上的大学是什么?",
"filename": "通知书.jpeg"
},
"response": {
"error_no": 0,
"error_msg": "success",
"format": "json",
"result": {
"llm_result": "根据提供的图像文字信息,通知书上的大学是“某某大学”。",
"ocr_result": [
{
"rect": {
"left": 399,
"top": 304,
"width": 291,
"height": 92
},
"word": "某某大学"
},
{
"rect": {
"left": 206,
"top": 509,
"width": 687,
"height": 118
},
"word": "录取通知书"
}
]
},
"logid": 2796978908
}
}
}
请求示例(流式)
以访问凭证access_token鉴权方式为例,说明如何调用API,示例如下。
# 步骤一,获取access_token,替换下列示例中的API Key与Secret Key
curl 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=[API Key]&client_secret=[Secret Key]'
# 步骤二,调用本文API,使用步骤一获取的access_token,替换下列示例中的“调用接口获取的access_token”
curl 'https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/plugin/[服务后缀名称]/?access_token=[步骤一调用接口获取的access_token]'
--data '{"query": "请解析这张图片,并告诉我通知书上的大学是","plugins":["uuid-chatocr"],"verbose":true,"stream":true,"fileurl":"http://xxxx"}'
-H 'Content-Type: application/json'
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]"
payload = json.dumps("")
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
return response.json().get("access_token")
def main():
url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/plugin/[服务后缀名称]/?access_token=" + get_access_token()
payload = json.dumps({
"query": "请解析这张图片,并告诉我通知书上的大学是",
"plugins":["uuid-chatocr"],
"verbose":true,
"fileurl":"http://xxxx",
"stream": true
})
headers = {
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload, stream=True)
for line in response.iter_lines():
print(line)
if __name__ == '__main__':
main()
响应示例(流式)
# 首包需要的回显信息
data: {"plugin_id": "uuid-chatocr", "requests": {"query": "通知书上的大学是什么?", "filename": "通知书.jpeg"}, "response": {"error_no": 0, "error_msg": "success", "format": "json", "result": {"llm_result": "根据提供的图像文字信息,通知书上的大学是“北京大学”。", "ocr_result": [{"rect": {"left": 399, "top": 304, "width": 291, "height": 92}, "word": "北京大学"}, {"rect": {"left": 206, "top": 509, "width": 687, "height": 118}, "word": "录取通知书"}]}}}
# 后续为用户请求的响应结果
data: {"result": "根据提供的图像文字信息,通知书上的大学是“北京大学”。", "sentence_id": 0, "is_end": false, "log_id":2489987640869208485}
data: {"result": "", "sentence_id": 1, "is_end": true, "log_id":2489987640869208485}
错误码
若请求错误,服务器将返回的JSON文本包含以下参数:
名称 | 描述 |
---|---|
error_code | 错误码 |
error_msg | 错误描述信息,帮助理解和解决发生的错误 |
例如Access Token失效返回:
{
"error_code": 110,
"error_msg": "Access token invalid or no longer valid"
}
需要重新获取新的Access Token再次请求。
更多相关错误码,请查看错误码说明。
错误码 | 错误信息 | 描述 |
---|---|---|
0 | 正常 | 正常 |
216100 | 请求参数错误 | 请求参数错误 |
216400 | 服务处理异常错误 | 服务处理异常错误 |
216203 | 图片处理失败 | 图片处理失败 |
337008 | 插件id输入错误 | 一般指插件id输入错误,如插件id超过3个可能会引起此错误 |