精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

AI Agents-7 | Muti-Agent的架構(gòu)解析 原創(chuàng)

發(fā)布于 2025-6-20 06:31
瀏覽
0收藏

在當(dāng)今快速發(fā)展的AI領(lǐng)域,多智能體架構(gòu)正逐漸成為解決復(fù)雜任務(wù)的強(qiáng)大工具。從簡(jiǎn)單的單智能體系統(tǒng)到復(fù)雜的多智能體協(xié)同,我們看到了AI在任務(wù)管理、資源分配和決策效率上的巨大潛力。今天,就讓我們深入探討多智能體架構(gòu)的魅力,看看它是如何通過不同的模式和策略,為我們的生活和工作帶來變革的。

一、單智能體與多智能體架構(gòu):選擇適合的路徑

在AI的世界里,單智能體架構(gòu)就像是一個(gè)“全能型選手”,它試圖用一個(gè)智能體來完成所有任務(wù),無論是瀏覽網(wǎng)頁還是處理文件操作。這種架構(gòu)在任務(wù)簡(jiǎn)單且明確時(shí)非常高效,但隨著任務(wù)復(fù)雜度的增加和工具數(shù)量的增多,單智能體系統(tǒng)往往會(huì)陷入困境。比如,當(dāng)智能體需要處理過多的工具或面對(duì)過于復(fù)雜的上下文時(shí),它可能會(huì)開始犯錯(cuò),甚至產(chǎn)生次優(yōu)或錯(cuò)誤的結(jié)果。

AI Agents-7 | Muti-Agent的架構(gòu)解析-AI.x社區(qū)

而多智能體架構(gòu)則像是一個(gè)“團(tuán)隊(duì)作戰(zhàn)”的模式,每個(gè)智能體專注于自己的領(lǐng)域和工具集。這種架構(gòu)在面對(duì)復(fù)雜、動(dòng)態(tài)的用例時(shí)表現(xiàn)得尤為出色,尤其是在需要專業(yè)知識(shí)和協(xié)作的場(chǎng)景中。例如,一個(gè)軟件開發(fā)項(xiàng)目中,可以有規(guī)劃者、研究者、數(shù)學(xué)專家等多個(gè)智能體協(xié)同工作,每個(gè)智能體各司其職,共同完成任務(wù)。

AI Agents-7 | Muti-Agent的架構(gòu)解析-AI.x社區(qū)

二、多智能體架構(gòu)的模式:解鎖協(xié)同的力量

多智能體架構(gòu)的魅力在于其多樣性和靈活性。不同的任務(wù)和場(chǎng)景需要不同的協(xié)同模式,下面我們來看看幾種常見的模式。

AI Agents-7 | Muti-Agent的架構(gòu)解析-AI.x社區(qū)

(一)并行模式:多任務(wù)處理的高效方式

并行模式是多智能體架構(gòu)中最直觀的一種。在這種模式下,多個(gè)智能體同時(shí)處理任務(wù)的不同部分。比如,我們需要對(duì)一段文本進(jìn)行總結(jié)、翻譯和情感分析,三個(gè)智能體可以同時(shí)開始工作,分別完成各自的任務(wù)。這種方式大大提高了任務(wù)處理的效率,因?yàn)樗梢猿浞掷枚嗪颂幚砥鞯牟⑿杏?jì)算能力。

AI Agents-7 | Muti-Agent的架構(gòu)解析-AI.x社區(qū)

AI Agents-7 | Muti-Agent的架構(gòu)解析-AI.x社區(qū)

代碼示例:

from typing import Dict, Any, TypedDict
from langgraph.graph import StateGraph, END
from langchain_core.runnables import RunnableConfig
from textblob import TextBlob
import re
import time

# 定義狀態(tài)
class AgentState(TypedDict):
    text: str
    summary: str
    translation: str
    sentiment: str
    summary_time: float
    translation_time: float
    sentiment_time: float

# 總結(jié)智能體
def summarize_agent(state: AgentState) -> Dict[str, Any]:
    print("總結(jié)智能體:正在運(yùn)行")
    start_time = time.time()
    try:
        text = state["text"]
        ifnot text.strip():
            return {
                "summary": "未提供文本進(jìn)行總結(jié)。",
                "summary_time": 0.0
            }
        time.sleep(2)
        sentences = re.split(r'(?<=[.!?]) +', text.strip())
        scored_sentences = [(s, len(s.split())) for s in sentences if s]
        top_sentences = [s for s, _ in sorted(scored_sentences, key=lambda x: x[1], reverse=True)[:2]]
        summary = " ".join(top_sentences) if top_sentences else"文本太短,無法總結(jié)。"
        processing_time = time.time() - start_time
        print(f"總結(jié)智能體:完成,耗時(shí) {processing_time:.2f} 秒")
        return {
            "summary": summary,
            "summary_time": processing_time
        }
    except Exception as e:
        return {
            "summary": f"總結(jié)錯(cuò)誤:{str(e)}",
            "summary_time": 0.0
        }

# 翻譯智能體
def translate_agent(state: AgentState) -> Dict[str, Any]:
    print("翻譯智能體:正在運(yùn)行")
    start_time = time.time()
    try:
        text = state["text"]
        ifnot text.strip():
            return {
                "translation": "未提供文本進(jìn)行翻譯。",
                "translation_time": 0.0
            }
        time.sleep(3)
        translation = (
            "El nuevo parque en la ciudad es una maravillosa adición. "
            "Las familias disfrutan de los espacios abiertos, y a los ni?os les encanta el parque infantil. "
            "Sin embargo, algunas personas piensan que el área de estacionamiento es demasiado peque?a."
        )
        processing_time = time.time() - start_time
        print(f"翻譯智能體:完成,耗時(shí) {processing_time:.2f} 秒")
        return {
            "translation": translation,
            "translation_time": processing_time
        }
    except Exception as e:
        return {
            "translation": f"翻譯錯(cuò)誤:{str(e)}",
            "translation_time": 0.0
        }

# 情感分析智能體
def sentiment_agent(state: AgentState) -> Dict[str, Any]:
    print("情感分析智能體:正在運(yùn)行")
    start_time = time.time()
    try:
        text = state["text"]
        ifnot text.strip():
            return {
                "sentiment": "未提供文本進(jìn)行情感分析。",
                "sentiment_time": 0.0
            }
        time.sleep(1.5)
        blob = TextBlob(text)
        polarity = blob.sentiment.polarity
        subjectivity = blob.sentiment.subjectivity
        sentiment = "Positive"if polarity > 0else"Negative"if polarity < 0else"Neutral"
        result = f"{sentiment} (Polarity: {polarity:.2f}, Subjectivity: {subjectivity:.2f})"
        processing_time = time.time() - start_time
        print(f"情感分析智能體:完成,耗時(shí) {processing_time:.2f} 秒")
        return {
            "sentiment": result,
            "sentiment_time": processing_time
        }
    except Exception as e:
        return {
            "sentiment": f"情感分析錯(cuò)誤:{str(e)}",
            "sentiment_time": 0.0
        }

# 合并節(jié)點(diǎn)
def join_parallel_results(state: AgentState) -> AgentState:
    return state

# 構(gòu)建圖
def build_parallel_graph() -> StateGraph:
    workflow = StateGraph(AgentState)
    parallel_branches = {
        "summarize_node": summarize_agent,
        "translate_node": translate_agent,
        "sentiment_node": sentiment_agent
    }
    for name, agent in parallel_branches.items():
        workflow.add_node(name, agent)
    workflow.add_node("branch", lambda state: state)
    workflow.add_node("join", join_parallel_results)
    workflow.set_entry_point("branch")
    for name in parallel_branches:
        workflow.add_edge("branch", name)
        workflow.add_edge(name, "join")
    workflow.add_edge("join", END)
    return workflow.compile()

