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

全網(wǎng)最全AI智能體框架終極指南:從CoT到Plan-and-Execute,附LangGraph完整代碼 原創(chuàng)

發(fā)布于 2025-8-27 07:56
瀏覽
1收藏

隨著大語(yǔ)言模型(LLM)的快速發(fā)展,如何讓AI系統(tǒng)更智能地解決復(fù)雜問(wèn)題成為了研究熱點(diǎn)。從簡(jiǎn)單的問(wèn)答到復(fù)雜的多步驟任務(wù)執(zhí)行,LLM Agent思考框架正在重塑我們對(duì)AI能力的認(rèn)知。本文將深入探討幾種主流的Agent思考框架,包括Chain of Thought(CoT)、ReAct、以及Plan-and-Execute等,并提供基于LangChain和LangGraph的具體實(shí)現(xiàn)代碼,幫助您理解這些框架的原理、優(yōu)勢(shì)和實(shí)際應(yīng)用場(chǎng)景。

無(wú)論您是想快速上手Agent開發(fā),還是希望深入理解不同框架的設(shè)計(jì)理念,本文都將為您提供理論知識(shí)和實(shí)戰(zhàn)代碼的完整指南。

一、Agent思考框架概述

環(huán)境準(zhǔn)備

在開始之前,請(qǐng)確保安裝必要的依賴:

# 基礎(chǔ)依賴
pip install langchain langchain-openai langchain-community

# LangGraph(用于高級(jí)Agent功能)
pip install langgraph

# 工具依賴
pip install tavily-python  # 搜索工具
pip install arxiv  # 學(xué)術(shù)論文搜索
pip install wikipedia-api  # Wikipedia查詢

# 可選:監(jiān)控和調(diào)試
pip install langsmith

設(shè)置API密鑰:

import os
os.environ["OPENAI_API_KEY"] = "your-api-key"
os.environ["TAVILY_API_KEY"] = "your-tavily-key"  # 獲取地址:https://tavily.com

什么是Agent思考框架?

Agent思考框架是指導(dǎo)LLM如何系統(tǒng)化地分解問(wèn)題、推理和執(zhí)行任務(wù)的結(jié)構(gòu)化方法。這些框架讓LLM不再是簡(jiǎn)單的"問(wèn)答機(jī)器",而是能夠像人類一樣思考、規(guī)劃和行動(dòng)的智能體。

通過(guò)規(guī)劃,LLM agents能夠推理、將復(fù)雜任務(wù)分解為更小、更可管理的部分,并為每個(gè)部分制定具體計(jì)劃。隨著任務(wù)的發(fā)展,agents還可以反思和調(diào)整他們的計(jì)劃,確保它們與現(xiàn)實(shí)世界的情況保持相關(guān)。

核心組件

一個(gè)完整的Agent框架通常包含以下核心組件:

  1. 思維(Thought):Agent的推理過(guò)程,用于分析問(wèn)題和制定策略
  2. 行動(dòng)(Action):Agent可以執(zhí)行的具體操作,如調(diào)用API、查詢數(shù)據(jù)庫(kù)等
  3. 觀察(Observation):從環(huán)境中獲取的反饋信息
  4. 記憶(Memory):存儲(chǔ)歷史信息和上下文
  5. 規(guī)劃(Planning):制定執(zhí)行步驟和策略

二、Chain of Thought(CoT)

2.1 CoT的起源與原理

Chain of Thought prompting是一種讓模型分解多步驟問(wèn)題為中間步驟的方法。通過(guò)chain of thought prompting,足夠規(guī)模的語(yǔ)言模型(約100B參數(shù))可以解決使用標(biāo)準(zhǔn)提示方法無(wú)法解決的復(fù)雜推理問(wèn)題。

CoT的核心思想是引導(dǎo)LLM像人類一樣,通過(guò)一系列邏輯步驟來(lái)解決問(wèn)題,而不是直接跳到答案。這種方法在2022年由Google Brain團(tuán)隊(duì)首次提出,迅速成為提升LLM推理能力的標(biāo)準(zhǔn)技術(shù)。

2.2 CoT的實(shí)現(xiàn)方式

Zero-Shot CoT

最簡(jiǎn)單的實(shí)現(xiàn)方式是在提示詞中加入"Let's think step by step"(讓我們一步步思考):

prompt = """
問(wèn)題:如果一個(gè)班級(jí)有28個(gè)學(xué)生,其中女生比男生多4人,請(qǐng)問(wèn)男生有多少人?

讓我們一步步思考:
"""
Few-Shot CoT

通過(guò)提供示例來(lái)引導(dǎo)模型的推理過(guò)程:

prompt = """
問(wèn)題:Roger有5個(gè)網(wǎng)球。他又買了2罐網(wǎng)球,每罐有3個(gè)球。他現(xiàn)在有多少個(gè)網(wǎng)球?
思考過(guò)程:Roger開始有5個(gè)球。2罐,每罐3個(gè)球,就是2×3=6個(gè)球。5+6=11個(gè)球。
答案:11個(gè)球

問(wèn)題:食堂有23個(gè)蘋果。如果他們用了20個(gè)做午餐,又買了6個(gè),他們有多少個(gè)蘋果?
思考過(guò)程:[模型生成]
"""

2.3 CoT的優(yōu)勢(shì)與局限

優(yōu)勢(shì):

  • 提高復(fù)雜推理任務(wù)的準(zhǔn)確性
  • 使推理過(guò)程透明可解釋
  • 適用于各種推理任務(wù)(數(shù)學(xué)、常識(shí)、符號(hào)推理等)

