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

ดัชนีโฟลเดอร์สัญญา, แล้วบอกฉันว่ามีสัญญาใดบ้างที่กล่าวถึงค่าปรับการยกเลิกและอ้างอิงข้อกำหนดนั้น.

เวอร์ชันขั้นตอนต่อขั้นตอนพร้อมการกำหนดค่าและการแก้ไขปัญหาอยู่ในเอกสาร: How to search documents with AI agents using MCP.

ทำไมทุกคนจึงหันไปใช้การฝังเป็นอันดับแรก?

เพราะ “การสร้างแบบเสริมการดึงข้อมูล” (retrieval-augmented generation) ปรากฏเป็นสูตร: แบ่งเอกสารเป็นชิ้นส่วน, ฝังแต่ละชิ้น, เก็บเวกเตอร์, ฝังคำถาม, ดึงชิ้นส่วนที่ใกล้ที่สุดและแปะลงในพรอมต์. มันทำงานได้, และสำหรับคำถามที่ไม่ได้ใช้รูปแบบเดียวกับเอกสารมันเป็นเครื่องมือที่เหมาะสม. แต่เป็นกระบวนการที่ต้องมีโมเดลฝังเพื่อเรียกใช้, ที่เก็บข้อมูลเพื่อทำงาน, การแบ่งชิ้นส่วนที่ต้องปรับ, และงานการฝังใหม่ทุกครั้งที่เอกสารเปลี่ยนแปลง. สำหรับ “สัญญา 300 ฉบับของฉันที่กล่าวถึงค่าปรับการยกเลิก” เครื่องมือนี้ตอบคำถามได้โดยตรงเช่นเดียวกับดัชนีการค้นหา.

หลักฐานได้ตามทันกับความรู้สึกสัญชาตญาณ. การศึกษาเผยแพร่บน arXiv ในปลายปี 2025 (Keyword search is all you need) ให้เอเจนต์ทำการค้นหาแบบคีย์เวิร์ดและ regex บนโฟลเดอร์เท่านั้นและเปรียบเทียบกับสายงาน RAG มาตรฐาน: ได้คะแนนกว่า 90% ของคะแนน RAG, โดยไม่มีฐานข้อมูลเวกเตอร์, และเหมาะกับคอลเลกชันที่เปลี่ยนแปลงบ่อย. เอเจนต์การเขียนโค้ดได้แสดงรูปแบบนี้ในทางปฏิบัติแล้ว: พวกเขาค้นหาด้วย grep, ปรับปรุง, แล้วค้นหาใหม่.

เอเจนต์ทำอะไรแทน?

สามการเรียก. GroupDocs.Search.Mcp เปิดเผยเครื่องมือแปดอย่าง; ลูปต้องการสามอย่างจากนั้น:

