Chuyển đến nội dung chính

Mistral OCR: Hướng dẫn kèm ví dụ thực tiễn

Tìm hiểu cách sử dụng OCR API của Mistral với Python để trích xuất văn bản và hình ảnh từ tài liệu, cũng như tích hợp khả năng OCR vào ứng dụng.
· 12 phút đọc

Khám phá cùng AI

Tuần trước, Mistral ra mắt Mistral OCR, một API nhận dạng ký tự quang học (OCR) đầy đổi mới. API này đặt ra tiêu chuẩn mới cho khả năng của AI trong việc hiểu tài liệu và hình ảnh. Nó có thể xử lý và phân tách tài liệu có chứa hình ảnh, công thức toán, bảng biểu và nhiều thành phần khác với độ chính xác cao.

Trong bài viết này, tôi sẽ hướng dẫn từng bước cách sử dụng Mistral OCR bằng Python. Tôi sẽ chỉ bạn cách dùng với tài liệu, hình ảnh và cách kết hợp với chat để trộn prompt với tài liệu.

Mistral OCR là gì?

Nhận dạng ký tự quang học (OCR) là công nghệ chuyển đổi nhiều loại tài liệu—như tài liệu giấy đã quét, tệp PDF, hoặc hình ảnh chụp bằng máy ảnh kỹ thuật số—thành dữ liệu có thể chỉnh sửa và tìm kiếm được.

OCR hoạt động bằng cách nhận diện các ký tự văn bản trong hình ảnh, phân tích mẫu của chúng, rồi chuyển các yếu tố trực quan đó thành văn bản mã hóa cho máy. Công nghệ này đã thay đổi cách chúng ta tương tác với tài liệu in, từ số hóa lưu trữ lịch sử đến tự động nhập dữ liệu từ các biểu mẫu kinh doanh.

OCR API của Mistral là một bước tiến lớn trong lĩnh vực này, mang đến cho nhà phát triển công cụ mạnh mẽ để trích xuất văn bản từ hình ảnh và tài liệu với độ chính xác ấn tượng.

Ví dụ Mistral OCR

Nguồn: Mistral

Khác với các giải pháp OCR truyền thống chỉ dừng ở việc nhận diện văn bản, API của Mistral dùng các mô hình AI tiên tiến để hiểu ngữ cảnh và cấu trúc tài liệu, đồng thời giữ nguyên định dạng khi trích xuất nội dung. Nghĩa là nó có thể nhận biết bố cục phức tạp, phân biệt tiêu đề với phần nội dung và diễn giải đúng các bảng biểu hay định dạng nhiều cột.

Điểm đặc biệt của OCR API từ Mistral là được tích hợp với khả năng hiểu ngôn ngữ của Mistral. Hệ thống không chỉ trích xuất văn bản—mà còn hiểu được nội dung đó.

Điều này cho phép các quy trình xử lý tài liệu tinh vi hơn, nơi API không chỉ nhận diện văn bản mà còn có thể trả lời câu hỏi về nội dung tài liệu, tóm tắt thông tin, hoặc trích xuất các dữ liệu cụ thể.

Ngoài ra, OCR API của Mistral được thiết kế để hoạt động trên nhiều ngôn ngữ và bộ ký tự khác nhau, giúp linh hoạt cho các ứng dụng toàn cầu. Sự kết hợp giữa khả năng nhận diện văn bản chính xác và hiểu ngôn ngữ sâu này đưa giải pháp của Mistral trở thành một hệ thống trí tuệ tài liệu thế hệ mới, chứ không chỉ là công cụ OCR đơn thuần.

Giá và giới hạn của Mistral OCR

Mistral OCR API không miễn phí, nhưng chỉ tốn 1 USD cho mỗi 1.000 trang (tức 0,001 USD mỗi trang). Theo tôi, mức giá này rất cạnh tranh và phải chăng.

Tệp tài liệu không được vượt quá 50 MB và không dài quá 1.000 trang.

Bạn có thể xem thêm thông tin tại trang giá của họ.

Thiết lập Mistral OCR API

Đi tới trang khóa API của Mistral và nhấp nút "Create new key".

Trong biểu mẫu tạo khóa, bạn có thể đặt tên và ngày hết hạn.

  • Tên hữu ích cho mục đích tổ chức nếu bạn có nhiều dự án, mỗi dự án dùng một khóa khác nhau. Với hướng dẫn này, bạn có thể để trống.
  • Ngày hết hạn giúp đảm bảo rằng nếu vô tình chia sẻ, người khác sẽ không thể dùng khóa của bạn mãi mãi.

