Homus
‹ All talks

The 100-Tool Agent Is a Trap: Scaling with Semantic Routers and JIT Context

AI Engineer World's Fair 2026: Online Track · Video gốc

Nạp mọi tool vào prompt làm accuracy rơi từ 78% xuống 13% ở 741 tool; semantic routing (RAG cho tool) với JIT context giữ trên 83% và cắt 99% token.

AgentsContext EngineeringModel Routing

1. Cái bẫy trông vô hại: đưa cho agent mọi tool cùng một lúc

Sohail mở đầu bằng cách chào mọi người, giới thiệu mình và người cùng trình bày là Ankush. Chủ đề của hai anh là một sai lầm lúc đầu trông hoàn toàn vô hại: cấp cho một AI agent quyền truy cập vào mọi tool mà nó có thể sẽ cần, tất cả cùng một lúc. Cách làm này chạy tốt trong demo. Nó thậm chí còn chạy ổn khi số tool còn nhỏ, chẳng hạn khoảng mười tool. Nhưng khi catalog tool lớn dần, agent bắt đầu chậm đi, có thể đắt hơn, và kém chính xác hơn. Đó là lý do hai anh gọi hiện tượng này là "the hundred tool agent trap", cái bẫy của agent một trăm tool.

Trong khoảng nửa tiếng, hai anh hứa sẽ cho thấy vì sao thiết kế đó vỡ, các con số trông như thế nào, và semantic routing kết hợp với just-in-time context giúp sửa vấn đề ra sao.

Slide tiêu đề The 100-Tool Agent Is a Trap
Slide tiêu đề: "The 100-Tool Agent Is a Trap", phụ đề "Scaling with Semantic Routers and Just-In-Time Context", dành cho các engineer đang build LLM agent. Hai diễn giả trình bày từ xa, hình của họ ở cột bên phải.

Sohail tự giới thiệu: anh là Sohail Shaikh, hiện làm data scientist ở Prosodica. Background của anh trải qua AI, NLP, marketing, analytics và cả engineering. Trọng tâm hiện tại của anh là applied AI, NLP, conversational intelligence, cùng với các hệ RAG. Anh đặc biệt quan tâm tới việc làm cho AI system đáng tin cậy hơn, đo lường được, và scale được vượt ra khỏi demo để chạy trong production.

Ankush tiếp lời: anh là Ankush Rastogi, senior data solutions engineer ở Prosodica, đã làm hơn mười năm trong AI, data engineering và các production system. Anh nói rõ góc nhìn của mình là phía engineering: câu hỏi không phải là thứ gì chạy được trong notebook, mà là nó có sống sót được với tải thật, user thật và lỗi thật hay không. Đó cũng là góc mà cả talk đi theo. Hai anh chia vai rõ ràng: Sohail tập trung vào hành vi của model và của routing, còn Ankush tập trung vào system design, cách implement và các trade-off khi lên production.

Slide giới thiệu hai diễn giả Ankush Rastogi và Sohail Shaikh
Slide "The Presenters": Ankush Rastogi, Senior Data Solutions Engineer ở Prosodica LLC và IEEE Senior Member, hơn 10 năm trong data engineering, AI system, production analytics và triển khai LLM cho doanh nghiệp; Sohail Shaikh, Data Scientist ở Prosodica LLC, hơn 9 năm trong AI, NLP, conversational intelligence, RAG pipeline, semantic search và production LLM workflow.

Prosodica là công ty làm conversation analytics: biến các cuộc hội thoại (chẳng hạn cuộc gọi ở contact center) thành insight vận hành, chấm điểm cuộc gọi tự động và đưa insight theo thời gian thực.

2. Fat agent: kiến trúc ngây thơ chạy đẹp trong demo

Sohail bắt đầu bằng một thiết kế rất phổ biến. Bạn build một hệ thống làm được nhiều việc: query database, gửi email, kiểm tra calendar, tra cứu một đơn hàng, gọi một API, và cứ thế tiếp tục. Cách đơn giản nhất ở đây là đưa cho model định nghĩa của mọi tool trong mọi request. Mọi function name, mọi description, và cả mọi JSON schema đều đi vào prompt, bất kể user có cần tới chúng hay không. Hai anh gọi thiết kế này là fat agent.

Ở quy mô nhỏ, cảm giác mọi thứ đều ổn. Với mười tool, model thường chọn đúng. Demo trông rất đẹp. Rồi sản phẩm lớn lên. Mười tool trở thành ba mươi, rồi tiếp tục tăng, và đến một lúc model bắt đầu gọi sai function, nhầm lẫn giữa các tool giống nhau, tự bịa ra tên tool không tồn tại, và mất nhiều thời gian hơn để trả lời.

Điểm quan trọng mà Sohail nhấn mạnh: thiết kế này không hỏng vì có một tool nào đó viết tệ. Nó hỏng vì mọi request đều bị bắt phải mang theo toàn bộ catalog.

