解決 ADK 中 Gemini Agent 的 Function Calling 不支援問題
解決 ADK 中 Gemini Agent 的 Function Calling 不支援問題問題描述當 Agent 掛有 google_search tool 時: 不能直接將此 Agent 掛到 sub_agents 會出現錯誤: 1AGENT_ERROR: Tool use with function calling is unsupported by the model 參考: GitHub Issue #53 解決方案:將 Agent 包裝成 Agent Tool關鍵概念當 Agent 包含 google_search tool 時,必須用 agenttool.New() 將其轉為 Tool,才能被其他 Agent 調用。 Go 實作12345678910111213141516171819202122import "google.golang.org/adk/tool/agenttool"// 1. 建立帶有 google_search 的 agentwebSearchAgent, err := llmagent.New(llmagent.Co...
Agent Tool 無上下文記憶,需改用 Sub-agent
Agent Tool 無上下文記憶,需改用 Sub-agent問題描述在 ADK 中,透過 agenttool.New() 將 Agent 包裝成 Agent Tool 後,該 agent 在被呼叫時沒有父 agent 的對話記憶: Agent Tool 每次被呼叫都是無狀態的獨立執行 無法存取父 agent 的對話歷史(session history) 適合「給一個輸入、取得一個輸出」的無狀態任務(例如:查資料、分析圖片) 對比:Sub-agent vs Agent Tool Sub-agent(sub_agents) Agent Tool(agenttool.New()) 上下文記憶 ✅ 共享父 agent session ❌ 無,每次獨立執行 呼叫方式 transfer_to_agent(agent_name=...) 直接呼叫工具 適合情境 需要對話歷史的複雜流程 無狀態的單次查詢 使用限制 不能掛有 google_search tool 可掛 google_search 情境範例Agent Tool(無上下文記憶)適合「翻譯文字」、「分析...
JSONL LLM Log 持久化方案
JSONL LLM Log 持久化方案動機OTel 將 LLM 的 prompt 與 response 送到 Aspire Dashboard 可即時查看,但資料不持久。 JSONL 持久化的目的: 歷史對話存檔:保留所有 LLM 的 input/output,供後續分析 提示詞優化分析:比對不同 prompt 版本在相同情境下的輸出差異 版本追蹤:每筆 log 帶有 git commit hash,可精確對應到當時的提示詞版本,評估修改效果 架構:OTel 雙路徑輸出ADK 預設的 OTLP pipeline 和自訂 JSONL pipeline 是兩條獨立路徑: 123456789ADK Framework(產生 OTel Log Records) │ ├──→ ADK 內建 OTLP Log Pipeline → Aspire Dashboard(即時視覺化) │ └──→ SessionEnrichProcessor(注入 session ID) ↓ BatchProcessor(緩衝) ...
OTel Custom Log Processor — 跨 Span 注入 Context
OTel Custom Log Processor — 跨 Span 注入 Context問題描述OTel Log Record 預設不帶 Span 的自訂屬性。例如: Trace Span 上帶有 session_id(由 ADK 在 StartInvokeAgentSpan 時寫入) Log Record 雖然與同一個 Span 關聯,但不會自動繼承 Span 的 attribute 結果:JSONL log 中的 session 欄位為空,無法按 session 分組查詢。 解決方案:實作自訂 Log Processor透過包裝標準 BatchProcessor,在每筆 Log Record 被送出前,從當前 Span Context 讀取 attribute,注入到 Log Record: 1234567891011type SessionEnrichProcessor struct { inner sdklog.Processor // 被包裝的 Processor(通常是 BatchProcessor)}func (p *Sessio...
Aspire Dashboard — 本地 OTel 後端
Aspire Dashboard — 本地 OTel 後端什麼是 Aspire DashboardAspire Dashboard 是 .NET Aspire 生態系的一個獨立 UI 工具,用於視覺化 OpenTelemetry 資料(Traces、Logs、Metrics)。雖然源自 .NET 生態,但它接收標準 OTLP 協定,任何語言的應用程式都可以把遙測資料送進來。 選擇原因 零安裝:一行 docker run,即可啟動完整 UI 輕量:比完整 Jaeger + 儲存後端的 stack 簡單很多 UI 完整:Traces waterfall、Log viewer、關聯查詢一應俱全 接受 OTLP:標準協定,不綁定語言或框架 docker-compose 設定12345678910services: aspire: image: mcr.microsoft.com/dotnet/aspire-dashboard:latest container_name: my-aspire environment: DOTNET_DASHBOARD_UN...
OpenTelemetry 可觀測性三種訊號(Traces、Metrics、Logs)與 Exporters
OpenTelemetry 可觀測性三種訊號(Traces、Metrics、Logs)與 Exporters什麼是 OpenTelemetryOpenTelemetry(OTel)是一套開源的可觀測性標準與 SDK,統一了蒐集 Traces、Metrics、Logs 的方式,讓應用程式可以不綁定特定後端(Jaeger、Zipkin、Datadog 等)地輸出遙測資料。 三種訊號(Signals)1. Traces & SpansTrace 代表一次完整的操作鏈(例如:處理一個使用者請求的全過程)。 Span 是 Trace 的最小單位,記錄一段工作的開始/結束時間與屬性: 12345Trace: 處理訂單請求├── Span: route_request (root span)│ ├── Span: parse_order_message│ ├── Span: call_llm (LLM 推論)│ └── Span: create_order (DB 寫入) 每個 Span 帶有: trace_...
ADK Sub-agent STOP 錯誤:停用 Thinking Mode
ADK Sub-agent STOP 錯誤:停用 Thinking Mode使用 Gemini 2.5 Flash 模型時,若 sub-agent 啟用思考模式(Thinking Mode),有時會導致該 sub-agent 回傳空的 content,觸發 ADK 的 STOP 錯誤,整個對話流程中斷。 錯誤現象 Sub-agent 被 transfer 進來後無回應 Log 顯示 finish_reason 為 STOP 但 content 為空 問題只在 sub-agent 上出現,root agent 不受影響 根本原因Gemini 2.5 Flash 的思考模式會在回應中產生內部推理(thinking tokens),但在 ADK 的 multi-agent 架構中,sub-agent 的思考輸出有時無法正確轉換為可回傳的 content,導致空回應。 解決方案:對 Sub-agent 停用思考模式在建立 sub-agent 時,透過 GenerateContentConfig 將 ThinkingBudget 設為 0: 12345678910111213thinki...
機器學習 支持向量機 ( Support Vector Machines )
[筆記] 機器學習 支持向量機 ( Support Vector Machines ) 簡稱 SVM 屬於監督式學習算法 主要用於找到一個決策邊界 ( decision boundary ) 讓兩類的邊界 ( margins ) 最大化 大間距分類器 ( Large margin classifiers ) SVM 的代價函數 將 邏輯回歸的代價函數 * $\dfrac{m}{λ}$ 可以將 C 看成 $\dfrac{1}{λ}$,優化目標相同,SVM 的 C 與邏輯函數的 λ 只是透過不同方法來控制權重 這裡 hθ(x) 的定義 : hθ(x) = 1,if θTx ≥ 0 hθ(x) = 0,otherwise cost1(z) 與 cost0(z) 的圖 : 支持向量機的條件更加嚴格 : hθ(x) = 1,if θTx ≥ 1 hθ(x) = 0,if θTx ≤ -1 C 值的大小 : 當 C 非常大 : 相當於 λ 非常小 對於誤差點,也會進行很好的擬合 造成過度擬合的情況 當 C 非常小 ...
如何在 Hexo 上使用數學式
[問題] 如何在 Hexo 上使用數學式平常很習慣先用 HackMD 寫好筆記或文章後,再複製起來貼到 Hexo 上,但最近寫的筆記需要使用到數學式,一開始在 HackMD 撰寫渲染都很正常,但一貼到 Hexo 上,數學式就出錯了 在 Hexo 上的顯示 正常的顯示 問題描述 :因為 Hexo 本身沒有支援數學式的顯示,所以必須更換渲染引擎使用 mathJax 來渲染數學式 解決問題 :這邊是使用 hexo-theme-melody 的主題,所以是依照他們的文件解決 更換渲染引擎 1$ npm uninstall hexo-renderer-marked --save 先將 Hexo 原本的渲染引擎 marked 刪除,在部落格的根目錄執行 1$ npm install hexo-renderer-kramed --save 在安裝上新的渲染引擎 kramed,在部落格的根目錄執行 設定 melody.yml.yml 123mathjax: enable: true cdn: https://cdn.jsdelivr.net/npm/mathjax/M...
機器學習 系統的設計
[筆記] 機器學習 系統的設計提高機器準確性的方法 收集大量數據 開發複雜的特徵量 開發算法以不同方式處理輸入 P.S. 很難說哪個項目最有用 誤差分析 ( Error analysis ) 從簡單的算法開始,快速實作,並在交叉驗證集測試 繪製出學習曲線,已確定算法該往哪個方向進行 手動檢查交叉驗證集中錯誤的資料,查找這些資料大多數發生錯誤的特徵 例如 : 分類垃圾郵件時,釣魚郵件大多數分類錯誤,就針對釣魚郵件下去改善算法 將錯誤結果數值化很重要,否則很難評估算法性能 P.S. 分析時最好用交叉驗證集測試,如果用測試集去做誤差分析,算法只會越來越偏向測試集,在最後完成算法時,測試結果就會變得沒什麼參考價值 偏斜類 ( Skewed classes ) 問題 偏斜類是指大量的樣本傾向了某個類型,例如 : 通過邏輯回歸來預測病人是否有罹患癌症 y = 1 為罹癌,y = 0 為沒有罹癌 假設此錯誤率只有 1%,但我們的測試集中只有 0.5% 的人罹癌 這時只要使用算法 : hθ(x) = 0 此算法的錯誤率甚至只有 0.5% 查準率 ...