Biểu mẫu khóa API mistral

Sau khi tạo khóa, hãy sao chép và tạo một tệp tên là .env trong cùng thư mục nơi bạn sẽ viết script. 

Tạo khóa API để dùng mistral OCR

Dán khóa vào tệp theo định dạng sau:

MISTRAL_API_KEY=<paste_api_key_here>

Nếu bạn dùng GitHub, hãy thêm tệp này vào .gitignore để tránh tải khóa API lên GitHub.

Thiết lập môi trường Python

Để dùng OCR API của Mistral với Python, hãy cài các gói sau:

  • mistralai: Gói do Mistral cung cấp để tương tác với API của họ.
  • python-dotenv: Gói giúp dễ dàng tải khóa API từ tệp .env.
  • datauri: Gói dùng để xử lý dữ liệu hình ảnh và lưu chúng vào tệp.

Chúng ta có thể cài đặt bằng lệnh:

pip install mistralai python-dotenv datauri

Tôi khuyến nghị tạo môi trường riêng để đảm bảo cài đặt của bạn không xung đột với cài đặt Python mặc định. Một cách là dùng Anaconda:

conda create -n mistral -y python=3.9
conda activate mistral
pip install mistralai python-dotenv datauri

Lệnh đầu tạo một môi trường tên mistral dùng Python 3.9. Sau đó, chúng ta kích hoạt môi trường và cài các gói nêu trên.

Tạo script Python để tương tác với Mistral OCR

Hãy xem cách gửi yêu cầu đầu tiên tới OCR API của Mistral.

Import các phụ thuộc cần thiết

Trong cùng thư mục với tệp .env, tạo một script Python mới tên ocr.py và import các gói cần thiết:

from mistralai import Mistral
from dotenv import load_dotenv
import datauri
import os

Lưu ý chúng ta cũng import os để tải khóa API từ môi trường vào biến. Không cần cài đặt vì đây là gói tích hợp sẵn.

Tải khóa API và khởi tạo client Mistral

Tiếp theo, thêm các dòng sau để tải khóa API và khởi tạo client Mistral:

load_dotenv()
api_key = os.environ["MISTRAL_API_KEY"]
client = Mistral(api_key=api_key)

Gửi yêu cầu tới Mistral OCR API

Cách đơn giản nhất để dùng OCR API là truyền URL của một tệp PDF được lưu trữ trực tuyến. Trong ví dụ này, hãy dùng bài báo Mistral 7B này được lưu trên arXiv (nền tảng lưu trữ phiên bản trước khi xuất bản của các bài nghiên cứu):

ocr_response = client.ocr.process(
  model="mistral-ocr-latest",
  document={
    "type": "document_url",
    "document_url": "https://arxiv.org/pdf/2501.00663",
  },
)
print(ocr_response)

Sau đó chạy script bằng lệnh python ocr.py. Lệnh này sẽ tạo ra phản hồi như sau:

