لـ RAG، حوّل ملفات PDF إلى Markdown عندما تريد مقاطع تتبع أقسام المستند: يصبح كل عنوان نقطة تقسيم، وتنتقل العناوين التي تعلو المقطع معه كبيانات وصفية. تحقق من العناوين والجداول ونص OCR قبل الفهرسة، ثم اختبر الاسترجاع على أسئلة تعرف إجاباتها مسبقًا.
هذا الدليل للمطورين الذين يبنون استرجاعًا فوق مستندات خاصة: سياسات وأدلة وعقود وأبحاث. ويفترض أن لديك بالفعل نموذج تضمين ومخزن متجهات في ذهنك.
لماذا تصنع العناوين مقاطع أفضل
يقطع مقسِّم الحجم الثابت النص إلى قطع بطول محدد حيثما وقع القطع. وقد يبدأ المقطع في منتصف قسم ويفقد العنوان الذي يبيّن موضوعه. فعبارة «الطلبات محدودة بـ 100 في الدقيقة» تعني شيئًا تحت «Sandbox» وشيئًا آخر تحت «Production». ودون العنوان لا يستطيع المسترجِع ولا النموذج معرفة أيهما المقصود.
يحتفظ Markdown بمخطط المستند على شكل أسطر تبدأ بـ # و## و###. ويقطع المقسِّم المعتمد على العناوين عند هذه الأسطر، فيغطي كل مقطع قسمًا واحدًا، ويسجّل العناوين التي تعلو المقطع: أي مسار قسمه. دليل LangChain لتقسيم Markdown يصف الفكرة نفسها: أبقِ النص مع العناوين التي ينتمي إليها.
تتفاوت الأقسام في الطول، لذا يحتاج القسم الطويل إلى تقسيم ثانٍ حسب الحجم. ويسري مسار القسم على كل قطعة منه.
حوّل ملفات PDF وتحقق من العناوين
في MD Factory، أضف المجلد الذي فيه ملفات PDF. يُحفظ كل ملف Markdown بجانب ملف PDF الخاص به بالاسم نفسه، مع الصور في مجلد بجواره. وتمر ملفات PDF الممسوحة ضوئيًا بـ OCR على جهازك. وتُحوَّل ملفات Word والصيغ الأخرى في المجلد بالطريقة نفسها.
افتح بعض النتائج قبل أن تكتب أي شيفرة تقسيم:
- تأكد من أن الفصول والأقسام والأقسام الفرعية تخرج بصيغة # و## و###. فغالبًا ما يميّز ملف PDF العنوان بخط أكبر أو أغمق فقط، لذا على أي محوّل أن يستنتج أين تبدأ الأقسام وكيف تتداخل. أصلح المستويات حيث تكون خاطئة.
- في ملفات Word، تنتقل العناوين إذا استخدم المؤلف أنماط العناوين (Heading) في Word. أما النص الغامق أو الكبير فقط فيبقى فقرة عادية.
- ابحث عن الرؤوس والتذييلات المتكررة وأرقام الصفحات في منتصف النص.
- انقر على «يحتاج إلى مراجعة» بجانب ملف لترى ما يجب التحقق منه. وفي ملف PDF، قد تتضمن القائمة صفحات لم يستطع فيها OCR قراءة جزء من النص أو لم يجد فيها نصًا أصلًا.
أصلح المشكلات في ملف Markdown قبل أن تفهرسه. فكل مقطع يرثها.
قسّم حسب العناوين في الشيفرة
MarkdownHeaderTextSplitter في LangChain يقسّم النص عند مستويات العناوين التي تسردها، ويضع كل عنوان في البيانات الوصفية للمقطع. ويحدّ مقسِّم ثانٍ الحجم داخل كل قسم:
from pathlib import Path
from langchain_text_splitters import (
MarkdownHeaderTextSplitter,
RecursiveCharacterTextSplitter,
)
corpus = Path("corpus")
by_heading = MarkdownHeaderTextSplitter(
[("#", "h1"), ("##", "h2"), ("###", "h3")], strip_headers=False
)
by_size = RecursiveCharacterTextSplitter(chunk_size=1500, chunk_overlap=150)
chunks = []
for path in sorted(corpus.rglob("*.md")):
sections = by_heading.split_text(path.read_text(encoding="utf-8"))
for chunk in by_size.split_documents(sections):
chunk.metadata["source"] = path.relative_to(corpus).as_posix()
chunk.metadata["section"] = " > ".join(
chunk.metadata[h] for h in ("h1", "h2", "h3") if h in chunk.metadata
)
chunks.append(chunk)
حجم المقطع والتداخل هنا نقطة بداية؛ اضبطهما بحسب نموذج التضمين لديك. ولإبقاء أسطر العناوين في نص المقطع، بحيث يذكر النص الذي تضمّنه قسمه أيضًا، يضبط المثال strip_headers=False.
MarkdownNodeParser في LlamaIndex يجري تقسيم العناوين نفسه. وعندما تحمّل الملفات بـ SimpleDirectoryReader، تحمل كل عقدة اسم الملف أيضًا:
from llama_index.core import SimpleDirectoryReader
from llama_index.core.node_parser import MarkdownNodeParser
documents = SimpleDirectoryReader(
"corpus", recursive=True, required_exts=[".md"]
).load_data()
nodes = MarkdownNodeParser().get_nodes_from_documents(documents)
print(nodes[0].metadata["file_name"], nodes[0].metadata["header_path"])
header_path يسرد العناوين التي تعلو العقدة، مثلًا /Employee handbook/Expenses/؛ وعنوان العقدة نفسها هو أول سطر في نصها.
احتفظ بالمصدر مع كل مقطع
احتفظ بثلاثة أشياء على الأقل مع كل مقطع:
- الملف. يحمل ملف Markdown اسم ملف PDF نفسه، لذا فمقطع من handbook.md يقود إلى handbook.pdf. احفظ المسار نسبةً إلى مجلد المدونة، لأن ملفين باسم terms.md في مجلدين مختلفين مستندان مختلفان.
- مسار القسم، ليتمكن الجواب من ذكر القسم الذي استخدمه وليذهب القارئ مباشرة إلى المقطع.
- الإصدار أو التاريخ. فعندما تتغير سياسة، تحذف مقاطع الملف القديم وتفهرس الجديدة، بدلًا من تقديم النسختين معًا.
وإذا كان أشخاص بصلاحيات وصول مختلفة سيستعلمون من الفهرس نفسه، فاحفظ أيضًا من يحق له قراءة كل مستند، وصفِّ على ذلك وقت الاستعلام. فالمسترجِع يعيد أي مقطع يطابق السؤال.
لا يحتوي Markdown الذي ينتجه MD Factory على أرقام صفحات. وإذا كان لا بد أن تذكر الإجابات الصفحات، فابحث عن المقطع في ملف PDF الأصلي.
تعامل بحذر مع الجداول ونص OCR
يظهر صف رأس الجدول في Markdown مرة واحدة في الأعلى. وعندما يكون الجدول أطول من حجم المقطع، يقطعه مقسِّم الحجم، وتصل القطع اللاحقة بلا أسماء أعمدة. وفي اختبارنا مع LangChain (langchain-text-splitters 1.1.3)، أعطى جدول من 40 صفًا قُسّم إلى مقاطع من 300 حرف أربع قطع، ولم يحتوِ على صف الرأس إلا الأولى.
هناك طريقتان للإصلاح: أبقِ كل جدول في مقطع واحد حتى لو كان أطول من البقية، أو كرّر صف الرأس في بداية كل قطعة.
في ملفات Word وExcel، يضع MD Factory على المستند حالة «يحتاج إلى مراجعة» عندما تُبسَّط الخلايا المدمجة أو المعقدة. أما جداول PDF فلا تحمل علامة كهذه، لذا قارن بعضها بالأصل، خاصةً الجداول ذات الرؤوس المدمجة.
ويحتاج نص OCR إلى فحصه الخاص. فالأرقام والأسماء والرموز المقروءة خطأً تدخل في الإجابات كما هي، ولا يبدو في المقطع ما يدل على الخطأ. قارن الأرقام في بعض المقاطع بالمسح الضوئي، واترك الصفحات المعلَّمة خارج الفهرس حتى تصلحها. وما الذي تبحث عنه مذكور في دليلنا لفحص OCR في ملفات PDF الممسوحة ضوئيًا.
اختبر الاسترجاع على أسئلة حقيقية
اكتب الأسئلة التي سيطرحها الناس فعلًا، ولكل سؤال الملف والقسم اللذين فيهما الجواب. ابدأ بعشرة أو عشرين سؤالًا.
- مرّر كل سؤال عبر المسترجِع لديك وانظر إلى النتائج الأولى.
- دوّن ما إذا كان القسم الصحيح بينها.
- لكل إخفاق، قارن المقاطع التي عادت بالمقطع الذي كان ينبغي أن يعود. الأسباب المعتادة: مستوى عنوان خاطئ، أو جدول مفصول عن رأسه، أو خطأ OCR في المصطلح الأساسي، أو قسم طويل جدًا حتى ضاع الجواب فيه.
- غيّر شيئًا واحدًا، مثل حجم المقطع أو مستويات العناوين أو طريقة تقسيم الجداول، ثم شغّل الأسئلة نفسها مرة أخرى.
احتفظ بالأسئلة في ملف بجانب المدونة وأعد تشغيلها كلما تغيرت المستندات أو شيفرة التقسيم.
متى تستخدم MD Factory ومتى تستخدم مكتبة
MD Factory تطبيق سطح مكتب لـ Windows. ويناسب مجموعة خاصة تريد تحويلها على جهازك وفحصها بالعين: أضف مجلدًا، وانظر إلى الحالات، وافتح الملفات التي تحتاج إلى مراجعة، وأصلحها، ثم وجّه النص البرمجي للفهرسة إلى المجلد.
يُبقي MD Factory المستندات على جهازك أثناء التحويل. فإذا ضمّنت المقاطع بعد ذلك بواجهة تضمين مستضافة أو أرسلتها إلى نموذج مستضاف، يذهب نصها إلى ذلك المزوّد. استخدم نموذجًا محليًا إذا كان يجب ألا تغادر المستندات شبكتك.
وإذا كانت المستندات تصل باستمرار، أو تُحوَّل على خادم، أو يجب تحويلها دون أن يراقبها شخص، فاستخدم مكتبة تحويل في شيفرتك بدلًا منه. وللخيارات، راجع مقارنتنا لمحوّلات PDF إلى Markdown.