# 主函數(shù)
def main():
    text = (
        "The new park in the city is a wonderful addition. Families are enjoying the open spaces, "
        "and children love the playground. However, some people think the parking area is too small."
    )
    initial_state: AgentState = {
        "text": text,
        "summary": "",
        "translation": "",
        "sentiment": "",
        "summary_time": 0.0,
        "translation_time": 0.0,
        "sentiment_time": 0.0
    }
    print("\n構(gòu)建新圖...")
    app = build_parallel_graph()
    print("\n開始并行處理...")
    start_time = time.time()
    config = RunnableConfig(parallel=True)
    result = app.invoke(initial_state, cnotallow=config)
    total_time = time.time() - start_time
    print("\n=== 并行任務(wù)結(jié)果 ===")
    print(f"輸入文本:\n{text}\n")
    print(f"總結(jié):\n{result['summary']}\n")
    print(f"翻譯(西班牙語):\n{result['translation']}\n")
    print(f"情感分析:\n{result['sentiment']}\n")
    print("\n=== 處理時(shí)間 ===")
    processing_times = {
        "summary": result["summary_time"],
        "translation": result["translation_time"],
        "sentiment": result["sentiment_time"]
    }
    for agent, time_taken in processing_times.items():
        print(f"{agent.capitalize()}: {time_taken:.2f} 秒")
    print(f"\n總耗時(shí): {total_time:.2f} 秒")
    print(f"各任務(wù)總耗時(shí): {sum(processing_times.values()):.2f} 秒")
    print(f"并行節(jié)省時(shí)間: {sum(processing_times.values()) - total_time:.2f} 秒")

if __name__ == "__main__":
    main()

(二)順序模式:按部就班的協(xié)同

AI Agents-7 | Muti-Agent的架構(gòu)解析-AI.x社區(qū)

順序模式則是一種“接力棒”式的協(xié)同方式。在這種模式下,任務(wù)按照一定的順序依次傳遞給不同的智能體,每個(gè)智能體的輸出成為下一個(gè)智能體的輸入。比如,在一個(gè)多步驟的審批流程中,團(tuán)隊(duì)負(fù)責(zé)人先審批,然后是部門經(jīng)理,最后是財(cái)務(wù)總監(jiān)。這種方式適合那些需要嚴(yán)格順序執(zhí)行的任務(wù)。

代碼示例:

from typing import Dict
from langgraph.graph import StateGraph, MessagesState, END
from langchain_core.runnables import RunnableConfig
from langchain_core.messages import HumanMessage, AIMessage
import json

# 團(tuán)隊(duì)負(fù)責(zé)人
def team_lead_agent(state: MessagesState, config: RunnableConfig) -> Dict:
    print("團(tuán)隊(duì)負(fù)責(zé)人:開始審批")
    messages = state["messages"]
    proposal = json.loads(messages[0].content)
    title = proposal.get("title", "")
    amount = proposal.get("amount", 0.0)
    ifnot title or amount <= 0:
        status = "Rejected"
        comment = "團(tuán)隊(duì)負(fù)責(zé)人:提案因缺少標(biāo)題或金額無效而被拒絕。"
        goto = END
    else:
        status = "Approved by Team Lead"
        comment = "團(tuán)隊(duì)負(fù)責(zé)人:提案完整且已批準(zhǔn)。"
        goto = "dept_manager"
    print(f"團(tuán)隊(duì)負(fù)責(zé)人:審批完成 - {status}")
    messages.append(AIMessage(
        cnotallow=json.dumps({"status": status, "comment": comment}),
        additional_kwargs={"agent": "team_lead", "goto": goto}
    ))
    return {"messages": messages}

# 部門經(jīng)理
def dept_manager_agent(state: MessagesState, config: RunnableConfig) -> Dict:
    print("部門經(jīng)理:開始審批")
    messages = state["messages"]
    team_lead_msg = next((m for m in messages if m.additional_kwargs.get("agent") == "team_lead"), None)
    proposal = json.loads(messages[0].content)
    amount = proposal.get("amount", 0.0)
    if json.loads(team_lead_msg.content)["status"] != "Approved by Team Lead":
        status = "Rejected"
        comment = "部門經(jīng)理:因團(tuán)隊(duì)負(fù)責(zé)人拒絕而跳過。"
        goto = END
    elif amount > 100000:
        status = "Rejected"
        comment = "部門經(jīng)理:預(yù)算超出限制。"
        goto = END
    else:
        status = "Approved by Department Manager"
        comment = "部門經(jīng)理:預(yù)算在限制范圍內(nèi)。"
        goto = "finance_director"
    print(f"部門經(jīng)理:審批完成 - {status}")
    messages.append(AIMessage(
        cnotallow=json.dumps({"status": status, "comment": comment}),
        additional_kwargs={"agent": "dept_manager", "goto": goto}
    ))
    return {"messages": messages}

# 財(cái)務(wù)總監(jiān)
def finance_director_agent(state: MessagesState, config: RunnableConfig) -> Dict:
    print("財(cái)務(wù)總監(jiān):開始審批")
    messages = state["messages"]
    dept_msg = next((m for m in messages if m.additional_kwargs.get("agent") == "dept_manager"), None)
    proposal = json.loads(messages[0].content)
    amount = proposal.get("amount", 0.0)
    if json.loads(dept_msg.content)["status"] != "Approved by Department Manager":
        status = "Rejected"
        comment = "財(cái)務(wù)總監(jiān):因部門經(jīng)理拒絕而跳過。"
    elif amount > 50000:
        status = "Rejected"
        comment = "財(cái)務(wù)總監(jiān):預(yù)算不足。"
    else:
        status = "Approved"
        comment = "財(cái)務(wù)總監(jiān):批準(zhǔn)且可行。"
    print(f"財(cái)務(wù)總監(jiān):審批完成 - {status}")
    messages.append(AIMessage(
        cnotallow=json.dumps({"status": status, "comment": comment}),
        additional_kwargs={"agent": "finance_director", "goto": END}
    ))
    return {"messages": messages}

# 路由函數(shù)
def route_step(state: MessagesState) -> str:
    for msg in reversed(state["messages"]):
        goto = msg.additional_kwargs.get("goto")
        if goto:
            print(f"路由:智能體 {msg.additional_kwargs.get('agent')} 設(shè)置跳轉(zhuǎn)到 {goto}")
            return goto
    return END

# 構(gòu)建 LangGraph
builder = StateGraph(MessagesState)
builder.add_node("team_lead", team_lead_agent)
builder.add_node("dept_manager", dept_manager_agent)
builder.add_node("finance_director", finance_director_agent)
builder.set_entry_point("team_lead")
builder.add_conditional_edges("team_lead", route_step, {
    "dept_manager": "dept_manager",
    END: END
})
builder.add_conditional_edges("dept_manager", route_step, {
    "finance_director": "finance_director",
    END: END
})
builder.add_conditional_edges("finance_director", route_step, {
    END: END
})
workflow = builder.compile()

# 主運(yùn)行器
def main():
    initial_state = {
        "messages": [
            HumanMessage(
                cnotallow=json.dumps({
                    "title": "New Equipment Purchase",
                    "amount": 40000.0,
                    "department": "Engineering"
                })
            )
        ]
    }
    result = workflow.invoke(initial_state)
    messages = result["messages"]
    proposal = json.loads(messages[0].content)
    print("\n=== 審批結(jié)果 ===")
    print(f"提案標(biāo)題:{proposal['title']}")
    final_status = "Unknown"
    comments = []
    for msg in messages[1:]:
        if isinstance(msg, AIMessage):
            try:
                data = json.loads(msg.content)
                if"status"in data:
                    final_status = data["status"]
                if"comment"in data:
                    comments.append(data["comment"])
            except Exception:
                continue
    print(f"最終狀態(tài):{final_status}")
    print("評(píng)論:")
    for comment in comments:
        print(f"  - {comment}")

if __name__ == "__main__":
    main()