pages=[OCRPageObject(index=0, markdown='# Mistral 7B \n\nAlbert Q. Jiang,
...

Cấu trúc phản hồi

Phản hồi chứa nhiều trường. Chi tiết đầy đủ có trong tài liệu API của Mistral. Chúng ta đặc biệt quan tâm tới trường pages, trong đó chứa, với mỗi trang, phần văn bản markdown của trang.

Chúng ta có thể in số trang để kiểm tra khớp với tệp PDF:

print(len(ocr_response.pages))

Kết quả:

9

Mỗi trang có một số trường. Quan trọng nhất là:

  • markdown: Nội dung markdown của trang.
  • images: Các hình ảnh trên trang.

Ví dụ, ta có thể in nội dung markdown của trang đầu tiên bằng:

print(ocr_response.pages[0].markdown)
# Mistral 7B 

Albert Q. Jiang, Alexandre Sablayrolles, Arthur Mensch, Chris Bamford, Devendra Singh Chaplot, Diego de las Casas, Florian Bressand, Gianna Lengyel, Guillaume Lample, Lucile Saulnier, Lélio Renard Lavaud, Marie-Anne Lachaux, Pierre Stock, Teven Le Scao, Thibaut Lavril, Thomas Wang, Timothée Lacroix, William El Sayed

![img-0.jpeg](img-0.jpeg)

#### Abstract

We introduce Mistral 7B, a 7-billion-parameter language
...

Chuyển đổi tệp PDF sang Markdown

Để chuyển một PDF thành Markdown, chúng ta lặp qua tất cả trang và ghi nội dung Markdown của mỗi trang vào tệp. Dưới đây là một hàm để làm điều đó.

def create_markdown_file(ocr_response, output_filename = "output.md"):
  with open(output_filename, "wt") as f:
    for page in ocr_response.pages:
      f.write(page.markdown)

Dưới đây là so sánh song song giữa tệp PDF gốc và tệp Markdown chúng ta tạo ra:

Chuyển PDF sang markdown bằng Mistral OCR

Xử lý hình ảnh

Trong ví dụ trước, chúng ta thấy tệp Markdown không có các hình ảnh từ PDF. Lý do là chúng ta chỉ tạo tệp văn bản Markdown, chưa tạo tệp hình ảnh.

Nếu xem đầu ra markdown, ta thấy có tham chiếu hình ảnh:

...
![img-0.jpeg](img-0.jpeg)
...

Tuy nhiên, hình ảnh đó không hiển thị. Các hình ảnh trên mỗi trang được lưu trong thuộc tính images.

for page in ocr_response.pages:
  print(page.images)

Đầu ra:

[OCRImageObject(id='img-0.jpeg', top_left_x=425, top_left_y=600, bottom_right_x=1283, bottom_right_y=893, image_base64=None)]
[OCRImageObject(id='img-1.jpeg', top_left_x=294, top_left_y=638, bottom_right_x=1405, bottom_right_y=1064, image_base64=None)]
[OCRImageObject(id='img-2.jpeg', top_left_x=294, top_left_y=191, bottom_right_x=1405, bottom_right_y=380, image_base64=None)]
[OCRImageObject(id='img-3.jpeg', top_left_x=292, top_left_y=204, bottom_right_x=1390, bottom_right_y=552, image_base64=None)]
[OCRImageObject(id='img-4.jpeg', top_left_x=464, top_left_y=202, bottom_right_x=1232, bottom_right_y=734, image_base64=None)]
[]
[OCRImageObject(id='img-5.jpeg', top_left_x=727, top_left_y=794, bottom_right_x=975, bottom_right_y=1047, image_base64=None)]
[]
[]

Trong đầu ra trên, chúng ta thấy đúng là có tham chiếu đến img-0.jpeg. Tuy nhiên dữ liệu không có: image_base64=None.

Để lấy dữ liệu hình ảnh, chúng ta cần chỉnh yêu cầu OCR để bao gồm dữ liệu hình ảnh bằng cách thêm tham số include_image_base64=True.

ocr_response = client.ocr.process(
  model="mistral-ocr-latest",
  document={
    "type": "document_url",
    "document_url": "https://arxiv.org/pdf/2310.06825",
  },
  include_image_base64=True,
)

Nếu in lại danh sách hình ảnh, bạn sẽ thấy các trường image_base_64 đã có dữ liệu. Đúng như tên gọi, dữ liệu hình ảnh được lưu ở dạng base64. Chúng ta sẽ không đi sâu vào chi tiết biểu diễn ảnh base64. Thay vào đó, dưới đây là một hàm dùng gói datauri đã cài trước đó để ghi hình ảnh ra tệp:

def save_image(image):
    parsed = datauri.parse(image.image_base64)
    with open(image.id, "wb") as file:
      file.write(parsed.data)

Giờ chúng ta có thể cập nhật hàm create_markdown_file() để đồng thời ghi tất cả hình ảnh ra tệp:

def create_markdown_file(ocr_response, output_filename = "output.md"):
  with open(output_filename, "wt") as f:
    for page in ocr_response.pages:
      f.write(page.markdown)
      for image in page.images:
        save_image(image)

Nếu chạy lại mã đã cập nhật và xem trước Markdown, chúng ta sẽ thấy các hình ảnh.

Xử lý hình ảnh trong tài liệu

Sử dụng tệp cục bộ

Trong ví dụ trên, chúng ta dùng một tệp đã được lưu sẵn trực tuyến. Để làm việc với tệp PDF trên máy, API của Mistral cho phép tải tệp lên bằng hàm client.files.upload(). Giả sử tệp PDF myfile.pdf nằm cùng thư mục với script, cách làm như sau:

filename = "myfile.pdf"
uploaded_pdf = client.files.upload(
  file={
    "file_name": filename,
    "content": open(filename, "rb"),
  },
  purpose="ocr"
)

Mỗi tệp tải lên theo cách này sẽ có một ID duy nhất, cần dùng để tham chiếu tới tệp đó. Chúng ta có thể truy cập bằng thuộc tính id của kết quả như sau:

print(uploaded_pdf.id)

Để thực hiện OCR trên tệp đó, chúng ta cần cung cấp URL của nó. Có thể lấy URL bằng hàm client.files.get_signed_url() với ID của tệp:

signed_url = client.files.get_signed_url(file_id=uploaded_pdf.id)

Kết hợp lại, ta có thể viết một hàm tải tệp PDF bằng API của Mistral và lấy URL của tệp:

def upload_pdf(filename):
  uploaded_pdf = client.files.upload(
    file={
      "file_name": filename,
      "content": open(filename, "rb"),
    },
    purpose="ocr"
  )
  signed_url = client.files.get_signed_url(file_id=uploaded_pdf.id)
  return signed_url.url

Ví dụ yêu cầu OCR với tệp cục bộ:

ocr_response = client.ocr.process(
  model="mistral-ocr-latest",
  document={
    "type": "document_url",
    "document_url": upload_pdf("myfile.pdf"),
  },
  include_image_base64=True,
)

Để dùng tệp khác, chỉ cần thay myfile.pdf bằng tên tệp bạn muốn dùng.

OCR trên hình ảnh

OCR API cũng hoạt động với đầu vào là hình ảnh. Để dùng hình ảnh, ta dùng kiểu image_url thay vì document_url:

ocr_response = client.ocr.process(
  model="mistral-ocr-latest",
  document={
    "type": "image_url",
    "image_url": <url of the image>,
  },
)

Trong ví dụ trên, bạn cần thay <url of the image> bằng URL của hình ảnh. 

Để dùng hình ảnh cục bộ, chúng ta có thể dùng hàm sau để tải ảnh:

def load_image(image_path):
  import base64
  mime_type, _ = mimetypes.guess_type(image_path)
  with open(image_path, "rb") as image_file:
    image_data = image_file.read()
  base64_encoded = base64.b64encode(image_data).decode('utf-8')
  base64_url = f"data:{mime_type};base64,{base64_encoded}"
  return base64_url

Hàm này dùng gói base64, là gói tích hợp sẵn nên không cần cài đặt.

Hãy thử OCR trên hóa đơn này mà chúng ta lưu với tên receipt.jpeg:

Ví dụ hóa đơn cho OCR

Chúng ta có thể gửi yêu cầu OCR bằng cách dùng hàm load_image() để tải ảnh từ máy tính:

ocr_response = client.ocr.process(
  model="mistral-ocr-latest",
  document={
    "type": "image_url",
    "image_url": load_image("receipt.jpeg"),
  },
)

Kết quả như sau:

Dùng Mistral OCR với hình ảnh

Kết quả chưa hoàn hảo, nhưng cũng khá sát với bản gốc.

Kết hợp Mistral OCR với Chat

OCR mang lại cách hiệu quả để chuyển dữ liệu sang định dạng văn bản sẵn sàng cho LLM sử dụng. Mistral API cho phép người dùng kết hợp tài liệu và prompt trong yêu cầu LLM. Ở hậu trường, OCR API được dùng để xử lý tài liệu cho LLM.

Hãy thử dùng cách này để tóm tắt bài báo mà chúng ta đã tham chiếu xuyên suốt hướng dẫn.

Nếu đây là lần đầu bạn dùng chat API của Mistral, bạn có thể đọc hướng dẫn Mistral toàn diện này vì chúng ta sẽ không đi sâu vào cơ chế hoạt động.

Dưới đây là ví dụ Python đầy đủ để yêu cầu giải thích bài báo theo cách dễ hiểu:

from mistralai import Mistral
import os
from dotenv import load_dotenv
load_dotenv()
api_key = os.environ["MISTRAL_API_KEY"]
client = Mistral(api_key=api_key)
messages = [
  {
    "role": "user",
    "content": [
      {
        "type": "text",
        "text": "Explain this article in detail to someone who doesn't have a technical background",
      },
      {
        "type": "document_url",
        "document_url": "https://arxiv.org/pdf/2310.06825",
      },
    ],
  }
]
chat_response = client.chat.complete(
  model="mistral-small-latest",
  messages=messages,
)
print(chat_response.choices[0].message.content)

Lưu ý tệp được cung cấp theo đúng định dạng đã học ở trên:

{
  "type": "document_url",
  "document_url": "https://arxiv.org/pdf/2310.06825",
}

Ứng dụng thực tiễn cho Mistral OCR

Giờ bạn đã biết cách triển khai Mistral OCR trong các dự án Python, hãy khám phá một số trường hợp ứng dụng thực tế để áp dụng những gì chúng ta đã học.

Phân tích bài báo nghiên cứu

Bạn có thể trích xuất văn bản, phương trình, bảng biểu và hình minh họa từ các bài báo khoa học để xây dựng một trợ lý nghiên cứu cá nhân hóa. Bạn có thể tạo hệ thống tóm tắt phát hiện chính, trích xuất phương pháp, hoặc xây dựng cơ sở dữ liệu bài báo có thể tìm kiếm trong lĩnh vực của bạn.

Dự án số hóa tài liệu

Bạn có thể chuyển đổi lưu trữ vật lý hoặc tài liệu quét thành bộ sưu tập số có thể tìm kiếm. Điều này đặc biệt hữu ích với tài liệu lịch sử, hồ sơ gia đình, hoặc lưu trữ của tổ chức cần bảo tồn và truy cập dễ dàng.

Xử lý tài liệu đa ngôn ngữ

Bạn có thể dùng khả năng đa ngôn ngữ của Mistral OCR để xử lý tài liệu ở nhiều ngôn ngữ. Điều này hữu ích cho doanh nghiệp quốc tế, dịch thuật, hoặc dự án nghiên cứu toàn cầu cần trích xuất thông tin từ tài liệu ở các hệ chữ khác nhau.

Quản lý nội dung giáo dục

Bạn có thể chuyển sách giáo khoa, slide bài giảng và ghi chú viết tay sang định dạng số. Tạo hệ thống trích xuất khái niệm chính, công thức và sơ đồ để xây dựng tài liệu học tập cá nhân hóa hoặc ngân hàng câu hỏi.

Xử lý tài liệu tài chính

Bạn có thể tự động trích xuất dữ liệu từ hóa đơn, biên lai, báo cáo tài chính hoặc chứng từ thuế. Điều này giúp tinh gọn quy trình kế toán hoặc hỗ trợ quản lý chi tiêu và phân tích tài chính.

Kết luận

OCR API của Mistral cung cấp công cụ mạnh mẽ để trích xuất và hiểu văn bản từ tài liệu và hình ảnh. Trong hướng dẫn này, chúng ta đã tìm hiểu cách thiết lập và sử dụng khả năng này cho nhiều tác vụ xử lý tài liệu khác nhau.

Bằng cách làm theo các bước trong bài, bạn có thể tích hợp OCR của Mistral vào ứng dụng của mình, dù là số hóa lưu trữ, tự động nhập dữ liệu hay xây dựng hệ thống quản lý tài liệu thông minh. Khi công nghệ tiếp tục phát triển, chúng ta có thể kỳ vọng khả năng xử lý tài liệu ngày càng chính xác và hiểu ngữ cảnh tốt hơn, thu hẹp khoảng cách giữa tài liệu vật lý và quy trình làm việc số.

François Aubry

Tác giả

François Aubry

Kỹ sư full-stack & nhà sáng lập tại CheapGPT. Giảng dạy luôn là niềm đam mê của tôi. Từ những ngày còn là sinh viên, tôi đã háo hức tìm kiếm cơ hội kèm cặp và hỗ trợ các bạn học khác. Niềm đam mê đó đã thôi thúc tôi theo học tiến sĩ, nơi tôi cũng đảm nhiệm vai trò trợ giảng để hỗ trợ con đường học thuật của mình. Trong những năm ấy, tôi tìm thấy sự mãn nguyện lớn lao trong môi trường lớp học truyền thống, xây dựng kết nối và thúc đẩy việc học tập. Tuy nhiên, với sự ra đời của các nền tảng học trực tuyến, tôi nhận ra tiềm năng thay đổi của giáo dục số. Thực tế, tôi đã trực tiếp tham gia phát triển một nền tảng như vậy tại trường đại học của chúng tôi. Tôi tận tâm kết hợp các nguyên tắc giảng dạy truyền thống với những phương pháp số đổi mới. Đam mê của tôi là tạo ra các khóa học không chỉ hấp dẫn và giàu thông tin mà còn dễ tiếp cận với người học trong thời đại số này.

Chủ đề

Liên quan