Slide The Fat Agent Trap với sơ đồ mọi request mang theo hơn 100 tool schema
Slide "The Fat Agent Trap". Bên trái là kiến trúc ngây thơ: đổ schema của mọi tool vào prompt ở mọi request, chạy hoàn hảo trong demo và vỡ trong production, kèm bốn hệ quả: Token Bloat (127.000 token cho 741 tool), Accuracy Crash (78% xuống 13% khi pool tool lớn dần), Cost Explosion (tới 99 lần nhiều token hơn bị tính tiền), Context Crowding (không còn chỗ cho reasoning thật). Bên phải: ở mọi request, User Query đi vào "LLM + ALL 100+ Tool Schemas", với lưới T1 đến T100 và "+85 more"; dòng chú thích nói mỗi token, mỗi request đều bị tính tiền và xử lý đầy đủ.

3. 741 tool, 127.000 token, và accuracy sụp từ 78% xuống 13%

Sohail đưa ra con số cụ thể. Giả sử toàn bộ schema của bạn có 741 tool. Chỉ riêng phần description của tất cả các tool đó đã chiếm tới khoảng 127.000 token. Và đó là trước khi câu hỏi thật của user được tính tới. Kết quả là context overload, và cần quản lý nó cho đúng.

Slide tiếp theo cho thấy vì sao thiết kế thất bại và vì sao accuracy sụp đổ sau một ngưỡng. Nhìn vào đường accuracy: với mười tool, fat agent chọn đúng tool khoảng 78% số lần. Chưa hoàn hảo, nhưng dùng được. Tới khoảng một trăm tool, accuracy rơi xuống quanh 40%: chưa tới một nửa số tool được gọi là tool đúng. Và nếu catalog còn lớn hơn nữa, như ở mức 741 tool, accuracy chỉ còn vỏn vẹn 13%. Nói ngắn gọn, khoảng một tool đúng trên tám lần gọi.

Đặt cạnh đó là semantic router, và nó hành xử hoàn toàn khác: accuracy giữ trên 83% ở cùng các kích thước catalog đó. Lý do là model không còn phải chọn từ hàng trăm tool nữa. Nó chỉ chọn trong một tập nhỏ và liên quan.

Slide Accuracy Collapses With Scale: 78%, 40%, 13%
Slide "Accuracy Collapses With Scale": ba ô số 78% (accuracy ở 10 tool), 40% (ở 100 tool), 13% (ở 741 tool). Biểu đồ bên dưới vẽ tool selection accuracy theo kích thước pool tool (10, 50, 100, 200, 741): đường đỏ của fat agent (nạp mọi tool) đi xuống đều, đường xanh "With Semantic Router" gần như nằm ngang ở mức cao.

4. Lost in the middle: vì sao prompt to làm quyết định khó hơn

Một lý do khiến fat agent thất bại là vấn đề lost in the middle. Model chú ý mạnh hơn vào phần đầu và phần cuối của một context dài. Khi hàng trăm tool schema bị nhồi vào giữa, model không dùng chúng một cách đáng tin cậy. Thế là ta trả tiền cho một prompt khổng lồ, và chính prompt đó lại làm cho quyết định càng khó hơn.

Hiện tượng này đã được đo trong nghiên cứu "Lost in the Middle: How Language Models Use Long Contexts" (Liu và cộng sự, 2023): khi thông tin cần dùng nằm ở giữa một context dài, độ chính xác của model giảm rõ so với khi nó nằm ở đầu hoặc cuối, tạo thành một đường cong hình chữ U. Với fat agent, tool đúng cho câu hỏi hiện tại rất dễ rơi đúng vào vùng giữa đó.

Vị trí trong context window Mức chú ý hàng trăm tool schema bị nhồi vào giữa system prompt câu hỏi user
Lost in the middle: model chú ý mạnh nhất vào đầu và cuối context. Khi hàng trăm tool schema nằm ở vùng giữa, tool đúng dễ bị bỏ qua, dù prompt rất đắt.

5. Cái thuế ẩn: cost và latency tăng theo số tool

Ngoài accuracy, Sohail nêu thêm hai lý do nữa: latency và cost. Quay lại ví dụ 741 tool cần gần 127.000 token, bao gồm cả description lẫn phần text của schema. Chi phí đó bị trả ở mọi request. Nếu đẩy hệ thống lên production với 100.000 request mỗi ngày, bạn đang gửi đi hàng tỉ token chỉ để mô tả tool. Với just-in-time routing, prompt có thể chỉ chứa ba tới năm schema liên quan, khoảng 1.000 token. Tức là giảm khoảng 99% lượng token dành cho tool context.

Để thấy quy mô: 127.000 token nhân 100.000 request là khoảng 12,7 tỉ input token mỗi ngày chỉ cho phần mô tả tool, so với khoảng 100 triệu token nếu mỗi request chỉ mang khoảng 1.000 token.

