Một câu trả lời về tài liệu của bạn chỉ tốt như văn bản mà nó được xây dựng từ, và khi bạn dán toàn bộ tệp vào cuộc trò chuyện, bạn không thể biết phần nào mô hình thực sự đã sử dụng. GroupDocs.Search.Mcp, chạy cục bộ trong Docker, cung cấp cho Claude Desktop, Cursor hoặc Copilot một primitive khác: get_text_fragments chỉ trả về các đoạn văn bản khớp với truy vấn, kèm một vài từ ngữ cảnh và tệp mà chúng xuất phát, vì vậy tác nhân trả lời dựa trên các trích dẫn:

Các hợp đồng của tôi nói gì về các khoản phạt? Trích dẫn các đoạn văn, kèm đủ ngữ cảnh để hiểu mỗi đoạ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: How to get the matching passages instead of reading whole files.

Tại sao câu trả lời lại lệch so với tài liệu?

Bởi vì cửa sổ ngữ cảnh là một ngân sách, và việc nạp toàn bộ tài liệu tiêu tốn nó một cách kém hiệu quả. Một câu hỏi về các khoản phạt có thể chỉ cần ba câu trong năm mươi trang. Dán năm mươi trang và mô hình phải tự tìm ba câu đó trong vô vàn thông tin khác, sau đó giữ chúng lại khi viết. Các ngữ cảnh dài bị tóm tắt, phần đầu mất trọng lượng, và câu trả lời bắt đầu dựa vào cảm nhận chung của mô hình về những gì hợp đồng thường nói hơn là những gì hợp đồng của bạn nói. Ngành công nghiệp gọi việc quản lý này là context engineering; hình thức đơn giản nhất là không tải những văn bản bạn không cần.

Đoạn văn bản trích xuất trông như thế nào?

Chỉ mục đã lưu trữ văn bản của mọi tài liệu, vì vậy máy chủ có thể cắt ra đoạn văn quanh mỗi kết quả khớp. Đây là các phản hồi thực tế từ thử nghiệm của chúng tôi, đối với năm hợp đồng tổng hợp. Mặc định, tám từ mỗi bên, cho ra một cụm từ:

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

Hai mươi từ mỗi bên cho ra toàn bộ điều khoản:

-> 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 và termsAfter là các nút điều chỉnh: nhỏ cho “tệp nào và khoảng đâu”, lớn cho “trích dẫn toàn bộ điều khoản”. maxFragmentsPerDocument và maxDocuments giới hạn kích thước câu trả lời, vì vậy một từ xuất hiện hai trăm lần sẽ không làm ngập ngữ cảnh.

Ngân sách, so sánh bên nhau

Đọc các tệp                              Tìm kiếm trong chỉ mục
-------------------------------------    -------------------------------------
tác nhân mở mọi tài liệu                 tìm kiếm: các tệp nào khớp (JSON)
  ngữ cảnh tăng lên cùng với tập hợp    get_text_fragments: các đoạn văn
  các tệp dài làm lấn át câu hỏi        (~8 từ mỗi bên, mỗi tệp)
  lặp lại cho mỗi câu hỏi                câu trả lời trích dẫn tệp + đoạn văn
                                         chỉ mục được tái sử dụng lần sau

Sự khác biệt tăng lên theo kích thước tập hợp. Đối với ba tệp ngắn, nó hầu như không đáng kể. Đối với một thư mục chứa các hợp đồng dài, báo cáo và email, các đoạn trích cho một câu hỏi có thể lên vài trăm từ, so với toàn bộ văn bản của mỗi tài liệu ứng cử.

Khi các từ khác nhau

Tìm kiếm toàn văn khớp từ, đây là tính năng giúp định vị (mỗi kết quả đều có thể giải thích) và cũng là giới hạn về độ bao phủ (một từ đồng nghĩa sẽ bị bỏ lỡ). Công việc của tác nhân là thử các biến thể, và nó có thể xem mỗi biến thể thực sự khớp gì:

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

Khớp mờ đã cứu một lỗi chính tả và cũng kéo thêm rent. Vì phản hồi liệt kê các từ mà nó khớp, một tác nhân, hoặc bạn, có thể thấy sự khớp thừa thay vì chỉ tin tưởng vào nó. Sự trong suốt này chính là ý nghĩa của “grounded”: không chỉ “câu trả lời trích dẫn nguồn”, mà còn “bạn có thể thấy nguồn được tìm thấy như thế nào”.

Một câu trả lời có nền tảng trích dẫn trông như thế nào

Yêu cầu trích dẫn, và câu trả lời sẽ xuất hiện dưới dạng bạn có thể kiểm chứng ngay lập tức:

Hai hợp đồng có khoản phạt chấm dứt. Acme MSA, điều khoản 12.3: “a termination penalty of three monthly fees applies, payable within 30 days of the termination date.” Thỏa thuận tư vấn Globex, mục 9: “the Client pays 50 percent of the fees remaining for the current phase.” NDA của Initech đề cập đến việc chấm dứt và phạt nhưng cho biết không có khoản phạt.

Nếu bản tóm tắt hiểu sai một trích dẫn, sự hiểu sai sẽ nằm ngay bên cạnh trích dẫn đó.

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. Chế độ đánh giá cũng thêm dòng “Evaluation only…” vào văn bản đã lập chỉ mục của một số định dạng, có thể xuất hiện trong các đoạn trích; hãy cấp phép cho máy chủ và xây dựng lại chỉ mục để loại bỏ. Gọi get_license_status trước tiên.
  • Ngữ cảnh của đoạn trích được tính bằng số từ, không phải câu, vì vậy một đoạn có thể bắt đầu giữa câu; tăng termsBefore khi cần.
  • Không có OCR: các bản scan không có lớp văn bản sẽ không có đoạn nào để trả về.
  • Chỉ hỗ trợ Docker; trên Linux thêm --user "$(id -u):$(id -g)".

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

Làm thế nào để tôi khiến Claude trích dẫn nguồn từ tài liệu của tôi?
Cung cấp cho nó một công cụ trả về văn bản nguồn cùng với tên tệp. get_text_fragments làm đúng điều đó, và một chỉ dẫn như “trích dẫn đoạn văn và tệp của nó” sẽ biến nó thành thói quen.

Điều này có giảm việc sử dụng token không?
Nó tránh việc nạp toàn bộ tài liệu để trả lời một câu hỏi: tác nhân chỉ đọc các đoạn trích khớp. Mức độ tiết kiệm phụ thuộc vào kích thước các tệp của bạn.

Tác nhân vẫn có thể đọc toàn bộ tệp khi cần không?
Có, bằng các công cụ tệp riêng của nó. Các đoạn trích dùng để tìm và trích dẫn; đọc toàn bộ tệp khi đoạn trích không đủ.

Đi sâu hơn