user              agent                         Search MCP server
 |  "Which contracts mention a termination penalty?"           |
 |---------------->|                                           |
 |                 |-- add_to_index ------------------------->|  reads the
 |                 |   {"documentsPath":"contracts",           |  files once,
 |                 |    "indexName":"contracts"}               |  stores text
 |                 |<- "5 document(s) added, 5 in the index" --|
 |                 |-- search ------------------------------->|
 |                 |   {"query":"termination AND penalty"}     |
 |                 |<- {"documentsFound":3, "documents":[ ... |  which files
 |                 |-- get_text_fragments ------------------->|
 |                 |   {"query":"\"termination penalty\""}     |
 |                 |<- === contracts/acme-...-agreement.pdf ===|  the passages
 |<- "Two contracts carry one: Acme (3 monthly fees, 12.3),    |
 |    Globex (50% of the remaining fees). Initech excludes it."|

add_to_index อ่านไฟล์เพียงครั้งเดียวและเก็บข้อความไว้ในดัชนีที่ตั้งชื่อบนดิสก์. search คืนไฟล์ที่ตรงกันเป็น JSON พร้อมจำนวนการเกิด. get_text_fragments คืนแต่ละการจับคู่พร้อมคำบริบทไม่กี่คำ, ทำให้เอเจนต์อ้างอิงข้อกำหนดแทนการโหลดสัญญาทั้งหมด.

นี่คือผลลัพธ์ที่เซิร์ฟเวอร์ส่งกลับในการทดสอบของเรา, กับสัญญาเทียม 5 ฉบับ:

-> search {"query":"termination AND penalty","indexName":"contracts"}
<- documentsFound 3: acme-master-services-agreement.pdf,
   globex-consulting-agreement.docx, initech-nda.docx

-> get_text_fragments {"query":"\"termination penalty\"",...}
<- === contracts/acme-master-services-agreement.pdf (1 occurrence(s)) ===
     …a termination penalty of three monthly fees applies, payable
     within 30…
   === contracts/globex-consulting-agreement.docx (1 occurrence(s)) ===
     …Early termination penalty: the Client pays 50 percent of the fees…

สังเกตสัญญาที่สาม. NDA ของ Initech ตรงกับ termination AND penalty เพราะมีข้อความ “there is no fee and no penalty associated with termination”. ส่วนข้อความนี้คือสิ่งที่บ่งบอกความแตกต่างระหว่างการจับคู่และการกล่าวถึง, และเอเจนต์ที่อ่านส่วนข้อความจะบอกเช่นนั้น. นั่นคือการทำให้ข้อมูลเป็นพื้นฐาน: ทุกข้ออ้างในคำตอบชี้ไปที่ไฟล์และประโยคที่คุณสามารถเปิดได้.

แต่ละวิธีชนะที่ไหน?

Embedding pipeline                       Agentic full-text search
-------------------------------------    -------------------------------------
split, embed, store in a vector store    add_to_index: a local full-text index
embed the question, take top-k chunks    agent searches, refines, searches again
paste the chunks into the prompt         get_text_fragments: quoted passages
re-embed when documents change           update_index re-reads what changed
needs an embedding model and a store     no model calls, no network at runtime
matches meaning; ranking is opaque       matches words; every hit is explainable

การค้นหาแบบเต็มข้อความจะพ่ายแพ้เมื่อคำถามและเอกสารไม่มีคำร่วมกัน: “which contracts are risky for us?” ไม่มีคีย์เวิร์ด. มันชนะเมื่อคำศัพท์ร่วมกัน, ซึ่งอธิบายคำถามส่วนใหญ่ที่ผู้คนถามเกี่ยวกับเอกสารของตน: ชื่อข้อกำหนด, ผลิตภัณฑ์, ลูกค้า, หมายเลขใบแจ้งหนี้, ช่วงวันที่. เมื่อคำค้นหาขาด, เอเจนต์จะลอง renewal OR renews หรือการจับคู่แบบ fuzzy, เหมือนคนทำ. เซิร์ฟเวอร์ช่วย: คำค้นหาสองคำที่ไม่ได้อ้างอิงไม่ตรงกับอะไรใน GroupDocs.Search, และผลลัพธ์ว่างจะมี hint ที่บอกเอเจนต์ให้ใส่เครื่องหมายอัญประกาศกับวลี.

เครื่องมือใดสำหรับคำถามใด?

The user asks The agent calls
“ทำดัชนีโฟลเดอร์นี้” add_to_index
“ไฟล์ใดบ้างที่กล่าวถึง X?” search
“มันบอกอะไรเกี่ยวกับ X?” get_text_fragments
“ไฟล์เปลี่ยนแปลง, รีเฟรช” update_index
“ลืมโฟลเดอร์ร่าง” remove_from_index
“อะไรอยู่ในดัชนี?” get_index_info
“เริ่มดัชนีแยก” create_index
“ทำไมผลลัพธ์ถึงมีแค่ 10 รายการ?” get_license_status

ดัชนีรองรับ 82 รูปแบบ, รวมถึง PDF, Office, OpenDocument, HTML, และไฟล์เก็บอีเมล (PST, OST, MSG, EML) พร้อมไฟล์แนบของพวกมัน.

วิธีการรัน

claude mcp add groupdocs-search -- docker run --rm -i \
  -v /path/to/documents:/data ghcr.io/groupdocs-search/search-net-mcp:latest

Cursor, Claude Desktop, VS Code พร้อม GitHub Copilot และไคลเอนต์อื่น ๆ ใช้คอนเทนเนอร์เดียวกันในไฟล์กำหนดค่าของตน: Register in AI clients. บน Linux เพิ่ม --user "$(id -u):$(id -g)" เพื่อให้คอนเทนเนอร์เขียนดัชนีลงในโฟลเดอร์ของคุณ. เซิร์ฟเวอร์ทำงานด้วยเอนจิน GroupDocs.Search 26.10, ซึ่งรูปแบบดัชนีใหม่ทำให้ดัชนีมีขนาดเล็กลงและใช้หน่วยความจำประมาณครึ่งหนึ่ง (release notes).

ข้อจำกัดที่ตรงไปตรงมา

  • ในโหมดประเมิน ดัชนีจะเก็บเอกสารได้สูงสุด 100 ฉบับและการค้นหาจะคืนผลลัพธ์สูงสุด 10 รายการ; ทุกการตอบจะระบุเช่นนั้น. เรียก get_license_status ก่อน.
  • เป็นการค้นหาแบบเต็มข้อความ ไม่ใช่การค้นหาเชิงความหมาย: มันจับคู่คำ, ไม่ใช่ความหมาย.
  • ไม่มี OCR: PDF ที่สแกนโดยไม่มีชั้นข้อความจะถูกทำดัชนีโดยใช้เฉพาะคุณสมบัติของไฟล์.
  • จัดจำหน่ายเป็นภาพ Docker เท่านั้น (เครื่องมือที่บรรจุมีขนาดเกินขีดจำกัดของ NuGet).

คำถามที่พบบ่อย

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

นี่คือ RAG หรือไม่?
มันเป็นการเสริมการดึงข้อมูล, แต่เป็นแบบเอเจนต์: โมเดลตัดสินใจว่าจะค้นหาอะไรและเมื่อใดที่พอเพียง, โดยใช้ดัชนีเต็มข้อความแทนการฝัง.

จะเกิดอะไรขึ้นเมื่อเอกสารของฉันเปลี่ยนแปลง?
ขอให้เอเจนต์รีเฟรช. update_index จะอ่านใหม่เฉพาะไฟล์ที่เปลี่ยน, เพิ่ม, หรือถูกลบ.

ไปลึกกว่า