Capture-removebg-preview (1)Capture-removebg-preview (1)Capture-removebg-preview (1)Capture-removebg-preview (1)
  • Accueil
  • Services
  • L ‘Equipe
  • Autres services
  • Contact
Blog
✕

Auteurs):
Image créée par Midjourney (un document numérique flottant dans une base de données)

J’ai récemment relevé un défi très intéressant impliquant la capacité de l’IA à numériser une grande quantité de documents et à permettre à un utilisateur de poser des questions complexes liées aux données sur ces documents, comme

  • Questions de récupération de données : Celles-ci impliquent de récupérer des points de données ou des ensembles de données spécifiques à partir de la base de données, tels que « Combien de produits y a-t-il dans la catégorie « électronique » ? » ou « Quelles ont été les ventes totales au quatrième trimestre 2021 ? »
  • Requêtes d’agrégation : Des questions qui nécessitent de résumer des données, comme le calcul de moyennes, de sommes, de décomptes, etc., par exemple : « Quel est le prix moyen de tous les produits répertoriés ? » ou « Quel est le nombre total de clients dans chaque région ? »
  • Exploration des relations entre les données : Des questions qui sondent les relations entre différentes entités de données, telles que « Quels clients ont acheté plus de trois produits différents ? » ou « Répertoriez tous les fournisseurs qui n’ont livré aucun produit le mois dernier ».
  • Requêtes conditionnelles : Celles-ci impliquent des conditions ou des filtres, comme « Listez toutes les transactions supérieures à 500 $ survenues en 2022 » ou « Montrez-moi tous les produits en rupture de stock ».

Ce ne sont pas les questions typiques que vous pourriez résoudre en utilisant simplement RAG. Au lieu de cela, nous exploiterons l’agent SQL de LangChain pour générer des requêtes de base de données complexes à partir de texte humain.

Les documents doivent contenir des données avec un ensemble de spécifications, ainsi que des données plus fluides,

De plus, il existe une multitude de spécifications en tout genre :

Et ne négligeons pas les spécifications présentées dans des tableaux multilignes :

Tout bien considéré, nous disposons d’une excellente base pour lancer notre défi basé sur l’IA !

Analyser des documents à l’aide de Python, LangChain et GPT

Ce que je ferais habituellement maintenant, c’est de lancer un service Azure AI Document Intelligence pour entraîner un modèle sur un petit ensemble de PDF afin de détecter le contenu.

Mais j’ai opté pour un itinéraire différent cette fois.

Nous travaillerons avec Python et LangChain pour lire et analyser les documents PDF. J’utilise Python 3.11.

Tout d’abord, nous devons configurer notre environnement en installant et en important les bibliothèques requises :

%pip install pypdf
%pip install langchain
%pip install langchain_openai
%pip install sqlite3
from pypdf import PdfReader

from langchain_core.messages import HumanMessage, SystemMessage
from langchain_openai import ChatOpenAI

Passons maintenant à l’analyse PDF. Notre objectif est d’extraire un contenu significatif tout en ignorant les informations moins utiles telles que les lignes vides, les en-têtes et les pieds de page en utilisant visiteur_text:

document_content = None

def visitor_body(text, cm, tm, fontDict, fontSize):
y = tm[5]
if text and 35 < y < 770:
page_contents.append(text)

with open(f'./documents/ZMP_55852_XBO_1000_W_HS_OFR.pdf', 'rb') as file:
pdf_reader = PdfReader(file)

page_contents = []

for page in pdf_reader.pages:
page.extract_text(visitor_text=visitor_body)

document_content = "\n".join(page_contents)

print(document_content)

Voyons le document analysé :

Product family benefits
_
Short arc with very high luminance for brighter screen illumination
_
Constant color temperature of 6,000 K throughout the entire lamp lifetime
_
Easy to maintain
_
High arc stability
_
Instant light on screen thanks to hot restart function
_
Wide dimming range
Product family features
_
Color temperature: approx. 6,000 K (Daylight)
_
Wattage: 450…10,000 W
_
Very good color rendering index: Ra >
Product datasheet