局限:

  • 對(duì)較小的模型效果不佳。研究表明,CoT只在約100B參數(shù)的模型上產(chǎn)生性能提升。較小的模型會(huì)寫出不合邏輯的思維鏈,導(dǎo)致準(zhǔn)確性比標(biāo)準(zhǔn)提示更差。
  • 仍然依賴模型內(nèi)部知識(shí),無(wú)法獲取外部實(shí)時(shí)信息

三、ReAct

3.1 ReAct框架的創(chuàng)新

ReAct使語(yǔ)言模型能夠以交錯(cuò)的方式生成語(yǔ)言推理軌跡和文本動(dòng)作。雖然動(dòng)作會(huì)從外部環(huán)境獲得觀察反饋,但推理軌跡不會(huì)影響外部環(huán)境。相反,它們通過(guò)對(duì)上下文進(jìn)行推理并用有用的信息更新它來(lái)影響模型的內(nèi)部狀態(tài)。

ReAct框架解決了CoT的一個(gè)關(guān)鍵限制:無(wú)法與外部世界交互。它將推理(Reasoning)和行動(dòng)(Acting)結(jié)合起來(lái),讓Agent能夠:

  1. 通過(guò)推理分解任務(wù)
  2. 執(zhí)行動(dòng)作獲取新信息
  3. 基于觀察調(diào)整策略
  4. 迭代直到解決問(wèn)題

3.2 ReAct的工作流程

典型的ReAct循環(huán)如下:

Thought 1: 我需要搜索最新的人口數(shù)據(jù)
Action 1: Search("中國(guó)人口 2024")
Observation 1: 根據(jù)最新統(tǒng)計(jì),中國(guó)人口約為14.1億

Thought 2: 現(xiàn)在我需要計(jì)算兩倍的值
Action 2: Calculate(14.1 * 2)
Observation 2: 28.2

Thought 3: 我現(xiàn)在知道答案了
Final Answer: 中國(guó)人口的兩倍是28.2億

3.3 LangChain實(shí)現(xiàn)ReAct Agent

基礎(chǔ)實(shí)現(xiàn)

使用LangChain創(chuàng)建ReAct agent的基礎(chǔ)實(shí)現(xiàn)非常簡(jiǎn)單:

from langchain import hub
from langchain.agents import AgentExecutor, create_react_agent
from langchain_community.tools.tavily_search import TavilySearchResults
from langchain_openai import ChatOpenAI

# 初始化LLM
llm = ChatOpenAI(model="gpt-4", temperature=0)

# 定義工具
tools = [
    TavilySearchResults(max_results=3, description="搜索互聯(lián)網(wǎng)獲取最新信息")
]

# 使用預(yù)定義的ReAct提示詞模板
prompt = hub.pull("hwchase17/react")

# 創(chuàng)建ReAct agent
agent = create_react_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

# 執(zhí)行查詢
result = agent_executor.invoke({
    "input": "2024年諾貝爾物理學(xué)獎(jiǎng)獲得者是誰(shuí)?他們的主要貢獻(xiàn)是什么?"
})
自定義ReAct提示詞

您可以自定義ReAct提示詞模板來(lái)控制agent的行為:

from langchain_core.prompts import PromptTemplate

template = '''Answer the following questions as best you can. 
You have access to the following tools:

{tools}

Use the following format:

Question: the input question you must answer
Thought: you should always think about what to do
Action: the action to take, should be one of [{tool_names}]
Action Input: the input to the action
Observation: the result of the action
... (this Thought/Action/Action Input/Observation can repeat N times)
Thought: I now know the final answer
Final Answer: the final answer to the original input question

Begin!

Question: {input}
Thought: {agent_scratchpad}'''

prompt = PromptTemplate.from_template(template)

# 使用自定義提示詞創(chuàng)建agent
agent = create_react_agent(llm, tools, prompt)

3.4 LangGraph實(shí)現(xiàn)ReAct Agent

LangGraph提供了更現(xiàn)代化和功能豐富的ReAct實(shí)現(xiàn):

from langchain.chat_models import init_chat_model
from langchain_tavily import TavilySearch
from langgraph.checkpoint.memory import MemorySaver
from langgraph.prebuilt import create_react_agent

# 創(chuàng)建帶有記憶功能的ReAct agent
memory = MemorySaver()
model = init_chat_model("anthropic:claude-3-5-sonnet-latest")
search = TavilySearch(max_results=2)
tools = [search]

# 創(chuàng)建支持多輪對(duì)話的agent
agent_executor = create_react_agent(
    model, 
    tools, 
    checkpointer=memory  # 啟用對(duì)話記憶
)

# 使用配置管理對(duì)話線程
config = {"configurable": {"thread_id": "abc123"}}

# 第一輪對(duì)話
response1 = agent_executor.invoke(
    {"messages": [{"role": "user", "content": "我叫張三,住在北京"}]},
    config
)

# 第二輪對(duì)話(agent會(huì)記住之前的信息)
response2 = agent_executor.invoke(
    {"messages": [{"role": "user", "content": "我住在哪里?"}]},
    config
)
自定義工具函數(shù)

您可以定義自定義工具來(lái)擴(kuò)展agent的能力:

from langchain_core.tools import tool

@tool
def get_weather(location: str) -> str:
    """獲取指定城市的天氣信息"""
    # 這里可以調(diào)用真實(shí)的天氣API
    if"北京"in location:
        return"北京今天晴天,溫度23°C,空氣質(zhì)量良好"
    returnf"無(wú)法獲取{location}的天氣信息"

