langchain.agents 模块是 LangChain 库中的核心模块,用于构建和管理智能代理(Agents),能够结合语言模型(LLM)、工具和内存实现复杂任务的自动化处理。

本文基于 LangChain 0.3.x,详细介绍 langchain.agents 模块的结构、核心类及其功能,并提供一个独立示例,展示如何使用 langchain.agents 结合 ChatOpenAI 和 ShellTool 实现人工智能主题的终端命令执行代理,示例突出模块在代理构建中的灵活性。(LangChain Agents 文档) 。


langchain.agents 模块概览

langchain.agents 模块是 LangChain 库的核心部分,提供了构建智能代理的工具和框架。代理是一个结合语言模型、工具(Tools)和内存(Memory)的系统,能够根据用户输入自主选择和执行操作,适用于需要推理、规划和动态决策的任务。该模块支持多种代理类型(如 ReAct、OpenAI Functions)和工具集成,基于 LangChain Expression Language (LCEL) 实现灵活的工作流。

核心功能:

  • 提供代理初始化和管理工具,支持多种代理架构。
  • 集成语言模型、工具和内存,实现任务自动化。
  • 支持工具调用、动态规划和多轮对话。
  • 与 LCEL 链无缝集成,支持复杂工作流设计。

适用场景:

  • 构建智能聊天机器人,处理多轮对话和工具调用。
  • 自动化任务,如文件管理、数据查询或代码执行。
  • 实现需要推理和规划的复杂工作流(如数学求解、搜索)。
  • 开发交互式应用,结合外部 API 或本地工具。

模块位置:


模块中的主要类和函数

以下是 langchain.agents 模块中的核心类和函数(基于 LangChain 0.3.x),包括功能和典型用法。

1. AgentExecutor
  • 功能:代理执行器,负责运行代理逻辑,协调 LLM、工具和内存。
  • 参数:
    • agent(Runnable):代理的核心逻辑(如 Agent 实例)。
    • tools(List[BaseTool]):可用的工具列表。
    • memory(Optional[BaseMemory]):对话内存(如 ConversationBufferMemory)。
    • max_iterations(Optional[int]):最大迭代次数,防止无限循环。
    • verbose(bool):是否输出详细日志。
  • 使用场景:执行代理任务,管理工具调用和输出。
  • 示例:
    from langchain.agents import AgentExecutor
    executor = AgentExecutor(agent=agent, tools=[tool], verbose=True)
    
2. initialize_agent
  • 功能:初始化代理和执行器,快速构建代理工作流。
  • 签名:
    def initialize_agent(
        tools: Sequence[BaseTool],
        llm: BaseLanguageModel,
        agent: Optional[AgentType] = None,
        memory: Optional[BaseMemory] = None,
        **kwargs: Any
    ) -> AgentExecutor
    
  • 参数:
    • tools(Sequence[BaseTool]):工具列表。
    • llm(BaseLanguageModel):语言模型(如 ChatOpenAI)。
    • agent(Optional[AgentType]):代理类型(如 AgentType.ZERO_SHOT_REACT_DESCRIPTION)。
    • memory(Optional[BaseMemory]):对话内存。
    • **kwargs:其他配置(如 verbose、max_iterations)。
  • 使用场景:快速创建代理,适合初学者。
  • 示例:
    from langchain.agents import initialize_agent, AgentType
    agent = initialize_agent(tools=[tool], llm=llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION)
    
3. AgentType
  • 功能:枚举类,定义支持的代理类型。
  • 值:
    • ZERO_SHOT_REACT_DESCRIPTION:基于描述的零样本 ReAct 代理。
    • CHAT_ZERO_SHOT_REACT_DESCRIPTION:基于聊天的零样本 ReAct 代理。
    • OPENAI_FUNCTIONS:使用 OpenAI 函数调用(工具调用)。
    • CONVERSATIONAL_REACT_DESCRIPTION:对话型 ReAct 代理。
    • STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION:结构化聊天 ReAct 代理。
  • 使用场景:选择代理逻辑。
  • 示例:
    agent = initialize_agent(tools, llm, agent=AgentType.OPENAI_FUNCTIONS)
    
4. create_react_agent
  • 功能:创建 ReAct 代理,基于提示模板和工具。
  • 签名:
    def create_react_agent(
        llm: BaseLanguageModel,
        tools: Sequence[BaseTool],
        prompt: Optional[BasePromptTemplate] = None,
        output_parser: Optional[BaseOutputParser] = None
    ) -> Runnable
    
  • 使用场景:自定义 ReAct 代理,支持复杂提示。
  • 示例:
    from langchain.agents import create_react_agent
    agent = create_react_agent(llm, tools, prompt=prompt)
    