XBO 1000 W/HS OFR
XBO for cinema projection U+007C Xenon short-arc lamps 450…10,000 W

[..]

Packaging unit

(Pieces/Unit)
Dimensions (length

x width x height)
Volume
Gross weight
4008321082114
XBO 1000 W/HS OFR
Shipping carton box

1
410 mm x 184 mm x

180 mm
13.58 dm³
819.00 g

[..]
__

Après examen du contenu analysé, il est évident qu’il manque de structure : les tableaux sont disjoints et les entités associées sont dispersées.

C’est ici que nous sollicitons l’aide de GPT pour imposer l’ordre :

  • Nous demanderons à GPT de formater les données analysées dans un objet JSON structuré.
  • En fournissant un exemple des données analysées, ainsi que des conseils stratégiques préfixés par <<<nous pouvons guider la compréhension et la structuration du document par GPT.
  • À l’aide de l’API OpenAI Chat, nous demanderons à GPT de générer un objet JSON à partir d’un nouvel ensemble de données produit analysées.

Construisons un message système perspicace pour lancer ce processus. Nous commencerons par une directive claire pour GPT, suivie par la présentation des données analysées comme contexte et par des conseils ciblés pour affiner le résultat :

Observez attentivement comment nous intégrons diverses astuces pour sculpter la sortie JSON précise dont nous avons besoin :

You analyze product descriptions to export them into a JSON format. I will present you with a product data sheet and describe the individual JSON objects and properties with <<<. You then create a JSON object from another product data sheet.

>>> Example product:

Product family benefits <<< benefits (string[])
_
Short arc with very high luminance for brighter screen illumination <<< benefits.[*]
_
Constant color temperature of 6,000 K throughout the entire lamp lifetime <<< benefits.[*]

[..]

_
Wide dimming range <<< benefits.[*]
Product family features <<< product_family (object)
_
Color temperature: approx. 6,000 K (Daylight) <<< product_family.temperature = 6000
_
Wattage: 450…10,000 W <<< product_family.watts_min = 450, product_family.watts_max = 10000
_
Very good color rendering index: Ra >
Product datasheet

XBO 1000 W/HS OFR <<< name
XBO for cinema projection U+007C Xenon short-arc lamps 450…10,000 W <<< description

[..]

Technical data
Electrical data <<< technical_data (object)
Nominal current
50 A <<< technical_data.nominal_current = 50.00
Current control range
30…55 A <<< technical_data.control_range = 30, technical_data.control_range = 55
Nominal wattage
1000.00 W <<< technical_data.nominal_wattage = 1000.00
Nominal voltage
19.0 V <<< technical_data.nominal_voltage = 19.0
Dimensions & weight <<< dimensions (object)

[..]

Safe Use Instruction
The identification of the Candidate List substance is <<< environmental_information.safe_use (beginning of string)

sufficient to allow safe use of the article. <<< environmental_information.safe_use (end of string)
Declaration No. in SCIP database
22b5c075-11fc-41b0-ad60-dec034d8f30c <<< environmental_information.scip_declaration_number (single string!)
Country specific information

[..]

Shipping carton box

1
410 mm x 184 mm x <<< packaging_unity.length = 410, packaging_unit.width = 184

180 mm <<< packaging_unit.height = 180

