阿里云百炼知识库提供开放的API接口,便于您快速接入现有业务系统,实现自动化操作,并应对复杂的检索需求。
知识库相关功能仅能在中国站华北2(北京)地域开通和使用,其他地域如新加坡、德国(法兰克福)等均不支持知识库功能。
前置步骤
-
子账号(主账号不需要)需获取API权限(AliyunBailianDataFullAccess策略),并加入一个业务空间,然后才能通过阿里云API操作知识库。
子账号只能操作已加入业务空间中的知识库;主账号可操作所有业务空间下的知识库。
-
安装最新版阿里云百炼SDK,以调用知识库相关的阿里云API。如何安装请参考阿里云SDK开发参考目录下文档。
如果SDK不能满足需求,可以通过签名机制(较为复杂)HTTP请求知识库的相关接口。具体对接方式请参见API概览。
-
获取AccessKey和AccessKey Secret以及业务空间 ID,并将它们配置到系统环境变量,以运行示例代码。以Linux操作系统为例:
如果您使用了 IDE 或其他辅助开发插件,需自行将ALIBABA_CLOUD_ACCESS_KEY_ID、ALIBABA_CLOUD_ACCESS_KEY_SECRET和WORKSPACE_ID变量配置到相应的开发环境中。
Copy
export ALIBABA_CLOUD_ACCESS_KEY_ID='您的阿里云访问密钥ID'
export ALIBABA_CLOUD_ACCESS_KEY_SECRET='您的阿里云访问密钥密码'
export WORKSPACE_ID='您的阿里云百炼业务空间ID'
- 准备好示例知识文档阿里云百炼系列手机产品介绍.docx,用于创建知识库。
完整示例代码
完整示例代码
- 创建知识库
- 检索知识库
- 更新知识库
- 管理知识库
- 在调用本示例之前,请务必完成上述所有前置步骤。子账号调用本示例前需获取AliyunBailianDataFullAccess策略。
- 若您使用了 IDE 或其他辅助开发插件,需将
ALIBABA_CLOUD_ACCESS_KEY_ID、ALIBABA_CLOUD_ACCESS_KEY_SECRET和WORKSPACE_ID变量配置到相应的开发环境中。
Python
# 示例代码仅供参考,请勿在生产环境中直接使用
import hashlib
import os
import time
import requests
from alibabacloud_bailian20231229 import models as bailian_20231229_models
from alibabacloud_bailian20231229.client import Client as bailian20231229Client
from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_tea_util import models as util_models
def check_environment_variables():
"""检查并提示设置必要的环境变量"""
required_vars = {
'ALIBABA_CLOUD_ACCESS_KEY_ID': '阿里云访问密钥ID',
'ALIBABA_CLOUD_ACCESS_KEY_SECRET': '阿里云访问密钥密码',
'WORKSPACE_ID': '阿里云百炼业务空间ID'
}
missing_vars = []
for var, description in required_vars.items():
if not os.environ.get(var):
missing_vars.append(var)
print(f"错误:请设置 {var} 环境变量 ({description})")
return len(missing_vars) == 0
def calculate_md5(file_path: str) -> str:
"""
计算文件的MD5值。
参数:
file_path (str): 文件本地路径。
返回:
str: 文件的MD5值。
"""
md5_hash = hashlib.md5()
# 以二进制形式读取文件
with open(file_path, "rb") as f:
# 按块读取文件,避免大文件占用过多内存
for chunk in iter(lambda: f.read(4096), b""):
md5_hash.update(chunk)
return md5_hash.hexdigest()
def get_file_size(file_path: str) -> int:
"""
获取文件大小(以字节为单位)。
参数:
file_path (str): 文件本地路径。
返回:
int: 文件大小(以字节为单位)。
"""
return os.path.getsize(file_path)
# 初始化客户端(Client)
def create_client() -> bailian20231229Client:
"""
创建并配置客户端(Client)。
返回:
bailian20231229Client: 配置好的客户端(Client)。
"""
config = open_api_models.Config(
access_key_id=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID'),
access_key_secret=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET')
)
# 下方接入地址以公有云的公网接入地址为例,可按需更换接入地址。
config.endpoint = 'bailian.ap-southeast-1.aliyuncs.com'
return bailian20231229Client(config)
# 申请文件上传租约
def apply_lease(client, category_id, file_name, file_md5, file_size, workspace_id):
"""
从阿里云百炼服务申请文件上传租约。
参数:
client (bailian20231229Client): 客户端(Client)。
category_id (str): 类目ID。
file_name (str): 文件名称。
file_md5 (str): 文件的MD5值。
file_size (int): 文件大小(以字节为单位)。
workspace_id (str): 业务空间ID。
返回:
阿里云百炼服务的响应。
"""
headers = {}
request = bailian_20231229_models.ApplyFileUploadLeaseRequest(
file_name=file_name,
md_5=file_md5,
size_in_bytes=file_size,
)
runtime = util_models.RuntimeOptions()
return client.apply_file_upload_lease_with_options(category_id, workspace_id, request, headers, runtime)
# 上传文件到临时存储
def upload_file(pre_signed_url, headers, file_path):
"""
将文件上传到阿里云百炼服务。
参数:
pre_signed_url (str): 上传租约中的 URL。
headers (dict): 上传请求的头部。
file_path (str): 文件本地路径。
"""
with open(file_path, 'rb') as f:
file_content = f.read()
upload_headers = {
"X-bailian-extra": headers["X-bailian-extra"],
"Content-Type": headers["Content-Type"]
}
response = requests.put(pre_signed_url, data=file_content, headers=upload_headers)
response.raise_for_status()
# 添加文件到类目中
def add_file(client: bailian20231229Client, lease_id: str, parser: str, category_id: str, workspace_id: str):
"""
将文件添加到阿里云百炼服务的指定类目中。
参数:
client (bailian20231229Client): 客户端(Client)。
lease_id (str): 租约ID。
parser (str): 用于文件的解析器。
category_id (str): 类目ID。
workspace_id (str): 业务空间ID。
返回:
阿里云百炼服务的响应。
"""
headers = {}
request = bailian_20231229_models.AddFileRequest(
lease_id=lease_id,
parser=parser,
category_id=category_id,
)
runtime = util_models.RuntimeOptions()
return client.add_file_with_options(workspace_id, request, headers, runtime)
# 查询文件的解析状态
def describe_file(client, workspace_id, file_id):
"""
获取文件的基本信息。
参数:
client (bailian20231229Client): 客户端(Client)。
workspace_id (str): 业务空间ID。
file_id (str): 文件ID。
返回:
阿里云百炼服务的响应。
"""
headers = {}
runtime = util_models.RuntimeOptions()
return client.describe_file_with_options(workspace_id, file_id, headers, runtime)
# 初始化知识库(索引)
def create_index(client, workspace_id, file_id, name, structure_type, source_type, sink_type):
"""
在阿里云百炼服务中创建知识库(初始化)。
参数:
client (bailian20231229Client): 客户端(Client)。
workspace_id (str): 业务空间ID。
file_id (str): 文件ID。
name (str): 知识库名称。
structure_type (str): 知识库的数据类型。
source_type (str): 应用数据的数据类型,支持类目类型和文件类型。
sink_type (str): 知识库的向量存储类型。
返回:
阿里云百炼服务的响应。
"""
headers = {}
request = bailian_20231229_models.CreateIndexRequest(
structure_type=structure_type,
name=name,
source_type=source_type,
sink_type=sink_type,
document_ids=[file_id]
)
runtime = util_models.RuntimeOptions()
return client.create_index_with_options(workspace_id, request, headers, runtime)
# 提交索引任务
def submit_index(client, workspace_id, index_id):
"""
向阿里云百炼服务提交索引任务。
参数:
client (bailian20231229Client): 客户端(Client)。
workspace_id (str): 业务空间ID。
index_id (str): 知识库ID。
返回:
阿里云百炼服务的响应。
"""
headers = {}
submit_index_job_request = bailian_20231229_models.SubmitIndexJobRequest(
index_id=index_id
)
runtime = util_models.RuntimeOptions()
return client.submit_index_job_with_options(workspace_id, submit_index_job_request, headers, runtime)
# 等待索引任务完成
def get_index_job_status(client, workspace_id, job_id, index_id):
"""
查询索引任务状态。
参数:
client (bailian20231229Client): 客户端(Client)。
workspace_id (str): 业务空间ID。
index_id (str): 知识库ID。
job_id (str): 任务ID。
返回:
阿里云百炼服务的响应。
"""
headers = {}
get_index_job_status_request = bailian_20231229_models.GetIndexJobStatusRequest(
index_id=index_id,
job_id=job_id
)
runtime = util_models.RuntimeOptions()
return client.get_index_job_status_with_options(workspace_id, get_index_job_status_request, headers, runtime)
def create_knowledge_base(
file_path: str,
workspace_id: str,
name: str
):
"""
使用阿里云百炼服务创建知识库。
参数:
file_path (str): 文件本地路径。
workspace_id (str): 业务空间ID。
name (str): 知识库名称。
返回:
str or None: 如果成功,返回知识库ID;否则返回None。
"""
# 设置默认值
category_id = 'default'
parser = 'DASHSCOPE_DOCMIND'
source_type = 'DATA_CENTER_FILE'
structure_type = 'unstructured'
sink_type = 'DEFAULT'
try:
# 步骤1:创建客户端(Client)
print("步骤1:创建Client")
client = create_client()
# 步骤2:准备文件信息
print("步骤2:准备文件信息")
file_name = os.path.basename(file_path)
file_md5 = calculate_md5(file_path)
file_size = get_file_size(file_path)
# 步骤3:申请上传租约
print("步骤3:向阿里云百炼申请上传租约")
lease_response = apply_lease(client, category_id, file_name, file_md5, file_size, workspace_id)
lease_id = lease_response.body.data.file_upload_lease_id
upload_url = lease_response.body.data.param.url
upload_headers = lease_response.body.data.param.headers
# 步骤4:上传文件
print("步骤4:上传文件到阿里云百炼")
upload_file(upload_url, upload_headers, file_path)
# 步骤5:将文件添加到服务器
print("步骤5:将文件添加到阿里云百炼服务器")
add_response = add_file(client, lease_id, parser, category_id, workspace_id)
file_id = add_response.body.data.file_id
# 步骤6:检查文件状态
print("步骤6:检查阿里云百炼中的文件状态")
while True:
describe_response = describe_file(client, workspace_id, file_id)
status = describe_response.body.data.status
print(f"当前文件状态:{status}")
if status == 'INIT':
print("文件待解析,请稍候...")
elif status == 'PARSING':
print("文件解析中,请稍候...")
elif status == 'PARSE_SUCCESS':
print("文件解析完成!")
break
else:
print(f"未知的文件状态:{status},请联系技术支持。")
return None
time.sleep(5)
# 步骤7:初始化知识库
print("步骤7:在阿里云百炼中创建知识库")
index_response = create_index(client, workspace_id, file_id, name, structure_type, source_type, sink_type)
index_id = index_response.body.data.id
# 步骤8:提交索引任务
print("步骤8:向阿里云百炼提交索引任务")
submit_response = submit_index(client, workspace_id, index_id)
job_id = submit_response.body.data.id
# 步骤9:获取索引任务状态
print("步骤9:获取阿里云百炼索引任务状态")
while True:
get_index_job_status_response = get_index_job_status(client, workspace_id, job_id, index_id)
status = get_index_job_status_response.body.data.status
print(f"当前索引任务状态:{status}")
if status == 'COMPLETED':
break
time.sleep(5)
print("阿里云百炼知识库创建成功!")
return index_id
except Exception as e:
print(f"发生错误:{e}")
return None
def main():
if not check_environment_variables():
print("环境变量校验未通过。")
return
file_path = input("请输入您需要上传文件的实际本地路径(以Linux为例:/xxx/xxx/阿里云百炼系列手机产品介绍.docx):")
kb_name = input("请为您的知识库输入一个名称:")
workspace_id = os.environ.get('WORKSPACE_ID')
create_knowledge_base(file_path, workspace_id, kb_name)
if __name__ == '__main__':
main()
- 在调用本示例之前,请务必完成上述所有前置步骤。子账号调用本示例前需获取AliyunBailianDataFullAccess策略。
- 若您使用了 IDE 或其他辅助开发插件,需将
ALIBABA_CLOUD_ACCESS_KEY_ID、ALIBABA_CLOUD_ACCESS_KEY_SECRET和WORKSPACE_ID变量配置到相应的开发环境中。
Python
# 示例代码仅供参考,请勿在生产环境中直接使用
import os
from alibabacloud_bailian20231229 import models as bailian_20231229_models
from alibabacloud_bailian20231229.client import Client as bailian20231229Client
from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_tea_util import models as util_models
from alibabacloud_tea_util.client import Client as UtilClient
def check_environment_variables():
"""检查并提示设置必要的环境变量"""
required_vars = {
'ALIBABA_CLOUD_ACCESS_KEY_ID': '阿里云访问密钥ID',
'ALIBABA_CLOUD_ACCESS_KEY_SECRET': '阿里云访问密钥密码',
'WORKSPACE_ID': '阿里云百炼业务空间ID'
}
missing_vars = []
for var, description in required_vars.items():
if not os.environ.get(var):
missing_vars.append(var)
print(f"错误:请设置 {var} 环境变量 ({description})")
return len(missing_vars) == 0
# 创建客户端(Client)
def create_client() -> bailian20231229Client:
"""
创建并配置客户端(Client)。
返回:
bailian20231229Client: 配置好的客户端(Client)。
"""
config = open_api_models.Config(
access_key_id=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID'),
access_key_secret=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET')
)
# 下方接入地址以公有云的公网接入地址为例,可按需更换接入地址。
config.endpoint = 'bailian.ap-southeast-1.aliyuncs.com'
return bailian20231229Client(config)
# 检索知识库
def retrieve_index(client, workspace_id, index_id, query):
"""
在指定的知识库中检索信息。
参数:
client (bailian20231229Client): 客户端(Client)。
workspace_id (str): 业务空间ID。
index_id (str): 知识库ID。
query (str): 检索 query。
返回:
阿里云百炼服务的响应。
"""
headers = {}
retrieve_request = bailian_20231229_models.RetrieveRequest(
index_id=index_id,
query=query
)
runtime = util_models.RuntimeOptions()
return client.retrieve_with_options(workspace_id, retrieve_request, headers, runtime)
def main():
"""
使用阿里云百炼服务检索知识库。
返回:
str or None: 如果成功,返回检索召回的文本切片;否则返回None。
"""
if not check_environment_variables():
print("环境变量校验未通过。")
return
try:
print("步骤1:创建Client")
client = create_client()
print("步骤2:检索知识库")
index_id = input("请输入知识库ID:") # 即 CreateIndex 接口返回的 Data.Id,您也可以在阿里云百炼控制台的知识库页面获取。
query = input("请输入检索query:")
workspace_id = os.environ.get('WORKSPACE_ID')
resp = retrieve_index(client, workspace_id, index_id, query)
result = UtilClient.to_jsonstring(resp.body)
print(result)
except Exception as e:
print(f"发生错误:{e}")
return None
if __name__ == '__main__':
main()
- 在调用本示例之前,请务必完成上述所有前置步骤。子账号调用本示例前需获取AliyunBailianDataFullAccess策略。
- 若您使用了 IDE 或其他辅助开发插件,需将
ALIBABA_CLOUD_ACCESS_KEY_ID、ALIBABA_CLOUD_ACCESS_KEY_SECRET和WORKSPACE_ID变量配置到相应的开发环境中。
Python
# 示例代码仅供参考,请勿在生产环境中直接使用
import hashlib
import os
import time
import requests
from alibabacloud_bailian20231229 import models as bailian_20231229_models
from alibabacloud_bailian20231229.client import Client as bailian20231229Client
from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_tea_util import models as util_models
def check_environment_variables():
"""检查并提示设置必要的环境变量"""
required_vars = {
'ALIBABA_CLOUD_ACCESS_KEY_ID': '阿里云访问密钥ID',
'ALIBABA_CLOUD_ACCESS_KEY_SECRET': '阿里云访问密钥密码',
'WORKSPACE_ID': '百炼工作空间ID'
}
missing_vars = []
for var, description in required_vars.items():
if not os.environ.get(var):
missing_vars.append(var)
print(f"错误:请设置 {var} 环境变量 ({description})")
return len(missing_vars) == 0
# 创建客户端(Client)
def create_client() -> bailian20231229Client:
"""
创建并配置客户端(Client)。
返回:
bailian20231229Client: 配置好的客户端(Client)。
"""
config = open_api_models.Config(
access_key_id=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID'),
access_key_secret=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET')
)
# 下方接入地址以公有云的公网接入地址为例,可按需更换接入地址。
config.endpoint = 'bailian.ap-southeast-1.aliyuncs.com'
return bailian20231229Client(config)
def calculate_md5(file_path: str) -> str:
"""
计算文件的MD5值。
参数:
file_path (str): 文件本地路径。
返回:
str: 文件的MD5值。
"""
md5_hash = hashlib.md5()
# 以二进制形式读取文件
with open(file_path, "rb") as f:
# 按块读取文件,避免大文件占用过多内存
for chunk in iter(lambda: f.read(4096), b""):
md5_hash.update(chunk)
return md5_hash.hexdigest()
def get_file_size(file_path: str) -> int:
"""
获取文件大小(以字节为单位)。
参数:
file_path (str): 文件本地路径。
返回:
int: 文件大小(以字节为单位)。
"""
return os.path.getsize(file_path)
# 申请文件上传租约
def apply_lease(client, category_id, file_name, file_md5, file_size, workspace_id):
"""
从阿里云百炼服务申请文件上传租约。
参数:
client (bailian20231229Client): 客户端(Client)。
category_id (str): 类目ID。
file_name (str): 文件名称。
file_md5 (str): 文件的MD5值。
file_size (int): 文件大小(以字节为单位)。
workspace_id (str): 业务空间ID。
返回:
阿里云百炼服务的响应。
"""
headers = {}
request = bailian_20231229_models.ApplyFileUploadLeaseRequest(
file_name=file_name,
md_5=file_md5,
size_in_bytes=file_size,
)
runtime = util_models.RuntimeOptions()
return client.apply_file_upload_lease_with_options(category_id, workspace_id, request, headers, runtime)
# 上传文件到临时存储
def upload_file(pre_signed_url, headers, file_path):
"""
将文件上传到阿里云百炼服务。
参数:
lease_id (str): 租约ID。
pre_signed_url (str): 上传租约中的URL。
headers (dict): 上传请求的头部。
file_path (str): 文件本地路径。
"""
with open(file_path, 'rb') as f:
file_content = f.read()
upload_headers = {
"X-bailian-extra": headers["X-bailian-extra"],
"Content-Type": headers["Content-Type"]
}
response = requests.put(pre_signed_url, data=file_content, headers=upload_headers)
response.raise_for_status()
# 添加文件到类目中
def add_file(client: bailian20231229Client, lease_id: str, parser: str, category_id: str, workspace_id: str):
"""
将文件添加到阿里云百炼服务的指定类目中。
参数:
client (bailian20231229Client): 客户端(Client)。
lease_id (str): 租约ID。
parser (str): 用于文件的解析器。
category_id (str): 类目ID。
workspace_id (str): 业务空间ID。
返回:
阿里云百炼服务的响应。
"""
headers = {}
request = bailian_20231229_models.AddFileRequest(
lease_id=lease_id,
parser=parser,
category_id=category_id,
)
runtime = util_models.RuntimeOptions()
return client.add_file_with_options(workspace_id, request, headers, runtime)
# 查询文件的解析状态
def describe_file(client, workspace_id, file_id):
"""
获取文件的基本信息。
参数:
client (bailian20231229Client): 客户端(Client)。
workspace_id (str): 业务空间ID。
file_id (str): 文件ID。
返回:
阿里云百炼服务的响应。
"""
headers = {}
runtime = util_models.RuntimeOptions()
return client.describe_file_with_options(workspace_id, file_id, headers, runtime)
# 提交追加文件任务
def submit_index_add_documents_job(client, workspace_id, index_id, file_id, source_type):
"""
向一个文档搜索类知识库追加导入已解析的文件。
参数:
client (bailian20231229Client): 客户端(Client)。
workspace_id (str): 业务空间ID。
index_id (str): 知识库ID。
file_id (str): 文件ID。
source_type(str): 数据类型。
返回:
阿里云百炼服务的响应。
"""
headers = {}
submit_index_add_documents_job_request = bailian_20231229_models.SubmitIndexAddDocumentsJobRequest(
index_id=index_id,
document_ids=[file_id],
source_type=source_type
)
runtime = util_models.RuntimeOptions()
return client.submit_index_add_documents_job_with_options(workspace_id, submit_index_add_documents_job_request,
headers, runtime)
# 等待追加任务完成
def get_index_job_status(client, workspace_id, job_id, index_id):
"""
查询索引任务状态。
参数:
client (bailian20231229Client): 客户端(Client)。
workspace_id (str): 业务空间ID。
index_id (str): 知识库ID。
job_id (str): 任务ID。
返回:
阿里云百炼服务的响应。
"""
headers = {}
get_index_job_status_request = bailian_20231229_models.GetIndexJobStatusRequest(
index_id=index_id,
job_id=job_id
)
runtime = util_models.RuntimeOptions()
return client.get_index_job_status_with_options(workspace_id, get_index_job_status_request, headers, runtime)
# 删除旧文件
def delete_index_document(client, workspace_id, index_id, file_id):
"""
从指定的文档搜索类知识库中永久删除一个或多个文件。
参数:
client (bailian20231229Client): 客户端(Client)。
workspace_id (str): 业务空间ID。
index_id (str): 知识库ID。
file_id (str): 文件ID。
返回:
阿里云百炼服务的响应。
"""
headers = {}
delete_index_document_request = bailian_20231229_models.DeleteIndexDocumentRequest(
index_id=index_id,
document_ids=[file_id]
)
runtime = util_models.RuntimeOptions()
return client.delete_index_document_with_options(workspace_id, delete_index_document_request, headers, runtime)
def update_knowledge_base(
file_path: str,
workspace_id: str,
index_id: str,
old_file_id: str
):
"""
使用阿里云百炼服务更新知识库。
参数:
file_path (str): 文件(更新后的)的实际本地路径。
workspace_id (str): 业务空间ID。
index_id (str): 需要更新的知识库ID。
old_file_id (str): 需要更新的文件的FileID。
返回:
str or None: 如果成功,返回知识库ID;否则返回None。
"""
# 设置默认值
category_id = 'default'
parser = 'DASHSCOPE_DOCMIND'
source_type = 'DATA_CENTER_FILE'
try:
# 步骤1:创建客户端(Client)
print("步骤1:创建Client")
client = create_client()
# 步骤2:准备文件信息
print("步骤2:准备文件信息")
file_name = os.path.basename(file_path)
file_md5 = calculate_md5(file_path)
file_size = get_file_size(file_path)
# 步骤3:申请上传租约
print("步骤3:向阿里云百炼申请上传租约")
lease_response = apply_lease(client, category_id, file_name, file_md5, file_size, workspace_id)
lease_id = lease_response.body.data.file_upload_lease_id
upload_url = lease_response.body.data.param.url
upload_headers = lease_response.body.data.param.headers
# 步骤4:上传文件到临时存储
print("步骤4:上传文件到临时存储")
upload_file(upload_url, upload_headers, file_path)
# 步骤5:添加文件到类目中
print("步骤5:添加文件到类目中")
add_response = add_file(client, lease_id, parser, category_id, workspace_id)
file_id = add_response.body.data.file_id
# 步骤6:检查文件状态
print("步骤6:检查阿里云百炼中的文件状态")
while True:
describe_response = describe_file(client, workspace_id, file_id)
status = describe_response.body.data.status
print(f"当前文件状态:{status}")
if status == 'INIT':
print("文件待解析,请稍候...")
elif status == 'PARSING':
print("文件解析中,请稍候...")
elif status == 'PARSE_SUCCESS':
print("文件解析完成!")
break
else:
print(f"未知的文件状态:{status},请联系技术支持。")
return None
time.sleep(5)
# 步骤7:提交追加文件任务
print("步骤7:提交追加文件任务")
index_add_response = submit_index_add_documents_job(client, workspace_id, index_id, file_id, source_type)
job_id = index_add_response.body.data.id
# 步骤8:获取索引任务状态
print("步骤8:等待追加任务完成")
while True:
get_index_job_status_response = get_index_job_status(client, workspace_id, job_id, index_id)
status = get_index_job_status_response.body.data.status
print(f"当前索引任务状态:{status}")
if status == 'COMPLETED':
break
time.sleep(5)
print("步骤9:删除旧文件")
delete_index_document(client, workspace_id, index_id, old_file_id)
print("阿里云百炼知识库更新成功!")
return index_id
except Exception as e:
print(f"发生错误:{e}")
return None
def main():
if not check_environment_variables():
print("环境变量校验未通过。")
return
file_path = input("请输入您需要上传文件(更新后的)的实际本地路径(以Linux为例:/xxx/xxx/阿里云百炼系列手机产品介绍.docx):")
index_id = input("请输入需要更新的知识库ID:") # 即 CreateIndex 接口返回的 Data.Id,您也可以在阿里云百炼控制台的知识库页面获取。
old_file_id = input("请输入需要更新的文件的FileID:") # 即 AddFile 接口返回的 FileId。您也可以在阿里云百炼控制台的应用数据页面,单击文件名称旁的 ID 图标获取。
workspace_id = os.environ.get('WORKSPACE_ID')
update_knowledge_base(file_path, workspace_id, index_id, old_file_id)
if __name__ == '__main__':
main()
- 在调用本示例之前,请务必完成上述所有前置步骤。子账号调用本示例前需获取AliyunBailianDataFullAccess策略。
- 若您使用了 IDE 或其他辅助开发插件,需将
ALIBABA_CLOUD_ACCESS_KEY_ID、ALIBABA_CLOUD_ACCESS_KEY_SECRET和WORKSPACE_ID变量配置到相应的开发环境中。
Python
# 示例代码仅供参考,请勿在生产环境中直接使用
import os
from alibabacloud_bailian20231229 import models as bailian_20231229_models
from alibabacloud_bailian20231229.client import Client as bailian20231229Client
from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_tea_util import models as util_models
from alibabacloud_tea_util.client import Client as UtilClient
def check_environment_variables():
"""检查并提示设置必要的环境变量"""
required_vars = {
'ALIBABA_CLOUD_ACCESS_KEY_ID': '阿里云访问密钥ID',
'ALIBABA_CLOUD_ACCESS_KEY_SECRET': '阿里云访问密钥密码',
'WORKSPACE_ID': '阿里云百炼业务空间ID'
}
missing_vars = []
for var, description in required_vars.items():
if not os.environ.get(var):
missing_vars.append(var)
print(f"错误:请设置 {var} 环境变量 ({description})")
return len(missing_vars) == 0
# 创建客户端(Client)
def create_client() -> bailian20231229Client:
"""
创建并配置客户端(Client)。
返回:
bailian20231229Client: 配置好的客户端(Client)。
"""
config = open_api_models.Config(
access_key_id=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID'),
access_key_secret=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET')
)
# 下方接入地址以公有云的公网接入地址为例,可按需更换接入地址。
config.endpoint = 'bailian.ap-southeast-1.aliyuncs.com'
return bailian20231229Client(config)
# 查看知识库
def list_indices(client, workspace_id):
"""
获取指定业务空间下一个或多个知识库的详细信息。
参数:
client (bailian20231229Client): 客户端(Client)。
workspace_id (str): 业务空间ID。
返回:
阿里云百炼服务的响应。
"""
headers = {}
list_indices_request = bailian_20231229_models.ListIndicesRequest()
runtime = util_models.RuntimeOptions()
return client.list_indices_with_options(workspace_id, list_indices_request, headers, runtime)
# 删除知识库
def delete_index(client, workspace_id, index_id):
"""
永久性删除指定的知识库。
参数:
client (bailian20231229Client): 客户端(Client)。
workspace_id (str): 业务空间ID。
index_id (str): 知识库ID。
返回:
阿里云百炼服务的响应。
"""
headers = {}
delete_index_request = bailian_20231229_models.DeleteIndexRequest(
index_id=index_id
)
runtime = util_models.RuntimeOptions()
return client.delete_index_with_options(workspace_id, delete_index_request, headers, runtime)
def main():
if not check_environment_variables():
print("环境变量校验未通过。")
return
try:
start_option = input(
"请选择要执行的操作:\n1. 查看知识库\n2. 删除知识库\n请输入选项(1或2):")
if start_option == '1':
# 查看知识库
print("\n执行查看知识库")
workspace_id = os.environ.get('WORKSPACE_ID')
client = create_client()
list_indices_response = list_indices(client, workspace_id)
print(UtilClient.to_jsonstring(list_indices_response.body.data))
elif start_option == '2':
print("\n执行删除知识库")
workspace_id = os.environ.get('WORKSPACE_ID')
index_id = input("请输入知识库ID:") # 即 CreateIndex 接口返回的 Data.Id,您也可以在阿里云百炼控制台的知识库页面获取。
# 删除前二次确认
while True:
confirm = input(f"您确定要永久性删除该知识库 {index_id} 吗?(y/n): ").strip().lower()
if confirm == 'y':
break
elif confirm == 'n':
print("已取消删除操作。")
return
else:
print("无效输入,请输入 y 或 n。")
client = create_client()
resp = delete_index(client, workspace_id, index_id)
if resp.body.status == 200:
print(f"知识库{index_id}删除成功!")
else:
err_info = UtilClient.to_jsonstring(resp.body)
print(f"发生错误:{err_info}")
else:
print("无效的选项,程序退出。")
return
except Exception as e:
print(f"发生错误:{e}")
return
if __name__ == '__main__':
main()
创建知识库
接下来通过示例,引导您在给定的业务空间下创建一个文档搜索类知识库。1. 初始化客户端在开始上传文件和创建知识库之前,您需要使用配置好的AccessKey和AccessKey Secret初始化客户端(Client),以完成身份验证和接入点endpoint配置。
| Python Copy |
2. 上传知识库文件 | |
2.1. 申请文件上传租约在创建知识库前,您需先将文件上传至同一业务空间,作为知识库的知识来源。上传文件前,需调用ApplyFileUploadLease接口申请一个文件上传租约。该租约是一个临时的授权,允许您在限定时间内(有效期为分钟级)上传文件。
| Python Copy
请求示例 Copy
响应示例 Copy |
2.2. 上传文件到临时存储取得上传租约后,您即可使用租约中的临时上传参数和临时上传URL,将本地存储或可通过公网访问的文件上传至阿里云百炼服务器。请注意,每个业务空间最多支持1万个文件。目前支持上传的格式包括:PDF、DOCX、DOC、TXT、Markdown、PPTX、PPT、XLSX、XLS、HTML、PNG、JPG、JPEG、BMP 和 GIF。
| 本示例不支持在线调试和多语言示例代码生成。
Python 请确保URL公开可访问且指向一个有效的文件。 Python Copy |
2.3. 添加文件到类目中阿里云百炼使用类目管理您上传的文件。因此,接下来您需要调用AddFile接口将已上传的文件添加到同一业务空间下的类目中。
FileId,并自动开始解析您的文件。同时lease_id(租约ID)随即失效,请勿再使用相同的租约ID重复提交。 | Python Copy
请求示例 Copy
响应示例 Copy |
2.4. 查询文件的解析状态未解析完成的文件无法用于知识库,在请求高峰时段,该过程可能需要数小时。您可以调用DescribeFile接口查询文件的解析状态。
Data.Status字段值为PARSE_SUCCESS时,表示文件已解析完成,可以将其导入知识库。 | Python Copy
请求示例 Copy
响应示例 Copy |
3. 创建知识库 | |
3.1. 初始化知识库文件解析完成后,您即可将其导入同一业务空间下的知识库。初始化(非最终提交)一个文档搜索类知识库,可以调用CreateIndex接口。
Data.Id字段值即为知识库ID,用于后续的索引构建。请您妥善保管知识库ID,后续该知识库所有相关API操作都将用到它。 | Python
请求示例 Copy
响应示例 Copy |
3.2. 提交索引任务初始化知识库后,您需要调用SubmitIndexJob接口提交索引任务,以启动知识库的索引构建。
Data.Id为对应的任务ID。下一步中,您将用到此ID查询任务的最新状态。 | Python Copy
请求示例 Copy
响应示例 Copy |
3.3. 等待索引任务完成索引任务的执行需要一定时间,在请求高峰时段,该过程可能需要数小时。查询其执行状态可以调用GetIndexJobStatus接口。
Data.Status字段值为COMPLETED时,表示知识库已创建完成。 | Python Copy
请求示例 Copy
响应示例 Copy |
检索知识库
目前,检索知识库支持两种方式:- 使用阿里云百炼应用:调用应用时,通过
rag_options传入知识库IDindex_id,为您的大模型应用补充私有知识和提供最新信息。 - 使用阿里云API:调用Retrieve接口在指定的知识库中检索信息并返回原始文本切片。
在指定的知识库中检索信息,并返回文本切片,可以通过调用Retrieve接口。
| Python Copy
请求示例 Copy
响应示例 Copy |
更新知识库
接下来通过示例,引导您更新文档搜索类知识库。所有引用该知识库的应用会实时生效您本次的更新(新增内容可用于检索和召回,而已删除内容将不再可用)。数据查询、图片问答类知识库不支持通过API更新。如何更新请参见知识库:更新知识库。
- 如何增量更新知识库:请您按照以下三步(先上传更新后的文件,再追加文件至知识库,最后删除旧文件)操作。此外暂无其他实现方式。
- 如何全量更新知识库:对知识库中的所有文件,请您逐一执行以下三步完成更新。
- 如何实现知识库的自动更新/同步:请详见如何实现知识库的自动更新/同步。
- 单次更新对文件数量是否有限制:建议不超过1万个,否则可能导致知识库无法正常更新。
1. 上传更新后的文件按照创建知识库:第二步操作,将更新后的文件上传至该知识库所在的业务空间。您需要重新申请文件上传租约,为更新后的文件生成一组新的上传参数。 | |
2. 追加文件至知识库 | |
2.1. 提交追加文件任务上传文件解析完成后,请调用SubmitIndexAddDocumentsJob接口将新文件追加至知识库,并重新构建知识库索引。
Data.Id为对应的任务ID(job_id)。下一步中,您将用到此ID查询任务的最新状态。
| Python
请求示例 Copy
响应示例 Copy |
2.2. 等待追加任务完成索引任务的执行需要一定时间,在请求高峰时段,该过程可能需要数小时。查询其执行状态可以调用GetIndexJobStatus接口。
Data.Status字段值为COMPLETED,表示本次更新的文件已全部成功追加至知识库。本接口返回的文件列表 | Python Copy
请求示例 Copy
响应示例 Copy |
3. 删除旧文件最后,从指定知识库中永久删除旧版本的文件(避免旧的知识被错误检索),可以调用DeleteIndexDocument接口。
仅能删除知识库中状态为导入失败(INSERT_ERROR)或导入成功(FINISH)的文件。如需查询知识库中的文件状态,可调用ListIndexDocuments接口。 | Python Copy
请求示例 Copy
响应示例 Copy |
管理知识库
创建和使用知识库不支持通过API操作,请使用阿里云百炼控制台操作。
查看知识库要查看给定业务空间下的一个或多个知识库的信息,可以调用ListIndices接口。
| Python Copy
请求示例 Copy
响应示例 Copy |
删除知识库要永久性删除某个知识库,可以调用DeleteIndex接口。删除前,请解除该知识库关联的所有阿里云百炼应用(仅可通过阿里云百炼控制台操作),否则会删除失败。
| Python Copy
请求示例 Copy
响应示例 Copy |
API参考
请参阅API目录(知识库)获取最新完整的知识库API列表及输入输出参数。常见问题
-
如何实现知识库的自动更新/同步?
- 文档搜索类知识库
- 数据查询/图片问答类知识库
您可以通过整合阿里云对象存储OSS、函数计算FC以及阿里云百炼知识库相关的API实现。只需简单几步:不支持。 - 为什么我新建的知识库里没有内容? 一般是由于没有执行或未能成功执行提交索引任务这一步导致。若调用CreateIndex接口后未成功调用SubmitIndexJob接口,您将得到一个空知识库。此时,您只需重新执行提交索引任务并等待索引任务完成即可。
- 遇到报错Access your uploaded file failed. Please check if your upload action was successful,应该如何处理? 一般是由于没有执行或未能成功执行上传文件到临时存储这一步导致。请在确认该步骤成功执行后,再调用AddFile接口。
-
遇到报错Access denied: Either you are not authorized to access this workspace, or the workspace does not exist,应该如何处理?
一般是由于:
-
您请求的服务地址(服务接入点)有误:以公网接入为例,如果您是中国站用户,应访问北京(公有云用户)地域的接入地址;如果您是国际站用户,应访问新加坡地域的接入地址。如果您正在使用在线调试功能,请确认您选择的服务地址正确无误(如下图所示)。

