Transformers documentation
الاسترجاع البصري للمستندات
الاسترجاع البصري للمستندات
يمكن أن تحتوي المستندات على بيانات متعددة الوسائط إذا تضمنت رسومًا بيانية وجداول وعناصر بصرية إلى جانب النص. وتُعد استرجاع المعلومات من هذه المستندات تحديًا، لأن نماذج استرجاع النص وحدها لا تستطيع التعامل مع البيانات البصرية، بينما تفتقر نماذج استرجاع الصور إلى الدقة المطلوبة وقدرات معالجة المستندات.
يمكن أن يساعد الاسترجاع البصري للمستندات في استرجاع المعلومات من جميع أنواع المستندات، بما في ذلك توليد المعزز بالاسترجاع متعدد الوسائط (RAG). تقبل هذه النماذج المستندات (بصفتها صوراً) والنصوص، وتحسب درجات التشابه بينها.
يُبيّن هذا الدليل كيفية فهرسة المستندات واسترجاعها باستخدام ColPali.
في حالات الاستخدام واسعة النطاق، قد ترغب في فهرسة المستندات واسترجاعها باستخدام قاعدة بيانات متجهات.
تأكد من تثبيت Transformers و Datasets.
pip install -q datasets transformers
سنقوم بمؤشر مجموعة بيانات من المستندات المتعلقة برصد الأطباق الطائرة. نقوم بتصفية الأمثلة التي يكون فيها العمود الذي نهتم به مفقودًا. تحتوي المجموعة على عدة أعمدة، نحن مهتمون بالعمود specific_detail_query الذي يحتوي على ملخص قصير للمستند، وبالعمود image الذي يحتوي على مستنداتنا.
from datasets import load_dataset
dataset = load_dataset("davanstrien/ufo-ColPali")
dataset = dataset["train"]
dataset = dataset.filter(lambda example: example["specific_detail_query"] is not None)
print(dataset)Dataset({
features: ['image', 'raw_queries', 'broad_topical_query', 'broad_topical_explanation', 'specific_detail_query', 'specific_detail_explanation', 'visual_element_query', 'visual_element_explanation', 'parsed_into_json'],
num_rows: 2172
})لنقم بتحميل النموذج ومُجزِّئ الرموز.
import torch
from transformers import ColPaliForRetrieval, ColPaliProcessor
from accelerate import Accelerator
device = Accelerator().device
model_name = "vidore/colpali-v1.2-hf"
processor = ColPaliProcessor.from_pretrained(model_name)
model = ColPaliForRetrieval.from_pretrained(
model_name,
dtype=torch.bfloat16,
device_map="auto",
).eval()مرّر استعلام النص إلى المعالج وأعدّ تمثيلات النص المفهرسة من النموذج. للبحث من الصورة إلى النص، استبدل معامل text في ColPaliProcessor بمعامل images لتمرير الصور.
inputs = processor(text="a document about Mars expedition").to(model.device)
with torch.no_grad():
text_embeds = model(**inputs, return_tensors="pt").embeddingsقم بفهرسة الصور دون اتصال، وأثناء الاستدلال، أعدّ تمثيلات النص الاستعلامي للحصول على تمثيلات الصور الأقرب إليها.
احفظ الصورة وتضميناتها عن طريق كتابتها في مجموعة البيانات باستخدام map كما هو موضح أدناه. أضف عمودًا باسم embeddings يحتوي على التضمينات المفهرسة. تستهلك تضمينات ColPali مساحة تخزين كبيرة، لذا قم بإزالتها من المُسرِّع وتخزينها في وحدة المعالجة المركزية (CPU) كمتجهات NumPy.
ds_with_embeddings = dataset.map(lambda example: {'embeddings': model(**processor(images=example["image"]).to(device), return_tensors="pt").embeddings.to(torch.float32).detach().cpu().numpy()})للاستدلال عبر الإنترنت، أنشئ دالة للبحث في تضمينات الصور على دفعات واسترجاع الصور الأكثر صلة بعدد k. تعيد الدالة أدناه الفهارس في مجموعة البيانات ودرجاتها لمجموعة بيانات مفهرسة محددة، وتضمينات نصية، وعدد النتائج العلوية، وحجم الدفعة.
def find_top_k_indices_batched(dataset, text_embedding, processor, k=10, batch_size=4):
scores_and_indices = []
for start_idx in range(0, len(dataset), batch_size):
end_idx = min(start_idx + batch_size, len(dataset))
batch = dataset[start_idx:end_idx]
batch_embeddings = [torch.tensor(emb[0], dtype=torch.float32) for emb in batch["embeddings"]]
scores = processor.score_retrieval(text_embedding.to("cpu").to(torch.float32), batch_embeddings)
if hasattr(scores, "tolist"):
scores = scores.tolist()[0]
for i, score in enumerate(scores):
scores_and_indices.append((score, start_idx + i))
sorted_results = sorted(scores_and_indices, key=lambda x: -x[0])
topk = sorted_results[:k]
indices = [idx for _, idx in topk]
scores = [score for score, _ in topk]
return indices, scoresأنشئ تمثيلات النص (text embeddings) ومررها إلى الدالة أعلاه لإرجاع فهارس مجموعة البيانات والنتائج.
with torch.no_grad():
text_embeds = model(**processor(text="a document about Mars expedition").to(model.device), return_tensors="pt").embeddings
indices, scores = find_top_k_indices_batched(ds_with_embeddings, text_embeds, processor, k=3, batch_size=4)
print(indices, scores)([440, 442, 443], [14.370786666870117, 13.675487518310547, 12.9899320602417])
عرض الصور لعرض المستندات المتعلقة بمars.
for i in indices:
display(dataset[i]["image"])