@tool
def calculate(expression: str) -> str:
    """計(jì)算數(shù)學(xué)表達(dá)式"""
    try:
        result = eval(expression)
        returnf"計(jì)算結(jié)果:{result}"
    except:
        return"計(jì)算錯(cuò)誤,請(qǐng)檢查表達(dá)式"

# 使用自定義工具創(chuàng)建agent
tools = [get_weather, calculate, search]
agent = create_react_agent(model, tools, checkpointer=memory)

3.5 ReAct的實(shí)際應(yīng)用

ReAct框架受到人類如何使用自然語(yǔ)言進(jìn)行復(fù)雜任務(wù)的逐步規(guī)劃和執(zhí)行的啟發(fā)。ReAct agents不是實(shí)施基于規(guī)則或預(yù)定義的工作流程,而是依靠其LLM的推理能力,根據(jù)新信息或先前步驟的結(jié)果動(dòng)態(tài)調(diào)整其方法。

ReAct在以下場(chǎng)景表現(xiàn)出色:

  • 問(wèn)答系統(tǒng):結(jié)合Wikipedia API等外部知識(shí)源
  • 事實(shí)驗(yàn)證:通過(guò)多次搜索驗(yàn)證信息
  • 任務(wù)自動(dòng)化:在復(fù)雜環(huán)境中執(zhí)行多步驟任務(wù)
  • 交互式?jīng)Q策:在游戲或模擬環(huán)境中做出決策

四、Plan-and-Execute

4.1 架構(gòu)設(shè)計(jì)理念

Plan-and-Execute架構(gòu)由兩個(gè)基本組件組成:一個(gè)規(guī)劃器(Planner),它提示LLM生成完成大型任務(wù)的多步驟計(jì)劃;執(zhí)行器(Executors),它們接受用戶查詢和計(jì)劃中的一個(gè)步驟,并調(diào)用一個(gè)或多個(gè)工具來(lái)完成該任務(wù)。

這種架構(gòu)的核心創(chuàng)新在于將規(guī)劃和執(zhí)行分離,帶來(lái)了以下優(yōu)勢(shì):

  1. 更快的執(zhí)行速度:不需要在每個(gè)動(dòng)作后都咨詢大型LLM
  2. 成本優(yōu)化:可以使用較小的模型執(zhí)行具體任務(wù)
  3. 更好的性能:強(qiáng)制規(guī)劃器明確思考所有步驟

4.2 Plan-and-Execute vs ReAct

特性

ReAct

Plan-and-Execute

規(guī)劃方式

逐步規(guī)劃

預(yù)先制定完整計(jì)劃

LLM調(diào)用頻率

每步都需要

主要在規(guī)劃階段

靈活性

高度靈活

按計(jì)劃執(zhí)行

執(zhí)行速度

較慢

更快

成本

較高

較低

適用場(chǎng)景

探索性任務(wù)

結(jié)構(gòu)化任務(wù)

4.3 LangGraph實(shí)現(xiàn)Plan-and-Execute

方式一:使用LangChain Experimental

LangChain在experimental包中提供了Plan-and-Execute的實(shí)現(xiàn):

# 安裝experimental包
# pip install langchain-experimental

from langchain.chains import LLMMathChain
from langchain_community.utilities import DuckDuckGoSearchAPIWrapper
from langchain_core.tools import Tool
from langchain_experimental.plan_and_execute import (
    PlanAndExecute,
    load_agent_executor,
    load_chat_planner,
)
from langchain_openai import ChatOpenAI

# 初始化LLM
llm = ChatOpenAI(model="gpt-4", temperature=0)

# 定義工具
search = DuckDuckGoSearchAPIWrapper()
llm_math_chain = LLMMathChain.from_llm(llm=llm)

tools = [
    Tool(
        name="Search",
        func=search.run,
        description="用于搜索當(dāng)前事件和信息"
    ),
    Tool(
        name="Calculator",
        func=llm_math_chain.run,
        description="用于數(shù)學(xué)計(jì)算"
    ),
]

# 創(chuàng)建planner和executor
planner = load_chat_planner(llm)
executor = load_agent_executor(llm, tools, verbose=True)

# 創(chuàng)建Plan-and-Execute agent
agent = PlanAndExecute(planner=planner, executor=executor, verbose=True)

# 使用agent
result = agent.run("研究2024年諾貝爾物理學(xué)獎(jiǎng)獲得者并計(jì)算他們的平均年齡")
方式二:使用LangGraph自定義實(shí)現(xiàn)

包含錯(cuò)誤處理和動(dòng)態(tài)重新規(guī)劃:

from typing import Union, List, Tuple, Optional
from pydantic import BaseModel, Field
from enum import Enum

class ExecutionStatus(Enum):
    """執(zhí)行狀態(tài)枚舉"""
    SUCCESS = "success"
    FAILURE = "failure"
    PARTIAL = "partial"
    NEEDS_RETRY = "needs_retry"

class PlanEvaluation(BaseModel):
    """計(jì)劃評(píng)估結(jié)果"""
    needs_replan: bool = Field(description="是否需要重新規(guī)劃")
    reason: Optional[str] = Field(description="需要重新規(guī)劃的原因")
    new_plan: Optional[List[str]] = Field(description="新的執(zhí)行計(jì)劃")
    continue_execution: bool = Field(description="是否繼續(xù)執(zhí)行")

class SmartPlanExecute(TypedDict):
    """增強(qiáng)的狀態(tài)定義"""
    input: str
    original_plan: List[str]  # 保存原始計(jì)劃
    plan: List[str]  # 當(dāng)前待執(zhí)行的計(jì)劃
    past_steps: List[Tuple[str, str, ExecutionStatus]]  # 包含狀態(tài)
    response: Optional[str]
    replan_count: int  # 重新規(guī)劃次數(shù)
    max_replans: int  # 最大重新規(guī)劃次數(shù)

