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
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 !
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 PdfReaderfrom 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 = Nonedef 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 datasheetXBO 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 pouvons guider la compréhension et la structuration du document par GPT.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 :
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
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 :
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.
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 à
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 :
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