免费国产精品自在自线-91精品国产色综合久久久浪潮-99热久久免费频精品-国产精品国模在线观看-久久亚洲国产精品成人?V秋霞-久久国产一级A片免费播放-亚洲国产欧洲综合97久久-久久国产白嫩美女呻吟高潮

ARTICLE DETAIL

資訊詳情

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

狀態(tài)輪轉(zhuǎn)替代if-else:構(gòu)建Agent流程引擎及SSE流式輸出實(shí)戰(zhàn)

狀態(tài)輪轉(zhuǎn)替代if-else:構(gòu)建Agent流程引擎及SSE流式輸出實(shí)戰(zhàn) 好久沒寫工程向的分享了。前面一個(gè)項(xiàng)目里我負(fù)責(zé)做一個(gè)智能客服Agent一開始圖省事所有流程控制全用if-else堆如果意圖不明就追問如果知識(shí)庫沒命中就兜底如果LLM調(diào)用失敗就重試……兩周之后代碼已經(jīng)沒法看了加一個(gè)節(jié)點(diǎn)要?jiǎng)尤奶幍胤綔y(cè)試用例寫了一堆還是漏。后來我花了一個(gè)周末把流程控制層整個(gè)重寫成基于狀態(tài)輪轉(zhuǎn)的流程引擎——Java實(shí)現(xiàn)節(jié)點(diǎn)抽象狀態(tài)顯式定義流轉(zhuǎn)用路由表驅(qū)動(dòng)執(zhí)行過程用SSE流式輸出到前端。核心代碼大概不到300行if-else基本被消滅了。這篇文章就圍繞這個(gè)設(shè)計(jì)展開講講節(jié)點(diǎn)狀態(tài)輪轉(zhuǎn)和流式輸出到底怎么落地順便把踩過的坑一并整理出來適合正在做Agent開發(fā)、AI應(yīng)用編排、或者被業(yè)務(wù)分支邏輯折磨的Java工程師參考。1. 為什么Agent工作流不能靠if-else硬寫1.1 當(dāng)Agent流程開始復(fù)雜if-else的賬就算不清了Agent的工作流和普通后端接口最大的不同在于它的執(zhí)行路徑幾乎不受你控制。一個(gè)典型Agent要經(jīng)歷意圖識(shí)別、槽位補(bǔ)齊、知識(shí)庫檢索、工具調(diào)用、上下文記憶更新、答案生成這幾個(gè)階段而每個(gè)階段都可能產(chǎn)生分支意圖置信度低要追問信息不足要澄清檢索結(jié)果為空要走兜底工具執(zhí)行超時(shí)要重試。把這些分支全用if-else寫本質(zhì)上就是在用“順序代碼”去描述一張“有向圖”。問題在前端接口還能忍一旦節(jié)點(diǎn)數(shù)超過五個(gè)代碼就會(huì)變成這個(gè)樣子外層if判斷結(jié)果類型內(nèi)層if判斷狀態(tài)碼再內(nèi)層if判斷是否需要調(diào)用另一個(gè)方法。每新增一個(gè)節(jié)點(diǎn)你要找到所有上游節(jié)點(diǎn)的出口邏輯一處處補(bǔ)判斷。更難受的是調(diào)試——線上用戶觸發(fā)了某條冷門分支你根本不知道當(dāng)時(shí)走到了哪一步因?yàn)闆]有狀態(tài)記錄。我見過不少團(tuán)隊(duì)在Agent項(xiàng)目里維護(hù)一段超過500行的switch-case每加一個(gè)工具調(diào)用就往里塞一個(gè)case分支。這本質(zhì)上和if-else沒有區(qū)別只是換了個(gè)寫法。流程控制一旦退化成這種形式它就不再是“可編排”的了而是“寫死”的。1.2 狀態(tài)機(jī)思想從路牌到流程圖如果退一步看問題Agent的執(zhí)行過程本質(zhì)上就是一個(gè)狀態(tài)機(jī)每個(gè)節(jié)點(diǎn)是一個(gè)狀態(tài)節(jié)點(diǎn)的執(zhí)行結(jié)果決定下一個(gè)狀態(tài)節(jié)點(diǎn)在流轉(zhuǎn)中會(huì)產(chǎn)生輸出事件。用狀態(tài)機(jī)的思路去建模比用代碼堆邏輯要自然得多。我打個(gè)比方你開車去一個(gè)陌生的地方靠的不是在每個(gè)路口背誦“如果看到A就左轉(zhuǎn)看到B就右轉(zhuǎn)否則直行”這種if-else口訣而是一張路線圖每個(gè)路口告訴你當(dāng)前在哪個(gè)位置根據(jù)當(dāng)前位置決定下一段怎么走。狀態(tài)輪轉(zhuǎn)就是這張路線圖節(jié)點(diǎn)就是路口的指示牌執(zhí)行結(jié)果就是你要做的選擇。流程引擎的核心價(jià)值在這里體現(xiàn)出來了它把“業(yè)務(wù)邏輯”和“流程控制”徹底拆開。業(yè)務(wù)邏輯寫在節(jié)點(diǎn)內(nèi)部流程控制交給引擎的路由機(jī)制。以后哪怕要調(diào)整整個(gè)Agent的執(zhí)行順序你也不需要改業(yè)務(wù)代碼在路由表里重新編排節(jié)點(diǎn)ID就可以。2. 流程引擎的整體設(shè)計(jì)先抽象再實(shí)現(xiàn)2.1 核心抽象Node節(jié)點(diǎn)和Workflow工作流設(shè)計(jì)一個(gè)流程引擎最重要的不是先寫代碼而是定義好抽象。我這邊核心抽象只有兩個(gè)Node節(jié)點(diǎn)和Workflow工作流。Node是流程中的最小執(zhí)行單元。它負(fù)責(zé)做三件事聲明自己的ID、執(zhí)行具體的業(yè)務(wù)邏輯、明確執(zhí)行完成之后下一步去哪個(gè)節(jié)點(diǎn)。業(yè)務(wù)邏輯五花八門沒關(guān)系我把它統(tǒng)一收斂到一個(gè)抽象方法里返回執(zhí)行狀態(tài)。狀態(tài)決定了路由方向。Workflow則是節(jié)點(diǎn)的集合和入口配置。它知道整個(gè)流程從哪個(gè)節(jié)點(diǎn)開始手里有一張注冊(cè)表存著所有節(jié)點(diǎn)的ID到實(shí)例的映射。引擎執(zhí)行的時(shí)候只需要拿到入口節(jié)點(diǎn)ID然后不停查詢當(dāng)前節(jié)點(diǎn)、執(zhí)行當(dāng)前節(jié)點(diǎn)、根據(jù)返回狀態(tài)找下一個(gè)節(jié)點(diǎn)循環(huán)往復(fù)直到走到終止?fàn)顟B(tài)。這里有一個(gè)很重要的設(shè)計(jì)取舍節(jié)點(diǎn)之間互相不直接依賴。A節(jié)點(diǎn)執(zhí)行完后它不需要知道B節(jié)點(diǎn)是什么只需要在路由表里聲明“狀態(tài)SUCCESS時(shí)去node_detail_query這個(gè)ID”。這種解耦帶來的直接好處是節(jié)點(diǎn)可以獨(dú)立測(cè)試可以隨意替換也可以在不同工作流里復(fù)用。2.2 狀態(tài)輪轉(zhuǎn)如何替代if-else傳統(tǒng)寫法里控制權(quán)在“調(diào)用方”手里。一個(gè)方法調(diào)用另一個(gè)方法根據(jù)返回值決定下一步層層嵌套。狀態(tài)輪轉(zhuǎn)的設(shè)計(jì)里控制權(quán)被上交給“引擎”手里。每個(gè)節(jié)點(diǎn)執(zhí)行完成后會(huì)返回一個(gè)NodeStatus引擎拿到這個(gè)狀態(tài)去查當(dāng)前節(jié)點(diǎn)的路由表拿到目標(biāo)節(jié)點(diǎn)ID接著執(zhí)行下一個(gè)節(jié)點(diǎn)。也就是說分支邏輯從“代碼的調(diào)用關(guān)系”變成了“數(shù)據(jù)表里的映射關(guān)系”。if-else被徹底從代碼里剝離你看到的是清晰的路由表SUCCESS → 下一步做什么FAILED → 是重試還是走兜底NEED_INPUT → 是否要跳轉(zhuǎn)到追問節(jié)點(diǎn)有人會(huì)說這不就是把if-else搬了個(gè)位置嗎其實(shí)區(qū)別很大。if-else是硬編碼流程一旦寫錯(cuò)或者要調(diào)整必須改代碼重新發(fā)布路由表是結(jié)構(gòu)化數(shù)據(jù)可以配置化、可視化、動(dòng)態(tài)修改。而且對(duì)于流程引擎來說路由表天然適合做遍歷檢查——你可以啟動(dòng)時(shí)掃描所有節(jié)點(diǎn)的路由目標(biāo)檢測(cè)有沒有指向不存在的節(jié)點(diǎn)ID有沒有死循環(huán)。這些能力是普通if-else寫法根本給不了的。2.3 為什么不用Activiti、Flowable這些現(xiàn)成引擎肯定有人要問Java生態(tài)里不是有Activiti、Flowable、Camunda這些成熟的工作流引擎嗎為什么還要自己寫我自己評(píng)估過這些引擎強(qiáng)在“人參與審批”的場(chǎng)景任務(wù)分配、會(huì)簽、或簽、超時(shí)提醒。但Agent場(chǎng)景完全是另一回事節(jié)點(diǎn)執(zhí)行的是LLM推理調(diào)用、工具API調(diào)用、向量檢索不是人工填表審批。引入Activiti這種重型BPM框架光是把流程定義文件和數(shù)據(jù)模型接進(jìn)來就要花不少功夫再加上它們本身那套部署方式、歷史表結(jié)構(gòu)對(duì)一個(gè)小團(tuán)隊(duì)來說負(fù)擔(dān)很重。更關(guān)鍵的一點(diǎn)是流式輸出。Agent執(zhí)行過程需要實(shí)時(shí)把中間狀態(tài)推到前端——用戶能看著“正在理解意圖→正在檢索知識(shí)庫→正在生成回答”這是現(xiàn)代Agent應(yīng)用的基本體驗(yàn)要求。Activiti這類引擎的監(jiān)聽機(jī)制是為系統(tǒng)內(nèi)部事件設(shè)計(jì)的要接到SSE推送還得自己搭一層橋梁。與其繞一圈適配不如直接自己寫一個(gè)輕量引擎保留最核心的節(jié)點(diǎn)路由能力把事件推送機(jī)制做成一等公民。實(shí)測(cè)下來核心引擎不到300行后面所有業(yè)務(wù)節(jié)點(diǎn)都在復(fù)用這一套骨架。3. 核心實(shí)現(xiàn)節(jié)點(diǎn)狀態(tài)輪轉(zhuǎn)引擎代碼拆解3.1 狀態(tài)枚舉與節(jié)點(diǎn)抽象類先看最基本的定義狀態(tài)枚舉我一開始只設(shè)計(jì)了5個(gè)狀態(tài)后來加了TIMEOUT和TERMINATED別嫌多實(shí)際寫業(yè)務(wù)的時(shí)候你會(huì)發(fā)現(xiàn)每個(gè)狀態(tài)都有對(duì)應(yīng)場(chǎng)景。public enum NodeStatus { PENDING(待執(zhí)行), RUNNING(執(zhí)行中), SUCCESS(成功), FAILED(失敗), SKIPPED(跳過), TIMEOUT(超時(shí)), TERMINATED(終止); private final String desc; NodeStatus(String desc) { this.desc desc; } public String getDesc() { return desc; } }然后是節(jié)點(diǎn)的抽象基類。核心就兩個(gè)東西一個(gè)execute方法用于執(zhí)行業(yè)務(wù)并返回狀態(tài)一個(gè)路由表用于指明不同狀態(tài)分別去哪個(gè)節(jié)點(diǎn)。public abstract class BaseNodeT { private final String id; private final String name; private final MapNodeStatus, String routeTable new EnumMap(NodeStatus.class); public BaseNode(String id, String name) { this.id id; this.name name; } public String getId() { return id; } public String getName() { return name; } public abstract NodeStatus execute(NodeContextT context); protected void on(NodeStatus status, String targetNodeId) { routeTable.put(status, targetNodeId); } public String route(NodeStatus status) { return routeTable.get(status); } }設(shè)計(jì)要點(diǎn)在route方法執(zhí)行完一個(gè)節(jié)點(diǎn)引擎把返回狀態(tài)交給路由表查詢找到的就是下一站節(jié)點(diǎn)ID。如果某個(gè)狀態(tài)沒有配置路由說明這個(gè)狀態(tài)就是終態(tài)引擎會(huì)終止循環(huán)。這里我建議一個(gè)實(shí)際優(yōu)化在做驗(yàn)證時(shí)遍歷注冊(cè)表里的所有節(jié)點(diǎn)檢查每個(gè)節(jié)點(diǎn)的路由目標(biāo)是否存在于注冊(cè)表中。這個(gè)檢查我寫在啟動(dòng)階段一旦發(fā)現(xiàn)懸空引用直接報(bào)錯(cuò)比運(yùn)行時(shí)走到一半才發(fā)現(xiàn)要好得多。3.2 執(zhí)行上下文讓所有節(jié)點(diǎn)共享數(shù)據(jù)和狀態(tài)節(jié)點(diǎn)之間光靠參數(shù)傳遞是不夠的Agent執(zhí)行過程中會(huì)產(chǎn)生大量上下文數(shù)據(jù)比如用戶的原始問題、意圖識(shí)別的結(jié)果、知識(shí)庫檢索出來的片段、歷史對(duì)話記錄這些數(shù)據(jù)需要在不同節(jié)點(diǎn)之間流轉(zhuǎn)。為此我設(shè)計(jì)了一個(gè)NodeContextpublic class NodeContextT { private final String traceId; private final T payload; private final MapString, Object variables new ConcurrentHashMap(); private String currentNodeId; private NodeStatus currentNodeStatus; public NodeContext(String traceId, T payload) { this.traceId traceId; this.payload payload; } public void setVariable(String key, Object value) { variables.put(key, value); } SuppressWarnings(unchecked) public V V getVariable(String key) { return (V) variables.get(key); } public String getTraceId() { return traceId; } public T getPayload() { return payload; } public String getCurrentNodeId() { return currentNodeId; } public void markNode(String nodeId, NodeStatus status) { this.currentNodeId nodeId; this.currentNodeStatus status; } }traceId是每次Agent請(qǐng)求的唯一標(biāo)識(shí)貫穿整個(gè)執(zhí)行鏈路既用于日志追蹤也用于流式輸出時(shí)關(guān)聯(lián)事件。variables是節(jié)點(diǎn)間的數(shù)據(jù)交換層A節(jié)點(diǎn)把意圖識(shí)別的結(jié)果放進(jìn)去B節(jié)點(diǎn)直接取不需要方法簽名級(jí)別的耦合。實(shí)際項(xiàng)目中這個(gè)上下文還可以擴(kuò)展出上下文窗口管理、令牌消耗統(tǒng)計(jì)、重試次數(shù)記錄等能力。它本質(zhì)上是Agent的“工作記憶”記得在哪一步停過、拿過什么結(jié)果、下一步還缺什么信息。3.3 引擎主循環(huán)用路由表驅(qū)動(dòng)節(jié)點(diǎn)跳轉(zhuǎn)引擎是整個(gè)流程的中樞它負(fù)責(zé)調(diào)度節(jié)點(diǎn)、處理狀態(tài)輪轉(zhuǎn)、廣播事件。我把它設(shè)計(jì)成可復(fù)用的通用組件public class FlowEngineT { private final MapString, BaseNodeT registry new HashMap(); private final ExecutorService executorService; private final ListWorkflowListener listeners new CopyOnWriteArrayList(); public FlowEngine(ExecutorService executorService) { this.executorService executorService; } public void registerNode(BaseNodeT node) { registry.put(node.getId(), node); } public void addListener(WorkflowListener listener) { listeners.add(listener); } public void start(String entryNodeId, T payload, String traceId) { executorService.submit(() - execute(entryNodeId, payload, traceId)); } private void execute(String entryNodeId, T payload, String traceId) { NodeContextT context new NodeContext(traceId, payload); String currentNodeId entryNodeId; try { while (currentNodeId ! null) { BaseNodeT node registry.get(currentNodeId); if (node null) { throw new IllegalStateException(節(jié)點(diǎn)不存在: currentNodeId); } context.markNode(currentNodeId, NodeStatus.RUNNING); emitEvent(NodeEvent.started(context, System.currentTimeMillis())); NodeStatus status node.execute(context); context.markNode(currentNodeId, status); emitEvent(NodeEvent.finished(context, System.currentTimeMillis())); currentNodeId node.route(status); } emitEvent(NodeEvent.completed(context, System.currentTimeMillis())); } catch (Exception e) { context.setVariable(lastError, e.getMessage()); emitEvent(NodeEvent.failed(context, e, System.currentTimeMillis())); } } private void emitEvent(NodeEvent event) { for (WorkflowListener listener : listeners) { listener.onEvent(event); } } }主循環(huán)邏輯很簡潔根據(jù)當(dāng)前節(jié)點(diǎn)ID拿到節(jié)點(diǎn)實(shí)例執(zhí)行取狀態(tài)查路由得到下一個(gè)節(jié)點(diǎn)ID。沒有判斷流程邏輯的if-else所有分支都收斂在節(jié)點(diǎn)的路由表里。這里我想強(qiáng)調(diào)一個(gè)容易忽略的點(diǎn)開始執(zhí)行用的start方法是異步的把任務(wù)丟進(jìn)線程池立即返回。為什么因?yàn)楣ぷ髁饕浜狭魇捷敵鋈绻划惒交疕TTP響應(yīng)線程會(huì)被阻塞前端的SSE流根本沒機(jī)會(huì)實(shí)時(shí)收到事件。異步化之后整個(gè)執(zhí)行變成事件驅(qū)動(dòng)的推送模型。4. 流式輸出讓Agent執(zhí)行過程實(shí)時(shí)可見4.1 全量返回為什么會(huì)讓用戶焦慮Agent場(chǎng)景和普通接口最大的體驗(yàn)差異在于普通接口用戶等一兩秒拿到結(jié)果沒問題但Agent執(zhí)行一個(gè)復(fù)雜任務(wù)可能耗時(shí)幾十秒甚至幾分鐘——比如多輪工具調(diào)用再加長文本生成。如果用戶點(diǎn)完按鈕之后頁面一直轉(zhuǎn)圈沒有任何過程反饋體驗(yàn)是災(zāi)難性的。流式輸出解決的就是這個(gè)問題。它的本質(zhì)是把Agent執(zhí)行過程中產(chǎn)生的每一個(gè)階段性事件從服務(wù)端實(shí)時(shí)推送到客戶端。注意是事件流不只是最終答案。用戶能看到“正在判斷意圖”→“正在檢索知識(shí)庫”→“正在調(diào)用外部工具”→“正在生成回答”每一條狀態(tài)變化都實(shí)時(shí)渲染到頁面上。技術(shù)選型上我用了SSEServer-Sent Events而不是WebSocket。原因有兩點(diǎn)Agent執(zhí)行狀態(tài)是服務(wù)端到客戶端的單向數(shù)據(jù)流不需要客戶端頻繁上行消息SSE基于HTTP協(xié)議不需要額外的握手協(xié)議前端的EventSource對(duì)象可以直接消費(fèi)實(shí)現(xiàn)成本低得多。4.2 基于SseEmitter的事件推送實(shí)現(xiàn)Spring Boot生態(tài)里SseEmitter是原生的SSE支持用起來很直接。我把它和流程引擎的事件監(jiān)聽器接在一起執(zhí)行過程中每產(chǎn)生一個(gè)事件就通過emitter推送給前端RestController public class AgentController { private final FlowEngineAgentRequest flowEngine; private final ExecutorService executorService Executors.newCachedThreadPool(); public AgentController(FlowEngineAgentRequest flowEngine) { this.flowEngine flowEngine; } GetMapping(value /agent/run, produces MediaType.TEXT_EVENT_STREAM_VALUE) public SseEmitter run(RequestParam String question) { String traceId UUID.randomUUID().toString().substring(0, 8); SseEmitter emitter new SseEmitter(60_000L); WorkflowListener listener event - { try { MapString, Object data new HashMap(); data.put(traceId, event.getTraceId()); data.put(nodeId, event.getContext().getCurrentNodeId()); data.put(status, event.getContext().getCurrentNodeStatus().name()); data.put(type, event.getType().name()); if (event.getTargetNodeId() ! null) { data.put(next, event.getTargetNodeId()); } emitter.send(SseEmitter.event().name(agent-event).data(data)); } catch (IOException e) { emitter.completeWithError(e); } }; flowEngine.addListener(listener); emitter.onCompletion(() - flowEngine.removeListener(listener)); emitter.onTimeout(() - flowEngine.removeListener(listener)); flowEngine.start(ENTRY_NODE_ID, new AgentRequest(question), traceId); return emitter; } }這里有一個(gè)非常關(guān)鍵的設(shè)計(jì)SseEmitter推送給前端的不只是最終結(jié)果而是執(zhí)行過程中的每一次狀態(tài)輪轉(zhuǎn)。節(jié)點(diǎn)開始執(zhí)行推一個(gè)started事件節(jié)點(diǎn)結(jié)束推一個(gè)finished事件事件里帶上當(dāng)前節(jié)點(diǎn)ID和狀態(tài)。前端拿到這些事件之后就可以在頁面上逐個(gè)渲染狀態(tài)變化。用戶看到的是“流程在往前走”而不是一個(gè)死等loading。數(shù)據(jù)事件里還帶了next字段如果有這個(gè)字段說明流程還要繼續(xù)如果沒有說明這個(gè)節(jié)點(diǎn)是終態(tài)。4.3 線程池、事件監(jiān)聽器與斷連處理流式輸出本身不復(fù)雜復(fù)雜在工程細(xì)節(jié)。第一個(gè)細(xì)節(jié)是線程隔離。Agent工作流的執(zhí)行必須放在獨(dú)立的線程池里不能占著Tomcat的請(qǐng)求線程。如果直接在請(qǐng)求線程里跑工作流SseEmitter就永遠(yuǎn)來不及發(fā)送數(shù)據(jù)因?yàn)轫憫?yīng)還沒返回。我用了獨(dú)立的線程池請(qǐng)求線程只負(fù)責(zé)創(chuàng)建emitter和注冊(cè)監(jiān)聽器真正的工作流執(zhí)行在另一個(gè)線程里異步跑。第二個(gè)細(xì)節(jié)是監(jiān)聽器的生命周期管理。每個(gè)SSE連接對(duì)應(yīng)一個(gè)監(jiān)聽器實(shí)例連接關(guān)閉或者超時(shí)之后監(jiān)聽器必須從引擎里移除。否則emitter已經(jīng)關(guān)閉了工作流還繼續(xù)往里面send數(shù)據(jù)會(huì)拋IOException。我在onCompletion和onTimeout回調(diào)里都調(diào)用了removeListener確保連接斷開后不再有推送動(dòng)作。第三個(gè)細(xì)節(jié)是超時(shí)設(shè)置。SseEmitter的構(gòu)造參數(shù)是超時(shí)毫秒數(shù)我設(shè)置了60秒。如果Agent在這個(gè)時(shí)間內(nèi)還沒跑完連接會(huì)斷掉用戶需要重新發(fā)起請(qǐng)求。后續(xù)我改成了更合理的方案用定時(shí)器在超時(shí)前刷新一下連接或者把超時(shí)設(shè)成一個(gè)比較長的值配合心跳機(jī)制保持連接活性。對(duì)于生產(chǎn)環(huán)境建議單獨(dú)評(píng)估每個(gè)Agent流程的最大耗時(shí)再?zèng)Q定超時(shí)時(shí)長。5. 實(shí)操案例從0搭建一個(gè)智能客服Agent5.1 節(jié)點(diǎn)設(shè)計(jì)與路由編排理論講了一堆最終要落到一個(gè)能跑通的例子。我以智能客服Agent為例設(shè)計(jì)了5個(gè)業(yè)務(wù)節(jié)點(diǎn)intent_node意圖識(shí)別節(jié)點(diǎn)。調(diào)用LLM判斷用戶意圖返回四個(gè)狀態(tài)BUY想買產(chǎn)品、AFTER_SALE售后咨詢、OTHER閑聊、UNKNOWN無法識(shí)別。clarify_node追問節(jié)點(diǎn)。當(dāng)意圖識(shí)別返回UNKNOWN時(shí)追問用戶具體需求然后重新路由回意圖識(shí)別節(jié)點(diǎn)。knowledge_node知識(shí)庫檢索節(jié)點(diǎn)。根據(jù)意圖和用戶問題做向量檢索從知識(shí)庫中匹配相關(guān)內(nèi)容。如果檢索到的內(nèi)容相似度低于閾值返回FAILED。fallback_node兜底節(jié)點(diǎn)。知識(shí)庫檢索不到內(nèi)容時(shí)給出一個(gè)預(yù)設(shè)話術(shù)引導(dǎo)用戶轉(zhuǎn)接人工。answer_node答案生成節(jié)點(diǎn)。把檢索結(jié)果和歷史上下文拼進(jìn)Prompt調(diào)用LLM生成最終回答。節(jié)點(diǎn)定義好了路由表就是整個(gè)Agent的“劇本”。我專門用一個(gè)配置類把路由關(guān)系集中管理Configuration public class AgentWorkflowConfig { public static final String ENTRY_NODE intent_node; Bean public FlowEngineAgentRequest agentFlowEngine() { FlowEngineAgentRequest engine new FlowEngine(Executors.newFixedThreadPool(8)); BaseNodeAgentRequest intentNode new BaseNodeAgentRequest(intent_node, 意圖識(shí)別) { Override public NodeStatus execute(NodeContextAgentRequest context) { IntentResult intent llmService.recognizeIntent(context.getPayload().getQuestion()); context.setVariable(intent, intent); if (intent.confidence() 0.6) { return NodeStatus.NEED_INPUT; } return NodeStatus.SUCCESS; } }; intentNode.on(NodeStatus.SUCCESS, knowledge_node); intentNode.on(NodeStatus.NEED_INPUT, clarify_node); intentNode.on(NodeStatus.FAILED, fallback_node); BaseNodeAgentRequest clarifyNode new BaseNodeAgentRequest(clarify_node, 追問) { Override public NodeStatus execute(NodeContextAgentRequest context) { return confirmAnswer(context) ? NodeStatus.SUCCESS : NodeStatus.FAILED; } }; clarifyNode.on(NodeStatus.SUCCESS, intent_node); clarifyNode.on(NodeStatus.FAILED, fallback_node); // knowledge_node、fallback_node、answer_node 類似按流程編排 engine.registerNode(intentNode); engine.registerNode(clarifyNode); engine.registerNode(knowledgeNode); engine.registerNode(fallbackNode); engine.registerNode(answerNode); return engine; } }這個(gè)設(shè)計(jì)的好處你寫幾個(gè)節(jié)點(diǎn)就能體會(huì)出來。比如我想在答案生成之前加一個(gè)“敏感詞檢查”節(jié)點(diǎn)只需要新建一個(gè)節(jié)點(diǎn)類然后把a(bǔ)nswer_node的上游路由改一下其他節(jié)點(diǎn)的代碼一個(gè)字都不用動(dòng)。5.2 注冊(cè)節(jié)點(diǎn)并啟動(dòng)工作流節(jié)點(diǎn)配置完成后啟動(dòng)一次Agent工作流只需要一行代碼flowEngine.start(AgentWorkflowConfig.ENTRY_NODE, new AgentRequest(question), traceId);引擎會(huì)自動(dòng)從intent_node開始一路輪轉(zhuǎn)下去。每個(gè)節(jié)點(diǎn)的執(zhí)行結(jié)果都會(huì)觸發(fā)狀態(tài)事件這些事件經(jīng)過監(jiān)聽器、SseEmitter最終變成前端頁面上的實(shí)時(shí)狀態(tài)更新。我在實(shí)際部署中還加了一個(gè)內(nèi)容審核節(jié)點(diǎn)放在最后專門檢查LLM生成結(jié)果是否合規(guī)合規(guī)度低就重新生成一次最多重試兩次。這些控制都通過路由表表達(dá)answer_node的下一步根據(jù)審核結(jié)果分別指向結(jié)束節(jié)點(diǎn)或者重試節(jié)點(diǎn)。流程的復(fù)雜度上來了但代碼結(jié)構(gòu)一直是同一套。5.3 前端收到的事件流長什么樣配套的前端邏輯也很簡單。用瀏覽器原生的EventSource監(jiān)聽事件每次收到消息就更新頁面上的步驟狀態(tài)const eventSource new EventSource(/agent/run?question encodeURIComponent(question)); eventSource.addEventListener(agent-event, (event) { const data JSON.parse(event.data); renderNodeStatus(data.nodeId, data.status); if (data.next) { appendNode(data.next, 等待執(zhí)行); } });實(shí)際在瀏覽器里看到的執(zhí)行過程是這樣的init請(qǐng)求發(fā)出去后頁面先顯示“意圖識(shí)別·執(zhí)行中”1秒后變成“意圖識(shí)別·成功”同時(shí)追加“知識(shí)庫檢索·執(zhí)行中”檢索完成后變成“知識(shí)庫檢索·成功”追加“答案生成·執(zhí)行中”最后收到一個(gè)沒有next字段的事件流程結(jié)束。整個(gè)過程是連續(xù)滾動(dòng)的。這個(gè)體驗(yàn)比一個(gè)轉(zhuǎn)圈loading強(qiáng)太多了。用戶能清楚感知到Agent正在一步步處理問題而不是卡住了。6. 常見問題速查與踩坑記錄6.1 節(jié)點(diǎn)異常與失敗重試怎么處理第一版引擎設(shè)計(jì)里有個(gè)問題節(jié)點(diǎn)拋出異常就直接把整個(gè)工作流終止了。這在生產(chǎn)環(huán)境不行LLM調(diào)用經(jīng)常因?yàn)榫W(wǎng)絡(luò)抖動(dòng)或者Token限制失敗一次失敗就終止整條流程用戶體驗(yàn)很糟糕。我后來做了三層兜底。第一層節(jié)點(diǎn)內(nèi)部自己捕獲短期異常像LLM超時(shí)這種內(nèi)部重試一次再?zèng)Q定返回什么狀態(tài)。第二層路由表提供FAILED和TIMEOUT的流轉(zhuǎn)配置失敗時(shí)可以跳轉(zhuǎn)到專門的重試節(jié)點(diǎn)而不是直接終結(jié)。第三層引擎捕獲未處理異常后廣播failed事件前端收到事件后可以提示用戶重試同時(shí)記錄traceId供排查。注意一個(gè)比較容易踩的坑節(jié)點(diǎn)執(zhí)行失敗后上下文里可能已經(jīng)寫入了一部分臟數(shù)據(jù)。重試之前必須考慮這些數(shù)據(jù)的覆蓋問題。我一般建議變量寫入采用“覆蓋式”而不是“追加式”重試節(jié)點(diǎn)開始前把上一輪的中間變量清掉防止舊數(shù)據(jù)污染新結(jié)果。6.2 并發(fā)場(chǎng)景下的上下文隔離因?yàn)楣ぷ髁魇钱惒綀?zhí)行的同一個(gè)引擎實(shí)例會(huì)同時(shí)運(yùn)行多個(gè)Agent請(qǐng)求。這時(shí)候最怕的就是節(jié)點(diǎn)里不小心把數(shù)據(jù)寫進(jìn)了共享內(nèi)存。每個(gè)請(qǐng)求的NodeContext是按traceId隔離的節(jié)點(diǎn)操作variables里的變量時(shí)永遠(yuǎn)只操作自己上下文的數(shù)據(jù)這是最基本的原則。但還有一個(gè)隱性問題線程池里的線程被不同請(qǐng)求復(fù)用如果節(jié)點(diǎn)實(shí)現(xiàn)里用了ThreadLocal保存上下文一個(gè)請(qǐng)求結(jié)束后ThreadLocal沒有清理下一個(gè)請(qǐng)求復(fù)用這個(gè)線程時(shí)就會(huì)讀到上一個(gè)請(qǐng)求的殘留數(shù)據(jù)。我踩過這個(gè)坑排查了很久最后強(qiáng)制規(guī)定節(jié)點(diǎn)內(nèi)禁止使用ThreadLocal必須通過NodeContext傳遞數(shù)據(jù)。如果你的節(jié)點(diǎn)實(shí)在繞不開ThreadLocal請(qǐng)?jiān)趂inally塊里徹底remove。同時(shí)建議給線程池設(shè)置一個(gè)明確的拒絕策略。Agent并發(fā)上來之后線程池排滿任務(wù)新請(qǐng)求不能無限等待。我用的是AbortPolicy配合前端提示“當(dāng)前服務(wù)繁忙”比把請(qǐng)求都堆在內(nèi)存里等超時(shí)要好。6.3 我用這個(gè)方案后的一些體會(huì)最后說點(diǎn)個(gè)人的體會(huì)算不上結(jié)論更多是經(jīng)驗(yàn)。狀態(tài)輪轉(zhuǎn)這套東西最大的收益不是代碼變短了而是思考方式變了。以前設(shè)計(jì)Agent流程我腦子里是一段線性代碼的執(zhí)行順序現(xiàn)在設(shè)計(jì)Agent流程我腦子里就是一張有向圖——節(jié)點(diǎn)是圖的頂點(diǎn)路由是圖的邊所有流程控制都體現(xiàn)在路由關(guān)系上。這個(gè)轉(zhuǎn)變讓流程變得可以觀測(cè)。引擎里的每一個(gè)事件都記錄了節(jié)點(diǎn)ID、狀態(tài)、時(shí)間戳我可以輕松把這套事件流接到日志系統(tǒng)或者監(jiān)控面板上。用戶問“為什么我這個(gè)問題走了兜底”我查一下traceId對(duì)應(yīng)的事件流立刻就能復(fù)現(xiàn)完整路徑。這在if-else時(shí)代是做不到的。如果有朋友也想在項(xiàng)目里落地這套方案我的建議很簡單不要一開始就追求大而全先把節(jié)點(diǎn)抽象、路由表、異步事件這三樣做出來跑通一個(gè)最簡單的三節(jié)點(diǎn)流程然后逐步往里面加節(jié)點(diǎn)、加狀態(tài)、加監(jiān)聽器。等你真的把Agent流程跑起來再回頭看那些糾纏在一起的if-else大概率會(huì)和我一樣再也不想回去了。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
五月丁香婷婷中文| 久久激情五月天| 色一色综合| 五月丁香六月婷婷亚洲激情综合| 亚洲色色五月天| 大香蕉手机视频| 丁香五月停停av| 99久久网站| 午夜成人片400| 五月综合视频| 国产va视频| www.日韩艹| 99视频网址| 婷婷五月天久久久| 婷婷色色丁香五月天| 色999五月色| 97婷婷在线| 色欧美一级| 超碰免费人妻| 天天综合五月| 激情五月天网站| 开心五月婷婷在线| 五月情婷婷五月| 亚洲AV第二区国产精品| 69精品人妻不卡视频| 人人爱操| 噜噜在线| 欧美黑人巨大性生话| 97在线刺激| 五月情涩综合婷婷| 丁香欧美| 日本激情五月天‘| 成人五月天视频播放| 99er免费在线观看| 色噜噜狠狠色综合日日免费| 五月丁香激情五月天| 99久精品视频| 无码字幕中文| 91热在线观看视频| 丁香婷婷老司机久操| 亚洲精品V天堂中文字幕| 五月停亭六月,六月停亭的英语| 无码中文一区二区三区| 先锋男人99资源| 在线播放中文字幕| 玖玖资源站国产| 欧美色久| 国产在线中文字幕| 丁香五月天天哦| 国产熟女一区二区三区五月婷| 超级碰碰视频无码| 婷婷色中文| av一区免费看| 精品99在线观看| 激情综合网婷婷五夜| 丁香久久| 日日干综合| 丁香五月天导航| 91要啪| 九九久久免费视频44| 婷婷天堂伊人| 日韩伊人大香蕉| 久久艹网| 亚洲av成人在线| 色色丁香婷婷综合| 国产激情久久| 婷婷涩涩网| 停停色综合伊人| 玖玖色资源站| 久久少妇视频| 天天干夜夜想| 97夫妻超碰| 午夜69成人做爰视频| 丁香网站| 最新无码专区| 六月丁香色色| 婷婷五月欧美综合| 人人操五月天| 婷婷五月天成人网| 无码人妻一区二区一牛影视| 成年人夜夜喷水| 色爽九九| 丁香五月图片| 可以看的AV| 婷婷内射视频在线| 91久久久久久久久久18| 欧美天天搞| 亚洲欧洲国产精品| 国产亚洲99久久精品| 亚洲人人操| 色爆五月| 亚洲天堂啪啪| 亚洲狠狠操| 色五月婷婷九月| 国产99久久久| 五月天色软件| 秋霞免费三级片| 色婷婷在线综合色播网| 激情网婷婷五月天| 久久综合26p| 婷婷欧美激情综合| 五月开行婷婷色五月| 天天爱天天狠天天透| 操骚货在线| 天天爽天天干| 婷婷五月综合免费在线| 四月婷婷五月色综合| 99高级会所久久| 丁香婷婷色五月天| 草草视频91| 亚洲激情另类| 香蕉伊人综合| 五月天激情小说婷婷基地| 六月综和久久| 伊人碰碰碰| 亚洲精品V天堂中文字幕 | 91操操| 99热亚洲只有色| 婷婷久久亚洲| 看全色黄大色大片| 欧美碰碰碰| 五月天激情小说婷婷| 日日舔夜夜操| 国产毛片精品一区二区色欲黄A片| 精品99在线观看| 激情五月天无码| 色呦呦美女| www.韩日视频| 99久久综合精品五月天| 人与禽A片啪啪| www99在线观看视频| 日韩十国产极品久久| 很很干天天干| 香蕉久久国产AV一区二区| 婷婷色基地| 激情五月综合免费| 777色色色| 99热亚洲精品| 99精品一二三四视频| 丁香九月色| 午夜 外网 精品 在线| 五月丁香色色网| 丁香六月激情国产| 怡红院一二三| 另类丁香综合| 激情五月丁香亭亭| 激情丁香五月| 久久久久久久久人妻| 人妻丰满精品一区二区A片| 99精品热视频| 丁香色五月天| 色狠狠五月天| 丁香五月色| 9九热视频| 性欧美日本| 精品导航在线x不卡| 丁香五月av在线| 亚洲日韩乱码一区二区三区四区| 婷婷五月天性| 久久ri精品视频| 性生活久久朋友人妻| 欧美丰满熟妇BBB久久久| 久久丁香婷婷五月天| 欧美色图天堂网| 国产免费一区二区三州老师F1F1| 在线成人网站| 3pAV| 美女妹子后射视频网站在线观看| 亚洲成人日韩无码精品| 欧美Va日本Va| 丁香五月天黄色片| 99re久久| 丁香五月婷婷成人网| 久久AAAA片一区二区| 色在线五月天免费| 任你弄在线视频免费| 久久婷婷婷婷伊人| 骚五月婷婷| 99爽视频| 翔田千里aV中文字幕| 99国产精品白浆在线观看免费| 婷婷激情五月天7| 五月丁香综合| 激情六月婷| 91日在线视频| 九九视屏| 色婷婷五月基地在线| 国产亚洲精品AAAA片APP| 婷婷六月婷婷| 欧美婷婷精品激| 丁香激情五月| 五月丁香婷婷激情在线视频| 五月婷婷先锋| a在线观看| 人人色婷婷五月天| 大香蕉丁香| 亚洲啪啪网| 女性自慰系列第五页| 亚洲操逼网| 99成人无码| 97久久超级| 久久在线大香蕉| 色婷婷久久综合| 日本天天操| 丁香五月,激情五月,深爱五月| 91一道本| 婷婷五月花| 国产精品成人av在线观看春天| 9久热在线精品| 99乱视频| 欧美激情凹凸丁香网| 4438成人电影| 欧美久久一级内射wwwwww.| 91九色成人原创视频| 五月婷婷激情综合av| 9999久久久久| 99色免费| 五月桃花网综合| 久久久99免费视频| 99色爱| 亚洲色夜| 精品综合网在线| 色婷婷六月天| 色小说五月天| 五月天婷婷色紫薇阁| 香蕉99网| 午夜天堂一区人妻| 人妻中文在线| 色五月丁香婷婷在线观看| 91超级碰碰碰| 丁香五月婷婷天堂大香蕉| 婷婷丁香五月天激情| 丁香婷婷十月| 色婷婷丁香五月高清在线| 亚洲影院婷婷色| 色情婷婷| 丁香五月情| 99精品在| 丁香五月婷婷无码AV| 伊人大香久久| 大香蕉五月婷婷丁香| 五月丁香六月色| 777精品成人a v久久| 偷拍91九色| 欧美电影在线观看| 国产激情视频在线观看| 久久九九网| 婷婷五月天综合中文| 99视频久久| 五月天婷婷激情四射综合| 久久女婷| www.99热| 婷婷午夜天| 丁香六月久久| 久色资源| 婷婷五月天高清无码| 天天干天天日天天插| 97久久人人| 99国产欧美视频| 亚洲精品V天堂中文字幕| 91视频精品99| 亚洲黄色精品| 久久9视频欧美| 亚洲色无码| 色综合五月在线| 99在线精品观看99| 婷婷激情五月天天天开心| 99热在线播放精品| 九月婷婷在线视频| 五月婷婷丁香色播网| 婷婷五月天激情四射五月天激情| 噜噜噜狠狠色综合| 亚洲VA欧美VA| 久久人妻爱爱| 日日干综合| 99热这里只有99| 婷婷的久久网站| 婷婷五月激情的图片| 91精品久| www.刺激色网站www.| www.夜夜爱.com| 又大又粗九一在线| 高清a片基地| av在线婷婷| 日本色色色色色色色色一色二色| 五月婷婷六月激情| 亚洲啪啪自拍| 欧美丁香五月| 久久色情| 久一这里有精品国产| 五月激情婷婷图片基地| 色婷婷六月综合| 亚洲婷婷月丁香五月| 婷婷五月天激情四射五月天激情| 五月人人丁香婷婷五月人人丁香| 丁香五月婷婷精品视频| 99热这里只有精品在线播放| 天天操天天插| 六月丁香啪啪| 亚洲乱码日产精品BD| 99热只有| 日韩欧美不卡| 天堂在线婷婷| 黄色三级日本| 婷婷色香六月综合激情| 五月丁香龟婷婷| 伍月婷婷六月丁香| 日本九九视频| 婷婷丁香六月| 五月天婷婷Av| 亚洲欧洲国产精品| www.夜夜夜| 亚洲婷婷丁香五月视频| 五月婷婷激情五月| 久久伊人五月天| 九九在线免费观看| 色色色免费视频| 九九这里有精品| 丁香五月综合激情啪啪| 五月婷婷在线视频| 香蕉曰比| 99精品久久久| 丁香五月天av| 97人人操| 中文字幕成人网站| 久婷婷色| 五月激情综合五月| 丁香五月影视| 久久久婷婷五月天| 久久网日本| 玖玖在线资源视频| 色爱综合网| 婷婷五月婷婷| 一级性爱大片| 欧洲精品欧洲情| 深爱婷婷丁香五月激情| 26UUU精品一区二区| 亚洲精品无AMM毛片| 欧美婷婷丁香五月| 99热99思午夜精品| 亚洲激情综合| 成人丁香婷婷| 噜噜色天天开心| 婷婷五月综合视频| 亚洲中文字幕网| 综合久久8| 激情综合无码| 丁香五月播播| 在线播放人妻| 婷婷她六月天| 激情综合五月天| 亚洲操操操| 39视频第二区| 亭亭五月激情亚洲在线| 激情www| 91丁香色五月| 激情综合激情五月| 狠狠干五月天| 五月婷婷丁香大陆免费| 天堂草在线看www| 九九热视频在线观看| 激情婷| 色五月亚洲五月天| 五月天婷婷丁香| 无码一级片| 五月天久久色| 婷婷色播色五月五色五月天色妇| 色色色五月婷| 在线日本www| 人妻爽爽爽久久久久久久久| 亚洲成人av在线| 99天堂在线观看免费视频| www.婷婷| 亚洲五月天婷婷| 九九无毛| 丁香五月婷在线| 五月激情六月丁香| av中文在线| 色综合五月| 久久久亚洲成人无码A片| 99热最新地址在线| 狠狠操狠狠爱| 一逼色综合| 天天爽天天| 97sese婷婷| 亚洲色欲AAAAAA| 激情99| 亚洲最大在线| 激情久久综合| 五月丁香婷婷综合网| 天天插天天插天天插天天插| 十二区无码| 人人添人人| 五月婷激情| 久久久99视频| 日本九九九九| 色五月婷婷久久| 成人网在线视频| 精品国产a| 婷婷涩五月天综合| 激情网 久久| 六月色五月天天婷婷| 99精品在线播放| 丁香五月激情综合| 播播网色播播| 国产精品五月丁香| 国产性爱在线| 色婷婷五月天天天干天天操天天爽| 婷婷丁香六月天| 久久机热这里只有精品免费视频| 五月激情影院| 色情丁香五月天| 国产精产国品一二三在观看| 婷婷六月丁香1| 精品国产AV色一区二区深夜久久| 我要色综合五月婷婷| 丁香五月狠狠综合欧美| 青青草免费公开视频| 激情五月婷婷色综合| 青青久在线视频免费观看| 欧美综合激情五月丁香| 热久综合| 五月丁香六月婷婷姐| 丁香五月大香蕉AV| 在线视频你懂得| 依人大香蕉| 九九久久99| WWW丁香五月| 欧美顶级少妇做爰HD| 操嫩逼电影| 丁香五月 性爱| 色噜噜狠狠色综合日日| AV在线观看网站| www.五月天婷婷| 99精品这里只有免费视频| 日本天天色| 色 五月婷婷基地| 丁香婷婷浪潮AV久久综合| 婷婷五月另类网站| 亚州色婷婷| 五月天婷婷色| 激情五月天婷婷丁香 | 丁香婷婷五月综合影院| 99狠狠操一| 99综合| 色欲日日躁| 青青操日本摸摸看看| 久久五月婷婷丁香| www.国产亚洲69ty.久久久久久久久久久久| 五月天婷婷小说| 丁香五月在线视频黑人| 91色在线| 九九9久九9国产视频| 亚洲精品国产精品乱码视99| 婷婷放心五日爱| 亚洲激情精品| www.91久久| 免费超碰在线观看| 亚洲成人高清在线| 婷婷五月丁香色情| 大香蕉啪啪| 电影91久久久| 色婷婷香蕉| 99色啊| 色婷亚洲五月丁香| 无码激情AAAAA片-区区| 亚洲精品视频电影| 久久久久99精品成人片| 影音先锋一区| 1级欧美日韩| AV在线大香蕉| 色五月在线视频观看| 男女99免费视频| 亚洲日本三级片| 第四色激情网| 26uuu亚洲| 久草久青福利| 中文字幕综合| www.激情五月天.com| 狠狠色综合网站久久久久| 丁香激情婷婷网| 99在线精品观看99| 激情久久网 | 久九男女天堂| www.五月天婷婷| 综合网视频| 日本在线免费中文com.| 日本片日本片祼观看网站在线看中文版网页在线看 | 丁香五月欧美| 91婷婷搞| 热久精品| 999热在线视频| 二人电影免费版在线观看| 91九色精品女同系列| 日韩av干| 日韩五月天婷婷| 色婷丁香| www.sebowuyue| 色天使色综合| 色五月情| 丁香婷婷综合激情五月色| 99热亚洲| 九九自拍网| 色婷婷丁香五月在线观看| 五月永久激情| 天天噜天天爱| 色亚洲中文| 99精品在线| 欧美超级视频97| 激情婷婷99| 伊人热在线大香蕉| 国产伦亲子伦亲子视频观看| 国产精品99久久久久久久女警| 久操热| 99热精品在线| 九九无码| 天天搞天天色综合| 欧美日韩成人高清在线| 五月天激情国产综合婷婷婷| 丁香五月天之婷婷影院| 色婷婷狠狠| 色色色.COM| 开心五月激情婷婷| 思思热AV| 99热这| 丁香六月久| 五月丁香做爱视频| 色综合激情| 情婷婷五月天| 婷婷狠狠干| 五月天婷婷影院影院观看| 天天干天天玩天天夜天天射天天操天天日蜜臀少妇 | 《蜘蛛女》梁铮1995| 婷婷亚洲在线| 精品五月天| 激情5月婷婷| 午夜五月天| 这里只有精品网| 丁香五月婷婷激情中文| 婷婷五月天中文字幕| 九九婷婷网五月天| 综合激情在线视频| 久久婷婷五月| 北京熟妇搡BBBB搡BBBB| 《亚洲操B久久免费在线观看,亚洲操B久久在线播放》在线播放 - 高清资源 - 97 | 小骚穴电影| 97香蕉久久超级碰碰高清版| 91操片| 99五月丁香丁| 欧洲激情五月天| www,婷婷五月天,com| 丁香五月开心五月激情| 五月激情在线| www婷婷| 色135综合网| 五月天丁香婷婷视频网址 | 激情五月天小说网| 中文字幕日本最新乱码视频| 草久私拍| 九九99免费视频| www.av视频xx999.com| WWW.桔色成人.COM入口| 亚洲AV色婷婷人禽五月天| 国产欧洲欧洲精品久久| 丁香五月激情啪啪| 天天夜夜六月丁香五月婷婷老师| 久久综合五月天| 亚洲超碰在线| 春色激情| 另类专区在线| 五月丁香色狠狠干大屄| 一本色道久久综合狠狠躁小说| 91热在线| 日本无码专区| 人人九色| 色高清无码视频| 久久这里有精品| 99热综合网| 91re色综合视频| 国产激情在线| 中文字幕簧片| 超碰日日操| 欧美性爱五月天| 99re久热| 涩综合在线| 丁香六月婷婷综合欧美| 成人在线视频网| 国产黄色大片| 日本的α片xxxwww| 亚洲综合色网| 国产高清av黄色看片| 91人碰| 一个色的综合| 日韩成人无码人妻| 婷婷激情五月天激情小说| 日本久久网| 日日操夜夜骑| 欧美三级巜人妻互换| 色丁香五月| www.minyis.com【JT】国内CDN落地页保证转化QQ2101460746 | 天天天天天天操| 中字幕视频在线永久在线观看免费| 91久草五月天婷婷| va中文资源在线观看| 色婷六月| 五月丁香亚州综合网| 亭亭丁香aV| 五月激情婷婷国产精品久久久久久| 欧美肉大捧一进一出免费视频| 久久婷婷人人| 精品A√| 精品人妻伦九区久久AAA片| 九月婷婷激情| 狼友超碰| 狠狠干天天日| 白度黄视频| 婷婷五月天无码视频| 久久在这里99| 国产资源在线视频| 九九色综合九九色| 思思干精品| 五月婷婷狠天天色综合| 人人操AV| 九九成人精品免费视频| 99久久婷| 九热免费视频| 日本3级片一区2区| 91九色无码内射| 久久丁香五月婷婷| 久久caop| www.伊人天堂偷偷婷婷| 亚洲免费看片| 欧美噜噜免费观看| 狠狠操狠狠爱| 五月婷婷丁香| 欧美日韩一区二区三区四区| 久久综合综合久久| 97人人操人人| 操操人人| 激情婷婷色色| 97人人超| 人人干av| 五月激情丁香六月狠狠干| 五月亭亭六月天| 婷婷视频网| 日韩欧美一级大黄网站| 97碰啪啪| 久久婷婷五月| 热久久77777| 丁香九月激情| 性小说五月天| 黄急一级视频| 婷婷 月 丁香| 综合婷| 婷婷色正月| 依人大香蕉在钱1| 婷婷爱五月天人人爱| 美女久久婷婷| 中国激情网| 亚洲人操亚洲人| 5月色亭亭视频| 成人视频网| 精品婷婷五月天| 最近中文字幕在线中文视频| 婷婷五月天成人动漫 | 超碰人人妻| 丁香五月婷婷在线观看| 久久sp免费视频| 思思热AV| 日本久草福利| 99ri在线| 激情婷婷内射| 丁香花社区av| 情久久综合五月天| 久天综合| www.婷婷| 99热这里只有精品3| 五月色综合| 狠狠干狠狠干| 噜噜噜精品欧美成人在线观看| 色狠狠婷婷| www.99热视频| 97色在线视频| 中文字幕按摩做爰| 丁香五月开心婷婷| 国产精品A片在线| WWW.婷婷五月天.COM| 色婷婷久久久| 国产成人精品一区二三区熟女在线| 久热这里精品免费| 亚洲精品成人片在线播| 九九热av| 黄页大全十八禁| 亚洲人人艹| 亚洲综合99| 婷婷五月成人有| 丁香五月婷婷av影院| 综合婷婷五月天| 色色色99| 亚洲av电影网站| 99在线免费视频| 3pAV| 五月天婷婷丁香人人操91| 91干| site:publishdd.com| 色色色五月婷| 成人精品视频99在线观看免费| 五月天停停成人网| 五月丁香六月婷综合成人综合 | 久操无码| 99久久婷婷国产综合精品| 思思99热| 五月丁香综合伦理片| 草草影院爱爱| 无码人妻少妇色欲AV一区二区| 五月婷婷69| 丁香五月天天哦| 婷婷第一页| 色99在线| 91人人网| 人妻肉射免费观看| 激情综合五月丁香| 欧美三级韩国三级日本三斤| 婷婷综合视频| 日本色五月| 四色 爱 婷婷 精品 亚洲 五月天| 亚洲五月天激情| 久久98| 99热黄| 天天射影院| 亚洲va综合va国产va中文| 丁香五月综合激情久久潮喷| 秋霞日本免费毛片A片| 丰满少妇猛烈A片免费看观看| 亚洲综合五月天| 五月天婷婷六月| 91九色国产| 99久久婷婷综合| 国产精自产拍久久久久久蜜| 大香蕉久久久| 亚洲va欧美va天堂v国产综合| 婷婷基地成人五月天| 九洲一级A片| 玖玖九九超碰| 五月婷婷色色色| 另类激情首页| 五月天黄色激情小说| 婷婷激情五月天7| 99精品久久久久| 9久操| 最近免费中文字幕大全高清大全1| 午夜成人AV在线| 六月丁香社区| 俺去也在线官网| 97亚洲色 torrent magnet| 丁香激情四射| 午夜成人在线免费视频| 丁香花五月天社区| 免费91久久精品| 一级AV片| 精国产品一区二区三区A片| 久久久久人妻网址| 99久.| 婷婷丁香亚洲色综合91| 天天日夜夜拍| 五月天激情无码| 国产日日操夜夜操的肉棒视频| 男人天堂亚洲综合| 亭亭五月丁香综合欧美| 91九色精品女同系列| 激情丁香久久久久久| 亚州第一A片| 伊人99久久| 久久精品熟女亚洲AV麻豆| 九九热免费视频| 婷婷色五月天在线观看| 丁香婷婷九月| 色欲天天综合| 久久激情五月婷婷| 亚洲99热| 久久亚洲无码| 久久六月综合| 五月婷婷六月丁香玖玖玫瑰91| 日本色色网站| 婷婷少妇激情| 婷婷精品| 天堂AV三级| 在线VA视频| 五月婷婷视频啪啪美女| 天天天添天天操| 六月丁香五月激情网| 五月婷婷无码专区| 99热在线观看亚洲区| 99爱在线观看视频| 日本色视| 亚洲在线操| 91蜜桃婷婷狠狠久久综合9色| 天天综合色| 色婷婷九月| 国产黄大片在线观看画质优化| 欧美经典片免费观看大全| 精品一二三区久久AAA片| 国产又黄又爽又色的免费| 9色婷婷| 久久久日韩特色特黄AAAA| 九色在线观看91av| 伊人久久婷| 人妻乱码久久久| 天天射综合网天天插| 五月婷婷激情视频| 大香蕉久久婷婷精品综合| 午夜电影网VA内射| 精品人妻伦| 99热成人在线| 射久久丁香五月| 欧美日韩一区二区三区四区| 亚洲日韩一页精品发布| 中文超碰视在线| 久久天堂加勒比| 婷婷五月四狠狠| 六月婷婷七月丁香| 99综合网| www久| 五月丁香婷婷激情图片| 2017人人操| 久久这里在精品视频| 开心五月婷婷99| 综合性爱网| 91Chinese在线| 五月丁香婷婷激情图片| 久热中文字幕| 日日操夜夜爽天天天| 五月婷精品| 人妻22p| 三十熟女| 天天综合五月| 日逼免费视频 | 在线观看亚洲视频影院| 免费无码毛片一区二区A片| 日比视频91| 激情五月丁香五月| 五月天色婷婷伊人网| 九九综合精品| 色五月丁香com| 亚洲免费99| 狠狠色丁婷婷日日,伊人激情综合网| 综合久久综合五月天婷婷| 99久久婷婷国产综合| 婷婷五月天干干| 人妻操操色| 99久久九九| 天堂网操| 五月六月激情婷婷| 狠狠干狠狠干| www.色色色com| 丁香五月天无码AV| 婷婷五月丁香综合激情| 成人无码精品1区2区3区免费看| 亚洲熟女乱色综合亚洲网站| 婷婷色系婷色| 99色干| 亚洲成人av在线观看| 五月婷六月综合在线观看| 99爱视频在线观看| 婷婷五月天VI| oumeisesewang| 五月丁香婷婷色色| 热婷婷av| 色色色.com| 人人草人人舔| 丁香五月婷婷亚洲综合精品| 久久免费视频62| 亚洲色五月| 日韩999| 色屌丝中文字幕| 五月四色激情| 天天做天天爰天天爽天天无遮挡| 久久与婷婷| 国产性爱色| 五月激情婷婷播播网| 丁香五月社区| 五月婷在线观看| 日韩啊啊啊| 天天日P天天射P| 少妇丁香婷婷 | 97色色色色| 99热9999| 超碰人人99| 丁香婷婷色五月| 中文字幕日产A片在线看| 狠狠搞五月天| 亚洲熟女色| 无码yw| 五月丁香婷婷成人网| 激情婷婷五月社区| 99.色| 思思久久99热只有频精品66| 六月99天天婷婷激情综合| 五月丁香啪综合| 九九综合网色全集 | 日日狠夜夜狠| 久久9热好| 熟女乱论网| 99这里有精品视频| 97人人射| 九九亚洲视频| 午夜免费试看| 五月婷婷啪啪啪| WWW99热| 玖玖婷婷色五月| 伊人9在线| 一丁香五月天月AV| 99热天堂| 色噜噜狠狠色综无码久久合欧美| 婷婷五月精品中文字幕| 热99精品视频五月| 9l视频自拍9l九色9l成人| 手机旧版看人妻1025| 久碰综合| 丁香婷婷六月天| 激情丁香六月| 亚洲色99| 免费99情趣网视频| 99热这里只有精| 色婷婷五月婷婷五月婷婷五月| 国产人妻人伦精品一区二区| 五月婷婷激情色情网| 97碰碰碰免费公开在线视频| 三级大香蕉网| 男同91 | 另类五月激情| www.国产色| 成人网在线视频| 日韩人妻在线观看| 久久五月婷婷电影| 亚洲操操| 久久综合天天综合| 中文AV网站| 五月天婷婷丁香导航| 九九碰九九爱97超| 精品人妻一区二区| 草婷婷在线| 99精品丰满| 99热99精品| 丁香五月,开心五月,成人婷婷| 亚洲乱码日产精品BD在线观看| 只有久久精品免费| 久久婷婷色综合老司机| 久99久在线观看| 婷婷激情四射| 亚洲婷婷性爱| 亚洲综合五月天婷婷| 五月丁香婷婷综合久久| 五月婷婷激情网| 婷婷五月天另类网站| 激情图片99| AV操操操| 99热这里只有精品一区| 另类精品视频在线观看| 六月婷婷综合| 99视频这里只有久久精品 | 亚洲精品白浆高清久久久久久| 色五月婷婷内射| 大香蕉伊人爱在线| 丁香五月av| 黄色笑话深爱激情网丁香五月婷婷啪啪啪啪啪| 日本3级片一区2区| 午夜少妇在线观看视频| 亚洲色情网站| 级情九色| 五月丁香综合色婷婷| 97婷婷狠狠| 99在线69| 射满了还射免费在线观看 -午夜版全集-新视觉影院 | 天天日天天日天天搞| 五月色丁香| 嫩草AV久久伊人妇女超级A| 另类综合色| 色婷婷成人影片| 久草九九| 日本精品人妻无码77777| 色欧洲| 日本狠狠爽| 色天使色婷婷| 无遮挡国产高潮视频免费观看| 99热97| 99在线观看视频精品| www.综合久久| 9色91视频| 国産精品| 婷婷丁香激情综合色情| 日本三级中国三级99人妇网站| 日本在线观看aaa 99| 激情五月天网站| 色色网站| 人妻五月天激情开心网| 久9久成人精品视频| 麻豆AV一区二区三区| 欧日韩成人| 色天天综合成人网| 99热九九这里只有精品| 婷婷激情综合色五月久久91| 一起草av| 成人在线视频网| 日日舔夜夜操| 五月天婷婷自拍图片在线观看| 操碰久| 校园春色亚洲色| 99国产精品白浆在线观看免费| 99热| 伊人久久五月天综合| 26UUU| www.91.com黄| 国产色视频网站2| 中文字幕无码AV| 天天爱天天爽| 色婷婷大香蕉| 可以免费看的AV网站| 五月四色色| 久久天天天| 91丨九色丨熟女| 麻豆精品| 精品热九九| AA片在线观看视频在线播放| 精品激情| 91婷婷色五月| 欧美丁香五月| 色五月婷婷五月丁香五月| 久久婷婷五月综合激情国产| 婷婷五月天在线看| 射区导航| 大香蕉操操| 久久九九囯产| 五月天婷婷激情四射综合| 五月丁香色停停啪啪啪| 91蜜桃婷婷狠狠久久综合9色| 五月叮香啪| 婷婷久久亚洲| 99狠狠| 女人被男人吃奶到高潮| 五月婷婷免费看| 婷婷丁香五月高清| 激情婷婷五月天日本系列| 天天插夜夜爽| 狠狠色狠狠鲁| 久久婷婷五月天激情| 五月丁香啪啪拍| 婷婷丁香五月天在线视频| 综合色久| 亚洲精品色色| 狠狠色噜噜狠狠色噜噜噜999| 久久九九网| 天天爽在线视频| 成人精品一区二区三区四区五区| 日韩另类| 丁香六月开心| 另类激情五月天。| 丁香五月婷婷五月天在线| Se.婷婷五月天| 激情五月天黄色小说| 色五月开心婷婷| 99在线视频免费| 男人天堂亚洲综合| 五月丁香激情综合六月涩涩爱| 婷婷丁香人妻| 狠狠操在线视频| 手机免费福利视频| 99亚州综合精品成人网| 另类小说五月天| 亚洲成人网在线观看| 日良久久| 色狠狠色| 激情五月天天| 九九色video| 色综合色色色色| 激情综合九月| www久久久| 亚洲综合网激情五月天| 丁香色情五月综合网站| 欧美激情综合色综合| 婷婷色六月| 色私五月婷婷| 亚洲人妻av| 成人做爰A片免费看视频| 久久9视频| 久久久aaa| 九九精品亚洲| 丁香五月欧美成人| 激情黄色五月天| 日本色狠狠| 在线成人网址| 天堂无码人妻精品AV一区| 九九色插| 丁香五月开心亚洲| 色婷婷婷av| 色婷婷先锋| 激情综合网五月激情网| www色色com| 日本黄色一级| 丁香婷婷午夜| 婷婷五月天最新综合你懂的| 狠狠狠激情网| 人。妻久久| 人人操五月天| 伊综合蕉| 亚洲成人高清在线| 色婷五月天亚洲| 2025天天日爽| 亚洲这里只有精品| 97碰碰免费.视频| 日本一道久久| 色高清无码视频| 人人干99| 又大又粗九一在线| 国产综合81p| 一本久久亚洲五月婷婷| 丁香五月天狠狠| 99这里有精品视频| 婷婷五月色花丁香社区| 五月丁香爱婷婷深深| 99热这里只有精品 搜| 在线成人网站| 国产乱轮一区二区三区| 91婷婷色五月| 久久久久久丁香五月| 99热这里只有精品3| 婷婷综合九色伊人| 超碰久热| 久久99性爱| 丁香六月婷婷| 婷婷五月天AV在| 六月伊人婷婷| 超碰93在线观看| 蜜乳av一级av| 六月色色| 五月婷婷丁香综合| 婷婷色播婷婷| 五夜丁香| 婷婷五月天日日日干干干| 欧洲不卡视频| 国产高清视频91九九九久久久| 在线观看的av| 丁香五月婷婷色| www五月| www.婷婷六月天| 99热无码| 中文字幕日产A片在线看| 99精品久久久| 六月丁香久久| 玩熟女五十AV一二三区| 最新日本A片| 99色 | 影音先锋人妻出差| 99热综合色图| 激情电影五月婷婷| 丁香五月第九色| 色五月AV| 亚洲99在线| 五月天激情网开心网| 国产又爽又猛又粗的视频A片| 成人五月天丁香婷| 天天操天天曰| 五月做爱| 天天舔天天摸天天射| av中文在线| 婷婷月综合| 激情五月天www| 国产黄大片在线观看画质优化| 只有精品视频在线观看| 国产91视频| 99内射视频| 橾逼网| www.九九婷婷| 天天cha成人综合网| 激情第四色| 婷婷色五月噜噜| 无套内射极品大美女| 激情五月综合网丁| 99er在线观看| 成人午夜视频精品一区| 丁香九月综合| 婷婷五月天AV| 五月天激情小说| 综合AV在线| 色婷婷免费观看| 狠狠色噜噜狠狠狠狠综合| 久婷久婷| 久久视频婷婷| 色九亚洲| 超碰9| 99热亚洲精品| 99色中文| 97资源碰碰| 亚洲综合色色色| 狠狠久久婷五月| 91九色精品女同系列| 激情综合色网| 97精品综合久久| 级情九色| 五月综合视频| 丁香五月日啪| 99视频| www.五月天。com| 伊人高清无码| 婷婷五月综合在线视频| 欧美情色一区| 五月好婷婷| www.激情com| 五月激情影院| 久久五月激情| 丁香五月中文字幕| 冬月かえでAV无码播放| 五月天婷婷无码视频| 自拍视频在线观看9| 久久午夜理论| 婷婷字幕在线| 婷婷五月六月| 色色五月婷婷久久| 色综合久久88色综合天天99| 婷婷色网站| 六月婷婷激情| 国精产品一区二区三区| 性爱技巧五月| 人人爱人人草| 五月天社区| 99热这里都是精品| 五月婷婷自拍视频| 91久久电影| 亚洲av骚货| 五月天激情在线视频| 九九热视频精品999| 人人干av| 99热这里是精品| www.夜夜操| 欧美婷婷色五月| 婷婷综合网性| 免费视频无码| 久久婷婷五月综合色播| 《丁香激情综合久久伊人久久》影视在线观看 -高清预告手机免费播放 -三妹影院 | 91丨人妻丨国产丨丝袜| 少妇人妻人伦A片| 狠狠做五月| 丁香五月婷婷国产av| 丁香婷婷色五月激情综合| 天天噜日日噜综合无码| 国产精品人成A片一区二区| 99热精品6| 99色在线观看视频| 99热婷婷| 五月婷六月| 久99| 亚洲A片成人无码久久精品青桔| 天天夜夜爽| 色色婷婷丁香| av在线免费播放观看| 六月丁香网| 伦乱美欧| 欧美久人人| 天天爽天天| 丁香六月情| 九九99在线观看视频| 殴美97色| 久久伊人大香蕉| 婷婷五月天免费视频| 婷婷五月激情四月综合| 极品五月天|