MCP Hybrid Search Mode là gì?
GoClaw hỗ trợ kết nối nhiều MCP server cùng lúc, mỗi server cung cấp hàng chục tool (database query, file ops, messaging, v.v.). Khi tổng số tool vượt quá 40, hệ thống không thể nhồi mô tả tất cả vào system prompt — sẽ tốn quá nhiều token và gây nhiễu cho LLM.
Hybrid Search Mode giải quyết bài toán này: giữ 40 tool phổ biến nhất inline trong registry (LLM thấy ngay mô tả), đẩy phần còn lại vào BM25 search index để khám phá theo nhu cầu qua mcp_tool_search. Kết quả: cân bằng giữa khả năng khám phá và hiệu quả token.
Tính năng hoạt động qua ba tầng:
- Partitioning Layer — Khi agent khởi động,
maybeEnterSearchMode()phân chia tool thành inline (giữ trong registry) và deferred (lưu trong bộ nhớ) - Discovery Layer — BM25 index được xây dựng từ tên server + tên tool + mô tả. LLM gọi
mcp_tool_searchvới keyword tiếng Anh để tìm tool - Activation Layer — Tool tìm được sẽ được kích hoạt ngay lập tức (3-phase locking) và sẵn sàng gọi trong cùng lượt
Tại sao cần Hybrid Mode?
Mỗi MCP server có thể cung cấp 10–50 tool. Một agent kết nối 3–5 server dễ dàng vượt 100 tool. Mỗi tool cần mô tả trong system prompt (~50 token/tool) → 5,000+ token chỉ cho danh sách tool — chiếm một phần đáng kể context window.
Khi vượt ngưỡng, tất cả tool bị ẩn khỏi registry. LLM phải gọi mcp_tool_search cho mọi thao tác — kể cả tool phổ biến như query database.
40 tool đầu tiên giữ inline (có mô tả). Phần còn lại defer → tìm qua BM25. Tool phổ biến luôn sẵn sàng, tool hiếm vẫn khám phá được.
Kiến trúc phân tách Inline / Deferred
Ctrl/Cmd + wheel để zoom · Kéo để pan · Double-click để fit
Cấu trúc dữ liệu Manager
Manager là trung tâm điều phối. Sau khi vào hybrid mode, state gồm:
40 tool đầu — registered trong tools.Registry, thuộc group "mcp". LLM thấy mô tả (truncated 200 ký tự) trong system prompt. Gọi trực tiếp, không cần tìm kiếm.
Tool thừa — lưu trong deferredTools map[string]*BridgeTool. Không có trong registry, không có mô tả trong prompt. Tìm thấy qua mcp_tool_search → kích hoạt theo nhu cầu.
Thuật toán phân tách
Hàm maybeEnterSearchMode() chạy sau khi tất cả MCP server đã load xong. Logic: xây dựng một deferSet chứa tên tool từ index 40 trở đi, sau đó duyệt qua từng server, giữ lại tool inline và di chuyển tool dư vào deferredTools:
BM25 Search Engine
BM25 (Best Matching 25) là thuật toán xếp hạng văn bản cổ điển trong lĩnh vực truy xuất thông tin. GoClaw sử dụng BM25 để xếp hạng các tool deferred dựa trên keyword query từ LLM.
Xây dựng Index
Mỗi tool deferred được biểu diễn thành một "tài liệu" gồm: server_name + tool_name + description. Ví dụ tool query trên server postgres:
Tokenization
Quy trình token hóa: chuyển thành chữ thường → loại bỏ dấu câu (giữ chữ cái và số) → tách theo khoảng trắng → lọc token đơn ký tự. Ví dụ: "create-github-issue" → ["create", "github", "issue"].
Công thức BM25
Với mỗi query token, BM25 tính điểm kết hợp IDF (từ hiếm có trọng số cao hơn) và TF (tần suất xuất hiện trong tài liệu, với saturation):
| Tham số | Giá trị | Ý nghĩa |
|---|---|---|
k1 | 1.2 | Saturation — hạn chế ảnh hưởng của tần suất lặp từ. Giá trị cao = phân biệt mạnh hơn giữa TF cao/thấp |
b | 0.75 | Length normalization — 0 = bỏ qua độ dài, 1 = chuẩn hóa hoàn toàn. 0.75 là trung bình cổ điển |
maxResults | 5 | Số tool trả về tối đa mỗi lần tìm kiếm |
Thiết kế System Prompt
Điểm khác biệt lớn nhất của hybrid mode: cả hai section xuất hiện đồng thời trong system prompt. LLM vừa thấy danh sách tool inline (với mô tả ngắn), vừa biết rằng còn tool khác có thể tìm qua search.
Liệt kê từng tool inline với mô tả (truncated ở 200 ký tự). Format: - mcp_server__tool: description...
Hướng dẫn LLM dùng mcp_tool_search để khám phá tool không có trong danh sách inline. Tool tìm được sẽ kích hoạt ngay lập tức.
Quy trình kích hoạt 3-Phase
Khi LLM gọi mcp_tool_search, kết quả BM25 trả về danh sách tool khớp. Các tool này cần được di chuyển từ deferredTools vào registry. Thao tác này sử dụng 3-phase locking để tránh deadlock giữa Manager lock và Registry lock.
Ctrl/Cmd + wheel để zoom · Kéo để pan · Double-click để fit
Giữ RLock trên Manager. Duyệt danh sách tên, kiểm tra tool có trong deferredTools và chưa có trong registry. Thu thập []*BridgeTool cần kích hoạt. Giải phóng RLock.
Không giữ lock nào trên Manager. Gọi registry.Register(bt) cho mỗi tool. Điều này tránh deadlock vì Registry có lock riêng.
Giữ WLock trên Manager. Xóa tool khỏi deferredTools, thêm vào activatedTools. Cập nhật tool group "mcp" với danh sách mới. Giải phóng WLock.
Kích hoạt trực tiếp theo tên
LLM không bắt buộc phải gọi mcp_tool_search trước. Nếu LLM biết tên tool (qua context trước đó hoặc kiến thức sẵn có), nó có thể gọi thẳng tool deferred bằng tên. Agent loop sẽ thử lazy activation:
Hàm TryActivateDeferred() trong Registry gọi callback đến Manager's ActivateToolIfDeferred(), di chuyển tool từ deferred vào registry nếu tồn tại. Quá trình hoàn toàn trong suốt với LLM — tool được kích hoạt và thực thi trong cùng một lượt.
- Không cần search trước — LLM đã biết tên tool từ conversation context? Gọi thẳng, không mất thêm một lượt
- Transparent — Tool activation xảy ra ẩn bên trong, LLM không cần biết tool đang ở trạng thái inline hay deferred
- Thread-safe —
ActivateToolIfDeferred()sử dụng write lock để đảm bảo an toàn khi nhiều goroutine gọi đồng thời
Nâng Skill Inline Count 40 → 60
Song song với MCP hybrid mode, v2.56.0 cũng nâng ngưỡng inline cho skills (một hệ thống tương tự nhưng dành cho prompt-based tools) từ 40 lên 60. Lý do: skill descriptions thường ngắn hơn MCP tool descriptions, nên token limit mới là bottleneck thực sự, không phải số lượng.
skillInlineMaxCount = 40
Nhiều skill hữu ích bị đẩy sang search mode dù vẫn thừa token budget
skillInlineMaxCount = 60
Nhiều skill hơn inline, vẫn giữ token budget dưới 5,000 token nhờ check kép
Skill inline mode sử dụng kiểm tra kép: cả số lượng skill LẪN estimated tokens phải dưới ngưỡng:
Tham chiếu cấu hình
Tất cả giá trị cấu hình đều là hằng số compile-time. Bảng dưới liệt kê đầy đủ:
| Hằng số | File | Giá trị | Mục đích |
|---|---|---|---|
mcpToolInlineMaxCount |
manager.go | 40 | Ngưỡng kích hoạt hybrid search mode cho MCP tools |
mcpToolDescMaxLen |
systemprompt_sections.go | 200 | Ký tự tối đa cho mô tả tool inline (~50 token) |
skillInlineMaxCount |
loop_history.go | 60 | Ngưỡng kích hoạt search mode cho skills |
skillInlineMaxTokens |
loop_history.go | 5000 | Token budget tối đa cho skill descriptions inline |
k1 |
bm25_index.go | 1.2 | BM25 term frequency saturation |
b |
bm25_index.go | 0.75 | BM25 document length normalization |
File tham chiếu
| File | Vai trò |
|---|---|
| internal/mcp/manager.go | Hybrid mode orchestration, 3-phase activation |
| internal/mcp/bm25_index.go | BM25 indexing & scoring |
| internal/mcp/mcp_tool_search.go | Search tool implementation + index rebuild |
| internal/agent/systemprompt_sections.go | Inline + search section builders |
| internal/agent/loop_history.go | Skill inline threshold + prompt building |
| internal/agent/loop.go | Lazy activation check in agent loop |
GoClaw v2.56.0 MCP Hybrid Search Mode
Built with Go · BM25 · MCP Protocol