این راهنما نحوه استفاده از مدل قدرتمند mistral-ocr-latest برای تشخیص نوری کاراکتر (OCR) و درک اسناد را نشان می‌دهد. شما خواهید آموخت که چگونه متن و محتوای ساختاریافته را از اسناد PDF و تصاویر استخراج کنید در حالی که قالب‌بندی، ساختار و سلسله مراتب را حفظ می‌کنید. این مقاله برداشتی از صفحه مستندات پلتفرم هوش مصنوعی AvalAI است.

مقدمه

Mistral OCR یک مدل OCR پیشرفته است که به شما امکان می‌دهد اسناد را در مقیاس بالا با دقت زیاد پردازش کنید. این مثال هم قابلیت‌های پایه OCR و هم قابلیت‌های پیشرفته درک اسناد را پوشش می‌دهد.

ویژگی‌های کلیدی OCR

  • استخراج محتوای متنی با حفظ ساختار و سلسله مراتب سند
  • حفظ قالب‌بندی مانند سرفصل‌ها، پاراگراف‌ها، لیست‌ها و جداول
  • ارائه نتایج در قالب مارک‌داون برای تجزیه و تحلیل و رندر آسان
  • پشتیبانی از طرح‌بندی‌های پیچیده شامل متن چند ستونی و محتوای ترکیبی
  • پردازش اسناد در مقیاس بالا با دقت زیاد (تا 2000 صفحه در دقیقه)
  • به صورت ذاتی چندزبانه، قادر به تجزیه و تحلیل هزاران نوع خط، فونت و زبان
  • عملکرد برتر نسبت به سایر مدل‌های پیشرو OCR در آزمون‌های معیار

موارد استفاده

  • تحقیقات علمی: تبدیل مقالات علمی با فرمول‌ها و نمودارهای پیچیده به فرمت‌های آماده هوش مصنوعی
  • عملیات تجاری: پردازش رسیدها، فاکتورها و فرم‌ها برای استخراج داده
  • حفظ میراث تاریخی: دیجیتال‌سازی اسناد و آثار تاریخی برای دسترسی گسترده‌تر
  • خدمات مشتری: تبدیل مستندات و راهنماها به پایگاه‌های دانش نمایه‌شده
  • آموزش: تبدیل یادداشت‌های سخنرانی و ارائه‌ها به محتوای قابل جستجو
  • حقوقی: پردازش پرونده‌های نظارتی و اسناد حقوقی

OCR پایه با اسناد PDF

استفاده از URL فایل PDF

می‌توانید یک سند PDF را با ارائه URL آن پردازش کنید:

راهنمای جامع برای توسعه‌دهندگان: این نمونه کدها تنها مقدمه‌ای بر قابلیت‌های API AvalAI در پردازش اسناد PDF هستند. برای مشاهده نمونه کدهای تکمیلی در زبان‌های برنامه‌نویسی دیگر نظیر Go، PHP و .NET، آشنایی با پارامترهای پیشرفته API، و بررسی تمام امکانات اتوماسیون پردازش اسناد با هوش مصنوعی، به مستندات رسمی و جامع ما در docs.avalai.ir مراجعه فرمایید.

مثال پایتون (Python)

from mistralai.client import Mistral

client = Mistral(server_url="https://api.avalai.ir", api_key="avalai-api-key")

document_param = {
    "type": "document_url",
    "document_url": "https://arxiv.org/pdf/1805.04770",
}

ocr_response = client.ocr.process(
    model="mistral-ocr-latest",
    document=document_param,
    pages=list(range(0, 100)),  # پردازش تا 100 صفحه
    retries=3,
)

print(ocr_response)

مثال جاوااسکریپت (Javascript)

import { Mistral } from "mistralai";

const client = new Mistral({
  apiKey: "avalai-api-key",
  baseURL: "https://api.avalai.ir",
});