Vấn đề tiếp theo là latency. Với fat agent, time to first token (TTFT) tăng theo kích thước catalog, vì model phải xử lý một prompt lớn hơn trước khi có thể trả lời câu hỏi của user. Ví dụ, nếu agent của bạn có 500 tool, đường đi của fat agent có thể đẩy latency của token đầu tiên vượt quá năm giây. Điều này đặc biệt quan trọng nếu sản phẩm của bạn là real-time: hệ thống sẽ trả lời lâu hơn, khiến thiết kế có cảm giác chậm và khó đoán. Với semantic routing, hệ thống phản hồi nhanh hơn và mang cảm giác real-time hơn.

Slide Latency and Cost Scale Against You với 127K, ~1K và 99%
Slide "Latency & Cost Scale Against You": 127K token khi nạp 741 tool, khoảng 1K token với JIT routing, giảm 99% token. Biểu đồ cột TTFT (ms) theo số tool trên GPT-4o: cột đỏ của fat agent tăng dần qua 10, 50, 100, 200 và vọt lên hơn 5.000 ms ở 500 tool, còn cột xanh của semantic router gần như không thấy vì quá thấp.

6. So sánh trực diện: fat agent và semantic router

Tiếp theo là một bảng so sánh gọn: bên trái là fat agent, bên phải là semantic router. Với fat agent, mọi schema được nạp cho mọi request, bất kể user hỏi gì. Vì vậy catalog lớn lên thì prompt lớn lên, latency tăng và accuracy giảm. Agent cũng trở thành một khối monolithic lớn, khó test, rủi ro khi update và rất mệt khi debug.

Với thiết kế semantic routing, agent không khởi đầu với mọi tool. Router nhìn vào câu hỏi của user trước, lấy ra ba tới năm tool liên quan nhất, rồi chỉ inject những tool đó vào lời gọi model. Context vì thế giữ nhỏ, latency ổn định, và accuracy giữ được vì model chọn từ một danh sách tập trung thay vì một catalog khổng lồ.

Ankush thêm một lưu ý quan trọng: nếu bạn có ít hơn 20 tool, router có thể là không cần thiết, cứ nạp tool trực tiếp. Nhưng khi hệ thống production vượt quá 50 tool, thiết kế dựa trên router bắt đầu hợp lý hơn.

Bảng Architecture Comparison giữa Fat Agent và Semantic Router + JIT
Slide "Architecture Comparison", bảng hai cột. Context token: fat agent rất cao (mọi schema, mọi lần gọi), router rất thấp (chỉ 3 đến 5 tool liên quan). Latency (TTFT): tăng tuyến tính theo số tool, so với gần như phẳng vì embedding search chỉ tốn vài ms. Tool accuracy: rơi từ 78% xuống 13% ở quy mô lớn, so với trên 83% kể cả ở hơn 700 tool. Token cost: tuyến tính, 127K token ở 741 tool, so với tiết kiệm khoảng 99%, khoảng 1K token mỗi request. Scalability: vỡ quanh 100+ tool, so với ổn định ở 740+ tool. Modularity: monolithic, khó debug, so với tách rời, test được từng thành phần. Khi nào dùng: dưới 20 tool và demo nhỏ, so với trên 50 tool và hệ thống production.

7. Semantic routing hoạt động ra sao: RAG cho tool

Sohail cảm ơn Ankush rồi đi vào cơ chế. Nếu bạn từng build một hệ RAG, phần này sẽ rất quen. Khác biệt duy nhất là ta retrieve tool thay vì document.

Ở bước đầu tiên, mỗi tool cần có một description rõ ràng. Ví dụ một tool search flights, một tool kiểm tra lịch trống trên calendar, hay một tool tra trạng thái đơn hàng của khách. Bước thứ hai: các description đó được embed và lưu vào một vector index. Việc này thường làm offline, khi catalog tool được tạo ra hoặc được cập nhật.

Lúc runtime, user đặt câu hỏi. Ta embed câu hỏi đó bằng đúng embedding model đã dùng cho description, rồi search trong vector index để tìm những tool có description gần với câu hỏi nhất. Router trả về top K tool, thường K là ba hoặc năm tool khớp với câu hỏi, và chỉ những schema được chọn đó mới được inject vào lời gọi model.

Toàn bộ pattern gói lại như sau: index tool description offline, retrieve tool liên quan lúc runtime, và giữ cho context của model tập trung. Nói ngắn gọn, ý tưởng rất đơn giản: semantic routing chính là RAG cho tool. Nếu stack của bạn đã có một embedding model và một vector database, phần lớn hạ tầng ở đây bạn đã quen thuộc rồi.