asyncdef smart_execute_step(state: SmartPlanExecute):
    """智能執(zhí)行步驟,包含錯(cuò)誤處理"""
    ifnot state["plan"]:
        return {}
    
    task = state["plan"][0]
    max_retries = 3
    
    for attempt in range(max_retries):
        try:
            # 執(zhí)行任務(wù)
            result = await agent_executor.ainvoke({
                "messages": [{"role": "user", "content": task}]
            })
            
            # 評(píng)估執(zhí)行結(jié)果
            status = await evaluate_execution_result(task, result)
            
            # 記錄執(zhí)行結(jié)果
            return {
                "past_steps": [(task, result["messages"][-1].content, status)],
                "plan": state["plan"][1:]  # 移除已執(zhí)行的步驟
            }
            
        except Exception as e:
            if attempt < max_retries - 1:
                await asyncio.sleep(2 ** attempt)  # 指數(shù)退避
                continue
            else:
                # 記錄失敗
                return {
                    "past_steps": [(task, f"執(zhí)行失敗: {str(e)}", ExecutionStatus.FAILURE)],
                    "plan": state["plan"][1:]
                }

asyncdef evaluate_execution_result(task: str, result: dict) -> ExecutionStatus:
    """評(píng)估任務(wù)執(zhí)行結(jié)果"""
    evaluation_prompt = """
    評(píng)估以下任務(wù)執(zhí)行結(jié)果:
    
    任務(wù):{task}
    結(jié)果:{result}
    
    請(qǐng)判斷執(zhí)行狀態(tài):
    - SUCCESS: 完全成功
    - PARTIAL: 部分成功,可能需要補(bǔ)充
    - FAILURE: 執(zhí)行失敗
    - NEEDS_RETRY: 需要重試
    
    只返回狀態(tài)值。
    """
    
    response = await llm.ainvoke(
        evaluation_prompt.format(
            task=task,
            result=result["messages"][-1].content
        )
    )
    
    # 解析狀態(tài)
    status_text = response.content.strip().upper()
    for status in ExecutionStatus:
        if status.value.upper() in status_text or status.name in status_text:
            return status
    
    return ExecutionStatus.SUCCESS  # 默認(rèn)為成功

asyncdef intelligent_replan_step(state: SmartPlanExecute):
    """智能重新規(guī)劃,考慮多種因素"""
    # 檢查是否超過(guò)最大重新規(guī)劃次數(shù)
    if state["replan_count"] >= state.get("max_replans", 3):
        return {
            "response": "達(dá)到最大重新規(guī)劃次數(shù),使用當(dāng)前結(jié)果生成報(bào)告。\n" + 
                       await generate_best_effort_report(state)
        }
    
    # 分析執(zhí)行歷史
    analysis = await analyze_execution_history(state)
    
    if analysis.needs_replan:
        # 生成新計(jì)劃
        new_plan = await generate_adaptive_plan(
            state["input"],
            state["past_steps"],
            state["plan"],
            analysis.reason
        )
        
        return {
            "plan": new_plan,
            "replan_count": state["replan_count"] + 1
        }
    
    elif len(state["plan"]) == 0:
        # 所有步驟完成,生成最終報(bào)告
        return {"response": await generate_intelligent_report(state)}
    
    else:
        # 繼續(xù)執(zhí)行
        return {}

asyncdef analyze_execution_history(state: SmartPlanExecute) -> PlanEvaluation:
    """深度分析執(zhí)行歷史"""
    # 統(tǒng)計(jì)執(zhí)行狀態(tài)
    status_counts = {}
    for _, _, status in state["past_steps"]:
        status_counts[status] = status_counts.get(status, 0) + 1
    
    # 獲取最近的執(zhí)行結(jié)果
    recent_failures = [
        (task, result) for task, result, status in state["past_steps"][-3:]
        if status in [ExecutionStatus.FAILURE, ExecutionStatus.NEEDS_RETRY]
    ]
    
    # 構(gòu)建分析提示
    analysis_prompt = """
    分析任務(wù)執(zhí)行情況并決定是否需要重新規(guī)劃:
    
    原始目標(biāo):{input}
    執(zhí)行統(tǒng)計(jì):{status_counts}
    最近失敗:{recent_failures}
    剩余任務(wù):{remaining_tasks}
    
    考慮因素:
    1. 失敗率是否過(guò)高?
    2. 是否發(fā)現(xiàn)了原計(jì)劃未考慮的情況?
    3. 剩余任務(wù)是否仍然適用?
    4. 是否需要新的方法或工具?
    
    返回JSON格式:
    {{
        "needs_replan": true/false,
        "reason": "重新規(guī)劃的原因",
        "suggestions": ["建議1", "建議2"]
    }}
    """
    
    response = await llm.ainvoke(
        analysis_prompt.format(
            input=state["input"],
            status_counts=status_counts,
            recent_failures=recent_failures,
            remaining_tasks=state["plan"]
        )
    )
    
    # 解析響應(yīng)
    import json
    try:
        analysis_data = json.loads(response.content)
        return PlanEvaluation(
            needs_replan=analysis_data.get("needs_replan", False),
            reason=analysis_data.get("reason"),
            continue_execution=not analysis_data.get("needs_replan", False)
        )
    except:
        # 如果解析失敗,默認(rèn)繼續(xù)執(zhí)行
        return PlanEvaluation(
            needs_replan=False,
            continue_execution=True
        )

