Skip to main content
Un script d’activité personnalisée peut appeler ABBYY Phoenix Plus, le point de terminaison LLM fourni et exploité par ABBYY, sans avoir à écrire le moindre code HTTP, d’authentification ou propre à un provider. L’activité s’exécute comme un step d’une Compétence de processus : le modèle peut donc lire la transaction en cours, et son résultat peut être réutilisé par les steps suivants.
ABBYY Phoenix Plus est disponible sur ABBYY Vantage Cloud et nécessite un droit d’utilisation contractuel. Pour l’activer sur votre tenant, contactez votre ABBYY account team. Pour une vue d’ensemble, consultez Les LLM dans ABBYY Vantage.

Avant de commencer

  • Le droit Phoenix Plus est activé pour votre tenant et la connexion ABBYY Phoenix Model apparaît sous ADMIN → Configuration → Connections.
  • Vous disposez d’une Compétence de processus comportant une activité Custom. Pour connaître la marche à suivre, consultez Activité personnalisée.
  • Dans l’onglet Available Files de l’activité, sélectionnez les formats d’export requis par votre script. La plupart des scripts nécessitent OcrJson. Pour envoyer des images de page, un export JPEG est également nécessaire ; il doit être généré avant l’exécution de l’activité.

Créer une session de chat

Appelez Context.CreateLlmChatSession() sans argument pour ouvrir une session s’appuyant sur la connexion gérée par ABBYY de votre tenant. Si vous transmettez un nom de connexion, la session s’ouvre plutôt sur l’une de vos propres connexions de tenant.
Le reste de cette page décrit la connexion gérée. Une session ouverte sur votre propre connexion fonctionne de la même manière, mais la facturation passe par votre fournisseur et elle n’est pas couverte par le droit d’utilisation. Le modèle qui sous-tend la session est sélectionné et maintenu par ABBYY. La session refuse toute tentative de le modifier : il n’est donc pas possible de demander un modèle ou une version spécifique via la connexion gérée.

Propriétés de session

LastUsage et TotalUsage sont des objets contenant PromptTokens, CompletionTokens et TotalTokens.

Réinitialiser une session

Reset() efface l’historique de la conversation ainsi que les pièces jointes en attente, afin que le message suivant reparte de zéro. Les paramètres tels que SystemPrompt et Temperature sont conservés, de même que l’utilisation cumulée.

Joindre du contenu à un message

Joignez les données de transaction que vous souhaitez soumettre au Model, puis envoyez. Les pièces jointes sont mises en file d’attente pour le prochain message utilisateur au lieu d’être envoyées immédiatement. Vous pouvez également constituer un historique de conversation sans rien envoyer, ce qui est utile pour l’amorçage few-shot :
AttachFile, AttachBinary et un Attach générique n’existent pas. Utilisez les méthodes ci-dessus.

Joindre les images de page dans l’ordre des pages

Les exports JPEG sont triés selon Properties["PageIndex"] : les joindre dans leur ordre d’apparition permet donc de conserver un ordre des pièces jointes conforme aux numéros de page indiqués par le Model.

Envoyer le message et lire la réponse

SendJson renvoie un objet. S’il renvoie une string, c’est que le modèle n’a pas produit de JSON analysable : il faut alors affiner le prompt plutôt que de relancer l’appel.

Vérifier comment la réponse s’est terminée

Lisez LastFinishReason avant de vous fier à une réponse. La valeur "length" indique que la réponse a été tronquée à la limite de jetons. Il ne s’agit pas d’une erreur et rien d’autre ne le signale : un script qui l’ignore analysera donc un résultat partiel comme s’il était complet. Pour y remédier, augmentez MaxTokens ou réduisez l’ensemble de champs.

Valider la structure avant d’écrire les valeurs

Une réponse peut être complète tout en étant structurellement incorrecte : les bons champs scalaires, mais aucun des contenus répétables définis par une compétence. Vérifiez que la réponse contient bien les tableaux et les champs répétables demandés et, si ce n’est pas le cas, relancez la demande plutôt que d’écrire la réponse dans le document sans contrôle. Réinitialisez la session entre les tentatives, puis redéfinissez SystemPrompt.

Ce qu’exige la connexion gérée