const documentParam = {
  type: "document_url",
  document_url: "https://arxiv.org/pdf/1805.04770",
};

const ocrResponse = await client.ocr.process({
  model: "mistral-ocr-latest",
  document: documentParam,
  pages: Array.from({ length: 100 }, (_, i) => i), // پردازش تا 100 صفحه
  retries: 1,
});

console.log(ocrResponse);

استفاده از PDF کدگذاری شده با Base64

مثال پایتون (Python)

import base64
from mistralai.client import Mistral

# خواندن و کدگذاری فایل PDF
with open("document.pdf", "rb") as f:
    pdf_data = f.read()

base64_pdf = base64.b64encode(pdf_data).decode("utf-8")
document_url = f"data:application/pdf;base64,{base64_pdf}"

# پردازش PDF کدگذاری شده
client = Mistral(server_url="https://api.avalai.ir", api_key="avalai-api-key")

document_param = {"type": "document_url", "document_url": document_url}

ocr_response = client.ocr.process(
    model="mistral-ocr-latest",
    document=document_param,
    pages=list(range(0, 100)),  # پردازش تا 100 صفحه
    retries=3,
)

print(ocr_response)

مثال جاوااسکریپت (Javascript)

import fs from "fs";
import { Mistral } from "mistralai";

// خواندن و کدگذاری فایل PDF
const pdfData = fs.readFileSync("document.pdf");
const base64Pdf = pdfData.toString("base64");
const documentUrl = `data:application/pdf;base64,${base64Pdf}`;

// پردازش PDF کدگذاری شده
const client = new Mistral({
  apiKey: "avalai-api-key",
  baseURL: "https://api.avalai.ir",
});

const documentParam = {
  type: "document_url",
  document_url: documentUrl,
};

const ocrResponse = await client.ocr.process({
  model: "mistral-ocr-latest",
  document: documentParam,
  pages: Array.from({ length: 100 }, (_, i) => i),
  retries: 1,
});

console.log(ocrResponse);

پردازش صفحات خاص

می‌توانید با استفاده از پارامتر pages مشخص کنید که کدام صفحات پردازش شوند:

مثال پایتون (Python)

from mistralai.client import Mistral

client = Mistral(server_url="https://api.avalai.ir", api_key="avalai-api-key")

document_param = {
    "type": "document_url",
    "document_url": "https://arxiv.org/pdf/1805.04770",
}

# فقط صفحات 0، 1 و 5 را پردازش کنید
ocr_response = client.ocr.process(
    model="mistral-ocr-latest",
    document=document_param,
    pages=[0, 1, 5],  # فقط صفحات خاص را پردازش کنید
    retries=3,
)

print(ocr_response)

مثال جاوااسکریپت (Javascript)

import { Mistral } from "mistralai";

const client = new Mistral({
  apiKey: "avalai-api-key",
  baseURL: "https://api.avalai.ir",
});

const documentParam = {
  type: "document_url",
  document_url: "https://arxiv.org/pdf/1805.04770",
};

// فقط صفحات 0، 1 و 5 را پردازش کنید
const ocrResponse = await client.ocr.process({
  model: "mistral-ocr-latest",
  document: documentParam,
  pages: [0, 1, 5], // فقط صفحات خاص را پردازش کنید
  retries: 1,
});

console.log(ocrResponse);

نمونه خروجی

API OCR هم محتوای متن استخراج شده در قالب مارک‌داون و هم متادیتا در مورد ساختار سند را برمی‌گرداند:

