图像理解(精调后)
更新时间:2024-11-12
本文介绍了经过SFT模型训练后发布的服务,调用相关API说明。
注意事项
(1)调用本文API前,需先经过SFT模型训练后发布服务,相关内容请参考新手指南-平台使用快速开始。
(2)适用以下经过SFT模型训练后发布的服务:
- LLaVA
- InternLM-XCompose
- InternVL2
功能介绍
调用本接口,用于根据用户输入的图像和文字,回答图像有关问题。
HTTP调用
鉴权说明
本文API,支持2种鉴权方式。不同鉴权方式,调用方式不同,使用Header、Query参数不同,详见本文请求说明。开发者可以选择以下任一种方式进行鉴权。
请求说明
- 基本信息
请求地址: https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chatv/{创建服务时填写的API地址}
请求方式: POST
- API地址说明
创建服务时填写的API地址,相关内容请查看模型服务-在线服务-服务配置。
- 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参数
名称 | 类型 | 必填 | 描述 |
---|---|---|---|
messages | List(MultimodalMessage) | 是 | 聊天上下文信息,说明: (1)messages成员不能为空,1个成员表示单轮对话 (2)最后一个message为当前请求的信息,前面的message为历史对话信息 (3)当前只支持单轮对话且message中必须包含type=text |
stream | bool | 否 | 是否以流式接口的形式返回数据;默认false |
temperature | float | 否 | 较高的数值会使输出更加随机,而较低的数值会使其更加集中和确定,大于0 |
top_p | float | 否 | 影响输出文本的多样性,取值越大,生成文本的多样性越强。默认0.8,取值范围 [0, 1.0] |
user_id | string | 否 | 表示最终用户的唯一标识符 |
MultimodalMessage
名称 | 类型 | 必填 | 描述 |
---|---|---|---|
role | string | 是 | 当前支持以下: user:表示用户 assistant:表示对话助手 |
content | List(Content) | 是 | 对话内容 |
Content说明
名称 | 类型 | 必填 | 描述 |
---|---|---|---|
type | string | 是 | 当前支持以下: text:表示文本 image_url:表示图片存储URL |
text | string | 否 | 文本内容,说明: (1)一个content中text与image_url有且只有一个 (2)InternLM-XComposer2模型服务,文本内容必须有image_url数量的<ImageHere>关键字 |
image_url | ImageURL | 否 | 图片存储URL,说明: (1)一个content中text与image_url有且只有一个 (2)只有第一轮对话可以包含image_url |
ImageURL说明
名称 | 类型 | 必填 | 描述 |
---|---|---|---|
url | string | 是 | base64图片,支持格式:jpg、png、bmp |
响应说明
名称 | 类型 | 描述 |
---|---|---|
id | string | 本次请求的唯一标识,可用于排查问题 |
object | string | 回包类型“chat.completion”:多轮对话返回 |
model | string | 本次请求调用的model |
created | int | 时间戳 |
choices | choices | 返回结果。只有当stream=false,即为非流式模式调用时返回此字段 |
choices | sse_choices | 返回结果。只有当stream=true,即为流式接口模式时返回此字段 |
usage | usage | token统计信息 |
choices说明
名称 | 类型 | 描述 |
---|---|---|
index | int | choice列表中的序号 |
message | message | 响应信息 |
need_clear_history | bool | 表示用户输入是否存在安全风险,是否关闭当前会话,清理历史会话信息, true:表示用户输入存在安全风险,建议关闭当前会话,清理历史会话信息; false:否,表示用户输入无安全风险 |
ban_round | int | 当need_clear_history为true时,次字段会告知第几轮对话有敏感信息,如果是当前问题,ban_round = -1 |
finish_reason | string | 输出内容标识,说明: · normal:输出内容完全由大模型生成,未触发截断、替换 |
flag | int | 返回flag表示触发安全 |
sse_choices说明
名称 | 类型 | 描述 |
---|---|---|
index | int | choice列表中的序号 |
delta | delta | 响应信息 |
is_end | bool | 流式接口模式下会返回,表示当前子句是否是最后一句 |
need_clear_history | bool | 值为true表示用户输入存在安全风险,建议关闭当前会话,清理历史会话信息,当前模型不过安全,实际返回永远是false |
ban_round | int | 当need_clear_history为true时,次字段会告知第几轮对话有敏感信息,如果是当前问题,ban_round = -1 |
finish_reason | string | 输出内容标识,取值访问及定义如下:"normal":输出内容完全由大模型生成,未触发截断、替换; |
flag | int | 返回flag表示触发安全 |
delta说明
名称 | 类型 | 描述 |
---|---|---|
content | string | 流式响应内容 |
usage说明
名称 | 类型 | 描述 |
---|---|---|
prompt_tokens | int | 问题tokens数 |
completion_tokens | int | 回答tokens数 |
total_tokens | int | tokens总数 |
注意 :同步模式和流式模式,响应参数返回不同,详细内容参考示例描述。
- 同步模式下,响应参数为以上字段的完整json包。
- 流式模式下,各字段的响应参数为 data: {响应参数}。
请求示例(非流式)
以访问凭证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 -X POST 'https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chatv/[创建服务时填写的API名称]?access_token=[步骤一调用接口获取的access_token]' -d '{
"messages": [
{
"role": "user",
"content": [
{
"type": "text",
"text": "What'\''s in this image?"
},
{
"type": "image_url",
"image_url": {
"url": "/9j/4AAQSkZJRgABAQAAAQABAAD/4gHYSUNDX0YyCwrWoajFF******Frq7/3gDaWpvmgVxtNXiwQf/9k="
}
}
]
}
]
}'
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/chatv/[创建服务时填写的API名称]?access_token=" + get_access_token()
payload = json.dumps({
"messages": [
{
"role": "user",
"content": [
{
"type": "text",
"text": "What'\''s in this image?"
},
{
"type": "image_url",
"image_url": {
"url": "/9j/4AAQSkZJRgABAQAAAQABAAD/4gHYSUNDX0YyCwrWoajFF******Frq7/3gDaWpvmgVxtNXiwQf/9k="
}
}
]
}
]
})
headers = {
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
if __name__ == '__main__':
main()
响应示例(非流式)
{
"id": "as-34qizrn6c2",
"object": "chat.completion",
"created": 1677652288,
"model": "j23r****vl_chat",
"choices": [{
"index": 0,
"message": {
"role": "assistant",
"content": "\n\nThis image shows a wooden boardwalk extending through a lush green marshland.",
},
"finish_reason": "normal"
}],
"usage": {
"prompt_tokens": 9,
"completion_tokens": 12,
"total_tokens": 21
}
}
请求示例(流式)
# 步骤一,获取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 -X POST 'https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chatv/[创建服务时填写的API名称]?access_token=[步骤一调用接口获取的access_token]' -d '{
"messages": [
{
"role": "user",
"content": [
{
"type": "text",
"text": "What'\''s in this image?"
},
{
"type": "image_url",
"image_url": {
"url": "/9j/4AAQSkZJRgABAQAAAQABAAD/4gHYSUNDX0YyCwrWoajFF******Frq7/3gDaWpvmgVxtNXiwQf/9k="
}
}
]
}
],
"stream": true
}'
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/chatv/[创建服务时填写的API名称]?access_token=" + get_access_token()
payload = json.dumps({
"messages": [
{
"role": "user",
"content": [
{
"type": "text",
"text": "What'\''s in this image?"
},
{
"type": "image_url",
"image_url": {
"url": "/9j/4AAQSkZJRgABAQAAAQABAAD/4gHYSUNDX0YyCwrWoajFF******Frq7/3gDaWpvmgVxtNXiwQf/9k="
}
}
]
}
],
"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.decode("UTF-8"))
if __name__ == '__main__':
main()
响应示例(流式)
{"id":"as-34qizrn6c2","object":"chat.completion.chunk","created":1694268190,"model":"j23r1p7w_test_qwen_vl_chat", "choices":[{"index":0,"delta":{"role":"assistant","content":""},"finish_reason":null}]}
{"id":"as-34qizrn6c2","object":"chat.completion.chunk","created":1694268190,"model":"j23r1p7w_test_qwen_vl_chat", "choices":[{"index":0,"delta":{"content":"Hello"},"finish_reason":null}]}
....
{"id":"as-34qizrn6c2","object":"chat.completion.chunk","created":1694268190,"model":"j23r1p7w_test_qwen_vl_chat", "choices":[{"index":0,"delta":{},"finish_reason":"normal"}]}
错误码
如果请求错误,服务器返回的JSON文本包含以下参数。
名称 | 描述 |
---|---|
error_code | 错误码 |
error_msg | 错误描述信息,帮助理解和解决发生的错误 |
例如Access Token失效返回以下内容,需要重新获取新的Access Token再次请求。
{
"error_code": 110,
"error_msg": "Access token invalid or no longer valid"
}
更多相关错误码,请查看错误码说明。