“我们的哪些合同带有终止罚金?” 听起来像是 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。
- 全文搜索匹配单词:代理必须使用合同中的词汇,或尝试变体。
- 不支持从已索引文件夹中移除单个文件;只能删除整个文件夹后重新添加所需文件。
FAQ
AI 代理可以在不上传合同的情况下搜索所有合同吗?
可以。索引在您机器上的容器中构建并搜索,只有代理引用的条款会发送给模型。
它能处理多少份合同?
已授权的情况下,受磁盘和内存限制;索引只会构建一次并增量更新。评估模式下每个索引最多 100 份。
为什么我的两词搜索没有返回结果?
未加引号的词不会匹配短语。请加引号,如 "termination penalty",或使用 AND 连接词;服务器的 hint 已说明相同内容。
深入了解
- 文档、权威操作指南:如何使用 AI 代理在合同文件夹中提问
- 文档中心:GroupDocs.Search MCP Server
- 入门指南:是否需要向量数据库来对文档文件夹提问?
- 相关内容:从文件中获取有依据的答案:引用段落,而非模型记忆
- 相关内容:grep 读取不了 PDF:为你的编码代理提供文档索引
- 相关内容:使用 AI 代理搜索邮件存档:PST、MSG、EML 及其附件
- 相关内容:AI 代理的项目记忆:每个项目一个索引,保持最新
- 本地部署与安全模型:AI 文档处理的三种架构,以及保持文件在内部网络的方案
- 问题讨论:GroupDocs Search 论坛
- 源代码:GroupDocs.Search.Mcp on GitHub