با وجود فراگیر شدن ابزارهای دیجیتال، پر کردن دستی فرمهای PDF همچنان یک کار خستهکننده و مستعد خطا در گردش کارهای تجاری و اداری است. این مقاله به بررسی یک راهکار مبتنی بر هوش مصنوعی برای خودکارسازی این فرآیند با استفاده از پایتون و مدلهای زبان بزرگ (LLM) مانند GPT-4o از OpenAI میپردازد. با استخراج فیلدهای فرم، بهرهگیری از تحلیل متنی هوش مصنوعی و پر کردن پویا PDFها، این روش دخالت انسان را تقریباً به صفر میرساند - که از طریق مثالهای واقعی مانند فرم W-9 سازمان امور مالیاتی آمریکا (IRS) و فرم TR-205 کالیفرنیا نشان داده شده است. در حالی که نتایج بسته به ساختار PDF و وضوح فیلدها متفاوت است، این رویکرد پتانسیل تحولآفرین هوش مصنوعی در اتوماسیون اسناد را برجسته میکند و مقیاسپذیری، سرعت و چارچوبی برای غلبه بر چالشهایی مانند برچسبگذاری مبهم فیلدها ارائه میدهد. کشف کنید که چگونه حتی هوش مصنوعی ناقص امروزی، راه را برای اتوماسیون یکپارچه فردا هموار میکند.
پیشزمینه
این مقاله از دل کار من روی توسعه Instafill.ai، ابزاری طراحی شده برای سادهسازی اتوماسیون فرم PDF برای کسبوکارها و افراد، بیرون آمده است. در حالی که Instafill.ai اکنون گردش کارهای پیچیده (مانند اسناد قانونی و فرمهای مالیاتی) را مدیریت میکند، اولین نسخه آن یک اسکریپت پایتون ساده بود - شبیه به آنچه در اینجا بررسی خواهم کرد. با به اشتراک گذاشتن این رویکرد منبعباز، هدفم توانمندسازی توسعهدهندگان برای ساخت راهحلهای خودشان است. این را به عنوان نگاهی به پشت صحنه شروع فناوری اصلی Instafill.ai - و یک نقشه راه برای آزمایشهای شما در نظر بگیرید.
اسناد PDF تعاملی به طور گسترده در تجارت و آموزش استفاده میشوند، اما پر کردن دستی آنها میتواند یک چالش واقعی باشد. ماهیت تکراری این فرآیند و خطر خطا در هنگام ورود دستی دادهها اغلب منجر به اتلاف وقت و سرخوردگی میشود. اتوماسیون میتواند یک تغییر دهنده بازی باشد و زمان پردازش اسناد را به طور قابل توجهی کاهش داده و خطاها را به حداقل برساند.
تیم شرکت من با هدف رسیدگی به نقاط دردناک کاربران در برخورد با فرمهای PDF، سه سؤال کلیدی از خودمان پرسیدیم:
- آیا امروزه محصولات موجودی وجود دارند که مشکلات پر کردن دستی چنین فرمهایی را حل کنند؟
- چگونه میتوانیم این مشکلات را حل کنیم و اگر محصولات جایگزینی از قبل وجود داشته باشند، کاربر بالقوه ما چه ارزش افزودهای به دست خواهد آورد؟
- آیا میتوان وظیفه پر کردن فرمهای PDF را کاملاً به هوش مصنوعی واگذار کرد؟
صادقانه بگویم، سؤال آخر حتی اکنون نیز مطرح است. با این حال، پیشرفت سریع مدلهای زبان بزرگ به ما این امکان را میدهد که با اطمینان روی کاهش دخالت انسان در پر کردن یکنواخت فرمهای PDF به صفر شرطبندی کنیم. این ایده، پایه و اساس راهکاری را تشکیل میدهد که در ادامه این مقاله مورد بحث قرار خواهم داد.
معماری راهکار: از خواندن PDF تا پر کردن فرمها با استفاده از هوش مصنوعی
بیایید به اصل مطلب بپردازیم. مفهوم اصلی راهکار شامل موارد زیر است:
- خواندن فرم PDF — استخراج متن و فیلدهای فرم.
- استفاده از یک مدل هوش مصنوعی برای تجزیه و تحلیل و پر کردن فیلدها.
- بهروزرسانی فایل PDF با مقادیر جدید.
در کل، خیلی پیچیده نیست، درست است؟ این را میتوان با هر زبان برنامهنویسی پیادهسازی کرد، اما ما به طور خاص پایتون را انتخاب کردیم زیرا برای نوشتن کد و انجام آزمایشها انعطافپذیر، همهکاره و کارآمد است. به هر حال، ما دائماً نیاز به آزمایش فرضیههای جدید و تصمیمگیری سریع بر اساس نتایج داریم. در پایان، شما نیز اسکریپتی آماده برای استفاده در فرمهای PDF خود خواهید داشت.
پیادهسازی و دستورالعملهای گام به گام
۱. خواندن PDF
اسکریپت با خواندن فایل PDF برای استخراج متن و فیلدهای فرم آن شروع میشود. متن از سند PDF اطلاعات کلی در مورد فرم و هدف آن را به مدل هوش مصنوعی ارائه میدهد. این، زمینهای را تعیین میکند که مدل هوش مصنوعی در آن برای پر کردن فیلدهای مورد نیاز عمل خواهد کرد.
def extract_pdf_text(pdf_bytes: bytes) -> str:
pdf_text = ''
pdf_document = fitz.open(PDF_EXT, pdf_bytes)
for page_num in range(len(pdf_document)):
page = pdf_document.load_page(page_num)
text_page = page.get_textpage()
pdf_text += text_page.extractText()
return pdf_text
به همان اندازه مهم است که تا حد امکان اطلاعات بیشتری در مورد این فیلدها استخراج کرده و آن را در قالبی قابل فهم برای مدل هوش مصنوعی ذخیره کنیم. این کار کیفیت خروجی را بهبود میبخشد زیرا هرچه زمینه و جزئیات بیشتری به هوش مصنوعی ارائه دهیم، احتمال تولید نتیجه مطلوب بیشتر میشود. مدلهای زبان بزرگ تمایل دارند همیشه مقداری خروجی برگردانند، اما کیفیت آن میتواند cuestionable باشد. هدف ما به حداقل رساندن فراوانی توهمزایی (hallucinations) است.
def extract_pdf_fields(pdf_bytes: bytes) -> list[dict]:
form_fields = []
pdf_document = fitz.open(PDF_EXT, pdf_bytes)
for page_num in range(len(pdf_document)):
page = pdf_document.load_page(page_num)
widget_list = page.widgets()
if widget_list:
for widget in widget_list:
form_fields.append({
'name': widget.field_name,
'label': widget.field_label,
'type': widget.field_type_string,
'max_length': widget.text_maxlen
})
return form_fields
۲. واگذاری کار به هوش مصنوعی
قبل از استفاده از هوش مصنوعی برای پر کردن فیلدهای فرم، اسکریپت یک پرامپت (prompt) تولید میکند. کیفیت این پرامپت تعیین میکند که آیا "جادو" اتفاق میافتد یا خیر. پرامپت حاوی دستورالعملهای کلی است و اجزای PDF (استخراج شده در مرحله قبل) و دادههای بدون ساختار را به عنوان پارامتر میپذیرد. این دادهها منبع اطلاعات مورد نیاز برای پر کردن فرم هستند. برای سادگی، اسکریپت آن را از یک فایل متنی میخواند، اما به طور کلی، میتواند هر فرمتی باشد: PDF، DOCX، JPG و غیره.
def fill_fields_prompt(pdf_text: str, fields: list[dict], source_info: str) -> str:
return f"""
You are an automated PDF forms filler.
Your job is to fill the following form fields using the provided materials.
Field keys will tell you which values they expect:
{json.dumps(fields)}
Materials:
- Text extracted from the PDF form, delimited by <>:
<{pdf_text}>
- Source info attached by user, delimited by ##:
#{source_info}#
Output a JSON object with key-value pairs where:
- key is the 'name' of the field,
- value is the field value you assigned to it.
"""
من OpenAI و مدل GPT-4o را به عنوان ارائهدهنده هوش مصنوعی انتخاب کردم. به اندازه کافی هوشمند و سریع است. شما میتوانید با ارائهدهندگان و مدلهای دیگر آزمایش کنید، اما به یاد داشته باشید که پرامپت را برای هر LLM تنظیم کنید. مهندسی پرامپت (Prompt engineering) در این مرحله حیاتی است. پس از فراخوانی API (نشان داده شده در زیر)، یک دیکشنری از <نام فیلد>:<مقدار فیلد> خواهیم داشت که برای مرحله بعدی آماده است.
def call_openai(prompt: str, gpt_model: str = 'gpt-4o'):
response = openai_client.chat.completions.create(
model=gpt_model,
messages=[{'role': 'system', 'content': prompt}],
response_format={"type": "json_object"},
timeout=TIMEOUT,
temperature=0
)
response_data = response.choices[0].message.content.strip()
return json.loads(response_data)
۳. پر کردن PDF
آخرین مرحله، پر کردن PDF با مقادیری است که هوش مصنوعی برای فیلدهای فرم تولید کرده است.
def fill_pdf_fields(pdf_bytes: bytes, field_values: dict) -> io.BytesIO:
pdf_document = fitz.open(PDF_EXT, pdf_bytes)
for page_num in range(len(pdf_document)):
page = pdf_document.load_page(page_num)
widget_list = page.widgets()
if widget_list:
for widget in widget_list:
field_name = widget.field_name
if field_name in field_values:
widget.field_value = field_values[field_name]
widget.update()
output_stream = io.BytesIO()
pdf_document.save(output_stream)
output_stream.seek(0)
return output_stream
آزمایش راهکار
اول از همه، محصول ما مخاطبان آمریکایی را هدف قرار داده است، بنابراین به عنوان مثال، از فرم W-9 سازمان امور مالیاتی آمریکا (IRS) استفاده کردم — یک سند رایج در ایالات متحده که برای جمعآوری اطلاعات شناسایی مالیاتدهنده استفاده میشود. این فرم اغلب برای کارهای فریلنسینگ، قراردادهای پیمانکاری و تراکنشهای مالی مختلف مورد نیاز است. با توجه به کاربرد گسترده آن، به عنوان یک مثال ایدهآل برای نشان دادن نحوه عملکرد راهکار ما عمل میکند.
برای پر کردن این فرم، از دادههای آزمایشی زیر استفاده کردم:
1. personal info
john smith
222 Victory St, 125
San Francisco, CA, 94111
2. business info
BOTMAKERS, LLC
has foreign partners
account numbers: 1234567890, 0987654321
tin: 123456789
3. requester
jane smith
87 Independence St
حالا به جالبترین بخش میرسیم: بیایید به فرم پر شده نگاه کنیم و کیفیت کار راهکار را تجزیه و تحلیل کنیم.
میبینیم که همه فیلدها پر شدهاند. صرف نظر از کیفیت در حال حاضر، نتیجهگیری اولیه ما این است که هوش مصنوعی مولد وظیفه خود را انجام داده است. بیایید عمیقتر به آنچه تولید کرده است بپردازیم: موفقیتها و شکستهای آشکاری وجود دارد. برخی فیلدها (برجسته شده با رنگ سبز) به درستی پر شدهاند، در حالی که برخی دیگر (برجسته شده با رنگ قرمز) به نظر میرسد کسی آنها را کورکورانه تایپ کرده است. بیایید بررسی کنیم چرا این اتفاق افتاده است. در اینجا برخی از فیلدهای استخراج شده از فرم PDF آورده شده است (فقط زیرمجموعهای نشان داده شده است؛ بقیه از همین الگو پیروی میکنند):
{
"name" : "topmostSubform[0].Page1[0].Boxes3a-b_ReadOrder[0].c1_2[0]",
"label" : null,
"type" : "CheckBox",
"max_length" : 0
},
{
"name" : "topmostSubform[0].Page1[0].f1_05[0]",
"label" : null,
"type" : "Text",
"max_length" : 0
},
{
"name" : "topmostSubform[0].Page1[0].f1_06[0]",
"label" : null,
"type" : "Text",
"max_length" : 0
},
{
"name" : "topmostSubform[0].Page1[0].Address_ReadOrder[0].f1_07[0]",
"label" : null,
"type" : "Text",
"max_length" : 0
}
نام فیلد یک پارامتر حیاتی برای هوش مصنوعی هنگام پر کردن مقادیر است. با این حال، در این مورد، با مشکلی روبرو هستیم: نامها فاقد اطلاعات کافی برای تعیین بدون ابهام مقادیر مورد انتظار برای این فیلدها هستند. این موضوع نتایج نامطلوب را توضیح میدهد.
بیایید فرم دیگری را پر کنیم — TR-205 (درخواست محاکمه کتبی). این سند در کالیفرنیا برای ارائه درخواست محاکمه کتبی استفاده میشود. این به رانندگان اجازه میدهد تا بدون حضور در دادگاه، تخلفات رانندگی را به چالش بکشند.
من از دادههای آزمایشی زیر برای پر کردن آن استفاده کردم:
Court:
SUPERIOR COURT OF CALIFORNIA
100 NORTH STATE STREET
UKIAH CA 95482
BRANCH #23480
Citation: KV19133
Case: 231N07977
Defendant:
John Smith
1234 Main Street, Apt. 101
Due date: 07/21/24
Bail amount: $441
Date mailed: 06/21/24
Evidence:
- photographs (5)
- witness testimony
Statement of facts: I increased my speed to avoid a possible traffic accident due to a truck in the middle of the road.
Today: 06/21/24
و این هم نتیجه:
توجه کنید که اسکریپت با این فرم عملکرد بهتری داشت. تمام اطلاعات ارائه شده در فیلدهای "صحیح" قرار گرفتند. همانطور که ممکن است حدس بزنید، تفاوت در نحوه ذخیره این فیلدها در PDF است. آنها را با مثال قبلی مقایسه کنید:
{
"name" : "TR-205[0].Page1[0].P1Caption[0].CitationNumber[0].CitationNumber[0]",
"label" : "CITATION NUMBER:",
"type" : "Text",
"max_length" : 0
},
{
"name" : "TR-205[0].Page1[0].P1Caption[0].CaseNumber[0].CaseNumber[0]",
"label" : "CASE NUMBER:",
"type" : "Text",
"max_length" : 0
}
بنابراین، ما کشف کردیم که کیفیت پر کردن فرم به شدت به ساختار داخلی فرم PDF ورودی بستگی دارد. نحوه ذخیره فیلدهای فرم مستقیماً بر نتیجه نهایی تأثیر میگذارد. این یکی از چالشهای کلیدی باقی مانده است که من هنوز راهحل کاملی برای آن ندارم.
نتیجهگیری
بیایید خلاصه کنیم. در این مقاله، ما بررسی کردیم که چگونه هوش مصنوعی میتواند پر کردن فرمهای PDF را خودکار کند، با استفاده از فرمهای W-9 سازمان امور مالیاتی آمریکا (IRS) و TR-205 کالیفرنیا به عنوان مثال. ایده اصلی شامل استخراج متن و فیلدها از PDF، استفاده از یک مدل زبان بزرگ (در این مورد، GPT-4o) با یک پرامپت دقیق برای تفسیر دادههای منبع و تخصیص مقادیر به فیلدها، و در نهایت، بهروزرسانی برنامهنویسی PDF است.
آزمایشها نشان داد که موفقیت این رویکرد به شدت به کیفیت دادههای داخلی PDF بستگی دارد، به ویژه نحوه نامگذاری و برچسبگذاری فیلدهای فرم. فرمهایی با فیلدهای با ساختار خوب و توصیفی (مانند TR-205) نتایج بسیار بهتری نسبت به فرمهایی با نامگذاری فیلد مبهم یا غیر آموزنده (مانند W-9) به دست میدهند. این موضوع یک چالش کلیدی را برجسته میکند: نیاز به روشهای قویتر برای تفسیر هدف فیلد زمانی که فراداده (metadata) واضح نیست.
با وجود این چالشها، پتانسیل اتوماسیون مبتنی بر هوش مصنوعی برای کارهای مربوط به فرم PDF قابل توجه است. این میتواند به طور چشمگیری زمان پردازش را کاهش دهد، خطاها را به حداقل برساند و کارمندان را از کارهای تکراری رها کند. اسکریپت پایتون ارائه شده در اینجا به عنوان یک نمونه اولیه و پایهای برای توسعهدهندگانی عمل میکند که به دنبال ساخت راهحلهای اتوماسیون اسناد خود هستند. همانطور که مدلهای هوش مصنوعی به تکامل خود ادامه میدهند، میتوان انتظار داشت که این تکنیکها حتی مؤثرتر و قابل اعتمادتر شوند و ما را به آیندهای نزدیکتر کنند که در آن پر کردن دستی فرمها به گذشته تعلق داشته باشد.