智能体 API

Agent 创建与执行

概述

LangChain 的智能体系统使用 LLM 决定调用哪些工具来完成任务。核心组件包括 Agent(决策)和 AgentExecutor(执行)。

graph TD
                    A[用户输入] --> B[Agent]
                    B --> C{决策}
                    C -->|需要工具| D[调用工具]
                    C -->|完成| E[返回结果]
                    D --> F[获取工具结果]
                    F --> B
                    B --> G[观察结果]
                    G --> C

                    style B fill:#e1f5fe
                    style D fill:#c8e6c9

创建函数

create_tool_calling_agent

创建工具调用类型的 Agent(推荐)。

from langchain.agents import create_tool_calling_agent
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.language_models import BaseChatModel
from langchain_core.tools import BaseTool

def create_tool_calling_agent(
    llm: BaseChatModel,
    tools: Sequence[Union[BaseTool, StructuredTool, callable]],
    prompt: ChatPromptTemplate,
    *,
    tool_names: Optional[List[str]] = None,
    strict: bool = False,
) -> Runnable:
    """
    创建工具调用 Agent

    Args:
        llm: 聊天模型(需要支持工具调用)
        tools: 工具列表
        prompt: Agent 提示模板
        tool_names: 可选的工具名称过滤
        strict: 是否严格模式(只使用提供的工具)

    Returns:
        可运行的 Agent

    Example:
        from langchain_openai import ChatOpenAI
        from langchain_core.tools import tool
        from langchain.agents import AgentExecutor

        @tool
        def search(query: str) -> str:
            return "搜索结果"

        llm = ChatOpenAI(model="gpt-4o")
        prompt = ChatPromptTemplate.from_messages([
            ("system", "You are a helpful assistant"),
            ("placeholder", "{chat_history}"),
            ("human", "{input}"),
            ("placeholder", "{agent_scratchpad}"),
        ])

        agent = create_tool_calling_agent(llm, [search], prompt)
        agent_executor = AgentExecutor(
            agent=agent,
            tools=[search],
            verbose=True
        )
        result = agent_executor.invoke({"input": "搜索 Python"})
    """

提示模板要求

提示模板必须包含以下占位符:

  • {chat_history} - 对话历史(可选)
  • {input} - 用户输入
  • {agent_scratchpad} - Agent 思考过程(必需)

create_react_agent

创建 ReAct 类型的 Agent(推理 + 行动)。

from langchain.agents import create_react_agent

def create_react_agent(
    llm: BaseLanguageModel,
    tools: Sequence[BaseTool],
    prompt: PromptTemplate,
) -> Runnable:
    """
    创建 ReAct Agent

    Args:
        llm: 语言模型
        tools: 工具列表
        prompt: 提示模板(需包含特定格式)

    Returns:
        ReAct Agent

    Note:
        ReAct Agent 使用 Thought-Action-Observation 循环
    """

ReAct 提示格式

python
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)

create_structured_chat_agent

创建结构化聊天 Agent。

from langchain.agents import create_structured_chat_agent

def create_structured_chat_agent(
    llm: BaseLanguageModel,
    tools: Sequence[BaseTool],
    prompt: ChatPromptTemplate,
) -> Runnable:
    """
    创建结构化聊天 Agent

    Args:
        llm: 语言模型
        tools: 工具列表
        prompt: 聊天提示模板

    Returns:
        结构化聊天 Agent
    """

create_json_agent

创建 JSON 格式的 Agent。

from langchain.agents import create_json_agent

def create_json_agent(
    llm: BaseLanguageModel,
    tools: Sequence[BaseTool],
    prompt: PromptTemplate,
    *,
    stop_sequence: List[str] = ["\nObservation:"],
) -> Runnable:
    """
    创建 JSON Agent

    Args:
        llm: 语言模型
        tools: 工具列表
        prompt: 提示模板
        stop_sequence: 停止序列

    Returns:
        JSON Agent
    """

create_openai_functions_agent

创建 OpenAI Functions 类型的 Agent(已弃用,使用 create_tool_calling_agent)。

from langchain.agents import create_openai_functions_agent

def create_openai_functions_agent(
    llm: BaseChatModel,
    tools: Sequence[BaseTool],
    prompt: ChatPromptTemplate,
) -> Runnable:
    """
    创建 OpenAI Functions Agent

    Note: 已被 create_tool_calling_agent 取代
    """

create_openai_tools_agent

创建 OpenAI Tools 类型的 Agent(已弃用)。

from langchain.agents import create_openai_tools_agent

