試與動(dòng)態(tài)切換:eino-examples AB Router實(shí)踐指南)
【免費(fèi)下載鏈接】eino-examplesExamples and demonstrations for using the Eino framework項(xiàng)目地址https://gitcode.com/gh_mirrors/ei/eino-examples點(diǎn)擊查看免費(fèi)下載eino-examples 是 Eino 框架的官方示例集。本文帶你用它其中的AB RouterA/B 測(cè)試路由快速實(shí)現(xiàn)大模型 A/B 測(cè)試與動(dòng)態(tài)切換同一份業(yè)務(wù)代碼按請(qǐng)求實(shí)時(shí)路由到不同的 LLM如 OpenAI 與 Ollama并通過(guò)回調(diào)日志看清每次請(qǐng)求究竟由哪個(gè)模型處理。什么是 AB Router30秒理解大模型 A/B 測(cè)試當(dāng)你想對(duì)比兩個(gè)大模型的回答質(zhì)量、延遲或成本時(shí)通常不想把選模型的邏輯散落在業(yè)務(wù)代碼里。Eino 社區(qū)提供了 ABRouterChatModel 組件——一個(gè)會(huì)自己選模型的 ChatModel能力說(shuō)明 按請(qǐng)求路由每次Generate/Stream調(diào)用前都會(huì)執(zhí)行你提供的路由函數(shù)動(dòng)態(tài)選定模型? 兼容工具調(diào)用實(shí)現(xiàn)ToolCallingChatModel路由成功后自動(dòng)為所選模型注入 Tools 支持流式輸出Stream與Generate兩條路徑均受路由控制 可追蹤路由返回的模型名會(huì)寫(xiě)入RunInfo回調(diào)Callback里可直接打印/落庫(kù)它的核心是一個(gè)函數(shù)類(lèi)型 ModelRouter接收上下文、輸入消息和模型選項(xiàng)返回(模型名, 模型實(shí)例, error)。只要實(shí)現(xiàn)這個(gè)函數(shù)就能擁有任意路由策略。工作原理按請(qǐng)求動(dòng)態(tài)選擇模型整個(gè)路由過(guò)程由 pickModel 完成可以拆成 3 步調(diào)用路由函數(shù)把本次請(qǐng)求的消息列表交給你寫(xiě)的路由邏輯拿到(modelName, 模型實(shí)例)按需注入工具如果選中的模型支持工具調(diào)用且你配置過(guò)WithTools會(huì)自動(dòng)注入不支持的模型則自動(dòng)跳過(guò)不會(huì)報(bào)錯(cuò)寫(xiě)入追蹤信息用路由返回的modelName構(gòu)建RunInfo讓后續(xù)回調(diào)、日志系統(tǒng)知道這次是 openai 還是 ollama 在干活。上圖是 Eino 中 Graph 編排的拓?fù)浣Y(jié)構(gòu)示例來(lái)自 react_with_interrupt。AB Router 可以直接作為其中的 ChatModel 節(jié)點(diǎn)接入對(duì)上下游完全透明。快速上手OpenAI 與 Ollama 雙模型對(duì)比官方示例位于 components/model/abtest/example演示了OpenAI Ollama 二選一路由。1?? 準(zhǔn)備環(huán)境變量變量作用OPENAI_API_KEYOpenAI API KeyOPENAI_BASE_URL/OPENAI_MODEL兼容端點(diǎn)地址與模型名可指向任意 OpenAI 兼容服務(wù)OPENAI_BY_AZUREAzure 部署時(shí)設(shè)為trueOLLAMA_BASE_URLOllama 服務(wù)地址OLLAMA_MODEL_NAMEOllama 模型名兩個(gè)模型的初始化代碼見(jiàn) example/main.go#L50-L63。2?? 創(chuàng)建路由模型示例的路由規(guī)則很簡(jiǎn)單最后一條用戶(hù)消息內(nèi)容長(zhǎng)度為偶數(shù)走 OpenAI否則走 Ollama等價(jià)于一次流量分流演示見(jiàn) example/main.go#L68-L77router : abtest.NewABRouterChatModel(func(ctx context.Context, in []*schema.Message, _ ...model.Option) (string, model.BaseChatModel, error) { m : in[len(in)-1] if m.Role schema.User len(m.Content)%2 0 { return openai, oai, nil } return ollama, olm, nil }) 返回值里的字符串openai/ollama就是追蹤名它會(huì)出現(xiàn)在回調(diào)日志中。3?? 像普通 ChatModel 一樣調(diào)用sr, err : router.Stream(ctx, msgs) if err ! nil { log.Fatal(err) } defer sr.Close() for { msg, err : sr.Recv() if errors.Is(err, io.EOF) { break } fmt.Print(msg.Content) }在倉(cāng)庫(kù)根目錄執(zhí)行g(shù)o run ./components/model/abtest/example即可運(yùn)行。實(shí)時(shí)追蹤用回調(diào)查看每次請(qǐng)求選中了哪個(gè)模型AB Router 會(huì)自動(dòng)把模型名寫(xiě)入RunInfo你只需在回調(diào)里讀取完整實(shí)現(xiàn)見(jiàn) example/main.go#L40-L48handler : cbutils.NewHandlerHelper().ChatModel(cbutils.ModelCallbackHandler{ OnStart: func(ctx context.Context, info *callbacks.RunInfo, _ *model.CallbackInput) context.Context { log.Printf([abtest choice] %s, info.Name) // 輸出如[abtest choice] openai return ctx }, }).Handler()這樣一來(lái)每條請(qǐng)求都會(huì)留下由哪個(gè)模型處理的痕跡A/B 測(cè)試的數(shù)據(jù)就有了采集入口。如果再配合 components/model/httptransport 提供的 cURL 風(fēng)格 HTTP 傳輸日志連請(qǐng)求體與響應(yīng)細(xì)節(jié)都能完整記錄。工程細(xì)節(jié)這些省心設(shè)計(jì)值得知道工具調(diào)用透明化WithTools 保存的ToolInfo會(huì)在路由成功后惰性注入到所選模型若某個(gè)模型不支持工具調(diào)用則自動(dòng)跳過(guò)無(wú)需你寫(xiě)分支判斷。流式與阻塞雙支持Generate 與 Stream 共享同一套路由邏輯切換調(diào)用方式時(shí)路由行為一致?;卣{(diào)不重復(fù)觸發(fā)組件通過(guò)IsCallbacksEnabled協(xié)調(diào)回調(diào)邊界ab_router.go#L131避免外層包裝 內(nèi)層模型雙重觸發(fā) OnStart/OnEnd。錯(cuò)誤可觀測(cè)路由失敗或模型調(diào)用出錯(cuò)時(shí)都會(huì)觸發(fā)OnError回調(diào)方便你監(jiān)控 A/B 鏈路的健康度。進(jìn)階4 種常見(jiàn)路由策略設(shè)計(jì)由于路由函數(shù)每次請(qǐng)求都會(huì)被調(diào)用你可以輕松實(shí)現(xiàn)以下策略策略思路適用場(chǎng)景流量比例分流按隨機(jī)數(shù)或用戶(hù) ID 哈希分配 95% / 5% 流量新模型灰度驗(yàn)證功能開(kāi)關(guān)路由根據(jù)用戶(hù)等級(jí)、實(shí)驗(yàn)分組返回不同模型精細(xì)化運(yùn)營(yíng)實(shí)驗(yàn)成本降級(jí)主模型超時(shí)/報(bào)錯(cuò)時(shí)在路由函數(shù)中回退到備用模型高可用保障內(nèi)容感知路由分析輸入復(fù)雜度簡(jiǎn)單問(wèn)題走小模型、難題走大模型降本增效示例中按內(nèi)容長(zhǎng)度奇偶分流只是一個(gè)最小演示把哈希、Redis、配置中心接進(jìn)來(lái)就能落地生產(chǎn)級(jí)的 A/B 實(shí)驗(yàn)平臺(tái)。常見(jiàn)問(wèn)題FAQQ1運(yùn)行中更換模型需要重啟服務(wù)嗎不需要。路由函數(shù)在每次請(qǐng)求時(shí)執(zhí)行你甚至可以根據(jù)外部配置中心實(shí)時(shí)改變分流比例實(shí)現(xiàn)熱切換。Q2選中的模型不支持工具調(diào)用怎么辦AB Router 會(huì)自動(dòng)檢測(cè)只有實(shí)現(xiàn)了ToolCallingChatModel的模型才會(huì)注入 Tools見(jiàn) ab_router.go#L69-L75其余模型直接走普通對(duì)話。Q3如何確認(rèn)線上流量確實(shí)按預(yù)期分流用回調(diào)打印RunInfo.Name并接入統(tǒng)計(jì)即可按分鐘/小時(shí)聚合出各模型的實(shí)際請(qǐng)求量。小結(jié)通過(guò) eino-examples 的 AB Router你只需三步就能完成大模型 A/B 測(cè)試與動(dòng)態(tài)切換用NewABRouterChatModel傳入路由函數(shù)定義什么請(qǐng)求走什么模型像普通 ChatModel 一樣調(diào)用Generate/Stream通過(guò)回調(diào)中的RunInfo.Name追蹤每次請(qǐng)求的模型選擇。相關(guān)源碼與資料建議按順序閱讀路由核心實(shí)現(xiàn)components/model/abtest/ab_router.go完整運(yùn)行示例components/model/abtest/example/main.goHTTP 傳輸日志組件components/model/httptransport/倉(cāng)庫(kù)示例總覽COOKBOOK.md贊分享【免費(fèi)下載鏈接】eino-examplesExamples and demonstrations for using the Eino framework項(xiàng)目地址https://gitcode.com/gh_mirrors/ei/eino-examples點(diǎn)擊查看免費(fèi)下載相關(guān)推薦LangChain.js 快速上手三步搭出你的第一個(gè) AI 智能代理LangChain.js 快速上手三步搭出你的第一個(gè) AI 智能代理 想讓大模型真正干活光會(huì)聊天還不夠它得會(huì)查資料、會(huì)調(diào)工具、會(huì)記事。LangChain.人工智能AI 應(yīng)用大模型RAGAI Agent如何在ollmcp中挑選與切換模型動(dòng)態(tài)模型切換與Ollama Cloud大模型實(shí)戰(zhàn)指南如何在ollmcp中挑選與切換模型動(dòng)態(tài)模型切換與Ollama Cloud大模型實(shí)戰(zhàn)指南 ollmcpMCP Client for Ollama是一個(gè)基于終LDDC歌詞工具三分鐘學(xué)會(huì)高效歌詞匹配與格式轉(zhuǎn)換的完整指南LDDC歌詞工具三分鐘學(xué)會(huì)高效歌詞匹配與格式轉(zhuǎn)換的完整指南 你是否曾經(jīng)為了給心愛(ài)的歌曲找到完美匹配的歌詞而煩惱或者需要將歌詞轉(zhuǎn)換成不同格式以適配各種播放器和桌面應(yīng)用音頻上一篇【親測(cè)免費(fèi)】 探索隱私保護(hù)的新高度Privacy Meter開(kāi)源項(xiàng)目推薦下一篇IRISMAN終極指南PS3游戲管理神器完整教程創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考