asyncdef generate_adaptive_plan(
    original_goal: str,
    past_steps: List[Tuple],
    remaining_tasks: List[str],
    replan_reason: str
) -> List[str]:
    """生成自適應(yīng)的新計(jì)劃"""
    adaptive_prompt = """
    基于執(zhí)行歷史生成新的計(jì)劃:
    
    原始目標(biāo):{goal}
    已執(zhí)行步驟:{past}
    原剩余任務(wù):{remaining}
    重新規(guī)劃原因:{reason}
    
    請(qǐng)生成新的執(zhí)行計(jì)劃,要求:
    1. 避免重復(fù)已成功的步驟
    2. 解決發(fā)現(xiàn)的問(wèn)題
    3. 使用替代方法處理失敗的任務(wù)
    4. 保持計(jì)劃簡(jiǎn)潔高效
    
    每行一個(gè)步驟:
    """
    
    response = await llm.ainvoke(
        adaptive_prompt.format(
            goal=original_goal,
            past=past_steps,
            remaining=remaining_tasks,
            reason=replan_reason
        )
    )
    
    return parse_new_plan(response.content)

# 構(gòu)建增強(qiáng)的工作流
def build_smart_plan_execute_workflow():
    workflow = StateGraph(SmartPlanExecute)
    
    # 添加節(jié)點(diǎn)
    workflow.add_node("planner", initial_plan_step)
    workflow.add_node("executor", smart_execute_step)
    workflow.add_node("analyzer", intelligent_replan_step)
    
    # 設(shè)置流程
    workflow.set_entry_point("planner")
    workflow.add_edge("planner", "executor")
    workflow.add_edge("executor", "analyzer")
    
    # 條件邊:根據(jù)分析結(jié)果決定下一步
    def route_after_analysis(state: SmartPlanExecute):
        if"response"in state and state["response"]:
            return"end"
        elif state["plan"]:
            return"executor"
        else:
            return"end"
    
    workflow.add_conditional_edges(
        "analyzer",
        route_after_analysis,
        {
            "executor": "executor",
            "end": END
        }
    )
    
    return workflow.compile()

# 使用示例
smart_agent = build_smart_plan_execute_workflow()

result = await smart_agent.ainvoke({
    "input": "分析競(jìng)爭(zhēng)對(duì)手的產(chǎn)品策略并提出改進(jìn)建議",
    "replan_count": 0,
    "max_replans": 3
})

五、框架實(shí)戰(zhàn)最佳實(shí)踐

5.1 混合使用策略

在實(shí)際項(xiàng)目中,可以根據(jù)不同階段使用不同框架:

class HybridAgent:
    def __init__(self):
        self.cot_llm = ChatOpenAI(model="gpt-3.5-turbo")
        self.react_agent = create_react_agent(...)
        self.plan_execute_agent = create_plan_and_execute_agent(...)
        
    def analyze_complexity(self, query: str) -> ComplexityAnalysis:
    """
    分析查詢的復(fù)雜度,考慮以下因素:
    - 任務(wù)是否需要多步驟推理
    - 是否需要外部信息
    - 任務(wù)的結(jié)構(gòu)化程度
    - 是否有明確的執(zhí)行路徑
    """
    pass
    
    def process(self, query):
        complexity = self.analyze_complexity(query)
        
        if complexity == "simple":
            # 簡(jiǎn)單問(wèn)題直接用CoT
            return self.cot_llm.invoke(f"{query}\n讓我們一步步思考:")
        elif complexity == "exploratory":
            # 探索性問(wèn)題用ReAct
            return self.react_agent.invoke({"input": query})
        else:
            # 復(fù)雜結(jié)構(gòu)化任務(wù)用Plan-and-Execute
            return self.plan_execute_agent.invoke({"input": query})

5.2 性能優(yōu)化技巧

  1. 緩存策略

from langchain.cache import InMemoryCache
import langchain

# 啟用緩存減少重復(fù)調(diào)用
langchain.llm_cache = InMemoryCache()
  1. 異步處理

import asyncio

async def parallel_agent_execution(queries):
    agents = [create_react_agent(llm, tools) for _ in queries]
    tasks = [agent.ainvoke({"input": q}) for agent, q in zip(agents, queries)]
    return await asyncio.gather(*tasks)
  1. 模型選擇策略

def select_model(task_type):
    model_map = {
        "reasoning": "gpt-4",  # 復(fù)雜推理用大模型
        "extraction": "gpt-3.5-turbo",  # 信息提取用快速模型
        "classification": "gpt-3.5-turbo",  # 分類任務(wù)用快速模型
        "creative": "claude-3-opus"  # 創(chuàng)意任務(wù)用Claude
    }
    return model_map.get(task_type, "gpt-3.5-turbo")

5.3 錯(cuò)誤處理和回退機(jī)制

from tenacity import retry, stop_after_attempt, wait_exponential

class RobustAgent:
    @retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=4, max=10))
    asyncdef execute_with_retry(self, task):
        try:
            result = await self.agent.ainvoke(task)
            return result
        except Exception as e:
            # 記錄錯(cuò)誤
            logger.error(f"Agent execution failed: {e}")
            
            # 回退到更簡(jiǎn)單的方法
            if hasattr(self, 'fallback_agent'):
                returnawait self.fallback_agent.ainvoke(task)
            raise

六、最佳實(shí)踐與選擇指南

6.1 框架選擇決策樹

