资讯 社区 文档
技术能力
语音技术
文字识别
人脸与人体
图像技术
语言与知识
视频技术

图像理解(精调后)

本文介绍了经过SFT模型训练后发布的服务,调用相关API说明。

注意事项

(1)调用本文API前,需先经过SFT模型训练后发布服务,相关内容请参考新手指南-平台使用快速开始

(2)适用以下经过SFT模型训练后发布的服务:

  • LLaVA
  • InternLM-XCompose
  • InternVL2

接口描述

调用本接口,用于根据用户输入的图像和文字,回答图像有关问题。

鉴权说明

本文API,支持2种鉴权方式。不同鉴权方式,调用方式不同,使用Header、Query参数不同,详见本文请求说明。开发者可以选择以下任一种方式进行鉴权。

· 访问凭证access_token鉴权

· 基于安全认证AK/SK进行签名计算鉴权

请求结构

以访问凭证access_token鉴权方式为例,说明调用API请求结构,示例如下。

POST /rpc/2.0/ai_custom/v1/wenxinworkshop/chatv/[创建服务时填写的API名称]?access_token=24.4a3a19b******18992 HTTP/1.1
Host: aip.baidubce.com
Content-Type: application/json

{
  "messages": [
      {
        "role": "user",
        "content": [
          {
            "type": "text",
            "text": "What'\''s in this image?"
          },
          {
            "type": "image_url",
            "image_url": {
              "url": "/9j/4AAQSkZJRgABAQAAAQABAAD/4gHYSUNDX0YyCwrWoajFF******Frq7/3gDaWpvmgVxtNXiwQf/9k="
            }
          }
        ]
      }
    ]
}

API地址说明

创建服务时填写的API地址,相关内容请查看模型服务-在线服务-服务配置

请求头域

除公共头域外,无其它特殊头域。注意:鉴权方式不同,对应请求头域不同。

请求参数

  • 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"
}

更多相关错误码,请查看错误码说明

上一篇
文心一格(精调后)
下一篇
Token计算