(三)循環(huán)模式:持續(xù)改進(jìn)的協(xié)同

AI Agents-7 | Muti-Agent的架構(gòu)解析-AI.x社區(qū)

循環(huán)模式則像是一個(gè)“精益求精”的過程。在這種模式下,智能體們會(huì)不斷地迭代,根據(jù)其他智能體的反饋來改進(jìn)自己的輸出。比如,在代碼編寫和測(cè)試的場(chǎng)景中,代碼編寫智能體會(huì)根據(jù)測(cè)試智能體的反饋不斷優(yōu)化代碼,直到代碼通過所有測(cè)試為止。

AI Agents-7 | Muti-Agent的架構(gòu)解析-AI.x社區(qū)

代碼示例:

from typing import Dict, Any, List
from langgraph.graph import StateGraph, END
from langchain_core.runnables import RunnableConfig
import textwrap

# 定義狀態(tài)
class EvaluationState(Dict[str, Any]):
    code: str = ""
    feedback: str = ""
    passed: bool = False
    iteration: int = 0
    max_iterations: int = 3
    history: List[Dict] = []

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.setdefault("code", "")
        self.setdefault("feedback", "")
        self.setdefault("passed", False)
        self.setdefault("iteration", 0)
        self.setdefault("max_iterations", 3)
        self.setdefault("history", [])

# 代碼編寫智能體
def code_writer_agent(state: EvaluationState, config: RunnableConfig) -> Dict[str, Any]:
    print(f"迭代 {state['iteration'] + 1} - 代碼編寫智能體:生成代碼")
    print(f"迭代 {state['iteration'] + 1} - 代碼編寫智能體:收到反饋:{state['feedback']}")
    iteration = state["iteration"] + 1
    feedback = state["feedback"]
    if iteration == 1:
        code = textwrap.dedent("""
        def factorial(n):
            result = 1
            for i in range(1, n + 1):
                result *= i
            return result
        """)
        writer_feedback = "初始代碼已生成。"
    elif"factorial(0)"in feedback.lower():
        code = textwrap.dedent("""
        def factorial(n):
            if n == 0:
                return 1
            result = 1
            for i in range(1, n + 1):
                result *= i
            return result
        """)
        writer_feedback = "已修復(fù) n=0 的處理。"
    elif"factorial(-1)"in feedback.lower() or"negative"in feedback.lower():
        code = textwrap.dedent("""
        def factorial(n):
            if n < 0:
                raise ValueError("Factorial not defined for negative numbers")
            if n == 0:
                return 1
            result = 1
            for i in range(1, n + 1):
                result *= i
            return result
        """)
        writer_feedback = "已添加對(duì)負(fù)數(shù)輸入的錯(cuò)誤處理。"
    else:
        code = state["code"]
        writer_feedback = "未發(fā)現(xiàn)進(jìn)一步改進(jìn)的內(nèi)容。"
    print(f"迭代 {iteration} - 代碼編寫智能體:代碼生成完成")
    return {
        "code": code,
        "feedback": writer_feedback,
        "iteration": iteration
    }

# 代碼測(cè)試智能體
def code_tester_agent(state: EvaluationState, config: RunnableConfig) -> Dict[str, Any]:
    print(f"迭代 {state['iteration']} - 代碼測(cè)試智能體:測(cè)試代碼")
    code = state["code"]
    try:
        test_cases = [
            (0, 1),
            (1, 1),
            (5, 120),
            (-1, None)
        ]
        namespace = {}
        exec(code, namespace)
        factorial = namespace.get('factorial')
        ifnot callable(factorial):
            return {"passed": False, "feedback": "未找到階乘函數(shù)。"}
        feedback_parts = []
        passed = True
        for input_val, expected in test_cases:
            try:
                result = factorial(input_val)
                if expected isNone:
                    passed = False
                    feedback_parts.append(f"測(cè)試失?。篺actorial({input_val}) 應(yīng)該拋出錯(cuò)誤。")
                elif result != expected:
                    passed = False
                    feedback_parts.append(f"測(cè)試失?。篺actorial({input_val}) 返回 {result},預(yù)期為 {expected}。")
            except ValueError as ve:
                if expected isnotNone:
                    passed = False
                    feedback_parts.append(f"測(cè)試失?。篺actorial({input_val}) 意外拋出 ValueError:{str(ve)}")
            except Exception as e:
                passed = False
                feedback_parts.append(f"測(cè)試失敗:factorial({input_val}) 拋出錯(cuò)誤:{str(e)}")
        feedback = "所有測(cè)試通過!"if passed else"\n".join(feedback_parts)
        print(f"迭代 {state['iteration']} - 代碼測(cè)試智能體:測(cè)試完成 - {'通過' if passed else '失敗'}")
        history = state["history"]
        history.append({
            "iteration": state["iteration"],
            "code": code,
            "feedback": feedback,
            "passed": passed
        })
        return {
            "passed": passed,
            "feedback": feedback,
            "history": history
        }
    except Exception as e:
        print(f"迭代 {state['iteration']} - 代碼測(cè)試智能體:測(cè)試失敗")
        return {"passed": False, "feedback": f"測(cè)試錯(cuò)誤:{str(e)}"}

# 條件邊:決定是否繼續(xù)循環(huán)
def should_continue(state: EvaluationState) -> str:
    if state["passed"] or state["iteration"] >= state["max_iterations"]:
        print(f"迭代 {state['iteration']} - {'循環(huán)停止:測(cè)試通過' if state['passed'] else '循環(huán)停止:達(dá)到最大迭代次數(shù)'}")
        return"end"
    print(f"迭代 {state['iteration']} - 循環(huán)繼續(xù):測(cè)試失敗")
    return"code_writer"

# 構(gòu)建 LangGraph 工作流
workflow = StateGraph(EvaluationState)
workflow.add_node("code_writer", code_writer_agent)
workflow.add_node("code_tester", code_tester_agent)
workflow.set_entry_point("code_writer")
workflow.add_edge("code_writer", "code_tester")
workflow.add_conditional_edges(
    "code_tester",
    should_continue,
    {
        "code_writer": "code_writer",
        "end": END
    }
)
app = workflow.compile()

# 運(yùn)行工作流
def main():
    initial_state = EvaluationState()
    result = app.invoke(initial_state)
    print("\n=== 評(píng)估結(jié)果 ===")
    print(f"最終狀態(tài):{'通過' if result['passed'] else '失敗'},經(jīng)過 {result['iteration']} 次迭代")
    print(f"最終代碼:\n{result['code']}")
    print(f"最終反饋:\n{result['feedback']}")
    print("\n迭代歷史:")
    for attempt in result["history"]:
        print(f"迭代 {attempt['iteration']}:")
        print(f"  代碼:\n{attempt['code']}")
        print(f"  反饋:{attempt['feedback']}")
        print(f"  是否通過:{attempt['passed']}\n")

if __name__ == "__main__":
    main()

(四)路由器模式:智能分配任務(wù)

AI Agents-7 | Muti-Agent的架構(gòu)解析-AI.x社區(qū)

路由器模式則像是一個(gè)“任務(wù)分發(fā)中心”。在這種模式下,一個(gè)中央路由器智能體根據(jù)任務(wù)或輸入的內(nèi)容,決定調(diào)用哪些智能體。比如,在一個(gè)客戶支持系統(tǒng)中,路由器可以根據(jù)客戶的問題內(nèi)容,將問題分配給不同的支持團(tuán)隊(duì),如賬單團(tuán)隊(duì)、技術(shù)支持團(tuán)隊(duì)或普通咨詢團(tuán)隊(duì)。

AI Agents-7 | Muti-Agent的架構(gòu)解析-AI.x社區(qū)

代碼示例:

from typing import Dict, Any, TypedDict, Literal
from langgraph.graph import StateGraph, END
from langchain_core.runnables import RunnableConfig
import re
import time

