Loyer mensuel
monthly_rentRègle appliquéeUne valeur citée l'emporte sur une valeur non citée. Le bail a désigné la clause d'où elle vient; les deux autres n'ont fait qu'affirmer un montant.
Le bail, le résumé et la fiche descriptive décrivent le même immeuble, et ils ne concordent pas toujours. Envoyez-les ensemble, recevez un seul dossier cité, et voyez exactement quel document a gagné chaque champ contesté.
Un bail commercial n'est jamais un seul document. Il y a le bail signé, un résumé rédigé il y a deux ans, une fiche descriptive de courtier et un tableur tenu par le gestionnaire d'actifs. Chacun indique le loyer. Ils n'indiquent pas tous le même loyer.
Alors quelqu'un ouvre les quatre, repère les écarts, décide quoi croire et saisit la réponse dans un système. Cette personne est souvent la seule trace du pourquoi. Quand elle part, le raisonnement part avec elle.
Le rapprochement, c'est le travail. Lire les documents n'est que le chemin pour y arriver.
L'ordre compte, et c'est pourquoi le résultat est prévisible. Chaque document est lu séparément, puis les résultats sont fusionnés selon des règles.
Lire chaque fichier une fois, quel qu'il soit. Un bail numérisé et un tableur arrivent en aval sous la même forme.
Chaque document est extrait séparément, selon votre schéma, avec une citation pour chaque champ rempli.
Les résultats par document se réduisent en un seul dossier selon des règles documentées. Aucun modèle ne décide de cette partie, et c'est pourquoi elle ne surprend jamais deux fois.
Chaque champ contesté est listé avec ce que chaque document disait et lequel a gagné. Vos propres vérifications s'exécutent ici aussi.
Un dossier, plus ce que chaque document disait séparément, vers le système qui suit le portefeuille.
Trois documents, trois champs contestés, trois règles différentes pour les trancher. Rien n'est moyenné, rien n'est mélangé — une valeur est prise entière, avec sa citation, dans un seul document.
Règle appliquéeUne valeur citée l'emporte sur une valeur non citée. Le bail a désigné la clause d'où elle vient; les deux autres n'ont fait qu'affirmer un montant.
Règle appliquéeToute valeur réelle l'emporte sur un champ vide. Le bail n'indique jamais la superficie : il n'avait rien à fournir et on ne lui a pas demandé de deviner.
Règle appliquéeLes deux citaient le chiffre aussi clairement, donc l'égalité est allée au fichier envoyé en premier. L'ordre de téléversement a tranché celui-ci.
Cette dernière règle mérite qu'on s'y arrête. Inversez les deux fichiers dans la requête et le gagnant change — c'est un comportement mesuré, pas une supposition. Et aucune formulation dans vos instructions n'y changera rien, parce que les instructions façonnent l'extraction et que la fusion vient après. Désactivez l'ancrage et chaque comparaison devient une égalité, ce qui fait gagner le premier fichier partout.
La forme peut venir de votre code, d'une action enregistrée ou d'une phrase en prose. À choisir par appel.
await sdk.extract({
file: {id: leaseId},
citations: true,
schema: leaseSchema,
})await sdk.extract({
files: [lease, abstract, factSheet],
unit: 'across_documents',
citations: true,
schema: leaseSchema,
})await sdk.extract({
files: [lease, abstract],
unit: 'across_documents',
action: 'lease-abstract',
citations: true,
})await sdk.extract({
file: {id: leaseId},
citations: true,
hints: 'Commercial lease: rent, term, dates, renewal.',
})Ce qu'on attend d'une fusion de documents est souvent faux, et faux d'une manière qui coûte un après-midi. Voici ce qui se passe vraiment.
Une citation n'est pas une note de bas de page. Elle porte le fichier, la page et le cadre sur cette page, donc une valeur douteuse se vérifie en un clic, pas en un après-midi avec un PDF.
Champs extraits
const run = await sdk.extract({
files: [lease, abstract, factSheet],
unit: 'across_documents',
citations: true,
judge: true, // re-score each value against the passage it cites
schema: leaseSchema,
})
// A citation names the file, the page, and the box on that page. That is
// what the panel opposite is drawing, and what makes a value checkable.
for (const [field, cited] of Object.entries(run.output.citations)) {
for (const c of cited) {
console.log(field, c.fileId, c.page, c.bbox, c.confidence)
}
}
// Confident values carry on. The rest go to a person — and the citation
// is the first thing they open.
const needsReview = Object.entries(run.output.citations)
.filter(([, cited]) => cited.some((c) => c.confidence <= REVIEW_THRESHOLD))
.map(([field]) => field)Trois étapes et une décision. La fusion est un champ de la requête, pas un pipeline à assembler.
Un enregistrement de fichier par document, puis envoyez les octets à chaque URL de téléversement. Choisissez l'ordre volontairement — l'ordre de la requête tranche les égalités dans la fusion, donc le document le plus fiable passe en premier.
Envoyez un tableau de fichiers plutôt qu'un seul, mettez unit à across_documents et laissez les citations activées. L'ancrage permet à la fusion de classer deux valeurs concurrentes au lieu de se rabattre sur l'ordre seul.
Mettez judge à true et une seconde passe réévalue chaque valeur selon le passage qu'elle cite. Il lui faut les citations activées pour avoir quelque chose à lire. Les scores bas forment votre file pour une personne, pas une raison de jeter la valeur.
Vous recevez le dossier fusionné, et chaque citation porte l'identifiant du fichier d'origine — c'est ce qui rend la fusion vérifiable et pas seulement commode. Gardez l'exécution et elle devient un dossier permanent au lieu d'expirer avec sa durée de vie par défaut.
Une fois les clauses structurées, les documents qui les citent peuvent être produits plutôt que saisis.
Tout ce qui précède existe en exemple TypeScript exécutable sous licence MIT, documents d'exemple inclus. Bun install, ajoutez une clé d'API, lancez. Les quatre façons d'appeler l'extraction sont sélectionnables dans l'interface, et l'écran de révision est celui de la vidéo.
L'expérience intéressante prend dix secondes : inversez les deux documents dans la liste et regardez le champ à égalité changer de réponse. C'est tout l'argument des règles déterministes face à un modèle qui choisit discrètement son favori.
github.com/CloudRaker/cloudraker-api-examples-typescript — le dossier rental-lease-extraction.
Une capacité et trois de ses réglages portent tout ce flux.
Prenez deux baux qui vous font déjà débattre, envoyez-les en un seul appel et lisez la liste des désaccords. Dix minutes, et vous saurez si ça a sa place dans votre pile.