إجابة حول مستنداتك لا تكون جيدة إلا بقدر النص الذي بُنيت عليه، وعندما تلصق ملفات كاملة في محادثة لا يمكنك معرفة أي جزء استخدمه النموذج فعليًا. يقدم GroupDocs.Search.Mcp، الذي يعمل محليًا في Docker، أداة مختلفة لكل من Claude Desktop وCursor أو Copilot: get_text_fragments تُعيد فقط المقاطع التي تطابق الاستعلام، مع بضع كلمات من السياق والملف الذي جاءت منه، وبالتالي يجيب الوكيل بالاستشهادات:

ما الذي تقوله عقودي حول العقوبات؟ استشهد بالمقاطع، مع ما يكفي من السياق لفهم كل منها.

الإصدار خطوة بخطوة مع الإعدادات واستكشاف الأخطاء موجود في الوثائق: How to get the matching passages instead of reading whole files.

لماذا تنحرف الإجابات عن المستندات؟

لأن نافذة السياق هي ميزانية، وتستنزف المستندات الكاملة هذه الميزانية بشكل سيء. سؤال حول العقوبات قد يحتاج ربما إلى ثلاث جمل من خمسين صفحة. عندما تلصق الخمسين صفحةً يجب على النموذج أن يجد الجمل الثلاث بنفسه بين كل ما هو آخر، ثم يحتفظ بها أثناء الكتابة. السياقات الطويلة تُلخّص، وتفقد المادة المبكرة وزنها، وتبدأ الإجابة في الاعتماد على الفهم العام للنموذج لما تقوله العقود عادةً بدلاً من ما تقوله عقودك. تُسمى هذه العملية في الصناعة هندسة السياق؛ أبسط أشكالها هو عدم تحميل النص الذي لا تحتاجه.

كيف يبدو المقتطف؟

الفهرس يحتفظ بالفعل بنص كل مستند، لذا يمكن للخادم استخراج المقطع حول كل تطابق. هذه ردود فعل حقيقية من اختبارنا، ضد خمسة عقود اصطناعية. الإعدادات الافتراضية، ثماني كلمات على كل جانب، تعطي عبارة:

-> get_text_fragments {"query":"penalty","indexName":"contracts"}
<- === contracts/acme-master-services-agreement.pdf (1 occurrence(s)) ===
     [content] …before the end of the Term, a termination penalty of
   three monthly fees applies, payable within 30…

عشرون كلمة على كل جانب تعطي الفقرة كاملة:

-> get_text_fragments {"query":"penalty","indexName":"contracts",
     "termsBefore":20,"termsAfter":20,"maxFragmentsPerDocument":1}
<- === contracts/acme-master-services-agreement.pdf (1 occurrence(s)) ===
     …convenience on 90 days written notice.
   12.3 If the Client terminates before the end of the Term, a termination
   penalty of three monthly fees applies, payable within 30 days of the
   termination date.
   14.2 Force majeure: neither party is…

termsBefore و termsAfter عبارة عن مقبض ضبط: صغير للحصول على “أي ملفات وأين تقريبًا”، كبير للحصول على “استشهد بالفقرة”. maxFragmentsPerDocument و maxDocuments يحدان حجم الإجابة، لذا لا يفيض كلمة تتكرر مئتي مرة على السياق.

الميزانية، جنبًا إلى جنب

Reading the files                        Searching the index
-------------------------------------    -------------------------------------
agent opens every document               search: which files match (JSON)
  context grows with the corpus          get_text_fragments: the passages
  long files crowd out the question        (~8 words either side, per file)
  repeated for every question            answer cites file + passage
                                         the index is reused next time

الفرق يزداد مع حجم المجموعة. بالنسبة إلى ثلاثة ملفات قصيرة لا يهم كثيرًا. لكن لمجلد يحتوي على عقود طويلة، تقارير وبريد، تكون المقاطع لسؤال واحد بضع مئات كلمة، مقارنةً بالنص الكامل لكل مستند مرشح.

عندما تختلف الكلمات

البحث النصي الكامل يطابق الكلمات، وهو ميزة للتثبيت (كل نتيجة يمكن شرحها) وحدود للاسترجاع (المرادف يُفوت). مهمة الوكيل هي تجربة المتغيرات، ويمكنه رؤية ما طابقه كل متغير فعليًا:

-> search {"query":"renewal OR renews","indexName":"contracts"}
<- umbrella-office-lease.pdf, terms ["renewal", "renews"]

-> search {"query":"renewl","indexName":"contracts","fuzzy":true}
<- umbrella-office-lease.pdf, terms ["renewal", "renews", "rent"]

المطابقة الضبابية أنقذت خطأ إملائي وأدخلت أيضًا rent. لأن الاستجابة تسرد المصطلحات التي طابقت، يمكن للوكيل أو لك أن ترى التطابق الزائد بدلاً من الوثوق به. هذه الشفافية هي ما يجب أن يعنيه “مُثبت”: ليس فقط “الإجابة تستشهد بمصدر”، بل “يمكنك رؤية كيف تم العثور على المصدر”.

كيف تبدو الإجابة المثبتة

اطلب الاستشهادات، وستصل الإجابة بصيغة يمكنك التحقق منها بنظرة واحدة:

عقدان يحتويان على عقوبة إنهاء. Acme MSA، الفقرة 12.3: “a termination penalty of three monthly fees applies, payable within 30 days of the termination date.” اتفاقية استشارة Globex، القسم 9: “the Client pays 50 percent of the fees remaining for the current phase.” اتفاقية عدم الإفشاء من Initech تذكر الإنهاء والعقوبة لكنها تشير إلى عدم وجود عقوبة.

إذا أخطأ ملخص في قراءة اقتباس، فإن الخطأ يظهر مباشرةً بجانب الاقتباس.

حدود صريحة

  • في وضع التقييم يحتفظ الفهرس بحد أقصى 100 مستند وتُعيد عملية البحث بحد أقصى 10 نتائج. يضيف وضع التقييم أيضًا سطرًا “Evaluation only…” إلى النص المفهرس لبعض الصيغ، وقد يظهر ذلك في المقاطع؛ قم بترخيص الخادم وأعد بناء الفهرس لإزالته. استدعِ get_license_status أولًا.
  • يُحسب سياق المقتطف بالكلمات، وليس بالجمل، لذا قد يبدأ المقطع في منتصف جملة؛ زد termsBefore عندما يكون ذلك مهمًا.
  • لا يوجد OCR: المسحات التي لا تحتوي على طبقة نصية لا تملك مقاطع لتُرجع.
  • يعمل فقط على Docker؛ على Linux أضف --user "$(id -u):$(id -g)".

الأسئلة المتكررة

كيف أجعل Claude يستشهد بالمصادر من مستنداتي؟
امنحه أداة تُعيد نص المصدر مع اسم الملف. get_text_fragments تفعل ذلك بالضبط، وتعليم مثل “quote the passage and its file” يجعله عادة.

هل يقلل هذا من استهلاك الرموز؟
يتجنب تحميل المستندات بالكامل للإجابة على سؤال: يقرأ الوكيل المقاطع المطابقة فقط. مقدار التوفير يعتمد على حجم ملفاتك.

هل لا يزال بإمكان الوكيل قراءة ملف كامل عندما يحتاج ذلك؟
نعم، باستخدام أدوات الملفات الخاصة به. المقاطع تُستخدم للعثور على الاقتباس؛ اقرأ الملف بالكامل عندما لا تكون المقتطفات كافية.

تعمق أكثر