-
您传入的WorkspaceId值不正确,或者您还不是该业务空间的成员导致:请确认
WorkspaceId值无误且您是该业务空间的成员后,再调用接口。如何被添加为指定业务空间的成员
-
您请求的服务地址(服务接入点)有误:以公网接入为例,如果您是中国站用户,应访问北京(公有云用户)地域的接入地址;如果您是国际站用户,应访问新加坡地域的接入地址。如果您正在使用在线调试功能,请确认您选择的服务地址正确无误(如下图所示)。
-
遇到报错Specified access key is not found or invalid,应该如何处理?
一般是由于您传入的
access_key_id或access_key_secret值不正确,或者该access_key_id已被禁用导致。请确认access_key_id值无误且未被禁用后,再调用接口。 -
遇到报错Category is mismatched,应该如何处理?
一般是由于在调用
ApplyFileUploadLease接口申请文件上传租约时使用的CategoryId,与后续调用AddFile接口时传入的CategoryId不一致导致。 请确保在整个文件上传流程中(从ApplyFileUploadLease到AddFile),使用同一个CategoryId。您可以通过ListCategory接口获取当前业务空间下的类目列表,确认所使用的CategoryId正确无误。
计费说明
- 知识库的所有功能及API调用均免费,详见知识库:计费说明。
- 文件等数据导入百炼后,所需的存储空间免费。