# 定義狀態(tài)
class TicketState(TypedDict):
    ticket_text: str
    category: str
    resolution: str
    processing_time: float

# 路由器智能體
def router_agent(state: TicketState) -> Dict[str, Any]:
    print("路由器智能體:分析工單...")
    start_time = time.time()
    ticket_text = state["ticket_text"].lower()
    if any(keyword in ticket_text for keyword in ["billing", "payment", "invoice", "charge"]):
        category = "Billing"
    elif any(keyword in ticket_text for keyword in ["technical", "bug", "error", "crash"]):
        category = "Technical"
    elif any(keyword in ticket_text for keyword in ["general", "question", "inquiry", "info"]):
        category = "General"
    else:
        category = "Unknown"
    processing_time = time.time() - start_time
    print(f"路由器智能體:分類為 '{category}',耗時(shí) {processing_time:.2f} 秒")
    return {
        "category": category,
        "processing_time": processing_time
    }

# 賬單團(tuán)隊(duì)
def billing_team_agent(state: TicketState) -> Dict[str, Any]:
    print("賬單團(tuán)隊(duì):處理工單...")
    start_time = time.time()
    ticket_text = state["ticket_text"]
    resolution = f"賬單團(tuán)隊(duì):已審核工單 '{ticket_text}'。請(qǐng)檢查您的賬單詳情或聯(lián)系我們的賬單部門以獲取進(jìn)一步幫助。"
    processing_time = time.time() - start_time
    time.sleep(1)
    print(f"賬單團(tuán)隊(duì):完成,耗時(shí) {processing_time:.2f} 秒")
    return {
        "resolution": resolution,
        "processing_time": state["processing_time"] + processing_time
    }

# 技術(shù)支持團(tuán)隊(duì)
def technical_team_agent(state: TicketState) -> Dict[str, Any]:
    print("技術(shù)支持團(tuán)隊(duì):處理工單...")
    start_time = time.time()
    ticket_text = state["ticket_text"]
    resolution = f"技術(shù)支持團(tuán)隊(duì):已審核工單 '{ticket_text}'。請(qǐng)嘗試重啟您的設(shè)備或提交詳細(xì)的錯(cuò)誤日志以供進(jìn)一步調(diào)查。"
    processing_time = time.time() - start_time
    time.sleep(1.5)
    print(f"技術(shù)支持團(tuán)隊(duì):完成,耗時(shí) {processing_time:.2f} 秒")
    return {
        "resolution": resolution,
        "processing_time": state["processing_time"] + processing_time
    }

# 普通咨詢團(tuán)隊(duì)
def general_team_agent(state: TicketState) -> Dict[str, Any]:
    print("普通咨詢團(tuán)隊(duì):處理工單...")
    start_time = time.time()
    ticket_text = state["ticket_text"]
    resolution = f"普通咨詢團(tuán)隊(duì):已審核工單 '{ticket_text}'。更多信息,請(qǐng)參考我們的常見問題解答或通過電子郵件聯(lián)系我們。"
    processing_time = time.time() - start_time
    time.sleep(0.8)
    print(f"普通咨詢團(tuán)隊(duì):完成,耗時(shí) {processing_time:.2f} 秒")
    return {
        "resolution": resolution,
        "processing_time": state["processing_time"] + processing_time
    }

# 手動(dòng)審核團(tuán)隊(duì)
def manual_review_agent(state: TicketState) -> Dict[str, Any]:
    print("手動(dòng)審核團(tuán)隊(duì):處理工單...")
    start_time = time.time()
    ticket_text = state["ticket_text"]
    resolution = f"手動(dòng)審核:工單 '{ticket_text}' 無法分類。標(biāo)記為人工審核。請(qǐng)手動(dòng)分配到適當(dāng)?shù)膱F(tuán)隊(duì)。"
    processing_time = time.time() - start_time
    time.sleep(0.5)
    print(f"手動(dòng)審核團(tuán)隊(duì):完成,耗時(shí) {processing_time:.2f} 秒")
    return {
        "resolution": resolution,
        "processing_time": state["processing_time"] + processing_time
    }

# 路由函數(shù)
def route_ticket(state: TicketState) -> Literal["billing_team", "technical_team", "general_team", "manual_review"]:
    category = state["category"]
    print(f"路由:工單分類為 '{category}'")
    if category == "Billing":
        return"billing_team"
    elif category == "Technical":
        return"technical_team"
    elif category == "General":
        return"general_team"
    else:
        return"manual_review"

# 構(gòu)建路由器模式的圖
def build_router_graph() -> StateGraph:
    workflow = StateGraph(TicketState)
    workflow.add_node("router", router_agent)
    workflow.add_node("billing_team", billing_team_agent)
    workflow.add_node("technical_team", technical_team_agent)
    workflow.add_node("general_team", general_team_agent)
    workflow.add_node("manual_review", manual_review_agent)
    workflow.set_entry_point("router")
    workflow.add_conditional_edges(
        "router",
        route_ticket,
        {
            "billing_team": "billing_team",
            "technical_team": "technical_team",
            "general_team": "general_team",
            "manual_review": "manual_review"
        }
    )
    workflow.add_edge("billing_team", END)
    workflow.add_edge("technical_team", END)
    workflow.add_edge("general_team", END)
    workflow.add_edge("manual_review", END)
    return workflow.compile()

# 運(yùn)行工作流
def main():
    test_tickets = [
        "I have a billing issue with my last invoice. It seems I was overcharged.",
        "My app keeps crashing with a technical error. Please help!",
        "I have a general question about your services. Can you provide more info?",
        "I need assistance with something unrelated to billing or technical issues."
    ]
    for ticket_text in test_tickets:
        initial_state: TicketState = {
            "ticket_text": ticket_text,
            "category": "",
            "resolution": "",
            "processing_time": 0.0
        }
        print(f"\n=== 處理工單:'{ticket_text}' ===")
        app = build_router_graph()
        start_time = time.time()
        result = app.invoke(initial_state, cnotallow=RunnableConfig())
        total_time = time.time() - start_time
        print("\n=== 工單結(jié)果 ===")
        print(f"分類:{result['category']}")
        print(f"解決方案:{result['resolution']}")
        print(f"總處理時(shí)間:{result['processing_time']:.2f} 秒")
        print(f"總耗時(shí):{total_time:.2f} 秒")
        print("-" * 50)

if __name__ == "__main__":
    main()

(五)聚合模式:整合輸出

AI Agents-7 | Muti-Agent的架構(gòu)解析-AI.x社區(qū)

聚合模式則像是一個(gè)“信息匯總中心”。在這種模式下,多個(gè)智能體分別完成自己的任務(wù)后,將輸出傳遞給一個(gè)聚合智能體,由聚合智能體將所有結(jié)果整合成一個(gè)最終結(jié)果。比如,在社交媒體情感分析中,可以有多個(gè)智能體分別收集不同平臺(tái)的帖子并進(jìn)行情感分析,最后由聚合智能體生成一份綜合報(bào)告。

AI Agents-7 | Muti-Agent的架構(gòu)解析-AI.x社區(qū)

代碼示例:

from typing import Dict, Any, TypedDict, List
from langgraph.graph import StateGraph, END
from langchain_core.runnables import RunnableConfig
from textblob import TextBlob
import time
from typing_extensions import Annotated
from operator import add

# 定義狀態(tài)
class SocialMediaState(TypedDict):
    twitter_posts: List[str]
    instagram_posts: List[str]
    reddit_posts: List[str]
    twitter_sentiment: Dict[str, float]
    instagram_sentiment: Dict[str, float]
    reddit_sentiment: Dict[str, float]
    final_report: str
    processing_time: Annotated[float, add]