Slide How Semantic Routing Works: User Query, Embed Query, Vector Search, Top-K Tools, LLM Call, Response
Slide "How Semantic Routing Works": chuỗi User Query, Embed Query, Vector Search, Top-K Tools, LLM Call, Response. Bên dưới là Tool Vector Database, được index trước một lần offline, với các tool như get_weather, search_flights, book_hotel, send_email, calendar_event, stock_price, run_sql_query, translate_text, pdf_extract và "+700 more". Dòng gợi ý cuối: hãy nghĩ về nó như RAG, nhưng cho tool thay vì document; cùng logic retrieval, khác loại artifact.

8. Just-in-time context injection: chỉ nạp thứ cần, đúng lúc cần

Ankush cảm ơn Sohail rồi đi sâu vào just-in-time context injection. Anh phân biệt hai lớp: semantic routing là retrieval layer, còn just-in-time context injection là chiến lược quản lý context.

Với fat agent, mọi thứ được nạp trước khi câu hỏi được hiểu: model nhận một danh sách tool khổng lồ trước, rồi mới cố gắng reasoning xuyên qua nó. Just-in-time context làm ngược lại: nó chờ tới khi biết câu hỏi, rồi mới inject đúng phần context cần cho request đó.

Ankush nhắc rằng đây không phải ý tưởng mới trong software. Chúng ta đã dùng lazy loading, just-in-time compilation và on-demand resource loading từ nhiều năm nay. Ở đây ta chỉ áp dụng cùng nguyên lý đơn giản đó cho context của LLM.

Anthropic đã viết về pattern này với việc nạp tool theo nhu cầu qua MCP. Theo báo cáo của họ, lượng token dùng giảm từ khoảng 150.000 xuống còn 2.000, tức giảm 98,7%. Với Ankush, đó là tín hiệu rõ ràng: catalog tool lớn không nên bị đổ vào mọi prompt, mà nên được retrieve khi cần. Bài viết đó là "Code execution with MCP" trên Anthropic Engineering Blog, trong đó agent chỉ đọc định nghĩa của những tool mà task hiện tại cần thay vì nạp tất cả từ đầu.

Slide Just-In-Time Context Injection so sánh Static Loading và JIT Injection
Slide "Just-In-Time Context Injection", hai cột đối đầu. Static Loading: mọi schema (100+) được nạp sẵn trong prompt, mọi request mang toàn bộ payload, phần lớn token phí cho tool không liên quan, context window bị schema chiếm, ít chỗ cho reasoning và output, accuracy giảm khi danh sách dài ra, và model chậm vì phải xử lý một context khổng lồ. JIT Injection: tool được chọn lúc runtime theo từng câu hỏi, chỉ 3 đến 5 schema liên quan được inject, context window gọn, nhiều chỗ hơn cho chuỗi reasoning, accuracy giữ trên 83% ở mọi quy mô, nhanh vì prompt nhỏ hơn, và lấy cảm hứng từ cơ chế on-demand loading với MCP của Anthropic.

9. Một benchmark plan có thể lặp lại

Chuyển sang slide tiếp theo, Ankush bàn về cách đánh giá cho công bằng. Hai anh đo bốn thứ: tool-selection accuracy, time to first token, số input token mỗi request, và chi phí ước tính cho mỗi một nghìn lần gọi.

Về dataset, họ dùng Berkeley Function Calling Leaderboard, các kịch bản theo kiểu SkillsBench, và các pool tool tổng hợp (synthetic) cho phép tăng số tool theo ý muốn, nhờ vậy test được ở mười, năm mươi, một trăm, hai trăm hay thậm chí 741 tool.

Họ chạy cùng một bộ câu hỏi ở hai chế độ, fat agent và semantic routing. Cùng model, cùng answer key, cùng catalog tool. Khác biệt duy nhất là model nhìn thấy mọi tool hay chỉ những tool đã được route.

Họ cũng quét K ở ba, năm và mười để hiểu trade-off. K nhỏ thì nhanh hơn và rẻ hơn. K lớn có thể cứu được thêm những edge case. Trong thực tế, K bằng năm là điểm khởi đầu mặc định tốt, nên nếu muốn thử, cứ đặt mặc định là năm. Ở đây K là số tool mà semantic router retrieve và đưa cho LLM cho mỗi câu hỏi của user.

Slide A Reproducible Benchmark Plan với Metrics, Datasets, Models, Experiment
Slide "A Reproducible Benchmark Plan", bốn ô. Metrics: tool selection accuracy (%), TTFT (ms), số input token mỗi request, chi phí ước tính cho 1.000 lần gọi. Datasets: Berkeley Function Calling Leaderboard, mẫu kịch bản SkillsBench, pool tool tổng hợp tự dựng, kích thước 10, 50, 100, 200, 741. Models: GPT-4o và GPT-4o-mini, Gemini 2.0 Flash, Llama 3 làm baseline open source, mỗi model test có và không có router. Experiment: mỗi tổ hợp model nhân kích thước pool, full so với router; độ nhạy K = 3, 5, 10; ghi accuracy, TTFT và token; lặp 10 lần mỗi điều kiện, báo cáo giá trị trung bình.

