“哪一份合約包含終止罰金條款?“聽起來像是 AI 代理人的工作,事實確實如此,但不是透過閱讀合約本身。若讓代理人打開每一個檔案來回答,牠會在 297 份無關文件上耗盡上下文,且仍必須相信自己已在另外三份文件中注意到該條款。使用在 Docker 本機執行的 GroupDocs.Search.Mcp,Claude Desktop、Cursor 或 Copilot 只需對資料夾建立一次索引,詢問索引哪些合約符合條件,然後只讀取相關條款:

哪一份我的合約提到終止罰金?請引用每一條相關條款。

一步一步的設定與故障排除說明請參考文件:如何使用 AI 代理人對資料夾中的合約提問。

代理人讀取所有內容時會出什麼問題?

三個問題,危險程度遞增。首先速度慢且成本高:每次提問時,所有合約都會進入上下文視窗。其次空間不足:當文件數量超過數十份長文件時,較早的文件會被排除或被摘要,而摘要往往會遺漏條款。最後,失敗會悄悄發生:“我找到兩份包含終止罰金的合約"這句話,無論代理人是檢查了全部 300 份還是僅略讀了 40 份,都會一樣。回覆中沒有告訴你是哪兩份。

索引可以消除第一個問題,同時揭露第三個問題。問題「哪些檔案包含這些字詞」有確切答案,搜尋工具會回傳結果並附上可供檢查的計數。

正確的流程應該是什麼樣子?

先建立一次索引,然後搜尋,再讀取符合的結果。以下是我們在測試中,對五份合成合約(其中兩份含罰金條款,另一份 NDA 雖提到兩個字詞卻排除罰金)所得到的伺服器回應:

-> add_to_index {"documentsPath":"contracts","indexName":"contracts"}
<- Indexed 'contracts' into index 'contracts': 5 document(s) added,
   5 in the index.

-> search {"query":"termination penalty","indexName":"contracts"}
<- { "documentsFound": 0,
     "hint": "Unquoted words separated by spaces do not match. Search the
              phrase as \"termination penalty\", or combine the words with
              AND / OR, e.g. termination AND penalty." }

-> 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 ===
     …a termination penalty of three monthly fees applies, payable
     within 30…
   === contracts/globex-consulting-agreement.docx ===
     …Early termination penalty: the Client pays 50 percent of the fees…

這三個結果教了我們什麼?

第一個查詢失敗,且伺服器說明了原因。 在 GroupDocs.Search 中,未加引號的空格分隔字詞不會被視為片語匹配。伺服器不會僅回傳零結果,而是附加 hint 來說明如何修正,代理人會在下一次呼叫時自行更正。這是最常見的首次錯誤,且已在回應本身處理。

AND 找到三筆,片語找到兩筆。 AND 會在每份文件內評估。Initech NDA 在句子 “There is no fee and no penalty associated with termination of this NDA” 中同時出現兩個字詞。僅看搜尋結果的模型會將其計入;但若閱讀該段落,模型會把 NDA 另列為明確排除罰金的合約。這層區別正是第三次呼叫的全部價值。

格式不影響結果。 匹配來自 PDF 與 DOCX,且同一索引中還有一份 TXT 合約。引擎支援 82 種格式,因此十年來使用不同工具產生的資料夾,只要一次查詢即可涵蓋所有檔案。

呼叫順序

user              agent                         Search MCP server
 |  "Which contracts mention a termination penalty?"           |
 |---------------->|                                           |
 |                 |-- add_to_index (once) ------------------>|
 |                 |-- search {"query":"termination AND       |
 |                 |           penalty"} -------------------->|
 |                 |<- 3 files --------------------------------|
 |                 |-- get_text_fragments {"query":           |
 |                 |   "\"termination penalty\""} ----------->|
 |                 |<- the two clauses, with context ----------|
 |<- "Acme: 3 monthly fees (12.3). Globex: 50% of remaining    |
 |    fees. Initech NDA: explicitly no penalty."               |

首次建立索引後,每個新問題只需兩次呼叫,無論合約有多少。*「哪些合約有不可抗力條款?」的查詢是 "force majeure"。「哪些租約會自動續約?」*的查詢是 renewal OR renews,而段落會說 “renews automatically for 12 months unless notice is given”。關於通知期限的條款則是 terminat? AND notice,其中 ? 代表任意單一字元,可匹配 terminate。

人類仍在迴路中的角色

這不是合約審查,也不應假裝是。索引會找到並引用文字;代理人則對引用的內容進行摘要。兩個習慣可以保持其誠實性:對每個主張都要求提供引用,讓錯誤的摘要能在旁邊的原句中被看見;同時也要求列出「提到關鍵字但未包含條款」的合約,因為這些情況最需要讀者的判斷。

誠實的限制

  • 在評估模式下,索引最多容納 100 份文件,搜尋最多返回 10 筆,且每個回應都會說明此限制。正式執行前請先呼叫 get_license_status,因為受限的答案看起來會很完整。
  • 未含文字層的掃描合約僅會根據檔案屬性建立索引,沒有 OCR 功能。
  • 全文搜尋僅匹配字詞:代理人必須使用合約的詞彙,或嘗試不同變形。
  • 不支援從已索引的資料夾中移除單一檔案;只能刪除整個資料夾再重新加入需要的檔案。

常見問題

AI 代理人可以在不上傳合約的情況下搜尋所有合約嗎?
可以。索引與搜尋都在您機器上的容器內完成,只有代理人引用的條款會傳遞給模型。

它能處理多少合約?
只要您的磁碟與記憶體允許,皆可處理;索引只會建立一次,之後以增量方式更新。評估模式每個索引上限為 100 份。

為什麼搜尋兩個字詞時什麼都找不到?
未加引號的字詞不會被視為片語匹配。請加上引號,例如 "termination penalty",或使用 AND 連接字詞;伺服器的 hint 會說明相同的原因。

深入了解