def create_openai_tools_agent(
    llm: BaseChatModel,
    tools: Sequence[BaseTool],
    prompt: ChatPromptTemplate,
) -> Runnable:
    """
    创建 OpenAI Tools Agent

    Note: 已被 create_tool_calling_agent 取代
    """

执行器

AgentExecutor

Agent 执行器,负责运行 Agent 循环。

from langchain.agents import AgentExecutor

class AgentExecutor(Runnable[AgentInput, AgentOutput]):
    """Agent 执行器"""

    agent: Runnable[AgentInput, AgentActionOrFinish]
    """Agent Runnable"""

    tools: Dict[str, BaseTool]
    """工具字典"""

    max_iterations: int = 15
    """最大迭代次数"""

    max_execution_time: Optional[float] = None
    """最大执行时间(秒)"""

    early_stopping_method: Literal["force", "generate"] = "force"
    """提前停止方法"""

    verbose: bool = False
    """是否打印详细日志"""

    return_intermediate_steps: bool = False
    """是否返回中间步骤"""

    handle_parsing_errors: Union[bool, str, Callable[[Exception], str]] = True
    """错误处理策略"""

    callback_manager: Optional[CallbackManager] = None
    """回调管理器"""

    # 构造方法
    def __init__(
        self,
        agent: Runnable[AgentInput, AgentActionOrFinish],
        tools: Sequence[BaseTool],
        *,
        max_iterations: int = 15,
        max_execution_time: Optional[float] = None,
        early_stopping_method: str = "force",
        verbose: bool = False,
        return_intermediate_steps: bool = False,
        handle_parsing_errors: Union[bool, str, Callable] = True,
        **kwargs: Any,
    ):
        """
        初始化执行器

        Args:
            agent: Agent Runnable
            tools: 工具列表
            max_iterations: 最大迭代次数
            max_execution_time: 最大执行时间
            early_stopping_method: 停止方法 ("force" 或 "generate")
            verbose: 详细日志
            return_intermediate_steps: 返回中间步骤
            handle_parsing_errors: 错误处理
        """

核心方法

def invoke(
    self,
    input: AgentInput,
    config: Optional[RunnableConfig] = None,
    **kwargs: Any,
) -> AgentOutput:
    """
    执行 Agent

    Args:
        input: 输入字典
        config: 运行配置
        **kwargs: 额外参数

    Returns:
        输出字典,包含:
        - output: 最终输出
        - intermediate_steps: 中间步骤(如果启用)
    """

def stream(
    self,
    input: AgentInput,
    config: Optional[RunnableConfig] = None,
    **kwargs: Any,
) -> Iterator[AgentOutput]:
    """流式执行"""

async def ainvoke(
    self,
    input: AgentInput,
    config: Optional[RunnableConfig] = None,
    **kwargs: Any,
) -> AgentOutput:
    """异步执行"""

使用示例

python
from langchain.agents import create_tool_calling_agent, AgentExecutor
from langchain_openai import ChatOpenAI
from langchain_core.tools import tool
from langchain_core.prompts import ChatPromptTemplate

@tool
def search(query: str) -> str:
    """搜索网络"""
    return f"关于 {query} 的搜索结果"

@tool
def calculator(expression: str) -> str:
    """计算数学表达式"""
    try:
        return str(eval(expression))
    except:
        return "计算错误"

# 创建 Agent
llm = ChatOpenAI(model="gpt-4o")
tools = [search, calculator]

prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个有帮助的助手"),
    ("placeholder", "{chat_history}"),
    ("human", "{input}"),
    ("placeholder", "{agent_scratchpad}"),
])

agent = create_tool_calling_agent(llm, tools, prompt)

# 创建执行器
agent_executor = AgentExecutor(
    agent=agent,
    tools=tools,
    verbose=True,
    max_iterations=10,
    return_intermediate_steps=True
)

# 执行
result = agent_executor.invoke({"input": "搜索 Python 并计算 2+3"})
print(result["output"])
print(result["intermediate_steps"])

Agent 类型

AgentType 枚举

预定义的 Agent 类型(部分已弃用)。

from langchain.agents import AgentType

