欧美成人午夜精品久久久,国产?V天堂一区二区三区,欧美精品va在线观看,亚洲一区二区三区免费在线观看,av无码精品一区二区久久,欧美性爱视频不卡一区三区,欧美乱人伦视频在线观看,国产一级牲交高潮

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| 日 日干 日日做| 性爱综合网| 丁香九月综合| 久久9热好| 激情婷婷丁香五月| 少妇人妻丰满做爰XXX| 日本激情ⅩXX免费视频| 牛牛澡牛牛爽| 亚洲精品国产精品乱码不99| 九九99香蕉在线视频播放| 九九视屏| 亚洲99激情| 天天人人天天爽| 99热这里只有精品8| 婷婷第六色| 色色色综合| 五月丁香婷婷AV天堂| 五月丁香影院| 国产综合网在线| 97婷婷五月激情六月丁香伊人| www,婷婷五月天,com| 五月丁香久久综合91| www.六月丁香看AV| 丁香蜜臀黄色婷婷五月天| 超碰在线99| 六月婷婷天天操夜夜爽视频| 2050人人操免费工开爱| 婷婷激情在线| 亚洲激情淫网| 五月天久久小说| 狠狠干五月天| 77799热| 久久久国产精品黄毛片| 五月丁香六月婷| 99自拍视频| 99热这里只有精品9| 天天插天天日天天爽| 99久久人人| 日本WWW九九九| 色婷婷基地在线| 亚洲色五月| 亚洲国产成人裸舞| 久热精品视频在线观| 国产精品日本一区二区在线播放| 欧美日本黄色| 九九热视频免费| 99久久视频| 热久久这里只有精品| 色性日本| 天天肏屄夜夜爽| 九九热99热| 久久这里只有精品无码| 超碰91av| 天天激情站| 婷婷八月丁香激情综合| 另类小说五月天综合网| 久久婷婷综合网| 国外亚洲成AV人片在线观看| 91色综合| 婷婷九月丁香| 这里只有精品视频看看| 天天情天天狠天天透| 色综合激情图区| 久久狠狠干| 六月丁香婷婷综合色播| 久久伦乱| 丁香婷婷综合色五月激情国产基地| 午夜丁香婷婷| 精品久久这里热66| 天天干夜夜b| 艹色18p| tingtingjiqingwuyue| 婷婷色影音天| 一本色道久久综合狠狠躁小说| 五月永久激情| 伊人久久大香蕉网| 色色五月天 亚洲| 色婷婷香蕉| 日日夜夜小色哥| 五月丁香婷婷在线| av在线免费网站| 变态 另类 在线| www色色com| 亚洲激情丁香五月基地| 久久色频| 久久丁香五月天| 五月天婷婷激情四射综合| 色情五月综合婷婷| 五月天婷婷av| 超碰人人操在线| 99re这里只有精品首页| 99日在线视频| 色爽九九| 亚州操操| 色激情五月| 99综合色色色| 欧美亚洲色色色色| 久久久天堂国产精品女人| 久99视频在线观看| 丁婷婷五月天在线播放| 五月丁香天堂网| 色高清无码视频| 婷婷五月中文在线| 大地资源色婷婷视频在线| 九色视频91疯狂| www.狠狠艹| 蜜桃婷婷丁香| 天天天天天天天操| 久热中文字幕在线线观看 | 日韩aaa| 色婷婷A| 色色色色色色色色网站| 欧美婷婷精品激情| 无码区婷婷五月花开| 人妻熟妇六区| 色五月丁香在线| 婷婷五月天直播| 五月婷俺去也| 99热国产这里只有| 激情五月亚洲综合网| 激情深爱综合| 亚洲国产婷婷色五月| 亚洲成人无码网站| 丁香五月首页| 色五月天.con| 这里只有精品热| 国产婷婷色五月| 91九色欧美| 丁香五月综合无码趴趴| 99热99精品| 啪啪东京热| 39视频第二区| 国产精品视频| 五月丁香手机在线| 色。 日日日| 99久久久99久久91熟女| 99久久网站| 丁香五月婷婷影院| 婷婷丁香社区| 色婷婷亚洲综合天堂| 国产在线网址1| 婷婷五月天A V| 人妻日日日| 欧美色一级色| 九日日夜夜69| 亚洲无码11| 亚洲六月色婷婷| 国产精品视频免费看| 丁香五月综合激情啪啪| 亚洲小视频免费播放| 在线不卡视频| 婷婷,五月天,丁香,第一| 九九综合九九| 国产精品-第3页-91JQ就要激情网91JQ5.JQJQ926.XYZ| 婷婷五月天无码熟女| 婷婷在线操| 天色综合网站| 久久婷婷五月综合| 99色在线视频| 九九色中文| 激情五月天99色| 伊人大香久久| 久久之人妻| 狠狠香婷婷五月| 五月丁香六月婷婷玖玖| 五月天精品| 人人做天天爱| 久久婷五月婷| 操逼在线视频| 性生活久久人妻| 婷婷狠狠操| 婷婷丁香在线| 青草视频在线观看视频| 五月天婷婷激情在线色图| 亚洲无码11| 91超级碰| 日日爱699| 丁香五月婷婷色播艳门照| 五月丁香影视| 亚洲V国产V欧美V久久久久久| 亚洲av电影网站| 婷婷综合影院| 五月天激日本色情在线| 免费在线观看欧美激情xx小视频| 欧美成人精品A片免费一区99| 91久久久久久久久久18| 玖玖综合色区在线观看| 天天综合情| 思思热再线视频| 久久人妻精品| 久久精品一区二区三区四区| WWW、日本色丁香、co m| 色色色婷婷五月| 色播丁香五月婷婷操:屄| 婷婷五月天偷拍| 涩综合网| 婷久久久| 亭亭丁香久久五月| 色九亚洲| 五月色情精品| 色吧五月婷婷六月丁香| 九一99| 思思热天天看| 丁香美女五月天婷婷| 亚洲天堂99| 人人操9| 亚洲Va成人| 丁香五月在线视频| 国产9色在线/日韩| 亚洲不卡123| 91丨九色丨熟女丰满| 能看的av片| 午夜爱爱网站| 综合色色五月| 青草性爱视频| 婷婷久久综合| 婷婷久久五月天丁香| 激情综合网之激情五月| 久九色| 久久久一级AAA| 色婷婷操逼| 日日夜夜狠狠干| 色婷婷天堂| 色五月综合激情网| 欧美激情五月天在线观看| 99噜噜| 亚洲AV无码电影| 99热99在线| 色欲一区二区三区精品A片| www.色婷婷.com| 9热在线视频精品| 俺也去在线久久精品23欧美综合视频网站,丰满人妻一区二区三区在线视频53,丰满 | 五月激情综合五月| 开心五月天激情网| 开心五月婷婷激情| 九九色热| 99热婷婷| 欧美日综合| 色色com| 五月丁香综合精品欧美| 亚洲十月婷婷综合| 国产成人精品一区二三区熟女在线 | 激情久久久| 天天网曰日曰夜夜综合永久免费| 婷婷在线免费| 欧美大肥婆大肥BBBBB| 婷婷激情性爱| 99熟女视频| 激情亭亭五月| 久久久久久五月天| 五月丁香婷婷狠狠操| 婷婷五月天色综合翘| 日本啪啪天堂| 亚洲另类av| 亚洲 在线 性爱| 可以免费观看的av| 色欲丁香久久| 97超碰免费超级在线观看| 五月丁香久久网| 成人av免费观看| 激情五月天啪啪| www.色婷婷| 9色免费网| 色综合色色色色色| 成人做爰黄A片免费看直播室男男 A片试看120分钟做受图片 | 婷婷久久夜| 九九AV| 99色精品视频| 五月婷婷影视| 九月丁香很很色| 日韩 欧美 国产 一区 二区| 久色网| 五月丁香爱婷婷深深| 伊人久久大香线蕉av一区| 久久婷中文字幕| 国产精品久久久海的味道| 九月婷婷激情久久| 亚洲色另类| 日本天堂免费99| 五月婷婷在线观看黄| 99婷婷五月天激情| 婷婷六月情| 日韩AV在线免费| 亚洲最大五月天成人网| 99色精品| 99热这里只有精品8| 天天五月丁香五月| 久久小说网| 五月丁香好婷婷姑娘综合网| 国产亚洲精品久久久久久豆腐| 五月丁香婷色| 免费超碰在线| 亚洲天堂热| 亚洲国产色婷婷| 激情网五月天| 五月婷婷六月丁香色| 影音先锋 一区| 激情五月天小说|五月天开心激情网|亚洲精品国产自在现线|黄色五月天 | 五月天丁香婷| 中文字幕在线免费看线人| 26uuu国产精品| 大地9中文在线观看免费高清| 午夜爱爱爱成人| 色逼综合网| 情趣视频66| 五月天天综合| 天天色粽合合合合合合合| 五月婷婷香蕉| 密乳Va| 丁香五月手机在线| 天天撸天天干天天插| 新激情五月天天在线网| 青草五月天| 色伊人婷婷| 国产真实乱了老女人视频| 9色免费网| 欧美色偷偷大香| 欧美日本黄色| 深爱激情AV| 五月天婷婷综合免费| 日韩操人| 97婷婷丁香五月天激情图片| 日日天天操| 久操人妻| 亚洲字幕AV一区二区三区四区| 天堂色婷婷| 操碰97| www.狠狠艹| 久久婷婷五月天| 丁香五月伊人| RenRenSe在线视频网站| 99热在线看| 六月丁香开心婷婷欧美| 亚洲色色色色| 天堂久久婷婷| 亚洲色色五月| 激情五月丁香色婷婷| 五月婷婷六月丁香在线| 五月天成人免费视频| 亚洲免费观看高清完整版AV线| 99热这里只有精品8| 婷婷五月视频| 丁香五月婷婷丫| 九九精品re免费视频| 99久久久久| 丁香五月婷婷综合激情啪啪啪| 97人人操人人爽| 亚洲人妻AV| 激情五月狠狠喔| 99色色网| 丁香五月欧美午夜视频| 99久久国产成人精品| 丁香五月婷婷99| 色婷婷五月综合在线| 五月丁香色狠狠干大屄| 色5月婷婷| 丁香五月激情六月欧亚激情综合导航 | 91丨九色丨国产打屁股| 丁香五月激情欧美| 伊人久久大香线蕉精品| 丁香色婷婷| 婷婷亚洲色| 99惹| 亚洲AV电影美洲AV电影| www.99热国产| 另类在线| 91超碰在线观看| 色九月综合网| 99国产精品白浆在线观看免费| 91九色精品| 亚洲国产色色| 久色网五月| 五月色婷婷亚洲| www.综合久久.com| 玖玖91| 亚洲五月花| 99久久综合| 精品福利911| 六月婷婷天天操夜夜爽视频| 色综合久久44| 99自拍视频网站| 亚洲成Av人片乱码色第1集| 五月天婷婷色播综合在线| 六月婷婷激情| 五月丁香精品| 日本久久高清| 97操碰在线视频| 久久视频在线| 九九热精品6| 色色色国产| 我去色色网五雨天| 中文字幕人妻熟女在线| 亚洲综合在线视频| 日本一级一级一级一级| 大香蕉av在线| 久久国产色| 亚洲综合激情五月| 色色色色色色色色网站| 久久久99精品| 草草视频91| 婷婷色色欧美| 色五月婷婷操逼| 激情亭亭五月| 日韩色五月| 操逼六区| 9久久精品| 婷婷丁香综合| 久狠狠狠| 久久大香蕉同僚| 婷婷五月综合啪| 久久婷婷五月| 97人妻碰碰碰久久香蕉| 久久久久视剧HD| 亚洲操逼网| 天天拍天天操| 六月成人网| 综合久久十三| 五月丁香久久综合91| 97综合视频在线| 久久婷婷一级片| 九九Y精品热播| 色色综合五月| 99爱在线| 激情中文在线| 成人噜噜网| 婷婷五月花免费视频在线| 天天操夜夜啊| 五月综合六月丁| 激情婷婷五月天日本系列| 欧美成人性爱网| 五月天婷婷无码| 婷婷五月天黄色小说| 久久久这里有精品| 久久人妻视步| 色五月在线观看| 五月天婷婷视频小说| 激情丁香九九五月综合网| 精品婷婷| 黄网在线播放| 亚洲成人网址在线观看| 婷婷五月天亚洲综合| 色五月天丁香| 日日干日日s| 婷婷色五月天第7色| 五月婷婷就去色| 五月视频日本免费观看| www激情com| 久久99精品久久久久久噜噜| 欧美日综合| 99热无码| 久久九色| 777米奇影视第四色| 九九99偷拍视频| 亚洲成人网站在线| 婷婷久久伊人| 青青夜夜狠狠夜夜狠狠| 婷婷播5月| 六月丁丁香| 大香蕉AV在线| 成人国产网| 午夜日韩久久久网站| 久草狼人| 丁香婷婷五月天色播| 五月天综合影院| 丁香五月开心亚洲| 五月丁香激情综合网官网| 欧美韩国日本| 九九一区| 久草热8精品视频在线观看| 97超碰综合| av网址在线| 久青操| 国产亚洲精品久久一区二区三区| 六月丁香五月婷婷| 伊人五月婷婷| 综合色播| 九九久久精品| 天天干天天干天天干| 99久久视频| 狠狠干狠狠色| 激情五月天影院| 婷婷五月中文字幕国产| 天天做天天爱综合| 亚洲va综合va国产va中文| 中文AV网站| 亚洲精品99| 在线网黄| 狠狠干综合| 日韩一区二区A片免费观看 | 7超碰自拍| 国产 亚洲 在线| 婷婷六月久久| 在线观看996精品| 99日本黄站| 日日爱678| 色婷婷五月基地在线| 五月激情另类| 色色综合网络| 五月婷婷成人| 激情www| 另类少妇人与禽zOZZ0性伦| 久热免费| 九九爱精品网站| 综合网啪| 五月天伊人av| 激情五月天小说| 丁香五月开心亚洲| 国产精品国产成人国产三级| 日本玖玖在线| 超碰a女人的天堂| 色情婷婷| xxx日本东京热| 99九九视频| 婷婷五月天色播| 五月综合激情啪啪啪啪啪| 五婷婷综合网| 99啪啪视频| 91操操操| 五月婷婷色情| 操逼综合激情网| 丁香六月婷婷开心| 婷婷五月天激情网| 丁香五月Av| 六月丁香社区| 五月丁香操婷逼| 黄色片久久| 久久久99免费视频| 五月丁香激情在线| 99这里只有| 99热亚州综合| 色综天天综合| 久久婷婷五月综合啪| 99精品偷自拍| 久久婷婷综合网| 五月丁香婷婷在线综合蜜桃| 五月欧美丁香在线观看| 国产在线aaa片一区二区99| 婷婷 伊人 久久| 色亚洲婷婷| 99热老司机| 少妇真实被内射视频三四区| 中文字幕综合网| 久久精品只有这| 免费看欧美成人A片无码| 另类精品视频在线观看| 五月天激情婷婷五月天久久| 五月天婷婷基地| 色情开心五月| www.日日夜夜.com| 五月停视频天堂| 九九九精品视频免费观看| 婷婷涩涩五月天| 国产真人做爰视频免费| 青青草原中文字幕| 九月色婷婷| 亚洲综合另类| 热成人网| 丁香婷婷天堂| 丁香五月天婷婷久久| 大香蕉久艹| 丁香五月www| 色色色99韩| 夜夜爽天天干| 99,色| 五月婷婷影院| 四虎成人精品永久免费AV九九| 久久99网| 亚洲熟女乱色综合亚洲网站| 丁香五月天电影| 91免费试看| 五月天伊人手机在线播放AV| 大香蕉伊人丁香五月| 五月婷伊人| 另类图片五月天| 色色自拍视频网站| 97在线视频人妻九色| 婷婷久久18| 婷婷六月色播| 97超喷视频在线观看| 天天干天天玩天天夜天天射天天操天天日蜜臀少妇 | 激情综合色五月丁香| 99久久亚洲精品视频| 国产欧美第五十五页| 97日在线视频| 日本色婷婷| 伊人干综合| 成片免费播放| 99热精品10| 99热在线观看| 涩婷婷五月天| 精品久热69| 五月婷婷激情久久| www久久久久久久| 国产激情综合五月久久| 99干日本| 亚洲va成人va成人va在线观看| 最新日本A片| 97色婷婷| 婷婷久久亚洲| 精品成人久久久久久久_一二三四视| 九热精品| 五月天全国最大成人网| 亚洲欧美国产A片免费观看| 综合色播| 婷婷激情小说网| 办公室少妇激情呻吟A片在线观看 白人荫道BBWBBB大荫道 | ww久久| www.婷婷六月天| 天天干天天玩天天夜天天射天天操天天日蜜臀少妇 | 99久久五月丁香野外| 国产精品日日躁夜夜躁| 色色永久| 婷婷色基地在线看 | 九久热| 婷婷性爱网| 开心五月婷婷激情| 人人操人人爰人人一天天碰夜夜拍夜夜爽-中国A级毛片天天看天天谢… | 蜜臀久久99精品久久久久久酒店| 小视频一区 | 综合欧美五月婷婷| 五月天六月婷| 噜综合| 丁香五月 性爱| 色色五月天网站| 亚洲色色图片| 99婷婷国产最新视频| 丁香婷婷性爱| 色色色成人网| 五月天成人网婷婷| 超碰免费人| 在线色色| 热99这就是精品视频| 色婷婷丁香五月高清在线| 成人AV中文字幕| 丁香五月天成人| 久久久精品色| 久久视频婷婷| 天天日天天爱天天噪| 亚洲精品操一操、噜一噜、摸一摸、爽 | 九九热这里只有精品23| 色射7856五月天激情四射| 国产FREESEXVIDEOS性中国| 激情丁香六月| 1995年关宝慧版蜘蛛女| 亚洲色婷婷色| 亚洲中文字幕av| 亚洲无码你懂的| 人人操av| 亚洲熟妇无码乱子AV电影| 99亚洲欧洲| 久思思热视频在线观看| 99热亚洲| 激情图片99| 久久ri精品视频| 成人做爰高潮A片免费视频| 99热九九热| 五月天丁香久久| 六月丁香五月激情网| 色天堂在线| 婷婷五月天毛片| 成人国产网| 婷婷丁香五月综合激情小说| 日本女va| 丁香色色色| 色色色色色五月丁香| 91碰操| 久久综合五月天激情小说网站| 九月婷婷| 六月婷婷激情| 色综合伊人网| 丁香婷婷六月天| 色在线99| 婷婷五月综合社区| 五月天操逼网| 亭亭色网| 91日本在线观看| 99re视频在线播放| 五月婷婷偷拍| 99色视频在线| 亚洲丁香五月天视频| 日韩视频99| 色婷婷小说| 婷婷五月丁香伊人| 五月激情综| 色婷婷在线视频久| 99久久综合网| 日日操人人操| 99热在线成人网站| 天天干天天射综合网| 亭亭五月天黑人2014| 日本va网站| 婷婷五月天天天日日夜夜| 久久久久久久综合狠狠综合| 秋霞三级色戒| 激情亚洲五月| 99小视频网站| 五月人妻婷婷视频| 大香蕉伊人爱在线| 91精品丝袜久久久久久| www夜夜操| 色婷婷在线视频| 欧美精品在线观看| 91国产精品视频播放| AV网址大全在| 丁香五月色网| 六月激情婷婷| 思思久久精品视频| 五月丁六月婷| 五月开心深深爱激情综合| 亚洲欧美999| 99爱视频| 五月色亚洲| 99国产精品久久久久久久久久久| 超碰色热| 激情综合网址| 啪啪91| 五月丁香本色在线观看| 91热久| 97久操视频| 香蕉婷婷| 天天爽天天爽夜夜爽| 久久开心五月婷婷| 狠狠色五月天| 亚洲激情av| 99热热热天天人人人超超碰| 天天操天天曰天天射| 五月五婷婷网| 丁香五月综合亚洲| 99久精品视频| 99婷婷| 亚洲综合在线视频| 天天久久婷婷| 91色久| 色色亚卅| 俺去也综合| 激情五月天婷婷五月天| 99热最新国内| 影音先锋色婷婷| 伊人六月丁香婷婷| 伊人五月天婷婷| 九九久久99精品免费观看www| 人人操AV| 成人在线高清| 国产熟女一区二区三区五月婷| 天天成人综合| 欧美激情VA永久在线播放| 五月婷婷在线视频| 91传媒无码人妻精| 激情五月天婷婷| WWW五月天| 色婷五月天| 九九热这里| 一片AV片免费播放| 丁香五月天激情婷婷丁香六月| 99热99这里免费的精品| 色色五月婷| 99热在线播放精品| 91久久1118| 五月天久久丁香| 泰州成人视频| 国产小网站| VA国产在线综合网站| 色五月在线视频观看| 色五月激情五月| 久人人操| 婷婷五月丁香色情| 色色色色综合网| 综合另类激情| 激情综合网络插| 免费观看的婷婷五月视频在线| 情欲综合网| 久久激情五月| 色婷婷伊人激情在线观看| 色九月婷婷综合| 六月合五月婷| 96精品成人无码A片观看金桔 | 国产AV不卡福利| 五月天五月色| 色五月婷婷久久| 色九综合| 天天看夜夜看| EEUSS鲁片一区二区三区| 99在线资源| 人人人va亚洲视频在线| 久久久激情视频| 色五月色情| 九色视频这里只有精品| 99热都是精品| 色色丁香婷婷综合| 操丝袜视频影院导航| 网站免费一站二站| 97极品在线| 精品久久久人妻| 男同91| 亚洲精品va| 久久婷婷网站| 激情 婷婷| 夜夜操少妇| 热久久91| 9 99免费视频| 色婷婷小说网| 五月婷婷丁香大香蕉| 五月丁香久久网| 久久丁香| WWW.99热| 日本一毛片| 色噜久| 国产在线另类五月婷婷| 青草视频在线观看视频| 激情久久久久久| 99热丁香| 无码yw| 五月婷婷色播| 五月婷婷综合性爱噜噜| 台湾佬天天日丁香婷婷五月天| 久久er99热精品一区二区| 久久欧洲久久| 婷婷五月天伊人| 99久久婷婷国产综合精品草原| 色综合九九色综合88| 欧美日韩成人在线网站| 色婷五月| 99热午夜精品| 久久机热这里只有精品| 9热在线| 九九热这里有精品23| 五月天综合在线| 色五月激情综合网| 丁香五月色| 热中文字幕| 五月婷婷之综合激情| 五月激情综合网| 婷婷色综合| 五月丁香综合啪啪| 亚洲免费99| 丁香成人五月天| 97亚洲色 torrent magnet| 五月婷婷丁香在线| 色五月激情问网站| 粉嫩AV久久一区二区三区| 俺也去婷婷五月天第五色| 婷婷综合五月| 丁香五月六月婷婷自拍| 国产精品久久久久久喷浆| 99只有这里是精品| 六月丁香AV| 亚洲天堂aaaa| 超碰色综合| 婷婷的99视频网站| 玖玖爱资源站| 婷婷精品在线| 婷婷六月丁香开心深深爱| 激情五月天婷婷| 青青夜夜狠狠夜夜狠狠| 精品国产AV色一区二区深夜久久| 色偷偷狠狠| 九九超碰人人| 久久9久| 成人午夜免费电影| 久久久久9999| 噜噜噜噜噜日本视频| 色综合综合综合| 99re思思热久久| 99热线观看9| 精品人妻伦一二三区久久| 情色五月天网站| 天天搡日日搡aaaaⅩ| 日本a片网址| 射婷婷中文字幕| 热99这就是精品视频| 五月色亚洲| 五月丁香| 99热只有精品在线播放| 五月婷婷香蕉| 亚洲无码99| 99狠狠色| 香蕉综合网| 天天综合天天玩夜夜玩天天玩夜夜玩 | 字幕网AV中文字幕| 香蕉AV777XXX色综合一区| WWW,五月| 91久操| 五月天婷婷中文字幕在线播放| 无码髙清| 婷婷六月激情| 婷婷五月天在婷| 97九色视频| 五月天色色网站| 伊人天天色| 色月丁| 日本三级日本三级99| 色五月丁香伊人| 九九久久免费视频44| 婷婷五月天电影网| www.激情五月天| 9精品视频在线观看| 色五月婷婷网| 五月婷综合| 五月天国产成人| 爱超碰性| 丁香五月婷婷AV| 五月丁香六月情婷婷久久| 97色天堂| 婷婷丁香九色| 99这里是99在线视频| 国精产品一区一区三区免费视频 | 五月丁香久久久日婷婷久久婷婷日 | 国产特黄色精品一区二区三区精品无广告| 99无码精品| 五丁香激情综合| AV大片在线播放| 97狠狠色| 一本久道综合色婷婷五月| av在线播放网址| 夜夜操狠狠操| 五月天黄色激情小说| 狠狠色色| 国产44页| 色婷五月天| 超碰三级片| 日日操日日射| 国产婷婷综合在线免费视频| 欧美大片免费观看| 色婷网| 成人免费va| 丁香五月AV综合激情| 色色丁香婷婷| 狠狠干.com| 激情综合五月婷婷| 这里只有精品免费视频| 天天做天天双| 欧美久久网| 色婷婷激情| 五月丁香久| 婷婷激情图片| www.av骚货| 天天色天天干天天插| 久久五月丁香婷婷| 就爱日五月天| 麻豆WWWCOM内射软件| 久久伊人大香蕉| 丁香五月在线播放| 五月综合缴情网| 人人人人人人人人人草| 99热国产精品| 亚洲色综久久五月| 青青操日本摸摸看看| 欧美日本免费一道免费视频| 天天操天天操天天操天天操天天操 | 久草热8精品视频在线观看| 色人妻五月| 激情五月综合免费| 亚洲久久日| 欧洲区自拍| 国产操B| 五月天婷婷无码| 亭亭玉月丁香| 九九爱激情| 五月婷婷久久网| 婷婷色五月天第7色| 天天搽天天射| -91九色大屁股| 久久久久激情| 色婷婷久久综| www激情网站| 亚洲蜜乳AV| 色级婷婷| 超碰人人妻| 91欧美日韩| 九色综合五月天婷五月| 午夜丁香久久久久久| 99久久66综合| 激情婷婷亚洲五月| 国产精品成人网站| 97热超碰| 丁香美女五月天婷婷| 99操逼| 激情亚洲网| 综合一本道| 色深爱五月| 人人爱人人摸人人澡| 天天搞天天色综合| 最新丁香六月婷婷| 天天插天天| 99日这里只有精品| 99热无码| 亚洲丁香五月| 五月丁香色狠狠干大屄| 九月婷婷丁香| 五月停停激情网| 毛片毛片毛片毛片| 欧美性爱五月天| 色婷婷精品视频| 97色女人在线| 79精品视频在线观看,| 丁香五月在线播放| 亚洲欧洲另类| 中文字幕日产A片在线看| 国产精品久久久久久妇女6080| 91男人操女人视频| 五月停视频天堂| 影院久久久| 开心五月婷婷婷美女| 91要啪| 久这里只有精品99| 森林影视大全,最好看的2019年视频| 深爱激情网婷婷| 五月天激情AV| 五月天婷婷小说| 欧美色色色色色| 久久小视频| 国成人网| 激情人妻综合| 天天爱天天做天天日| 五月丁香六月婷婷中文版| 99热777| 婷婷五月花| 97人人操人人干| 中文字幕欧美日韩VA免费视频| 色婷婷狠狠禁久久| WWW.五月com| 久久狠狠干| 色碰碰视频| 777丁香六月青青草婷婷综合久月| 五月婷婷视频ab| 天天插综合网| 色婷婷五月在线| 九九9久九9国产视频| 9|在线观看视频| www.婷婷六月天| 亚洲激情丁香五月天色| 开心五月色婷婷综合开心网| 婷婷综合成人| 亚洲精品99| 日本性视频| 五月丁香六月婷婷啪啪| 婷婷五月开心中文字幕色| 精品人妻久久久| 五月婷婷导航| 丁香婷婷久久 | 婷婷激情五月综合丁香社| 五月天色婷婷综合| 91中文在线| 丁香五月婷婷www..com| 免费亚洲婷婷中文字幕| 国产熟女日日骚五月丁香爱| 激情五月色婷婷| 色无码| 天堂网操| 一级片sese片.COM| 热99只有里视频| 思思热在线精品视频| 波多野结衣不卡AV| 9久久精品| 婷婷丁香久久五月综合| 深爱综合网| 中国女人做爰A片| 婷婷久久18| 五月丁香久久综合精品| 五月丁香六月成人| www.激情| 日日操无码| 99久久精| 操操操Av| 日韩免费视频| 操操自拍| 天天肏天天爽夜夜爽| 久久久久9| 久久婷婷九月国产精品| 丁香激情久久| 五月天久久综合婷婷丁香| 99精在线| 月色色综合婷婷网| 人人舔人人色人人高潮| 五月丁香啪啪啪综合网| 97碰精品| 久久婷婷五月国产激情综合片| 亚洲欧美丁香五月天亚洲欧美| 丰满少妇猛烈A片免费看观看| 99精品久久久久久久婷婷| 欧美3AaAa大片| 免费无码毛片一区二区A片 | 久噜久噜| www久| 91ncm视频| 思思re99视频在线观看| 欧美交换配乱吟粗大25P| 久热91精品| 五月天六月婷| 狠狠精品干练久久久无码中文字幕| 久久婷婷色综合| 婷婷五月天成人综合网| 激情婷婷五月天| 五月丁香激| www,色色色网站| 欧美槡BBBB槡BBB少妇| 99久久婷婷国产综合精品草原| 日本熟女二区| 久久色大香蕉| 天天干天天日天天插| 在线国产精品色| ww久久| 五月婷婷婷| 亚洲丁香五月| 影音先锋五月婷婷| 五月婷啪啪| 婷婷成年人免费视频| 免费碰碰视频久| 9999热精品在线免费播放| 色五月丁香婷婷| 五月天操逼网| 丁香五月色| 婷婷丁香黄色| 亚洲婷婷五月天激情综合| 丁香五月社区| 99这里只有精品视频免费| 五月天婷婷社区| 91丨九色丨国产打屁股网站| 内射激情在线| 天天爱天天操| 久久狠狠欧美| 九九热最新地址| 9色在线视频| 97色97干| 日本97在线视频| 欧洲色| 午夜婷婷久久 | 五月婷婷在线免费观看| 五月婷婷之综合激情在线| 五月婷婷丁香av| 六六久久黄色| 亚洲色A| 99在线视频观看| 五月丁香花开综合网| www色五月| 色色色综合网| 俺去也婷婷| 99久久精彩视频。| 99热97| 玖玖资源部在线播放| 99这里只有精品| 秋霞免费三级片| 亚洲无码色色| 天天射夜夜爽| 六月色色| 五月婷婷五月天激情视频| 久久66成人网站| 97干在线免费| 亚洲va欧美va国产综合久久久| 国产精品天天狠天天看| 激情文学 综合 色| 99热这里只有精品4| 婷香五月网在线| 色婷婷综合久久久久| 丁香五月婷婷亚洲综合精品| 另类图片色五月| 色5月婷婷| 色综合久久888| 欧洲激情五月天婷婷| 天天操天天插| 国产精品久久久99视频| 五月综合色| 狠狠狠人妻| 色综合综合综合| 婷婷丁香五月在线播放| 激情丁香久久久久久| 亚洲成人超碰| www.丁香五月| 五月丁香狠狠爱| 亚洲无码成人性爰网| 不卡成人免费| 综合网天天| 9久久精品| 久久精品99国产精品日本| 亚洲九九99精品视频在线播放| 丁香婷婷综合色五月激情国产基地| 五月天婷婷综合| 亚洲最大在线| 最近中文字幕2019视频1| 婷婷丁香六月激情综合| 丁香五月色情av| www.色婷婷.com| 97色碰| 九九久久99| 就爱啪啪婷婷| 综久久久| 综合激情婷婷| 免费黄网不卡AV| 五月婷婷综合久久| 日韩狠狠色| 婷婷综合五月| 五月丁香久久丝袜啪啪| 黄久久久| 五月丁香六月婷| 色五月视频无码播放| 丁香五月天婷婷91| 丁香五月婷婷综合精品素人| 丁香五月狠狠在线观看| 91操女| 丁香五月天婷婷中文字幕| 色狠狠色| 五月婷婷综合激情小说| www.91在线观看| 激情综合网之激情五月| 一起草日本| 97色在线| 噜噜噜精品欧美成人在线观看| 中文AV在线观看| 精品夜夜澡人妻无码AV| 久久九九视频| 99久久亚洲精品视频| 五月丁香婷婷狠狠操| 色噜噜狠狠色综合日日| 五月天婷婷久久日| 日本三级片片| 99精品视频在线观看| 丁香五月综合网亚洲综合欧美狠狠| www.99婷婷| 久久色大香蕉| 开心五月综合激情网| 噜噜噜精品欧美成人在线观看| 久久婷婷丁香| 成人免费120分钟啪啪| 一月婷婷色色| 丁香综合伊人AV| 婷婷丁香色情| 婷婷情色开心五月天99| 国产97色在线 | 日韩| 天天爽人人爽| 中文精品在| 啪啪日热| 亚洲色婷婷五月天| 色色a| www.狠狠操.con| 91热久久| AV免费在线网站| 激情综合网激情五月天| 婷婷狠狠操| 俺去啦综合网| 视频综合网| 成人啪啪色婷婷久| 亚洲中文字幕在线观看| 麻豆雪千夏| 久久久久久草黄色片AV在线观看| 天堂久久性| 久久涩视频| 激情网五月天| 九九成人| 久久久久人妻精选| 亚洲五月天第一综合干| 色噜噜狠狠色综合网| 久久久久久久久18久久| 婷婷成人视频| 亚洲欧洲国产精品| 丁香五月婷婷激情蜜桃| 热的国产,热的综合,热的有码| 97在线刺激| 999九九九久久久99HD| 五月天激情小说| 黄色一级影片| 激情伊人五月天| 3www激情| 久久五月婷综合网| 综合亚洲色色|