Vertex AI Search中layoutBasedChunkingConfig未遵循chunkSize的问题咨询
Vertex AI Search PDF分块配置不生效问题
问题现象
将PDF导入配置了layoutBasedChunkingConfig且chunkSize: 500的数据存储后,生成的分块远大于设置值,配置未生效:
--- Chunk 1 --- Character Count: 11494 Page Range: 1 - 8 --- Chunk 2 --- Character Count: 11837 Page Range: 8 - 16 --- Chunk 3 --- Character Count: 10862 Page Range: 16 - 21
复现步骤
1. 创建数据存储
使用以下curl命令创建包含layoutBasedChunkingConfig和defaultParsingConfig的数据存储:
# PROJECT_ID 和 ACCESS_TOKEN 已预先配置 export DATA_STORE_ID="data-store-id" export DISPLAY_NAME="data-store" curl -X POST \ -H "Authorization: Bearer ${ACCESS_TOKEN}" \ -H "Content-Type: application/json; charset=utf-8" \ -H "x-goog-user-project: ${PROJECT_ID}" \ -d @- \ "https://discoveryengine.googleapis.com/v1/projects/${PROJECT_ID}/locations/global/collections/default_collection/dataStores?dataStoreId=${DATA_STORE_ID}" <<EOF { "displayName": "${DISPLAY_NAME}", "industryVertical": "GENERIC", "solutionTypes": ["SOLUTION_TYPE_SEARCH"], "contentConfig": "CONTENT_REQUIRED", "documentProcessingConfig": { "defaultParsingConfig": { "layoutParsingConfig": { "enableTableAnnotation": true, "enableImageAnnotation": true } }, "chunkingConfig": { "layoutBasedChunkingConfig": { "chunkSize": 500, "includeAncestorHeadings": true } } } } EOF
2. 导入文档
使用以下Python脚本通过JSONL文件导入PDF:
# test_import.py import json import uuid from datetime import datetime, timezone from google.cloud import discoveryengine_v1 as discoveryengine from google.cloud import storage # --- 常量 --- PROJECT_ID = "your-gcp-project-id" LOCATION = "global" DATA_STORE_ID = "data-store-id" GCS_URI = "gs://your-bucket/your-document.pdf" ARCHIVE_BUCKET_NAME = "my-bucket" # 用于存储临时jsonl的Bucket storage_client = storage.Client(project=PROJECT_ID) client = discoveryengine.DocumentServiceClient() # --- 生成与导入逻辑 --- document_id = str(uuid.uuid4()) metadata = { "id": document_id, "content": {"mimeType": "application/pdf", "uri": GCS_URI}, "structData": { "title": "Final Test Document" } } # 将元数据上传到临时GCS jsonl文件 bucket = storage_client.bucket(ARCHIVE_BUCKET_NAME) temp_jsonl_filename = f"temp-{document_id}.jsonl" blob = bucket.blob(temp_jsonl_filename) blob.upload_from_string(json.dumps(metadata)) temp_jsonl_gcs_uri = f"gs://{ARCHIVE_BUCKET_NAME}/{temp_jsonl_filename}" # 创建导入请求 gcs_source = discoveryengine.GcsSource( input_uris=[temp_jsonl_gcs_uri], data_schema="document" ) parent_path = client.branch_path( project=PROJECT_ID, location=LOCATION, data_store=DATA_STORE_ID, branch="0" ) request = discoveryengine.ImportDocumentsRequest( parent=parent_path, gcs_source=gcs_source, reconciliation_mode=discoveryengine.ImportDocumentsRequest.ReconciliationMode.INCREMENTAL, ) operation = client.import_documents(request=request) response = operation.result() # 执行无错误 # 清理临时文件 blob.delete()
预期结果
服务应生成多个大小接近chunkSize设置的500字符小分块。
问题
layoutBasedChunkingConfig是否对特定PDF布局(如官方法律文档)不遵循chunkSize是已知限制?- 是否存在遗漏的参数或设置,可实现更细粒度的分块?
- 若此行为属于服务限制,当前最佳实践是否是通过Python库等工具在外部预分块PDF,再将分块作为结构化数据(如
structData.description字段)导入?
解答
1. 特定布局的分块限制
是的,layoutBasedChunkingConfig会优先保留文档的逻辑结构完整性,比如法律文档中连续的段落、表格或章节内容,不会强制拆分逻辑单元来满足chunkSize。如果PDF中存在大段无明确分隔(如无标题、段落间隔)的内容,服务会生成较大分块以避免破坏语义连贯性,这是已知的设计行为。
2. 更细粒度分块的配置选项
可以尝试补充以下配置:
- 在
layoutBasedChunkingConfig中添加chunkOverlap参数(如设为50),允许分块间有重叠,但这不会直接缩小分块尺寸; - 关闭
includeAncestorHeadings,减少每个分块附带的标题内容,但仅适用于不需要上下文标题的场景; - 切换为
fixedSizeChunkingConfig,强制按字符数拆分,不考虑文档布局。示例配置如下:
"chunkingConfig": { "fixedSizeChunkingConfig": { "chunkSize": 500, "chunkOverlap": 50 } }
注意:fixedSizeChunkingConfig会忽略文档布局,可能拆分表格、段落等逻辑单元,影响语义完整性。
3. 外部预分块的最佳实践
如果服务内置分块无法满足需求,外部预分块是当前推荐的方案。具体步骤:
- 使用PyPDF2、pdfplumber等Python库提取PDF文本并按逻辑单元(段落、标题)拆分;
- 将每个分块作为独立文档导入,或在
structData中存储分块内容,同时保留元数据(如页码、标题); - 导入时设置
documentProcessingConfig为SKIP_PROCESSING,避免服务再次分块。
内容的提问来源于stack exchange,提问作者Hirokazu Nakai
相关产品推荐
相关产品推荐