{
  "pages": [
    {
      "index": 1,
      "markdown": "# LEVERAGING UNLABELED DATA TO PREDICT OUT-OF-DISTRIBUTION PERFORMANCE \n\nSaurabh Garg*<br>Carnegie Mellon University<br>[email protected]<br>Sivaraman Balakrishnan<br>Carnegie Mellon University<br>[email protected]<br>Zachary C. Lipton<br>Carnegie Mellon University<br>[email protected]\n\n## Behnam Neyshabur\n\nGoogle Research, Blueshift team\[email protected]\n\nHanie Sedghi<br>Google Research, Brain team<br>[email protected]\n\n\n#### Abstract\n\nReal-world machine learning deployments are characterized by mismatches between the source (training) and target (test) distributions that may cause performance drops...",
      "images": [],
      "dimensions": {
        "dpi": 200,
        "height": 2200,
        "width": 1700
      }
    }
    // صفحات اضافی...

  ],
  "model": "mistral-ocr-latest",
  "usage_info": {
    "pages_processed": 3,
    "doc_size_bytes": null
  }
}

OCR با تصاویر

استفاده از URL تصویر

می‌توانید تصاویر را با ارائه URL مستقیم پردازش کنید:

مثال پایتون (Python)

from mistralai.client import Mistral

client = Mistral(server_url="https://api.avalai.ir", api_key="avalai-api-key")

# پردازش تصویر از URL
document_param = {
    "type": "image_url",
    "image_url": "https://raw.githubusercontent.com/mistralai/cookbook/refs/heads/main/mistral/ocr/receipt.png",
}

ocr_response = client.ocr.process(
    model="mistral-ocr-latest",
    document=document_param,
    retries=3,
)

print(ocr_response)

مثال جاوااسکریپت (Javascript)

import { Mistral } from "mistralai";

const client = new Mistral({
  apiKey: "avalai-api-key",
  baseURL: "https://api.avalai.ir",
});

// پردازش تصویر از URL
const documentParam = {
  type: "image_url",
  image_url:
    "https://raw.githubusercontent.com/mistralai/cookbook/refs/heads/main/mistral/ocr/receipt.png",
};

const ocrResponse = await client.ocr.process({
  model: "mistral-ocr-latest",
  document: documentParam,
  retries: 1,
});

console.log(ocrResponse);

استفاده از تصاویر کدگذاری شده با Base64

همچنین می‌توانید تصاویر را با استفاده از کدگذاری base64 پردازش کنید:

مثال پایتون (Python)

import base64
from mistralai.client import Mistral

# خواندن و کدگذاری فایل تصویر
with open("receipt.jpg", "rb") as f:
    image_data = f.read()

base64_image = base64.b64encode(image_data).decode("utf-8")
image_url = f"data:image/jpeg;base64,{base64_image}"

# پردازش تصویر کدگذاری شده
client = Mistral(server_url="https://api.avalai.ir", api_key="avalai-api-key")

document_param = {"type": "image_url", "image_url": image_url}

ocr_response = client.ocr.process(
    model="mistral-ocr-latest",
    document=document_param,
    retries=3,
)

print(ocr_response)

جاوااسکریپت (Javascript)

import fs from "fs";
import { Mistral } from "mistralai";

// خواندن و کدگذاری فایل تصویر
const imageData = fs.readFileSync("receipt.jpg");
const base64Image = imageData.toString("base64");
const imageUrl = `data:image/jpeg;base64,${base64Image}`;

// پردازش تصویر کدگذاری شده
const client = new Mistral({
  apiKey: "avalai-api-key",
  baseURL: "https://api.avalai.ir",
});

const documentParam = {
  type: "image_url",
  image_url: imageUrl,
};

const ocrResponse = await client.ocr.process({
  model: "mistral-ocr-latest",
  document: documentParam,
  retries: 1,
});

console.log(ocrResponse);

مثال: پردازش یک رسید

در اینجا یک مثال خاص از پردازش تصویر یک رسید و استخراج اطلاعات ساختاریافته آورده شده است:

مثال پایتون (Python)

from mistralai.client import Mistral

client = Mistral(server_url="https://api.avalai.ir", api_key="avalai-api-key")

# پردازش تصویر رسید از URL
document_param = {
    "type": "image_url",
    "image_url": "https://raw.githubusercontent.com/mistralai/cookbook/refs/heads/main/mistral/ocr/receipt.png",
}