任務(wù)類型判斷:
├── 純推理任務(wù)(不需要外部信息)
│   └── 使用 CoT
├── 需要實(shí)時(shí)信息或工具調(diào)用
│   ├── 探索性/動(dòng)態(tài)任務(wù)
│   │   └── 使用 ReAct
│   └── 結(jié)構(gòu)化/可預(yù)測(cè)任務(wù)
│       └── 使用 Plan-and-Execute

6.2 性能優(yōu)化建議

  1. 模型選擇
  • CoT需要大模型(>100B參數(shù))才能發(fā)揮效果
  • ReAct和Plan-and-Execute可以混合使用大小模型
  1. 成本控制
  • 對(duì)于高頻任務(wù),優(yōu)先考慮Plan-and-Execute
  • 使用緩存機(jī)制減少重復(fù)調(diào)用
  1. 錯(cuò)誤處理
  • 實(shí)現(xiàn)重試機(jī)制和fallback策略
  • 在ReAct中加入自我反思機(jī)制

6.3 實(shí)施建議

從簡(jiǎn)單開始:先用CoT驗(yàn)證基本推理能力

# 開始時(shí)使用簡(jiǎn)單的Zero-Shot CoT
prompt = "問(wèn)題:{question}\n讓我們一步步思考:"

逐步升級(jí):根據(jù)需求添加工具調(diào)用(ReAct)

# 添加基礎(chǔ)工具
tools = [search_tool]
agent = create_react_agent(llm, tools)

優(yōu)化迭代:對(duì)于成熟流程,遷移到Plan-and-Execute

# 當(dāng)流程穩(wěn)定后,使用Plan-and-Execute提升效率
planner_agent = create_plan_and_execute_agent(
    planner_llm=expensive_model,  # 只在規(guī)劃時(shí)使用大模型
    executor_llm=cheap_model,      # 執(zhí)行時(shí)使用小模型
    tools=tools
)

監(jiān)控評(píng)估:持續(xù)監(jiān)控性能和成本指標(biāo)

# 使用LangSmith進(jìn)行追蹤
from langsmith import Client
client = Client()
# 啟用追蹤來(lái)監(jiān)控agent性能

6.4 框架選擇快速參考

場(chǎng)景

推薦框架

代碼示例

簡(jiǎn)單問(wèn)答

CoT

??prompt = "Let's think step by step"??

實(shí)時(shí)信息查詢

ReAct

??create_react_agent(llm, [search_tool])??

復(fù)雜報(bào)告生成

Plan-and-Execute

??create_plan_and_execute_agent(llm, tools)??

并行任務(wù)處理

LLMCompiler

??parallel_execute_dag(task_graph)??

多輪對(duì)話

ReAct + Memory

??create_react_agent(llm, tools, checkpointer=memory)??

總結(jié)

作為開發(fā)者和技術(shù)決策者,深入理解這些框架不僅能幫助我們構(gòu)建更好的AI系統(tǒng)。無(wú)論是選擇簡(jiǎn)單直接的CoT,還是構(gòu)建復(fù)雜的多Agent系統(tǒng),關(guān)鍵在于理解業(yè)務(wù)需求,選擇合適的工具,并持續(xù)優(yōu)化迭代。

最近一些讀者想加??langchain&langgraph??的群,打算等對(duì)這部分感興趣的朋友達(dá)到一定數(shù)量再拉群,想加這個(gè)群的朋友可以關(guān)注之后加我備注 langgraph 即可

參考資料:

  1. LangChain ReAct Agent Documentation[1]
  2. LangGraph Plan-and-Execute Tutorial[2]
  3. LangGraph Prebuilt Agents[3]
  4. LangChain Hub - Prompt Templates[4]
  5. LangSmith - Monitoring and Debugging[5]

參考資料

[1] LangChain ReAct Agent Documentation: ??https://python.langchain.com/docs/modules/agents/agent_types/react/??

[2] LangGraph Plan-and-Execute Tutorial: ??https://langchain-ai.github.io/langgraph/tutorials/plan-and-execute/??

[3] LangGraph Prebuilt Agents: ??https://langchain-ai.github.io/langgraph/reference/prebuilt/??

[4] LangChain Hub - Prompt Templates: ??https://smith.langchain.com/hub??

[5] LangSmith - Monitoring and Debugging: ???https://docs.smith.langchain.com/??


本文轉(zhuǎn)載自????AI 博物院???? 作者:longyunfeigu

