戰(zhàn):用 YAML 配置構(gòu)建帶反饋回路的 Workflow(loop_config 樣本詳解))
ADK Python 實(shí)戰(zhàn)用 YAML 配置構(gòu)建帶反饋回路的 Workflowloop_config 樣本詳解【免費(fèi)下載鏈接】adk-pythonAn open-source, code-first Python toolkit for building, evaluating, and deploying sophisticated AI agents with flexibility and control.項(xiàng)目地址: https://gitcode.com/GitHub_Trending/ad/adk-python本文圍繞 ADKAgent Development KitPython 版中的loop_config官方樣本完整講解如何用 YAML 配置文件定義一個(gè)“生成—評(píng)估—反饋—重試”的反饋回路工作流包括root_agent.yaml中 edges 的完整寫(xiě)法、代碼引用Code References、邊內(nèi)函數(shù)引用Function References in Edges與外部 Agent 文件External Agent Files三處特殊語(yǔ)法的語(yǔ)義和解析原理以及通過(guò)黃金測(cè)試事件序列驗(yàn)證回路實(shí)際運(yùn)行的方法。讀完后你將能夠直接用配置代替 Python 代碼來(lái)搭建帶循環(huán)路由的 ADK Workflow。一、樣本解決什么問(wèn)題loop_config是 contributing/samples/workflows/loop_config/README.md 所描述的官方樣本它演示如何用 YAML 定義一個(gè)帶反饋回路feedback loop的 Workflowprocess_input把用戶輸入主題寫(xiě)入會(huì)話狀態(tài)generate_headlineLLM Agent 根據(jù)主題生成標(biāo)題并參考上一輪反饋evaluate_headlineLLM Agent 對(duì)標(biāo)題打分tech-related或unrelated并給出改進(jìn)建議route_headline按打分結(jié)果路由——若為unrelated攜帶反饋回到generate_headline重新生成形成回路若為tech-related流程結(jié)束。該樣本與 Python 版本的 contributing/samples/workflows/loop/agent.py 行為完全對(duì)應(yīng)README 稱其 mirrors 該樣本區(qū)別僅在于圖結(jié)構(gòu)用 YAML 而非 Python 字面量表達(dá)。README 明確指出加載root_agent.yaml后agent_class: Workflow會(huì)被解析為Workflow類edges會(huì)映射到Workflow同名字段最終得到五條邊、最后一條為unrelated回到generate_headline的Workflow實(shí)例。二、樣本文件結(jié)構(gòu)與職責(zé)contributing/samples/workflows/loop_config/ ├── README.md # 樣本說(shuō)明本文主體來(lái)源 ├── root_agent.yaml # 工作流圖定義agent_class edges ├── agent.py # Feedback 模型 process_input / route_headline 函數(shù) ├── generate_headline.yaml # 生成標(biāo)題的 LlmAgent 定義 ├── evaluate_headline.yaml # 評(píng)估標(biāo)題的 LlmAgent 定義含 output_schema └── tests/ ├── flower.json # 黃金事件序列非科技主題觸發(fā)回路 └── computer.json # 黃金事件序列各文件職責(zé)文件作用root_agent.yaml根工作流聲明agent_class: Workflow用edges描述整張執(zhí)行圖含回路邊agent.py存放 Pydantic 結(jié)構(gòu)化輸出模型Feedback以及兩個(gè)普通 Python 函數(shù)process_input、route_headlinegenerate_headline.yaml/evaluate_headline.yaml獨(dú)立 YAML 定義的LlmAgent被 root 邊引用tests/*.json從目錄結(jié)構(gòu)看是錄制的完整會(huì)話事件流事件列表 最終 state可用來(lái)逐步核對(duì)每個(gè)節(jié)點(diǎn)的輸入輸出三、完整配置文件逐文件解讀3.1 根工作流root_agent.yamlcontributing/samples/workflows/loop_config/root_agent.yaml 全文去掉許可證頭agent_class: Workflow name: root_agent edges: - - START - .agent.process_input - generate_headline.yaml - evaluate_headline.yaml - .agent.route_headline - - .agent.route_headline - unrelated: generate_headline.yaml兩個(gè)要點(diǎn)第一條邊是一個(gè)線性序列START → process_input → generate_headline → evaluate_headline → route_headline。列表中混用了三種節(jié)點(diǎn)表示法函數(shù)引用.agent.process_input、外部 Agent 文件generate_headline.yaml這正是下面第四節(jié)三種特殊語(yǔ)法的綜合演示。第二條邊是回路邊.agent.route_headline之后的unrelated: generate_headline.yaml是一個(gè)路由字典——當(dāng)route_headline產(chǎn)出的route值等于unrelated時(shí)流轉(zhuǎn)到generate_headline.yaml節(jié)點(diǎn)其他路由值tech-related沒(méi)有出邊流程自然終止。3.2 生成節(jié)點(diǎn)generate_headline.yamlcontributing/samples/workflows/loop_config/generate_headline.yamlagent_class: LlmAgent name: generate_headline instruction: | Write a headline about the topic {topic}. If feedback is provided, take it into account. The feedback: {feedback?}agent_class: LlmAgent告訴 loader 該文件描述的是一個(gè)LlmAgent實(shí)例指令中的{topic}來(lái)自process_input寫(xiě)入狀態(tài)的鍵{feedback?}中的?是可選插值語(yǔ)法首輪執(zhí)行時(shí) state 中還沒(méi)有feedback鍵使用可選占位符可避免缺失報(bào)錯(cuò)第二輪起則自動(dòng)帶入evaluate_headline寫(xiě)入的反饋內(nèi)容。3.3 評(píng)估節(jié)點(diǎn)evaluate_headline.yamlcontributing/samples/workflows/loop_config/evaluate_headline.yamlagent_class: LlmAgent name: evaluate_headline instruction: | Grade whether the headline is related to technology or software engineering. output_schema: name: loop_config.agent.Feedback output_key: feedbackoutput_schema采用name條目攜帶全限定類名loop_config.agent.Feedbackloader 會(huì)動(dòng)態(tài)導(dǎo)入該對(duì)象——這是 README 所述 “Code References” 語(yǔ)法的實(shí)際用例output_key: feedback指定評(píng)估結(jié)果寫(xiě)入會(huì)話狀態(tài)中的鍵名正是回路下一輪generate_headline指令里{feedback?}讀取的鍵。3.4 Python 側(cè)agent.pycontributing/samples/workflows/loop_config/agent.py 定義了圖節(jié)點(diǎn)之外的全部 Python 代碼class Feedback(BaseModel): grade: Literal[tech-related, unrelated] Field( description( Decide if the headline is related to technology or software engineering. ) ) feedback: str Field( description( If the headline is unrelated to technology, provide feedback on how to make it more tech-focused. ) ) def process_input(node_input: str): Puts user input in the state. return Event(state{topic: node_input}) def route_headline(node_input: Feedback): return Event(routenode_input.grade)Feedback結(jié)構(gòu)化輸出模型grade限定為兩個(gè)取值正好對(duì)應(yīng)路由字典的兩個(gè)鍵之一process_input接收節(jié)點(diǎn)輸入用戶消息文本通過(guò)Event(state{...})把主題寫(xiě)入狀態(tài)route_headline讀取上一節(jié)點(diǎn)寫(xiě)入的feedback反序列化為Feedback通過(guò)Event(route...)聲明路由值驅(qū)動(dòng)Workflow按出邊字典分發(fā)。與 Python 版樣本對(duì)照contributing/samples/workflows/loop/agent.py 中同樣的圖是用Workflow(nameroot_agent, edges[(...), (route_headline, {unrelated: generate_headline})])字面量寫(xiě)出的兩者的edges結(jié)構(gòu)一一對(duì)應(yīng)可交叉驗(yàn)證 YAML 語(yǔ)義。四、README 定義的三處特殊語(yǔ)法READMEcontributing/samples/workflows/loop_config/README.md明確歸納了本樣本用到的三種動(dòng)態(tài)解析語(yǔ)法4.1 代碼引用Code References持有 Python 對(duì)象的字段如evaluate_headline.yaml中的output_schema可以寫(xiě)成帶name條目的結(jié)構(gòu)name是該對(duì)象的全限定名loader 負(fù)責(zé)導(dǎo)入解析基于sys.path其中包含 agent 目錄所在目錄示例name: loop_config.agent.Feedback解析為本目錄下agent.py中的FeedbackPydantic 模型。4.2 邊內(nèi)函數(shù)引用Function References in Edges邊列表中的字符串如果不以.yaml結(jié)尾、也不是START就會(huì)被當(dāng)作函數(shù)引用處理以.開(kāi)頭時(shí)相對(duì)當(dāng)前 agent 目錄的 Python 包路徑解析。示例.agent.process_input解析為agent.py中的process_input函數(shù)即先展開(kāi)為loop_config.agent.process_input再導(dǎo)入loader 會(huì)自動(dòng)用函數(shù)名作為節(jié)點(diǎn)名創(chuàng)建FunctionNode本例中節(jié)點(diǎn)名即process_input不帶前導(dǎo)點(diǎn)的引用如.agent.route_headline展開(kāi)后的包路徑形式走同樣的sys.path導(dǎo)入邏輯。4.3 外部 Agent 文件External Agent FilesAgent 可以定義在獨(dú)立 YAML 文件中邊列表中直接用文件名引用示例generate_headline.yaml即引用該文件定義的LlmAgent實(shí)例復(fù)用mapper 按字符串值緩存已解析節(jié)點(diǎn)因此在多條邊中重復(fù)使用同一文件名回路場(chǎng)景必然如此generate_headline.yaml同時(shí)出現(xiàn)在首條邊和unrelated出邊中會(huì)命中同一個(gè)節(jié)點(diǎn)實(shí)例從而正確保持圖結(jié)構(gòu)——這是回路能夠成立的關(guān)鍵機(jī)制。五、源碼級(jí)原理loader 如何把字符串解析成節(jié)點(diǎn)上述三種語(yǔ)法的實(shí)現(xiàn)集中在 src/google/adk/agents/config_agent_utils.py 的_resolve_node_like方法約 L334–L394可以直接印證 README 的描述START哨兵字符串START直接映射為Workflow的START常量L340–L341緩存優(yōu)先任何字符串/內(nèi)聯(lián)節(jié)點(diǎn)在解析前都會(huì)先查_(kāi)resolved_nodes_cacheL349–L350命中即返回同一對(duì)象——這正是“同一文件名在多邊中復(fù)用同一實(shí)例”的源碼依據(jù)L355、L391–L393 寫(xiě)入緩存且同時(shí)以原始字符串和節(jié)點(diǎn)name兩個(gè)鍵登記.yaml/.yml后綴構(gòu)造AgentRefConfig(config_path...)并調(diào)用resolve_agent_reference加載外部 Agent 文件L352–L358裸單詞的限制不含.的字符串被視為已存在的節(jié)點(diǎn)名若緩存里沒(méi)有會(huì)拋出ValueError提示“節(jié)點(diǎn)必須由更早的邊先定義”即不支持前向引用L360–L368。這意味著寫(xiě) edges 時(shí)節(jié)點(diǎn)必須先定義后引用前導(dǎo)點(diǎn)相對(duì)路徑以.開(kāi)頭的引用會(huì)取當(dāng)前 agent 目錄名拼成包路徑L371–L374再經(jīng)resolve_fully_qualified_name導(dǎo)入若結(jié)果是可調(diào)用對(duì)象非類則用最后一段作為節(jié)點(diǎn)名創(chuàng)建FunctionNodeL376–L379與 README “自動(dòng)創(chuàng)建 FunctionNode” 的描述一致非法引用快速失敗解析結(jié)果既非可調(diào)用也非節(jié)點(diǎn)時(shí)立即拋出帶引用名的ValueErrorL386–L389避免問(wèn)題延遲到圖校驗(yàn)階段才暴露。由此也能解釋 README 的運(yùn)行前提因?yàn)榇a引用是對(duì)sys.path解析的必須從 agent 文件夾所在目錄即contributing/samples/workflows/作為工作目錄運(yùn)行與 ADK CLI 加載 agent 的約定一致。對(duì)應(yīng)的圖運(yùn)行時(shí)實(shí)現(xiàn)位于 src/google/adk/workflow/_workflow.pyWorkflow類與edges字段及 src/google/adk/workflow/_function_node.pyFunctionNodeedges 列表中的元組/字典形式與 YAML 中- - START / .agent.process_input / ...的結(jié)構(gòu)完全同構(gòu)。六、用黃金事件序列驗(yàn)證回路真的發(fā)生了tests/目錄下的 contributing/samples/workflows/loop_config/tests/flower.json 錄入了主題flower非科技主題注定觸發(fā)回路的完整事件流可逐步對(duì)照驗(yàn)證e-2process_input1stateDelta.topic flower——主題寫(xiě)入狀態(tài)e-3generate_headline1首輪產(chǎn)出Petal Power: The Timeless Allure of Flowerse-4evaluate_headline1模型輸出 JSON{grade: unrelated, feedback: ...}并寫(xiě)入stateDelta.feedback——注意state中的feedback值正是下一輪生成的輸入e-5route_headline1actions.route unrelated——命中unrelated: generate_headline.yaml出邊回到生成節(jié)點(diǎn)e-6generate_headline2節(jié)點(diǎn)名后綴2表明同一節(jié)點(diǎn)第二次執(zhí)行新標(biāo)題AI-Powered Petals: ...明顯吸收了反饋e-7evaluate_headline2grade tech-relatede-8route_headline2route tech-related無(wú)對(duì)應(yīng)出邊調(diào)用結(jié)束。最終state同時(shí)包含topic: flower與feedback.grade: tech-related完整還原了“生成 → 評(píng)估 → 反饋 → 再生成 → 通過(guò)”的回路閉環(huán)。tests/computer.json提供了另一組主題的事件記錄可作對(duì)照。七、執(zhí)行方式與運(yùn)行前提運(yùn)行目錄從contributing/samples/workflows/目錄執(zhí)行 ADK 命令README 原話代碼引用相對(duì)sys.path解析須“從持有 agent 文件夾的目錄運(yùn)行與 CLI 的約定一致”。由于root_agent.yaml聲明name: root_agent且文件位于loop_config/目錄按 ADK CLI 的 agent 目錄約定該目錄即一個(gè)可加載的 agent 項(xiàng)目輸入示例README 給出的兩個(gè)測(cè)試輸入為Python programming科技主題預(yù)期一輪通過(guò)與Baking cookies非科技主題預(yù)期觸發(fā)unrelated回路前提與限制模型訪問(wèn)由LlmAgent默認(rèn)配置決定本樣本自身未固定模型與 API 配置回路邊只聲明了unrelated路由tech-related無(wú)出邊即終止因此不會(huì)出現(xiàn)死循環(huán)若自行擴(kuò)展路由字典需自行保證終止性節(jié)點(diǎn)必須先定義后引用前向引用會(huì)直接報(bào)錯(cuò)新增節(jié)點(diǎn)時(shí)應(yīng)保持“定義在前的邊”出現(xiàn)在引用它的邊之前。八、小結(jié)配置式 Workflow 回路的三個(gè)可復(fù)用模式對(duì)照 contributing/samples/workflows/loop_config/ 全套文件可以把該樣本抽象為三個(gè)可直接復(fù)用的模式圖結(jié)構(gòu)完全 YAML 化agent_class: Workflowedges即可表達(dá)含循環(huán)的執(zhí)行圖LLM 節(jié)點(diǎn)拆成獨(dú)立.yaml文件按文件名引用Python 側(cè)只保留路由函數(shù)與結(jié)構(gòu)化模型動(dòng)態(tài)解析三語(yǔ)法name全限定名任意 Python 對(duì)象如output_schema、前導(dǎo)點(diǎn)函數(shù)引用自動(dòng)轉(zhuǎn)FunctionNode、外部 Agent 文件名帶實(shí)例級(jí)緩存保證圖結(jié)構(gòu)正確用狀態(tài)鍵串聯(lián)回路數(shù)據(jù)output_keyfeedback寫(xiě)入狀態(tài)下一輪指令中的{feedback?}可選插值讀出配合路由函數(shù)讀取output_key的值決定走向——“狀態(tài)即回路記憶”無(wú)需任何額外會(huì)話管理代碼。這一套語(yǔ)法與 Python 字面量寫(xiě)法contributing/samples/workflows/loop/agent.py行為等價(jià)適合在需要把 Agent 拓?fù)浣唤o非 Python 流程管理配置即代碼、易于審查與批量生成的場(chǎng)景中直接套用。【免費(fèi)下載鏈接】adk-pythonAn open-source, code-first Python toolkit for building, evaluating, and deploying sophisticated AI agents with flexibility and control.項(xiàng)目地址: https://gitcode.com/GitHub_Trending/ad/adk-python創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考