10. Kết quả benchmark: catalog lớn dần, working set vẫn nhỏ

Ankush trình bày kết quả. Ở biểu đồ bên trái, đường accuracy của fat agent rơi mạnh khi số tool tăng: bắt đầu quanh 78% ở mười tool, rồi rơi xuống khoảng 13% ở 741 tool. Còn đường của router giữ trên 83%, vì từ góc nhìn của model mọi thứ ổn định: nó luôn chỉ chọn trong một nhúm tool, dù catalog thật có tới hàng trăm.

Biểu đồ bên phải, time to first token, kể cùng một câu chuyện. Đường fat agent chậm dần khi thêm tool schema. Ở các catalog lớn, model tốn một khoảng thời gian đáng kể chỉ để xử lý prompt. Còn với router, đường gần như phẳng, vì kích thước prompt được kiểm soát.

Ankush chốt bài học cốt lõi của benchmark: catalog có thể lớn lên, nhưng working set của model phải luôn nhỏ.

Slide Benchmark Results với hai biểu đồ accuracy và TTFT theo số tool
Slide "Benchmark Results". Trái: Accuracy (%) theo số tool (10, 50, 100, 200, 741); đường đỏ baseline fat agent đi từ gần 80% xuống khoảng 13%, đường xanh có router đi từ khoảng 92% ở 10 tool xuống khoảng 83% ở 741 tool. Phải: TTFT (ms) theo số tool trên GPT-4o; đường đỏ cong lên gần 6.000 ms ở 741 tool, đường xanh nằm sát đáy.

11. Pattern ba bước để implement

Ankush chuyển sang implementation pattern, gồm ba bước.

Bước một chạy offline. Build một catalog tool. Với mỗi tool, lưu name, description và schema, rồi embed description và lưu vào một vector database. Bạn có thể dùng ChromaDB, Pinecone hay Qdrant, vector database nào bạn đang dùng cũng được.

Bước hai xảy ra ở mọi request. Embed câu hỏi của user, chạy nearest neighbor search, và trả về top K tool.

Bước ba cũng xảy ra ở mọi request. Fetch schema của những tool được chọn, chỉ đưa những schema đó vào lời gọi model, và log lại tool nào đã được chọn.

Ankush nhấn mạnh rằng logging ở đây thực sự quan trọng. Giả sử router bỏ sót một tool, và bạn muốn sửa lại description hoặc chỉnh K: bạn cần một hệ thống logging tốt để dựa vào. Overhead lúc runtime rất nhỏ, chỉ một lần gọi embedding và một lần vector search. Đổi lại là prompt nhỏ hơn nhiều và việc chọn tool ổn định hơn.

Slide 3 Step Implementation Pattern: Build Tool Index, Route Each Query, Inject and Call LLM
Slide "3 Step Implementation Pattern". Bước 1, Build Tool Index (offline, một lần): gom mọi tool name, description và JSON schema; embed từng description (OpenAI, Cohere, SentenceTransformers); index một lần rồi dùng lại mãi bằng cách lưu vector trong FAISS hoặc Pinecone. Bước 2, Route Each Query (runtime, mọi request): embed câu hỏi đến bằng cùng model; chạy approximate nearest-neighbor search trên tool index; lấy top-K tool (mặc định K = 5) và áp một ngưỡng cosine. Bước 3, Inject & Call LLM (runtime, mọi request): fetch JSON schema chỉ của các tool được chọn; dựng prompt chỉ với các schema đó trong tham số tools; gọi LLM, trả kết quả, log lại lựa chọn để monitor.

12. Semantic router bằng Python trong vài dòng

Sohail tiếp lời: sau khi đã hiểu implementation pattern, anh đi qua phiên bản code, và nó khá thẳng thắn. Ban đầu, bạn loop qua catalog tool, và với mỗi tool, như Ankush đã nói, embed description rồi lưu vào vector database cùng tên tool và các chi tiết khác.

Lúc runtime, embed câu hỏi của user, so sánh vector của câu hỏi với các vector tool đã lưu bằng cosine similarity hoặc vector search, lấy ra những tool liên quan nhất, rồi gọi model chỉ với các schema đó trong tham số function hoặc tool. Dòng cuối cùng là phần quan trọng nhất, vì model không nhận tất cả tool, nó chỉ nhận những tool đã được route.

Slide Semantic Router in Python với đoạn code semantic_router.py
Slide "Semantic Router in Python": file semantic_router.py với năm bước được đánh số trong comment (embed query, score tools, top-K, fetch, JIT). Ghi chú cuối slide: chạy được với mọi embedding model (OpenAI, Cohere, SentenceTransformers) và mọi vector DB (FAISS, Pinecone, Qdrant, ChromaDB).
# Offline: pre-compute tool embeddings once
tool_embeddings = {t["name"]: embed(t["description"])
                   for t in tool_db}

