ドキュメントコレクションを作成したら、このトピックの説明に従ってドキュメントをアップロードできます。
ドキュメントのアップロード
この例では、ローカルドキュメントは非同期モードでアップロードされます。 サンプルコード:
import time
import io
from typing import Dict, List, Any
from alibabacloud_tea_util import models as util_models
def upload_document_async(
namespace,
namespace_password,
collection,
file_name,
file_path,
metadata: Dict[str, Any] = None,
chunk_overlap: int = None,
chunk_size: int = None,
document_loader_name: str = None,
text_splitter_name: str = None,
dry_run: bool = None,
zh_title_enhance: bool = None,
separators: List[str] = None):
with open(file_path, 'rb') as f:
file_content_bytes = f.read()
request = gpdb_20160503_models.UploadDocumentAsyncAdvanceRequest(
region_id=ADBPG_INSTANCE_REGION,
dbinstance_id=ADBPG_INSTANCE_ID,
namespace=namespace,
namespace_password=namespace_password,
collection=collection,
file_name=file_name,
metadata=metadata,
chunk_overlap=chunk_overlap,
chunk_size=chunk_size,
document_loader_name=document_loader_name,
file_url_object=io.BytesIO(file_content_bytes),
text_splitter_name=text_splitter_name,
dry_run=dry_run,
zh_title_enhance=zh_title_enhance,
separators=separators,
)
response = get_client().upload_document_async_advance(request, util_models.RuntimeOptions())
print(f"upload_document_async response code: {response.status_code}, body:{response.body}")
return response.body.job_id
def wait_upload_document_job(namespace, namespace_password, collection, job_id):
def job_ready():
request = gpdb_20160503_models.GetUploadDocumentJobRequest(
region_id=ADBPG_INSTANCE_REGION,
dbinstance_id=ADBPG_INSTANCE_ID,
namespace=namespace,
namespace_password=namespace_password,
collection=collection,
job_id=job_id,
)
response = get_client().get_upload_document_job(request)
print(f"get_upload_document_job response code: {response.status_code}, body:{response.body}")
return response.body.job.completed
while True:
if job_ready():
print("successfully load document")
break
time.sleep(2)
if __name__ == '__main__':
job_id = upload_document_async("ns1", "Ns1password", "dc1",
"test.pdf", "/root/test.pdf")
wait_upload_document_job("ns1", "Ns1password", "dc1", job_id)
# upload_document_async output:
# {
# "JobId":"95de2856-0cd4-44bb-b216-ea2f0ebcc57b",
# "Message":"Successfully create job",
# "RequestId":"9F870770-C402-19EC-9E26-ED7E4F539C3E",
# "Status":"success"
# }
# get_upload_document_job output:
# {
# "ChunkResult":{
# "ChunkFileUrl":"http://knowledge-base-gp-xx.oss-cn-beijing.aliyuncs.com/ns1/dc1/produce-files/test.pdf/chunks.jsonl?Expires=1706530707&OSSAccessKeyId=ak&Signature=6qUSwBtuthr0L9OxKoTh7kEohxQ%3D",
# "PlainChunkFileUrl":"http://knowledge-base-gp-xx.oss-cn-beijing.aliyuncs.com/ns1/dc1/produce-files/test.pdf/plain_chunks.txt?Expires=1706530707&OSSAccessKeyId=ak&Signature=sxc5iiGUDE2M%2FV0JikFvQE7FdBM%3D"
# },
# "Job":{
# "Completed":true,
# "CreateTime":"2024-01-29 18:15:27.364484",
# "Id":"95de2856-0cd4-44bb-b216-ea2f0ebcc57b",
# "Progress":100,
# "Status":"Success",
# "UpdateTime":"2024-01-29 18:15:53.78808"
# },
# "Message":"Success get job info",
# "RequestId":"64487F02-5A02-1CD9-BA5C-B59E9D3A68CC",
# "Status":"success"
# }
upload_document_async関数のパラメーターの説明:
namespace: ドキュメントコレクションが配置されている名前空間の名前。
namespace_password: 名前空間のパスワード。
collection: ドキュメントを保存するドキュメントコレクションの名前。
file_name: ドキュメントの名前で、タイプのサフィックスが付いています。
file_path: ローカルドキュメントのパス。 ドキュメントの最大サイズは200 MBです。
metadata: ドキュメントのメタデータ。ドキュメントコレクションの作成時に指定されたメタデータと同じである必要があります。
chunk_overlap: 大量のデータをチャンクに分割する場合に使用される分割ポリシー。 連続するチャンク間で重複するデータの最大サイズは、chunk_sizeを超えることはできません。
chunk_size: 大量のデータをチャンクに分割した場合の各チャンクのサイズ。 最大値は2048です。
document_loader_name: ドキュメントローダーの名前。 指定する必要はありません。 ドキュメントローダーは、ファイル拡張子に基づいて自動的に指定されます。 詳細については、「ドキュメントの理解」をご参照ください。
text_splitter_name: スプリッタの名前。 ドキュメント分割の詳細については、「ドキュメント分割」をご参照ください。
dry_run: ドキュメントの理解とチャンキングのみを実行し、ベクトル化と保存を実行しないかどうかを指定します。 有効な値:
true: ドキュメントの理解と分割のみを実行します。
false (デフォルト): 最初にドキュメントの理解と分割を実行し、次にベクトル化と保存を実行します。
zh_title_enhance: タイトル強化を有効にするかどうかを指定します。 有効な値:
true: タイトルの拡張を有効にします。
false: タイトル拡張を無効にします。
separator: 大量のデータを分割するために使用されるセパレータ。 ほとんどの場合、このパラメーターを指定する必要はありません。
ドキュメントの理解
document_loader_nameを指定する必要はありません。 ドキュメントローダーは、ファイル拡張子に基づいて自動的に指定されます。
UnstructuredHTMLLoader:
. htmlUnstructuredMarkdownLoader:
. mdPyMuPDFLoader:
. pdfPyPDFLoader:
. pdfRapidOCRPDFLoader:
. pdfJSONLoader:
. jsonCSVLoader:
. csvRapidOCRLoader:
. png,. jpg,. jpeg、または. bmpUnstructuredFileLoader:
. eml,. msg,. rst,. txt,. xml,. docx,. epub,. odt,. pptx、または. tsv
pdfなど、ドキュメントタイプに複数のローダーが適している場合は、いずれかを指定できます。 画像内のテキストを認識する必要がある場合は、RapidOCRPDFLoaderをお勧めします。
ドキュメントの分割
ドキュメント分割の結果は、chunk_overlap、chunk_size、およびtext_splitter_nameによって決定されます。 text_splitter_nameパラメーターの値は次のとおりです。
ChineseRecursiveTextSplitter: RecursiveCharacterTextSplitterから継承され、デフォルトでは
["\n\n", "\n", ".|!|?", "\.\s | \\s | \\\\\s", "|;\ s", ",|,\ s"]をセパレータとして使用し、テキストの照合に正規表現を使用します。SpacyTextSplitter: デフォルトでは、
["\n\n", "\n", "" ""]をセパレータとして使用します。 次のプログラミング言語を使用した分割がサポートされています。c ++,行く,ジャワ,js,php,proto,python,rst,ルビー,さび,スカラ,迅速,値下げ,ラテックス,html,ゾル、およびcsharp.RecursiveCharacterTextSplitter: デフォルトで
\n \nをセパレータとして使用し、spaCyのen_core_web_smモデルを使用します。 スプリッタはより良い分割効果を得ることができます。MarkdownHeaderTextSplitter:
[("#", "head1"), ("##", "head2"), ("###", "head3"), ("####", "head4")]形式でテキストを分割します。 スプリッターはMarkdownテキストに適しています。
ドキュメントリストの表示
def list_documents(namespace, namespace_password, collection):
request = gpdb_20160503_models.ListDocumentsRequest(
region_id=ADBPG_INSTANCE_REGION,
dbinstance_id=ADBPG_INSTANCE_ID,
namespace=namespace,
namespace_password=namespace_password,
collection=collection,
)
response = get_client().list_documents(request)
print(f"list_documents response code: {response.status_code}, body:{response.body}")
if __name__ == '__main__':
list_documents("ns1", "Ns1password", "dc1")
# output: body:
# {
# "Items":{
# "DocumentList":[
# {
# "FileName":"test.pdf",
# "Source":"OSS"
# }
# ]
# },
# "RequestId":"08D5E2D6-81E1-1D8A-B864-830538B04991",
# "Status":"success"
# }list_documents関数のパラメーターの説明:
namespace: ドキュメントコレクションが配置されている名前空間の名前。
namespace_password: 名前空間のパスワード。
collection: ドキュメントコレクションの名前。
ドキュメントの詳細を表示
def describe_document(namespace, namespace_password, collection, file_name):
request = gpdb_20160503_models.DescribeDocumentRequest(
region_id=ADBPG_INSTANCE_REGION,
dbinstance_id=ADBPG_INSTANCE_ID,
namespace=namespace,
namespace_password=namespace_password,
collection=collection,
file_name=file_name
)
response = get_client().describe_document(request)
print(f"describe_document response code: {response.status_code}, body:{response.body}")
if __name__ == '__main__':
describe_document("ns1", "Ns1password", "dc1", "test.pdf")
# output: body:
# {
# "DocsCount":24,
# "DocumentLoader":"PyMuPDFLoader",
# "FileExt":"pdf",
# "FileMd5":"ce16fa68025ebf41649810f0335caf49",
# "FileMtime":"2024-01-29 11:37:27.270611",
# "FileName":"test.pdf",
# "FileSize":8332620,
# "FileVersion":1,
# "RequestId":"D05B4CF1-64F0-1D77-AD9C-C54CAB065571",
# "Source":"OSS",
# "Status":"success",
# "TextSplitter":"ChineseRecursiveTextSplitter"
# }describe_document関数のパラメーターの説明:
namespace: ドキュメントコレクションが配置されている名前空間の名前。
namespace_password: 名前空間のパスワード。
collection: ドキュメントコレクションの名前。
file_name: ドキュメントの名前。
返されたドキュメントの詳細:
DocsCount: ドキュメントが分割されるチャンクの数。
TextSplitter: ドキュメントスプリッタの名前。
DocumentLoader: ドキュメントローダーの名前。
FileExt: ドキュメントのファイル拡張子。
FileMd5: ドキュメントのMD5ハッシュ値。
FileMtime: ドキュメントの最新のアップロード時刻。
FileSize: ドキュメントのサイズ。 単位はバイトです。
FileVersion: ドキュメントのバージョン。 値はINT型です。 この値は、ドキュメントがアップロードおよび更新された回数を示します。
ドキュメントの削除
def delete_document(namespace, namespace_password, collection, file_name):
request = gpdb_20160503_models.DeleteDocumentRequest(
region_id=ADBPG_INSTANCE_REGION,
dbinstance_id=ADBPG_INSTANCE_ID,
namespace=namespace,
namespace_password=namespace_password,
collection=collection,
file_name=file_name
)
response = get_client().delete_document(request)
print(f"delete_document response code: {response.status_code}, body:{response.body}")
if __name__ == '__main__':
delete_document("ns1", "Ns1password", "dc1", "test.pdf")
# output: body:
# {
# "Message":"success",
# "RequestId":"DC735368-02DD-48A4-8A26-C8DEB53C5B56",
# "Status":"success"
# }delete_document関数のパラメーターの説明:
namespace: ドキュメントコレクションが配置されている名前空間の名前。
namespace_password: 名前空間のパスワード。
collection: ドキュメントコレクションの名前。
file_name: ドキュメントの名前。