[..]
"""

Mes conseils sont un groupe d’approches différentes :

  • <<< avantages (chaîne[]) — Ici commence une liste de chaînes.
  • <<< avantages.[*] — Cette ligne appartient à la liste des chaînes.
  • <<< product_family (objet) — Ici commence un objet.
  • <<< product_family.temperature = 6000 — Cette ligne est une propriété int d’un objet
  • <<< product_family.watts_min = 450, product_family.watts_max = 1000 — Cette ligne est constituée de deux propriétés entières (par exemple, lorsqu’il y a une instruction telle que Wattage : 450…10 000 W)
  • et ainsi de suite…

Vous pouvez faire preuve de créativité totale ici et essayer tout ce qui vous convient. D’autres cas qui me viennent à l’esprit sont

  • <<< Traduire dans une autre langue.
  • <<< Fournissez un résumé ou une phrase complète à partir d'une puce.
  • <<< Diviser les données comme le prénom et le nom
  • etc.

Tester l’invite

Très bien, il est temps de tester GPT et de voir s’il peut réussir à transformer notre texte PDF désordonné en un objet JSON soigné.

J’ai tendance à utiliser GPT-3.5-Turbo 0125 cette fois-ci, plutôt que le GPT-4, plus performant, car le service Document Intelligence d’Azure est assez raide et je suis tout à fait d’accord pour trouver une solution alternative qui satisfasse nos portefeuilles. tout en faisant le travail.

Au moment de la rédaction de cet article, le prix de GPT-3.5-Turbo semble déjà plutôt intéressant :

  • 0,0005 $ par 1 000 jetons entrants
  • 0,0015 $ par 1 000 jetons sortants

Et encore mieux, la version 0125 de GPT-3.5-Turbo a une précision bien plus élevée pour répondre dans les formats demandés comme JSON, ce qui est parfait pour notre cas ! Et la cerise sur le gâteau est la fenêtre contextuelle de 16 385 jetons.

Nous avons notre Message système prêt et nous l’associerons au document_content comme contribution humaine :

chat = ChatOpenAI(model_name='gpt-3.5-turbo-0125', temperature=0)

def convert_to_json(document_content):
messages = [
SystemMessage(
content=system_message
),
HumanMessage(
content=document_content
)
]

answer = chat.invoke(messages)
return answer.content

json = convert_to_json(document_content)

print(json)

Très bien, il est temps d’observer la sortie JSON que nous avons obtenue :

{
"name": "XBO 1000 W/HS OFR",
"description": "XBO for cinema projection U+007C Xenon short-arc lamps 450…10,000 W",
"applications": [
"Classic 35 mm film projection",
"Digital film and video projection",
"Architectural and effect light (“Light Finger”)",
"Sunlight simulation"
],
"technical_data": {
"nominal_current": 50.00,
"control_range_min": 30,
"control_range_max": 55,
"nominal_wattage": 1000.00,
"nominal_voltage": 19.0
},
"dimensions": {
"diameter": 40.0,
"length": 235.0,
"length_base": 205.00,
"light_center_length": 95.0,
"electrode_gap": 3.6,
"weight": 255.00
},
"operating_conditions": {
"max_temp": 230,
"lifespan": 2000,
"service_lifetime": 3000
},
"additional_data": {
"base_anode": "SFa27-11",
"base_cathode": "SFcX27-8",
"product_remark": "OFR = Ozone-free version/H = Suitable for horizontal burning position/S = Short"
},
"capabilities": {
"cooling": "Forced",
"burning_position": "s20/p20"
},
"environmental_information": {
"declaration_date": "10-03-2023",
"primary_product_number": "4008321082114 U+007C 4050300933566",
"candidate_list_substance": "Lead",
"cas_number": "7439-92-1",
"safe_use": "The identification of the Candidate List substance is sufficient to allow safe use of the article.",
"scip_declaration_number": "22b5c075-11fc-41b0-ad60-dec034d8f30c"
},
"logistical_data": {
"product_code": "4008321082114",
"product_name": "XBO 1000 W/HS OFR",
"packaging_unit": {
"product_code": "4008321082114",
"product_name": "XBO 1000 W/HS OFR",
"length": 410,
"width": 184,
"height": 180,
"volume": 13.58,
"weight": 819.00
}
}
}

Assez solide, je dois dire. Les objets et propriétés trouvés sont parfaits.

Il y a cependant une omission notable : GPT a négligé quelques éléments critiques, tels que avantages et famille_produitqu’on ne trouve nulle part.

Alors, quel est notre plan de match ? Transition vers GPT-4, qui offre des capacités améliorées mais à un coût plus élevé et des temps de réponse nettement plus lents, ou adapter notre stratégie pour intégrer

Ça s’annonce bien. Passons maintenant aux applications les plus avancées.

Agent SQL SQLight et LangChain

RAG est une technique établie pour permettre aux utilisateurs de discuter avec leurs propres données. Il est extrêmement puissant pour les scénarios qui nécessitent des informations internes non structurées.

Bien que RAG excelle dans la navigation dans des informations non structurées, comment demanderiez-vous des informations beaucoup plus liées aux données ? Par exemple, donnez-moi tous les produits qui ont au moins 4 000 watts. Ou bien, fournissez la taille d’un carton d’expédition qui serait suffisante pour tous les produits ?

Quand cela vient à

Utilisez LangChain SQL Agent pour interroger des informations

Maintenant, nous sommes arrivés à une partie bien méritée : poser des questions au

Et SQL Agent a même été assez intelligent pour trouver la référence sur la table ProductApplication :

Conclusion

Comme souvent, je suis impressionné par l’interaction transparente de ces technologies après quelques ajustements ici et là et en appliquant les apprentissages acquis avec les grands modèles linguistiques au cours des dernières années.

La version 0125 de GPT fonctionne également parfaitement pour fournir des données au format JSON. Il est évident qu’OpenAI s’engage à améliorer l’appel de fonctions et à garantir qu’il répond aux cas d’utilisation standard pour la création de formats lisibles par ordinateur.

Est-ce que je confierais à SQL Agent une base de données d’entreprise de production ? SEULEMENT s’il a été conçu exactement pour ce cas et UNIQUEMENT pour le personnel interne ! Permettre à un modèle de langage d’exécuter des requêtes de manière autonome me semble toujours trop risqué.

Cependant, pour les scénarios publics, je suis disposé à explorer des alternatives plus sûres, telles que la formulation de requêtes GraphQL.

Eh bien, peut-être la prochaine fois…

J’espère que cette exploration a été aussi intéressante pour vous qu’éclairante pour moi.

Bon développement et à la prochaine fois.

Publié via Vers l’IA

Share
0

Autres articles

16 décembre 2024

L’émergence des robots conversationnels


En savoir plus
24 juin 2024

5 astuces pour utiliser Chat GPT gratuitement


En savoir plus
27 mai 2024

Fiche de Vérification Extincteur


En savoir plus

Comments are closed.

Entreprise d’intelligence artificielle Paris

ia pme

Meilleur planning ia

 

https://cdlacom.eu/2025/01/09/video-pour-reseaux-sociaux/

© 2025 CDLACOM. Mentions legales
    Blog
      Gérer le consentement aux cookies
      Pour offrir les meilleures expériences, nous utilisons des technologies telles que les cookies pour stocker et/ou accéder aux informations des appareils. Le fait de consentir à ces technologies nous permettra de traiter des données telles que le comportement de navigation ou les ID uniques sur ce site. Le fait de ne pas consentir ou de retirer son consentement peut avoir un effet négatif sur certaines caractéristiques et fonctions.
      Fonctionnel Toujours activé
      Le stockage ou l’accès technique est strictement nécessaire dans la finalité d’intérêt légitime de permettre l’utilisation d’un service spécifique explicitement demandé par l’abonné ou l’utilisateur, ou dans le seul but d’effectuer la transmission d’une communication sur un réseau de communications électroniques.
      Préférences
      Le stockage ou l’accès technique est nécessaire dans la finalité d’intérêt légitime de stocker des préférences qui ne sont pas demandées par l’abonné ou l’utilisateur.
      Statistiques
      Le stockage ou l’accès technique qui est utilisé exclusivement à des fins statistiques. Le stockage ou l’accès technique qui est utilisé exclusivement dans des finalités statistiques anonymes. En l’absence d’une assignation à comparaître, d’une conformité volontaire de la part de votre fournisseur d’accès à internet ou d’enregistrements supplémentaires provenant d’une tierce partie, les informations stockées ou extraites à cette seule fin ne peuvent généralement pas être utilisées pour vous identifier.
      Marketing
      Le stockage ou l’accès technique est nécessaire pour créer des profils d’utilisateurs afin d’envoyer des publicités, ou pour suivre l’utilisateur sur un site web ou sur plusieurs sites web ayant des finalités marketing similaires.
      Gérer les options Gérer les services Gérer {vendor_count} fournisseurs En savoir plus sur ces finalités
      Voir les préférences
      {title} {title} {title}