- Extraire le texte d’un PDF avec
/augment/text-parser - Décrire l’enregistrement souhaité sous forme de schéma JSON
- L’extraire, avec le schéma imposé plutôt que suggéré
- Gérer le fichier qui ne contient aucun texte du tout
- Comparer ce que les deux routes produisent à partir de la même page
Préparation
Vous avez besoin de Python 3.9 ou plus récent, du paquetrequests, et d’une clé d’API Venice. Consultez Générer une clé d’API si vous n’en avez pas.
extract.py :
AUTH et JSON_HEADERS sont séparés. L’analyseur reçoit un envoi multipart, et fixer soi-même Content-Type sur une requête multipart empêche requests d’ajouter la frontière, ce qui échoue d’une manière pénible à diagnostiquer.
1. Sortir le texte
/augment/text-parser prend un fichier PDF, DOCX, XLSX, ou texte brut jusqu’à 25 Mo et renvoie le texte accompagné d’un nombre de jetons. Les documents sont traités en mémoire et le contenu n’est pas conservé.
tokens est la partie utile de cette réponse. Il vous dit ce que le document va vous coûter dans la requête suivante avant même de la faire, ce qui compte parce qu’un long PDF peut facilement dépasser ce que vous aviez prévu de dépenser.
2. Décrire l’enregistrement souhaité
Demander du JSON à un modèle vous donne du JSON à peu près de la forme demandée. Passer un schéma vous donne du JSON qui correspond, parce que le schéma contraint la génération plutôt que de la conseiller.additionalProperties: False mérite d’être fixé à chaque niveau. Sans lui, un modèle qui trouve quelque chose d’intéressant peut ajouter une clé que vous n’aviez jamais prévue, et le code qui lit le résultat ne s’y attendra pas.
3. Extraire
Un seul appel, avecresponse_format portant le schéma et strict activé :
200 :
affiliation est requis, donc le modèle a renvoyé une chaîne vide plutôt que de l’omettre. C’est le schéma faisant exactement ce que vous lui avez demandé.
Une chaîne vide et une valeur manquante sont deux faits différents, et
required les confond. Si vous devez distinguer « le document ne dit rien » de « le document dit qu’il n’y a rien ici », typez le champ en {"type": ["string", "null"]} et demandez null dans le prompt système. Le mode strict accepte l’union, et vous obtenez null au lieu de "".Désactiver la réflexion
disable_thinking est la ligne de cette requête qui mérite discussion, alors voici l’argument. Le modèle texte par défaut raisonne avant de répondre, et le raisonnement puise dans le même budget de complétion que le JSON. Lancez la même extraction quatre fois et regardez ce que le modèle dépense :
Augmenter le budget ne règle pas le premier problème, cela ne fait que relever le plafond que le modèle est autorisé à atteindre. L’exécution qui a dépensé 4003 jetons est revenue avec un
finish_reason de length et une chaîne vide.
Désactiver la réflexion a rendu cette extraction cinq fois moins chère et, plus utilement, l’a rendue identique à chaque fois. Le schéma fait déjà le travail que ferait le raisonnement, à savoir décider de la forme que prend la réponse.
4. Quand il n’y a pas de texte à obtenir
Un PDF produit par un scanner contient des images de pages, pas du texte. Rien dans le nom du fichier ne le dit, et rien dans la taille du fichier ne le trahit non plus. Vous n’avez pas à le détecter, parce que l’analyseur le fait :400, et c’est un signal d’aiguillage plutôt qu’un échec. La route texte est indisponible pour ce fichier, alors prenez l’autre : effectuez le rendu de la page et laissez un modèle la regarder.
5. Ce sur quoi les deux routes divergent
Lancez les deux sur la même première page et les enregistrements reviennent presque identiques. C’est le « presque » qui est intéressant :
La route texte a préservé le Ł. La route vision a renvoyé un L ASCII, parce qu’elle lit des formes de lettres plutôt que des codes de caractères, et un signe diacritique est un petit détail visuel qui survit mal. Si vous rapprochez les noms extraits d’une base de données, cette différence décide si la ligne est trouvée.
Le huitième auteur compte davantage. La page n’énonce aucune affiliation pour Illia Polosukhin, et la route texte le rapporte fidèlement comme une chaîne vide à chaque fois. La route vision a, sur certaines exécutions, rempli le champ avec un voisin plausible de la même page. Lire des pixels laisse plus de place à l’inférence que lire des caractères, et un champ requis est une invitation à le remplir. Quand vous ne pouvez pas vérifier la sortie à la main, c’est une raison de préférer le texte extrait partout où le document en offre.
Le coût est plus proche qu’il n’y paraît. Avec la réflexion désactivée des deux côtés, les deux routes ont utilisé à peu près la même taille de prompt sur cette page :
L’image faisait 923 732 caractères de base64, et rien de cela n’est ce que vous payez. Les images sont tokenisées par la taille, pas par la longueur de leur encodage, donc un gros PNG ne coûte pas ce qu’il semble devoir coûter.
Préférez le texte extrait quand le document contient du texte. Il conserve les caractères exacts, il ne coûte rien de plus pour atteindre au-delà de la page un, et il ne se soucie pas de la mise en page. Recourez à la vision quand l’analyseur dit qu’il n’y a rien à lire, ou quand le sens est dans la mise en page, comme dans un graphique, un tampon ou une signature.
Extraire autre chose
Rien de ce qui précède n’est spécifique aux articles. Échangez le schéma et le prompt système, et le pipeline extrait des factures :description font un vrai travail. Une date n’est sans ambiguïté qu’une fois que vous avez précisé le format souhaité, et 03/04/2026 désigne deux jours différents selon qui l’a écrit.
Étapes suivantes
- Validez le résultat par rapport au schéma avec
pydanticoujsonschema, pour qu’un enregistrement mal formé échoue à la frontière plutôt que trois fonctions plus loin. - Stockez le texte extrait avec les Embeddings pour effectuer des recherches parmi les documents au lieu de les ré-extraire.
- Attachez directement des documents à une complétion de chat avec les Entrées de fichiers quand vous voulez des réponses plutôt que des enregistrements.
- Donnez l’extracteur à un agent en tant qu’outil, en suivant Construire un agent qui utilise des outils avec l’appel de fonctions.
Traitement de documents
Référence pour le point de terminaison text-parser.
Réponses structurées
Comment json_schema contraint une réponse.
Vision
Envoyer des images à un modèle de chat.
Entrées de fichiers
Attacher un document sans l’analyser vous-même.