You need to enable JavaScript to run this app.
导航
签名鉴权与调用示例
最近更新时间:2025.03.12 11:35:51首次发布时间:2024.04.17 14:21:05
我的收藏
有用
有用
无用
无用

知识库支持通过 API 接口进行操作,在使用 API 接口之前,需要先完成以下操作。

前提条件

已通过 注册账号及开通服务 页面操作完成注册账号及开通服务。

AK/SK 密钥获取

在调用知识库的各个能力之前,确保您已生成访问密钥 Access Key。Access Key 包括 Access Key ID(简称为 AK) 和 Access Key Secret(简称为 SK),其中,Access Key ID 用于标识用户,Access Key Secret 用于验证用户的密钥,请您妥善保管。
AK/SK 密钥获取方式如下,更多详情请参考 Access Key(密钥)管理

  1. 单击右上角账号名下拉框中的【API 访问密钥】进入对应页面。
    Image
  2. 单击【新建密钥】按钮,可获取 AK/SK,可以此为凭证调用上述已接入应用的接口。
    Image

注意

安全起见,建议新建子账户,并使用子账户的 AK/SK。

签名鉴权

签名是 API 请求中的一串经过计算得到的编码字符串,它用于身份认证和防止数据被篡改。

签名获取了就能一直用吗?

签名不像 ak、sk,每个请求的签名都是独立且临时的,一个签名只能用于一次特定的请求,不能长期固定使用。

签名由什么计算而来?

签名由签名生成函数 prepare_request 基于以下这些参数计算而来:

参数

作用

method(请求方法)

影响签名计算,例如 GET、POST

path(API 请求路径)

例如 "/api/collection/create"

ak(Access Key)

标识 API 调用者

sk(Secret Key)

用于 HMAC-SHA256 计算签名(需保密)

params(查询参数)

适用于 GET 请求等

data(请求体)

适用于 POST、PUT 请求

doseq(查询参数的格式控制)

影响 params 的格式