# 收集推特帖子
def collect_twitter_posts(state: SocialMediaState) -> Dict[str, Any]:
    print("推特智能體:收集帖子...")
    start_time = time.time()
    posts = [
        "Loving the new product from this brand! Amazing quality.",
        "Terrible customer service from this brand. Very disappointed."
    ]
    time.sleep(1)
    processing_time = time.time() - start_time
    print(f"推特智能體:完成,耗時(shí) {processing_time:.2f} 秒")
    return {
        "twitter_posts": posts,
        "processing_time": processing_time
    }

# 收集 Instagram 帖子
def collect_instagram_posts(state: SocialMediaState) -> Dict[str, Any]:
    print("Instagram 智能體:收集帖子...")
    start_time = time.time()
    posts = [
        "Beautiful design by this brand! #loveit",
        "Not impressed with the latest release. Expected better."
    ]
    time.sleep(1.2)
    processing_time = time.time() - start_time
    print(f"Instagram 智能體:完成,耗時(shí) {processing_time:.2f} 秒")
    return {
        "instagram_posts": posts,
        "processing_time": processing_time
    }

# 收集 Reddit 帖子
def collect_reddit_posts(state: SocialMediaState) -> Dict[str, Any]:
    print("Reddit 智能體:收集帖子...")
    start_time = time.time()
    posts = [
        "This brand is awesome! Great value for money.",
        "Had a bad experience with their support team. Not happy."
    ]
    time.sleep(0.8)
    processing_time = time.time() - start_time
    print(f"Reddit 智能體:完成,耗時(shí) {processing_time:.2f} 秒")
    return {
        "reddit_posts": posts,
        "processing_time": processing_time
    }

# 分析推特情感
def analyze_twitter_sentiment(state: SocialMediaState) -> Dict[str, Any]:
    print("推特情感智能體:分析情感...")
    start_time = time.time()
    posts = state["twitter_posts"]
    polarities = [TextBlob(post).sentiment.polarity for post in posts]
    avg_polarity = sum(polarities) / len(polarities) if polarities else0.0
    time.sleep(0.5)
    processing_time = time.time() - start_time
    print(f"推特情感智能體:完成,耗時(shí) {processing_time:.2f} 秒")
    return {
        "twitter_sentiment": {"average_polarity": avg_polarity, "num_posts": len(posts)},
        "processing_time": processing_time
    }

# 分析 Instagram 情感
def analyze_instagram_sentiment(state: SocialMediaState) -> Dict[str, Any]:
    print("Instagram 情感智能體:分析情感...")
    start_time = time.time()
    posts = state["instagram_posts"]
    polarities = [TextBlob(post).sentiment.polarity for post in posts]
    avg_polarity = sum(polarities) / len(polarities) if polarities else0.0
    time.sleep(0.6)
    processing_time = time.time() - start_time
    print(f"Instagram 情感智能體:完成,耗時(shí) {processing_time:.2f} 秒")
    return {
        "instagram_sentiment": {"average_polarity": avg_polarity, "num_posts": len(posts)},
        "processing_time": processing_time
    }

# 分析 Reddit 情感
def analyze_reddit_sentiment(state: SocialMediaState) -> Dict[str, Any]:
    print("Reddit 情感智能體:分析情感...")
    start_time = time.time()
    posts = state["reddit_posts"]
    polarities = [TextBlob(post).sentiment.polarity for post in posts]
    avg_polarity = sum(polarities) / len(polarities) if polarities else0.0
    time.sleep(0.4)
    processing_time = time.time() - start_time
    print(f"Reddit 情感智能體:完成,耗時(shí) {processing_time:.2f} 秒")
    return {
        "reddit_sentiment": {"average_polarity": avg_polarity, "num_posts": len(posts)},
        "processing_time": processing_time
    }

# 聚合結(jié)果
def aggregate_results(state: SocialMediaState) -> Dict[str, Any]:
    print("聚合智能體:生成最終報(bào)告...")
    start_time = time.time()
    twitter_sentiment = state["twitter_sentiment"]
    instagram_sentiment = state["instagram_sentiment"]
    reddit_sentiment = state["reddit_sentiment"]
    total_posts = (twitter_sentiment["num_posts"] +
                   instagram_sentiment["num_posts"] +
                   reddit_sentiment["num_posts"])
    weighted_polarity = (
        twitter_sentiment["average_polarity"] * twitter_sentiment["num_posts"] +
        instagram_sentiment["average_polarity"] * instagram_sentiment["num_posts"] +
        reddit_sentiment["average_polarity"] * reddit_sentiment["num_posts"]
    ) / total_posts if total_posts > 0else0.0
    overall_sentiment = ("Positive"if weighted_polarity > 0else
                         "Negative"if weighted_polarity < 0else"Neutral")
    report = (
        f"總體情感:{overall_sentiment} (平均極性:{weighted_polarity:.2f})\n"
        f"推特情感:{twitter_sentiment['average_polarity']:.2f} (帖子數(shù):{twitter_sentiment['num_posts']})\n"
        f"Instagram 情感:{instagram_sentiment['average_polarity']:.2f} (帖子數(shù):{instagram_sentiment['num_posts']})\n"
        f"Reddit 情感:{reddit_sentiment['average_polarity']:.2f} (帖子數(shù):{reddit_sentiment['num_posts']})"
    )
    time.sleep(0.3)
    processing_time = time.time() - start_time
    print(f"聚合智能體:完成,耗時(shí) {processing_time:.2f} 秒")
    return {
        "final_report": report,
        "processing_time": processing_time
    }

# 構(gòu)建聚合模式的圖
def build_aggregator_graph() -> StateGraph:
    workflow = StateGraph(SocialMediaState)
    workflow.add_node("collect_twitter", collect_twitter_posts)
    workflow.add_node("collect_instagram", collect_instagram_posts)
    workflow.add_node("collect_reddit", collect_reddit_posts)
    workflow.add_node("analyze_twitter", analyze_twitter_sentiment)
    workflow.add_node("analyze_instagram", analyze_instagram_sentiment)
    workflow.add_node("analyze_reddit", analyze_reddit_sentiment)
    workflow.add_node("aggregate", aggregate_results)
    workflow.add_node("branch", lambda state: state)
    workflow.set_entry_point("branch")
    workflow.add_edge("branch", "collect_twitter")
    workflow.add_edge("branch", "collect_instagram")
    workflow.add_edge("branch", "collect_reddit")
    workflow.add_edge("collect_twitter", "analyze_twitter")
    workflow.add_edge("collect_instagram", "analyze_instagram")
    workflow.add_edge("collect_reddit", "analyze_reddit")
    workflow.add_edge("analyze_twitter", "aggregate")
    workflow.add_edge("analyze_instagram", "aggregate")
    workflow.add_edge("analyze_reddit", "aggregate")
    workflow.add_edge("aggregate", END)
    return workflow.compile()

# 運(yùn)行工作流
def main():
    initial_state: SocialMediaState = {
        "twitter_posts": [],
        "instagram_posts": [],
        "reddit_posts": [],
        "twitter_sentiment": {"average_polarity": 0.0, "num_posts": 0},
        "instagram_sentiment": {"average_polarity": 0.0, "num_posts": 0},
        "reddit_sentiment": {"average_polarity": 0.0, "num_posts": 0},
        "final_report": "",
        "processing_time": 0.0
    }
    print("\n開始社交媒體情感分析...")
    app = build_aggregator_graph()
    start_time = time.time()
    config = RunnableConfig(parallel=True)
    result = app.invoke(initial_state, cnotallow=config)
    total_time = time.time() - start_time
    print("\n=== 情感分析結(jié)果 ===")
    print(result["final_report"])
    print(f"\n總處理時(shí)間:{result['processing_time']:.2f} 秒")
    print(f"總耗時(shí):{total_time:.2f} 秒")

if __name__ == "__main__":
    main()

(六)網(wǎng)絡(luò)模式(Network or Horizontal)

AI Agents-7 | Muti-Agent的架構(gòu)解析-AI.x社區(qū)