# Runtime: route each query, inject just-in-time
def route_and_call(query, K=5):
    q_emb  = embed(query)                          # 1 · embed query
    scores = {n: cosine_sim(q_emb, e)              # 2 · score tools
              for n, e in tool_embeddings.items()}
    top_K  = sorted(scores, key=scores.get)[-K:]   # 3 · top-K
    schemas = [t["schema"] for t in tool_db        # 4 · fetch
               if t["name"] in top_K]
    return llm.call(prompt=query, tools=schemas)   # 5 · JIT!

Cách này chạy với bất kỳ embedding model nào và với bất kỳ vector database nào. Như Ankush đã nói, bạn có thể bắt đầu với Qdrant hoặc một vector database khác chạy local, rồi chuyển sang một vector store managed sau nếu cần. Và nếu bạn đã có hạ tầng RAG, như hai anh nói từ trước, đây không phải hạ tầng mới: nó chính là pattern retrieval cũ, áp vào việc chọn tool.

Đoạn code trên là pseudocode: embed, cosine_sim và llm.call là chỗ bạn gắn embedding model, hàm tính similarity và SDK của LLM mình đang dùng. Với catalog lớn, phần tính score cho mọi tool trong vòng lặp thường được thay bằng một truy vấn nearest neighbor vào vector database.

13. Agent 200 tool với hai câu hỏi

Ankush cảm ơn Sohail rồi cho xem semantic routing trong thực tế. Hình dung bạn có một agent 200 tool. User hỏi: "Find me a flight to New York next Wednesday" (tìm cho tôi một chuyến bay tới New York vào thứ Tư tuần sau). Router embed câu hỏi đó và trả về các tool như search flights, book flight, calendar check. Model chỉ nhìn thấy những schema liên quan đó, nên khả năng nó gọi đúng tool cao hơn nhiều.

Nhưng nếu ta nạp cả 200 tool, thì tool khách sạn, tool thời tiết, tool email, tool SQL hay bất kỳ tool workflow không liên quan nào cũng sẽ tranh giành sự chú ý của model. Đó chính là lúc model bắt đầu chọn sai function.

Câu hỏi thứ hai: "What is the weather in Paris right now?" (thời tiết ở Paris lúc này thế nào?). Router trả về get weather và get forecast. Tool chuyến bay không được inject. Tool khách sạn không được inject. Ở request này, chúng đơn giản là không tồn tại.

Ankush chỉ ra một lợi ích hay bị đánh giá thấp: router không chỉ thêm tool đúng vào, nó còn loại tool sai ra khỏi tập lựa chọn của model.

Slide 200-Tool Agent - Two Queries: Travel Query và Weather Query
Slide "200-Tool Agent - Two Queries". Travel Query "Find me flights to NYC next Wednesday": router embed câu hỏi, khớp search_flights, book_flight, calendar_check, chỉ 3 schema được inject (khoảng 800 token), LLM gọi search_flights và có kết quả sau khoảng 220 ms; nhanh, chính xác, không có tool thừa. Weather Query "What's the weather in Paris right now?": router embed câu hỏi, khớp get_weather, get_forecast, không tool du lịch nào vào context, LLM gọi get_weather và có kết quả sau khoảng 195 ms; router chỉ cô lập các tool liên quan.

14. Checklist sáu bước để đưa vào production

Slide tiếp theo là implementation checklist, một checklist production cho ai muốn làm theo.

  1. Catalog tool ở một chỗ. Với mỗi tool, ghi name, description, schema, owner và version.
  2. Build index. Embed từng description và lưu các vector.
  3. Viết router. Embed câu hỏi, search index, lấy top K và fetch schema.
  4. Nối vào agent loop. Danh sách tool của model phải đến từ router, không phải từ một catalog đầy đủ hard-code.
  5. Evaluate. Chạy test set ở K bằng ba, năm và mười, rồi chọn K nhỏ nhất đạt được accuracy target.
  6. Monitor production. Log tool được chọn, tool call cuối cùng, failure và việc dùng fallback. Re-embed tool khi description hoặc schema thay đổi.

Ankush kết luận: đây không phải một cuộc viết lại platform kéo dài sáu tháng. Với phần lớn team, đó chỉ là một sprint tập trung.

Slide Implementation Checklist với sáu bước
Slide "Implementation Checklist": (1) Catalog Your Tools, gom mọi tool name, description và JSON schema vào một danh sách có cấu trúc; (2) Build the Embedding Index, embed từng description, lưu vector trong FAISS hoặc Pinecone, làm một lần; (3) Implement the Router, embed(query), similarity search, top-K, fetch schema; (4) Integrate Into the Agent Loop, thay danh sách function tĩnh bằng output của router ở mọi lần gọi; (5) Evaluate & Tune K, benchmark accuracy ở K = 3, 5, 10 trên một tập held-out và chọn điểm cân bằng; (6) Monitor & Iterate, log lựa chọn, cảnh báo khi trượt tool, re-embed khi catalog lớn lên.

