תשובה על המסמכים שלך טובה רק עד כמה הטקסט שממנו היא נבנתה, וכאשר אתה מדביק קבצים שלמים בצ’אט, אינך יכול לדעת איזו חלק מהמודל השתמש בפועל. 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: “קנס סיום של שלוש תשלומי חודשי חלים, לתשלום בתוך 30 יום מתאריך סיום.” הסכם ייעוץ של Globex, סעיף 9: “הלקוח משלם 50 אחוז מהתשלומים הנותרים לשלב הנוכחי.” ה‑NDA של Initech מזכיר סיום וקנס אך קובע שאין קנס.

אם סיכום מפרש ציטוט באופן שגוי, השגיאה תופיע בדיוק ליד הציטוט.

מגבלות כנות

  • במצב הערכה אינדקס מחזיק לכל היותר 100 מסמכים וחיפוש מחזיר לכל היותר 10 תוצאות. מצב הערכה מוסיף גם שורת “Evaluation only…” לטקסט הממופה של כמה פורמטים, שיכולה להופיע בקטעים; רישוי השרת ובנייה מחדש של האינדקס יסירו זאת. קרא תחילה get_license_status.
  • הקשר של קטע נספר במילים, לא במשפטים, ולכן קטע יכול להתחיל באמצע משפט; הגדל termsBefore כשזה חשוב.
  • אין OCR: סריקות ללא שכבת טקסט אין להן קטעים להחזיר.
  • Docker בלבד; בלינוקס הוסף --user "$(id -u):$(id -g)".

שאלות נפוצות

איך גורמים ל‑Claude לצטט מקורות מהמסמכים שלי?
תן לו כלי שמחזיר את טקסט המקור יחד עם שם הקובץ. get_text_fragments עושה בדיוק זאת, והוראה כמו “ציטט את הקטע ואת הקובץ שלו” הופכת זאת להרגל.

האם זה מצמצם שימוש בטוקנים?
זה מונע טעינת מסמכים שלמים כדי לענות על שאלה: הסוכן קורא רק את הקטעים המתאימים. כמה חיסכון זה מביא תלוי בגודל הקבצים שלך.

האם הסוכן עדיין יכול לקרוא קובץ שלם כשזה נדרש?
כן, באמצעות כלי הקבצים שלו. קטעים מיועדים למציאת וציטוט; קרא את הקובץ המלא כאשר הקטע אינו מספיק.

צלילה עמוקה יותר