?著作權(quán)歸作者所有,如需轉(zhuǎn)載,請(qǐng)注明出處,否則將追究法律責(zé)任
收藏 1
回復(fù)
舉報(bào)
回復(fù)
相關(guān)推薦
蜜桃成人在线| 午夜美女久久久久爽久久| 日韩av片专区| 麻豆av在线免费观看| 99久久免费视频.com| 国产999视频| 免费三级在线观看| 国产成人澳门| 精品视频在线看| 男人的天堂avav| 免费在线稳定资源站| 狠狠色伊人亚洲综合成人| 孩xxxx性bbbb欧美| 久久av无码精品人妻系列试探| 日韩毛片免费视频一级特黄| 亚洲一二三区不卡| 亚洲春色综合另类校园电影| 亚洲伦理在线观看| 麻豆精品在线看| 97碰在线观看| 国产精品丝袜一区二区| 九九久久婷婷| 精品久久国产字幕高潮| 亚洲污视频在线观看| 国产精品一区二区日韩| 亚洲日本在线视频观看| 欧美日韩国产免费一区二区三区 | 91精品国偷自产在线电影| 亚洲激情视频在线播放| 久久久久久国产精品日本| 久久久一本精品| 午夜精品久久久久久久99樱桃| 一级日韩一区在线观看| 免费a在线观看| 成人av午夜电影| 99久久精品无码一区二区毛片 | 肉丝袜脚交视频一区二区| 欧美激情精品久久久久久黑人| 免费91在线观看| 精品精品99| 精品亚洲国产视频| 日b视频在线观看| 日日夜夜精品视频| 欧美一级片在线看| 色一情一区二区| 成人在线视频观看| 欧美自拍偷拍午夜视频| 欧美精品第三页| xxxxx性欧美特大| 午夜精品成人在线视频| 福利视频免费在线观看| 天堂8中文在线| 亚洲三级免费观看| 国产树林野战在线播放| 老司机午夜在线| 中文字幕五月欧美| 亚洲一区三区电影在线观看| eeuss影院www在线播放| 欧美激情综合在线| 色大师av一区二区三区| www.亚洲资源| 国产精品护士白丝一区av| 亚洲一二区在线| 在线观看a视频| 国产精品国产自产拍高清av王其| 亚洲精品乱码视频| 国产调教视频在线观看| 亚洲精品视频在线观看网站| 黄色a级在线观看| 日韩av毛片| 亚瑟在线精品视频| 成熟老妇女视频| av一区在线播放| 欧美日本一区二区三区四区| 中文 日韩 欧美| 88久久精品| 日韩精品小视频| 中文字幕第4页| 四虎国产精品免费观看| 欧美成人免费全部观看天天性色| a级黄色片免费看| 亚洲日本激情| 国产精品久在线观看| 99精品免费观看| 成人亚洲一区二区一| 鲁丝一区二区三区免费| 97超碰人人在线| 特级西西www444人体聚色| 久久99视频| 日韩中文字幕在线视频播放| 毛片久久久久久| 亚洲视频观看| 国产精品久久久久久久久久| 国产女人18毛片18精品| 91网站在线观看视频| 亚洲精品国产精品国自产| h视频在线免费观看| 亚洲国产成人av好男人在线观看| 欧美成人xxxxx| 欧美日韩视频免费看| 精品欧美乱码久久久久久| 国产手机在线观看| 欧美 日韩 国产一区二区在线视频| 久久久久久久久久婷婷| 性高潮视频在线观看| 国产iv一区二区三区| 久久久久se| 国产高清一区二区三区视频| 午夜精品福利在线| 三级一区二区三区| 色天下一区二区三区| 北条麻妃99精品青青久久| 国产精彩视频在线观看| 美女在线视频一区| 久中文字幕一区| 国产cdts系列另类在线观看| 狠狠色狠色综合曰曰| 911av视频| 欧美精品久久久久久| 久久久久成人网| 亚洲综合精品国产一区二区三区 | 一区二区成人网| 日韩在线观看中文字幕| 亚洲日本成人网| 国产主播在线播放| 国产自产视频一区二区三区| 欧美日韩电影一区二区三区| 99re6在线精品视频免费播放| 制服丝袜在线91| 高清国产在线观看| 欧美亚洲专区| 久久久影院一区二区三区| 三级福利片在线观看| 欧美日韩的一区二区| 日本乱子伦xxxx| 亚洲乱码日产精品bd在线观看| 福利一区和二区| 亚洲人精品午夜在线观看| 国产成人在线免费观看视频| 国产999精品久久久久久| 免费观看黄色的网站| 国产情侣一区二区三区| 国产亚洲视频中文字幕视频| youjizz在线视频| 99精品视频一区| 欧美不卡在线播放| 久久久久观看| 国模精品系列视频| 日韩一卡二卡在线| 亚洲成人av一区二区| 野战少妇38p| 在线不卡视频| 国外成人在线视频网站| 538在线观看| 亚洲精美色品网站| 中文字幕超碰在线| 久久久久久久久97黄色工厂| 又色又爽又高潮免费视频国产| 一本久久青青| 国产第一区电影| av在线资源站| 欧美乱妇23p| 欧美国产精品一二三| 国产精品18久久久久久久久久久久| 成人性做爰片免费视频| 久久久久久爱| 久久久久五月天| 亚洲三区在线观看无套内射| 欧美香蕉大胸在线视频观看| 日本少妇高潮喷水xxxxxxx| 热久久久久久久| 2021国产视频| 精品女人视频| 国产精品美女视频网站| 精品51国产黑色丝袜高跟鞋| 欧美大黄免费观看| 91av在线免费视频| 中文字幕免费一区| 九九九久久久久久久| 一本一本久久| 亚洲一区精品视频| 亚洲欧美日本国产| 奇米四色中文综合久久| 在线激情小视频| 精品日韩一区二区三区免费视频| 日韩精品人妻中文字幕| 久久久美女毛片| 欧美男女交配视频| 狠狠综合久久| 日本高清不卡一区二区三| 久久亚洲精品中文字幕| 欧美极品美女视频网站在线观看免费 | 国产精品25p| 爽爽爽爽爽爽爽成人免费观看| 国产极品久久久| 色综合视频一区二区三区高清| 可以免费看av的网址| 91女神在线视频| 亚洲成人手机在线观看| 国产精品社区| 三级在线免费观看| 精品美女久久久| 国产一区二区三区色淫影院 | 自拍视频亚洲| 麻豆精品视频| 日韩中文字幕无砖| 国产精品电影网| 国产极品人妖在线观看| 国产一区二区激情| 亚洲av无码国产精品久久不卡 | 综合伊思人在钱三区| 91老司机在线| 日本肉肉一区| 26uuu亚洲国产精品| 18+视频在线观看| 伊人亚洲福利一区二区三区| 韩国av免费在线观看| 在线电影欧美成精品| chinese国产精品| 一区二区高清免费观看影视大全| 神马久久久久久久久久久| av中文字幕亚洲| 久久发布国产伦子伦精品| 日本不卡视频在线观看| 99999精品视频| 亚洲久久视频| 日韩亚洲欧美视频| 欧美激情1区2区3区| 一本一道久久a久久精品综合| 妖精视频一区二区三区| 精品亚洲一区二区三区四区五区高| 国产精品3区| 91免费观看网站| 婷婷激情成人| 国产精品吴梦梦| 素人啪啪色综合| 欧美专区第一页| 秋霞伦理一区| 欧美中文字幕第一页| 高清在线视频不卡| 久久久久久久久久国产精品| 污污网站在线观看| 久久综合亚洲社区| 免费黄色在线| 久久久精品视频成人| 嫩草在线视频| 久久精品国产96久久久香蕉| 精品51国产黑色丝袜高跟鞋| 久久精品国产视频| 麻豆传媒在线观看| 另类图片亚洲另类| 2020国产在线视频| 久久91亚洲人成电影网站| 男女视频在线| 亚洲2020天天堂在线观看| 国产粉嫩在线观看| 国产91精品高潮白浆喷水| jizz内谢中国亚洲jizz| 国产精品久久电影观看| 成人国产激情| 成人夜晚看av| 日本一区影院| 国产伦精品一区二区三区四区免费 | 亚洲国产综合在线看不卡| 日韩小视频在线播放| 裸体一区二区| 久久久久xxxx| 成人高清伦理免费影院在线观看| 免费看黄色aaaaaa 片| 国产欧美久久久精品影院| 在线观看天堂av| 亚洲人成网站影音先锋播放| 国产女人被狂躁到高潮小说| 污片在线观看一区二区| 成人a v视频| 在线综合+亚洲+欧美中文字幕| www日本在线| 亚洲免费视频观看| 青青青青在线| 国模私拍视频一区| 91tv亚洲精品香蕉国产一区| 99re6在线| 亚洲人成精品久久久| 亚洲 欧洲 日韩| 国产精品一区毛片| 一二三av在线| 91社区在线播放| 麻豆精品一区二区三区视频| 天天色综合天天| 国产伦精品一区二区三区四区 | 成人不用播放器| 欧美激情精品在线| 三级成人在线| 国产精品美女久久久久av福利| 国产精品手机在线播放| japanese在线播放| 日韩在线a电影| 亚洲欧洲国产视频| 国产欧美日本一区二区三区| www.youjizz.com亚洲| 欧美日韩五月天| 天天爽夜夜爽夜夜爽| 久久好看免费视频| 午夜精品成人av| 国产经典一区二区三区| 日韩专区精品| 国产乱子伦农村叉叉叉| 韩国成人福利片在线播放| 色噜噜在线观看| 一区二区三区四区乱视频| 欧美成人精品网站| 亚洲成人教育av| 黄色成人在线观看| 国产精品电影网站| 欧美天堂影院| 日韩欧美猛交xxxxx无码| 美女精品自拍一二三四| 国产国语性生话播放| 一区二区三区美女| 国产又粗又猛又爽又黄91| 亚洲色图17p| 欧美另类老肥妇| 国产精品一区二区在线观看 | 国产精品爽爽爽| 欧美精品韩国精品| 国产不卡精品| 久久av中文字幕片| 欧美激情videos| 日本欧美黄色片| 日韩精品每日更新| 一本加勒比波多野结衣| 亚洲精品视频免费观看| 在线免费观看av片| 亚洲图片欧美日产| 天天综合网站| 五月天色一区| 免费观看日韩av| 日韩免费成人av| 在线欧美一区二区| 国产青青草在线| 国产精品稀缺呦系列在线| 清纯唯美日韩| 亚洲成人av免费看| 欧美激情一区二区三区| 一区二区视频网| 中国人与牲禽动交精品| 欧美成人一二区| 色呦呦网站入口| 国产suv一区二区三区88区| 成人免费看片98| 亚洲精品97久久| 一级毛片久久久| 色播五月综合| 狠狠色狠狠色综合日日91app| 在线观看美女av| 日韩免费一区二区三区在线播放| 中文字幕有码在线视频| 俄罗斯精品一区二区| 极品裸体白嫩激情啪啪国产精品| 韩国三级视频在线观看| 性欧美大战久久久久久久久| 日本免费一区视频| 国产成人精品视频在线| 四季av一区二区三区免费观看| 毛毛毛毛毛毛毛片123| 亚洲一区二区综合| 污视频在线免费| 国产精品高潮呻吟久久av黑人| 日韩精品水蜜桃| 日韩黄色一区二区| 日韩欧美一区二区三区| 婷婷在线视频| 爱情岛论坛亚洲入口| 国产一区二区三区久久| 极品蜜桃臀肥臀-x88av| 制服丝袜在线91| 国产精品xx| 中文字幕一区二区三区四区五区| 国产黄人亚洲片| 精产国品一区二区| 一区二区三区久久精品| 欧美一区一区| 69堂免费视频| 18欧美亚洲精品| 亚洲欧洲精品视频| 成人福利在线视频| 亚洲欧洲午夜| 啪啪一区二区三区| 亚洲成人国产精品| 97精品国产99久久久久久免费| 国产女人18毛片| 久久久国际精品| 午夜精品久久久久久久96蜜桃| 日本成人黄色片| 欧美精品一卡| 中国特黄一级片| 亚洲精品视频在线观看视频| 国产精品美女久久久久| 欧美精品一区二区三区免费播放| 亚洲精品大片www|