15. Cộng đồng đã đụng cùng một bức tường

Slide tiếp theo nói về những gì cộng đồng đã xác nhận, để cho thấy đây không chỉ là quan sát của riêng hai anh. Anthropic đã công bố cơ chế nạp tool theo nhu cầu với MCP và báo cáo lượng token giảm từ 150K xuống 2K, một mức giảm rất lớn.

Developer cũng đã nêu những vấn đề tương tự trong các project agent và SDK phổ biến, chỉ ra rằng việc gửi toàn bộ định nghĩa tool ở mọi request có thể làm tăng latency, tăng token và khiến model nhầm tool. Các project open source như MCP-Zero cũng đã thử routing ở quy mô rất lớn, gồm hàng nghìn tool trải trên nhiều server. Và bạn có thể tìm thấy các bài trên forum của những người build đã gặp chuyện nhầm tool chỉ với vài tool, từ rất lâu trước khi chạm mốc một trăm.

Thông điệp ở đây: nếu agent của bạn bắt đầu hỏng khi thêm tool, điều đó không tự động có nghĩa là prompt của bạn tệ. Có thể là kiến trúc đang bắt model giải sai bài toán.

Slide Teams Are Hitting the Same Tool-Scaling Wall với bốn bằng chứng
Slide "Teams Are Hitting the Same Tool-Scaling Wall", bằng chứng thật từ người làm, engineer và chính Anthropic, không phải benchmark giả lập. Anthropic Engineering Blog: 150K xuống 2K token, chỉ nạp tool cần cho task hiện tại, giảm 98,7%. Vercel AI SDK issue #11920 (tháng 1/2026): từ 20 tool trở lên là vỡ; gửi mọi định nghĩa tool ở mọi request làm giảm hiệu năng, khiến model chọn nhầm tool và tăng token cùng latency. MCP-Zero (xfey/MCP-Zero): giảm 98% token, test trên 308 MCP server và 2.797 tool, chọn chính xác từ khoảng 3.000 ứng viên; code open source. n8n Community Forum (tháng 8/2024): hơn 2 tool là agent kẹt trong vòng lặp, đốt hết số iteration tối đa, gặp ngay trong production.

16. Bộ starter kit open source

Hai anh giới thiệu những project open source mình đã tìm thấy. Một trong số đó là project semantic router open source của Aurelio Labs, bạn có thể dùng để test local và benchmark. ToolBench và Berkeley Function Calling Leaderboard cũng là những điểm khởi đầu hữu ích. Còn để có hướng dẫn thực tế, hãy đọc bài viết về MCP của Anthropic: nó giải thích vì sao nạp tool theo nhu cầu lại quan trọng và là một tín hiệu thực tế mạnh cho kiến trúc này.

Ý chính là bạn không cần phát minh lại cả hệ sinh thái từ đầu, các mảnh ghép đã có sẵn. Slide chuyển hơi chậm ("next slide... sorry, here it is"), rồi phần trade-off bắt đầu.