签名生成函数的各语言具体代码见下方说明。(如需了解通过源码生成签名的详情请参考签名源码示例,如需了解通过 SDK 生成签名的详情请参考 SDK 概览

Python 语言 SDK 生成签名

  1. 安装火山引擎程序包。

    pip install volcengine
    
  2. 生成签名。

    import json
    import sys
    import requests
    
    from volcengine.auth.SignerV4 import SignerV4
    from volcengine.base.Request import Request
    from volcengine.Credentials import Credentials
    
    def prepare_request(method, path, ak, sk, params=None, data=None, doseq=0):
        if params:
            for key in params:
                if (
                    type(params[key]) == int
                    or type(params[key]) == float
                    or type(params[key]) == bool
                ):
                    params[key] = str(params[key])
                # elif sys.version_info[0] != 3: # 在 Python 3.x 中,不需要这部分代码
                #     if type(params[key]) == unicode:
                #         params[key] = params[key].encode("utf-8")
                elif type(params[key]) == list:
                    if not doseq:
                        params[key] = ",".join(params[key])
        r = Request()
        r.set_shema("https")
        r.set_method(method)
        r.set_connection_timeout(10)
        r.set_socket_timeout(10)
        mheaders = {
            "Accept": "application/json",
            "Content-Type": "application/json",
        }
        r.set_headers(mheaders)
        if params:
            r.set_query(params)
        r.set_path(path)
        if data is not None:
            r.set_body(json.dumps(data))
        # 生成签名
        credentials = Credentials(ak, sk, "air", "cn-north-1")
        SignerV4.sign(r, credentials)
        return r
    

GO 语言 SDK 生成签名

  1. 安装火山引擎程序包。

    go get -u github.com/volcengine/volc-sdk-golang
    
  2. 生成签名。

    package main
    
    import (
            "bytes"
            "fmt"
            "net/http"
            "net/url"
            "strings"
            "io/ioutil"
            "github.com/volcengine/volc-sdk-golang/base"
    )
    
    const (
            testAk = "***"
            testSk = "***"
    )
    
    func PrepareRequest(method string, path string, ak string, sk string, query url.Values, body []byte) *http.Request {
            u := url.URL{
                    Scheme:   "https",
                    Host:     "api-knowledgebase.mlp.cn-beijing.volces.com",
                    Path:     "/api/knowledge/collection/search",
            }
            if query != nil {
                    u.RawQuery = query.Encode()
            }
            req, _ := http.NewRequest(strings.ToUpper(method), u.String(), bytes.NewReader(body))
            req.Header.Add("Accept", "application/json")
            req.Header.Add("Content-Type", "application/json")
            req.Header.Add("Host", "api-knowledgebase.mlp.cn-beijing.volces.com")
            credential := base.Credentials{
                    AccessKeyID:     ak,
                    SecretAccessKey: sk,
                    Service:         "air",
                    Region:          "cn-north-1",
            }
            req = credential.Sign(req)
            return req
    }
    

Java 语言 SDK 生成签名

  1. 安装火山引擎程序包。

    <dependency>
        <groupId>com.volcengine</groupId>
        <artifactId>volc-sdk-java</artifactId>
        <version>最新版本</version>
    </dependency> 
    
  2. 生成签名

    package javaTest;
    
    import java.util.List;
    
    import org.apache.http.HttpResponse;
    import org.apache.http.NameValuePair;
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.config.RequestConfig;
    import org.apache.http.client.utils.URIBuilder;
    import org.apache.http.entity.StringEntity;
    import org.apache.http.impl.client.HttpClients;
    import org.apache.http.util.EntityUtils;
    
    import com.volcengine.auth.ISignerV4;
    import com.volcengine.auth.impl.SignerV4Impl;
    import com.volcengine.model.Credentials;
    import com.volcengine.service.SignableRequest;
    
    public class sign {
      public static SignableRequest prepareRequest(String host, String path, String method, List<NameValuePair> params, String body, String ak, String sk) throws Exception {
        SignableRequest request = new SignableRequest();
        request.setMethod(method);
        request.setHeader("Accept", "application/json");
        request.setHeader("Content-Type", "application/json");
        request.setHeader("Host", "api-knowledgebase.mlp.cn-beijing.volces.com");
        request.setEntity(new StringEntity(body, "utf-8"));
    
        URIBuilder builder = request.getUriBuilder();
        builder.setScheme("https");
        builder.setHost(host);
        builder.setPath(path);
        if (params != null) {
          builder.setParameters(params);
        }
    
        RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(5000).setConnectTimeout(2000).build();
        request.setConfig(requestConfig);
    
        Credentials credentials = new Credentials("cn-north-1", "air");
        credentials.setAccessKeyID(ak);
        credentials.setSecretAccessKey(sk);
    
        // 签名
        ISignerV4 ISigner = new SignerV4Impl();
        ISigner.sign(request, credentials);
    
        return request;
      }
    

Node.js 语言 SDK 生成签名

  1. 安装火山引擎程序包。

    pnpm add @volcengine/openapi
    
  2. 生成签名
    注:调用函数 signer 生成请求体 header 后,将生成好的 header 注入到用户请求函数中。

    import { Signer } from '@volcengine/openapi';
    import type { RequestObj } from '@volcengine/openapi/lib/base/types';
    
    interface Options {
      pathname: string
      method: 'GET' | 'POST'
      body?: string // json 字符串,当且仅当 post 请求
      region: 'cn-beijing' | 'cn-shanghai'
      params?: Record<string, any> // 当且仅当 get 请求
    }
    
    function signer({ pathname, method, body, region, params }: Options) {
      const requestObj: RequestObj = {
       region, 
       headers: {
         Accept: 'application/json',
         'Content-type': 'application/json'
       },
       method,
       body,
       pathname,
       params,
     }
    
      const signer = new Signer(requestObj, 'air')
        signer.addAuthorization({
          accessKeyId: 'ak', // 替换为用户 ak
          secretKey: 'sk', // 替换为用户 sk
      })
      return requestObj.headers
    }
    

C# 语言/ PHP 语言 通过源码 生成签名

C#和PHP语言目前未提供SDK生成签名的方式,可参考对应的源码来生成签名:
C#:https://github.com/volcengine/volc-openapi-demos/blob/main/signature/csharp/Program.cs
PHP:https://github.com/volcengine/volc-openapi-demos/blob/main/signature/php/sign.php

知识库 API 调用示例

Python 语言调用示例

获取好AK/SK 密钥后,可以将签名生成函数具体接口调用写进同一个脚本文件中。这里给出将签名生成逻辑与创建知识库接口对接的实践过程,以 Python 代码为例:
注:main 函数中的 'ak/sk' 参数即为您刚才申请到的 ak/sk

import json
import requests
from volcengine.auth.SignerV4 import SignerV4
from volcengine.base.Request import Request
from volcengine.Credentials import Credentials

#签名生成逻辑
def prepare_request(method, path, params=None, data=None, doseq=0):
    #创建request
    if params:
        for key in params:
            if (
                    isinstance(params[key], int)
                    or isinstance(params[key], float)
                    or isinstance(params[key], bool)
            ):
                params[key] = str(params[key])
            elif isinstance(params[key], list):
                if not doseq:
                    params[key] = ",".join(params[key])
    r = Request()
    r.set_shema("http")
    r.set_method(method)
    r.set_connection_timeout(10)
    r.set_socket_timeout(10)
    mheaders = {
        "Accept": "application/json",
        "Content-Type": "application/json",
        "Host": g_knowledge_base_domain,
        "V-Account-Id": account_id,
    }
    r.set_headers(mheaders)
    if params:
        r.set_query(params)
    r.set_host(g_knowledge_base_domain)
    r.set_path(path)
    if data is not None:
        r.set_body(json.dumps(data))
    # 生成签名
    credentials = Credentials(ak, sk, "air", "cn-north-1")
    SignerV4.sign(r, credentials)
    return r

#创建知识库逻辑
def create():
    #创建知识库的请求方式
    method = "POST"
    #创建知识库的请求路径
    path = "/api/knowledge/collection/create"
    #创建知识库所需要的一些参数
    request_params = {
        "name": "lzm_test2",
        "data_type": "unstructured_data",
        "preprocessing": {
            "chunking_strategy":"custom_balance",
            "multi_modal":["image_ocr"]
        },
        "index": {
            "cpu_quota": 1,
            "embedding_model": "doubao-embedding-and-m3",
            "embedding_dimension": 2048,
            "quant": "int8",
            "index_type": "hnsw_hybrid"
        },
    }
    info_req = prepare_request(method=method, path=path, data=request_params)
    rsp = requests.request(
        method=info_req.method,
        url="https://{}{}".format(g_knowledge_base_domain, info_req.path),
        headers=info_req.headers,
        data=info_req.body
    )
    print(rsp.text)

if __name__ == "__main__":
    ak = '刚才申请到的ak'
    sk = '刚才申请到的sk'
    g_knowledge_base_domain = "api-knowledgebase.mlp.cn-beijing.volces.com"
    #调用创建知识库的函数
    create()

Java 语言调用全流程示例

下方代码提供了调用知识库 API 的全流程示例,包括签名+检索+生成+流式/非流式结果解析。
您只需要将其中的 your ak,your sk,your query,your collection,default(知识库所属项目),your resource_id 替换为您真实知识库的相关参数即可完成一次简单的检索生成调用。

Main.java
未知大小

GO 语言调用全流程示例

下方代码提供了调用知识库 API 的全流程示例,包括签名+检索+生成+流式/非流式结果解析。
您只需要将其中的 your ak,your sk,your query,your collection,default(知识库所属项目),your resource_id 替换为您真实知识库的相关参数即可完成一次简单的检索生成调用。

main.go
未知大小