คำตอบเกี่ยวกับเอกสารของคุณจะดีเท่ากับข้อความที่ใช้สร้างมัน และเมื่อคุณวางไฟล์ทั้งหมดลงในแชท คุณไม่สามารถบอกได้ว่าโมเดลใช้ส่วนใดจริง ๆ GroupDocs.Search.Mcp ที่ทำงานใน Docker ให้ Claude Desktop, Cursor หรือ Copilot เครื่องมือใหม่: get_text_fragments จะคืนเฉพาะส่วนที่ตรงกับคำค้น พร้อมคำบริบทเล็กน้อยและไฟล์ที่มาจากนั้น ทำให้เอเจนต์ตอบโดยอ้างอิงคำพูด:

สัญญาของฉันบอกอะไรเกี่ยวกับค่าปรับบ้าง? อ้างอิงส่วนที่เกี่ยวข้อง พร้อมบริบทเพียงพอเพื่อให้เข้าใจแต่ละส่วน

เวอร์ชันแบบขั้นตอนพร้อมการกำหนดค่าและการแก้ไขปัญหาอยู่ในเอกสาร: How to get the matching passages instead of reading whole files.

ทำไมคำตอบจึงเบี่ยงเบนจากเอกสาร?

เพราะหน้าต่างบริบทเป็นงบประมาณ และเอกสารทั้งหมดใช้มันอย่างไม่คุ้มค่า คำถามเกี่ยวกับค่าปรับอาจต้องการเพียงสามประโยคจากห้าสิบหน้า วางห้าสิบหน้าแล้วโมเดลต้องค้นหาสามประโยคเองท่ามกลางข้อมูลอื่น ๆ แล้วเก็บไว้ขณะเขียน บริบทยาวจะถูกสรุป ส่วนข้อมูลแรกจะสูญเสียความสำคัญ และคำตอบจะเริ่มอิงจากความเข้าใจทั่วไปของโมเดลว่าสัญญามักบอกอะไร มากกว่าที่สัญญาของคุณบอก อุตสาหกรรมเรียกกระบวนการจัดการนี้ว่า context engineering; รูปแบบที่ง่ายที่สุดคือไม่โหลดข้อความที่คุณไม่ต้องการ

ส่วนหนึ่งของข้อความ (fragment) มีลักษณะอย่างไร?

ดัชนีได้เก็บข้อความของทุกเอกสารไว้แล้ว ดังนั้นเซิร์ฟเวอร์จึงสามารถตัดส่วนที่ตรงกับการค้นหาออกได้ นี่คือตัวอย่างการตอบจากการทดสอบของเราต่อสัญญาเทียม 5 ฉบับ ค่าเริ่มต้นที่แสดงคำแปดคำด้านหน้าและด้านหลังให้ผลลัพธ์เป็นวลี:

-> 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"]

การจับคู่แบบ Fuzzy ช่วยแก้ไขการสะกดผิดและยังดึงคำ rent เข้ามาด้วย เนื่องจากการตอบแสดงรายการคำที่ตรงกัน เอเจนต์หรือคุณจึงสามารถเห็นการจับคู่เกินขอบเขตแทนที่จะเชื่อโดยไม่ตรวจสอบ ความโปร่งใสนี้คือสิ่งที่ “grounded” ควรหมายถึง: ไม่ใช่แค่ “คำตอบอ้างอิงแหล่งที่มา” แต่ “คุณสามารถเห็นว่าแหล่งที่มาถูกค้นพบอย่างไร”

ตัวอย่างคำตอบที่อ้างอิงได้

ขอให้เอเจนต์อ้างอิงข้อความ แล้วคำตอบจะปรากฏในรูปแบบที่คุณตรวจสอบได้ทันที:

สัญญาสองฉบับมีค่าปรับการยกเลิก 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.” NDA ของ 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” จะทำให้มันกลายเป็นนิสัย

นี่จะช่วยลดการใช้โทเคนหรือไม่?
มันช่วยหลีกเลี่ยงการโหลดเอกสารทั้งหมดเพื่อให้คำตอบกับคำถาม: เอเจนต์จะอ่านเฉพาะส่วนที่ตรงกับคำค้นเท่านั้น ปริมาณที่ประหยัดได้ขึ้นอยู่กับขนาดไฟล์ของคุณ

เอเจนต์ยังสามารถอ่านไฟล์ทั้งหมดได้เมื่อจำเป็นหรือไม่?
ได้, ด้วยเครื่องมือไฟล์ของมันเอง ส่วนที่ดึงมานั้นใช้เพื่อค้นหาและอ้างอิง; อ่านไฟล์ทั้งหมดเมื่อส่วนที่ดึงมาไม่เพียงพอ

ไปให้ลึกขึ้น