5. create_openai_functions_agent
  • 功能:创建基于 OpenAI 函数调用的代理。
  • 签名:
    def create_openai_functions_agent(
        llm: BaseLanguageModel,
        tools: Sequence[BaseTool],
        prompt: Optional[BasePromptTemplate] = None
    ) -> Runnable
    
  • 使用场景:利用 OpenAI 的工具调用功能。
  • 示例:
    from langchain.agents import create_openai_functions_agent
    agent = create_openai_functions_agent(llm, tools, prompt=prompt)
    
6. AgentOutputParser
  • 功能:解析代理输出,提取动作和结果。
  • 子类:
    • ReActSingleInputOutputParser:解析 ReAct 代理输出。
    • OpenAIFunctionsAgentOutputParser:解析 OpenAI 函数调用输出。
  • 使用场景:自定义输出解析逻辑。
  • 示例:
    from langchain.agents.output_parsers import ReActSingleInputOutputParser
    parser = ReActSingleInputOutputParser()
    
其他类
  • ToolCallingAgent:处理工具调用的代理逻辑。
  • XMLAgent:基于 XML 格式的代理(实验性)。
  • JsonAgent:基于 JSON 格式的代理(实验性)。

关键特性:

  • 代理支持多轮推理(ReAct:Reasoning + Acting)。
  • 工具调用基于 LLM 的决策。
  • 内存支持多轮对话(如 ConversationBufferMemory)。

使用方式

以下是使用 langchain.agents 模块的通用步骤。

1. 安装依赖
pip install --upgrade langchain langchain-openai langchain-experimental
2. 设置 OpenAI API 密钥
export OPENAI_API_KEY="your-api-key"

或在代码中:

import os
os.environ["OPENAI_API_KEY"] = "your-api-key"
3. 初始化工具和 LLM
from langchain_community.tools import ShellTool
from langchain_openai import ChatOpenAI
shell_tool = ShellTool()
llm = ChatOpenAI(model="gpt-3.5-turbo")
4. 创建代理
from langchain.agents import initialize_agent, AgentType
agent = initialize_agent(
    tools=[shell_tool],
    llm=llm,
    agent=AgentType.OPENAI_FUNCTIONS,
    verbose=True
)
5. 调用代理
response = agent.run("列出当前目录中的文件")
print(response)

使用 langchain.agents 的示例

以下是一个独立示例,展示如何使用 langchain.agents 模块结合 ChatOpenAI 和 ShellTool 实现人工智能主题的终端命令执行代理。代理通过自然语言输入自动生成并执行 shell 命令,展示模块的代理构建能力。

准备环境:

  • 获取 OpenAI API 密钥:OpenAI Platform。
  • 设置环境变量:
    export OPENAI_API_KEY="your-api-key"
    
  • 安装依赖:
    pip install --upgrade langchain langchain-openai langchain-experimental
    

代码:

from langchain_openai import ChatOpenAI
from langchain_community.tools import ShellTool
from langchain.agents import initialize_agent, AgentType

# 初始化 ChatOpenAI
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0.7)

# 初始化 ShellTool
shell_tool = ShellTool(ask_human_input=True)

# 创建代理
agent = initialize_agent(
    tools=[shell_tool],
    llm=llm,
    agent=AgentType.OPENAI_FUNCTIONS,
    verbose=True,
    max_iterations=3
)

# 测试代理和命令执行
print("测试 langchain.agents 和命令执行代理:")
try:
    tasks = [
        "列出当前目录中的文件",
        "显示当前工作目录路径"
    ]
    
    for task in tasks:
        print(f"\n输入任务: {task}")
        result = agent.run(task)
        print(f"代理输出: {result}")
except Exception as e:
    print(f"错误: {e}")

print("\n警告:ShellTool 默认无安全限制,请在沙箱环境中运行!")

输出示例(实际输出取决于系统和用户交互):

测试 langchain.agents 和命令执行代理:

输入任务: 列出当前目录中的文件
> Entering new AgentExecutor chain...
[ShellTool] 即将执行命令: ['ls']
请确认是否执行 (y/n): y
代理输出: dir1
dir2
file.txt

输入任务: 显示当前工作目录路径
> Entering new AgentExecutor chain...
[ShellTool] 即将执行命令: ['pwd']
请确认是否执行 (y/n): y
代理输出: /home/user/project