在多智能體系統(tǒng)中,網(wǎng)絡(luò)模式是一種去中心化的架構(gòu),智能體之間以多對(duì)多的方式直接通信,形成一個(gè)分散的網(wǎng)絡(luò)。這種架構(gòu)非常適合那些沒有明確智能體層級(jí)或調(diào)用順序的任務(wù)。

優(yōu)點(diǎn)與挑戰(zhàn)

優(yōu)點(diǎn)

  • 分布式協(xié)作:每個(gè)智能體都可以獨(dú)立運(yùn)行,即使部分智能體失敗,系統(tǒng)仍然可以正常工作。
  • 群體決策:智能體之間可以相互協(xié)作,共同做出決策。

挑戰(zhàn)

  • 通信管理:智能體之間的通信可能會(huì)變得復(fù)雜,導(dǎo)致效率低下。
  • 重復(fù)工作:如果沒有良好的協(xié)調(diào)機(jī)制,智能體可能會(huì)重復(fù)執(zhí)行相同的工作。

代碼示例:

from typing import Literal
from langchain_openai import ChatOpenAI
from langgraph.graph import StateGraph, MessagesState, START, END
from langgraph.types import Command

model = ChatOpenAI()

# 定義智能體 1
def agent_1(state: MessagesState) -> Command[Literal["agent_2", "agent_3", END]]:
    response = model.invoke(state["messages"])
    next_agent = response.get("next_agent", END)
    return Command(
        goto=next_agent,
        update={"messages": [response["content"]]}
    )

# 定義智能體 2
def agent_2(state: MessagesState) -> Command[Literal["agent_1", "agent_3", END]]:
    response = model.invoke(state["messages"])
    next_agent = response.get("next_agent", END)
    return Command(
        goto=next_agent,
        update={"messages": [response["content"]]}
    )

# 定義智能體 3
def agent_3(state: MessagesState) -> Command[Literal["agent_1", "agent_2", END]]:
    response = model.invoke(state["messages"])
    next_agent = response.get("next_agent", END)
    return Command(
        goto=next_agent,
        update={"messages": [response["content"]]}
    )

# 構(gòu)建圖
builder = StateGraph(MessagesState)
builder.add_node(agent_1)
builder.add_node(agent_2)
builder.add_node(agent_3)
builder.add_edge(START, "agent_1")
network = builder.compile()

(七)交接模式(Handoffs)

AI Agents-7 | Muti-Agent的架構(gòu)解析-AI.x社區(qū)

在多智能體架構(gòu)中,交接模式是一種常見的交互方式,其中一個(gè)智能體在完成自己的任務(wù)后,將控制權(quán)交給另一個(gè)智能體。這種模式允許智能體在執(zhí)行過程中靈活地將任務(wù)傳遞給其他智能體,甚至可以返回到自己。

代碼示例:

from langgraph.graph import StateGraph, MessagesState, START, END
from langgraph.types import Command

# 定義一個(gè)智能體
def agent(state: MessagesState) -> Command[Literal["another_agent"]]:
    # 假設(shè) get_next_agent 是一個(gè)函數(shù),用于決定下一個(gè)智能體
    next_agent = get_next_agent(state)
    return Command(
        goto=next_agent,
        update={"messages": ["Message from current agent"]}
    )

(八)監(jiān)督者模式(Supervisor)

監(jiān)督者模式是一種集中式的架構(gòu),其中有一個(gè)中央監(jiān)督者(Supervisor)智能體,負(fù)責(zé)決定下一個(gè)調(diào)用的智能體。這種模式適合需要集中管理和協(xié)調(diào)的場(chǎng)景。

代碼示例:

from langchain_openai import ChatOpenAI
from langgraph.graph import StateGraph, MessagesState, START, END
from langgraph.types import Command

model = ChatOpenAI()

# 定義監(jiān)督者
def supervisor(state: MessagesState) -> Command[Literal["agent_1", "agent_2", END]]:
    response = model.invoke(state["messages"])
    next_agent = response.get("next_agent", END)
    return Command(goto=next_agent)

# 定義智能體 1
def agent_1(state: MessagesState) -> Command[Literal["supervisor"]]:
    response = model.invoke(state["messages"])
    return Command(goto="supervisor", update={"messages": [response]})

# 定義智能體 2
def agent_2(state: MessagesState) -> Command[Literal["supervisor"]]:
    response = model.invoke(state["messages"])
    return Command(goto="supervisor", update={"messages": [response]})

# 構(gòu)建圖
builder = StateGraph(MessagesState)
builder.add_node(supervisor)
builder.add_node(agent_1)
builder.add_node(agent_2)
builder.add_edge(START, "supervisor")
supervisor_graph = builder.compile()

(九)層次化模式(Hierarchical)

層次化模式是一種樹狀結(jié)構(gòu),其中高級(jí)智能體(監(jiān)督者)管理低級(jí)智能體。這種架構(gòu)適合大型系統(tǒng),可以清晰地劃分角色和職責(zé)。

代碼示例:

from langchain_openai import ChatOpenAI
from langgraph.graph import StateGraph, MessagesState, START, END
from langgraph.types import Command

model = ChatOpenAI()

# 定義團(tuán)隊(duì) 1 的監(jiān)督者
def team_1_supervisor(state: MessagesState) -> Command[Literal["team_1_agent_1", "team_1_agent_2", END]]:
    response = model.invoke(state["messages"])
    next_agent = response.get("next_agent", END)
    return Command(goto=next_agent)

# 定義團(tuán)隊(duì) 1 的智能體 1
def team_1_agent_1(state: MessagesState) -> Command[Literal["team_1_supervisor"]]:
    response = model.invoke(state["messages"])
    return Command(goto="team_1_supervisor", update={"messages": [response]})

# 定義團(tuán)隊(duì) 1 的智能體 2
def team_1_agent_2(state: MessagesState) -> Command[Literal["team_1_supervisor"]]:
    response = model.invoke(state["messages"])
    return Command(goto="team_1_supervisor", update={"messages": [response]})

# 構(gòu)建團(tuán)隊(duì) 1 的圖
team_1_builder = StateGraph(MessagesState)
team_1_builder.add_node(team_1_supervisor)
team_1_builder.add_node(team_1_agent_1)
team_1_builder.add_node(team_1_agent_2)
team_1_builder.add_edge(START, "team_1_supervisor")
team_1_graph = team_1_builder.compile()

# 定義頂層監(jiān)督者
def top_level_supervisor(state: MessagesState) -> Command[Literal["team_1_graph", END]]:
    response = model.invoke(state["messages"])
    next_team = response.get("next_team", END)
    return Command(goto=next_team)

# 構(gòu)建頂層圖
top_builder = StateGraph(MessagesState)
top_builder.add_node(top_level_supervisor)
top_builder.add_node("team_1_graph", team_1_graph)
top_builder.add_edge(START, "top_level_supervisor")
top_builder.add_edge("team_1_graph", "top_level_supervisor")
top_graph = top_builder.compile()

(十)自定義工作流(Custom Multi-Agent Workflow)

AI Agents-7 | Muti-Agent的架構(gòu)解析-AI.x社區(qū)

自定義工作流允許開發(fā)者根據(jù)具體需求定義智能體之間的調(diào)用順序。這種模式結(jié)合了顯式控制流和動(dòng)態(tài)控制流的優(yōu)點(diǎn),提供了更高的靈活性。

代碼示例:

from langchain_openai import ChatOpenAI
from langgraph.graph import StateGraph, MessagesState, START

model = ChatOpenAI()

# 定義智能體 1
def agent_1(state: MessagesState):
    response = model.invoke(state["messages"])
    return {"messages": [response]}

# 定義智能體 2
def agent_2(state: MessagesState):
    response = model.invoke(state["messages"])
    return {"messages": [response]}