Contexte documentaire. La connexion gérée est refusée pour une exécution qui ne comporte aucune page de document. Cela empêche l’utilisation des identifiants partagés de la plateforme comme passerelle LLM à usage général. Une activité personnalisée qui s’exécute sur une transaction contenant des documents remplit cette condition ; un script qui ouvre une session en dehors de ce contexte, non. Comptabilisation. Les appels passant par la connexion gérée sont décomptés de vos droits d’utilisation ABBYY. Les appels passant par une connexion que vous avez configurée vous-même sont facturés par votre propre provider. Tenez compte du volume avant de diriger une tâche de retraitement en masse vers la connexion gérée.

Limites des messages

Les deux limites sont appliquées, et tout message qui dépasse l’une d’elles est purement et simplement refusé. Calculez la taille du message dans le script avant l’envoi plutôt que de laisser l’appel échouer. Le plafond du prompt n’est pas une valeur fixe unique. Il est configuré par environnement et évolue en fonction du nombre de pages traitées, jusqu’à un maximum. Sur ABBYY Vantage Cloud, chaque page autorise aujourd’hui 500 000 caractères, comptabilisés sur trois pages au maximum, avec un plafond de 1 500 000 : Comme ce plafond est configuré par environnement et peut évoluer, considérez ces chiffres comme indicatifs et non comme un engagement. Calculez la taille du message à l’exécution et prévoyez un fonctionnement dégradé lorsqu’il ne tient pas, plutôt que de présumer d’un budget fixe. Un dépassement produit un message de la forme suivante :

Erreurs que les nouvelles tentatives ne peuvent pas corriger

Une erreur d’envoi mentionnant exceeds the maximum allowed size, maximum number of attachments, context length ou too large est définitive. Le message est trop volumineux ou contient trop d’éléments, et le même appel échouera à nouveau. Les solutions consistent à réduire la résolution de l’export JPEG, à envoyer moins de pages, ou à supprimer les images et à lancer le traitement uniquement sur le JSON de l’OCR.

Erreurs que votre script ne peut pas intercepter

La plupart des défaillances peuvent être interceptées dans le script avec try/catch : problèmes de connexion, requête en échec, réponse qui n’est pas du JSON valide ou prompt qui dépasse la limite de taille. Traitez-les et poursuivez. Le dépassement du plafond de requêtes, en revanche, est un cas à part. Le nombre d’appels au LLM qu’une même exécution de script peut effectuer est limité, proportionnellement au nombre de pages de la transaction. Un dépassement interrompt le script avec une erreur de contrainte qu’un try/catch ne peut pas absorber, tout comme le fait le plafond existant de requêtes HTTP. Ce point est important si vous prévoyez de nouvelles tentatives. Une boucle de validation et de nouvelle interrogation consomme un appel à chaque exécution, et une boucle dépourvue de limite propre finira par atteindre une limite qu’elle ne pourra pas gérer. Bornez vos tentatives.

Envoi des images de page

Les images de page fonctionnent, dans la limite pratique fixée par le budget du prompt. Deux exemples mesurés, au regard des plafonds ci-dessus :
  • Une seule image de page en 1584x1000 coûte environ 311 776 caractères base64 et quelque 2 015 jetons de prompt. Sur une transaction d’une page, elle tient dans l’allocation de 500 000 caractères, en laissant de la place pour le JSON OCR et le prompt.
  • Un formulaire A4 de deux pages numérisé à 300 ppp produit environ 1 326 136 caractères d’image. Une transaction de deux pages n’autorise que 1 000 000 de caractères : elle est donc refusée. L’envoyer sous forme d’images supposerait de réduire chaque page à environ un quart de sa taille à 300 ppp.
Le calcul varie selon le nombre de pages et selon toute modification du plafond de l’environnement : c’est pourquoi le message doit être mesuré avant d’être envoyé, plutôt que présumé conforme. Concevez votre intégration avec ce budget, et non contre lui :
  • Envoyez le JSON OCR comme charge utile principale et n’ajoutez des images de page que pour ce que la couche de texte ne peut pas restituer : tampons, signatures et photographies.
  • Mesurez le message avant l’envoi. Si les images ne tiennent pas, supprimez-les et adaptez le prompt en conséquence, afin que le document soit tout de même traité à partir du seul JSON OCR.
  • Réservez de la place pour le JSON OCR lors du dimensionnement des images, afin qu’une image volumineuse ne puisse pas évincer la charge utile dont vos coordonnées sont issues.
  • Réduisez la résolution des images avant l’export lorsque le modèle a seulement besoin de voir la mise en page ou un tampon, et non les détails fins.

