久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營的一線實(shí)戰(zhàn)洞察。

LangGraph狀態(tài)代碼實(shí)戰(zhàn):State定義、Reducer合并與條件分支

LangGraph狀態(tài)代碼實(shí)戰(zhàn):State定義、Reducer合并與條件分支 LangGraph 這個(gè)庫這兩年討論度很高但我在社區(qū)里看過不少人的練習(xí)路徑有個(gè)共同問題一上來就追著多代理架構(gòu)跑結(jié)果圖是搭出來了State 卻改得亂七八糟一加分支就崩。我自己練 LangGraph 的順序和別人不太一樣最先啃的就是狀態(tài)代碼——State 的定義、節(jié)點(diǎn)返回值怎么合并、Reducer 怎么控制更新、條件分支里狀態(tài)怎么傳。這套練扎實(shí)之后再看那些多節(jié)點(diǎn)、帶分支、帶記憶的流程基本就通了。這篇文章就把我完整的狀態(tài)代碼練習(xí)過程記錄下來環(huán)境基于我常用的較新版 LangGraph適合剛接觸這個(gè)庫、以及已經(jīng)會(huì)搭圖但對狀態(tài)更新機(jī)制一知半解的同學(xué)。1. 先把狀態(tài)模型這層窗戶紙捅破1.1 狀態(tài)到底是什么、為什么值得專門練LangGraph 的核心是一個(gè)狀態(tài)圖節(jié)點(diǎn)Node負(fù)責(zé)干活邊Edge決定順序而貫穿所有節(jié)點(diǎn)之間、讓每個(gè)節(jié)點(diǎn)都能讀到上下文的東西就是 State。State 本身就是一個(gè)字典結(jié)構(gòu)的對象你用 TypedDict 或 dataclass 提前定義好它長什么樣然后每次節(jié)點(diǎn)執(zhí)行完后把“想改的字段”做成一個(gè)字典返回圖的運(yùn)行時(shí)負(fù)責(zé)把這些改動(dòng)合并回總狀態(tài)里。我說的“練狀態(tài)代碼”練的就是這三件事第一怎么定義一份合理的狀態(tài)結(jié)構(gòu)第二節(jié)點(diǎn)返回什么樣的數(shù)據(jù)、以什么方式合并進(jìn)總狀態(tài)第三在分支、循環(huán)、并行節(jié)點(diǎn)里狀態(tài)怎么傳遞不丟不串。這三件事任何一個(gè)沒搞明白圖都能跑但跑出來的結(jié)果就是不對而且特別難排查。為什么說這個(gè)值得單獨(dú)練因?yàn)楹芏鄠鹘y(tǒng)開發(fā)者的直覺是“函數(shù)輸入輸出”。一個(gè)函數(shù)處理完數(shù)據(jù)把結(jié)果返回給下一個(gè)函數(shù)參數(shù)一顆顆傳下去。這套思路在寫普通后端接口時(shí)沒問題但一旦涉及多步驟的智能體流程——比如先規(guī)劃、再檢索、再生成、中途還要根據(jù)結(jié)果決定走哪條分支——函數(shù)式的傳參會(huì)讓代碼變成一團(tuán)亂麻。State 本質(zhì)上是一塊“公共白板”所有節(jié)點(diǎn)都能往上寫、都能往里讀你不需要在調(diào)用時(shí)手動(dòng)把每一步的臨時(shí)變量傳來傳去。這個(gè)模型想通了LangGraph 就算入門了。1.2 從“接力棒”到“公共白板”的思維切換先看一個(gè)典型的舊思路代碼def step1(raw_text: str) - str: cleaned raw_text.strip().lower() return cleaned def step2(cleaned: str) - list[str]: tokens cleaned.split() return tokens result step2(step1( Hello LangGraph ))每一步函數(shù)都只接收上一個(gè)函數(shù)的返回值如果你想在最后一步同時(shí)拿到 raw_text、cleaned、tokens就得用元組或者類把這些都包著往下傳。代碼一多參數(shù)列表就失控了。換成 LangGraph 的狀態(tài)模型寫法變成了這樣from typing import TypedDict from langgraph.graph import StateGraph, START, END class MyState(TypedDict): raw_text: str cleaned: str tokens: list[str] def step1(state: MyState) - dict: return {cleaned: state[raw_text].strip().lower()} def step2(state: MyState) - dict: return {tokens: state[cleaned].split()} builder StateGraph(MyState) builder.add_node(step1, step1) builder.add_node(step2, step2) builder.add_edge(START, step1) builder.add_edge(step1, step2) builder.add_edge(step2, END) graph builder.compile() print(graph.invoke({raw_text: Hello LangGraph }))注意 step2 里讀的state[cleaned]并不是 step1 直接傳給你的參數(shù)而是 step1 寫好、圖運(yùn)行時(shí)合并進(jìn) State 之后的公共數(shù)據(jù)。這就像一個(gè)團(tuán)隊(duì)共用的項(xiàng)目白板每個(gè)人干完活把自己負(fù)責(zé)的那部分更新上去下一個(gè)同事需要什么直接看白板不需要等某個(gè)人把結(jié)果遞到手里。你可能覺得這個(gè)例子太簡單看不出差別。但你要是在這個(gè)圖里再加一個(gè)“日志收集節(jié)點(diǎn)”、加一個(gè)“異常處理分支”State 的優(yōu)勢馬上就出來了——日志往logs字段里累積分支判斷讀state[status]每個(gè)節(jié)點(diǎn)只需要關(guān)心自己讀寫的那幾個(gè)字段不要碰自己不關(guān)心的東西。這就是狀態(tài)驅(qū)動(dòng)設(shè)計(jì)的核心思想。2. 第一個(gè)狀態(tài)練習(xí)最小可運(yùn)行圖2.1 把環(huán)境準(zhǔn)備好LangGraph 是純 Python 庫安裝很簡單pip install langgraph建議 Python 版本 3.9 以上另外如果你計(jì)劃跑帶持久化的例子還需要確認(rèn)langgraph-checkpoint已經(jīng)作為依賴裝好。我練習(xí)時(shí)習(xí)慣在普通 Python 腳本里寫因?yàn)槟_本跑完能直接看到 print 輸出比在交互式環(huán)境里更容易保留完整記錄。注意LangGraph 的 API 在 0.1 到 0.2 之間有過調(diào)整比較明顯的變化是入口圖用START而不是__start__。我這篇文章的代碼基于 0.2.x 及以上版本如果你還在用很老的版本建議先升級到最新穩(wěn)定版再照著練。2.2 用 TypedDict 把狀態(tài)結(jié)構(gòu)先釘死狀態(tài)結(jié)構(gòu)是一張圖的“數(shù)據(jù)庫表結(jié)構(gòu)”先想清楚再寫節(jié)點(diǎn)。我第一次練習(xí)時(shí)直接上來寫節(jié)點(diǎn)函數(shù)結(jié)果反復(fù)改字段名圖一跑就 KeyError。后來我學(xué)乖了任何練習(xí)的第一步永遠(yuǎn)是定義狀態(tài)。from typing import TypedDict class CounterState(TypedDict): count: int logs: list[str]這個(gè)狀態(tài)有兩個(gè)字段count用來記錄數(shù)值logs用來記錄每一步的處理日志。就這么簡單但注意一個(gè)細(xì)節(jié)字段的類型要寫具體int、list[str]都明確標(biāo)注因?yàn)楹竺鎸懝?jié)點(diǎn)函數(shù)時(shí) IDE 會(huì)幫你做提示字段名拼錯(cuò)時(shí)也能更快發(fā)現(xiàn)。為什么用 TypedDict 而不是普通字典因?yàn)槠胀ㄗ值涮杂闪斯?jié)點(diǎn)里寫state[cnt]和state[count]都不會(huì)報(bào)錯(cuò)運(yùn)行時(shí)才會(huì)炸TypedDict 至少能在編輯器里給你一層提示和約束。LangGraph 本身也支持 pydantic 模型或 dataclass 作為狀態(tài)定義但初學(xué)者從 TypedDict 起步最合適它足夠輕量心智負(fù)擔(dān)最小。2.3 用三個(gè)節(jié)點(diǎn)跑通完整鏈路定義好狀態(tài)之后我加三個(gè)節(jié)點(diǎn)一個(gè)加一、一個(gè)翻倍、一個(gè)收尾記錄。重點(diǎn)看每個(gè)節(jié)點(diǎn)怎么返回“更新補(bǔ)丁”。from typing import TypedDict from langgraph.graph import StateGraph, START, END class CounterState(TypedDict): count: int logs: list[str] def add_one(state: CounterState) - dict: new_count state[count] 1 return {count: new_count, logs: state[logs] [fadd_one - {new_count}]} def double(state: CounterState) - dict: new_count state[count] * 2 return {count: new_count, logs: state[logs] [fdouble - {new_count}]} def final_note(state: CounterState) - dict: return {logs: state[logs] [ffinal count is {state[count]}]} builder StateGraph(CounterState) builder.add_node(add_one, add_one) builder.add_node(double, double) builder.add_node(final, final_note) builder.add_edge(START, add_one) builder.add_edge(add_one, double) builder.add_edge(double, final) builder.add_edge(final, END) graph builder.compile() result graph.invoke({count: 1, logs: []}) print(result)運(yùn)行結(jié)果{count: 4, logs: [add_one - 2, double - 4, final count is 4]}我建議你親手跑一遍這個(gè)例子重點(diǎn)觀察兩件事。第一invoke的入?yún)⑹恰俺跏紶顟B(tài)”返回值是“最終狀態(tài)”中間每個(gè)節(jié)點(diǎn)產(chǎn)生的新狀態(tài)你是看不見的除非你在節(jié)點(diǎn)里打印。第二節(jié)點(diǎn)返回的字典不需要包含所有字段比如double節(jié)點(diǎn)完全可以不返回logs原樣保留也可以像我這樣手動(dòng)拼接后返回。這里有個(gè)初學(xué)者最容易踩的坑以為節(jié)點(diǎn)返回什么狀態(tài)就“變成”什么實(shí)際上對于沒有配置特殊合并邏輯的字段返回的 value 會(huì)直接覆蓋舊值。2.4 在節(jié)點(diǎn)里埋點(diǎn)觀察狀態(tài)流轉(zhuǎn)光看最終結(jié)果你可能還是不知道狀態(tài)到底怎么變的。我的練習(xí)習(xí)慣是在每個(gè)節(jié)點(diǎn)開頭打印當(dāng)前狀態(tài)def double(state: CounterState) - dict: print(f[double] 進(jìn)入時(shí)狀態(tài): {state}) new_count state[count] * 2 return {count: new_count, logs: state[logs] [fdouble - {new_count}]}這樣跑一次就能看到每條邊觸發(fā)時(shí)狀態(tài)里已經(jīng)累積了什么、當(dāng)前節(jié)點(diǎn)準(zhǔn)備改什么。等你以后排查“哪個(gè)節(jié)點(diǎn)把狀態(tài)改壞了”時(shí)這個(gè)習(xí)慣能幫你省下一大半時(shí)間。提示compile()之后得到的是一個(gè)可調(diào)用的編譯對象。你可以反復(fù)調(diào)用invoke每次傳入新的初始狀態(tài)互不干擾。這跟“同一個(gè)圖的多次運(yùn)行之間默認(rèn)沒有記憶”這一特性有關(guān)后面講 Checkpointer 時(shí)再展開。3. 狀態(tài)更新的核心Reducer 機(jī)制一定要親手試3.1 默認(rèn)覆蓋行為先知道“什么都不寫”時(shí)是什么效果在 LangGraph 里如果你在狀態(tài)定義里對某個(gè)字段沒做任何標(biāo)注那它的默認(rèn)更新方式就是“整體覆蓋”。兩個(gè)節(jié)點(diǎn)不管誰先誰后只要都返回同一個(gè)字段名后執(zhí)行的節(jié)點(diǎn)就會(huì)把前一個(gè)節(jié)點(diǎn)的值整個(gè)替換掉。這個(gè)行為本身沒問題count這種標(biāo)量字段用覆蓋就很合理——最后一步的值就是我想要的值。但一旦字段是列表、字典這種“需要累積”的數(shù)據(jù)覆蓋行為就會(huì)讓你抓狂。比如上面例子里如果我不手動(dòng)把state[logs] [新日志]拼好再返回而是直接返回{logs: [新日志一]}那跑完后logs里只剩最后一個(gè)節(jié)點(diǎn)的記錄前面的全丟了。所以你需要理解 Reducer它決定了“多個(gè)更新同時(shí)作用到同一個(gè)字段上時(shí)怎么合并”。沒有 Reducer就是后寫覆蓋有 Reducer就能做到追加、拼接、去重等自定義合并。3.2 用 add_messages 維護(hù)對話消息列表聊到 LangGraph 的紅區(qū)最常用的就是add_messages。它原本是給聊天消息設(shè)計(jì)的 Reducer但理解它的行為能幫你更好地理解所有 Reducer 的運(yùn)作方式。from typing import TypedDict, Annotated from langgraph.graph.message import add_messages class ChatState(TypedDict): messages: Annotated[list, add_messages] intent: str def user_turn(state: ChatState) - dict: return {messages: [{role: user, content: 我想退款}]} def assistant_turn(state: ChatState) - dict: return {messages: [{role: assistant, content: 好的我來幫您處理}]}這里的關(guān)鍵是Annotated[list, add_messages]。Annotated是 Python 自帶的類型標(biāo)注工具LangGraph 會(huì)讀取它的第二個(gè)參數(shù)作為這個(gè)字段的 Reducer。add_messages的作用是如果新舊值都是消息列表就把它們合并如果存在帶id的消息對象還能按id去重更新。你不需要手動(dòng)把歷史消息拼進(jìn)返回值只要返回“這一次新增的消息”運(yùn)行時(shí)就會(huì)自動(dòng)追加到狀態(tài)里的messages上。這就是正確用法節(jié)點(diǎn)只返回增量合并交給 Reducer。3.3 自定義 Reducer寫一個(gè)屬于自己的合并規(guī)則add_messages 好用但它解決不了所有問題。比如你希望某個(gè)字段做“取最大值”“數(shù)值累加”“字典合并”那就得自己寫 Reducer。Reducer 的簽名很固定接收兩個(gè)參數(shù)第一個(gè)是當(dāng)前狀態(tài)里已有的值第二個(gè)是節(jié)點(diǎn)返回的更新值返回合并后的新值。from typing import TypedDict, Annotated, Annotated def sum_reducer(current: int, update: int) - int: return current update class ScoreState(TypedDict): total: Annotated[int, sum_reducer] name: str def node_a(state: ScoreState) - dict: return {total: 10} def node_b(state: ScoreState) - dict: return {total: 5}這兩個(gè)節(jié)點(diǎn)無論怎么排序執(zhí)行最終total都是 15 而不是“后寫的 5”。因?yàn)槊總€(gè)節(jié)點(diǎn)返回的數(shù)值都會(huì)通過sum_reducer與當(dāng)前值合并順序是先加 10 再加 5或者反過來。這里有一個(gè)特別重要的細(xì)節(jié)Reducer 是一對一合并的也就是說它每次只處理“一個(gè)更新值”和“當(dāng)前累積值”。所以在并行分支場景下你不能在節(jié)點(diǎn)里返回一個(gè)“已經(jīng)包含舊值的完整快照”否則會(huì)把已有內(nèi)容再算一遍導(dǎo)致重復(fù)累加。正確的做法永遠(yuǎn)是返回增量讓 Reducer 去做累積。# 錯(cuò)誤示范節(jié)點(diǎn)里自己拼了歷史 def wrong_node(state: ScoreState) - dict: return {total: state[total] 100} # 如果配了 sum_reducer這里最終會(huì)多加一次 # 正確示范只返回增量 def right_node(state: ScoreState) - dict: return {total: 100} # sum_reducer 自己處理累加我把這個(gè)坑單獨(dú)拿出來講是因?yàn)樗谡鎸?shí)項(xiàng)目里特別常見。凡是配了 Reducer 的字段節(jié)點(diǎn)里的返回值含義就變了不再是“最終值”而是“這次貢獻(xiàn)的更新量”。這個(gè)思維轉(zhuǎn)變是練狀態(tài)代碼最核心的一關(guān)。4. 狀態(tài)驅(qū)動(dòng)的條件分支與多路匯合4.1 條件邊的路由約定LangGraph 最吸引人的能力就是條件分支根據(jù)當(dāng)前狀態(tài)的內(nèi)容決定下一步走哪個(gè)節(jié)點(diǎn)。實(shí)現(xiàn)方式是用add_conditional_edges掛一個(gè)路由函數(shù)。路由函數(shù)接收當(dāng)前狀態(tài)返回一個(gè)節(jié)點(diǎn)名字符串或者返回一個(gè)能被映射表翻譯的 key。我推薦直接返回節(jié)點(diǎn)名字符串少一層映射少踩一個(gè)坑。def route(state: ChatState) - str: if state[intent] refund: return refund if state[intent] tech: return tech return human然后這樣掛邊builder.add_conditional_edges(classify, route)運(yùn)行時(shí)會(huì)在classify節(jié)點(diǎn)執(zhí)行完畢后根據(jù)返回的字符串決定下一步進(jìn)哪個(gè)節(jié)點(diǎn)。返回的名字必須在圖里已經(jīng)注冊過否則會(huì)報(bào)錯(cuò)說找不到節(jié)點(diǎn)。4.2 一個(gè)帶分支的完整練習(xí)意圖路由客服系統(tǒng)把前面的內(nèi)容串起來我練過一個(gè)完整的小例子模擬一個(gè)客服入口按意圖分流到不同處理節(jié)點(diǎn)from typing import TypedDict, Annotated from langgraph.graph import StateGraph, START, END from langgraph.graph.message import add_messages class SupportState(TypedDict): messages: Annotated[list, add_messages] intent: str handled: bool def classify(state: SupportState) - dict: text state[messages][-1][content] if 退 in text: intent refund elif 卡 in text or 慢 in text: intent tech else: intent human return {intent: intent} def refund_handler(state: SupportState) - dict: return {messages: [{role: assistant, content: 退款流程已啟動(dòng)}], handled: True} def tech_handler(state: SupportState) - dict: return {messages: [{role: assistant, content: 已創(chuàng)建技術(shù)支持工單}], handled: True} def human_handler(state: SupportState) - dict: return {messages: [{role: assistant, content: 轉(zhuǎn)接人工客服}], handled: True} def route(state: SupportState) - str: return state[intent] # 直接返回節(jié)點(diǎn)名 builder StateGraph(SupportState) builder.add_node(classify, classify) builder.add_node(refund, refund_handler) builder.add_node(tech, tech_handler) builder.add_node(human, human_handler) builder.add_edge(START, classify) builder.add_conditional_edges(classify, route) builder.add_edge(refund, END) builder.add_edge(tech, END) builder.add_edge(human, END) graph builder.compile() result graph.invoke({messages: [{role: user, content: 我想退款}], intent: , handled: False}) print(result)注意這里route直接返回state[intent]而intent是classify節(jié)點(diǎn)寫進(jìn)狀態(tài)里的。所以路由的決策完全依賴狀態(tài)里的字段這就是“狀態(tài)驅(qū)動(dòng)”四個(gè)字的含義。我建議你把輸入改成“網(wǎng)絡(luò)很卡”和“我要投訴”各跑一遍觀察它走的分支完全不同但代碼里沒有寫死任何順序。4.3 分支匯合時(shí)的狀態(tài)同步細(xì)節(jié)很多時(shí)候分支結(jié)束后還要匯合到一個(gè)公共節(jié)點(diǎn)繼續(xù)處理。比如客服所有分支最后都要進(jìn)入一個(gè)“記錄日志”節(jié)點(diǎn)。匯合本身不復(fù)雜只要在每條分支末尾都連到同一個(gè)節(jié)點(diǎn)就行builder.add_edge(refund, record_log) builder.add_edge(tech, record_log) builder.add_edge(human, record_log)但這里有個(gè)非常隱蔽的狀態(tài)問題如果多個(gè)分支是并行執(zhí)行的比如用add_edge讓兩個(gè)節(jié)點(diǎn)同時(shí)指向同一個(gè)下游它們會(huì)同時(shí)寫同一個(gè)狀態(tài)字段。對于配了 Reducer 的字段比如messages更新會(huì)按順序合并不會(huì)丟但對于沒配 Reducer 的字段比如普通int或者str后寫完的覆蓋先寫完的最終結(jié)果取決于執(zhí)行順序而這個(gè)順序在并行場景里是不確定的。所以我的經(jīng)驗(yàn)法則是并行分支里盡量讓每個(gè)分支寫自己的獨(dú)立字段refund_result、tech_result不要在多個(gè)分支里改同一個(gè)無 Reducer 的字段。如果確實(shí)要匯總就定義一個(gè)results字段配上 Reducer讓各方把結(jié)果塞進(jìn)去再統(tǒng)一處理。這個(gè)設(shè)計(jì)思路我在真實(shí)項(xiàng)目里用得很頻繁能避免掉 80% 的“狀態(tài)被莫名覆蓋”問題。5. 狀態(tài)練習(xí)中的常見坑與排查實(shí)錄5.1 狀態(tài)沒更新先按這三個(gè)方向查我在練習(xí)狀態(tài)代碼時(shí)最常碰到的問題就是“我明明 return 了為什么狀態(tài)沒變”。排查順序基本固定第一檢查返回字典的 key 拼寫有沒有跟狀態(tài)定義里完全一致包括大小寫和下劃線。TypedDict 在編輯器里會(huì)提示但你如果用動(dòng)態(tài)字符串構(gòu)造字典提示就失效了必須肉眼核對。第二檢查節(jié)點(diǎn)函數(shù)是否真的執(zhí)行了 return。很多人寫節(jié)點(diǎn)時(shí)先寫了一段打印邏輯最后忘了 return函數(shù)默認(rèn)返回 NoneLangGraph 會(huì)把它當(dāng)成“沒有更新”狀態(tài)自然原封不動(dòng)。第三檢查這個(gè)字段是否配了 Reducer。如果配了累加型 Reducer而你想“設(shè)置新值”返回單個(gè)值的結(jié)果可能跟你預(yù)期不一樣。比如total配了sum_reducer某個(gè)節(jié)點(diǎn)想重置為 0簡單返回{total: 0}并不會(huì)變成 0而是繼續(xù)累加。排查技巧也很直接在每個(gè)節(jié)點(diǎn)開頭打印當(dāng)前狀態(tài)、return 前打印準(zhǔn)備返回的更新值跑一遍輸出就能定位是哪一層的問題。別靠猜狀態(tài)圖一旦節(jié)點(diǎn)多了靠猜是猜不出來的。5.2 Reducer 的“雙刃劍”效應(yīng)給字段加 Reducer 能解決累積問題但也會(huì)帶來意想不到的副作用。最典型的是你在開發(fā)初期給messages加上了add_messages后期某個(gè)節(jié)點(diǎn)想“清空消息列表重新開始”結(jié)果發(fā)現(xiàn)清不掉因?yàn)槿魏畏祷氐牧斜矶紩?huì)跟現(xiàn)有列表合并。解決這類問題我常用的辦法有三個(gè)一是換一個(gè)字段名來承載“重置后的新列表”讓舊列表留在狀態(tài)里但不再被讀取二是在 Reducer 里加入特殊標(biāo)記值比如檢測到更新值是某個(gè)特定字符串時(shí)直接替換而不是合并三是干脆把“重置”也做成一個(gè)明確的業(yè)務(wù)節(jié)點(diǎn)它直接返回一個(gè)全新的消息列表并且你通過設(shè)計(jì)讓它的上游節(jié)點(diǎn)不再往同一個(gè)字段寫增量。這里面沒有銀彈關(guān)鍵是想清楚一旦某個(gè)字段配置了 Reducer全圖所有節(jié)點(diǎn)對這個(gè)字段的更新語義都已經(jīng)變了寫節(jié)點(diǎn)時(shí)必須時(shí)刻記住這一點(diǎn)。我在團(tuán)隊(duì)里跟人協(xié)作時(shí)經(jīng)常在狀態(tài)定義旁邊寫清楚每個(gè)字段的合并語義避免別人把普通字段當(dāng)成覆蓋字段來寫。5.3 TypedDict 的類型邊界與運(yùn)行時(shí)校驗(yàn)TypedDict 雖然在定義階段給了你類型提示但它的約束主要停留在編輯器層面。LangGraph 在運(yùn)行時(shí)對狀態(tài)的校驗(yàn)深度有限尤其是嵌套結(jié)構(gòu)比如state[profile]是一個(gè) dict里面少了一個(gè) key 時(shí)TypedDict 不一定能攔住你等到節(jié)點(diǎn)里訪問時(shí)才報(bào) KeyError。我的建議是狀態(tài)結(jié)構(gòu)盡量保持扁平。字段就是一層每個(gè)字段的值要么是標(biāo)量要么是列表要么是明確類型的數(shù)據(jù)對象。如果確實(shí)有復(fù)雜的結(jié)構(gòu)化數(shù)據(jù)用 dataclass 或 pydantic 模型作為字段類型在節(jié)點(diǎn)邊界做顯式校驗(yàn)。不要試圖在狀態(tài)里塞三層以上的嵌套字典那會(huì)讓整個(gè)圖的可排查性變得非常差。這里還有一個(gè)相關(guān)細(xì)節(jié)LangGraph 對“節(jié)點(diǎn)返回了狀態(tài)定義里不存在的 key”這件事在不同版本里處理方式不完全一致。我建議永遠(yuǎn)不要依賴舊版本的寬松行為返回的 key 必須都定義在狀態(tài)結(jié)構(gòu)里否則直接視為實(shí)現(xiàn)錯(cuò)誤盡早暴露。5.4 Checkpointer 相關(guān)thread_id 不配就白改狀態(tài)練習(xí)做到后面你一定會(huì)碰到持久化和多輪對話的需求。LangGraph 的記憶機(jī)制依賴 Checkpointer當(dāng)你把圖編譯成帶記憶的版本后調(diào)用方式會(huì)發(fā)生變化from langgraph.checkpoint.memory import MemorySaver saver MemorySaver() graph builder.compile(checkpointersaver) config {configurable: {thread_id: thread-1}} graph.invoke({messages: [{role: user, content: 第一輪}]}, config) graph.invoke({messages: [{role: user, content: 第二輪}]}, config)沒有傳config的話每次invoke仍然是從干凈的初始狀態(tài)開始跑之前寫入狀態(tài)的內(nèi)容不會(huì)被保留。我見過不少人配了 Checkpointer 卻忘了傳thread_id然后來問“為什么我的圖沒有記憶”問題就出在這。另外同一個(gè)thread_id的多次調(diào)用之間狀態(tài)是累積的。你想在調(diào)試時(shí)重新開始就換一個(gè)新的thread_id或者用graph.get_state(config)查看當(dāng)前狀態(tài)、用graph.update_state(config, {...})手動(dòng)修改某一步的狀態(tài)。這些 API 都是練狀態(tài)代碼時(shí)遲早要碰的我建議你在基礎(chǔ)練習(xí)通過后專門花半天時(shí)間只練 Checkpointer 相關(guān)的操作。6. 我的練習(xí)心法與最后幾條建議6.1 按什么順序練效率最高如果讓我給一個(gè)建議的練習(xí)順序我會(huì)把它分成四步第一步只練三個(gè)節(jié)點(diǎn)的直線圖把invoke的輸入輸出徹底搞清楚重點(diǎn)理解“節(jié)點(diǎn)返回的是更新補(bǔ)丁”這件事第二步練習(xí)各種 Reducer自己寫一個(gè)累加器、一個(gè)add_messages的聊天累積、一個(gè)取最大值的合并函數(shù)把Annotated的用法吃透第三步練條件分支從最簡單的二分路由開始慢慢加分支、加匯合第四步練帶 Checkpointer 的多輪對話理解thread_id和狀態(tài)持久化的關(guān)系。每完成一步就寫一個(gè)獨(dú)立的小腳本保存下來腳本里加幾個(gè)斷言判斷輸出的狀態(tài)是否符合預(yù)期。比如跑完CounterState后斷言result[count] 4。這樣你后面改動(dòng)狀態(tài)結(jié)構(gòu)時(shí)一跑就能知道有沒有破壞舊行為非常值得。6.2 最值得帶進(jìn)真實(shí)項(xiàng)目的一個(gè)習(xí)慣最后分享一個(gè)我個(gè)人非常受用的習(xí)慣每個(gè)狀態(tài)字段的定義旁邊用注釋寫清楚它的更新語義。比如class OrderState(TypedDict): step: str # 覆蓋后寫為準(zhǔn) logs: Annotated[list, operator.add] # 累加各節(jié)點(diǎn)只追加增量 messages: Annotated[list, add_messages] # 聊天消息自動(dòng)合并這短短幾行注釋能避免掉大量的“跟我預(yù)期不一樣”的 bug。狀態(tài)代碼本來就是 LangGraph 項(xiàng)目里最容易被忽視、卻最影響全局穩(wěn)定性的部分前期多花一個(gè)下午把狀態(tài)模型吃透后面搭真正的多代理應(yīng)用時(shí)你會(huì)感謝自己當(dāng)初沒有跳過這一步。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
无码男人天堂| 亚洲揄拍网| 亚洲情色第一页| 内射黑人| 色哟哟av网址| 91性感在线| 思思热在线视频免费| 久艹日日日| 波多野结衣一级视频| 色操逼网| 玖玖色综合| 亚洲自拍欧美色综合| 亚洲丝袜诱惑| 人妻熟女av国产网站| 97玖玖人妻| 色97国产69香蕉| 精品国产一区探花在线观看| 淫荡熟女乱伦网| 岛国在线免费视频| 在线强奷到舒服的无码视频 | 夜夜操夜夜高潮夜夜爽国产精品区| 巨乳特殊服务按摩| 色5月婷婷| 九九九九九九九九九九精品视频| 久久亚洲中文字幕视频| 九九99精品| 欧美色一二三| 丁香五月色情| 亚洲91射| 天天做天天爱天天爽AV| 操逼操逼视频操逼| 中文字幕乱碼在线| 国产精品一区二区三区四区五区| 日本久久精品| 97天天日| 91超级碰碰| 97色欧洲| 色综合潮| 留下AⅤ黄色片| 麻豆一区在线| 四虎国产精品永久在线囯在线| 夜夜嗷嗷一区二区| 超碰久热| av绯色| 亚洲第一视频 欧美风情 日韩| av一区二区三区 中文| 九九九九九九九九九国产精品 | 色爱亚洲| 亚洲图片在线| 欧美久久婷| 免费精品中文字幕| 91精品国产长腿丝袜美女| 亚洲AV免费在线| 日本道不卡| 日韩99神马视频片| 国内自拍 日韩激情 99| 2025年A片视频精品| 久久e6只有精品| 夜间福利片1000无码| 久久久久九九九| 爱欲AV| 国产强奸超碰AV| 色逼综合| 伊人91| 天天综合麻豆视频| 欧美图片校园春色| 色偷综合| 欧美大战久久久伊人| 一本一道人妻久久一区二区三区| 国产免费操逼| 色在线综合| 国产无马在线| 大香蕉中文在线| 国产丝袜啪啪| 色爱天堂| 人人妻人人澡人人爽久久av| 超碰97在线中文| 亚洲第一页色| 骚逼高潮久久精品| 天天色综亚洲91污| 黑人精品XXX一区一二区| 91丨豆花丨熟女| 中文字幕亚洲热播人妻| 午夜福利一区二区影院| 26uuu性| 97在线免费公开视频| 丝袜色综合| 精品国产自在在线99| 九七毛片九九毛片| 国产精品扒开腿做爽爽爽视频| AV男人天堂网| 一区二区影院| 久久熟妇五十路一区| 色狠狠综合| 搡老女人老91二区| 欧美精品,四区。五区| 九九99精品视频在线观看| 欧美另类综合久久| 丰满美女一级毛片在线播放| 中文字幕青青草| 99在线视频播放| 国产免费大片| 久久久久久久一级黄色打同平台| 日韩精品在线观看观看| 亚洲伊人a线观看视频| 日韩欧美麻豆| 91情色在线| 亚州熟妇精品| 蜜臀久久在线视频| 闷骚老熟女15P| 一区二区三区精品黑丝白丝酒店对鸡 | 久久久久久久少妇| 一区久久久二区| 一区二区三区视频在线观看免费| 久久国内| 色欲日韩欧美在线一区| 操屄不卡视频| www.av在线观看| 日韩欧美成人午夜福利| 在线观看成人性爱免费小视频| 欧美综合网在线| 嗯嗯不要视频| 国产精品天堂| 亚洲久久久久| 综合97久久| 中文字幕久久精视频久久大全| 伊人色综合超碰| 亚洲精品天天影视综合网 | 男人天堂2030| 无码78| 亚洲在线a| 亚洲色狠| 国产精品分类在线观看| 精品无码欧美三级| 久久这里是精品| 成人精品久久久午夜福利| 欧美v日韩v亚洲v最新在线| 最新亚洲黄色免费电影| 日韩性爱长视频免费| 久久久性| 超碰人人超在线观看| 国产精品熟女乱伦| 日韩在线视频1234| 久久久性爱视频| 日日骚 av| 操一区| 久久网亚洲| 97se亚洲综合自| 97日韩欧美| 国产在线观看91精品一区| 亚洲国产欧美一区二区潘金莲| 欧美黄色片在线播放| 懂色天天爱天天日天天射天天澡| 亚洲免费人妻在| 久久极品伊人| 青青操97| 国产一区二区在线播放,久久亚洲精品中文字幕第一区,亚洲精品在线中文字幕视频 | 91亚洲网站| 亚洲不卡三级手机播放| 色综合尤物| 亚洲18禁| 天天内射| 深喉吞精| 国产精品麻豆视频网站| 欧美极品女人的天堂| 97色色国产视频| 蜜臀一二三区| 国产福利一区二| 日韩乱伦视频| 另类亚洲图色| 天天网综合| 韩国一级婬片A片无码天美 | 人人人摸人人| 99热伊人| 色香欲天天天天综合色| 成人精品无码| 337p大胆噜噜噜噜噜91Av| 嗯啊免费视频| 99re免费| 日韩欧美大力操| 992这里有精品| www被窝色com| 国产v片在线免费观看| 国产精品青草综合久久| 综合91网| 国产在线视频二区| 欧美久久草熟女| 性欧美| 偷拍亚洲熟女视频播放| 九九玖玖精品| 久久久久久久97| 欧美 精品国产制服第一页| 婷婷丁香五月综合| 亚洲欧洲激情| 日韩人妻有码免费视频| www.一本大99| 很很操在线| 久久一二三四五六七八九区区区| 欧美亚洲国产日本在线,久久精品国产| 91天堂| 亚洲āv网址在线观看| 久久性爱视频| 麻豆熟妇乱妇熟色A片在线看| 亚洲精品国产无码高清| 麻豆乱码久久精| 美女91AV| 久久午夜伦| 久久久96精品| 五月丁香激情综合网| 老鸭窝日丰县女人| 久草福利在线资源站| 98精品国产乱码久久久久久| 在线色导航| 蜜臀久久在线视频| 日韩中文字幕视频| 91粉嫩萝控精品福利网站_精品影音先锋国| 97超碰热线| 日婷婷| 久久夜夜夜夜| 99热99在线播放激情| 日韩99神马视频播放| 亚洲影院无码在线| 九九九久久久久| 亚洲精品乱码线路中文字幕 | 久久久久久久久久久久欧美日| 欧美午夜精品久久久久久超碰| 欧美色图99| 国产亚洲性生活视频播放| 欧美老妇综合网| 岛国激情视频软件| 日韩欧美中文字亚洲慕| 99热久| 色欲av国内精品久久久久久| 黄色网址久久精品欧美喷水| av强奸乱轮| 亚洲色图综合网| 欧美日韩香蕉| 久九九九九九九九热| 激情AV| 久久精品一区二区一8| 青青草视频久久久久| 国产黄色在线播放观看| 9 1超碰九色| 麻豆国产第一| 91亚州欧美| 91久久久亚洲| 在线黄页看毛片| 麻豆成人AV| 99久久99九九99九九九| 婷婷午夜清品久久久久久久性色视频观| 久久精品国产精品一区| 97国产色图| 中文字幕精品日韩中文字幕| 亚洲色图片区| 日韩精品电影| 大地资源在线观看中文第二页| 国产嫩草精品A88AV| 老女人日韩美91| 93人人操人人| 国产极品粉嫩馒头一线天av| 超碰1997| 亚洲色色色| 操逼操逼逼操操逼91 | 婷婷视频网| 黄色AAAAAAAAAAA大片| 欧美第二页午夜| 95精品在线| 八戒无码国产午夜福利| 凹凸视频在线一区二区| 超碰色老头| 亚洲欧洲小说图片视频| 天天摸夜夜添无码小视频| 亚洲AV永久无码精品成人调教| 久久综合女优| 青青草啪啪网| 亚洲永久AV无码精品秋霞| 天天色黄色影院天天操| 日韩性爱视频在线免费观看 | 极品白嫩美女白浆成人福利在线看| AV色五月天| 色噜噜综合在线| 亚洲精品久久久久久久久豆丁网| 久久精品国产96精品亚洲拳交| 日韩欧美成人午夜福利| 国产浮力影院第1页| 黄色av网站在线播放| 91在线精品一区二区三区| 91另类| 日韩99神马视频播放| 国产suv精品一区二区四| 欧美日韩国内不卡| 91chinese在线| 国产一级特黄大片处女| 人人操人人干网页| 欧洲一级性爱视频在线观看| 一区二区激情国产熟女 | 免费视频a级毛片免费视频| 亚洲日韩成人性爱视频| 日本在线视频导航| 影音综合网| 96爱综合| 久久精品28| 青青草这里只有精品| 天天爱天天操| 最新国内自拍av免费| 亚洲中文日韩欧美大香蕉视频| 国产日韩欧美三级片| 欧美日韩国产传媒在线精品| 日本一区99| 久久线上视频免费看| 日韩强奸av| www.av在线观看| 粉嫩在线一区二区懂色| 日韩二级| 中文久久爆乳| 日韩av三四区| juliaann欧美丝袜办公室| 97综合网| 99色色| 激情欧美日韩女同久久| 亚洲一区二区av| 人妻丰满熟妇一区二区三| 91精品成人www| 日韩BBN| 国产精品一区av在线| 婷婷九月色| 97欧美色综合| 岛国色情视频在线观看| 狠狠色综合网| 美女好片色日本| 亚洲色系另类精品国产| 后X久久| 欧美欧美少妇| 98色网| 91碰超| 熟女精品一区二区在线观看| 蜜臀AV一区二区三区| 国产亚洲中文不卡二区| 9999九九九久久久| 亚洲人妻中文高清| 999热日韩精品| 国产精品欧美日韩久久| 风骚少妇视频中文字幕| 无码在线亚洲| 日韩啪啪视频| 亚洲少妇激情视频| 永久免费发布性爱网| 91美女在线精品视频| 国产JDAV无码视频在线观看| 91性生活久久久| 日韩综合无码色欲vv| 蜜乳av一区二区三区四区不卡| 日本操大逼| 97视频免费播放| 95精品在线| 欧美日韩性爱无码| 男人的天堂久久狠| 中文字幕第页| 婷婷中文网| 免费观看成人www精品视频| 伊人久久婷婷| 久久婷色| 五月天亚洲色图| 久久九九久精品国产尤物|国产精品爽黄69天堂A片潘金莲,国产亚洲精品第一综合 | 午夜精品久久久久久久久久久久久| 免费人人搞97| 在线观看十八禁| 欧美精品久久久久久久久88| 久夜视频| 97超色| 青青草伊人久久| 亚洲综合色婷婷| 日韩A优精品在线观看| 欧美色狠| 国产一区在线播放| 久久久久久十| 亚洲久久天堂| 92大香蕉| 日本三级韩国三级美三级91| 密桃99999| 日语五十路和六十路亚洲国产精品| 国产精品密臀网在线观看| 神马精品视频| 欧美综合骚| 啊啊啊啊嗯嗯嗯用力好爽 | 久久精品国产亚洲AV片多多| 最新av中文字幕高清| 国产成人五月天丁香花| 91宗合网| 欧美成熟性爱精品| 久草视频观看视频在线| 国产欧美日韩精品中文| www.色99| 久久最新免费视频23| 综合网,亚洲,欧美| 国产少妇与亚洲av| 蜜奶av| 啊啊啊不要好爽日韩无码一区| 久九干| 日本新免费二区三区| 无码男人天堂| 欧美特黄视频网站| 91中出在线| 91精品人妻一区二区三区蜜桃| 老司机午夜精品视频| 国产AV激情无码久久无码| 日本岛国黄色网址| 亚洲欧洲精品成人| 国产中文字幕在线观看| 嗯嗯啊啊操我| 亚洲图片激情综合另类| 中文字幕第页| 国产精品。| 尤物视频新赏网鲜网色诱网| 一摸二插三插| 91性高潮久久久久久久久| 97最新在线播放视频| 国产自产91区13区| 伦理第一页| 亚洲国产奇米影视久久| 亚洲 日韩 欧美 国产综合体| 97网址www| 美女天天干| 国产久久成人| 强奸少妇AV导航网| 色综合大香蕉| 国产18精品亚洲精品| 91久久18禁| 蜜臀久久99精品久久久久久婷婷| 亚洲欧美中文日韩视频中国语| 久久精品视频在线观看| 亚洲精品自拍| 欧美1727免费观看视频| 欧美人妻色| 亚洲性天堂| 日韩 欧美 另类 人妻| 刺激性视频黄页| 后入精品| 国产精品久久久久久久毛片1| 欧美日日网| 青青草依人大香蕉| 色综合五月天| 91日产欧美| A级在线视频| 久操B网| 国产精品久久久久无码Av网曝门| 中文字幕在线观看AV| 国产福利精品98视频| 天天日天天插| 99re免费| 一区二区首页| 美女国产一区二区久久 | 熟妇人妻一区二区三在线| 99国产在线 精品 视频| 日韩成人小视频| 国产精品熟女乱伦| 久久精品导航| 国产传媒一区日韩| 国产成人精品日本亚洲语言 | 天天看高清麻豆| 日本理论在线| 久久激情四射婷婷丁香五月天| 高清在线偷拍自拍视频| ji熟女.com| 国产精品白丝AV| 91激情| 精品久久无码午夜福利| 欧美熟女操屄| 亚洲综合色男人网| 99re久久| 中文字幕乱码人妻一区二区三区,99精品| 91久久久久久久久18| 中国一区二区亚洲人妻| 成人97人人超碰人人| 日本久久综合| 德国一二三不卡| 婷婷五月天AV| 日逼国产| 亚洲情欲| 亚洲天堂男| 美女露胸露奶头| www.99色| 久久久com| 国产隔壁老王影院在线| 天天操熟妇| av在线资源| 人人模人人看| 日本人妻丰满熟妇久久久久久| 白丝在线一区| 偷拍五区| 高清孕妇孕交 交| 97天天插| 岛国黄片网站| 一区二区三区四区在线不卡| 高跟伊人julia ann| 91女网站| 中文伊人大香蕉视频| 精品无码不卡视频| 亚洲图片日本AⅤ欧美在线| 国产v亚洲v日韩v欧美v片另类| 天天干夜夜鈤| 国产91 丝袜在线播放| 欧美综合色图网| 欧美瑟综合| 日韩内| 国产午夜视频| 超碰久久精品| 亚洲精品国产精品乱码不卡| 亚洲视频一二区| 亚洲码和欧洲精品激情系列| 欧美一区二区三区大综合| 久久丁香五月天| 久久久久人妻| 啪啪视频mP4| 久久综合日韩亚洲欧美| 亚洲91网。| 亚洲色图a| 熟女啪啪视频| 亚洲熟女乱综合一区二区在线-...亚洲国产日韩欧美一区二区三区,久久久久久精 | 大香蕉懂9| 欧美91久久久久| 玖玖爱伊人玖玖爱| 亚洲性刺激| 亚洲天堂欧美| 屁股久久久久久久久久| 亚洲精品久久久久毛片A片拉屎 | 欧美三级一级| 婷婷爱五月| 亚洲精品色| 91性感网站| 91痴汉| 欧美翘臀视频网站一区二区三区| 91免费看一区二区三区| 午夜福利免费福利视频| 五月丁香亭亭| 五月天久久婷婷亚洲| 日韩八十路老熟女| 婷婷20月天青娱乐| 国产不良强奸视频免费看| AA特级绝黄| 久久一二三四五六七八九区区区 | 性爱1区| 国产一区二区三区不卡手机在线| 夜夜操天| 97在线欧| 综合网少妇| 97干97色| 人人操,人人液| 欧美人与性动交a美精品| 亚洲色五月| 刺激精品视频| 九九九九九九九九九国产精品| 草草草视频在线免费看| 日本3级一区二区免费| 精品射1999| 久久9免费视频| 欧美天天综合网| 欧亚性爱啪啪| AV高清一区| 老熟女阿 国产91| Sekablack无码一区| 综合五月婷婷| 色天堂在线观看| 国产精品视频内谢女人| 综合操逼| 在线啊啊啊啊| 91中出视频| 三级AV入口| 婷婷五月天网| yazhouzaixian| 日韩人妻有码免费视频| 97在线国产精品| 怡春院久久| 日本国产亚洲一区在线观看| 国产少妇肉丝在线观看| 欧美综合自拍亚洲综合图| 伊人网青青| 久久国产精品91| 亚洲欧美洲综合| 二男一女成人A片| 丰满搜索结果 -第18页- 久久高清无码| 亚洲高清欧美总合| 亚洲第一在线视频| 亚洲精品久久一区二区三区蜜桃臀| 99999国产| 自偷自拍的亚洲视频| 日韩AV一区二区三区三州三州| 丝袜狠狠草尤物人妻av91| www.人人摸在线视频| 免费中文在线| 激情久久日韩精品中文字幕麻豆| 少妇3P性爱自拍| 韩国成人精品久久久免费看| 按摩中文字幕| 中文字幕蜜乳av| 亚洲经典啪啪| 97久久久精品| 欧美 亚洲 大香| 精品少妇人妻一区二区三区| 黄片在线免费在线观看| 免费国产| 久热九九| 69一区二区| 色99视频| 久久国产乱子伦精品免费女,网站| 日本色色色色色视频| 99爱爱| 国产麻豆一级精品视频| 日夜尻逼网| 超碰狠狠操| www.久久超碰| 97九色人妻| 日韩福利电影网| 91天天综合网,天天综合网| 高精欧美色| 婷婷五月天_亚洲小说欧美激情另类_精品久久国产字幕 | 久久亚洲中文字幕视频| 69人妻精品一区二区绯色| 97干97色| 骚逼一区二区| 国产一区二区啪啪视频| 蜜臀99久| 97国伦国色| 国产精品第一区第一页| 97色色色综合网站| 亚洲成人一区二区精品| 97神马久久| 欧美日日夜夜| av绯色| 97这里有精品| 韩日精品四区| 久久啊啊| a网站免费观看| 成人小说另类在线| 欧美性五月| 五月天春色激情网| 亚洲九月丁香| 97超碰欧美| 欧美一级专区免费大片| 激情五月天色播| 丁香九月 婷婷| 欧美色九九| 亚洲棕合电彰| 亚洲成人久久美女| 国内精品嫩模A∨私拍小视频| 亚洲性感丝袜诱惑在线观看| 少妇二级| 天天综合网网欲色| 国产AB视频| 中文字幕视频2区| 图片区小说区| 国产视频一区二区三区在线免费观看 | 精品人妻免费观看| 伊人网在线点播| 麻豆黄色五月天| 中文字幕日本久久| 欧美日韩不卡a片| 色九九九九九九| 老熟妇综合| 日韩精品.久久精品.AV女优.天美传媒| 色天使亚洲综合在线观看| 五十路熟女人妻一区二区三区四区五| 精品一二三区四视频| 国产热RE99久久6国产精品首| 成人一道本免费视频| 麻豆91熟妇人妻中文字幕茄子 | 国产精品久久久久久久久久久久| 欧美在线啊啊啊 | 欧美日韩午夜精品一区二区三区| 久区视频| 白嫩91在线亚洲| 偷拍在线观看视频| 一区二区精品更新提醒| 91久精品| 天美精品av| 亚洲天堂人妻熟妇视频| 亚川综合视频| 三级精品三级在线观看| 中文字幕黄色一起草| 久热99999| 日本九九久久99| 亚洲揄拍网| 中文字幕大片三级狠狠干| 亚洲av无码成人精品国产| 欧美亚洲| 国产亚洲精品av一区| 777琪琪午夜免费A片| 国内毛片热久久思思热| 污色区网站| 精品人妻免费观看| 亚洲日韩人妻中文字幕一区| 久久永久无码人妻视频| 日本精品五区| 亚洲无码精品AV久久久| 日本操逼aaaaa| 中国AAAAAA黄色片| 久久草草亚洲蜜桃臀| 狠狠色伊人亚洲综合网站色| 偷拍 欧美 日韩| 人妻一区二区三区四区视频| 你懂的在线观看区国产| 中国操逼无码| 麻豆三极片| 亚洲精品国语在线播放| 亚洲日韩电影| 97精品免费视频网站| 加勒比综合在线| 人人操人人摸超碰| 亚洲男人天堂网| 麻豆国产精品午夜视频| 欧洲亚洲国产综合在线| 人人爱人人乐人人操| 国产精品麻豆免费视频| 国产人伦a片信息免费片| 五十路三级片| 亚洲五月婷婷| 91大学精品激情戏| 九九久久首页| 欧美日韩亚洲五月天婷婷| 亚洲综合大片| 97亚洲在线| 亚洲国产精品无码AV久久久| 天天躁日日躁xxxxx| 久久99午夜精品一区人妻| av大香蕉| 18岁禁 茉莉成人久久| 人人操人人射人人干| 日韩欧美中文字| 精品十八在线观看| AV天堂因数| 日韩AV无码网站| 国产成人免费观看在线视频| www.婷婷| 亚州色图欧美| 97伊人| 影音先锋每日最新资源在线观看 | 最新av在线| 欧美少妇高潮| 亚洲美女高潮喷水视频| 蜜臀久久99精品久久久久久酒店| 操日韩第| 国产av尤物| 青青伊人加勒比海| 高清无码人妻久久久一区二区三区aⅴ| 97综合| 26uuu性物| 亚洲av强奸乱伦| 天天综合香 ld视频| 99热线麻豆| 一道α片欧美| 色婷婷五月天| 欧美性视频二区三区| 日本影视久久免费| 亚洲操人| 国产青青美女玩逼视频| 欧美一二三区四五区| 日韩欧美久久婷婷网站| 欧美v亚洲v综合v国产v妖精| 懂色中文一区二区三区| 91日韩在线| 动漫av中文| 中国少妇啪啪视频| 99无码| www色色com| 亚拍在线| 伦激情人妻另类人妻| 色牛aV| 天天日天天色| 操逼短片| 欧美日韩色综合网| 蜜臀在线免费观看在线免费观看| 农村少妇久久久久久久| 狠狠色狠狠色狠狠五月| 亚洲码和欧洲精品激情系列| 性91| 久操热| 夜夜国自区| 女色综合| 天天综合色电影| 日韩无码第3页| 日本一本道A级黄色毛片试看60分钟| 色狠狠综合噜一二三区| 亚洲有码视频二区| 男人兔费天堂| 国产97色在线| 久久久精品视频免费观看| 精品然女一区二区| 另类亚洲一区二区三区| 欧美老妇曰批的视频| 天美精品av| 天啪| 婷婷久草一区二区三区| 欧美激情黑人| 久久免费精品视频免一| 日韩八十路老熟女| 九月丁香综合网| 狠狠爱夜夜干| 亚洲国产一级精品毛一级精品看免费视频 | 人人摸人人干人人拍97| 国产日韩欧美| 夜夜影视四色| 中文字幕av一区二区三区人妻少妇 | 69人妻精品丰满熟女区| 日日操免费视频| 青青草国产亚洲精品久久| 国产高清自拍视频| 伊人久久国产免费观看视频| 日本操逼无码| 女人一区| 国产极品99热在线播放69| 亭亭在线资源| 免费公开人人操| 久久久九九| 男人的天堂一区三区| 97 国产精品| 99热| 男女猛烈无遮掩视频免费软件| 婷婷丁香一区二区三区| 日日日日做夜夜夜夜无码| 日本欧美m v精品网站加| 入口操逼网站| 久久久精品网| 99这里都是精品| 牛牛AV人人夜夜澡人人爽| 久久手机好看网站| 国产精品毛片?v一区二区三区| 粉嫩久久久久| 亚洲激情综合| av网站免费线看| silk lablo在线观看一区二区| 亚洲AV无码国产精品久久久久 | 青青草吊丝| 久久av成人无码免费| 新怡红院| 亚洲AO在线| 东京热一区二区中文字幕| 久久精品一区| 精品九九国产无码| 五月天久久人妻| 欧美精品丝袜久久久中文字幕| 国产女人高潮嗷嗷嗷叫小说| 91情色在线| 亚洲色图a| 无套内射人妻在线播放| 大香蕉线| 亚州春色| 97电影院超碰| 中日韩熟女| 欧美亚洲中文| 91天射| 亚洲高潮少妇| 亚洲色图日韩精品| 亚欧免费观看视频| 国产熟码AV| 久久天天躁日日躁狠狠躁| 亚洲砖码砖专无区2023| 五月天婷婷在线看| 啊啊啊啊好疼| 国产视频第2页| 国产天天骚| 婷婷丁香六月天| 强奸乱伦中文字幕AV| 97操b| 超碰97欧美日韩| 九九热五区| 囯产精品一区二区三区线|亚洲人成无码网WWW动漫|国产精品免费一级... | 东京热男人天堂| 无卡一区=区| 中文在线久久字幕| 超碰亚洲欧美日韩无| 曰韩成人免费视频| 日本一区视频在线观看| 亚洲综合九九| 欧美狠狠狠| 久久视频,这里只有精品| 黑人中出21连凳花野真衣| 婷婷伊人| 最新日韩黄片| 亚洲av影音先锋| 伊人丁香五月婷婷| 手机看片91人妻| 国产精品国产精品国产| 97欧美日韩| 国产一区二区三区,在线观看观看| 大鸡吧尹人在线| www.操| 草伊人高潮喷水超碰| 日夜久久久九九九久| 五月天黄色av| 亚洲乱色视频一区、二区在线| 丝袜狠狠草尤物人妻av91| 亚洲 图片 欧美 色图| 97久久超碰| 偷窥自拍亚洲天堂网爆| 亚洲乱熟女一区二区三区大香蕉| 综合影视国产无码| 太久视频| 密乳AV免费观看| 巨爆乳一区二区爆乳区| 眼镜人妻101.com| 国产成人无码a| 级做a爱无码性色永久免费| 97在线免费观看| 成年在线视频日本亚洲在线视频区精品江靖宇公司 | 久久精品无码不卡| 国产精品国产| 啊啊啊啊啊舒服| 208天天久久九九九| 国产AV天美传媒一区二区三区 | 发朗少妇买婬全视频中文| 狠狠干综合| 天美传媒国产原创中文字幕亚洲欧美另类 | 亚洲阿v天堂无码z2018| 欧美一区二区观看在线| 玖玖爱免费观看视频| 亚洲精品人妻吞精av| 色综合色欲色综合色综合色综合| 婷婷激情五月天小说网| 天天操夜夜操狠很操| 国产精品爱欲| 91三级理论片播放器| 中国亚洲呦女专区| 日韩三级一区| 台湾佬中文娱乐自偷自拍| 花野真衣| 中文字幕日韩精品一区二区三区| 亚洲诱惑天堂| 不卡二三区人妻少妇| 91在线精品一区二区三区| 99精品久久久久久久婷婷| 日韩不卡av一二三| 色哟哟-国产专区| 9997se| 好吊色综合| 美国黄片aaa| 思思性爱| 一及黄久一点| 久操国产在线| 八戒午夜福利理论片| 国产三级日产三级韩国三级| 夜夜操天| 久久久久久久9最新免费视频观看| 国色综合天| 看免费的黄片| 麻豆人妻精品一区二区| 91在线/欧洲| 久久久久久久| 极品尤物自安慰| 精品久久久久久亚洲| 久日91在线| 亚洲综合999| 国产亚州日韩欧美看片| 91美女视屏| 超碰欧美97资源| 亚洲 欧美 色图| 狠狠色噜噜狠狠狠狠狠色综合久久| 天堂av2019| 嗯~啊~快点 死我视频免费看网站| 久久精品成人| 亚洲系列第一页| 在现视频女上位好爽| 五月天九九日国产精品一区二区三区| 999精品国产高清一区二区| 精品婷婷| 免看60秒涩涩视频| www.久久最新地址| 亚州宗合另类| 91老司机视频| 久久东京伊人一本到鬼色| 91N欧美| 亚洲97精品| 亚洲一区二区精品福利| 嗯嗯啊好大| 日本视频在线中文字幕| 九九性爱网| 欧美综合狠| 国产精品女久久久久av爽| 婷婷综合五月| 大香蕉性欧美| 日本肉体xxxx裸交| 男人天堂综合| 国产操逼视频在线观看| 国产少妇肉丝在线观看| 九一性生活免费视频| 国产日韩精品人妻久久久久色欲网站 | 午夜天堂精品久久| 九九九999久久久网站| 97人人模人人爽人人| 天天操天天日青青草超碰av| 色欧美在线| 日韩欧美国产高清视频| 蜜臀在线看片| 欧美十八禁导航成人| 成人一区二区三区四区| 欧美人人曰人人操人人射射| 青青国产精品在线| 国产白丝精品在线观看| 欧美九九爱| 中文字幕激情小说| 果冻传媒一区二区三区| 国产啊v在线免费播放| 精品96久久| 国产熟女完整版中字| 久久一区二区加油站| 强奸乱伦AV网站| 智利AV在线网| 91chinese在线| 成年在线视频日本亚洲在线视频区精品江靖宇公司| 欧美日韩岛国大片在线观看| 蜜臀久久久国产| 免费无码国产精品v片在线观看| 抽查国产福利主播| 91看黄片| 精品中文一区二区| 91成人久久| 91爰爱欧美| 蜜乳性色无码专日粉嫩骚逼AV| 久久久久久99999国产精品| 久久精品店| 久久九九久精品国产尤物|国产精品爽黄69天堂A片潘金莲,国产亚洲精品第一综合 | 色色色色色色色色色色色色色色综合| 亚洲图片小说欧洲| 丝袜美腿诱惑亚洲欧美视频在线观看| 欧美一级A一级a爱片久久| 日han少妇无码| 黄色av网站在线播放| 久久久久国产| 婷婷五月色| 大香蕉中文| 激情视频一二三| 婷婷视频网| 久草色在线观看| 99爱久久视频频| 操逼操逼视频操逼| 中日韓欧美高清| 久久人妻四季| 青青色在线观看| 国产在线精品电影观看| 不卡啪啪视频| 精品久久久av无码免费| 在线观看 99热| 综合久久婷婷| yaouchengrenav| 日本国产二线女色| 920日本午夜免费| 伊人久久大香线蕉无码| 色97干| 91xingse| 午夜电影在线观看无码专区| 欧美亚洲图片| 日产成人久久| 91人人爽人人爽人人人,gav福利视频导航,日韩欧美亚洲国产字幕四区 | 新版天堂中文资源8在线| 亚洲日韩电影| 91麻豆一二三区| 青青草日本无码| 国产精品亚洲天堂网址| 91天美| 997色在线| 久久久久久大| 综合色图区| 国产精品成人福利在线| 欧美日韩国产人人| 亚洲人在线成线成人| 夜间福利片1000无码| 久久这里只有精品9| 久久国模av| 在线女人91| 久热久| 成人乱人伦一区二区| 亚洲丝袜少妇在线| 天天搞欧美| 后入人妻一区| 美女尤物福利视频| 热九九精品| 久久久久亚洲Aⅴ无码| 乱伦强奸区日韩| 97视频免费| 啊啊在线| 婷婷美人网| 久久中出在线| 久久综合乱子伦国产免费| 天天色播| 亚洲一级特黄大片在线播放91| 最近2018中文字幕在线高清第一页| 中文 人妻 制服| 亚洲天天精品| 97这里只精品| 热久久99999| 久久婷婷在线观看视频| 五月天激情综合网| 狠狠色丁香| 婷婷五月天丁香花| 日韩精品黄片免费观看| 少妇厨房愉情理伦片bd在线观看| 中文字幕三四五区| 极品美女嘿咻| 91劲爆| 怡红院亚洲怡春院av| 91欧美另类| 欧美美女自慰一区二区三区| 91亚洲丝袜熟女| 亚洲宗合网| 日本道日本道中文字幕日本道最新日本道在线观看 | 啊啊啊啊啊在线| 97欧美日韩| 精品一级| 搡老女人老91二区| 97综合| 亚洲精品一区二区日本| 欧美91变态| 国产一国产一级毛片古装| 玖玖综合网| 国产精品农村妇女| 亚洲欧美小说| 国产操逼网站亚洲一级黄色| 性色AV网站| 九九综合九九综合| 亚洲啪啪视频免费| 性爱视频免费网址| 91麻豆天美| 国产精品高清2021在线| 日日噜噜夜夜狠狠视频无| 亞洲久久直播| 美国aaaaa一级黄片| 欧美日韩精品一区二区三区高清| 色色色天美视频| 超碰精品在线| 五月天色色色| 欧美 亚洲 制服 精品| 欧美熟妇人体| 97色97好| 色大师网站www永久网站视频| 亚洲的天堂网| 色97欧美| 999久久芭蕾| 97爱综合| 日韩无限资源| 收看日本人日bb| 国产人伦a片信息免费片| 亚洲码专区| 91婷婷伊人狠人| 超碰综合色| 亚洲性感丝袜诱惑在线观看| 日日干夜夜欢| 欧美黑人熟妇精品91| 国产成人精品必看| 欧美色性爱| 欧美另类色图片| 97色色,97综合| 久久亚洲一区女同性恋中文字幕| 欧美综合中文| 国产欧美日本亚洲精品| 国产又大又硬又长又粗| 麻豆蜜桃视频在线观看| 精品视频97| 黄色成年| 人妻9117c| 99久久久久| 九九久久首页|