警告:ShellTool 默认无安全限制,请在沙箱环境中运行!
代码说明
  1. LLM 初始化:
    • 使用 ChatOpenAI 调用 gpt-3.5-turbo,设置 temperature=0.7。
  2. ShellTool 初始化:
    • 设置 ask_human_input=True,要求用户确认命令。
  3. 代理初始化:
    • 使用 initialize_agent 创建基于 OpenAI 函数调用的代理。
    • 配置 verbose=True 输出推理日志,max_iterations=3 限制循环。
  4. 测试:
    • 测试两个任务:列出文件(ls)、显示路径(pwd)。
    • 显示任务和代理输出,展示代理的推理和工具调用。
  5. 错误处理:
    • 使用 try-except 捕获 API 或工具错误。
  6. 警告:
    • 提醒用户 ShellTool 的安全风险。

运行要求:

  • 有效的 OpenAI API 密钥:
    export OPENAI_API_KEY="your-api-key"
    
  • 安装依赖:
    pip install --upgrade langchain langchain-openai langchain-experimental
    
  • 网络连接:访问 https://api.openai.com.
  • 支持 Bash 的环境(如 Linux、macOS;Windows 需 WSL 或自定义工具)。

注意事项

  1. 安全风险:
    • ShellTool 默认无安全限制,建议:
      • 启用 ask_human_input=True:
        shell_tool = ShellTool(ask_human_input=True)
        
      • 在沙箱环境运行(如 Docker)。
    • 检查代理日志:
      agent = initialize_agent(tools, llm, verbose=True)
      
  2. 依赖安装:
    • 需 langchain-experimental:
      pip install langchain-experimental
      
    • 验证安装:
      from langchain_community.tools import ShellTool
      
  3. 代理类型选择:
    • OpenAI Functions:适合工具调用,支持结构化输出。
      agent = initialize_agent(tools, llm, agent=AgentType.OPENAI_FUNCTIONS)
      
    • ReAct:适合需要推理的任务:
      agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION)
      
  4. 性能优化:
    • 异步调用:使用 arun:
      result = await agent.arun(task)
      
    • 限制迭代:设置 max_iterations:
      agent = initialize_agent(tools, llm, max_iterations=5)
      
    • 并发控制:配置 LLM:
      llm = ChatOpenAI(max_concurrency=5)
      
  5. 错误调试:
    • 工具调用失败:
      • 检查工具:
        print(shell_tool.invoke("ls"))
        
      • 验证代理日志:
        agent = initialize_agent(tools, llm, verbose=True)
        
    • API 错误:
      • 检查密钥:
        print(os.environ.get("OPENAI_API_KEY"))
        
      • 增加超时:
        llm = ChatOpenAI(timeout=30)
        
    • 推理循环:
      • 检查 max_iterations:
        agent = initialize_agent(tools, llm, max_iterations=3)
        
      • 调整提示:
        from langchain.agents import create_react_agent
        agent = create_react_agent(llm, tools, custom_prompt)
        

常见问题

Q1:如何添加内存支持?
A:使用 ConversationBufferMemory:

from langchain.memory import ConversationBufferMemory
memory = ConversationBufferMemory()
agent = initialize_agent(
    tools=[shell_tool],
    llm=llm,
    agent=AgentType.CHAT_CONVERSATIONAL_REACT_DESCRIPTION,
    memory=memory
)

Q2:如何自定义提示?
A:使用 create_openai_functions_agent:

from langchain.agents import create_openai_functions_agent
from langchain_core.prompts import ChatPromptTemplate
prompt = ChatPromptTemplate.from_template("任务: {input}")
agent = create_openai_functions_agent(llm, tools, prompt)
executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

Q3:如何支持多工具?
A:添加多个工具:

from langchain_community.tools import ShellTool, WikipediaQueryRun
tools = [ShellTool(), WikipediaQueryRun()]
agent = initialize_agent(tools, llm, agent=AgentType.OPENAI_FUNCTIONS)

Q4:如何支持开源模型?
A:使用 ChatOllama:

from langchain_ollama import ChatOllama
llm = ChatOllama(model="llama3")
agent = initialize_agent(
    tools=[shell_tool],
    llm=llm,
    agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION
)

总结

langchain.agents 模块是 LangChain 中构建智能代理的核心,包含以下关键组件:

  • AgentExecutor:执行代理逻辑。
  • initialize_agent:快速创建代理。
  • AgentType:定义代理类型(如 ReAct、OpenAI Functions)。
  • create_react_agent / create_openai_functions_agent:自定义代理。

更多推荐