每次新的聊天都會從一個忘記了您文件的代理開始。它可以重新閱讀這些文件,代價是時間和上下文,或者它可以查詢能夠記住的東西。GroupDocs.Search.Mcp 在本地磁碟上保留一個具名的全文索引,該索引在會話和容器重啟之間仍然存在,因此 Claude Desktop、Cursor 或 Copilot 在每個會話開始時,項目的文件已經可搜尋,並在文件變更時只需一次呼叫即可刷新它們:

我編輯了一些合約。請刷新合約索引,然後告訴我現在哪些合約提到了罰金。

帶有配置和故障排除的逐步說明位於文件中: 如何在文件變更時保持文檔索引的最新.

「記憶」對於代理而言意味著什麼?

實際上,有兩件事:會話之外持續存在的狀態,以及保持該狀態正確的低成本方式。聊天歷史在這兩方面都失敗:它隨會話結束而終止,且在文件變更時不會自動更新。搜尋索引更適合文件。它與文件一起存放在磁碟上,能在不載入文件的情況下回答「哪些文件說了 X」,且可以增量刷新。

session 1    add_to_index --> index "contracts" --+
                                                 |  kept on disk in
session 2    search, get_text_fragments <--------+  /data/.groupdocs-search-
             (nothing is re-read)                    index/contracts
files edit   update_index --> re-reads changed, added, deleted files only
new project  create_index {"indexName":"legal-2026"} --> a separate index

刷新是如何運作的?

update_index 會將索引與磁碟上的文件進行比較,僅重新讀取有變更的部分。以下是我們測試中伺服器返回的結果,當一份合約在兩次呼叫之間加入了罰金條款時:

-> get_index_info {"indexName":"contracts"}
<- { "documentCount": 5, "indexedPaths": [ "contracts" ],
     "documentsWithErrors": [], "status": "Ready" }

-> update_index {"indexName":"contracts"}
<- Index 'contracts' updated: 0 added, 1 updated, 0 removed;
   5 document(s) in the index.

-> search {"query":"penalty","indexName":"contracts"}
<- documentsFound 3, including the edited initech-nda.docx

計數告訴您發生了什麼:重新讀取了一個文件,其他未受影響。已刪除的文件會在同一次呼叫中消失。

為什麼每個專案需要一個索引?

因為不同的語料庫應該得到不同的答案。關於今年合約的問題不應該顯示去年的草稿,客戶的文件也不應與另一個客戶的混合。索引名稱成本低廉:

-> create_index {"indexName":"legal-2026"}
<- Index 'legal-2026' created. Add documents with add_to_index
   (indexName: 'legal-2026').

每個索引都是位於 /data/.groupdocs-search-index 下的資料夾,且在未指定名稱時 get_index_info 會列出所有索引。您很少需要顯式呼叫 create_index,因為 add_to_index 會在首次使用時建立索引,但刻意命名則能將「一個索引」轉變為「此專案的記憶」。

關於移除的唯一規則

引擎會移除已加入的路徑,而不是其中的單一文件。當您嘗試時,伺服器會明確說明:

-> remove_from_index {"documentPath":"contracts/hooli-supply-terms.txt",...}
<- Removal failed for 'contracts/hooli-supply-terms.txt':
   'contracts/hooli-supply-terms.txt' is inside the indexed folder
   'contracts'. GroupDocs.Search removes whole indexed paths only: ...

因此請依此設計:如果您預計日後會刪除語料庫的一部分,例如某一年、某個客戶或草稿,請將這些部分作為獨立路徑(contracts/2025、contracts/2026)建立索引,且每個路徑都可以單獨移除。刪除磁碟上的文件並執行 update_index 也會將其移除。

在不主動詢問的情況下保持最新

create_index (optional)
      |
      v
add_to_index ---> search ---> get_text_fragments
      ^              ^
      |              |  get_index_info: counts, paths, status
update_index  (files changed on disk)
      |
remove_from_index  (only a path that was given to add_to_index)

三種實用方式可使刷新自動化:

  1. 在代理的指示中。 在 CLAUDE.md 或 AGENTS.md 中加入一行:「在回答之前,如果文件可能已變更,請呼叫 update_index 以更新此專案的索引」,即可讓代理在會話開始時執行此操作。
  2. 按排程。 任何支援 MCP 的自動化都可以在每晚呼叫 update_index;當變更很少時,呼叫速度很快。
  3. 在大量複製之後。 一次呼叫即可抓取所有新增的文件。

索引亦能在升級後存活:由 GroupDocs.Search 22.7 到 26.8 建立的索引會在首次使用時轉換,且會在旁邊保留備份。

代理決定的事與索引執行的事

代理決定的事 索引執行的事
問題屬於哪個索引 將每個具名索引保存在其自己的資料夾中
文件何時可能已變更 僅重新讀取已變更、已新增和已刪除的文件
要搜尋哪些詞彙,以及嘗試哪些變體 匹配詞彙、片語、範圍;回報它找到的詞彙
引用多少上下文 返回包含請求字數前後的段落
要告訴您什麼 無:僅返回計數、路徑和文字,永不給出結論

這種分工是刻意的。判斷仍由模型掌握,而其推理所依賴的事實則來自您可以檢查輸出的工具。

誠實的限制

  • 在評估模式下,索引最多容納 100 份文件,搜尋最多返回 10 筆結果。請在依賴索引作為真實來源之前呼叫 get_license_status。
  • 索引僅在 /data(或索引卷)為掛載的主機資料夾時才會持久化;否則會隨容器消失。
  • 索引包含文件的文字內容:請像保護文件本身一樣保護並處置它。
  • 僅限 Docker;在 Linux 上加入 --user "$(id -u):$(id -g)" 以讓容器能寫入索引。

常見問題

代理會在會話之間記住我的文件嗎?
有持久化索引時,會的:索引保留在磁碟上,下一個會話會直接搜尋它,而不需要重新讀取任何文件。

當文件變更時,我需要重新建立索引嗎?
不需要。update_index 只會重新讀取已變更、已新增和已刪除的文件。

我可以將索引與唯讀文件分開嗎?
可以。將文件以唯讀方式掛載,將可寫入的資料夾掛載到 /index,並設定 GROUPDOCS_MCP_INDEX_PATH=/index。

深入了解