亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

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

LangGraph Checkpoint 實(shí)戰(zhàn):PostgreSQL 持久化與中斷恢復(fù)

LangGraph Checkpoint 實(shí)戰(zhàn):PostgreSQL 持久化與中斷恢復(fù) 1. 為什么手寫(xiě) Loop 終究會(huì)撞上恢復(fù)這堵墻我最早做對(duì)話式 Agent 的時(shí)候和大多數(shù)人一樣寫(xiě)了一個(gè)while True循環(huán)讀用戶輸入、拼 prompt、調(diào)模型、解析工具調(diào)用、執(zhí)行工具、把結(jié)果塞回消息列表、再調(diào)模型直到模型不再請(qǐng)求工具為止。這套東西跑 demo 特別爽幾十行代碼就能讓模型查天氣、算數(shù)學(xué)、讀文件。但只要業(yè)務(wù)稍微真實(shí)一點(diǎn)問(wèn)題就全冒出來(lái)了。最典型的一個(gè)場(chǎng)景用戶讓 Agent 幫忙做一份包含十幾個(gè)步驟的數(shù)據(jù)處理任務(wù)跑到第七步的時(shí)候用戶突然關(guān)掉了瀏覽器或者網(wǎng)絡(luò)抖了一下或者后端服務(wù)重啟了。這時(shí)候你那個(gè)while True循環(huán)里的所有狀態(tài)——已經(jīng)執(zhí)行到哪一步、中間產(chǎn)出了什么、下一步該干嘛——全部隨著進(jìn)程一起蒸發(fā)了。用戶回來(lái)一看得從頭再來(lái)。這種體驗(yàn)在真實(shí)產(chǎn)品里是致命的。手寫(xiě) Loop 的第二個(gè)死穴是人機(jī)協(xié)同Human-in-the-loop。很多任務(wù)需要中途讓人確認(rèn)一下比如我要給這個(gè)客戶發(fā)郵件了你確認(rèn)下內(nèi)容或者這個(gè)數(shù)據(jù)庫(kù)刪除操作要不要執(zhí)行。在裸循環(huán)里你只能靠input()阻塞或者自己造一套狀態(tài)機(jī)把等待確認(rèn)這個(gè)狀態(tài)存到某個(gè)地方。一旦要支持多個(gè)用戶并發(fā)、要支持確認(rèn)后從斷點(diǎn)繼續(xù)你就會(huì)發(fā)現(xiàn)自己其實(shí)是在重新發(fā)明一個(gè)工作流引擎。第三個(gè)問(wèn)題是可觀測(cè)性。手寫(xiě)循環(huán)里每一步的輸入輸出都散落在各種變量和日志里你很難回答這個(gè)任務(wù)到底卡在哪一步了上一步的模型輸出是什么工具調(diào)用參數(shù)對(duì)不對(duì)這類問(wèn)題。排查線上問(wèn)題時(shí)你只能靠翻日志猜。所以當(dāng)我第一次接觸 LangGraph 的時(shí)候最打動(dòng)我的不是它能畫(huà)流程圖而是它把Checkpoint檢查點(diǎn)做成了框架的一等公民。它本質(zhì)上是在告訴你Agent 的執(zhí)行狀態(tài)不應(yīng)該活在內(nèi)存里而應(yīng)該被持久化下來(lái)隨時(shí)可以暫停、恢復(fù)、回放、甚至分叉。這篇文章我就想把這套東西講透——從 LangGraph 的圖結(jié)構(gòu)到 PostgreSQL 做 Checkpoint 存儲(chǔ)再到用 AG-UI 把中斷恢復(fù)的能力暴露到前端跑通一條完整的鏈路。適合讀這篇的人已經(jīng)用 LangChain 或裸 API 寫(xiě)過(guò) Agent、現(xiàn)在被狀態(tài)管理折磨、想上 LangGraph 但被 checkpoint 概念繞暈的開(kāi)發(fā)者。如果你還沒(méi)寫(xiě)過(guò) Agent建議先補(bǔ)一下基礎(chǔ)不然有些坑你體會(huì)不到。2. LangGraph 的圖模型到底和 LangChain 差在哪2.1 從鏈到圖不是換個(gè)名字那么簡(jiǎn)單很多人問(wèn) LangChain 和 LangGraph 的區(qū)別網(wǎng)上答案一大堆但大多停留在一個(gè)是鏈一個(gè)是圖這種廢話層面。我用一句話概括我的理解LangChain 解決的是怎么把組件串起來(lái)LangGraph 解決的是怎么讓一個(gè)有狀態(tài)的流程可控地跑起來(lái)。LangChain 的 Chain 本質(zhì)是線性的、無(wú)狀態(tài)的或者說(shuō)狀態(tài)是隱式傳遞的。你寫(xiě)一個(gè)LLMChain它的輸入輸出是明確的跑完就結(jié)束了。就算你用AgentExecutor它內(nèi)部那個(gè)循環(huán)也是黑盒的你沒(méi)法在中途插手也沒(méi)法把中間狀態(tài)存下來(lái)。LangGraph 的核心抽象是StateGraph。你定義一個(gè) State通常是個(gè) TypedDict 或者 Pydantic 模型然后定義若干個(gè) Node節(jié)點(diǎn)本質(zhì)是函數(shù)接收 State 返回 State 的更新再用 Edge邊把它們連起來(lái)。邊可以是普通的也可以是條件邊conditional edge根據(jù)當(dāng)前 State 決定下一步走哪個(gè)節(jié)點(diǎn)。這個(gè)模型的關(guān)鍵在于State 是顯式聲明的每個(gè) Node 對(duì) State 的修改是可追蹤的。這就為 Checkpoint 提供了基礎(chǔ)——因?yàn)榭蚣苤烂恳徊街?State 長(zhǎng)什么樣它就能把 State 存下來(lái)。2.2 State 與 Reducer狀態(tài)合并的隱藏規(guī)則這里有個(gè)特別容易踩的坑我必須單獨(dú)拎出來(lái)講。LangGraph 里每個(gè) Node 返回的不是完整的 State而是對(duì) State 的部分更新。框架會(huì)把這些更新合并進(jìn)當(dāng)前 State。默認(rèn)的合并策略是覆蓋——你返回{messages: [新消息]}它就直接把messages字段覆蓋掉。但對(duì)話場(chǎng)景里我們想要的是追加不是覆蓋。這時(shí)候就要用到Reducer歸約函數(shù)。LangGraph 提供了Annotated配合add_messages來(lái)聲明某個(gè)字段用追加的方式合并from typing import Annotated from typing_extensions import TypedDict from langgraph.graph.message import add_messages class State(TypedDict): messages: Annotated[list, add_messages] current_step: str task_result: dictadd_messages這個(gè) reducer 不只是簡(jiǎn)單 append它還會(huì)處理消息 ID 去重、處理RemoveMessage這類特殊指令。我見(jiàn)過(guò)太多人因?yàn)闆](méi)加Annotated[list, add_messages]導(dǎo)致每輪對(duì)話歷史都被覆蓋模型永遠(yuǎn)失憶然后花半天時(shí)間懷疑是不是模型的問(wèn)題。提示自定義 reducer 時(shí)函數(shù)簽名是(current_value, new_update) - merged_value。如果你有復(fù)雜的合并邏輯比如字典深合并完全可以自己寫(xiě)一個(gè) reducer 傳進(jìn)去。2.3 條件邊與循環(huán)Agent 的思考-行動(dòng)骨架一個(gè) ReAct 風(fēng)格的 Agent在 LangGraph 里通常長(zhǎng)這樣一個(gè)agent節(jié)點(diǎn)負(fù)責(zé)調(diào)模型一個(gè)tools節(jié)點(diǎn)負(fù)責(zé)執(zhí)行工具然后用條件邊判斷——如果模型輸出了工具調(diào)用就去tools如果模型直接給了最終答案就END。from langgraph.graph import StateGraph, END def should_continue(state: State): last_message state[messages][-1] if last_message.tool_calls: return tools return END builder StateGraph(State) builder.add_node(agent, call_model) builder.add_node(tools, tool_node) builder.set_entry_point(agent) builder.add_conditional_edges(agent, should_continue, {tools: tools, END: END}) builder.add_edge(tools, agent) graph builder.compile()注意tools - agent這條邊它構(gòu)成了一個(gè)循環(huán)。這就是為什么 LangGraph 能表達(dá) Agent 的迭代行為而普通 DAG 不行。這個(gè)循環(huán)也是 Checkpoint 最有價(jià)值的地方——因?yàn)檠h(huán)意味著執(zhí)行到一半是常態(tài)你必須能隨時(shí)把循環(huán)的當(dāng)前狀態(tài)存下來(lái)。3. Checkpoint 機(jī)制中斷恢復(fù)的地基3.1 Checkpoint 到底存了什么很多人以為 Checkpoint 就是存了個(gè)消息列表其實(shí)遠(yuǎn)不止。一個(gè)完整的 Checkpoint 包含channel_values當(dāng)前所有 State 字段的值也就是你的messages、current_step這些。channel_versions每個(gè)字段的版本號(hào)用于并發(fā)控制和增量更新。versions_seen每個(gè)節(jié)點(diǎn)看到的字段版本用來(lái)判斷哪些節(jié)點(diǎn)需要重新執(zhí)行。pending_sends待處理的消息發(fā)送用于 map-reduce 之類的并行場(chǎng)景。除此之外還有一個(gè)CheckpointTuple的概念它把 checkpoint 本身、它的 ID、父 checkpoint ID、以及 metadata比如step、source、writes打包在一起。這個(gè)父子鏈結(jié)構(gòu)非常關(guān)鍵它讓整個(gè)執(zhí)行歷史變成了一棵樹(shù)你可以從任意一個(gè)歷史節(jié)點(diǎn)分叉出去重新跑。3.2 thread_id會(huì)話隔離的鑰匙Checkpoint 是按thread_id隔離的。你可以把它理解成會(huì)話 ID或者任務(wù) ID。同一個(gè) thread_id 下的所有 checkpoint 構(gòu)成一條時(shí)間線graph.get_state(config)拿到的永遠(yuǎn)是這條時(shí)間線上最新的狀態(tài)。config {configurable: {thread_id: user-123-task-456}} result graph.invoke({messages: [(user, 幫我分析這份數(shù)據(jù))]}, config)這里有個(gè)經(jīng)驗(yàn)thread_id 的生成策略要提前想清楚。如果你用用戶 ID 做 thread_id那同一個(gè)用戶的所有對(duì)話會(huì)共享一條時(shí)間線歷史會(huì)無(wú)限增長(zhǎng)如果你用用戶ID 會(huì)話ID那每個(gè)會(huì)話獨(dú)立但跨會(huì)話的上下文就斷了。我的做法是會(huì)話級(jí) thread_id 用 UUID同時(shí)在 State 里存一個(gè) user_id 字段做業(yè)務(wù)關(guān)聯(lián)這樣既隔離了會(huì)話又能按用戶維度查詢。3.3 內(nèi)存 Saver 與持久化 Saver 的分水嶺LangGraph 內(nèi)置了MemorySaver把 checkpoint 存在內(nèi)存里。開(kāi)發(fā)調(diào)試夠用但進(jìn)程一重啟就沒(méi)了而且多實(shí)例部署時(shí)各存各的完全不能用。生產(chǎn)環(huán)境必須換成持久化 Saver。官方支持的有SqliteSaver、PostgresSaver社區(qū)還有 Redis、MongoDB 的實(shí)現(xiàn)。選哪個(gè)我的判斷標(biāo)準(zhǔn)很簡(jiǎn)單場(chǎng)景推薦 Saver理由本地開(kāi)發(fā)、單機(jī) demoMemorySaver零配置重啟即清空單機(jī)小規(guī)模、邊緣部署SqliteSaver單文件無(wú)需額外服務(wù)生產(chǎn)、多實(shí)例、高并發(fā)PostgresSaver事務(wù)保證、并發(fā)安全、可水平擴(kuò)展已有 Redis 基礎(chǔ)設(shè)施社區(qū) Redis Saver復(fù)用現(xiàn)有組件讀寫(xiě)快我選 PostgreSQL 的原因很實(shí)在Agent 的狀態(tài)數(shù)據(jù)天然需要事務(wù)和一致性。你不想看到工具執(zhí)行了但狀態(tài)沒(méi)存上這種臟數(shù)據(jù)吧Postgres 的 ACID 能兜住這個(gè)底。而且 checkpoint 表會(huì)隨著對(duì)話增長(zhǎng)變得很大Postgres 的分區(qū)、索引、歸檔能力都是現(xiàn)成的。4. 用 PostgreSQL 落地 Checkpoint 存儲(chǔ)4.1 環(huán)境準(zhǔn)備與依賴安裝先把依賴裝齊。注意版本LangGraph 迭代很快不同版本 API 有差異pip install langgraph langgraph-checkpoint-postgres psycopg[binary] psycopg-poolpsycopg是 psycopg3PostgresSaver 用的是它不是老的psycopg2。這點(diǎn)很多人會(huì)搞混裝錯(cuò)了會(huì)報(bào)連接相關(guān)的奇怪錯(cuò)誤。數(shù)據(jù)庫(kù)這邊你需要一個(gè)可用的 PostgreSQL 實(shí)例本地 Docker 起一個(gè)最省事docker run -d --name langgraph-pg \ -e POSTGRES_PASSWORDyourpassword \ -e POSTGRES_DBlanggraph \ -p 5432:5432 postgres:164.2 初始化 checkpoint 表結(jié)構(gòu)PostgresSaver 需要幾張表來(lái)存 checkpoint、writes、migrations。官方提供了setup()方法自動(dòng)建表from langgraph.checkpoint.postgres import PostgresSaver from psycopg_pool import ConnectionPool DB_URI postgresql://postgres:yourpasswordlocalhost:5432/langgraph?sslmodedisable pool ConnectionPool(conninfoDB_URI, max_size20, kwargs{autocommit: True}) checkpointer PostgresSaver(pool) checkpointer.setup() # 建表只需執(zhí)行一次注意setup()會(huì)創(chuàng)建checkpoints、checkpoint_writes、checkpoint_migrations等表。生產(chǎn)環(huán)境建議用獨(dú)立的 migration 流程管理而不是每次啟動(dòng)都調(diào)setup()避免權(quán)限和并發(fā)問(wèn)題。建完之后你可以連上去看看表結(jié)構(gòu)理解一下數(shù)據(jù)是怎么落的SELECT thread_id, checkpoint_id, parent_checkpoint_id, metadata-step AS step, type FROM checkpoints WHERE thread_id user-123-task-456 ORDER BY checkpoint_id;你會(huì)看到每個(gè) checkpoint 都有parent_checkpoint_id這就是那條時(shí)間線的鏈。metadata里的step告訴你這是第幾步source告訴你是loop節(jié)點(diǎn)執(zhí)行還是input用戶輸入觸發(fā)的。4.3 把 checkpointer 掛到圖上編譯圖的時(shí)候把 checkpointer 傳進(jìn)去整個(gè)圖就具備了持久化能力graph builder.compile(checkpointercheckpointer)之后每次invoke或stream只要 config 里帶了thread_id狀態(tài)就會(huì)自動(dòng)落庫(kù)。這里有個(gè)細(xì)節(jié)checkpointer 是編譯期綁定的不是調(diào)用期。也就是說(shuō)你不能一個(gè)圖實(shí)例用兩個(gè)不同的 checkpointer需要不同存儲(chǔ)就編譯兩個(gè)圖。4.4 連接池與并發(fā)別讓數(shù)據(jù)庫(kù)成為瓶頸生產(chǎn)環(huán)境一定要用連接池。我上面用了ConnectionPoolmax_size根據(jù)你的并發(fā)量調(diào)。有個(gè)坑PostgresSaver 的寫(xiě)入是同步的如果你的圖節(jié)點(diǎn)里有大量并發(fā)checkpoint 寫(xiě)入可能成為瓶頸。我的優(yōu)化經(jīng)驗(yàn)是連接池max_size至少設(shè)為預(yù)期并發(fā)數(shù)的 1.5 倍。給checkpoints表的thread_id建索引setup()默認(rèn)會(huì)建但你要確認(rèn)。定期歸檔老 checkpoint。對(duì)話歷史無(wú)限增長(zhǎng)的話單表幾個(gè) G 是遲早的事??梢园碿reated_at分區(qū)或者寫(xiě)個(gè)定時(shí)任務(wù)把超過(guò) N 天的 thread 數(shù)據(jù)遷到冷存儲(chǔ)。CREATE INDEX IF NOT EXISTS idx_checkpoints_thread_id ON checkpoints (thread_id, checkpoint_id DESC);5. 中斷恢復(fù)的完整實(shí)現(xiàn)鏈路5.1 用 interrupt 實(shí)現(xiàn)暫停等人確認(rèn)LangGraph 提供了interrupt()函數(shù)在節(jié)點(diǎn)里調(diào)用它就能暫停執(zhí)行把控制權(quán)交還給調(diào)用方。這是實(shí)現(xiàn) Human-in-the-loop 最優(yōu)雅的方式from langgraph.types import interrupt, Command def send_email_node(state: State): draft state[email_draft] # 暫停把草稿拋給前端確認(rèn) decision interrupt({ action: confirm_email, draft: draft }) if decision[approved]: # 真正發(fā)送 send_email(draft) return {status: sent} else: return {status: rejected, feedback: decision.get(feedback)}當(dāng)圖執(zhí)行到這個(gè)節(jié)點(diǎn)時(shí)interrupt()會(huì)拋出一個(gè)特殊信號(hào)LangGraph 把當(dāng)前狀態(tài)存成 checkpoint然后invoke返回。此時(shí)你可以通過(guò)graph.get_state(config)看到state.next指向send_email_node說(shuō)明它卡在這里等人。5.2 恢復(fù)執(zhí)行Command 的正確用法用戶確認(rèn)之后怎么讓它繼續(xù)跑用Command(resume...)from langgraph.types import Command # 用戶點(diǎn)了批準(zhǔn) resumed graph.invoke( Command(resume{approved: True}), config{configurable: {thread_id: user-123-task-456}} )resume的值會(huì)作為interrupt()的返回值注入到節(jié)點(diǎn)里節(jié)點(diǎn)從暫停的那一行繼續(xù)往下執(zhí)行。這里有個(gè)極其容易踩的坑恢復(fù)時(shí)必須用同一個(gè) thread_id而且圖實(shí)例必須是同一個(gè)編譯產(chǎn)物節(jié)點(diǎn)定義一致。如果你改了節(jié)點(diǎn)代碼再恢復(fù)LangGraph 會(huì)嘗試從 checkpoint 恢復(fù)但節(jié)點(diǎn)邏輯變了行為可能不符合預(yù)期。提示interrupt()之前的代碼在恢復(fù)時(shí)會(huì)重新執(zhí)行一遍。所以interrupt()之前不要放有副作用的操作比如已經(jīng)發(fā)了郵件、已經(jīng)扣了款。把副作用放在interrupt()之后或者用冪等設(shè)計(jì)兜底。5.3 從任意歷史點(diǎn)分叉時(shí)間旅行Checkpoint 的父子鏈結(jié)構(gòu)讓你可以做時(shí)間旅行——拿到某個(gè)歷史 checkpoint 的 ID從那里重新跑history list(graph.get_state_history(config)) # history[0] 是最新history[-1] 是最早 target history[3] # 回到第 4 個(gè)狀態(tài) forked graph.invoke( None, # 不傳新輸入從該點(diǎn)繼續(xù) config{configurable: {thread_id: user-123-task-456, checkpoint_id: target.config[configurable][checkpoint_id]}} )這個(gè)能力在調(diào)試時(shí)簡(jiǎn)直是神器。線上出問(wèn)題你可以把那個(gè) thread 的歷史拉出來(lái)從出錯(cuò)前的狀態(tài)重放看看到底哪一步的模型輸出跑偏了。也可以做如果當(dāng)時(shí)用戶選了另一個(gè)選項(xiàng)會(huì)怎樣的假設(shè)分析。5.4 狀態(tài)查詢與前端對(duì)接的接口設(shè)計(jì)前端要展示當(dāng)前卡在哪一步、等什么確認(rèn)需要后端暴露查詢接口。核心就是get_statestate graph.get_state(config) # state.values: 當(dāng)前 State # state.next: 下一步要執(zhí)行的節(jié)點(diǎn)元組 # state.tasks: 當(dāng)前待處理的任務(wù)含 interrupt 信息state.tasks里會(huì)包含 interrupt 拋出的 payload前端拿到就能渲染確認(rèn)彈窗?;謴?fù)時(shí)前端把用戶選擇 POST 回來(lái)后端調(diào)Command(resume...)。這套接口設(shè)計(jì)的關(guān)鍵是把 thread_id 和 checkpoint_id 都透?jìng)鹘o前端前端每次請(qǐng)求帶上后端就能精確定位到該恢復(fù)哪個(gè)狀態(tài)。6. AG-UI 把中斷恢復(fù)搬到前端6.1 AG-UI 解決的是什么問(wèn)題前面講的都是后端能力。但用戶是在瀏覽器里操作的后端暫停了等人確認(rèn)這件事怎么實(shí)時(shí)、結(jié)構(gòu)化地傳到前端傳統(tǒng)做法是前端輪詢或者自己定一套 WebSocket 協(xié)議每個(gè)項(xiàng)目重復(fù)造輪子。AG-UI 是一套面向 Agent 前端的協(xié)議它定義了 Agent 和后端之間的事件流格式——文本增量、工具調(diào)用開(kāi)始/結(jié)束、狀態(tài)更新、中斷請(qǐng)求等等。它和 LangGraph 的配合點(diǎn)在于LangGraph 的 stream 事件可以被適配成 AG-UI 事件前端用統(tǒng)一的協(xié)議消費(fèi)。6.2 事件流從 graph.stream 到前端LangGraph 的stream支持多種模式updates模式會(huì)在每個(gè)節(jié)點(diǎn)執(zhí)行后吐出更新messages模式會(huì)流式吐 tokencustom模式可以吐你自定義的事件。做 AG-UI 對(duì)接時(shí)通常組合使用async for event in graph.astream(input, config, stream_mode[updates, messages, custom]): mode, payload event if mode messages: # 適配成 AG-UI 的 TEXT_MESSAGE_CONTENT yield to_agui_text(payload) elif mode updates: # 節(jié)點(diǎn)級(jí)更新適配成 STATE_DELTA 或 STEP 事件 yield to_agui_step(payload) elif mode custom: # 自定義事件比如工具調(diào)用進(jìn)度 yield to_agui_custom(payload)當(dāng)圖執(zhí)行到interrupt()時(shí)stream 會(huì)結(jié)束當(dāng)前輪次前端收到一個(gè)中斷信號(hào)彈出確認(rèn) UI。用戶操作后前端發(fā)一個(gè)新的請(qǐng)求后端用Command(resume...)繼續(xù) stream。6.3 前端如何渲染等待確認(rèn)狀態(tài)前端拿到 interrupt payload 后需要根據(jù)action類型渲染不同的 UI。我的做法是約定一套 action 到組件的映射action 類型前端組件用戶操作confirm_email郵件預(yù)覽 批準(zhǔn)/拒絕按鈕返回{approved: bool}confirm_delete危險(xiǎn)操作警告彈窗返回{confirmed: bool}select_option選項(xiàng)列表返回{selected: string}input_text文本輸入框返回{text: string}這套映射讓后端可以自由地插入人工確認(rèn)點(diǎn)前端只需要按 action 渲染?;謴?fù)時(shí)把用戶的選擇作為resume值傳回節(jié)點(diǎn)里interrupt()的返回值就是它。6.4 斷線重連前端刷新后怎么找回狀態(tài)這是實(shí)際產(chǎn)品里繞不開(kāi)的問(wèn)題。用戶確認(rèn)彈窗彈出來(lái)結(jié)果他刷新了頁(yè)面彈窗沒(méi)了任務(wù)卡在那。解決辦法是前端啟動(dòng)時(shí)用 thread_id 調(diào)一次狀態(tài)查詢接口后端返回state.tasks如果里面有 pending 的 interrupt前端就重新渲染確認(rèn) UI。app.get(/threads/{thread_id}/state) async def get_thread_state(thread_id: str): config {configurable: {thread_id: thread_id}} state graph.get_state(config) return { values: state.values, next: state.next, interrupts: [ task.interrupts for task in state.tasks if task.interrupts ] }這樣無(wú)論用戶怎么刷新、換設(shè)備只要 thread_id 還在通常存在 URL 或 localStorage狀態(tài)就能恢復(fù)。這也是 Checkpoint 持久化最直接的價(jià)值體現(xiàn)。7. 實(shí)測(cè)中那些文檔不會(huì)告訴你的坑7.1 checkpoint 表膨脹與清理策略跑了一段時(shí)間后你會(huì)發(fā)現(xiàn)checkpoints表漲得飛快。每執(zhí)行一個(gè)節(jié)點(diǎn)就寫(xiě)一條一個(gè) 20 步的任務(wù)就是 20 條記錄加上checkpoint_writes表數(shù)據(jù)量是翻倍的。我的處理方式對(duì)不再活躍的 thread保留最近 N 個(gè) checkpoint老的刪掉。但注意不能隨便刪中間的因?yàn)楦缸渔湐嗔藭?huì)導(dǎo)致時(shí)間旅行失效。要?jiǎng)h就刪整條 thread 的早期記錄或者按時(shí)間歸檔。用checkpointer.delete_thread(thread_id)刪整個(gè) thread這是官方提供的干凈方式。定期跑歸檔任務(wù)把超過(guò) 30 天的 thread 數(shù)據(jù)導(dǎo)出到對(duì)象存儲(chǔ)然后從主表刪除。7.2 恢復(fù)時(shí)節(jié)點(diǎn)重復(fù)執(zhí)行的副作用前面提過(guò)interrupt()之前的代碼會(huì)重跑。我踩過(guò)一個(gè)具體的坑在interrupt()之前調(diào)了一次外部 API 記錄待確認(rèn)日志結(jié)果恢復(fù)時(shí)又記了一次日志里出現(xiàn)兩條。解決辦法是把這類副作用移到interrupt()之后或者用冪等鍵去重。還有一個(gè)更隱蔽的如果你的節(jié)點(diǎn)里有time.sleep()或者耗時(shí)計(jì)算恢復(fù)時(shí)會(huì)重新執(zhí)行導(dǎo)致響應(yīng)變慢。所以節(jié)點(diǎn)設(shè)計(jì)要盡量輕重活拆到獨(dú)立節(jié)點(diǎn)讓 checkpoint 的粒度更細(xì)。7.3 thread_id 設(shè)計(jì)不當(dāng)導(dǎo)致的串話我見(jiàn)過(guò)一個(gè)事故開(kāi)發(fā)時(shí)圖省事用固定的default做 thread_id結(jié)果所有用戶的對(duì)話全串在一起A 用戶看到了 B 用戶的歷史。這在生產(chǎn)環(huán)境是災(zāi)難級(jí)的。正確做法是 thread_id 必須全局唯一且和用戶綁定。我的生成規(guī)則是f{user_id}:{session_uuid}既保證唯一又方便按用戶查詢。同時(shí)在后端做一層校驗(yàn)請(qǐng)求里的 user_id 必須和 thread_id 里的 user_id 匹配防止越權(quán)訪問(wèn)別人的會(huì)話。7.4 版本升級(jí)導(dǎo)致的 checkpoint 不兼容LangGraph 的 checkpoint 格式在不同版本間可能變化。我遇到過(guò)一次升級(jí)后老 checkpoint 反序列化失敗的情況。經(jīng)驗(yàn)是升級(jí) LangGraph 前先在測(cè)試環(huán)境用生產(chǎn)數(shù)據(jù)的副本驗(yàn)證老 checkpoint 能否正常讀取。大版本升級(jí)時(shí)考慮把活躍 thread 跑完再升級(jí)或者寫(xiě)遷移腳本。生產(chǎn)環(huán)境鎖定版本別用latest。7.5 并發(fā)寫(xiě)同一 thread 的競(jìng)態(tài)如果同一個(gè) thread_id 同時(shí)有兩個(gè)請(qǐng)求進(jìn)來(lái)比如用戶手快點(diǎn)了兩次兩個(gè)請(qǐng)求都會(huì)嘗試寫(xiě) checkpoint可能產(chǎn)生沖突。PostgresSaver 內(nèi)部有版本控制但業(yè)務(wù)層面最好加鎖——用 Redis 分布式鎖按 thread_id 加鎖保證同一時(shí)刻只有一個(gè)執(zhí)行流在跑。lock_key flanggraph:lock:{thread_id} if not acquire_lock(lock_key, timeout30): raise HTTPException(409, 該任務(wù)正在處理中請(qǐng)稍候)8. 從裸 Loop 遷移到 LangGraph 的實(shí)操建議如果你手上已經(jīng)有一個(gè)跑得還行的手寫(xiě) Loop想遷移到 LangGraph我的建議是別一次性重寫(xiě)。分三步走第一步先把 Loop 里的狀態(tài)抽出來(lái)定義成顯式的 State 結(jié)構(gòu)。這一步不改邏輯只是把散落的變量收攏。你會(huì)發(fā)現(xiàn)很多隱式狀態(tài)之前根本沒(méi)意識(shí)到。第二步把 Loop 的每一輪拆成節(jié)點(diǎn)。調(diào)模型是一個(gè)節(jié)點(diǎn)執(zhí)行工具是一個(gè)節(jié)點(diǎn)判斷是否繼續(xù)是一個(gè)條件邊。這時(shí)候先不接 checkpointer用 MemorySaver 跑通確認(rèn)行為和原來(lái)一致。第三步接上 PostgresSaver加上 thread_id測(cè)試中斷恢復(fù)。這一步最容易暴露問(wèn)題——你會(huì)發(fā)現(xiàn)有些節(jié)點(diǎn)有副作用、有些狀態(tài)沒(méi)被正確 reducer 合并。逐個(gè)修。遷移完之后你會(huì)獲得幾個(gè)原來(lái)沒(méi)有的能力任務(wù)可以暫?;謴?fù)、可以時(shí)間旅行調(diào)試、可以多人協(xié)同確認(rèn)、可以水平擴(kuò)展因?yàn)闋顟B(tài)在數(shù)據(jù)庫(kù)不在內(nèi)存。這些能力在裸 Loop 里要么做不了要么得自己造一套成本遠(yuǎn)高于直接用框架。最后分享一個(gè)我自己的判斷標(biāo)準(zhǔn)當(dāng)一個(gè) Agent 任務(wù)的執(zhí)行時(shí)間超過(guò) 30 秒或者需要人工介入或者需要跨請(qǐng)求保持上下文就該上 LangGraph Checkpoint 了。低于這個(gè)復(fù)雜度裸 Loop 反而更直接。工具是拿來(lái)解決問(wèn)題的不是拿來(lái)炫技的。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
97在线看| 久操操| 国语对白露脸XXXXXX| 欧美不在线| 色香蕉影院| 夜夜高潮夜夜爽夜夜爱爱一区 | 97最新在线播放视频| 日本好吊色视频| 亚洲欧洲综合成人av一区| 黄色成品网站| 十八禁av无码免费网站APP| 99热在线只有精品| 好爽免费视频,| 九九热最新| 日韩三级视频一区二区三区| 九九九不卡| 狠狠亚洲| 丝袜六区| 国产区91柔拿会所技师| 东北女人高潮视频| 日韩精品午夜操呦呦不卡影院| 很很很很操| 99碰碰| 久久精品国产欧美日韩亚洲欧美日韩中文久久国产一区 | 在线视频日韩欧美国产| 超碰色老头| 欧美色老汉| 淫穴高潮色图| 伊人青青一区成人视频在线观看区| 欧美日韩另类在线播放| 韩三级a视频在线观看| 蜜乳av一区二区三区| 在线看免费无码AV天堂的| 中文字幕一二三| 国产精品一区二区三区免费视频| 亚洲天堂日本| 青青草一区二区三区四| 国产高清不卡视频| 五月丁香六月| 日亚韩精品视频二区三| 久久激情综合| 天天做天天爽| 91成人在线| 热热热热日日漂亮永久永久国产日| 欧美一级欧美三级在线观看| 在线洲亚线| 一本大道久| 欧美日韩天堂| 精品久操| 欧美大香蕉同搞| 天天干人人看综合| 91美女视频| 一本大道青青| 四虎国产精品永久在线囯在线| 国产亚洲福利第一页丝袜| 亚洲本色精品一区二区久久| 在线97视频| 肉动漫无遮挡h在线观看| 天天插天天插| 中文字幕国产精品1区| 破苞ⅩXXX性无码动漫无码| 国产美女高潮叫床视频| 欧美黄片欧美黄片xxx| 精品久久久av无码免费| 久久国产性爱| 91GD.COM| 久久婷婷视频| 色女综合| 亚洲色情在线影视| 亚洲图片色图欧美另类| 91精品伊人久久久大香线蕉91| 亚洲精品成人| 大香蕉啪啪啪啪在线| 97大色网| 欧美色图在线视频少妇| 绯色一区二区三区不卡少妇 | www.av在线观看| 玖玖97综合| 久久色人体| 91日产欧美| 久久久免费懂色| 欧美性夜| 日韩欧洲操屄视频| 国产精品视频一区二区三区八戒| 亚州操逼网| 嗯啊免费视频| 国产精品农村妇女| 操逼无码操逼| 丰满人妻一区二区三区免费,| 亚洲欧洲偷拍一区| 超碰97首页| 18禁无码永久免费无限制| 色哟哟综合| 性做久久久久久免费观看软件| 天天淫人人妻日日色| 91欧美偷拍| 在线 欧美 亚洲| 97操b| 制度丝袜99| 射丝袜高跟鞋99| 超碰导航97| 黄页av| 欧美刺激色黄片免费看| 日日躁夜夜躁狠狠躁超爽| 先锋色眉乱伦资源| 日日狠狠久久偷偷色综合免费| 青青草色插素人| 久久精品| 欧美天天综| 日本综合色图| 日韩欧美字幕亚洲一区二区| 人人搡人人肉久久精品| 久久91精品国产9丨久久分亭| 久久久久密| 中文字幕五月婷婷免费| www.婷婷六月天| 激情亚洲天堂| 91色射| 欧美黑人猛交春色影视大全| 97人人模人人爽人人| 中文字幕乱碼在线| 欧差乱伦二三| 欧美图片色综合| 欧美AB在线| 色婷婷在线视频| 亚洲另类色综合网站| 在线精品福利免费播放| 99操| 亚洲天天操| 五月婷婷综合在线| 亚洲一区二区在线观看91| 国产AV色黄看到爽| 欧美日韩人人早| 99少妇| 久操网线| 91美女精品| 黄色AV影视| 欧美草草| 亚洲色人妻综合| 成全动漫视频观看免费下载| 欧美日韩精品国产91| 97极品无码| 亚洲青青青视频在线| 国产精品99999| 久久內射| 亚洲精品日韩国产欧美| 亚洲加勒比久久日本道| 天天干天天日天天射黄色大片| 亚洲美女AV无码| 蜜臀精品1区2区| 天天草夜夜草高潮片| 久久久久密臀视频| 亚洲色图久久精品蜜| 激情婷婷综合久久| 囯产精品强| 人妻丰满熟妇一区二区三| 91欧美综合在线| 色婷五月| 欧美激情另类一区二区| 青青草久草| 蜜臀色乳| 粉嫩国产精品久久久| 国产 无码 一区二区| 老熟女中文字幕高清| 国产无套粉嫩白浆在| 亚州男人天堂| 久久久一区二区| 操高情无码| 亚洲开心网| 中文字幕av丝袜| 红杏大香蕉| 操日韩第| 91精品国产91久久青草| 国产精品69久久久久孕妇欧美 | 中文久久一区| 毛片中心9视频99| 日韩成人性爱AV| 超碰97精品| 激情文学小说一区二区| 亚洲91大片| 欧美中文字幕男人天堂久久精品| 亚洲综合九九| 国内毛片无码一级毛片| 永久免费发布性爱网| 囯产精品久久久久久久久久梁医生 | 亚洲欧洲日韩国产自在线| 清纯唯美亚洲综合| 亚洲欧美另类小说| 久久精品成人| 久久99草| 久久99草| 韩国嫰模上门援交视频| www.男人天堂| 秋霞福利网| 日韩成人午夜精品久久高潮| 91在线限制级| 毛片视频白嫩| 国产精品91一样| 久久9视频| 鸡巴插逼视频| 天天日天天干天天整| 天天弄天天操| 啪啪资源网| 台湾成人无码AV| 91色人妻| 综合在线导航一区| 日本精品第一视频在'| 淫荡少妇免费| 久久久久久久国产视频| 日韩亚洲国产视频| 操逼无码一区| 综合久| 色墦五月丁香| 人人色97| 亚洲男人天堂网久久| 女一区二区| 人妻精品一区二区全免费| 精品国产网站| 青青草玖玖爱| 欧美丝袜91| 男人天堂2030| 人妻色偷色噜| 91成人久久| 强奸xx国产| 91丨九色丨东北熟女| 久久久 国产精品| 中文字幕在线日亚州9| 日韩熟妇二区| 免费看污网址| 激情在线青青操| 久久久少妇| 中文字幕一区二区三区字幕| 天天日B夜夜干B时时操B| 国产伦精品一区二区三区在线观| 国产精品对白内射| 欧美在线视频观看一二三四区高清| 午夜福利在线合集| 亚洲精品欧洲色| 91精品人妻偷情| 搡老女人老妇女AAA一VU麻豆 | 极品少妇久久久久| 粉嫩av在线| 久久男人精品| 亚洲激情久久| 国产美女口爆吞精| 超碰免费97| 亚欧视频在线| 嗯嗯嗯嗯啊啊啊好紧好大| 97在线观视频免费观看| 天天看天天日天天操| 在线一道啪| 夂久色| 99国产精品免费| suv精产一二三区| 曰韩操B| 久久久久久大| 农村妇女精品一二区| 久久亚洲欧美中文字幕国语| 东北女人av| 9997se| 视频国产欧美在线播放| 任你爽视频| 国产精品视频播放| 精品国产Av无码久久久伦古装| 国产福利在线视频网站| 欧美日韩人人精品| 91性网| 岛国视频免费在线观看| 精品一区二区三区蜜桃臀赵总 | 大奶啊啊好爽| 人人妻天天做天天爽| 人人操人人色网| 五月色网| 久久婷婷一区| 欧美日韩大香蕉| 乱伦熟女区| 久久草视频污视频| 亚洲本色精品一区二区久久| 人妻少妇色综合| 玖玖爱综合网| 国产三级中文有码在线视频| 美女诱惑在线一区| 中国一级操逼视频| 精品一区二区三区四区女 | 亚洲精品欧洲精品| 强奸抽插av| 九九九午夜| 超碰av在线| 中国熟女91| 亚洲1区2区三区高清中文字幕| 强上我不卡卡| 九月激情婷婷| ai欧美亚洲小说| 国产中文大片资源中文字幕| 亚洲drav色图| 啪啪一区| 啊啊啊操死我| 亚洲精品欧洲精品| 久久精品久久九九精品| 色www精品视频在线观看| 欧美亚洲一级在线观看| 国产成人精品午夜福利| 激情综合婷婷| 亚洲精品97久久| 美中韩AV综合网| 色汉综合| 91高跟美女在线播放| wwwxxx日本爽| 日日AAvv| 正在播放:深夜激情大战,自带黑丝袜全力输出骚穴 | 欧美劲爆视频一区二区| 人妻另类| 熟妇人妻一区二区| 久操网视频| 日日日色色色色色| 久色网| 成年人黄色| 超碰色中文| 人人操人人插人www| 亚码人妻| 日本一级黄色电影| 欧美五十路熟| 久久丝袜| 97色视频在线| 亚洲av性爱电影| 人人操人人爽人人操人人| 午夜性| 精品一区二区综合熟妇| 97精品视频| 2019午夜福利视频| 国产精品久久久久久夜夜夜| 日韩av一级黄片| 色香av| 99只有精品| 欧美日韩999| 91被操| 自拍啪啪视频| 国产精品天干天干综合网麻豆| 国产亚洲综合欧美一区| 一本色道综合久久欧美| 在线中文字幕视频| 97超碰这里只有精品| 精品久久久无码| 激情无码日韩| 精品无码欧美三级| 一区二区三| 天欧美在线| 黑丝少妇麻豆| 午夜人妻精品综合在线| 国产AV高清AV无码| 91丨豆花丨熟女| 丝袜亚洲综合| 校园春色AV天堂| 亚洲少妇激情一区二区三区| 欧洲射精91| 99无码精品| 国模无码一区二区三区在线| 人妻干天天| 俞拍久久国应视频| 亚洲国产97在线精品一区| 日韩精品三级片长长久久| 啪啪视频mP4| 婷婷五月天成人| 日本在线播放不卡一区| 日韩色| 国产v片在线免费观看| 东北女人高潮视频| 日本一二三免费久久| 老司机午夜福利视频一区二区| 男人的天堂2018.| 国产人妻精品久久久一区二区三区 | 久久大香蕉手机高清视频| 色香色欲天天综合网天天来吧| 欧美Aⅴ| 黄色视频60分钟| 立川理惠被中出无码| 亚洲丝袜综合| 欧美色综合| 天天综合欧美| 丝袜人妻av一区二区| 97免费视频在线观看| 夜夜欢天天干| 91春色| 91视频综合网| 99无码狠狠久久| A 天堂| 91精品无码久久久久久久| 天天澡天天爽日日AV| 丝袜足交视频| 国产h小视频在线观看免费| 国产熟妇 码视频户外直播| 干少妇视频| 日本伦乱九九九综合| yaouchengrenav| 影音先锋每日最新资源在线观看| 人人玩人人添人人澡免费| 国产精品爱欲| 乱欲一区二区| 婷婷激情五月| 精品91摸| 人妻少妇精品久久久| 麻豆传媒一区二区在线观看| 东北女人高潮视频| 农村女一级毛卡片| 欧美少妇性爱网站| 很很干很很操| 亚洲综合性网址| av橘色网站| 青青草中文字幕| 亚欧毛片基地国产毛片基地| 桃花色涩综合影院| 久久熟女人| 久久、1234| 精品少妇一区二区三区| 久久av无码| 亚洲综合一区二区| 青青草日本无码| 97丝袜亚洲在线播放| 精品一区二区三区18| 精品日韩人妻视频| 人人操人人狠狠操| 九九热超碰97亚洲最新香蕉| 校园春色美腿丝袜 | 99re这里只有精品中心播放| 蜜桃狠狠色伊人亚洲综合| 野狼福利社区| 日本国产高清色www视频在线| 麻豆国产尤物AV| 久草男人天堂| 免费试看60秒| 再深点灬舒服灬太大了好硬好爽| 亚洲 中文 女同| 亚洲加勒比色图| 立川理惠被中出无码| JIZZJIZZ国产精品喷水| 夜夜高潮夜夜爽高清视频一| 久操免费观看| 中文自拍欧美影视| 亚洲色图美腿丝袜| 国产成人亚洲精品无| 五月婷婷丁香中文字幕| 97色色国产视频| 啊啊啊啊好爽好舒服一区二区易域| 国内精品a| 青青草操逼逼视频| 人人操人人操人妻人| 曰韩操B| 日韩精彩免费| 操碰97| www.狠狠| 久久线上视频免费看| 日本www操操操| 在线观看A啊啊啊| 久久亚洲AV无码白度| 91九色网| 蜜臀99久久国产| www.av在线观看| 骚妻少妇精品性色无码四色A V| 一级岛国大片| 欧美日韩国产男人| 一二三四视频中文字幕在线看| 精品久久久久,69国产成人精| 超碰99在线| 日本三级韩三级99久久| 成人草草视频| 婷婷丁香六月| 91熟女网| 91婷婷伊人狠人| 好吊色综合| 人妻熟女一区在| 神马麻豆福利院| 开心五月天激情网| 亚洲天天在线| 日韩女优在线| 精品国产无码中文| 九七毛片九九毛片| 国产福利精品最新在线| 深夜激情| 天天综合网~69| 精品视频一区二区| 三上制服丝AV| 日韩 欧美 另类 人妻| 日本中文字幕熟妇| 大香蕉五月天婷婷| 国产一级内射高清视频| 美女91在线观看| 日日噜噜夜夜狠狠视频无| 98超碰日本| 91久久久久久久久18| sewuyueav| 中文字幕丝袜美腿| 波多野42部无码喷潮在线观看 | 久久专区| 国产噜噜噜噜噜久久久久久久久| α√在线| 天天综合网91| 亚洲色图综合网| 婷婷色婷婷| 亚洲熟伦熟妇AV无码春色| 日韩精品99久久久久久中文字幕| 国产精品成人无码av无码免费| 51一区二区三区| 中文高清一区二区的| 久综合国内精品自在自线| 久久人妻无码毛片A片麻豆| 91超级碰碰| 又大又长又爽| 激情无码日韩| av激情亚洲五月天| 久久久草草精品| 天天爽爽爽爽| 大香网站| 免费的黄片有限公司| 久久9免费视频| 大鸡巴久久久| 日本一本道A级黄色毛片试看60分钟| 加勒比aⅴ| 超碰碰激情97+久| 四季AV一区二区凹凸精品小说| 国产精品一区二区亚洲人成毛片| 91美女视频在线免费观看| 91社区伊人| 老女人碰碰在线碰碰视频| 99色婷婷| 亚洲97久久精品亚洲| 青青草毛片| 亚州国产成人精品女人久久| 中文字幕在线观看AV| 能直接看AV的网站| 日韩免费看在线黄色片| 97爱亚洲| 女人香蕉久久毛毛片精品| 欧美激情欧美精品| 亚洲日本男人天堂网| 国产成人精品日本亚洲语言| 精品九九国产无码| 国产兽交视频在线播放| 久久久久久久久久9| 99re在线视频| 91欧美丨精品丨入口| 青青国产精品在线| 丝袜美腿诱惑亚洲欧美视频在线观看| 强奸乱伦Av网| 国产日韩欧美亚洲精品95| 国产区日韩区在线观看| 精品国产乱子伦一区二区三区,精品一| 加勒比海成人视频网| 人妻一区久久二区三区色播| 美腿色图| 国产久久久9999| 熟女人妻av在线资源,黄色的资源 粉嫩国产精品久久粉嫩 | 日本久久女同性恋视频| 九九无码视频| 国产成人无码网站在线视频| 国产精品视频精品一二| 日韩AC| 色爱三区| 久操不卡视频| 六月丁香啪啪| 亚洲男人天堂2019| 东京热激情视频一二三区| 超碰狠狠操| 日日夜夜狠狠| 五月久久HDAV| 99999精品成人| 色诱中文字幕| 麻豆 亚洲 97| 精品无码产区一区二| 久久9精品网站| 992大香蕉| 欧美色图20p| 国产午夜精品理论片a大结局| 欧美性天天| 成人午夜高潮av猛片| 欧美区亚洲区偷拍区| 亚洲一曲日韩精品| 亚洲欧美日韩精品久久久一区二区| 亚洲av无线观看| 97人人操人人干| 91精品电影18| 一区二区国产视频在线观看| 中文字幕欧美日本乱码一线二线| rivers-china.com| av黄图片在线观看| 欧美激情性爱视频网站| 操美女高潮抽搐白浆| 午夜人妻精品综合在线| 亚洲综合小视频小说在线观看| 亚洲的天堂网| 欧美高清第一页| 日韩在线一区高清在线| 国产成人无码久久精品| 日本一区二区三区欧美日韩中文字幕| 神马久久啊啊| 97久久国产精品女不卡| 国产女同视频在线播放| 婷婷久久五月| 四虎免费看黄| 超碰在线免费一区二区三区| 午夜视频久久久久一区| 国产成人网址| 精品网站99999| 91情色在线| 日本黄色大片一级视频免费麻豆| 激情第四色| 热热热热日日漂亮永久永久国产日| 亚洲情色 自拍| 无码直播久久久| 五月天社区| 亚洲爱爱视频一区二区| 韩国一级做a久久久久| 亚洲精品第一| 久久夜夜夜夜| 香蕉视频精品亚洲一区二区三区在线播| 人妻丰满熟妇一区二区三| 婷婷五月天成人| 欧美中字不卡| 久久黄片国产一区二区| 欧美亚性天堂| 97资源站国产精品| AA特级绝黄| 亚洲棕合电彰| 久久久久国产精品久久久| 综合久久欧美| 91亚洲欧美综合高清在线| 天天射天天| 欧洲天天在线| 一区二区三区看视频| 五月天玖玖资源站| 亚洲熟女一区| 91人妻精华帖| 国产嫩草精品A88AV在线| 亚洲熟女综合一区二区| 中文激情网| 少妇熟女视频一区二区三区| 久久直播国产| 少妇丝袜在线观看AV| 最新国内自拍av免费| 天天摸夜夜摸| 国产强奸乱伦欧美| 红桃视频高潮| 国产精品999aaa| 亚洲……91| 久久精品国产Aⅴ| 天综合中文| 欧美亚洲天堂| 任我爽视频在线观看| 欧美激情一区| 中文久久一区| 日熟女| 蜜桃精品视频一区| 国产操偷| 亚洲激情欧美色图 | 熟妇高潮二区三区| 免费的黄片wwwwww| 超碰97伊人| 欧洲色| 精品九九九九九| 日本三级小说中文字幕| 日韩偷拍一区二区三区| 福利天堂| 精品国产精品一区二区| 91中出视频| 一个人在线看的黄色电影网站| 亚洲欧美国产中文视频| 日韩精品操少妇| 全免费a敌肛交毛片免费| 青青久日| 超碰日本97美女人妻人人玩人人爱| 国产60页| 亚洲日韩熟女人妻高清在线| 亚洲国产欧美中文永久| 久久色精品视频在线| 久久av网| WWW黄片COM| 国产精品亚洲美女久久久久| 九九九网站| 欧美熟女妇同| 亚洲欧美激情在线视频| 亚洲97| 国产第11页| 欧洲色| 男人天堂黄片| 啪啪自拍九九综合| 美性中文综合网| 人妻22p| 国产午夜福利专区综合| 男人天堂无码| 玖玖爱综合| 99操碰| 亚洲春色欧美激情自拍| 性生活性生大爱77AV国产| 天操天操夜操夜月操月年年操| 波多野结衣先锋影音| 色欲久久99国产精品久久久久久| 懂色AV中文| 99色视频| 亚洲无码?第一页| 91精片| 无码九九九九| 色999偷自拍拍| 色综合99| 手机在线人成免费视频| 欧美成熟性爱精品| 欧美成人精品欧美一级乱黄一区二…| 超碰中文字幕人妻草一区| 伊人久久婷婷| 一级黄色牲爱A级片| 国产精品不卡av免费在线观看| 九九九九九九免费视频| 麻豆性爱视频在线播放| 美女尤物福利视频| 亚洲成A∨人影院在线欢看| 国产精品在线免费| 日本 免费 一区二区三区 久久香蕉 | 人人澡人人爽人人精品| 婷婷五月天AV| 抽插无码高清一区| 久久国产免费激情视频| 国产精品不卡av免费在线观看| 欧美自拍网| 无码人妻毛片丰满熟妇精品区| 青青操在线亚洲视频观看欧美在线 | 久久宗合亚洲| 老熟妇综合| 97色诱| 91在线免费观看处女| 日韩精品区二区三区不卡| 抽插无码高清一区| 乱伦系列一区二区| 久久无码电影| 亚洲综合中文字幕有码| 91操人| 国产强奸超碰AV| 亚洲国产精品成人无码久久久 | 国产乱青青草久久| 天天射夜夜| 好爽免费视频,| 久久精品视| 2017超碰| 啊啊在线| 欧美日韩色| 欧美黄业| 97色五月天完| 亚洲色鬼| 色女99一级片在线观看| 久草精品国产蜜臀 | 久久精品店| 国产欧美亚洲精品a第2页| 久久九九国产精品| 日本黄 R色 成 人网站| 久操操| 久久久久13| 玖玖爱综合| 欧美大片天天看| 少妇高潮喷水无套久久久久久| 91美女国产在线| 亚洲丝袜二区在线| 久久99国产精品| 日韩一级欧美一级国产一级台湾 | 性色avv| 久久最新视频免费观看| 麻豆国产成人精品| 99日视频在线免费| 97se亚洲综合自| 亚洲国产丝袜熟女av| 综合av社区| 天天色播亚洲综合网站| 日本大片日本一区二区免费高清 | 久久精品国内Av熟女高清| 人人艹亚洲| 中文字幕av乱伦| 青青网三级视频| 日韩午夜国产| 后入人妻无码| 日韩偷拍一区二区三区| 综合欧美日本三级| 天天看少妇| 丝袜狠狠草尤物 91| 怡红院成人视频| 欧美gv在线观看| 国产三级电影免费观看| 国产精品久久久久绯色| 丝袜狠狠草尤物 91| 少妇熟女一区二区三区| 国产在线激情视频| 99色在线| 人妻少妇久久| 日韩 国产 欧美自拍| 抽插无码高清一区| 韩国女主播青草在线| 99热精品在线观看| 黄片视频,下载| 五月天色图影视| 丝袜亚洲91| 亚洲国产丝袜熟女av| 凸凹视频在线观看| 神马久久久久久久久久久久| 啊啊啊啊嗯嗯在线久久久| 亚洲黄色视频在线观看视频| 亚洲精品视频在线| 视频二区熟女人妻| 香蕉黄色一级视频| 精品久久久久综合无码| 国产精品一区二区校花| 91久久精品国产| 九九九九九九综合| 亚欧成人综合影院| 女一区二区| 蜜桃av色偷偷av老熟女| 中文字幕日本久久| 97超碰超欧美。| 久操操AV电影| 久久这里精品国产99丫e6| 精品少妇99| 国产97色在线| 欧美综合狠| 18禁美女裸体无遮挡啪啪| 97综合日韩| 久久久久久97| 69精品少妇一区二区三区蜜桃| 欧美亚洲色的图| 日本无码1| 久久久久亚洲一区女同性恋中文字幕| 精品人妻一二三| 天堂蜜桃无码视频一区二区| 日本三级精品| 啪啪综合网| 九久久九九久视频| 国产大学生高潮在线播放| 肉丝无码中文高清| 亚洲少妇综合在线播放| 老司机午夜福利视频一区二区| 日韩精品色呦呦| 大香蕉伊在线久草麻豆天堂故事| 91激情| 久久综合18p| 日本在线观看网址| 日韩/97| 亚洲古典另类欧美在线| 日本不卡一区二区三区| 日本女优在线视频福利| 无卡一区=区| 97精品熟女少妇一区| 色好看av| 成人午夜高潮av猛片| 国产精品 午夜福利| www.久久制服糖| 日本五十路在线| 国产不卡免费在线视频| 中出后入| 啪啪一区| 国产亚洲色婷婷久久99精品91 - 百度| 免费看美国人人爽,人人操 | 成人色女网| 国产日产精品久久快鸭的功能介绍| 91丝袜在线观看视频在线观看| 日本欧美中文字幕| 国产乱弄免费在线视频。 | 99免费视频| 亚洲中文字幕在线视频一区二区| 欧美在线啊啊啊| 手机在线看片免费人成视频| 欧美综合天堂| 超硑97精品| 亚洲一区二区三区欧美日韩| 一二三区精品视频| 在线综合 亚洲 欧美中文字幕| 国产精品无码久久久久2028| 竹菊一区二区三区AV线| 青青草视频爽一爽| 播播亚洲小说亚洲| 人妻少妇精品| 欧美影音在线| 99re视频在线观看这里只有精品| 超碰日韩人妻| 97操B| 97视频在线观看高清资源| 操逼操操操91| 久久精品福利影院| 九九热精品视频六| 殴洲老熟女| 大胆91| 婷婷中文网| 欧美大香蕉久| 欧美78P| 超碰97欧美日韩| 久久这里都是精品| 久久国内| 免费国产电影一区二区| 日韩AV噜噜噜一区二区三区四区| 欧美色图天堂网m| 国产亚洲色婷婷久久99精品91| 怡红院怡春院| 韩国一级婬片A片AAAAA| 欧美区亚洲区偷拍区| 96超碰网| 欧美日本不卡| 青青草白白色| 天天操女人| 久久98| 操逼逼福利视频| 无码一区二区精品视频久久久春药 | 午夜精品久久一区二区| 国产精品另类一区大香蕉| 中文字幕久久精视频久久大全| 97电影院超碰| www.99在线| 在线观看黄色电话| 色色色色日本| WWW操逼| av黄图片在线观看| 色妺妺AⅤ| 清纯唯美第一页| 久草成人影片| 夜夜免费视频| 97精选久久| 久色99999| 欧美性生活内射| 久久一二三四五六七八九区区| 国产精品肉丝自拍| 爱爱动态120秒| 中文字幕五区| 婷婷色综合| 99视频只有精品| 99自拍视频在线| 99日韩| 国产在线视视频有精品| 国产亚洲色婷婷久久99精品91葵花宝典| 一级特黄aaa大片在线观看成人一级片在线观看 | 超碰 欧美| 久久久久久久久久久精| 男人的天堂无码| 日韩精品国模| 天天拍天| 国产日韩中文字幕欧美| wuyechaopeng| 日本熟妇自慰性高潮一区二区三区| 色综合20p| 综合网97| 人妻喷水| 日韩人妻无码不卡网站| 亚洲欧美清纯| 91人妻在线视频| 97亚洲中文| 欧美天天综合| 強姦亂倫a| 人人操人人操人人操人人操人人操人人人11.CM | 国产高清无码一区三区二区| 蜜乳Av成人片网站| 久草网站免费在线观看| 日韩AC| 夜夜一区二区| 91国产大片| 精品久久9| 国产精品伦理| 中文字幕av亚洲精品| 性爱视频无打码在线观看| 伊人影院综合是一个与深夜成人在线| 国产强上视频在线观看| 五月丁香综合啪啪| 激情四射婷婷四五月天| 亚洲一区二区三区麻豆传媒| 亚洲男人的天堂网| 97超碰精品图片| 福利视频香蕉免费一区二区在线| 欧美一区二区日韩三区| 欧亚性爱视频免费看| 日本三级中国三级99人妇网站| 按摩中文字幕| 欧美黑人91| 五月天亚洲色图| 国产熟女| 欧美日韩国产精品久久色婷婷| 东京热毛片177b2viP| 国产高清吃奶免费视频网站| 日韩一级片在线看| 人妻精品综合中文字幕在线| 内射卯月麻衣| 日本精品一区二区三区四区的功能| 18禁在线视频| 美女自卫慰黄网站免费| 亚洲日本韩国极品一区二区| 97超碰巨乳| 久操免费观看| 太久视频| 熟妇女人妻呻吟久久AV| 欧美日韩97在线| 成人免费性爱视视| 成人国产精品三级A片| 精品人妻一区二区三区-国产| 亚洲诱惑天堂| 无码动漫av中文字幕| 偷看洗澡一二三区美女| 日韩超碰精品综合| 亚洲欧美97√| 国产av又色又爽又黄| 亚洲中文制服诱惑| 国产美女91| 在线一道啪| 久久色一区| 亚洲精品欧洲色| 日韩精品永久在线观看| 爽爽爽免费视频| 亚洲天堂男人天堂网| 成人免费福利在线观看| 大香蕉中文aV在线| 久久久四区| 国产原创剧情在线丝袜| 天美精品一区二区三区四区在线观看| 国产精品夜夜| 欧美日韩第一页| 日韩中文字幕2020| 久久精品国产Aⅴ| 九九九九九九九精品视频| 久久久熟女一区| 成人性爱av.com| 美女AV一区二区| 国产在线综合福利网站| 伊人久久88国产女| 国产美女91| 欧美麻豆成人同性GⅤ在线| 试看福利| 26uuu偷拍亚洲欧洲综合| 爱干爱射网啊啊啊| 2020久久免费视频| 亚洲欧洲偷拍一区| 中文字幕一区二区三区人妻不卡 | 泰国AV在线观看| 超碰95| 五月天春色激情网| 中文一区二区三区影院| 啊啊啊好爽快点啊啊啊嗯嗯| 日韩本不卡视频在线观看| 妺妺跟我一起洗澡没忍住| 日韩有码回春沙龙第一页| 操高情无码| 亚洲高清男人天堂| 自拍偷拍2025在线观看 | 婷婷五月天AV| 加勒比aⅴ| 综合色图区| 秋霞午夜成人福利片片| 午夜呻吟欧美| 99re热有精品视频国产| 日韩久久艹| 操逼逼福利视频| 凹凸 69堂 在线播放| 涩五月婷婷| 麻豆久久精品亚洲精品88 | 成人免费看吃奶视频网站| 国产精品网站免费 | 夜夜春夜夜操| 成人av免费观看| 91人妻在线视频| 国产熟女一区二区丰满| 少妇3P性爱自拍| 中文字幕第二页| 亚州宗合另类| 久久欲| 蜜桃臀一区二区三区久久| 大香蕉人妻| 在线免费观看高清无码视频| 黄色片A级一区二区三区| 久久日本熟妇熟色高清| aⅴ日韩成人电影av在线免费看av大全 | 凹凸视频在线一区二区| 性生活无遮挡纯毛片在线看| av午夜影院在线播放| 91bbbbbb| 91九九九逼| 日本高清一区二区在线| 啊啊啊免费| 婷婷15月天青娱乐| 色色色99| 久久久久亚洲熟妇熟女| 久久久一区二区| 国语人妻精彩刺激| 亚洲日韩美国人妻| 男人的天堂久久久| 综合97亚洲| 日本三级黄页| 51久久夜色精品国产麻豆| 舔人妻中文免费视频| 亚洲人精品久久久喷水| 乱伦av麻豆| 婷婷丁香激情| 中出人妻中文字幕91在线| 久久久久久中文字幕中文字幕最新| 国产亚洲日韩在线三区黑人| 人妻精品一区二区三区| 密臀AV在线| 色97| 粉嫩不卡一区二区性爱| 婷婷超| 亚洲情色无码一区二区三区| 91暧暧| 婷色五月| 国产精品久久久久中文字幕| 精品午夜福利| 久久中文字幕女同性恋一区| 九九九久千久久激情蜜桃在线看 | 色偷偷超碰亚洲| 欧洲射精91| 99热精品在线| 久久肏大逼| 中国一级操逼视频| 大香蕉一级黄色片久久| 欧美日韩不卡传媒| 久久熟女久| 日韩少妇丰满亚洲| 精品国产乱码久久久久久影片| 97国产高清视频在线观看| 日本黄色精品专区网站| 97在线免费观看| 91亚洲网站| 九九超碰综合网| 五月开心久久AV官网| 夜夜嗨AV蜜臀av| 日韩AV电影网站| 国内外色色色色色成人视频| 美国日韩黄色片| 国产女人极品高潮毛片| 欧美日韩啪啪电影| 亚洲欧美高清无码| 在线97视频| 我想要 啊 啊 啊| 国语精品av| 97日韩欧美亚洲| 91超碰丝袜制服| 国产吹潮女在线观看| 色拍偷亚洲| 日韩精品9区| 91精品国久久久久久无码| 啊啊啊啊在线观看网址| 色哟哟-国产专区| 国产性感在线观看| 97国伦国色| 99操| 天美传媒在线一区| oumeizonghese,www| 中文字幕久久精视频久久大全| 操b网站亚洲无码| 精品久久久久久久久久久久| 天天综和| 岛国人妻少妇av在线观看| 东北女人| 成人黄页| 97欧美色综合| 亚洲第一页综合在线| 欧美同性恋 的搜索结果 - 91n| 青青久久久| 精品人妻一区二区三区四区| 欧美色图欧美| 人妻久久一区二区三区 | 婷婷99狠狠| 国产乱码久久| 天天影视激情欧美| 夜夜爽爽夜夜精品视频| 亚洲色综网|