ocr_response = client.ocr.process(
    model="mistral-ocr-latest",
    document=document_param,
    retries=3,
)

# پاسخ OCR حاوی متن استخراج شده در قالب مارک‌داون است
receipt_text = ocr_response.pages[0].markdown
print(receipt_text)

# نمونه خروجی:
# RECEIPT
# THANK YOU FOR SHOPPING AT
# WHOLE FOODS MARKET
# STORE 10113 (415) 618-0066
# 450 RHODE ISLAND ST
# SAN FRANCISCO, CA 94107
# ...

درک سند

می‌توانید Mistral OCR را با مدل‌های زبانی ترکیب کنید تا امکان تعامل زبان طبیعی با محتوای سند را فراهم کنید. این به شما امکان می‌دهد با پرسیدن سؤالات به زبان طبیعی، اطلاعات و بینش‌ها را از اسناد استخراج کنید.

پاسخگویی به سؤالات با مقالات علمی

مثال پایتون (Python)

from mistralai.client import Mistral
from mistralai.models.chat_completion import ChatMessage

client = Mistral(server_url="https://api.avalai.ir", api_key="avalai-api-key")

# ایجاد یک پیام با هر دو متن و سند
message_content = [
    {"type": "text", "text": "سؤال اصلی تحقیق مطرح شده در این مقاله چیست؟"},
    {"type": "document_url", "document_url": "https://arxiv.org/pdf/1805.04770"},
]

messages = [ChatMessage(role="user", content=message_content)]

# ارسال درخواست
response = client.chat(
    model="mistral-small-latest",
    messages=messages,
    document_image_limit=8,
    document_page_limit=64,
)

print(response.choices[0].message.content)

مثال جاوااسکریپت (Javascript)

import { Mistral } from "mistralai";

const client = new Mistral({
  apiKey: "avalai-api-key",
  baseURL: "https://api.avalai.ir",
});

// ایجاد یک پیام با هر دو متن و سند
const messages = [
  {
    role: "user",
    content: [
      { type: "text", text: "سؤال اصلی تحقیق مطرح شده در این مقاله چیست؟" },
      {
        type: "document_url",
        document_url: "https://arxiv.org/pdf/1805.04770",
      },
    ],
  },
];

// ارسال درخواست
const response = await client.chat({
  model: "mistral-small-latest",
  messages: messages,
  document_image_limit: 8,
  document_page_limit: 64,
});

console.log(response.choices[0].message.content);

استخراج اطلاعات از رسیدها

همچنین می‌توانید از درک سند برای استخراج اطلاعات خاص از رسیدها استفاده کنید:

مثال پایتون (Python)

from mistralai.client import Mistral
from mistralai.models.chat_completion import ChatMessage

client = Mistral(server_url="https://api.avalai.ir", api_key="avalai-api-key")

# ایجاد یک پیام با هر دو متن و تصویر
message_content = [
    {
        "type": "text",
        "text": "اطلاعات زیر را از این رسید استخراج کنید: نام فروشگاه، تاریخ، مبلغ کل و لیست اقلام خریداری شده با قیمت‌ها.",
    },
    {
        "type": "image_url",
        "image_url": "https://raw.githubusercontent.com/mistralai/cookbook/refs/heads/main/mistral/ocr/receipt.png",
    },
]

messages = [ChatMessage(role="user", content=message_content)]

# ارسال درخواست
response = client.chat(
    model="mistral-small-latest", messages=messages, document_image_limit=8
)

print(response.choices[0].message.content)

مثال جاوااسکریپت (Javascript)

import { Mistral } from "mistralai";

const client = new Mistral({
  apiKey: "avalai-api-key",
  baseURL: "https://api.avalai.ir",
});