# 構(gòu)建圖
builder = StateGraph(MessagesState)
builder.add_node(agent_1)
builder.add_node(agent_2)
builder.add_edge(START, "agent_1")
builder.add_edge("agent_1", "agent_2")
custom_workflow = builder.compile()

三、智能體之間的通信:協(xié)同的關(guān)鍵

AI Agents-7 | Muti-Agent的架構(gòu)解析-AI.x社區(qū)

在多智能體系統(tǒng)中,智能體之間的通信是協(xié)同工作的核心。我們需要考慮以下幾個(gè)問題:

  1. 通過圖狀態(tài)還是工具調(diào)用通信?在大多數(shù)架構(gòu)中,智能體通過圖狀態(tài)通信。而在工具調(diào)用的架構(gòu)中,通信的內(nèi)容則是工具調(diào)用的參數(shù)。
  2. 不同狀態(tài)模式的智能體如何通信?如果一個(gè)智能體需要與其他智能體有不同的狀態(tài)模式,可以通過定義子圖智能體或具有私有輸入狀態(tài)模式的智能體節(jié)點(diǎn)來實(shí)現(xiàn)。
  3. 共享消息列表如何通信?最常見的通信方式是通過共享狀態(tài)通道(通常是消息列表)。智能體可以選擇共享完整的思考過程(“草稿”),也可以只共享最終結(jié)果。

四、多智能體架構(gòu)的優(yōu)勢(shì)與挑戰(zhàn)

多智能體架構(gòu)為我們解決復(fù)雜任務(wù)提供了強(qiáng)大的工具,但也帶來了新的挑戰(zhàn)。它通過并行、順序、路由器和聚合等多種工作流模式,實(shí)現(xiàn)了高效的協(xié)同工作。然而,隨著智能體數(shù)量的增加和任務(wù)復(fù)雜度的提升,如何管理智能體之間的通信、避免重復(fù)工作以及確保系統(tǒng)的可擴(kuò)展性,成為了我們需要面對(duì)的問題。

五、結(jié)論

多智能體架構(gòu)為我們提供了一個(gè)全新的視角來解決復(fù)雜任務(wù)。通過不同的協(xié)同模式和通信機(jī)制,我們可以構(gòu)建出高效、靈活且可擴(kuò)展的系統(tǒng)。無論是并行處理、順序執(zhí)行、智能路由還是結(jié)果聚合,多智能體架構(gòu)都能根據(jù)具體需求提供合適的解決方案。在未來,隨著AI技術(shù)的不斷發(fā)展,多智能體架構(gòu)必將在更多領(lǐng)域發(fā)揮更大的作用,為我們的生活和工作帶來更多的便利和效率。


本文轉(zhuǎn)載自??Halo咯咯??    作者:基咯咯