class AgentType(Enum):
    """Agent 类型枚举"""

    ZERO_SHOT_REACT_DESCRIPTION = "zero-shot-react-description"
    """零样本 ReAct Agent"""

    REACT_DOCSTORE = "react-docstore"
    """文档存储 ReAct Agent"""

    SELF_ASK_WITH_SEARCH = "self-ask-with-search"
    """自问搜索 Agent"""

    CONVERSATIONAL_REACT_DESCRIPTION = "conversational-react-description"
    """对话 ReAct Agent"""

    CHAT_ZERO_SHOT_REACT_DESCRIPTION = "chat-zero-shot-react-description"
    """聊天零样本 ReAct Agent"""

    CHAT_CONVERSATIONAL_REACT_DESCRIPTION = "chat-conversational-react-description"
    """聊天对话 ReAct Agent"""

    STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION = "structured-chat-zero-shot-react-description"
    """结构化聊天零样本 ReAct Agent"""

    OPENAI_FUNCTIONS = "openai-functions"
    """OpenAI Functions Agent(已弃用)"""

    OPENAI_MULTI_FUNCTIONS = "openai-multi-functions"
    """OpenAI 多函数 Agent(已弃用)"""

AgentAction

Agent 执行的动作。

from langchain.agents import AgentAction

class AgentAction(Serializable):
    """Agent 动作"""

    tool: str
    """要调用的工具名称"""

    tool_input: Union[str, dict]
    """工具输入"""

    log: str
    """执行日志"""

    def __init__(
        self,
        tool: str,
        tool_input: Union[str, dict],
        log: str,
    ):
        """
        Args:
            tool: 工具名称
            tool_input: 工具输入
            log: 日志
        """

AgentFinish

Agent 完成状态。

from langchain.agents import AgentFinish

class AgentFinish(Serializable):
    """Agent 完成"""

    return_values: dict
    """返回值字典"""

    log: str
    """完成日志"""

    def __init__(
        self,
        return_values: dict,
        log: str,
    ):
        """
        Args:
            return_values: 返回值(通常包含 "output" 键)
            log: 日志
        """

AgentStep

单步执行结果。

from typing import Tuple, Union
from langchain.agents import AgentAction, AgentFinish

AgentStep = Tuple[AgentAction, str]
"""Agent 步骤: (动作, 观察结果)"""

使用示例

python
from langchain.agents import create_tool_calling_agent, AgentExecutor
from langchain_openai import ChatOpenAI
from langchain_core.tools import tool
from langchain_core.prompts import ChatPromptTemplate

# ========== 示例1: 基础工具调用 Agent ==========

@tool
def get_weather(city: str) -> str:
    """获取指定城市的天气"""
    return f"{city} 今天是晴天,温度 25°C"

@tool
def get_time(city: str) -> str:
    """获取指定城市的时间"""
    from datetime import datetime
    return f"{city} 现在是 {datetime.now().strftime('%H:%M')}"

llm = ChatOpenAI(model="gpt-4o")
tools = [get_weather, get_time]

prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个有帮助的助手"),
    ("human", "{input}"),
    ("placeholder", "{agent_scratchpad}"),
])

agent = create_tool_calling_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

result = agent_executor.invoke({"input": "北京的天气和时间"})

# ========== 示例2: 带对话历史的 Agent ==========

prompt_with_history = ChatPromptTemplate.from_messages([
    ("system", "你是一个有帮助的助手"),
    ("placeholder", "{chat_history}"),
    ("human", "{input}"),
    ("placeholder", "{agent_scratchpad}"),
])

agent_executor_history = AgentExecutor(
    agent=create_tool_calling_agent(llm, tools, prompt_with_history),
    tools=tools
)

from langchain_core.messages import HumanMessage, AIMessage

chat_history = [
    HumanMessage(content="你好"),
    AIMessage(content="你好!有什么可以帮助你的?")
]

result = agent_executor_history.invoke({
    "input": "北京天气怎么样?",
    "chat_history": chat_history
})

# ========== 示例3: 流式执行 ==========

async def stream_agent():
    async for chunk in agent_executor.astream({"input": "北京天气"}):
        print(chunk)

import asyncio
asyncio.run(stream_agent())

# ========== 示例4: 自定义错误处理 ==========

def handle_error(error: Exception) -> str:
    return f"发生错误: {str(error)}。请尝试重新表述你的问题。"

agent_executor_safe = AgentExecutor(
    agent=agent,
    tools=tools,
    handle_parsing_errors=handle_error
)

# ========== 示例5: 限制迭代次数 ==========

agent_executor_limited = AgentExecutor(
    agent=agent,
    tools=tools,
    max_iterations=5
)

# ========== 示例6: 获取中间步骤 ==========

agent_executor_debug = AgentExecutor(
    agent=agent,
    tools=tools,
    return_intermediate_steps=True,
    verbose=True
)

result = agent_executor_debug.invoke({"input": "北京天气"})
print("中间步骤:", result["intermediate_steps"])

相关 API