阿里雲百鍊知識庫提供開放的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列表及輸入輸出參數。常見問題
-
如何?知識庫的自動更新/同步?
- 文檔搜尋類知識庫
- 資料查詢/圖片問答類知識庫
您可以通過整合阿里雲Object Storage Service、Function ComputeFC以及阿里雲百鍊知識庫相關的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調用均免費,詳見知識庫:計費說明。
- 檔案等資料匯入百鍊後,所需的儲存空間免費。
