引言
2025年11月24日,Anthropic正式發佈了Programmatic Tool Calling (PTC)特性,允許Claude通過代碼而非單次API調用來編排工具執行。這一創新被認為是Agent開發的重要突破,能夠顯著降低token消耗、減少延遲並提升準確性。
然而,作為minion框架的創建者,我想分享一個有趣的事實:minion從一開始就採用了這種架構理念。在PTC概念被正式提出之前,minion已經在生產環境中證明了這種方法的價值。
PTC解決了什麼問題?
Anthropic在博文中指出了傳統Tool Calling的兩個核心問題:
- Context污染問題
傳統方式中,每次工具調用的結果都會返回到LLM的context中。例如分析一個10MB的日誌文件時,整個文件內容會進入context window,即使LLM只需要錯誤頻率的摘要。 -
推理開銷與手動綜合
每次工具調用都需要一次完整的模型推理。LLM必須"眼球式"地解析數據、提取相關信息、推理片段如何組合,然後決定下一步——這個過程既緩慢又容易出錯。
Minion的解決方案:天然的PTC架構
Minion框架從設計之初就採用了一種根本不同的架構:LLM專注於規劃和決策,具體執行交給代碼環境。
核心設計理念Minion的典型工作流
- LLM分析用户需求,制定執行計劃
- LLM生成Python代碼來編排工具調用
- 代碼在隔離環境中執行,處理所有數據操作
- 只有最終結果返回給LLM
這正是PTC想要實現的效果,但minion將其作為基礎架構而非可選特性。
實際案例對比
讓我們看看Anthropic博文中的預算合規檢查示例:
任務:找出Q3差旅超預算的團隊成員
傳統Tool Calling方式:
獲取團隊成員 → 20人
為每人獲取Q3費用 → 20次工具調用,每次返回50-100條費用明細
獲取各級別預算限額
所有數據進入context:2000+條費用記錄(50KB+)
LLM手動彙總每人費用、查找預算、比較超支情況
使用PTC後:
Claude寫一段Python腳本編排整個流程
腳本在Code Execution環境運行
LLM只看到最終結果:2-3個超支人員
在Minion中,這種模式是默認行為,llm會生成代碼:
Minion中的實現(偽代碼)
async def check_budget_compliance():
# LLM生成的計劃代碼
team = await get_team_members("engineering")
# 並行獲取所有數據
levels = list(set(m["level"] for m in team))
budgets = {
level: await get_budget_by_level(level)
for level in levels
}
# 數據處理在本地完成
exceeded = []
for member in team:
expenses = await get_expenses(member["id"], "Q3")
total = sum(e["amount"] for e in expenses)
budget = budgets[member["level"]]
if total > budget["travel_limit"]:
exceeded.append({
"name": member["name"],
"spent": total,
"limit": budget["travel_limit"]
})
return exceeded # 只返回關鍵結果
關鍵區別在於:
Minion:這是框架的核心設計,所有複雜任務都這樣處理
PTC:需要顯式啓用,存在多重架構限制
必須顯式標記哪些工具允許programmatic調用(allowed_callers配置)
運行在受限的Claude容器環境中,無法自由安裝任意包
文件需要通過額外的Files API上傳(單文件最大500MB限制)
工具必須在容器4.5分鐘不活動超時前返回結果
Web工具、MCP工具無法通過programmatic方式調用
Minion的優勢:更進一步
Minion不僅實現了PTC的核心理念,還提供了更多優勢:
-
完整的Python生態系統
Minion中的代碼執行環境擁有完整的Python生態訪問權:Minion可以直接使用任何Python庫
import pandas as pd
import numpy as np
from sklearn.cluster import KMeans
強大的數據處理
df = pd.DataFrame(expense_data)
analysis = df.groupby('category').agg({
'amount': ['sum', 'mean', 'std'],
'count': 'size'
})
複雜的數據科學任務
model = KMeans(n_clusters=3)
clusters = model.fit_predict(spending_patterns)
-
狀態管理和持久化
Minion天然支持複雜的狀態管理:
class BudgetAnalyzer:
def __init__(self):self.cache = {} self.history = []async def analyze_department(self, dept):
# 狀態在整個分析過程中保持 if dept in self.cache: return self.cache[dept] result = await self._deep_analysis(dept) self.cache[dept] = result self.history.append(result) return result -
錯誤處理和重試邏輯
在代碼中顯式處理各種邊界情況:
async def robust_fetch(user_id, max_retries=3):
for attempt in range(max_retries):try: return await get_expenses(user_id, "Q3") except RateLimitError: await asyncio.sleep(2 ** attempt) except DataNotFoundError: return [] # 合理的默認值raise Exception(f"Failed after {max_retries} attempts")
-
並行和異步操作
充分利用Python的異步能力:高效的並行處理
async def analyze_all_departments():
departments = ["eng", "sales", "marketing", "ops"]# 同時分析所有部門
results = await asyncio.gather(*[analyze_department(dept) for dept in departments])
# 整合分析結果
return consolidate_results(results)
性能數據對比
根據Anthropic的內部測試,PTC帶來了顯著改進:
Token節省:複雜研究任務從43,588降至27,297 tokens(減少37%)
延遲降低:消除了多次模型推理往返
準確率提升:
內部知識檢索:25.6% → 28.5%
GIA基準測試:46.5% → 51.2%
在minion的生產使用中,我們觀察到類似甚至更好的指標,因為:
更少的模型調用:LLM只在規劃階段和最終總結時參與
更高效的資源利用:本地數據處理不消耗API tokens
更可預測的性能:代碼執行路徑明確,減少了LLM的不確定性
架構哲學:誰應該做什麼?
Minion的設計基於一個核心信念:
LLM擅長理解、規劃和推理;Python擅長執行、處理和轉換。
這種職責分離帶來了清晰的架構:
用户請求
↓
[LLM:理解意圖,制定計劃]
↓
[生成Python代碼]
↓
[代碼執行環境:調用工具、處理數據、控制流程]
↓
[返回結構化結果]
↓
[LLM:解讀結果,生成用户友好的響應]
這不僅僅是優化,而是一種架構級別的重新思考。
Tool Search Tool:Minion的動態工具發現
Anthropic的另一個新特性是Tool Search Tool,解決大型工具庫的context消耗問題。Minion在這方面也有相應的機制:
分層工具暴露
Minion的工具分層策略
class MinionToolRegistry:
def __init__(self):
self.core_tools = [] # 始終加載
self.domain_tools = {} # 按需加載
self.rare_tools = {} # 搜索發現
def get_tools_for_task(self, task_description):
# 智能工具選擇
tools = self.core_tools.copy()
# 基於任務描述添加相關工具
if "database" in task_description:
tools.extend(self.domain_tools["database"])
if "visualization" in task_description:
tools.extend(self.domain_tools["plotting"])
return tools
向量搜索工具發現
使用embedding的工具搜索
from sentence_transformers import SentenceTransformer
class SemanticToolSearch:
def __init__(self, tool_descriptions):
self.model = SentenceTransformer('all-MiniLM-L6-v2')
self.tool_embeddings = self.model.encode(tool_descriptions)
def find_tools(self, query, top_k=5):
query_embedding = self.model.encode([query])
similarities = cosine_similarity(query_embedding, self.tool_embeddings)
return self.get_top_tools(similarities, top_k)
實際應用:Minion在生產環境
Minion框架已經在多個實際場景中證明了這種架構的價值:
案例1:大規模數據分析
金融科技公司使用minion分析數百萬條交易記錄,尋找異常模式:
async def detect_anomalies():
# LLM規劃:需要獲取數據、清洗、特徵工程、異常檢測
# 執行代碼直接處理大數據集
transactions = await fetch_all_transactions(start_date, end_date)
# 1M+ records, 但不進入LLM context
df = pd.DataFrame(transactions)
df = clean_data(df)
features = engineer_features(df)
# 使用機器學習檢測異常
anomalies = detect_with_isolation_forest(features)
# 只返回異常摘要給LLM
return {
"total_transactions": len(df),
"anomalies_found": len(anomalies),
"top_anomalies": anomalies.head(10).to_dict()
}
結果:
處理100萬條記錄
LLM僅消耗~5K tokens(傳統方式需要500K+)
端到端延遲:30秒(vs 傳統方式的5分鐘+)
案例2:多源數據整合
SaaS公司使用minion整合來自多個API的客户數據:
async def comprehensive_customer_analysis(customer_id):
# 並行獲取所有數據源
crm_data, support_tickets, usage_logs, billing_history = await asyncio.gather(
fetch_crm_data(customer_id),
fetch_support_tickets(customer_id),
fetch_usage_logs(customer_id),
fetch_billing_history(customer_id)
)
# 本地數據融合和分析
customer_profile = {
"health_score": calculate_health_score(...),
"churn_risk": predict_churn_risk(...),
"upsell_opportunities": identify_opportunities(...),
"support_sentiment": analyze_ticket_sentiment(support_tickets)
}
return customer_profile
案例3:自動化工作流
DevOps團隊使用minion自動化複雜的部署流程:
async def deploy_with_validation():
# 多步驟工作流,每步都有條件邏輯
# 1. 運行測試
test_results = await run_test_suite()
if test_results.failed > 0:
return {"status": "blocked", "reason": "tests failed"}
# 2. 構建和推送鏡像
image = await build_docker_image()
await push_to_registry(image)
# 3. 金絲雀部署
canary = await deploy_canary(image, percentage=10)
await asyncio.sleep(300) # 監控5分鐘
metrics = await get_canary_metrics(canary)
if metrics.error_rate > 0.01:
await rollback_canary(canary)
return {"status": "rolled_back", "metrics": metrics}
# 4. 完整部署
await deploy_full(image)
return {"status": "success", "image": image.tag}
超越PTC:Minion的未來方向
雖然PTC是一個重要的進步,但minion的架構設計讓我們能夠探索更多可能性:
-
混合推理模式
在一個會話中智能切換:簡單任務:直接工具調用
if task.complexity < THRESHOLD:
result = await simple_tool_call(task)
複雜任務:生成編排代碼
else:
orchestration_code = await llm.generate_code(task)
result = await execute_code(orchestration_code)
-
增量計算和緩存
智能重用中間結果:記憶化的數據獲取
@lru_cache(maxsize=1000)
async def cached_get_user_data(user_id):
return await fetch_user_data(user_id)
增量更新而非全量重算
async def update_analysis(new_data):
previous_state = load_checkpoint()
delta = compute_delta(previous_state, new_data)
updated_state = apply_delta(previous_state, delta)
return updated_state
-
多模型協作
不同模型處理不同階段:規劃用強模型
plan = await claude_opus.create_plan(user_request)
代碼生成用專門模型
code = await codegen_model.generate(plan)
執行和監控
result = await execute_with_monitoring(code)
用户交互用快速模型
response = await claude_haiku.format_response(result)
開源的力量:社區驅動的創新
Minion作為開源項目(300+ GitHub stars),其發展得益於社區的貢獻和反饋。這種開放性帶來了:
快速迭代:社區發現問題和用例,推動快速改進
多樣化應用:用户在我們未曾想象的場景中使用minion
相比之下,PTC雖然強大,但:
需要顯式配置(allowed_callers, defer_loading等)
依賴特定的API版本和beta功能
與Claude的生態系統緊密耦合
Minion的設計原則是provider-agnostic——你可以用任何LLM後端(Claude, GPT-4, 開源模型),架構優勢依然存在。
技術細節:實現對比
讓我們深入比較實現細節:
PTC的實現方式
Anthropic的PTC需要特定配置
{
"tools": [
{
"type": "code_execution_20250825",
"name": "code_execution"
},
{
"name": "get_team_members",
"allowed_callers": ["code_execution_20250825"],
...
}
]
}
Claude生成工具調用
{
"type": "server_tool_use",
"id": "srvtoolu_abc",
"name": "code_execution",
"input": {
"code": "team = get_team_members('engineering')\\\\\\\\n..."
}
}
Minion的實現方式
Minion的工具定義是標準Python
class MinionTools:
@tool
async def get_team_members(self, department: str):
"""Get all members of a department"""
return await self.db.query(...)
@tool
async def get_expenses(self, user_id: str, quarter: str):
"""Get expense records"""
return await self.expenses_api.fetch(...)
LLM生成的是完整的Python函數
async def analyze_budget():
# 直接調用工具函數
team = await tools.get_team_members("engineering")
# 完整的Python語言能力
expenses_by_user = {
member.id: await tools.get_expenses(member.id, "Q3")
for member in team
}
# 任意複雜度的數據處理
analysis = perform_complex_analysis(expenses_by_user)
return analysis
關鍵區別:
PTC:工具調用通過特殊的API機制,有caller/callee關係
Minion:工具就是普通的Python async函數,LLM生成標準代碼
為什麼這個架構如此重要?
隨着AI Agent向生產環境發展,我們面臨的核心挑戰是:
規模:處理百萬級數據,不能全塞進context
可靠性:生產系統需要確定性的錯誤處理
成本:token消耗直接影響商業可行性
性能:用户體驗需要亞秒級響應
傳統的單次工具調用模式在這些維度上都遇到瓶頸。代碼編排模式(無論是PTC還是minion)提供了突破:
傳統模式:LLM <-> Tool <-> LLM <-> Tool <-> LLM
(慢) (貴) (脆弱)
編排模式:LLM -> [Code: Tool+Tool+Tool+Processing] -> LLM
(快) (省) (可靠)
- 經過驗證的架構
PTC的發佈證明了我們架構選擇的正確性——這不是投機性的設計,而是行業領先者獨立得出的結論。 - 先發優勢
在PTC成為官方特性之前,minion已經在生產環境積累了經驗和最佳實踐。 - 更廣泛的適用性
支持多種LLM後端(Claude, GPT-4, 開源模型)
靈活的部署選項(雲端、本地、混合)
豐富的Python生態系統集成
- 社區和生態
300+stars代表的不僅是認可,還有潛在的用户基礎和貢獻者社區。
結論:架構的必然收斂
Anthropic推出PTC不是偶然——這是agent架構演進的必然方向。當你需要構建能處理複雜任務、大規模數據、多步驟流程的生產級agent時,你會自然而然地得出這樣的結論:
LLM應該專注於它擅長的(理解和規劃),讓代碼處理它擅長的(執行和轉換)。
Minion從一開始就擁抱了這個理念,並將繼續推動這個方向:
✅ 今天:完整的PTC式架構,生產環境驗證
🚀 明天:更智能的工具發現、更高效的狀態管理
🌟 未來:混合推理、增量計算、多模型協作
如果你正在構建需要處理真實世界複雜性的AI agent,我邀請你:
試用minion:GitHub倉庫
加入討論:分享你的用例和反饋
參與社區:貢獻代碼、文檔、想法
這不是關於誰先想到某個特性,而是關於共同推動AI agent架構向正確方向發展。PTC的發佈對整個生態系統都是好消息——它驗證了這條路徑,並將吸引更多開發者探索programmatic orchestration的潛力。
讓我們一起構建下一代AI agent。
延伸閲讀 完全開源!全新多合一AI智能體框架來了:無縫支持多種工具、多種任務
相關資源
視頻演示
PTC Example - Expense Tracking: https://youtu.be/hDAIB0sF7-k
Tool Search Tool Example - Create GitHub PR: https://youtu.be/G7dDvza9PO8
參考資料:
https://github.com/femto/minion
Advanced Tool Use Guide: https://github.com/femto/minion/blob/main/docs/advanced_tool_use.md
GitHub: https://github.com/femto/minion