:從原理到LangChain實現(xiàn)多技能智能助手)
1. 從“意圖識別”到“路由分發(fā)”Agent應用的核心樞紐如果你在2024年或2025年就開始接觸AI Agent開發(fā)大概率會經(jīng)歷過一個階段你精心設計了一個Agent給它裝備了各種強大的工具Tool比如搜索、計算、寫代碼但當你問它一個稍微復雜點的問題時它要么“卡殼”在一個工具里出不來要么像個無頭蒼蠅一樣在幾個工具間來回切換就是給不出你想要的答案。問題的根源往往不在于大模型LLM不夠聰明也不在于工具不夠強大而在于缺少一個關(guān)鍵的“調(diào)度中樞”——意圖路由。簡單來說意圖路由就是Agent的“大腦皮層決策層”。它負責理解用戶的真實意圖然后根據(jù)這個意圖將任務精準地分發(fā)給最合適的子模塊去執(zhí)行。這個子模塊可能是一個單一的工具Tool也可能是一個更復雜的、由多個步驟組成的子工作流Workflow甚至可能是另一個專門的Agent。沒有有效的意圖路由你的Agent就像一個擁有豪華廚房和頂級食材卻不知道客人想點中餐還是西餐的餐廳空有一身本領(lǐng)無處施展。到了2026年隨著大模型能力的進一步滲透和多模態(tài)交互的常態(tài)化Agent的應用場景會從簡單的“問答機器人”演變?yōu)閺碗s的“數(shù)字員工”或“業(yè)務協(xié)作者”。這時意圖路由的重要性會愈發(fā)凸顯。它不再是“錦上添花”的可選項而是構(gòu)建可靠、高效、可擴展Agent應用的基石。本文將拋開理論空談直接切入實戰(zhàn)用一個完整的、可運行的Python項目帶你一步步搭建一個具備意圖路由能力的Agent系統(tǒng)。我們將使用LangChain作為基礎(chǔ)框架但重點會放在路由邏輯的設計與實現(xiàn)上讓你不僅“跑通代碼”更能掌握其背后的設計思想。2. 項目藍圖構(gòu)建一個多技能AI助手為了讓我們的實戰(zhàn)更有針對性我們先來定義這個Agent要做什么。假設我們要開發(fā)一個“個人效率助手”它需要處理以下幾類常見的用戶請求信息查詢例如“上海今天的天氣怎么樣”、“特斯拉最新的股價是多少”內(nèi)容生成例如“幫我寫一封感謝客戶的郵件語氣要專業(yè)且親切。”、“為我的新產(chǎn)品‘智能水杯’想五個宣傳口號?!贝a輔助例如“用Python寫一個函數(shù)計算斐波那契數(shù)列?!薄ⅰ皫臀铱纯催@段JavaScript代碼有什么潛在的內(nèi)存泄漏風險”復雜任務規(guī)劃例如“我想策劃一個周末的短途旅行預算2000元從北京出發(fā)?!薄ⅰ拔倚枰獮橄轮苋膱F隊會議準備一份議程和材料清單?!憋@然用一個“萬能”的LLM調(diào)用加上一堆工具列表Toolkit讓模型自己選在處理簡單任務時或許可行但面對“策劃旅行”這類復雜任務時效果會很不穩(wěn)定。模型可能會陷入細節(jié)或者錯誤地選擇工具順序。因此我們需要一個路由層先對用戶的輸入進行意圖分類然后根據(jù)分類結(jié)果激活不同的處理流水線。我們的系統(tǒng)架構(gòu)將分為三層路由層Router核心組件負責解析用戶輸入判斷意圖類別。執(zhí)行層Executors對應不同意圖的專門處理模塊。每個執(zhí)行器本身可以是一個簡單的工具調(diào)用也可以是一個封裝好的子Agent或工作流。協(xié)調(diào)層Orchestrator負責接收路由結(jié)果調(diào)用對應的執(zhí)行器并整理最終輸出返回給用戶。下面我們就開始用代碼將這份藍圖變?yōu)楝F(xiàn)實。2.1 環(huán)境準備與依賴安裝首先確保你的Python環(huán)境在3.9以上。我們將主要使用langchain和langchain-openai同時為了演示不同的執(zhí)行器也會引入一些其他工具庫。建議使用虛擬環(huán)境。# 創(chuàng)建并激活虛擬環(huán)境可選 python -m venv venv source venv/bin/activate # Linux/Mac # venv\Scripts\activate # Windows # 安裝核心依賴 pip install langchain langchain-openai langchain-community # 安裝一些可能用到的工具庫示例 pip install requests # 用于天氣、股價查詢的HTTP請求 pip install duckduckgo-search # 用于網(wǎng)絡搜索 # 注意openai庫已通過langchain-openai集成通常無需單獨安裝接下來你需要準備一個LLM的API密鑰。本文以OpenAI的GPT-4系列模型為例因為它目前在Function Calling函數(shù)調(diào)用和指令遵循方面表現(xiàn)穩(wěn)定非常適合構(gòu)建路由邏輯。你可以在OpenAI官網(wǎng)獲取API Key。# 在代碼開頭或環(huán)境變量中設置你的API Key import os os.environ[OPENAI_API_KEY] your-openai-api-key-here注意將API Key直接寫在代碼中是不安全的做法在生產(chǎn)環(huán)境中務必使用環(huán)境變量或密鑰管理服務。例如在終端中執(zhí)行export OPENAI_API_KEYyour-key然后在代碼中使用os.environ.get(“OPENAI_API_KEY”)來讀取。2.2 定義意圖類別與路由邏輯這是整個項目的核心。我們需要先明確有哪些意圖類別并為每個類別設計一個“路由提示詞”Router Prompt和對應的“目的地”Destination。在LangChain中我們可以使用LLMRouterChain或更靈活的MultiRouteChain的思路。但為了更清晰地理解原理我們先從底層構(gòu)建一個路由函數(shù)。from langchain_openai import ChatOpenAI from langchain.prompts import ChatPromptTemplate from langchain.schema.output_parser import StrOutputParser from langchain.schema.runnable import RunnableBranch, RunnableLambda # 初始化路由專用的大模型。可以選用更快速、成本更低的模型如 gpt-3.5-turbo router_llm ChatOpenAI(modelgpt-4-turbo-preview, temperature0) # temperature設為0使路由決策更穩(wěn)定 # 定義我們的意圖類別 INTENT_CATEGORIES { “query”: “信息查詢用戶想要獲取實時或事實性信息如天氣、股價、新聞、定義等。”, “generate”: “內(nèi)容生成用戶需要創(chuàng)作或生成新的文本內(nèi)容如寫郵件、寫文案、頭腦風暴、翻譯等?!? “code”: “代碼輔助用戶需要編寫、分析、解釋或調(diào)試代碼?!? “plan”: “復雜任務規(guī)劃用戶需要完成一個多步驟的復雜任務涉及規(guī)劃、決策、信息整合等?!?} # 構(gòu)建路由提示詞模板 ROUTER_PROMPT_TEMPLATE ChatPromptTemplate.from_messages([ (“system”, “””你是一個精準的意圖分類器。你的任務是根據(jù)用戶的輸入判斷其屬于以下哪個類別。 請只輸出類別名稱不要輸出任何其他解釋或文字。 可用的類別及其描述 {categories} 用戶輸入{input} 意圖類別”””), ]) # 創(chuàng)建路由鏈 router_chain ROUTER_PROMPT_TEMPLATE | router_llm | StrOutputParser() # 測試路由函數(shù) def route_intent(user_input: str) - str: “””根據(jù)用戶輸入返回意圖類別””” categories_str “\n”.join([f”{k}: {v}” for k, v in INTENT_CATEGORIES.items()]) result router_chain.invoke({“categories”: categories_str, “input”: user_input}) # 清理輸出確保返回的是我們定義的key之一 result result.strip().lower() for intent in INTENT_CATEGORIES.keys(): if intent in result: return intent # 如果無法匹配返回一個默認類別比如 ‘query’ return “query” # 進行測試 test_inputs [ “北京明天會下雨嗎”, “寫一首關(guān)于春天的五言絕句?!? “用Python實現(xiàn)快速排序算法?!? “幫我規(guī)劃一下十一黃金周去西安的旅游行程?!?] for inp in test_inputs: intent route_intent(inp) print(f”輸入{inp} - 路由結(jié)果{intent}”)運行這段代碼你應該能看到類似以下的輸出輸入‘北京明天會下雨嗎’ - 路由結(jié)果query 輸入‘寫一首關(guān)于春天的五言絕句?!?- 路由結(jié)果generate 輸入‘用Python實現(xiàn)快速排序算法?!?- 路由結(jié)果code 輸入‘幫我規(guī)劃一下十一黃金周去西安的旅游行程?!?- 路由結(jié)果plan這證明我們的路由層已經(jīng)可以工作了。但這里有一個關(guān)鍵點我們讓LLM直接輸出類別名稱這種方式簡單但可能會因為模型輸出格式的微小差異比如多一個句號導致匹配失敗。更健壯的做法是使用LangChain的PydanticOutputParser或利用LLM的Function Calling能力強制其返回結(jié)構(gòu)化的JSON數(shù)據(jù)。2.3 升級路由使用Function Calling實現(xiàn)結(jié)構(gòu)化輸出使用Function Calling可以讓路由決策更加穩(wěn)定和結(jié)構(gòu)化。我們定義一個“路由函數(shù)”讓模型調(diào)用這個函數(shù)并傳入判斷好的類別。from langchain_core.pydantic_v1 import BaseModel, Field from typing import Literal # 使用Pydantic模型定義路由輸出結(jié)構(gòu) class RouteDecision(BaseModel): “””路由決策結(jié)果””” intent: Literal[“query”, “generate”, “code”, “plan”] Field(description”用戶輸入的意圖類別”) confidence: float Field(description”對此判斷的置信度0到1之間”, ge0, le1) reasoning: str Field(description”做出此判斷的簡要理由”, max_length200) # 創(chuàng)建支持結(jié)構(gòu)化輸出的LLM structured_llm router_llm.with_structured_output(RouteDecision) # 構(gòu)建新的路由提示詞可以更簡潔因為輸出結(jié)構(gòu)已定義 STRUCTURED_ROUTER_PROMPT ChatPromptTemplate.from_messages([ (“system”, “你是一個精準的意圖分類器。請分析用戶輸入判斷其意圖類別。”), (“human”, “用戶輸入{input}”), ]) # 創(chuàng)建結(jié)構(gòu)化路由鏈 structured_router_chain STRUCTURED_ROUTER_PROMPT | structured_llm def route_intent_structured(user_input: str) - RouteDecision: “””返回結(jié)構(gòu)化的路由決策””” return structured_router_chain.invoke({“input”: user_input}) # 測試 for inp in test_inputs: decision route_intent_structured(inp) print(f”輸入{inp}”) print(f” 意圖{decision.intent}, 置信度{decision.confidence:.2f}”) print(f” 理由{decision.reasoning}\n”)現(xiàn)在路由層不僅返回類別還給出了置信度和理由這為后續(xù)的決策比如低置信度時請求用戶澄清提供了更多信息系統(tǒng)也更加健壯。3. 構(gòu)建各意圖執(zhí)行器讓專業(yè)的人做專業(yè)的事路由完成后我們需要為每個意圖類別構(gòu)建對應的“執(zhí)行器”。每個執(zhí)行器都是一個獨立的處理單元。為了演示我們將實現(xiàn)其中幾個。3.1 信息查詢執(zhí)行器這個執(zhí)行器負責處理事實性查詢。我們可以集成一個搜索工具如DuckDuckGo和一個LLM來總結(jié)答案。from langchain_community.tools import DuckDuckGoSearchRun from langchain.prompts import PromptTemplate from langchain.schema.runnable import RunnablePassthrough # 初始化搜索工具 search_tool DuckDuckGoSearchRun() # 定義查詢處理的提示詞模板 QUERY_PROMPT PromptTemplate.from_template(“”” 你是一個信息助手。請根據(jù)提供的網(wǎng)絡搜索信息回答用戶的問題。 如果搜索信息不足以回答問題請如實告知不要編造。 用戶問題{question} 搜索信息{search_results} 請給出清晰、準確的回答 “””) # 創(chuàng)建查詢處理鏈 query_llm ChatOpenAI(model“gpt-4-turbo-preview”, temperature0.2) query_chain ( {“question”: RunnablePassthrough(), “search_results”: search_tool} | QUERY_PROMPT | query_llm | StrOutputParser() ) def execute_query(question: str) - str: “””執(zhí)行信息查詢””” return query_chain.invoke(question) # 測試 print(execute_query(“2026年奧運會將在哪里舉行”))3.2 內(nèi)容生成執(zhí)行器這個執(zhí)行器相對直接主要依靠LLM的生成能力但我們可以通過系統(tǒng)提示詞來定制風格。GENERATE_PROMPT ChatPromptTemplate.from_messages([ (“system”, “你是一位專業(yè)的文案寫手和內(nèi)容創(chuàng)作者。請根據(jù)用戶的要求生成高質(zhì)量、流暢、符合語境的內(nèi)容。”), (“human”, “{instruction}”), ]) generate_llm ChatOpenAI(model“gpt-4”, temperature0.7) # 溫度稍高更有創(chuàng)造性 generate_chain GENERATE_PROMPT | generate_llm | StrOutputParser() def execute_generate(instruction: str) - str: “””執(zhí)行內(nèi)容生成””” return generate_chain.invoke({“instruction”: instruction}) # 測試 print(execute_generate(“為公司的新年晚會寫一段主持人開場白要求活潑有趣。”))3.3 代碼輔助執(zhí)行器這個執(zhí)行器需要理解編程問題并能生成或分析代碼。我們可以利用Code Interpreter的思路或者讓LLM生成代碼后再通過一個安全沙箱如exec的受限環(huán)境或Docker容器進行簡單驗證注意生產(chǎn)環(huán)境需極其謹慎。CODE_PROMPT ChatPromptTemplate.from_messages([ (“system”, “””你是一個資深的編程助手。請用清晰、高效、符合最佳實踐的代碼回應用戶的請求。 如果用戶要求分析代碼請指出問題、優(yōu)化建議或潛在風險。 生成的代碼請包含必要的注釋。 語言優(yōu)先使用用戶指定的語言若未指定則根據(jù)問題上下文推斷如無特別說明默認使用Python。 “””), (“human”, “{request}”), ]) code_llm ChatOpenAI(model“gpt-4-turbo-preview”, temperature0.1) # 溫度低代碼更穩(wěn)定 code_chain CODE_PROMPT | code_llm | StrOutputParser() def execute_code_assist(request: str) - str: “””執(zhí)行代碼輔助””” return code_chain.invoke({“request”: request}) # 測試 print(execute_code_assist(“寫一個Python函數(shù)判斷一個字符串是不是回文。”))3.4 復雜任務規(guī)劃執(zhí)行器這是最復雜的部分。它本身可能就是一個子Agent需要拆解任務、制定步驟、并可能調(diào)用其他工具如查詢、生成來逐步完成。這里我們展示一個簡化版讓LLM生成一個詳細的規(guī)劃大綱。PLANNING_PROMPT ChatPromptTemplate.from_messages([ (“system”, “””你是一個卓越的項目經(jīng)理和規(guī)劃師。請將用戶復雜的請求分解為一個清晰、可執(zhí)行、分步驟的行動計劃。 計劃應包括總體目標、關(guān)鍵步驟每一步應具體、可操作、所需資源或信息、以及潛在的風險或注意事項。 請以Markdown列表的形式輸出。 “””), (“human”, “復雜任務{(diào)task}”), ]) planning_llm ChatOpenAI(model“gpt-4-turbo-preview”, temperature0.3) planning_chain PLANNING_PROMPT | planning_llm | StrOutputParser() def execute_planning(task: str) - str: “””執(zhí)行任務規(guī)劃””” return planning_chain.invoke({“task”: task}) # 測試 print(execute_planning(“我想在三個月內(nèi)學習機器學習基礎(chǔ)知識并完成一個預測房價的小項目。請幫我制定學習計劃。”))4. 組裝協(xié)調(diào)層構(gòu)建完整的意圖路由Agent現(xiàn)在我們有了一流的“調(diào)度員”路由層和多個專業(yè)的“工人”執(zhí)行器。最后一步是創(chuàng)建“協(xié)調(diào)層”將兩者連接起來形成一個完整的Agent。我們將使用LangChain的RunnableBranch它可以根據(jù)條件將輸入路由到不同的處理鏈非常適合我們的場景。from langchain.schema.runnable import RunnableBranch, RunnableLambda # 1. 定義路由分支 # 每個分支是一個 (condition, runnable) 對。condition是一個返回布爾值的函數(shù)。 # 我們根據(jù)結(jié)構(gòu)化路由決策的 intent 字段來路由。 def route_based_on_decision(decision: RouteDecision) - str: “””一個簡單的路由函數(shù)返回意圖字符串””” return decision.intent # 2. 將各個執(zhí)行器封裝成RunnableLambda或RunnableSequence # 注意執(zhí)行器函數(shù)接收的是原始用戶輸入而不是路由決策對象。 query_executor RunnableLambda(execute_query) generate_executor RunnableLambda(execute_generate) code_executor RunnableLambda(execute_code_assist) plan_executor RunnableLambda(execute_planning) # 3. 創(chuàng)建分支 branches RunnableBranch( (lambda x: x “query”, query_executor), (lambda x: x “generate”, generate_executor), (lambda x: x “code”, code_executor), (lambda x: x “plan”, plan_executor), ) # 4. 構(gòu)建完整的Agent工作流 # 工作流用戶輸入 - 結(jié)構(gòu)化路由 - 提取意圖 - 分支執(zhí)行 - 結(jié)果 full_agent_chain ( structured_router_chain # 輸入: {“input”: user_input}, 輸出: RouteDecision對象 | RunnableLambda(lambda d: d.intent) # 從RouteDecision中提取intent字段 | branches # 根據(jù)intent路由到對應的執(zhí)行器 ) # 為了方便調(diào)用我們包裝一個函數(shù)它接收字符串返回字符串 def run_agent(user_input: str) - str: “””運行完整的意圖路由Agent””” try: # 分支鏈需要意圖字符串作為輸入但我們需要先獲取路由決策 decision structured_router_chain.invoke({“input”: user_input}) # 根據(jù)意圖選擇執(zhí)行器 intent decision.intent if intent “query”: return execute_query(user_input) elif intent “generate”: return execute_generate(user_input) elif intent “code”: return execute_code_assist(user_input) elif intent “plan”: return execute_planning(user_input) else: return f“無法處理此意圖{intent}” except Exception as e: return f“處理請求時出現(xiàn)錯誤{str(e)}” # 5. 進行端到端測試 complex_questions [ “馬斯克最近有什么新聞”, “為我們的環(huán)??萍脊鞠胍痪鋝logan?!? “用React寫一個簡單的計數(shù)器組件?!? “我打算開始健身增肌請為我制定一個為期兩個月的初級訓練和飲食計劃?!?] print(“ 完整Agent測試 \n”) for q in complex_questions: print(f”用戶{q}”) print(f”助手{run_agent(q)}”) print(“-” * 50)運行這個完整的測試你將看到同一個run_agent函數(shù)能夠根據(jù)不同的用戶問題自動選擇最合適的處理路徑并給出相應的回答。這就是意圖路由的魅力所在。5. 實戰(zhàn)進階意圖路由的優(yōu)化與挑戰(zhàn)一個能跑通的Demo只是起點。要讓意圖路由在實際應用中可靠、高效還需要考慮以下幾個關(guān)鍵問題5.1 處理模糊意圖與低置信度我們的路由決策包含了confidence字段。當置信度低于某個閾值例如0.7時說明模型對意圖的判斷不確定。這時更好的策略不是強行路由而是向用戶發(fā)起澄清。def run_agent_with_clarification(user_input: str, confidence_threshold: float 0.7) - str: “””帶澄清的低置信度處理””” decision structured_router_chain.invoke({“input”: user_input}) if decision.confidence confidence_threshold: # 生成澄清問題 clarification_prompt ChatPromptTemplate.from_messages([ (“system”, “你正在嘗試理解用戶的意圖但不太確定。請生成一個簡潔的問題幫助用戶澄清他們的需求?!?, (“human”, f”用戶原話‘{user_input}’。你判斷的意圖是‘{decision.intent}’但置信度較低{decision.confidence:.2f}。”), ]) clarify_chain clarification_prompt | ChatOpenAI(model“gpt-4-turbo-preview”, temperature0) | StrOutputParser() clarification clarify_chain.invoke({}) return f“[需要澄清] {clarification}” # 高置信度正常處理 return run_agent(user_input) # 復用之前的邏輯5.2 執(zhí)行器的組合與嵌套“復雜任務規(guī)劃”執(zhí)行器本身可能就是一個“元Agent”。它生成的計劃其中的某些步驟如“查詢當?shù)孛朗场?、“生成預算表格”可以再次被路由到query或generate執(zhí)行器。這就形成了嵌套路由是構(gòu)建復雜、強大Agent的關(guān)鍵。實現(xiàn)這一點需要將協(xié)調(diào)層設計成可遞歸調(diào)用的或者使用LangGraph等專門用于構(gòu)建有狀態(tài)、多步驟工作流的框架。5.3 性能與成本考量路由模型選擇路由不一定需要用最強大、最貴的模型。像gpt-3.5-turbo這類模型在分類任務上通常已經(jīng)足夠準確且響應更快、成本更低。可以進行A/B測試在準確率和成本間找到平衡。緩存對于常見的、重復的用戶意圖可以緩存路由結(jié)果避免每次都對相同或相似的輸入調(diào)用LLM。異步處理如果執(zhí)行器涉及網(wǎng)絡請求如搜索或長時間運行的任務應使用異步調(diào)用避免阻塞主線程。5.4 評估與迭代如何知道你的路由系統(tǒng)工作得好不好你需要建立評估機制。收集測試集整理一批真實的用戶輸入并人工標注正確的意圖類別。計算指標運行路由器計算準確率、召回率、F1分數(shù)等。分析錯誤仔細查看分錯的案例。是類別定義模糊還是提示詞需要優(yōu)化或者是模型能力不足迭代優(yōu)化根據(jù)分析結(jié)果調(diào)整意圖類別定義、優(yōu)化路由提示詞、或引入更細粒度的分類例如將query進一步分為weather_query,stock_query,general_knowledge_query。6. 從LangChain到LangGraph構(gòu)建有狀態(tài)的智能體工作流在我們當前的實現(xiàn)中協(xié)調(diào)層是線性的、無狀態(tài)的輸入 - 路由 - 執(zhí)行 - 輸出。但對于真正的“復雜任務規(guī)劃”這遠遠不夠。規(guī)劃往往是一個循環(huán)往復的過程制定計劃 - 執(zhí)行步驟 - 檢查結(jié)果 - 調(diào)整計劃 - 繼續(xù)執(zhí)行。這就是LangGraph發(fā)揮作用的地方。LangGraph基于LangChain構(gòu)建專門用于創(chuàng)建有狀態(tài)、可循環(huán)、多參與者的圖工作流。它非常適合實現(xiàn)我們上面提到的“嵌套路由”和“動態(tài)規(guī)劃執(zhí)行”。想象一下我們的“旅行規(guī)劃”Agent在LangGraph中的工作流可能如下節(jié)點意圖路由。接收用戶請求“規(guī)劃西安旅行”路由到plan意圖。節(jié)點計劃生成。調(diào)用LLM生成一個初步計劃大綱如確定日期、查詢天氣、預訂機票、查找酒店、安排行程。節(jié)點步驟執(zhí)行器。這是一個子圖或循環(huán)。它遍歷計劃中的每個步驟對于“查詢天氣”它會將任務路由回主圖的query執(zhí)行器或一個專門的天氣查詢工具。對于“查找酒店”它可能調(diào)用一個酒店預訂API工具。每個步驟執(zhí)行后將結(jié)果收集到共享的“狀態(tài)”中。條件邊。檢查所有步驟是否完成。如果完成進入下一個節(jié)點如果某個步驟失敗或需要人工確認則進入“人工干預”節(jié)點或重新調(diào)整計劃。節(jié)點結(jié)果匯總。將所有步驟的結(jié)果整合成一份完整的旅行計劃報告。使用LangGraph你可以用代碼清晰地定義這些節(jié)點和它們之間的流轉(zhuǎn)關(guān)系包括條件分支和循環(huán)。這比用單純的函數(shù)調(diào)用鏈來實現(xiàn)要清晰和強大得多。對于2026年想要構(gòu)建復雜商業(yè)級Agent的開發(fā)者來說掌握LangGraph這類框架將是必備技能。我個人的體會是意圖路由是Agent智能的“開關(guān)”和“導航”。一個設計良好的路由系統(tǒng)能讓你的Agent從“一個有點聰明但時常犯暈的聊天機器人”升級為“一個目標明確、分工有序的智能團隊”。在實戰(zhàn)中不要追求一步到位設計出完美的路由分類而是應該從核心的、差異最明顯的幾個意圖開始通過不斷收集用戶反饋和錯誤案例逐步迭代和細化你的路由策略。同時務必關(guān)注系統(tǒng)的可觀測性記錄下每一次路由的決策、置信度和最終結(jié)果這些數(shù)據(jù)是你優(yōu)化系統(tǒng)最寶貴的資產(chǎn)。