知识库支持通过 API 接口进行操作,调用 API 接口的前提条件是获取 API 访问密钥(AK/SK)和完成签名鉴权。本文介绍获取访问密钥的方法,并提供签名鉴权和完整调用的多语言示例代码。
在调用知识库的各项能力之前,请确保您已生成访问密钥 Access Key,Access Key 包括以下内容:
请按照以下步骤创建您自己的 AK/SK:
注意
为了您的数据和资金安全,请务必妥善保管您的 AK/SK,不要轻易向他人披露。另外,由于主账号的权限过大,根据权限最小化原则,建议您新建子账号,并使用子账号的 AK/SK。
签名是 API 请求中经过计算得到的一串编码字符串,用于身份认证和防止数据被篡改。
与 AK/SK 不同,每个请求的签名都是独立且临时的,一个签名只能用于一次特定的请求,不能长期固定使用。
签名由签名生成函数 prepare_request 基于以下参数计算而来:
参数 | 含义 | 说明 |
|---|---|---|
method | 请求方法 | 影响签名计算,例如 GET、POST。 |
path | 请求路径 | 例如 |
ak | Access Key ID | 标识 API 调用者。 |
sk | Access Key Secret | 用于 HMAC-SHA256 计算签名(需保密)。 |
params | 查询参数 | 适用于 GET 请求等。 |
data | 请求体 | 适用于 POST、PUT 请求。 |
doseq | 查询参数的格式控制 | 影响 params 的格式。 |
签名生成函数的各语言示例代码见下方说明。
如需了解通过源码生成签名的详情,请参考签名源码示例;如需了解通过 SDK 生成签名的详情,请参考 SDK 概览。
以下为通过 Python SDK 生成签名的示例代码。
安装火山引擎程序包。
pip install volcengine
生成签名。
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
获取 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()