Positions et rectangles englobants

Ne demandez pas de coordonnées au modèle. Le modèle qui sous-tend la connexion gérée ne peut pas ancrer un rectangle englobant sur une image de la page, et une réponse qui ressemble à des coordonnées n’est pas pour autant une mesure.
Lorsqu’on lui demande de renvoyer des coordonnées à partir d’une image de la page, le modèle produit des valeurs alignées sur une grille de dix unités : chaque nombre est un multiple de dix, les hauteurs sont uniformes et deux champs différents partagent un rectangle identique. Il s’agit d’une mise en page reconstituée et non mesurée, et aucun paramètre de convention de coordonnées n’y remédie. Récupérez plutôt la géométrie dans le calque OCR de Vantage. L’export JSON de l’OCR contient les positions mesurées du contenu textuel comme non textuel, notamment layout.pages[].pictures[] et barcodes[] : une photographie, un logo ou un code-barres peut donc être localisé avec la même fiabilité qu’un mot. Un script robuste :
  • Copie les coordonnées, il ne les estime jamais. Chaque rectangle provient d’une valeur de position du JSON de l’OCR, validée par rapport à la taille de page de l’OCR et mise à l’échelle de l’image de la page Vantage lorsque les deux diffèrent.
  • Impose la traçabilité. Chaque région renvoyée par le modèle est confrontée à la géométrie de l’OCR avant d’être acceptée. Une région qui ne peut pas être rattachée au calque OCR est refusée, tandis que la valeur extraite, elle, est conservée.
  • Exige l’attribution de page. Sur un document multipage, une région qui arrive sans numéro de page est refusée plutôt que rattachée par défaut à la page 1.
Utilisez le modèle pour ce qu’il fait le mieux : lire et classer. Laissez l’OCR d’ABBYY fournir la géométrie.

Définissez MaxTokens de manière délibérée

Laisser MaxTokens à la valeur par défaut du provider expose à une troncature silencieuse sur les documents denses, décelable uniquement via LastFinishReason. Définissez-le explicitement : la limite est ainsi la vôtre et reste explicite. À titre d’ordre de grandeur, l’extraction cellule par cellule d’un tableau de neuf colonnes sur trois pages représente environ 28 000 jetons de complétion.

Prévoyez un délai suffisant

La latence dépend du nombre de jetons de sortie générés, et non de la taille de l’entrée. Phoenix Plus génère environ 100 jetons de complétion par seconde : une réponse de 28 000 jetons prend donc plusieurs minutes. Timeout s’exprime en minutes et ne peut pas dépasser le script execution timeout. Un timeout de deux minutes appliqué à un Document nécessitant 28 000 jetons de sortie échouera au bout d’environ 121 secondes, n’ayant généré qu’une fraction de la réponse.

Réduire la charge utile OCR avant l’envoi

Un export JSON OCR brut est dominé par le calque de caractères, qui représente généralement 97 à 98 % de sa taille. Après élagage, il ne reste que le texte et les positions des mots dont le modèle a réellement besoin, pour une fraction du budget de prompt. Dans un cas mesuré, un export de 43 437 caractères a été ramené à 4 842 caractères, les positions des mots étant conservées. Dans un autre, un export de 317 296 caractères a été ramené à 32 712 caractères. Pour estimer le coût, comptez environ 2 caractères par token pour le JSON OCR. La ponctuation JSON se tokenise mal : les ratios établis sur du texte rédigé ne s’appliquent donc pas.

Limitations connues

Pour joindre une page sous forme d’image, utilisez AttachPageImage(page). Passer Page.Image à AttachImage déclenche l’erreur Value cannot be null. (Parameter 'fileLink'), aussi bien sur les documents divisés que non divisés, car AttachImage attend un fichier exporté et non la propriété image d’une page. Un export JPEG issu de Document.Exports, en revanche, fonctionne avec AttachImage.

Exemple

Ce script envoie un JSON OCR épuré et demande des valeurs de champs structurées, en reprenant toutes les données de geometry du calque OCR.