?著作權(quán)歸作者所有,如需轉(zhuǎn)載,請(qǐng)注明出處,否則將追究法律責(zé)任
標(biāo)簽
已于2025-6-20 11:25:04修改
收藏
回復(fù)
舉報(bào)
回復(fù)
相關(guān)推薦
亚洲日韩中文字幕| 中文字幕一区二区三区乱码| 99热一区二区三区| www香蕉视频| 久久99伊人| 久久伊人免费视频| 国产精品成人99一区无码| 91看片一区| 亚洲制服丝袜一区| 亚洲人成人77777线观看| 亚洲春色一区二区三区| 日韩av一级电影| 欧美极品美女电影一区| 欧美人妻一区二区三区| 国产精品宾馆| 911精品产国品一二三产区| 9久久9毛片又大又硬又粗| 日本不卡三区| 久久只精品国产| 成人免费在线一区二区三区| 国产亚洲欧美日韩高清| 亚洲天堂久久| 久久黄色av网站| 国产免费看av| 国产乱人伦精品一区| 欧美人妇做爰xxxⅹ性高电影| 国产午夜福利100集发布| 欧美日韩欧美| 久久久www成人免费毛片麻豆 | 亚洲精品白浆高清久久久久久| 国产精品无码专区av在线播放| 日韩久久一级片| 一区二区在线免费观看| 日韩激情综合| 九九热最新视频| 欧美性受xxxx黑人猛交88| 精品国产一区二区三区久久久蜜月 | 婷婷丁香花五月天| 激情av综合网| 国产精品流白浆视频| 青青草免费观看视频| 欧美99久久| 久久久久www| 丁香六月激情综合| 欧美色图在线播放| 亚洲午夜激情免费视频| aaaaaav| 欧美日韩一区二区三区不卡视频| 欧美成人一区二区三区在线观看| 亚洲免费成人在线视频| 欧美xxxx性| 欧美午夜一区二区三区免费大片| 午夜dv内射一区二区| 黄色成人免费网| 日韩欧美在线第一页| 免费观看日韩毛片| 91久久国产综合久久91猫猫| 欧美午夜宅男影院在线观看| 伊人成色综合网| 亚洲一级少妇| 91九色最新地址| 黑森林精品导航| 久久久久久一区二区三区四区别墅| 日韩欧美在线字幕| 999在线免费视频| 成人不卡视频| 欧美精品xxxxbbbb| 精品人妻一区二区乱码| 成人动态视频| 亚洲精品网址在线观看| 亚洲v国产v欧美v久久久久久| 一道在线中文一区二区三区| 亚洲高清不卡| 青梅竹马是消防员在线| 久久99精品久久久久久三级| 日韩av高清在线播放| 亚洲视频中文字幕在线观看| 九九热在线视频观看这里只有精品| 国产欧美在线视频| 国产毛片久久久久| av在线不卡电影| 日韩电影天堂视频一区二区| av电影在线观看一区二区三区| 综合久久国产九一剧情麻豆| 中文精品无码中文字幕无码专区| jizz一区二区三区| 日本福利一区二区| 亚洲免费黄色录像| 久久国际精品| 精品一区二区三区电影| 在线免费观看视频| 欧美99在线视频观看| 日本久久久久久久久| 一级片视频免费| 成熟亚洲日本毛茸茸凸凹| 鲁鲁狠狠狠7777一区二区| 在线视频91p| 亚洲国产一区视频| 亚洲欧美国产日韩综合| 8x国产一区二区三区精品推荐| 亚洲国产天堂久久国产91| 卡一卡二卡三在线观看| 91精品久久久久久久久久不卡| 97视频免费在线看| 一级黄色片视频| 91在线视频播放| 一级特黄妇女高潮| 日韩新的三级电影| 精品美女一区二区| 久久久久久久久福利| 狠狠噜噜久久| 91久久国产综合久久91精品网站 | 欧美精品黑人性xxxx| 玖玖爱在线精品视频| 久久五月天小说| 欧美在线观看网址综合| 午夜久久久久久久久久| 欧美国产日本视频| 91好吊色国产欧美日韩在线| 婷婷成人av| 亚洲欧美日韩中文在线制服| 久草视频在线资源站| 久久精品国产99国产| 久久久久久久免费| 丰满大乳少妇在线观看网站| 欧美日韩和欧美的一区二区| 免费观看一级一片| 伊人久久久大香线蕉综合直播| 国产精品久久久久免费a∨大胸 | 中文字幕手机在线视频| 波多野结衣在线一区| 女人床在线观看| 亚洲精品一区av| 色999日韩欧美国产| 日批视频免费在线观看| 91在线一区二区三区| 成年女人18级毛片毛片免费| 国产精品久一| 日韩在线观看免费| 中文字幕人妻一区二区在线视频| 久久亚洲欧美国产精品乐播| 熟女少妇在线视频播放| 国产suv精品一区| 欧美激情综合亚洲一二区| www.麻豆av| 亚洲精品日韩综合观看成人91| 亚洲美女爱爱视频| 97视频精品| 成人久久一区二区三区| 尤物网址在线观看| 欧美日韩成人一区二区| 日日操免费视频| 精品影院一区二区久久久| 中文视频一区视频二区视频三区| 成人精品国产| 久久精品国产精品| a在线观看免费| 亚洲线精品一区二区三区八戒| 国产裸体视频网站| 影音先锋中文字幕一区| 九色91在线视频| 男人最爱成人网| 在线午夜精品自拍| 一区二区www| 亚洲免费视频中文字幕| 极品白嫩的小少妇| 国产精品亚洲综合色区韩国| 欧美精品一区二区三区四区五区| 婷婷六月国产精品久久不卡| 一区二区亚洲欧洲国产日韩| 亚洲无码精品在线观看| 亚洲人成伊人成综合网小说| 99久久久无码国产精品性波多| av不卡免费看| 水蜜桃一区二区三区| 电影中文字幕一区二区| 久久久久久亚洲精品中文字幕 | 成人精品免费看| 久久无码高潮喷水| 久久高清免费| 国产精品视频免费一区| 另类专区亚洲| 久久亚洲一区二区三区四区五区高 | julia一区二区中文久久94| 黄色网址在线免费观看| 亚洲电影在线看| 中文字幕乱码人妻二区三区| 一区二区三区免费| 中文字幕在线看高清电影| 久久精品国产99国产精品| 2019日韩中文字幕mv| 成人国产精品一级毛片视频| 97se国产在线视频| 欧美大片免费| 欧美福利视频在线| 激情视频在线观看免费| 日韩欧美色综合网站| 激情五月婷婷网| 一区二区三区中文免费| 日韩一级av毛片| 成人免费毛片片v| 欧美午夜aaaaaa免费视频| 精品999成人| 一区二区三区精品国产| 久久97精品| 成人欧美一区二区三区在线湿哒哒 | 国内精品视频在线观看 | 国产香蕉在线观看| 欧美午夜精品理论片a级按摩| 久久久久久久黄色| 国产精品久久毛片av大全日韩| 漂亮人妻被黑人久久精品| 精品午夜久久福利影院 | 国产尤物一区二区在线 | 国产乱码精品一区二区三区av| 黄色成人在线看| 亚洲电影在线一区二区三区| 日本高清不卡一区二区三| 国产成人高清精品免费5388| 91久久国产综合久久91精品网站 | 91香蕉视频在线下载| 福利一区二区免费视频| 青青久久av北条麻妃黑人| 男女在线视频| 久久中文字幕在线| 91在线品视觉盛宴免费| 亚洲欧美成人网| 亚洲 欧美 精品| 亚洲电影免费观看| 成人免费公开视频| 欧美变态tickle挠乳网站| 亚洲天堂中文字幕在线| 欧美日韩中字一区| 波多野结衣理论片| 日韩欧美一区视频| 综合网在线观看| 欧美午夜激情在线| 日韩欧美一级视频| 五月婷婷久久综合| 日韩av电影网| 亚洲国产精品久久人人爱| 中文字幕亚洲欧美日韩| 亚洲丝袜美腿综合| 乱h高h女3p含苞待放| 一区二区中文字幕在线| 精品少妇一区二区三区密爱| 国产精品午夜在线| 亚洲 欧美 国产 另类| 国产精品毛片高清在线完整版| 极品久久久久久久| 国产精品久久午夜夜伦鲁鲁| 日韩精品一区二区三区在线视频| 国产精品久久久久久久久免费丝袜 | jazzjazz国产精品久久| 国产精品我不卡| 久久99精品国产自在现线| 久久99精品国产一区二区三区| 国产精品网在线观看| 久精品国产欧美| 四虎884aa成人精品最新| 欧美亚州在线观看| 秋霞欧美视频| 青青草综合视频| 国产专区一区| 国产一区二区网| 天使萌一区二区三区免费观看| 日本熟妇人妻中出| 麻豆成人91精品二区三区| 99中文字幕在线| 粉嫩av亚洲一区二区图片| 五月开心播播网| 久久久www免费人成精品| 香蕉成人在线视频| 亚洲精品国产无天堂网2021 | 欧美日韩一区国产| www.看毛片| 亚洲女人被黑人巨大进入| 在线a人片免费观看视频| 欧美大片免费观看在线观看网站推荐| av在线播放资源| 国产精品久久久久不卡| 美女精品久久| 欧美成人综合一区| 自拍偷拍欧美专区| www.浪潮av.com| 韩日av一区二区| 51调教丨国产调教视频| 国产精品色在线| 日本在线视频免费观看| 在线观看日韩av先锋影音电影院| 国产精品视频a| 亚洲精品在线不卡| 97caopor国产在线视频| 日本精品视频在线观看| 欧美日韩黄色| 日本在线播放不卡| 亚洲高清毛片| 992kp免费看片| 久久先锋影音av鲁色资源| 精品国产精品国产精品| 色综合久久88色综合天天6| 99久久婷婷国产一区二区三区| 日韩成人久久久| 污污视频在线| 国产欧美日韩中文| 中文字幕亚洲影视| 国产乱淫av片杨贵妃| 精彩视频一区二区| 国产美女精品久久| 亚洲第一福利视频在线| 97超视频在线观看| 亚洲日韩欧美视频| 色偷偷色偷偷色偷偷在线视频| 亚洲中国色老太| 99视频精品视频高清免费| 久久精品香蕉视频| 99麻豆久久久国产精品免费 | 国产精久久久久| 国产精品高潮久久久久无| 日本久久综合网| 日韩成人xxxx| 97人人爽人人澡人人精品| 亚洲最大福利网站| 亚洲国产不卡| 亚洲免费在线播放视频| 国产精品久久久久四虎| 精产国品一区二区| 日韩精品在线观看一区二区| 国内在线免费视频| 成人激情av| 欧美女人交a| 亚洲熟女乱综合一区二区| 亚洲欧美日韩中文字幕一区二区三区 | 日韩亚洲精品在线| 久草免费资源站| 亚洲精品国产高清久久伦理二区| 国产又粗又猛又爽又黄视频| 中文国产亚洲喷潮| 国产精品黄色片| 亚洲乱码国产乱码精品天美传媒| 久久一日本道色综合久久| 色欲av无码一区二区三区| 狠狠久久亚洲欧美专区| 三级理论午夜在线观看| 欧美一区二区三区免费观看 | 国产成人精品一区二区三区四区| 老司机成人免费视频| 7777女厕盗摄久久久| 成人短视频在线观看| 91传媒视频在线观看| 伊人久久大香线蕉av超碰演员| 亚洲自拍偷拍精品| 欧美日韩另类在线| 国产在线中文字幕| 国产精品美女久久| 亚洲国产精品成人| 第一页在线视频| 欧美日韩精品在线播放| 国产在线视频网站| 成人激情视频小说免费下载| 久久久久久久久丰满| 五月天丁香社区| 欧美色视频日本版| 69av亚洲| 亚洲最大福利网站| 午夜亚洲福利在线老司机| 中文字幕第20页| 51午夜精品国产| 美女精品视频| 欧美亚州在线观看| 国精产品一区一区三区mba视频| 欧美日韩国产精品综合| 日韩精品视频免费专区在线播放 | 亚洲理论片在线观看| 欧美日韩激情一区二区三区| 中文字幕中文字幕在线中高清免费版| 国产精品亚洲综合| 日韩电影在线一区二区| 亚洲最大的黄色网址| 亚洲第一区在线| 亚洲不卡系列| 欧美成人精品免费| 国产午夜精品一区二区三区视频 | 99久久999| 男人插女人视频在线观看| 国产欧美日产一区| 精品人妻aV中文字幕乱码色欲| 97碰碰碰免费色视频| 久久人体视频| 日本少妇毛茸茸| 欧美剧在线免费观看网站 | 狠狠色狠狠色综合日日五| 日本中文字幕视频在线| 精品视频一区二区三区四区| 美女www一区二区| 国产成人无码精品久久久久| 色久欧美在线视频观看| 天海翼精品一区二区三区| 青青草原播放器| 91国偷自产一区二区三区观看|