Often, no. Đối với một thư mục chứa hợp đồng, báo cáo hoặc email, một tác nhân AI có công cụ tìm kiếm toàn văn sẽ tìm các tệp phù hợp, chỉ đọc các đoạn trích khớp và trích dẫn chúng, và chỉ mục chạy cục bộ mà không cần mô hình nhúng và không có kho vector. GroupDocs.Search.Mcp cung cấp cho Claude Desktop, Claude Code, Cursor hoặc Copilot công cụ đó trong một lệnh Docker:

Lập chỉ mục cho thư mục hợp đồng, sau đó cho tôi biết hợp đồng nào đề cập đến khoản phạt chấm dứt và trích dẫn điều khoản.

Phiên bản từng bước với cấu hình và khắc phục sự cố có trong tài liệu: Cách tìm kiếm tài liệu bằng các tác nhân AI sử dụng MCP.

Tại sao mọi người lại ưu tiên embeddings đầu tiên?

Bởi vì “retrieval-augmented generation” xuất hiện như một công thức: chia tài liệu thành các đoạn, nhúng mỗi đoạn, lưu trữ các vector, nhúng câu hỏi, lấy các đoạn gần nhất và dán chúng vào lời nhắc. Nó hoạt động, và đối với các câu hỏi không giống gì với tài liệu, đây là công cụ phù hợp. Nhưng nó là một quy trình với mô hình nhúng cần gọi, một kho cần chạy, việc chia đoạn cần tinh chỉnh, và một công việc nhúng lại mỗi khi tài liệu thay đổi. Đối với “các hợp đồng nào trong số 300 hợp đồng của tôi đề cập đến khoản phạt chấm dứt”, cơ chế đó trả lời một câu hỏi mà chỉ mục tìm kiếm có thể trả lời trực tiếp.

Bằng chứng đã bắt kịp trực giác. Một nghiên cứu được công bố trên arXiv vào cuối năm 2025 (Keyword search is all you need) đã cho một tác nhân chỉ sử dụng tìm kiếm từ khóa và regex trên một thư mục và đo lường nó so với quy trình RAG tiêu chuẩn: hơn 90% điểm RAG, không có cơ sở dữ liệu vector, và phù hợp hơn với các bộ sưu tập thường xuyên thay đổi. Các tác nhân lập trình đã chứng minh mô hình này trong thực tế: chúng tìm kiếm bằng grep, tinh chỉnh, và lại tìm kiếm.

Tác nhân làm gì thay thế?

Ba cuộc gọi. GroupDocs.Search.Mcp cung cấp tám công cụ; vòng lặp cần ba trong số chúng:

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 đọc các tệp một lần và giữ văn bản trong một chỉ mục có tên trên đĩa. search trả về các tệp khớp dưới dạng JSON kèm số lần xuất hiện. get_text_fragments trả về mỗi kết quả khớp kèm một vài từ ngữ cảnh, vì vậy tác nhân trích dẫn điều khoản thay vì tải toàn bộ hợp đồng.

Đây là những gì máy chủ thực sự trả về trong thử nghiệm của chúng tôi, với năm hợp đồng tổng hợp:

-> 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…

Chú ý hợp đồng thứ ba. NDA của Initech khớp termination AND penalty vì nó nói “không có phí và không có phạt liên quan đến việc chấm dứt”. Đoạn văn là gì khiến một khớp trở thành một đề cập, và một tác nhân đọc các đoạn văn sẽ nói như vậy. Đó là việc đưa ra nền tảng: mỗi khẳng định trong câu trả lời đều chỉ tới một tệp và một câu mà bạn có thể mở.

Mỗi cách tiếp cận thắng ở đâu?

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

Tìm kiếm toàn văn sẽ thua khi câu hỏi và tài liệu không chia sẻ từ nào: “các hợp đồng nào có rủi ro đối với chúng tôi?” không có từ khóa. Nó thắng khi từ vựng được chia sẻ, điều này mô tả hầu hết các câu hỏi mọi người đặt về tài liệu của họ: tên điều khoản, sản phẩm, khách hàng, số hoá đơn, khoảng thời gian. Khi một truy vấn không khớp, tác nhân sẽ thử renewal OR renews, hoặc một khớp mờ, giống như con người. Máy chủ hỗ trợ: một truy vấn hai từ không có dấu ngoặc kép không khớp gì trong GroupDocs.Search, và kết quả trống mang một hint cho tác nhân biết trích dẫn cụm từ.

Công cụ nào cho câu hỏi nào?

Người dùng hỏi Tác nhân gọi
“Lập chỉ mục cho thư mục này” add_to_index
“Tệp nào đề cập đến X?” search
“Nó nói gì về X?” get_text_fragments
“Các tệp đã thay đổi, làm mới” update_index
“Quên thư mục nháp” remove_from_index
“Có gì trong chỉ mục?” get_index_info
“Bắt đầu một chỉ mục riêng” create_index
“Tại sao chỉ có 10 kết quả?” get_license_status

Chỉ mục hiểu 82 định dạng, bao gồm PDF, Office, OpenDocument, HTML và các kho lưu trữ email (PST, OST, MSG, EML) cùng các tệp đính kèm của chúng.

Cách chạy nó?

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 với GitHub Copilot và các khách hàng khác sử dụng cùng một container trong tệp cấu hình riêng của họ: Đăng ký trong các khách hàng AI. Trên Linux thêm --user "$(id -u):$(id -g)" để container có thể ghi chỉ mục vào thư mục của bạn. Máy chủ chạy engine GroupDocs.Search 26.10, định dạng chỉ mục mới làm chỉ mục nhỏ hơn và giảm khoảng một nửa bộ nhớ sử dụng (release notes).

Giới hạn thực tế

  • Trong chế độ đánh giá, một chỉ mục chứa tối đa 100 tài liệu và một tìm kiếm trả về tối đa 10; mọi phản hồi đều nói như vậy. Gọi get_license_status trước.
  • Đây là tìm kiếm toàn văn, không phải tìm kiếm ngữ nghĩa: nó khớp từ, không phải ý nghĩa.
  • Không có OCR: các PDF đã quét không có lớp văn bản chỉ được lập chỉ mục dựa trên thuộc tính tệp.
  • Nó chỉ được cung cấp dưới dạng hình ảnh Docker (công cụ đóng gói vượt quá giới hạn kích thước của NuGet).

Câu hỏi thường gặp

Claude có thể tìm kiếm tài liệu cục bộ của tôi mà không tải lên không?
Có. Máy chủ chạy trong một container trên máy của bạn và đọc thư mục bạn gắn; chỉ các đoạn mà tác nhân trích dẫn mới tới mô hình.

Đây có phải là RAG không?
Đó là retrieval-augmented, nhưng theo dạng tác nhân: mô hình quyết định gì cần tìm kiếm và khi nào đã đủ, sử dụng chỉ mục toàn văn thay vì embeddings.

Điều gì xảy ra khi tài liệu của tôi thay đổi?
Yêu cầu tác nhân làm mới. update_index đọc lại chỉ các tệp đã thay đổi, được thêm và bị xóa.

Đi sâu hơn