Skip to content

代理

代理(Agents)是 LangChain 中的高级概念,它能够自主决策和执行任务,使用工具来完成复杂的任务。在 LangChain 1.2 中,代理 API 有了重大改进,提供了更灵活的方式来构建和使用代理。

安装依赖

在开始使用代理之前,需要安装以下依赖:

bash
pip install langchain langchain-openai python-dotenv langchain-community google-search-results

什么是代理?

代理是能够自主决策和执行任务的组件,它可以使用工具来完成复杂的任务。代理根据用户的输入和环境信息,决定采取哪些行动来完成任务。

代理的工作流程通常包括:

  1. 接收用户的输入
  2. 分析输入,决定需要采取的行动
  3. 使用工具执行行动
  4. 分析工具的输出
  5. 决定是否需要进一步的行动
  6. 向用户提供最终答案

代理类型

LangChain 1.2 提供了多种类型的代理,每种类型都有其特点和适用场景:

代理类型描述适用场景
ZERO_SHOT_REACT_DESCRIPTION使用 ReAct 思维方式,根据工具描述决定使用哪些工具通用场景
REACT_DOCSTORE使用 ReAct 思维方式,专门用于文档存储文档查询
SELF_ASK_WITH_SEARCH分解问题并使用搜索工具复杂问题求解
CONVERSATIONAL_REACT_DESCRIPTION支持对话的 ReAct 代理对话场景
CHAT_ZERO_SHOT_REACT_DESCRIPTION针对聊天模型的零样本 ReAct 代理聊天场景
CHAT_CONVERSATIONAL_REACT_DESCRIPTION针对聊天模型的对话 ReAct 代理聊天场景

初始化代理

示例:使用 ZERO_SHOT_REACT_DESCRIPTION 代理

python
from langchain_openai import OpenAI
from langchain.agents import AgentType, initialize_agent, load_tools

# 初始化语言模型
llm = OpenAI(api_key="your-api-key")

# 加载工具
tools = load_tools(["serpapi", "llm-math"], llm=llm)

# 初始化代理
agent = initialize_agent(
    tools=tools,
    llm=llm,
    agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
    verbose=True
)

示例:使用 CHAT_CONVERSATIONAL_REACT_DESCRIPTION 代理

python
from langchain_openai import ChatOpenAI
from langchain.agents import AgentType, initialize_agent, load_tools
from langchain.memory import ConversationBufferMemory

# 初始化聊天模型
chat_model = ChatOpenAI(api_key="your-api-key")

# 加载工具
tools = load_tools(["serpapi", "llm-math"], llm=chat_model)

# 初始化记忆
memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)

# 初始化代理
agent = initialize_agent(
    tools=tools,
    llm=chat_model,
    agent=AgentType.CHAT_CONVERSATIONAL_REACT_DESCRIPTION,
    memory=memory,
    verbose=True
)

使用代理

示例:使用代理回答问题

python
# 运行代理
response = agent.run("What is the current temperature in New York?")
print(response)

# 运行代理处理复杂任务
response = agent.run("Who is the current president of the United States? What is 2 + 2?")
print(response)

示例:使用代理进行多轮对话

python
# 初始化带记忆的代理
from langchain_openai import ChatOpenAI
from langchain.agents import AgentType, initialize_agent, load_tools
from langchain.memory import ConversationBufferMemory

chat_model = ChatOpenAI(api_key="your-api-key")
tools = load_tools(["serpapi", "llm-math"], llm=chat_model)
memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)

agent = initialize_agent(
    tools=tools,
    llm=chat_model,
    agent=AgentType.CHAT_CONVERSATIONAL_REACT_DESCRIPTION,
    memory=memory,
    verbose=True
)

# 多轮对话
response1 = agent.run("What is the capital of France?")
print("Response 1:", response1)

response2 = agent.run("What is the population of that city?")
print("Response 2:", response2)

自定义工具

代理可以使用自定义工具,扩展其能力。

示例:创建自定义工具

python
from langchain.tools import BaseTool
from langchain_openai import OpenAI
from langchain.agents import AgentType, initialize_agent
from typing import Optional, Type
from pydantic import BaseModel, Field

# 定义工具输入模式
class CalculatorInput(BaseModel):
    expression: str = Field(description="数学表达式")

# 创建自定义工具
class CalculatorTool(BaseTool):
    name = "calculator"
    description = "用于计算数学表达式"
    args_schema: Type[BaseModel] = CalculatorInput

    def _run(self, expression: str) -> str:
        try:
            result = eval(expression)
            return f"计算结果: {result}"
        except Exception as e:
            return f"计算错误: {str(e)}"

# 初始化语言模型
llm = OpenAI(api_key="your-api-key")

# 初始化工具
tools = [CalculatorTool()]

# 初始化代理
agent = initialize_agent(
    tools=tools,
    llm=llm,
    agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
    verbose=True
)

# 运行代理
response = agent.run("3 + 5 * 2 等于多少?")
print(response)

代理的高级配置

配置代理的参数

python
from langchain_openai import OpenAI
from langchain.agents import AgentType, initialize_agent, load_tools

# 初始化语言模型
llm = OpenAI(api_key="your-api-key")

# 加载工具
tools = load_tools(["serpapi", "llm-math"], llm=llm)

# 初始化代理
agent = initialize_agent(
    tools=tools,
    llm=llm,
    agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
    verbose=True,
    max_execution_time=60,  # 最大执行时间(秒)
    max_iterations=10,  # 最大迭代次数
    early_stopping_method="generate",  # 早停方法
    return_intermediate_steps=True  # 返回中间步骤
)

# 运行代理
response = agent.run("What is the current temperature in New York?")
print("Final response:", response["output"])
print("Intermediate steps:", response["intermediate_steps"])

配置代理的提示词

python
from langchain_openai import OpenAI
from langchain.agents import AgentType, initialize_agent, load_tools
from langchain.prompts import PromptTemplate

# 初始化语言模型
llm = OpenAI(api_key="your-api-key")

# 加载工具
tools = load_tools(["serpapi", "llm-math"], llm=llm)

# 自定义提示词
custom_prompt = PromptTemplate(
    template="""You are a helpful assistant. Use the tools provided to answer the user's questions.

{tools}

{tool_names}

{input}

{agent_scratchpad}
""",
    input_variables=["tools", "tool_names", "input", "agent_scratchpad"]
)

# 初始化代理
agent = initialize_agent(
    tools=tools,
    llm=llm,
    agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
    verbose=True,
    agent_kwargs={"prompt": custom_prompt}
)

# 运行代理
response = agent.run("What is the current temperature in New York?")
print(response)

总结

代理是 LangChain 中的高级概念,它能够自主决策和执行任务,使用工具来完成复杂的任务。通过本文的介绍,您应该已经了解了如何使用不同类型的代理,如何创建自定义工具,以及如何配置代理的参数和提示词。

在实际应用中,您可以根据具体需求选择合适的代理类型,配置适当的参数,构建功能强大的 LLM 应用。