// ایجاد یک پیام با هر دو متن و تصویر
const messages = [
  {
    role: "user",
    content: [
      {
        type: "text",
        text: "اطلاعات زیر را از این رسید استخراج کنید: نام فروشگاه، تاریخ، مبلغ کل و لیست اقلام خریداری شده با قیمت‌ها.",
      },
      {
        type: "image_url",
        image_url:
          "https://raw.githubusercontent.com/mistralai/cookbook/refs/heads/main/mistral/ocr/receipt.png",
      },
    ],
  },
];

// ارسال درخواست
const response = await client.chat({
  model: "mistral-small-latest",
  messages: messages,
  document_image_limit: 8,
});

console.log(response.choices[0].message.content);

خروجی ساختاریافته

می‌توانید با استفاده از مدل‌های زبانی، خروجی ساختاریافته از نتایج OCR درخواست کنید:

مثال پایتون (Python)

from mistralai.client import Mistral
from mistralai.models.chat_completion import ChatMessage
import json

client = Mistral(server_url="https://api.avalai.ir", api_key="avalai-api-key")

# پردازش تصویر رسید
document_param = {
    "type": "image_url",
    "image_url": "https://raw.githubusercontent.com/mistralai/cookbook/refs/heads/main/mistral/ocr/receipt.png",
}

ocr_response = client.ocr.process(
    model="mistral-ocr-latest",
    document=document_param,
    retries=3,
)

# استخراج متن OCR
receipt_text = ocr_response.pages[0].markdown

# درخواست خروجی JSON ساختاریافته
message_content = [
    {
        "type": "text",
        "text": f"""
اینجا یک متن رسید استخراج شده با استفاده از OCR است:

{receipt_text}

اطلاعات زیر را در قالب JSON استخراج کنید:
- store_name: نام فروشگاه
- date: تاریخ خرید
- items: آرایه‌ای از اقلام خریداری شده، هر کدام با "name" و "price"
- subtotal: مبلغ جمع جزئی
- tax: مبلغ مالیات
- total: مبلغ کل

فقط JSON معتبر را بدون هیچ متن دیگری برگردانید.
""",
    }
]

messages = [ChatMessage(role="user", content=message_content)]

# ارسال درخواست
response = client.chat(model="mistral-small-latest", messages=messages)

# تجزیه پاسخ JSON
structured_data = json.loads(response.choices[0].message.content)
print(json.dumps(structured_data, indent=2))

عیب‌یابی

مشکلات رایج و راه حل‌ها

مشکل: کیفیت پایین OCR

راه حل: اگر کیفیت OCR پایینی را تجربه می‌کنید، موارد زیر را امتحان کنید:

  • اطمینان حاصل کنید که تصویر سند وضوح کافی دارد (حداقل 200 DPI)
  • مطمئن شوید که سند به درستی جهت‌گیری شده است
  • اگر از یک سند اسکن شده استفاده می‌کنید، بررسی کنید که اسکن واضح باشد و کنتراست خوبی داشته باشد
  • برای تصاویر، فرمت‌های مختلف را امتحان کنید (PNG اغلب برای متن بهتر از JPEG عمل می‌کند)

مشکل: خطا در کدگذاری Base64

راه حل: هنگام استفاده از کدگذاری base64، اطمینان حاصل کنید:

  • نوع MIME صحیح مشخص شده است (data:application/pdf;base64, برای PDF‌ها، data:image/jpeg;base64, برای تصاویر JPEG)
  • در رشته base64 شکست خط وجود ندارد (در لینوکس از گزینه -w 0 با دستور base64 استفاده کنید)
  • اندازه فایل از محدودیت 50 مگابایت تجاوز نمی‌کند

مشکل: تایم‌اوت در اسناد بزرگ

راه حل: برای اسناد بزرگ:

  • به جای کل سند، صفحات خاصی را پردازش کنید
  • سند را به قطعات کوچکتر تقسیم کنید
  • پارامتر تایم‌اوت را در پیکربندی کلاینت خود افزایش دهید
  • برای اسناد بسیار بزرگ از پردازش دسته‌ای استفاده کنید

