J'ai essayé de faire fonctionner les soumissions par lots de Document AI, mais je rencontre quelques difficultés. J'ai utilisé un RawDocument pour la soumission d'un seul fichier en supposant que je pouvais parcourir mon ensemble de données (27 000 images), mais j'ai opté pour le traitement par lots car cela semblait être la technique la plus appropriée.
Lorsque j'exécute le code, je vois l'erreur : "Impossible de traiter tous les documents". Les premières lignes d'informations de débogage sont :
O:17:"GoogleRpcStatus":5:{ s:7:"*Code";i:3;s:10:"*Message";s:32:"Impossible de traiter tous les documents."; s:26 : "Détails GoogleRpcStatus" ; O:38:"GoogleProtobufInternalRepeatedField":4:{ s:49:"GoogleProtobufInternalRepeatedFieldcontainer";a:0:{}s:44:"GoogleProtobufInternalRepeatedFieldtype";i:11;s:45:"GoogleProtobufInternalRepeatedFieldklass";s:19:"GoogleProtobufAny";s:52:"GoogleProtobufInternalRepeatedFieldlegacy_k fille"; s:19:"GoogleProtobufAny";}s:38:"GoogleProtobuf InternalMessagedesc";O:35:"GoogleProtobufInternalDescriptor":13:{s:46:"GoogleProtobufInternalDescriptorfull_name";s:17:"google.rpc.Status";s : 42:"GoogleProtobufInternalDescriptorfield";a:3:{i:1;O:40:"GoogleProtobufInternalFieldDescriptor":14:{s:46:"GoogleProtobufInternalFieldDescriptorname ";s:4:"code";```
Le support pour ce bug indique que la cause de l'erreur est :
Les paramètresgcsUriPrefix et gcsOutputConfig.gcsUri doivent commencer par gs:// et se terminer par une barre oblique inverse (/). Vérifiez la configuration de l'URI du bucket.
Je n'utilise pas gcsUriPrefix (dois-je ? Mon compartiment > Limites maximales de lots), mais mon gcsOutputConfig.gcsUri est dans ces limites. La liste de fichiers que je fournis donne les noms de fichiers (pointant vers le bon compartiment), il ne devrait donc pas y avoir de barre oblique inverse de fin.
Bienvenue pour consulter
function filesFromBucket( $directoryPrefix ) { // NOT recursive, does not search the structure $gcsDocumentList = []; // see https://cloud.google.com/storage/docs/samples/storage-list-files-with-prefix $bucketName = 'my-input-bucket'; $storage = new StorageClient(); $bucket = $storage->bucket($bucketName); $options = ['prefix' => $directoryPrefix]; foreach ($bucket->objects($options) as $object) { $doc = new GcsDocument(); $doc->setGcsUri('gs://'.$object->name()); $doc->setMimeType($object->info()['contentType']); array_push( $gcsDocumentList, $doc ); } $gcsDocuments = new GcsDocuments(); $gcsDocuments->setDocuments($gcsDocumentList); return $gcsDocuments; } function batchJob ( ) { $inputConfig = new BatchDocumentsInputConfig( ['gcs_documents'=>filesFromBucket('the-bucket-path/')] ); // see https://cloud.google.com/php/docs/reference/cloud-document-ai/latest/V1.DocumentOutputConfig // nb: all uri paths must end with / or an error will be generated. $outputConfig = new DocumentOutputConfig( [ 'gcs_output_config' => new GcsOutputConfig( ['gcs_uri'=>'gs://my-output-bucket/'] ) ] ); // see https://cloud.google.com/php/docs/reference/cloud-document-ai/latest/V1.DocumentProcessorServiceClient $documentProcessorServiceClient = new DocumentProcessorServiceClient(); try { // derived from the prediction endpoint $name = 'projects/######/locations/us/processors/#######'; $operationResponse = $documentProcessorServiceClient->batchProcessDocuments($name, ['inputDocuments'=>$inputConfig, 'documentOutputConfig'=>$outputConfig]); $operationResponse->pollUntilComplete(); if ($operationResponse->operationSucceeded()) { $result = $operationResponse->getResult(); printf('<br>result: %s<br>',serialize($result)); // doSomethingWith($result) } else { $error = $operationResponse->getError(); printf('<br>error: %s<br>', serialize($error)); // handleError($error) } } finally { $documentProcessorServiceClient->close(); } }
Habituellement, l'erreur
“无法处理所有文档”
est causée par une syntaxe incorrecte du fichier d'entrée ou du compartiment de sortie. Puisqu'un chemin mal formé peut toujours être un chemin "valide" vers le stockage cloud, mais pas le fichier que vous attendiez. (Merci d'abord de vérifier la page des messages d'erreur !)Si vous souhaitez fournir une liste de documents spécifiques à traiter, vous n'êtes pas obligé d'utiliser
gcsUriPrefix
。尽管根据您的代码,您似乎还是将 GCS 目录中的所有文件添加到BatchDocumentsInputConfig.gcs_documents
字段,因此尝试在中发送前缀是有意义的>BatchDocumentsInputConfig.gcs_uri_prefix
à la place d'une liste de fichiers individuels.Remarque : Il existe un nombre maximum de fichiers pouvant être envoyés dans une seule demande par lots (1 000), et les processeurs spécifiques ont leurs propres limites de pages.
https://cloud.google.com/document-ai/quotas#content_limits
Vous pouvez essayer de diviser le fichier en plusieurs requêtes par lots pour éviter d'atteindre cette limite. Le SDK Python de Document AI Toolbox dispose d'une fonction intégrée à cet effet, mais vous pouvez essayer de réimplémenter cette fonction en PHP en fonction de votre cas d'utilisation. https://github.com/googleapis/python-documentai-toolbox/blob/ba354d8af85cbea0ad0cd2501e041f21e9e5d765/google/cloud/documentai_toolbox/utilities/gcs_utilities.py#L213
Cela s'est avéré être un bug ID-10-T avec des connotations claires PEBKAC.
$object->name() ne renvoie pas le nom du bucket dans le chemin.
résoudra
$doc->setGcsUri('gs://'.$object->name());
更改为$doc->setGcsUri('gs://'. $bucketName.'/'.$object->name());
le problème.