Slide Open Source Starter Kit với ba cột Try It, Benchmark It, Study the Best
Slide "Open Source Starter Kit", tiêu đề phụ "Clone these tonight". Try It: aurelio-labs/semantic-router (khoảng 3,1k sao, pip install semantic-router), thư viện đúng với pattern của talk, kèm notebook agent LangChain mở thẳng trên Colab. Benchmark It: OpenBMB/ToolBench (ICLR'24), 16.464 API thật từ RapidAPI, có neural retriever, so baseline với router qua top_k_api; ShishirPatil/gorilla (BFCL, khoảng 12,7k sao, pip install bfcl-eval), Berkeley Function Calling Leaderboard V4, nộp kết quả để có benchmark trích dẫn được. Study the Best: xfey/MCP-Zero, 2.797 tool trên 308 MCP server, routing phân cấp, giảm 98% token, kèm dataset; Anthropic Engineering Blog, 150K xuống 2K token, case study production về on-demand loading.

17. Trade-off và best practice

Cách làm này cũng có những trade-off riêng.

Rủi ro thứ nhất là router miss. Router có thể không retrieve được tool mà model cần. Cách xử lý là một fallback: nếu model không hoàn thành được task, bạn có thể nới rộng K, chạy một lượt retrieval thứ hai, hoặc route sang một nhóm tool rộng hơn.

Rủi ro thứ hai là tool description yếu. Nếu description mơ hồ, embedding cũng sẽ yếu. Hãy viết description bằng chính những từ user thật sự dùng, và đưa vào đó intent, action cùng các entity chính.

Rủi ro thứ ba là tool hiếm. Có những tool sẽ không bao giờ đạt score cao trừ khi description của chúng chứa đúng ngôn ngữ. Bạn cần monitor các lần trượt và viết lại description cho phù hợp.

Và cuối cùng, đừng over-engineer hệ thống nhỏ. Nếu bạn có mười hay mười lăm tool, nạp tĩnh vẫn có thể ổn. Routing thường chỉ đáng giá khi catalog đủ lớn để kích thước prompt, latency hay chuyện nhầm tool trở thành vấn đề production thật.

Slide Trade-Offs and Best Practices với năm cặp concern và mitigation
Slide "Trade-Offs & Best Practices", năm cặp concern và mitigation: router có thể bỏ sót tool cần thiết, thì fallback bằng cách tăng K hoặc để LLM xin thêm; thêm độ phức tạp (vector DB và tuning), thì embedding search chỉ tốn vài ms và phần tiết kiệm lấn át; tool hiếm có thể xếp hạng thấp, thì log các lần trượt, retrain hoặc thêm keyword boosting; ngưỡng K khó hiệu chỉnh, thì bắt đầu ở K = 5 và tune trên một dev eval set; không đáng làm dưới khoảng 20 tool, thì với bộ tool nhỏ cứ nạp tĩnh, không cần router.

18. Năm takeaway, tài liệu tham khảo và lời chào

Phần tổng kết gồm vài takeaway. Thứ nhất, như đã bàn, tool overload làm hại accuracy: nạp mọi schema vào mọi prompt khiến quyết định của model khó hơn khi catalog lớn lên. Thứ hai là về token: token vừa là cost vừa là latency. Catalog tool lớn có thể thêm hàng chục nghìn token trước khi request thật của user được xử lý. Thứ ba, semantic routing giúp sửa vấn đề đó: khi catalog lớn, model chỉ nhìn thấy những tool liên quan tới câu hỏi hiện tại. Thứ tư, về bản chất đây là RAG cho tool: index description cho đúng, retrieve lúc runtime, và chỉ inject thứ cần thiết. Và cuối cùng, bắt đầu đơn giản: dùng K bằng năm làm điểm khởi đầu, log mọi quyết định, evaluate trên một test set thật, và cải thiện tool description dần dần khi thấy tool sai bị chọn.

Mục tiêu không phải là làm cho agent phức tạp hơn. Mục tiêu là ngừng bắt model phải reasoning qua những tool không liên quan.

Slide Key Takeaways với năm điểm
Slide "Key Takeaways": 01 Tool Overload Kills Accuracy, accuracy sụp từ 78% xuống 13% khi fat agent đi từ 10 lên 741 tool; 02 Tokens = Money + Latency, 741 tool bằng 127K token mỗi request, JIT routing cắt còn khoảng 1K, giảm 99%; 03 Semantic Routing Saves the Day, chọn tool bằng embedding đưa accuracy trở lại trên 90% và giữ latency gần như phẳng; 04 It's RAG, but for Tools, index trước tool description trong vector DB và chỉ retrieve thứ câu hỏi cần; 05 Start Small, Scale Confidently, K = 5 là mặc định tốt; benchmark, tune, monitor, và sẵn sàng cho engineering ngay hôm nay.

Hai anh để lại một slide tài liệu tham khảo cho ai đang build: các thư viện semantic routing, ToolBench, Berkeley Function Calling Leaderboard, bài viết về MCP của Anthropic, và các vector store như Pinecone, Qdrant.

Slide Resources and References với ba cột Papers, Tools và API Docs
Slide "Resources & References". Papers & Benchmarks: Zheng et al., SkillRouter: LLM Agents at Scale (2026); Liu & Chen, Semantic Tool Selection (vLLM, 2025); Berkeley Function Calling Leaderboard (BFCL); Anthropic Engineering, MCP On-Demand Context (2025). Tools & Repos: SkillRouter, FAISS (github.com/facebookresearch/faiss), Pinecone / Qdrant / ChromaDB làm vector DB, LangGraph cho agent orchestration. API Docs: Anthropic MCP, OpenAI Function Calling, Google GenAI Gemini 2.0, SentenceTransformers (sbert.net).

Hai anh cảm ơn mọi người đã xem. Nếu talk này hữu ích, hãy chia sẻ nó cho ai đó đang build agent: họ hoặc đã đụng phải bức tường này, hoặc sắp đụng. Người xem có thể quét QR code LinkedIn trên slide cuối để kết nối; hai anh sẵn lòng tiếp tục trao đổi, chia sẻ tài liệu, hoặc nghe cách người khác đang giải bài toán này trong hệ thống của họ. "Tôi là Ankush, đây là Sohail. Cảm ơn mọi người rất nhiều."

Slide Thank You với QR code LinkedIn của hai diễn giả
Slide kết "Thank You, Let's Connect": hai QR code dẫn tới LinkedIn của Ankush Rastogi (Senior Data Solutions Engineer, Prosodica LLC) và Sohail Shaikh (Data Scientist, Prosodica LLC).

Nguồn và link