مدیریت خطا

همیشه مدیریت خطای مناسب را در کد خود پیاده‌سازی کنید:

مثال پایتون (Python)

from mistralai.client import Mistral
from mistralai.exceptions import MistralAPIError

client = Mistral(server_url="https://api.avalai.ir", api_key="avalai-api-key")

try:
    document_param = {
        "type": "document_url",
        "document_url": "https://example.com/document.pdf",
    }

    ocr_response = client.ocr.process(
        model="mistral-ocr-latest",
        document=document_param,
        retries=3,
    )

    print(ocr_response)

except MistralAPIError as e:
    if e.status_code == 413:
        print("خطا: سند بسیار بزرگ است (بیش از 50 مگابایت)")
    elif e.status_code == 415:
        print("خطا: فرمت فایل پشتیبانی نمی‌شود")
    elif e.status_code == 429:
        print("خطا: محدودیت نرخ تجاوز شده است، بعداً دوباره امتحان کنید")
    elif e.status_code >= 500:
        print("خطا: خطای سرور، بعداً دوباره امتحان کنید")
    else:
        print(f"خطای API: {e}")
except Exception as e:
    print(f"خطای غیرمنتظره: {e}")


بهترین شیوه‌ها

بهینه‌سازی برای دقت

  1. از اسناد با کیفیت بالا استفاده کنید: هر زمان که ممکن است، به جای اسناد اسکن شده از PDF‌های دیجیتال اصلی برای بهترین نتایج استفاده کنید.
  2. فرمت‌های مختلف را آزمایش کنید: برای اسناد اسکن شده، با فرمت‌ها و وضوح‌های تصویر مختلف آزمایش کنید تا تعادل بهینه بین اندازه فایل و کیفیت OCR را پیدا کنید.
  3. پیش‌پردازش تصاویر: برای اسناد دشوار، پیش‌پردازش تصاویر را برای بهبود کنتراست، حذف نویز یا اصلاح کجی قبل از پردازش OCR در نظر بگیرید.
  4. نتایج را اعتبارسنجی کنید: منطق اعتبارسنجی را برای بررسی نتایج OCR در برابر الگوهای مورد انتظار پیاده‌سازی کنید (به عنوان مثال، بررسی اینکه تاریخ‌های استخراج شده از فرمت معتبری پیروی می‌کنند).
  5. از درک سند به صورت تکراری استفاده کنید: برای استخراج اطلاعات پیچیده، یک رویکرد چند مرحله‌ای را در نظر بگیرید که در آن نتایج اولیه OCR برای تعیین سؤالات پیگیری تحلیل می‌شوند.

بهینه‌سازی عملکرد

  1. فقط صفحات مورد نیاز را پردازش کنید: هنگام کار با اسناد چند صفحه‌ای، با استفاده از پارامتر pages فقط صفحاتی را که نیاز دارید مشخص کنید.
  2. پردازش دسته‌ای: برای حجم زیادی از اسناد، پردازش دسته‌ای را با مدیریت خطا و منطق تلاش مجدد مناسب پیاده‌سازی کنید.
  3. ذخیره‌سازی در حافظه پنهان: برای جلوگیری از پردازش تکراری اسناد یکسان، ذخیره‌سازی در حافظه پنهان را برای نتایج OCR پیاده‌سازی کنید.
  4. پردازش موازی: برای اسناد مستقل، پردازش موازی را برای بهبود توان عملیاتی در نظر بگیرید.
  5. نظارت بر استفاده: برای ماندن در محدوده‌های نرخ و بهینه‌سازی هزینه‌ها، استفاده از API خود را پیگیری کنید.

 

برگرفته از صفحه مستندات پلتفرم هوش مصنوعی AvalAI