目前架構:
┌─────────────────────┐
│ AgentDojo │
│ Benchmark Task │
└──────────┬──────────┘
│
▼
┌─────────────────────┐
│ LOCAL LLM Provider │
│ local_llm.py │
└──────────┬──────────┘
│ HTTP
▼
┌─────────────────────┐
│ Ollama │
│ localhost:11434 │
└──────────┬──────────┘
│
▼
┌─────────────────────┐
│ Qwen3:4B │
└─────────────────────┘
首先建立 Python 虛擬環境並安裝 AgentDojo,之後使用 Ollama 下載 Qwen3:4B:
ollama pull qwen3:4b
確認模型存在:
curl.exe http://localhost:11434/v1/models
成功後可以看到:
"id":"qwen3:4b"
接著設定 AgentDojo 使用 Ollama 的服務埠:
$env:LOCAL_LLM_PORT="11434"
需要注意的是,LOCAL_LLM_PORT 是目前 PowerShell 工作階段的環境變數,如果重新開啟 Terminal,通常需要再次設定。
在直接執行 AgentDojo 前,先使用 PowerShell 測試 Ollama API,可以排除模型本身無法運作的問題。
$body = @{
model = "qwen3:4b"
messages = @(
@{
role = "user"
content = "請回答:1+1是多少?"
}
)
} | ConvertTo-Json -Depth 10
$response = Invoke-RestMethod `
-Uri "http://localhost:11434/v1/chat/completions" `
-Method Post `
-ContentType "application/json" `
-Body $body
$response.choices[0].message.content
測試結果可以正常得到答案,因此確認:
PowerShell
↓
Ollama API
↓
Qwen3:4B
↓
正常產生回答
這表示問題並不是 Ollama 沒有啟動,或 Qwen3:4B 完全無法回覆。
確認 API 正常後,使用 AgentDojo 的 LOCAL provider 執行 Workspace 任務:
python -X utf8 -m agentdojo.scripts.benchmark `
-s workspace `
--model LOCAL `
--model-id qwen3:4b `
-ut user_task_3 `
-f
其中:
-s workspace:使用 Workspace suite--model LOCAL:使用 AgentDojo 的本地模型 provider--model-id qwen3:4b:指定 Ollama 模型-ut user_task_3:只執行指定 User Task-f:強制重新執行-X utf8:避免 Windows 中文編碼造成 YAML 讀取問題執行時可以看到:
Using local model: qwen3:4b
Using tool delimiter: tool
HTTP Request:
POST http://localhost:11434/v1/chat/completions
HTTP/1.1 200 OK
因此 AgentDojo 確實成功將請求送到 Qwen3:4B。
然而最後卻得到:
Average utility: 0.00%
進一步查看 AgentDojo 0.1.35 的 local_llm.py 後,發現 LOCAL provider 對模型輸出有特定格式要求。
AgentDojo 的 Function Calling prompt 要求模型,如果需要使用工具,必須輸出類似:
<function=search_calendar>{"date":"2024-05-24"}</function>
其中:
function name
↓
search_calendar
參數
↓
{"date":"2024-05-24"}
AgentDojo 接收到這個字串後,再由 _parse_model_output() 進行解析。
流程可以表示為:
Qwen3:4B
│
│ 產生文字
▼
<function=search_calendar>
{"date":"2024-05-24"}
</function>
│
▼
AgentDojo Parser
│
├── function = search_calendar
│
└── args = {"date":"2024-05-24"}
│
▼
執行 Tool
│
▼
取得 Tool Result
│
▼
Qwen3:4B
│
▼
最終回答
為了確認是不是 AgentDojo Parser 本身有問題,建立 test_parser.py:
from agentdojo.agent_pipeline.llms.local_llm import _parse_model_output
x = '<function=search_calendar>{"date":"2024-05-24"}</function>'
r = _parse_model_output(x)
print("TYPE:", type(r))
print("RESULT:", repr(r))
執行:
python -X utf8 .\test_parser.py
結果:
TYPE: <class 'dict'>
RESULT:
{
'role': 'assistant',
'content': [...],
'tool_calls': [
FunctionCall(
function='search_calendar',
args={'date': '2024-05-24'}
)
]
}
這是一個非常重要的結果。
代表:
AgentDojo 0.1.35 的 Parser 可以正確解析 Function Calling 格式。
因此目前可以排除 Parser 本身的問題。
接著修改 local_llm.py,加入 Debug 輸出:
print("[DEBUG RAW COMPLETION]:", repr(completion))
重新執行 User Task 後,看到 Qwen3:4B 實際產生的內容類似:
The user is asking about the location of the event
"Dinner with Blue Sparrow Tech" on May 24th.
After reviewing the available tools, there is no function
that can retrieve calendar event details...
甚至最後出現:
<function=>
</function>
因此 AgentDojo 顯示:
[debug] broken JSON: ''
這就找到了目前最重要的問題。
整個測試可以分成四個層級:
① AgentDojo
│
│ 正常
▼
② LOCAL Provider
│
│ 正常
▼
③ Ollama + Qwen3:4B
│
│ HTTP 200、可以回答
▼
④ Function Calling
│
│ ← 目前問題
▼
無法穩定產生 AgentDojo 要求的格式
所以目前的 0% utility 並不代表 Qwen3:4B 完全不能運作。
實際上它已經成功完成:
AgentDojo
↓
LOCAL provider
↓
HTTP Request
↓
Ollama
↓
Qwen3:4B
↓
HTTP 200
↓
產生回答
真正失敗的是 AgentDojo 最重要的 Agent 行為之一:模型沒有穩定按照 AgentDojo 的格式進行 Tool / Function Calling。
換成更大的 8B 模型並不是目前最優先的解法。下一階段應進行不用重新下載模型的 Qwen3:4B Function Calling 壓力測試,確認 Qwen3:4B 在不同 Prompt 下到底能不能穩定輸出:
<function=工具名稱>{JSON參數}</function>
這也會成為下一階段分析 AgentDojo 0.1.35 與 Qwen3:4B 相容性的主要依據。