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

ARTICLE DETAIL

資訊詳情

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

LangGraph狀態(tài)機實戰(zhàn):構(gòu)建具備循環(huán)與人工審核的智能研究助手Agent

LangGraph狀態(tài)機實戰(zhàn):構(gòu)建具備循環(huán)與人工審核的智能研究助手Agent 1. 項目概述從 LangChain 到 LangGraphAgent 的范式躍遷如果你已經(jīng)用 LangChain 搭建過一些簡單的 AI 應(yīng)用比如一個能聯(lián)網(wǎng)搜索的問答機器人那你大概率已經(jīng)接觸過“Agent”這個概念了。在 LangChain 的早期版本里Agent 通常被理解為一個“工具調(diào)用者”你給它一個目標(biāo)比如“查一下今天上海的天氣”它就會規(guī)劃步驟“我需要調(diào)用天氣查詢工具”然后執(zhí)行調(diào)用 API最后給你結(jié)果。這個過程是線性的、一次性的。但當(dāng)我們開始構(gòu)建更復(fù)雜的應(yīng)用時比如一個能持續(xù)與用戶對話、管理長期任務(wù)、在多個工具間靈活跳轉(zhuǎn)的智能客服或者一個能自主分析數(shù)據(jù)、撰寫報告并發(fā)送郵件的自動化助手這種簡單的“規(guī)劃-執(zhí)行”模式就顯得力不從心了。這時LangGraph就登場了。它不是要取代 LangChain而是 LangChain 生態(tài)系統(tǒng)中的一個專門用于構(gòu)建有狀態(tài)、多步驟、可循環(huán)的復(fù)雜 Agent 的框架。你可以把它想象成從“單次函數(shù)調(diào)用”升級到了“一個完整的應(yīng)用程序”。它的核心思想就是引入了計算機科學(xué)中一個經(jīng)典且強大的概念——狀態(tài)機。為什么狀態(tài)機如此重要因為現(xiàn)實世界中的任務(wù)很少是“一錘子買賣”。一個客服對話有多個回合每個回合的上下文用戶歷史、已查詢信息、用戶情緒都在變化一個數(shù)據(jù)分析任務(wù)可能需要先清洗數(shù)據(jù)再分析發(fā)現(xiàn)異常后再回頭重新清洗最后生成可視化圖表。這些流程都擁有明確的“狀態(tài)”比如“等待用戶輸入”、“數(shù)據(jù)清洗中”、“生成報告中”和狀態(tài)之間的“轉(zhuǎn)移條件”比如“用戶提問”觸發(fā)從“等待”到“處理”“清洗完成”觸發(fā)到“分析”。用狀態(tài)機來建模這些流程邏輯會變得異常清晰和健壯。所以當(dāng)你看到“高級 AgentLangGraph 與狀態(tài)機”這個標(biāo)題時它指向的正是 AI 應(yīng)用開發(fā)的下一個階段如何構(gòu)建那些真正具備復(fù)雜邏輯、能夠處理非線性工作流、并且能維持長期記憶和上下文的智能體。這不再是玩具 demo而是邁向生產(chǎn)級 AI 應(yīng)用的關(guān)鍵一步。接下來我將以一個“智能研究助手”Agent 為例帶你徹底拆解 LangGraph 的核心三要素并手把手實現(xiàn)一個具備循環(huán)、分支和人工審核能力的復(fù)雜狀態(tài)機。2. 核心三要素拆解State、Node、Edge要理解 LangGraph必須吃透它的三個核心抽象State、Node和Edge。這就像建房子的地基、磚塊和鋼筋三者結(jié)合才能構(gòu)筑起穩(wěn)固的架構(gòu)。2.1 State智能體的記憶與上下文在 LangGraph 中State 是一個字典它定義了整個工作流運行過程中需要攜帶和更新的所有信息。你可以把它理解為 Agent 的“工作內(nèi)存”或“上下文白板”。與 LangChain 中每次調(diào)用都相對獨立的鏈不同LangGraph 的 State 會在整個圖執(zhí)行過程中持續(xù)存在并被修改。State 的定義與注解State 通常使用 Pydantic 的BaseModel來定義這能提供清晰的類型提示和驗證。對于我們的研究助手State 可能包含from typing import List, Dict, Any, Optional, Annotated from typing_extensions import TypedDict from langgraph.graph.message import add_messages import operator # 方式一使用 TypedDict更靈活兼容性好 class AgentState(TypedDict): # 對話消息歷史LangGraph 提供了專用注解來簡化消息列表的合并操作 messages: Annotated[List[Dict], add_messages] # 用戶輸入的研究主題 research_topic: str # 從網(wǎng)絡(luò)上搜集到的原始資料列表 gathered_sources: List[Dict[str, Any]] # 分析后的關(guān)鍵發(fā)現(xiàn) key_findings: List[str] # 生成的報告草稿 report_draft: Optional[str] # 一個控制流程的標(biāo)志位例如“是否需要人工審核” needs_human_review: bool # 人工審核的反饋意見 human_feedback: Optional[str]這里有幾個關(guān)鍵點Annotated[List[Dict], add_messages]這是 LangGraph 的一個“魔法”。add_messages是一個歸約器它定義了當(dāng)多個節(jié)點同時向state[‘messages’]字段寫入時如何合并這些值。對于消息列表最常見的操作就是追加。這確保了對話歷史能正確累積而不會被覆蓋。狀態(tài)即數(shù)據(jù)流圖中的每個節(jié)點都讀取和修改這個共享的 State。例如“搜索節(jié)點”會向gathered_sources添加數(shù)據(jù)“分析節(jié)點”會讀取gathered_sources并生成key_findings。設(shè)計原則State 應(yīng)該包含所有必要的上下文但也要保持精簡。避免將中間計算過程等臨時變量塞進去專注于輸入、輸出和控制流數(shù)據(jù)。2.2 Node執(zhí)行具體任務(wù)的函數(shù)Node 是圖中的節(jié)點每個節(jié)點都是一個普通的 Python 函數(shù)或可調(diào)用對象。這個函數(shù)接收當(dāng)前的State作為參數(shù)執(zhí)行一些操作調(diào)用 LLM、使用工具、處理數(shù)據(jù)然后返回一個包含對 State更新內(nèi)容的字典。節(jié)點的編寫范式一個典型的節(jié)點函數(shù)看起來是這樣的def search_node(state: AgentState) - Dict[str, Any]: 負責(zé)根據(jù)主題進行網(wǎng)絡(luò)搜索的節(jié)點。 print(f“[搜索節(jié)點] 正在搜索主題{state[‘research_topic’]}”) # 1. 準(zhǔn)備搜索查詢這里可以加入查詢優(yōu)化邏輯 search_query f“{state[‘research_topic’]} latest research 2024” # 2. 調(diào)用搜索工具例如 Tavily Search API、Serper API 或 DuckDuckGo # 假設(shè)我們有一個 search_web 函數(shù) search_results search_web(search_query, max_results5) # 3. 對結(jié)果進行初步處理提取標(biāo)題、鏈接、摘要 processed_sources [] for result in search_results: processed_sources.append({ “title”: result.get(“title”), “url”: result.get(“url”), “snippet”: result.get(“snippet”)[:200] “...” # 截斷摘要 }) # 4. 返回要更新的 State 部分 # 注意我們返回的是 gathered_sources而不是整個 state。 # LangGraph 會自動將這個字典與當(dāng)前 state 合并。 return {“gathered_sources”: processed_sources}關(guān)鍵理解節(jié)點函數(shù)不直接修改傳入的state對象。它只是基于state進行計算然后返回一個字典指明要更新哪些字段。返回的字典中的鍵必須與 State 中定義的字段名對應(yīng)。一個節(jié)點可以很復(fù)雜比如內(nèi)部封裝了一個 LangChain Chain也可以很簡單只是一個邏輯判斷。2.3 Edge決定流程走向的規(guī)則Edge 定義了圖中節(jié)點之間的連接關(guān)系更重要的是它決定了在某個節(jié)點執(zhí)行完畢后下一個該執(zhí)行哪個節(jié)點。這是狀態(tài)機邏輯的核心。Edge 分為兩種普通邊直接從一個節(jié)點連接到另一個節(jié)點無條件執(zhí)行。條件邊根據(jù) State 中的某個條件動態(tài)決定下一個節(jié)點。條件邊通過一個特殊的conditional_edge來創(chuàng)建它連接到一個“路由函數(shù)”。這個路由函數(shù)檢查 State并返回下一個要執(zhí)行的節(jié)點的名稱字符串。條件邊的實戰(zhàn)在我們的研究助手中在“生成報告”節(jié)點之后我們可能希望引入一個人工審核環(huán)節(jié)。但并非所有報告都需要審核只有當(dāng)內(nèi)容敏感或置信度低時才需要。我們可以這樣設(shè)計from langgraph.graph import END, START def should_review(state: AgentState) - str: 路由函數(shù)決定下一步是人工審核還是直接結(jié)束。 # 這里可以設(shè)計更復(fù)雜的邏輯例如 # - 檢查報告是否涉及特定關(guān)鍵詞如“醫(yī)療建議”、“投資” # - 調(diào)用一個 LLM 來判斷報告內(nèi)容的置信度 # - 基于 state[‘needs_human_review’] 標(biāo)志位可能由之前的節(jié)點設(shè)置 sensitive_keywords [“醫(yī)療”, “法律”, “財務(wù)建議”, “投資”] report_text state.get(“report_draft”, “”).lower() if any(keyword in report_text for keyword in sensitive_keywords): return “human_review_node” # 前往人工審核節(jié)點 elif state.get(“needs_human_review”, False): return “human_review_node” else: return END # 直接結(jié)束整個圖的工作流然后在構(gòu)建圖時你會將“生成報告節(jié)點”通過一個conditional_edge連接到這個路由函數(shù)而路由函數(shù)的結(jié)果“human_review_node”或END決定了真正的流向。注意START和END是 LangGraph 中兩個特殊的節(jié)點名分別代表圖的入口和出口。把 State、Node、Edge 組合起來你就得到了一個完整的、可定義復(fù)雜業(yè)務(wù)邏輯的“藍圖”。接下來我們就用這個藍圖搭建一個真實的研究助手。3. 構(gòu)建智能研究助手從藍圖到代碼讓我們實現(xiàn)一個具備完整流程的研究助手 Agent。它的工作流是接收主題 - 并行搜索與讀取本地文檔 - 綜合分析 - 生成報告 - 條件性人工審核 - 最終輸出。3.1 定義完整狀態(tài)與工具首先我們完善 State 并準(zhǔn)備一些工具函數(shù)。from typing import List, Dict, Any, Optional, Annotated, Literal from typing_extensions import TypedDict from langgraph.graph.message import add_messages import asyncio # 假設(shè)的工具函數(shù)和模型調(diào)用 from some_tool_module import tavily_search, read_pdf_text from some_llm_module import call_llm class ResearchAgentState(TypedDict): 研究助手 Agent 的完整狀態(tài)定義。 messages: Annotated[List[Dict], add_messages] research_topic: str # 來源分為網(wǎng)絡(luò)和本地 web_sources: List[Dict[str, Any]] local_sources: List[Dict[str, Any]] # 綜合后的資料 synthesized_info: Optional[str] key_findings: List[str] report_draft: Optional[str] needs_human_review: bool human_feedback: Optional[str] # 一個標(biāo)志記錄當(dāng)前流程步驟可用于調(diào)試或復(fù)雜路由 current_step: Literal[“start”, “gathering”, “analyzing”, “reporting”, “reviewing”, “end”]3.2 實現(xiàn)各個功能節(jié)點我們將創(chuàng)建多個節(jié)點每個負責(zé)一項具體工作。節(jié)點1任務(wù)規(guī)劃與初始化這個節(jié)點負責(zé)解析用戶輸入明確研究主題并初始化狀態(tài)。def planning_node(state: ResearchAgentState) - Dict[str, Any]: 規(guī)劃節(jié)點解析輸入初始化任務(wù)。 # 通常最后一條用戶消息是輸入 user_input state[“messages”][-1][“content”] if state[“messages”] else state.get(“research_topic”, “”) # 可以在這里調(diào)用一個 LLM 來更好地提煉研究主題和子問題 # 例如用戶說“幫我研究一下太陽能電池的最新進展”LLM 可以提煉出“鈣鈦礦太陽能電池效率”、“硅基異質(zhì)結(jié)技術(shù)”等子方向。 # 這里為了簡化我們直接使用輸入作為主題。 refined_topic user_input print(f“[規(guī)劃節(jié)點] 研究主題已確定{refined_topic}”) return { “research_topic”: refined_topic, “current_step”: “gathering”, “web_sources”: [], # 初始化空列表 “l(fā)ocal_sources”: [], “synthesized_info”: None, “key_findings”: [], “report_draft”: None, “needs_human_review”: False, “human_feedback”: None, }節(jié)點2與3并行信息搜集研究需要多來源。我們可以讓網(wǎng)絡(luò)搜索和本地文檔讀取同時進行。這需要用到 LangGraph 的并行化能力。def web_search_node(state: ResearchAgentState) - Dict[str, Any]: 網(wǎng)絡(luò)搜索節(jié)點。 topic state[“research_topic”] print(f“[網(wǎng)絡(luò)搜索節(jié)點] 正在搜索{topic}”) try: # 使用 Tavily、Serper 或 DuckDuckGo 等搜索 API results tavily_search( queryf“{topic} site:.edu OR site:.gov OR site:.org recent”, max_results5, include_answerFalse, search_depth“basic” ) # 格式化結(jié)果 web_sources [] for r in results.get(“results”, []): web_sources.append({ “title”: r.get(“title”, “No Title”), “url”: r.get(“url”, “”), “content”: r.get(“content”, “”)[:500], # 取前500字符 “score”: r.get(“score”, 0.0) }) return {“web_sources”: web_sources} except Exception as e: print(f“網(wǎng)絡(luò)搜索失敗{e}”) return {“web_sources”: []} # 失敗時返回空不影響整體流程 def local_doc_node(state: ResearchAgentState) - Dict[str, Any]: 本地文檔讀取節(jié)點。 # 假設(shè)我們有一個已知的本地文檔路徑列表或者從 state 中獲取 doc_paths [“./data/research_paper1.pdf”, “./data/industry_report.pdf”] local_sources [] for path in doc_paths: try: text read_pdf_text(path) # 簡單提取前幾行作為“標(biāo)題”并截取部分內(nèi)容 local_sources.append({ “title”: path.split(“/”)[-1], “path”: path, “content”: text[:1000] “...” if len(text) 1000 else text }) except Exception as e: print(f“讀取文檔 {path} 失敗{e}”) print(f“[本地文檔節(jié)點] 已讀取 {len(local_sources)} 份文檔。”) return {“l(fā)ocal_sources”: local_sources}節(jié)點4信息綜合與分析這個節(jié)點接收并行搜集的結(jié)果調(diào)用 LLM 進行總結(jié)、去重、提取關(guān)鍵發(fā)現(xiàn)。def analysis_node(state: ResearchAgentState) - Dict[str, Any]: 分析節(jié)點綜合所有信息提取關(guān)鍵發(fā)現(xiàn)。 print(“[分析節(jié)點] 開始綜合與分析信息...”) web_info “\n\n”.join([f“標(biāo)題{s[‘title’]}\n內(nèi)容{s[‘content’]}” for s in state[“web_sources”]]) local_info “\n\n”.join([f“文檔{s[‘title’]}\n內(nèi)容{s[‘content’]}” for s in state[“l(fā)ocal_sources”]]) all_info f“## 網(wǎng)絡(luò)信息\n{web_info}\n\n## 本地文檔信息\n{local_info}” # 構(gòu)造給 LLM 的提示詞 prompt f“”” 你是一個專業(yè)的研究分析員。請基于以下關(guān)于“{state[‘research_topic’]}”的資料完成以下任務(wù) 1. **綜合摘要**用一段話200字以內(nèi)概括所有資料的核心觀點。 2. **提取關(guān)鍵發(fā)現(xiàn)**列出3-5條最重要的發(fā)現(xiàn)或事實每條用短句陳述。 3. **評估信息質(zhì)量**整體上這些資料的可靠性和全面性如何高/中/低 請嚴格按照以下 JSON 格式輸出不要有任何其他文字 json {{ “summary”: “綜合摘要文本”, “key_findings”: [“發(fā)現(xiàn)一”, “發(fā)現(xiàn)二”, “...”], “reliability”: “高/中/低” }}資料如下 {all_info} “””try: response call_llm( model“gpt-4”, messages[{“role”: “user”, “content”: prompt}], temperature0.2, response_format{“type”: “json_object”} # 要求 JSON 輸出 ) import json analysis_result json.loads(response[“choices”][0][“message”][“content”]) # 根據(jù)可靠性評估決定是否需要人工審核 needs_review analysis_result.get(“reliability”, “中”) in [“低”] return { “synthesized_info”: analysis_result.get(“summary”, “”), “key_findings”: analysis_result.get(“key_findings”, []), “needs_human_review”: needs_review, “current_step”: “reporting” } except Exception as e: print(f“分析過程出錯{e}”) # 出錯時標(biāo)記需要人工審核 return { “synthesized_info”: “分析過程出現(xiàn)錯誤。”, “key_findings”: [], “needs_human_review”: True, “current_step”: “reporting” }**節(jié)點5報告生成** 基于分析結(jié)果生成一份結(jié)構(gòu)化的報告草稿。 python def report_generation_node(state: ResearchAgentState) - Dict[str, Any]: 報告生成節(jié)點。 print(“[報告生成節(jié)點] 正在撰寫報告草稿...”) prompt f“”” 你是一名技術(shù)文檔工程師。請基于以下關(guān)于“{state[‘research_topic’]}”的分析結(jié)果撰寫一份簡潔的專業(yè)報告草稿。 **分析摘要** {state[‘synthesized_info’]} **關(guān)鍵發(fā)現(xiàn)** {chr(10).join(‘- ‘ f for f in state[‘key_findings’])} **報告要求** 1. 標(biāo)題明確。 2. 包含“概述”、“主要發(fā)現(xiàn)”、“結(jié)論”三個部分。 3. 語言客觀、精煉避免主觀臆斷。 4. 如果某些發(fā)現(xiàn)存在不確定性或信息源可靠性為‘低’請在報告中用‘[待核實]’標(biāo)注。 5. 報告總長度控制在500字以內(nèi)。 請直接輸出報告正文不需要額外的解釋。 “”” try: response call_llm( model“gpt-4”, messages[{“role”: “user”, “content”: prompt}], temperature0.3 ) draft response[“choices”][0][“message”][“content”] return { “report_draft”: draft, “current_step”: “reviewing” # 進入審核階段 } except Exception as e: print(f“報告生成失敗{e}”) return { “report_draft”: “報告生成失敗?!? “current_step”: “reviewing”, “needs_human_review”: True # 生成失敗也需人工介入 }節(jié)點6人工審核交互節(jié)點這是一個特殊的節(jié)點它可能需要暫停工作流等待外部輸入如用戶在界面上點擊“通過”或輸入反饋。在 LangGraph 中這可以通過“暫?!被颉皺z查點”機制實現(xiàn)但為了簡化我們模擬一個自動判斷。def human_review_node(state: ResearchAgentState) - Dict[str, Any]: 人工審核節(jié)點模擬。 print(“[人工審核節(jié)點] 報告已生成等待審核...”) # 在實際應(yīng)用中這里可能會 # 1. 將報告發(fā)送到審核隊列如數(shù)據(jù)庫、消息隊列。 # 2. 調(diào)用 graph.checkpoint() 保存當(dāng)前狀態(tài)并暫停。 # 3. 等待一個外部事件如 HTTP 回調(diào)來恢復(fù)執(zhí)行并攜帶 human_feedback。 # 為了演示我們模擬一個自動通過的邏輯或者根據(jù) needs_human_review 決定。 if state[“needs_human_review”]: # 模擬人工審核后給出了反饋 simulated_feedback “報告整體不錯但第三點發(fā)現(xiàn)的數(shù)據(jù)來源請再核實一下。” print(f“[模擬] 收到人工反饋{simulated_feedback}”) return { “human_feedback”: simulated_feedback, “current_step”: “revising” } else: print(“[模擬] 無需人工審核自動通過?!? return {“current_step”: “end”} # 前往結(jié)束節(jié)點7報告修訂可選如果收到了人工反饋這個節(jié)點負責(zé)根據(jù)反饋修改報告。def revision_node(state: ResearchAgentState) - Dict[str, Any]: 根據(jù)人工反饋修訂報告。 feedback state[“human_feedback”] draft state[“report_draft”] print(f“[修訂節(jié)點] 正在根據(jù)反饋進行修訂。反饋{feedback}”) prompt f“”” 以下是報告草稿和審核反饋請根據(jù)反饋修改報告草稿。 **原始報告草稿** {draft} **審核反饋** {feedback} 請輸出修改后的完整報告。如果反饋不涉及具體修改可以保持原樣。 “”” try: response call_llm( model“gpt-4”, messages[{“role”: “user”, “content”: prompt}], temperature0.1 ) revised_draft response[“choices”][0][“message”][“content”] return { “report_draft”: revised_draft, “current_step”: “end” } except Exception as e: print(f“修訂失敗{e}”) return {“current_step”: “end”} # 即使失敗也嘗試結(jié)束3.3 組裝圖并定義流程邏輯現(xiàn)在我們將所有節(jié)點和邊組裝起來形成完整的工作流。from langgraph.graph import StateGraph, END # 1. 創(chuàng)建圖構(gòu)建器并指定狀態(tài)結(jié)構(gòu) workflow StateGraph(ResearchAgentState) # 2. 添加節(jié)點 workflow.add_node(“plan”, planning_node) workflow.add_node(“search_web”, web_search_node) workflow.add_node(“search_local”, local_doc_node) workflow.add_node(“analyze”, analysis_node) workflow.add_node(“generate_report”, report_generation_node) workflow.add_node(“human_review”, human_review_node) workflow.add_node(“revise”, revision_node) # 3. 設(shè)置入口點 workflow.set_entry_point(“plan”) # 4. 添加邊定義流程 # 規(guī)劃之后并行執(zhí)行網(wǎng)絡(luò)搜索和本地搜索 workflow.add_edge(“plan”, “search_web”) workflow.add_edge(“plan”, “search_local”) # 兩個搜索節(jié)點都完成后再進入分析節(jié)點。 # 這里需要用到 add_conditional_edges 或 add_edge 的聚合功能。 # 更常見的模式是使用一個“聚合節(jié)點”來等待并行任務(wù)但為簡化我們假設(shè)它們都完成后自動進入分析。 # 我們可以通過讓 analyze 節(jié)點在 state 中檢查兩個源是否都已存在非空來隱式實現(xiàn)或者使用更高級的構(gòu)造。 # 這里我們采用一個簡單方式從 plan 直接連到 analyze但在 analyze 節(jié)點內(nèi)等待/檢查數(shù)據(jù)。 # 實際上更規(guī)范的做法是使用 LangGraph 的 Pregel 的并發(fā)特性。為了清晰我們調(diào)整一下邏輯 # 讓 plan 之后先到一個“協(xié)調(diào)節(jié)點”由它來并發(fā)觸發(fā)搜索然后等待結(jié)果。但代碼會復(fù)雜很多。 # 作為教程我們簡化順序執(zhí)行 web - local - analyze這仍然是有效的狀態(tài)機只是沒并發(fā)。 workflow.add_edge(“search_web”, “search_local”) workflow.add_edge(“search_local”, “analyze”) # 分析之后生成報告 workflow.add_edge(“analyze”, “generate_report”) # 報告生成后根據(jù)條件決定是進入人工審核還是結(jié)束 def after_report_route(state: ResearchAgentState) - str: if state[“needs_human_review”]: return “human_review” else: return END workflow.add_conditional_edges( “generate_report”, after_report_route, { “human_review”: “human_review”, END: END } ) # 人工審核后進入修訂節(jié)點 workflow.add_edge(“human_review”, “revise”) # 修訂后結(jié)束 workflow.add_edge(“revise”, END) # 5. 編譯圖 app workflow.compile() # 6. 可視化需要安裝 graphviz try: from IPython.display import Image, display display(Image(app.get_graph().draw_mermaid_png())) except: print(“無法顯示圖形但圖已編譯完成?!?3.4 運行與調(diào)試現(xiàn)在我們可以運行這個研究助手了。# 初始化狀態(tài) initial_state: ResearchAgentState { “messages”: [{“role”: “user”, “content”: “請幫我研究一下大語言模型在代碼生成方面的最新進展和主要挑戰(zhàn)?!眪], “research_topic”: “”, “web_sources”: [], “l(fā)ocal_sources”: [], “synthesized_info”: None, “key_findings”: [], “report_draft”: None, “needs_human_review”: False, “human_feedback”: None, “current_step”: “start” } # 運行圖 final_state app.invoke(initial_state) print(“\n” “”*50) print(“最終報告”) print(“”*50) print(final_state[“report_draft”]) print(“\n關(guān)鍵發(fā)現(xiàn)”, final_state[“key_findings”]) print(“當(dāng)前步驟”, final_state[“current_step”])運行后你會在控制臺看到各個節(jié)點的執(zhí)行日志并最終得到一份生成的研究報告。這個流程清晰地展示了信息如何在不同節(jié)點間流動狀態(tài)如何被逐步更新以及條件邏輯如何影響執(zhí)行路徑。4. 高級特性與生產(chǎn)級考量當(dāng)你掌握了基礎(chǔ)構(gòu)建方法后以下高級特性能讓你的 LangGraph Agent 更強大、更穩(wěn)健。4.1 持久化與檢查點讓 Agent 擁有“記憶”對于長時間運行或需要中斷恢復(fù)的任務(wù)持久化至關(guān)重要。LangGraph 與 LangChain 生態(tài)深度集成支持將運行狀態(tài)保存到數(shù)據(jù)庫如 PostgreSQL、MySQL或內(nèi)存中。from langgraph.checkpoint import MemorySaver from langgraph.graph import StateGraph, START, END # 在編譯圖時加入檢查點管理器 checkpointer MemorySaver() workflow StateGraph(ResearchAgentState, checkpointercheckpointer) # ... 添加節(jié)點和邊 ... app workflow.compile() # 運行時會自動創(chuàng)建檢查點 config {“configurable”: {“thread_id”: “user_123_research_task”}} initial_state {…} # 第一次調(diào)用 result1 app.invoke(initial_state, configconfig) # 假設(shè)任務(wù)在這里因某種原因暫停了state 已被保存。 # 之后可以從最后一個檢查點恢復(fù)執(zhí)行 # 我們通過傳入一個空的輸入并指定從上一個線程繼續(xù) resumed_state app.invoke( {“messages”: [{“role”: “user”, “content”: “繼續(xù)”}]}, # 可以傳入新的消息來影響流程 configconfig )MemorySaver適用于開發(fā)和測試。在生產(chǎn)環(huán)境中你會使用PostgresSaver或MongoDBSaver將狀態(tài)持久化到外部存儲從而實現(xiàn)跨會話、跨服務(wù)器重啟的 Agent 狀態(tài)恢復(fù)。這對于構(gòu)建客服對話機器人等長周期應(yīng)用是必備功能。4.2 子圖與模塊化構(gòu)建復(fù)雜系統(tǒng)的基石當(dāng)你的 Agent 變得非常復(fù)雜時將所有邏輯塞進一個圖里會難以維護。子圖允許你將一部分功能例如一個完整的“搜索-評估-過濾”流程封裝成一個獨立的、可復(fù)用的圖然后作為單個節(jié)點嵌入到主圖中。from langgraph.graph import StateGraph as SubStateGraph # 1. 定義一個“信息驗證”子圖 def create_validation_subgraph(): sub_builder SubStateGraph(ResearchAgentState) def validate_source_node(state): # 驗證單個信息來源的可信度 # ... return {“source_credibility_score”: 0.95} def aggregate_validation_node(state): # 聚合所有驗證結(jié)果 # ... return {“overall_credibility”: “high”} sub_builder.add_node(“validate”, validate_source_node) sub_builder.add_node(“aggregate”, aggregate_validation_node) sub_builder.add_edge(“validate”, “aggregate”) sub_builder.set_entry_point(“validate”) sub_builder.set_finish_point(“aggregate”) # 子圖有明確的結(jié)束點 return sub_builder.compile() # 2. 在主圖中將這個子圖作為一個節(jié)點添加 validation_subgraph create_validation_subgraph() workflow.add_node(“validate_sources”, validation_subgraph) # 3. 在主圖的適當(dāng)位置連接這個節(jié)點 workflow.add_edge(“search_web”, “validate_sources”) workflow.add_edge(“validate_sources”, “analyze”)這樣做的好處是關(guān)注點分離主圖邏輯清晰子圖負責(zé)特定復(fù)雜功能??蓮?fù)用性同一個驗證子圖可以被用在多個不同的主圖中。可測試性子圖可以獨立進行單元測試。4.3 流式輸出與中斷對于需要實時向用戶反饋進度的 Agent如一邊搜索一邊顯示結(jié)果或者需要支持用戶中途取消的任務(wù)流式輸出和中斷機制很重要。流式輸出LangGraph 的app.stream()方法可以讓你逐步獲取每個節(jié)點執(zhí)行后的狀態(tài)更新。inputs {“messages”: [{“role”: “user”, “content”: “研究主題”}]} config {“configurable”: {“thread_id”: “stream_demo”}} for event in app.stream(inputs, configconfig, stream_mode“values”): # event 是一個元組 (node_name, state_update) node, state_update event print(f“節(jié)點 [{node}] 執(zhí)行完畢。”) if “report_draft” in state_update and state_update[“report_draft”]: print(“報告草稿已更新片段...”) # 你可以將 state_update 中的部分內(nèi)容如新的消息實時發(fā)送給前端中斷處理你可以在節(jié)點函數(shù)中檢查某個標(biāo)志位例如來自一個全局信號或數(shù)據(jù)庫或者通過app.invoke()的config傳入超時設(shè)置來實現(xiàn)優(yōu)雅的中斷。更精細的控制可能需要結(jié)合檢查點在每次節(jié)點執(zhí)行前檢查是否收到“取消”指令。4.4 錯誤處理與韌性生產(chǎn)級 Agent 必須能妥善處理失敗如 API 超時、網(wǎng)絡(luò)錯誤、LLM 輸出格式錯誤。節(jié)點級容錯在每個節(jié)點函數(shù)內(nèi)部使用try...except并返回一個代表錯誤的狀態(tài)如{“error”: “API timeout”, “step”: “retry”}。圖級容錯路由利用條件邊根據(jù) State 中是否有error字段將流程路由到一個專門的“錯誤處理節(jié)點”。這個節(jié)點可以嘗試重試、降級處理如使用備用模型、或通知用戶。超時設(shè)置在調(diào)用 LLM 或外部 API 時務(wù)必設(shè)置超時參數(shù)。驗證與重試對于關(guān)鍵節(jié)點可以設(shè)計一個包裝器在失敗時自動重試幾次。def robust_llm_call(prompt, max_retries3): for i in range(max_retries): try: return call_llm(prompt, timeout30) # 設(shè)置超時 except TimeoutError: print(f“LLM 調(diào)用超時第 {i1} 次重試...”) if i max_retries - 1: raise except Exception as e: print(f“LLM 調(diào)用失敗{e}”) raise # 非超時錯誤直接拋出將這些策略結(jié)合起來你的 Agent 就能在部分組件失效時依然提供有價值的服務(wù)或者至少能給出清晰的錯誤報告而不是直接崩潰。5. 常見問題與避坑指南在實際開發(fā)中你會遇到各種各樣的問題。以下是我從多個項目中總結(jié)出的高頻問題和解決方案。5.1 狀態(tài)管理混亂問題State 字段設(shè)計不合理導(dǎo)致節(jié)點間數(shù)據(jù)污染或難以追蹤。例如多個節(jié)點都修改同一個列表但意圖不同。解決方案字段職責(zé)單一化為不同的數(shù)據(jù)階段設(shè)計不同的字段。例如不要只用sources而是分為raw_sources、filtered_sources、processed_sources。使用不可變數(shù)據(jù)結(jié)構(gòu)在返回更新字典時盡量創(chuàng)建新的列表或字典而不是修改傳入 state 中的對象。雖然 LangGraph 的合并機制會處理但清晰的意圖有助于調(diào)試。添加調(diào)試字段像我們例子中的current_step或者last_updated_by這樣的字段在復(fù)雜流程中非常有助于追蹤狀態(tài)變化軌跡。5.2 條件邊路由邏輯過于復(fù)雜問題路由函數(shù)should_do_something(state)里塞滿了大量的if-else判斷難以維護和測試。解決方案路由表模式將路由邏輯抽象成配置。例如定義一個字典鍵為條件名值為一個判斷函數(shù)和對應(yīng)的目標(biāo)節(jié)點。routing_rules [ {“name”: “needs_detail”, “condition”: lambda s: len(s[‘findings’]) 3, “target”: “detail_search_node”}, {“name”: “is_controversial”, “condition”: lambda s: “爭議” in s[‘summary’], “target”: “human_review_node”}, {“name”: “default”, “condition”: lambda s: True, “target”: END}, ]然后在路由函數(shù)中遍歷這個列表返回第一個滿足條件的target。專用路由節(jié)點如果路由邏輯極其復(fù)雜可以將其作為一個獨立的節(jié)點。這個節(jié)點不干別的只負責(zé)計算下一個節(jié)點名稱并返回。這樣可以將路由邏輯從conditional_edge中分離出來便于單獨測試和優(yōu)化。5.3 并行與同步的坑問題像我們例子中想并行執(zhí)行web_search和local_doc但簡單的add_edge無法實現(xiàn)真正的并發(fā)最終變成了順序執(zhí)行。解決方案使用Pregel的并發(fā)特性LangGraph 底層基于 Pregel 模型。要實現(xiàn)真正的并發(fā)需要將多個節(jié)點添加到同一個“層”并正確配置它們的依賴關(guān)系。這通常涉及更底層的StateGraph配置或者使用Channel的概念。對于大多數(shù)應(yīng)用如果并發(fā)不是性能瓶頸順序執(zhí)行簡化版也足夠清晰。明確聚合點如果必須并發(fā)一定要設(shè)計一個明確的“聚合節(jié)點”該節(jié)點等待所有并發(fā)分支的輸出都就緒后再執(zhí)行后續(xù)操作。可以在 State 中設(shè)置標(biāo)志位或者利用 LangGraph 更高級的Channel和Barrier原語。5.4 LLM 調(diào)用成本與延遲問題圖中每個節(jié)點都調(diào)用 LLM導(dǎo)致單次運行成本高、速度慢。解決方案緩存對內(nèi)容變化不大的查詢?nèi)纭翱偨Y(jié)以下文本”這類提示詞固定、輸入變化不大的操作使用 LLM 調(diào)用緩存。LangChain/LangGraph 社區(qū)有一些緩存集成方案。批處理將多個小的、獨立的 LLM 調(diào)用合并成一個批處理提示。例如分析節(jié)點中需要評估多個信息來源的可信度可以設(shè)計一個提示詞讓 LLM 一次性對所有來源打分而不是循環(huán)調(diào)用 N 次。模型分級不是所有步驟都需要 GPT-4。對于信息提取、簡單分類等任務(wù)使用更便宜、更快的模型如 Claude Haiku, GPT-3.5-Turbo。只在需要深度推理、創(chuàng)意生成或關(guān)鍵決策時使用大模型。異步調(diào)用如果圖中有真正的并發(fā)節(jié)點確保使用異步的 LLM 客戶端如openai.AsyncOpenAI來并行執(zhí)行這些調(diào)用而不是同步等待。5.5 調(diào)試與可視化困難問題圖執(zhí)行到哪一步了State 變成什么樣了為什么卡住了解決方案善用日志在每個節(jié)點的開始和結(jié)束打印關(guān)鍵信息包括傳入的 State 片段和返回的更新。使用結(jié)構(gòu)化的日志格式如 JSON方便搜索和分析。利用檢查點不僅為了持久化檢查點也是強大的調(diào)試工具。你可以在任何步驟暫停檢查保存的 State 快照。圖形化調(diào)試app.get_graph().draw_mermaid_png()生成流程圖幫你宏觀理解邏輯。對于單次運行可以手動記錄每個節(jié)點的輸入輸出繪制出實際的執(zhí)行路徑圖。單元測試子圖將復(fù)雜的子圖單獨編譯和測試用固定的輸入驗證其輸出是否符合預(yù)期。這比測試整個大圖要容易得多。構(gòu)建 LangGraph Agent 是一個迭代過程。從最簡單的線性流程開始逐步添加分支、循環(huán)、并行和錯誤處理。時刻記住狀態(tài)機的基本思想當(dāng)前狀態(tài) 事件/條件 下一個狀態(tài)和動作。用這個思維模型去設(shè)計你的節(jié)點和邊你會發(fā)現(xiàn)再復(fù)雜的業(yè)務(wù)邏輯也能被清晰地建模和實現(xiàn)。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
婷婷五月天av| 色开心五月婷婷丁香HD| 五月丁香六月婷婷开心网| 潮汕成人AV片在线| 99国产精品白浆在线观看免费| 天天操夜夜玩!| 中文字幕av久久爽| 国产成人精品亚洲线观看| www.十八禁不禁AV.com| 亚洲高清在线| 亚洲色无码A片一区二区麻豆| 九九在线这里只有精品视频| 五月天激情综合网站| 大香蕉久久综合网| 91狠狠综合久久久久久| 日韩欧洲亚洲| 天天做天天爱天天爽| 99热这里只有精品26| 人五月天婷婷喷水| 伊人在线视频| 伊人色综合网| 99热只有| 二色av| 五月婷婷综合色拍| 99er6免费视频热播| 激情五月综合网丁| 丁香婷婷综合激情五月色| 在线观看亚洲AV| 婷婷伊人激情婷婷| AV天堂淫乩| 99只有精品9| 免费观看亚洲AV片| 亚洲免费99| 99热精品6| 婷婷激情五月| www.99日本| 操人妻AV| 天天插天天爽| 色婷婷香蕉| 久久天天| 五月婷婷五月天在线 | 亚洲成人va| 婷婷五月天 偷拍| 久久久人妻人伦| 久9久9久9久9久9久9| 成人毛片在线免费观看| 成人精品在线| 婷色成人| 五月婷成人网| 在线看片av| 1区2区视频| 丁香五月六月婷婷殴美综合| 色婷婷小说网| 婷婷丁香色五月| 激情综合网五月丁香| 日韩欧美成人片| 久久激情天堂| 天天日天天舔| 97在线日本| www99精品亚| 色婷婷yy久| 91久久18| 日本色色网| 色噜噜狠狠色综| 思思久ren热| www.色婷婷。com| wwccc久久久| 五月天六月婷| 这里只有精品视频在线| 区啪精品| 亚洲天堂亚洲色色色| 狠狠干青青草| 亚洲精品电影| www.久久99精品| 久一网站| 五月综合六月婷婷| 婷婷香五月天| 俺去婷婷 丁香| 五月综合丁香婷婷| 人人操人人爱丁香五月| 色色五月天婷婷| 99只有精品| 丁香五月大香蕉在线99| 玖玖爱综合网| 岛国AV网站| 区美毛片子| 婷婷五月综合在线| 大香av| 噜噜噜噜噜在线| 美女主播野战视步页| 色色色色色网站| 色综合久久99色| 五月天激情婷婷| 亚洲天堂AV综合网| 国产阿姨日皮艹逼内射视频 | 一起草av| 人人九色| 色婷婷社区| 色综合久久天天综合网| 免费超碰在线| 99精品无码网站| 婷婷综合色色| 免费人人操| 狠狠做五月婷婷| 色婷婷AV在线| 婷婷五月精品| 婷婷久久六月费| 26uuu丁香婷婷五月| 丰满人妻一区二区三区| 爱射综合| 99精品亚洲| www,久久久人人| 色色网站观看| 99性爱| 欧美亚洲成人在线| 很很干夜夜干| av婷婷丁香| .操區COm| 67194国产| 激情久久网| 久久性爱网站| 91九九九九| 五月丁香激情综合网| 丁香五月激情鲁| 大地9中文在线观看免费高清| 精品女人九九九| 99er精品视频| 激情婷婷综合网| 久色中文| 影音先锋AV资源男人站| 99在线视频在线观看| 天天干天天操天天爽| www.久久久久久久久久久| 爱草视频在线观看| 91色呦哟| 色欲天天综合| 91一道本| 五月激情综合网| 射琪琪| 午夜做爱影院| 五月婷婷,六月婷婷| 开心日韩丁香婷婷五月| 九色成人AV在线| 狠狠狠人妻| 丁香六月啪啪| 五月精品免费XXX| 亚洲三A| 激情综合激情五月| www.99色在线| 五月天综合| 丁香五月婷婷高清| 久久激情五月天| 欧美天堂久久| 五月天色五月| 六月 丁香 视频| 久久婷婷五月综合色天| 激情综合五月天| 五月丁香毛片| 26uuu成人网| 色婷婷综合网| 操精品9| 亚洲综合婷婷六月丁香五月| 538任你爽视频不一样的| 日日噜噜夜夜狠狠久久丁香五月| 久月婷婷| 久久桃花网色婷婷| 五月丁香六月婷婷色情| 丁香六月婷婷缴情欧美| 永久天堂日本| 久久久婷婷| 婷婷久久午夜网| 成人国产欧美大片一区| 五月天社区| 亚洲黄色精品| 婷婷色色综合| 激情小说在线视频| 美女妹子后射视频网站在线观看| 色婷婷大香蕉| 91夫妻视频| 亚洲激情97五月天| 九九国产精视频| 一本大道嫩草AV无码专区| 亚洲 小说 欧美 激情 另类| 碰97久久| 99热8在线| 久青草影院| 激情五月综合网最新| 99视频这里有精品| 九九99久久| 99色热| 香蕉久久av一区二区三区| 怡红院一二三| 色综合天天网| 日韩无码成人电影| 久久九九囯产| 9久久狠狠的| 色色AV色色色东莞| 日韩欧美四五区| 亚洲无码免费看| 色色色综合网| 丁香婷婷激情| 九九精品在线观看视频6| 99精品久久久久| 日日日日日| 亚洲婷婷免费| www.夜夜騎夜夜狠| 色五月激情问网站| 六月婷婷av| 91精品91久久久久77777| 99人妻碰碰碰久久久久视| 亚洲色婷婷网站| 丁香五月色网| 超级97碰碰| 国产亚洲精品久久久久久郑州| 国产性爱亚洲是图| 婷婷五月天婷婷| 99热99网| site:xiongshengzz.com| 五月丁香 狠狠爱| av人人干| 天天色视频| 亚洲va在线∨a天堂va欧美va| 2014天天爽| 99热第一页| 中文字幕日产A片在线看| 色婷婷天堂| 99热在线观看| 五月丁香六月婷综合成人综合| 色综合天天综合成人网| 国产精品五月天婷婷| 久色视频首页| 日韩婷婷五月天| www.超碰在线| 99视频精品全部免费看| 久久五月天婷婷| 丁香五月777| 久久99草五月婷婷| 亚洲天堂AV综合网| 激情av网| 激情人妻综合| 五月丁香综合激情| 无码九九| 日韩黄黄| 开心五月深爱五月婷| 久久曰曰| 插插插丁香五月婷婷| 九九99精品| 97色啪| 国产亚洲av片| 欧美丁香五月| 性色婷婷| 99免费视频久久| 99久热在线精品| 婷婷综合视频| 99热这里只有精品4| 亚洲99在线| 99热66| 99热成人精品网站| 色五月激情综合网| 丁香婷婷久久| 丁香六月天婷婷色| 日本视频欧美观看免费| 任你草| 99精品热| 偷拍视频五月天| 色色色色色色色色色999| 97涩涩丁香五月天| 五月天成人小说| 欧洲色| 91热在线| 无码少妇高潮喷水A片免费| 久草热8精品视频在线观看| 色五月婷婷五月天| 涩婷婷视频快播人妻| 99色.com| 日本女va| 欧美爆乳一区二区三区| 激情九月婷婷| 天天干在线播放| 丁香五月婷婷综合91| 久青操| 精品久热| 色天天综合| 婷婷五月天AV| 国产一区二区三区影院| 4399欧美另类视频| 老司机午夜福利视频金瓶梅| 丁香五月色欲| 天天爽天天日| 青青操丝袜美腿| 久99久视频| 99久久精彩视频。| 99热激情| 九八Av| 97艹| 久久只这里有精品| 精品成人久久久久久久_一二三四视| 色五月天电影| 丁香五月天堂网AV| 南京搡BBBB搡BBBB| www.99久| 日本理论久久| 色婷婷丁香五月天激情综合网| 久久丁香五月婷| 91精品丝袜久久久久久| 丁香六月婷婷社区| 开心五月丁香啪| 在线色色| 色婷婷久久综| 洗浴中心操B视频| 色综合色综合网| 狠狠噪| 九九九热精品| 99这里| 久久er99热精品一区二区| 日本 色综合| 激情深爱综合| 婷婷五月天堂| 日韩三及成人AV片| 啄木鸟丝袜美女福利视频| 久久99热这里只频精品6学生| 午夜在线成人网站免费观看| 另类丁香五月天区图| 99在线免费视频| 影音先锋男人站,影音先锋男人色资源网,影音先锋AV最新资源站,影音先锋AV资源 | 五月天另类图片| 超碰久热| 丁香五月婷婷深爱综合激情| 婷婷色操| 亚洲秘 无码一区二区三区妃光/1| 欧美婷婷五月激情| 久久人人妻| 亭亭五月基地在线| 日日操夜夜爽| 亚洲 欧洲 国产 伦综合| 日日夜夜青青草| 人人操AV| 亚洲精品99| 欧美色婷婷| 久久精品国产AV一区二区三区 | 91啪啪网| 久热AA| 久久182| 久久成人综合五月天| 五月天六月色| 色五月婷婷天天干| 精品夜夜澡人妻无码AV| 6080av| 777精品久无码人妻蜜桃| 五月六月播婷婷| 五月丁香无码| 一起草AV| 五月丁香综合| 五月天自拍视频| 欧美美女视频| 亚洲激情综合五月婷婷啪啪| 99精品综合在线| 天天操天天草天天草天天| 激情五月婷婷视频| 99热在线观看精品免费| 五月婷婷六月丁香玖玖玫瑰91| www激情com| 另类婷婷五月天啪帕帕| 夜夜爽天天干| 九九热免费| 91超级碰| 日本一级淫| 清色五月天| 亚洲精品V天堂中文字幕 | 国产女人十八水真多1| 五月第四色| 久久婷婷激情四射五月天| 99精品在这里| 97干在线视频| 99re热视频这里只精品| 拳交大逼| 99久久精品色老| 色色婷婷五月天| 女人露出p毛视频www网站| 狠狠操天天干| 久播影院免费观看电视剧大全最新网| 亚洲综合一区二区| 丁香色婷婷| 久久这里只有精品网| 亚洲九九99精品视频在线播放| 色婷婷激情五月天| 99re热精品在线视频| 99亚洲视频| 人妻肉射免费观看| 欧美色色色色色色色| 色色五月丁香| 天天爽夜夜爽夜夜爽精品视频| 伊人9在线| 91丨九色丨东北熟女| 在线播放人妻| 日韩久久视频| 五月丁香花开综合网| 激情久久网| 五月丁香六月欧美综合网站| 人妻VideOssS人妻高清| 狠狠操综合| 精品香蕉99久久久久网站| 久久婷婷视频| 婷婷永久在线| 影音先锋一区二区三区| 亚洲182在线观看| 久久综合五月天| 思思热精品免费视频| 久久婷婷五月激情综合| 国产FREESEXVIDEOS性中国| 夜夜夜夜夜操| 嫩草AV久久伊人妇女超级A| 欧美A级成人婬片免费看理论| 婷婷五月天在线观看| 亚洲国产精品成人免费一区久久久在线观看AAAA | 91精品国产日韩91久久久久久国模| 天天舔天天爽| 综合伊人久久| 噜噜久| 激情婷婷五月亚洲| 超碰在线9| 69五月天视频| 天搞天天天天天| 日韩久久欧亚| 九九色网专区| 亚洲爆乳无码精品AAA片蜜桃| 亚洲激情婷婷| 精品三区影院| 五月天色导航| 九九九九九无码| 综合一区二区三区| 伊人久久综合| 97自拍视频网| 人妻有码乱操| 新激情五月天| 成人做爰高潮A片免费视频| 情色五月天网站| 五月婷婷69| 中文aV网| 开心五月丁香综合久久| 婷婷五月激情热播| 丁香五月综合高清在线| 亚洲美女高潮久久久久久69| 成人电影AV在线观看| 抽插特写| 日本97在线观看| 四川BBB搡BBB爽爽视频| 蜜桃成语时李时珍 免费| 97在线视频观看| 久99久视频| 久久婷婷久久| 97碰在线视频| 天天爱天天做天天日| 人人操人人爽成人AV| 殴美97色| 99久久精品亚洲综合| 97人人操com| 日噜噜色| 狠狠草网| 淫视馆AV在线| 亚洲激情综合| 老司机午夜福利视频金瓶梅| 99热6这里只有精品6| WWW,激情五月天,COM| 91狠狠综合久久久久久| 开心深爱五月天| 亚州欧美国产久精国产99综合视频| 日本久久精品| 久久亚洲婷婷综合色五月| 久久五月丁香婷婷| 五月天婷婷青青| 99色热视频| 99爱最新免费视频在线观看| 99成人免费视频| 激情婷婷22月间| 日韩无码91| 婷婷色在线播放| 色婷婷888| 99色综合| 丁香五月网在线观看| 天天视频亚洲| 婷婷丁香激情综合色情| 五月色婷婷AV| AV性爱网| 99热免费观看| 五月天久久小说| 日本理论久久| 五月天激情综合网俺也去| 888精品福利地址| 情情五月天色| www.五月丁香| 天天色情站| 一本到不卡高清DVD| av五月丁香婷婷网| 久色网| 色婷婷丁香特级性爱视频| 五月丁香无码视频| 狠狠色婷婷| 国产伦亲子伦亲子视频观看| 99热www| 久综合色| 一本综合丁香日日狠狠色| 天天日天天干天天爽| 9色在线视频| 五月天色五月| 色娸娸综合网| 五月色俺婷婷| 九九在线精点品| 婷婷五月丁香五月基地| 超碰人人在线| 直接看的AV| 色五月丁香五月| 超碰九热| 丁香五月天激情婷婷丁香六月| 91人人人人人人人| 五月天激情综合首页| 五月天色婷婷成人| 午夜不卡久久精品无码免费 | 丁香五月手机在线| 婷婷激情六月天视频| 九九色99| 人人妻人人澡人人爽| site:jszngf.com| 六月天婷婷| 夜夜穞天天穞狠狠穞AV美女按摩| 日本在线视频播放91| 五月丁香六月情婷婷久久| 五月婷婷色| 婷婷五月色播天| 这里只有精彩小视频视频网站| 婷婷综合色播网| 色综合伊人网| 婷婷伊人网| 99re这里| 色色草97| 日韩操逼小电影| 女人天堂AV| 一区二区免费看| 日日夜夜小色哥| 日本三级大片| 亚洲 综合中文| 99riAv1国产在线观看| 亚洲av电影网站| 6月丁香婷婷激情| 91九九| 婷婷伊人75| 另类视屏| 狠狠干天天日| 日本三级色| 五月综合色播播丁香婷婷| www.久久| 三区激情四射av| 色五月综合在线| 亚洲在线操| 色爱综合网| 激情AV中文| 天天爽天天摸| 99热最新国内| 五月婷婷自拍视频| www91色网站| 99热99热| 国产高清视频91九九九久久久| 99热九九在线| 亚洲综合色婷婷文学| 热久久国产视频| 亚洲成人在线在线| dingxiangtingtingliuyue| 四川BBB搡BBB搡多人乱亂| 99亚洲综合| 久99视频| 另类小说婷婷色| 成人超碰网| 五月情涩综合婷婷| 玖玖热99| 91九色丨国产丨爆乳| 91avse| 九九热99热| 超碰三级秋霞| 亚洲欧美日韩VIP| 麻豆五月丁香婷婷| 99热99| 欧美日韩成人在线| 五月天婷婷激情| 色五月婷婷激情五月| 亚洲激情四射色| 天天情色综合网| 丁香色影院| 日韩久久视频| 色五月丁香一区在线| 国产AV影片| 91精品综合久久久久久五月丁香 | 九九热在线99| www.色五月| 婷婷五月天com| 黄色aa观看aaguochan| 色婷婷的五月天| 99ri精品| 丁香激情综合| 久久婷婷内射| hd五月婷婷在线| 亚洲婷婷综合视频| 久草热在线视频| 五月天婷婷影院影院| 欧美亚洲成人在线| 色婷婷在线视频| 天天操屄网| 久久激情视频| 99久久人人| 69精品人人人人| www.五月丁香av| 一级精品999WWW| 做爰丰满少妇1313| 五月天婷婷免费| 天天综合干| 狠狠操狠狠插| 丁香五月综合图片在线观看| 亚洲av无码精品色午夜| www.激情| 99热99精品| 五月婷婷在线网站| www.色综合| 在线播放 精品| 色激情综合| av网站中文| 久久丁香五月综合六月激情红杏视频| 91主播在线| 久久久久9999| 伊人玖玖精品| 色五月天本日| 亚洲色婷婷网站| 人人干99| 色婷婷无吗| 成人无码精品1区2区3区免费看| 99综合| 99精品视频在线| 久草天堂| 99热丁香| 亚洲AVwwwwwww| 久久人妻熟女一区二区| 五月天婷婷色色| 五月天婷久精视频| 五月丁香婷婷激情澎湃四射| 婷婷五月激情基地| 五月婷婷色| 99九九视频| 国产精品成av人在线视午夜片| 99在线观看精品视频| 色婷婷亚洲婷婷| 日本五月视频| 丁香六月天婷婷开心综合| 99热99在线| 亚洲无码色| 婷婷五月电影| 九九热免费视频| 日本五月天一页| www.五月激情红色| 99久久成人| 激情婷婷亚洲五月| 99热在线99| 天天综合网、天天综合色 | 天天日天天添| 五月天激情综合网俺也去| 久久性刺激| 干一干xxxx| 888久久久| 91丁香色五月| 欧美婷婷丁香五月| 99干99| 91色吧网| 成人婷99最新| 国产激情久久久| 激情久久久| 久久激情视频99| 九九国产视频| 国产精品五月丁香| 色婷五月丁香久亚洲| 美女主播野战视步页| 伊人丁香婷婷东京| 久久久久人妻精选| 99在线精品视频| 五月婷婷丁香啪啪| 可以直接看的AV| 狠狠干综合| 国产99久久久国产精品免费看| 五月天伊人| 成人国产网站在线免费看| 激情九月婷婷九月| 91天堂网综合| 五月丁香婷婷中文| 超pen个人视频97| 婷婷婷婷午夜| 人人综合91网| 久草大| 多精窝99在线视频| 色婷婷丁香五月综合| 五月色综合网| 色屌丝中文字幕| 99ER热精品视频| 亚洲中文字幕在线电影| 久久综合影院| 婷婷久久视频| 色婷婷丁香五月天在线观看| 五月天久久婷婷| 专区无日本视频高清8| 久草免费福利视频| 色婷婷操逼| 天天干天天日日| 天天摸天天做天天爱天天爽| 夜夜骑夜夜撸| 色天使色综合| 久久久婷| 色五月婷婷色五月| 色日本五月天| 日韩三级视频一区二区| 婷婷综合激情| 婷婷色狠狠| 五月天久久久| 婷婷五月成人社区| 秋霞黄色一级久久| 久色婷婷200| 日本高清久久| 操逼六区| 五月天艹天天| 伊人五月天在线| 久久九九99.www| www.主妇. com| 5月丁香啪啪啪| www久久久| 中文在线成人| 亚洲 无码 中文字幕 中出| 九九re精品视频在线观看| 日日狠夜夜狠| 97人人操人人干| 九九精品热播| 五月婷婷亞洲中文| 99热综合| 五月婷中文字幕| 久热网在线视频| 爱射综合| 九九九九毛片| 国产在这里只有精品| 极品少妇XXXX精品少妇偷拍| 丁香五月另类色婷婷麻豆| 91精品综合久久久久久五月丁香 | 丁香五月电影| 丁香五月激情综合| 在线观看日韩12345区| 激情宗合哪里能看| 99热播放| 99热在线资源| 婷婷免费视频| 香蕉99网| 亚洲第一视频 久久| 精品一二三区久久AAA片| 人人操91| 亚洲综合久| www.99热这里精品| 丁香五月另类小说| 婷婷五月综合中文字幕| 开心五月婷婷在线视频免费观看| 大香蕉AV在线| 色婷婷中文字母五月丁香| www.色综合| 久久久久久99精品无码| 丁香五月激情婷婷婷婷在线观看| 日操熟女| 国产另类综合| 在线观看视频1区| α久久| 亚洲亚洲人成综合网络| 伊人五月婷婷| 天天爽天天干| 色的色综合| 性无码专区无码| 综合激情五月综合激情五月激情1| 欧美婷婷五月丁香| 色婷婷丁香网| 天天操天天插| 这里只有精品99www| 免费做A爰片77777| 欧爱综合视频| 色欲五月丁香| 婷婷色五月色| 日本黄色精品| 伊人久久大香线蕉av一区| 色99色| 欧美三日本三级少妇三99| 91综合色| 99re热视频这里只精品| 精a品a视a频| 嫩草AV久久伊人妇女超级A| 色色色色色色色综合| 青青久在线视频免费观看| 伊人婷婷激情| 色五月婷婷丁香凹凸| 婷婷五月天小说网| 激情五月色婷婷| 五月天丁香综合| 深爱婷婷基地| 嫩草极品| 久久这里只有精品99| 五月丁香激情综合六月涩涩爱| 99re视频在线播放| 天天激情综合| 综合色、色综合| 日韩五月丁香| 婷婷九月丁香| 99精品偷自拍| 五月开心久久| 欧洲永久精品| 色啪久| 99色在线观看视频| 丁香综合伊人| 婷婷久久婷婷色五月| AV在线免费播放| 六月婷婷视频| 丁香五月九九| 五月天伊人网| 天天爽天天摸| 久久婷五月婷| 欧美熟女视频 色婷婷| av人人干| 色9色| 亚洲第一av| 亚洲婷婷五月天| 色婷婷五月天天天干天天操天天爽| 六月丁香婷婷色狠狠久久| 欧美色婷婷| 停停五月丁香| 五月天婷婷午夜丁香| 亚洲日本三级片| 操99| 色爱亚洲| 综合逼五月激情婷婷| 亚洲操B视频| 免费看欧美成人A片无码| 激情图片五月天| 亚洲激情高潮| 97碰碰在线看视频免费| 99re欧美精品| 人人爱国产| 色在线视频网2025| 狠狠色性| 五月婷婷啪啪网| 国产三级在线播放| 国外亚洲成AV人片在线观看| 91.com男女操| 五月婷婷六月丁香在线视频| 婷婷五月天成人五月天| 99久久五月丁香野外| 99人妻碰碰久久久禁片| 色墦五月丁香| 国产激情在线| 色狠狠色综合| 激情五月天之五月婷婷| 色域五月婷婷丁香| 去色色五月天| 99在线视频观看| 五月婷婷综合在线| 久久婷五月婷| 婷婷五月综合啪| 日日夜夜综合| 初夜av| 狠狠香婷婷五月| 天天噜日日噜综合无码| 无码一级片| 成人精品免费在线观看| 久久视频在线视频| 婷婷色影院| 67194国产| 成人婷99最新| 秋霞AV淫| 欧美色色色色色色色色色色| 狠狠干夜夜干| 五月天五月天激情网| 亚州日本欧州韩美高青高潮一| 激情图片亚洲| 99免费综合网| 99热99色| 婷婷五月天堂网| 67194成I人在线观看线路1| 久久免费丁香| 色五月97| 中文字幕97超级碰| 欧美性猛交99久久久99| 9热在线观看| 色色色色色五月丁香| 一操久久| 99久久久久久www| 婷婷五月天AV在线| 在线资源av-超碰中文在线-成人AV| 91日综合欧美| 亚洲成人无码免费| 天天色99| 国产成人在线精品| 99热老网站| 99综合视频在线| 777.色色| 久久66精品| 亚洲久热无码| 欧美中文五月天| 婷婷五月天情色| 原琪琪色影院| 国产成人亚洲综合A∨婷婷| 天天干一干| 北京熟妇搡BBBB搡BBBB| av在线播放网站| 国产精品黑丝| 五月丁香六月婷婷成人| 97操操| 同性gv国产精品一区二区| 激情综合网婷婷久久| 另类激情五月| 天天天久久人人人合| 色色热| 亚洲成人五月天| 成人片黄网站色大片免费毛片| 欧洲MV日韩MV国产| 大香伊人婷婷| 婷婷天堂站| 深爱婷婷色| 玖玖热视频| 亚洲超碰在线| 国产欧美精品AAAAAA片| 日本熟女啪啪| 五月丁香性爱| 丁香五月天精品| 激情五月天 婷婷| 1024人妻| 亚洲AV成人无码精品| 超碰无码318604| 六月婷婷无码| 噜噜色噜噜网| 亚洲精品成人| 精品国产a| 一逼色综合| 99热最新网址| www.超碰在线| 婷婷五月天VI| 原琪琪色影院| 丁香五月婷婷成人网| 99re在线视频| 狠狠干最新地址| 婷婷欧美综合| 亚州精品久久久久AV无码| 超碰免费99| 五月综合激情啪啪啪啪啪| 久久最新色| 久噜久噜| 五月激情小说网| 婷婷五月综合免费在线| 婷婷五月激情热播| 亚洲激情另类| 亚洲妇女熟BBW| 五月丁香啪啪婷婷| 99热久草| 深爱五月婷婷| 9久国产精品| 九九性视频| 天天做天天爱| 91色噜噜狠狠狠狠色综合| 先锋资源 996| 色99网| 伊人综合婷婷| WWW激情五月天| 亚洲99热| 婷婷五月丁香欧洲| 五月丁香无码| 激情又色又爽又黄的A片| 久久婷婷五月综合精品蜜芽| 丁香欧美| 午夜不卡久久精品无码免费 | 亚洲精品欧洲精品| 综合婷婷久久| 丁香婷婷性久久| 天天天天做夜夜夜夜做| 日本天天色| 婷婷刺激综合| 伊人六月无码视频| 日本激情91| 亚洲视频在线网| 啪啪干伊人婷婷| 亭亭五月丁香五月天激情| www91久久| 婷婷五月天免费视频| 字幕网AV中文字幕| 中文字幕+乱码+中文字幕在线观看| 五月婷婷偷拍| 婷婷狠狠97| 色亚洲激情| 20253AV| 丁香六月婷婷色XXXX| 开心激情婷婷| 成人超碰AV| 99热这里| 狠狠操之狠狠操| 五月激情站| 午夜丁香丁香婷婷| 狠狠色综合网| 欧洲毛片基地c区| 99热在线中文字幕| 婷婷涩涩五月天| 国产欧美va| 丁香五月天堂网AV| 人人操五月天| 色狠狠综合入口| 丁香五月天亚洲视频| 91超级碰人人操| 婷婷激情五月天激情| 第四色色六月色综合| 亭亭五月天成人| 日本欧美啪啪| 婷婷va| 九九精品亚洲| 婷婷色九月| 五月激情视频| 丁香婷婷大香蕉| 五月丁香亭亭成人电影| 国产AV一区二区三区最新精品 | 日本精品。999| 国产SUV精品一区二区883| jiujiu无码五区| 中国操逼99| 色五月在线视频观看| 色原狠狠综合| 丁香五月91| 99re这里只有精品99| 99视频内射三四| 国产精品色色色色| 久草 tingting| 色婷婷激情| 色狠狠色| 国产AV一区二区三区最新精品 | 国产美女最新VA在线免费观看| 六月婷综合| 激情五月天综合婷婷网| 强伦轩人妻一区二区电影| 欧美25p| 久久奄也去色色网站| 超碰人人在线观看| 色五月五月天色婷婷色五月| 婷婷五月天综合网| 专区无日本视频高清8| 人妻久久久久久久久久| 五月丁香成年黄色| 色婷婷丁香五月| 五月天婷婷导航| 成人在线网站| 综合色图区| 久久久久久久合一狠狠做深爱| 99视频网址| 激情综合五月婷婷| 色五月综合在线| 婷婷综合激情| 色九四色| 久久久婷婷婷| 亚洲性图一区二区| 婷婷激情视频| 国产婷婷色综合AV蜜臀AV | 婷婷色五月天在线| 狠狠色丁香五月婷巨| 岛国AAAV| 九月色婷婷| 日日夜夜综合| 激情色播| www.九月婷婷丁香.com| 色五月天电影| 婷婷色激情五月天| 天天久久人人| 婷婷色色丁香| 九九热这里只有精品5| 亚洲AV久久久久久久久久久久久久久久 | 99热6色| 五月丁香六月婷婷啪啪综合| 玖玖九九9999在线观看视频精品| 婷婷色色五月| 五月天涩涩| 美女婷婷六月色| 98色花堂98t.R| 国产精品91抖高| 久久久久久欧美精品se一二三四| 丁香婷婷在线| 久久久色婷婷五月天| 丁香五月九九| 韩国中文字幕91| www.丁香五月| 成人精品亚洲性爱| 五月天婷婷在看| 超碰在线观看99| 91久久免费| 91午夜婷婷狠狠久久综合9色| 丁香五月香蕉| 久草视频一,二三四| 久久这里只有精品视频1| 深爱 五月天| 99这里有精品视频| 最新AV在线观看| 五月天丁香婷婷久久九| 超碰精品在线| 欧美日韩99| 亚洲va综合va国产va中文| 激情五月天色婷婷综合| 丁香六月色香蕉视频| 六月丁香av| 99热碰碰| 色天堂操| AV在线二十六页| 丁香狠狠干| 丰满少妇猛烈A片免费看观看| 六月丁香久久| 久久久久激情| 天天干天天拍| 深爱激情五月网| 国产色色色色| 伍月婷丁香花全集| 色综合久久88色综合中文字幕| 激情综合五月激情| 久9热| 五月天大香蕉| AV在线观看网站| 精品成人在线观看| 五月天婷婷基地综合网| 九月av在线| 9 9 9色色| 97精品综合久久内射| 97sese婷婷| 天堂在线婷婷| 婷婷丁香五月天大香蕉| bukadeavzaixian| 欧美婷婷九月| 色五月大| 色婷婷88| 久久草中文日韩欧美| 大香蕉天堂| 国产免费AV网站| 色婷婷狠狠爱| 丁香婷最新动态| 欧美丁香婷婷天天操| 熟女激情网| 天天噜天天爱| 五月天激情日色在线| 26uuu另类| 色色色无码| 美国十月色婷婷在线观看| 日本欧美成人片AAAA| 五月婷婷中文字幕| 丁香五月播播| 狠狠爱综合网| 天天色综网| 五月丁香综合久久夜夜| 婷婷色五月天色| av在线免费播放| 天天做天天爱天天摸| 97色五月天| 人人爽亚洲| 婷婷娌伦网| 亚洲综合激情五月久久| 色五月婷婷五月天| 九久久婷婷| 日韩无码91| 色色色999| 婷婷五月精品在线| 毛片色五月| 外国碰视频网站97| 99自拍视频在线| 人操综合| 9人人操人人看| 婷婷色女| 丁香五月婷婷色| 97在线综合| 欧美电影在线观看| 丁香六月婷婷社区| 五月天激情小说| 婷婷五月天a| 九九青草热| 色五月大香蕉| 色色综合热| 五月婷婷免费在线| 天天日天天干天天插天天射| 99国产精品久久久久久久久久久 | 色婷婷操逼| 色婷婷五月天成人网| 色色色色色色网| 综合色播| 97碰 在线视频观看| 色婷网| 五月天基地| 9+1视频网址| 视频一区二区在线| 五月婷色色| 国产精品视频久久99| 91美女被操| 国产av第一专区| 欧美在线视频99| 婷婷五月天激情文学| 五月丁香偷拍| 五月天婷婷涩涩| 26uuu色噜噜精品一区| www.五月天婷婷| 亚洲亚洲人成综合网络| www,五月天激情| 五月天基地| 激情com| 夜夜骑天天操| 欧美顶级少妇做爰HD| 五月婷婷综合影院| xx色综合| 激情综合婷婷| 9久热在线精品| 天天在线天天综合网色| 精品爆操| 久久九九99视频| 在线国产精品色| 五月丁香色综合| 97成人丁香| 女人天堂av| 另类专区在线观看| 91精品国产综合久久蜜芽解析速度| 视频免费精品免费精品免费精品免费精品免费精品免费精品免费99 | 夜夜干天天干| 国产黄大片在线观看画质优化| 91精品久久久久久久| 婷婷播5月| 婷婷欠久少妇| 琪琪理论片| 久久婷色| 五月天激情网址| 五月丁香操亭亭网| 色婷婷呢狠禁久禁| 欧美激情 日韩无码 婷婷 五月天| 天天综合精品| 久久久噜噜噜操操操| 亚洲Av入口| 99热综合| 538午夜激情| 天天肏视频| 偷拍91九色| 婷婷五月天天天| 丁香五月婷婷综合激情啪啪啪啪啪啪啪 | 欧美成人猛片AAAAAAA| 五月丁香六月婷婷亚洲天堂网站| 伊人久久大香线蕉av一区| 久热9热| 婷婷精品综合| 丁香五月之久操视频| 俺五月| 秋霞免费视频| 99热这里只有精品98| 婷婷五月丁香五月| 久碰视频| 思思热在线播放| 日本人妻A片成人免费看片| 欧美六月| 91一起操| jiZZdr| 影音先锋xfplay资源男人网| 俺去也婷婷| 五月婷婷丁香成人网| 五月色综合| 好吊操这里只有精品| www色色com| 丁香五月婷婷六月婷| 人妻丰满精品一区二区A片| 亚洲 无码 中文字幕 中出| 牛牛热这里只有jingpin| 五月天婷婷永久免费视频|