Appearance
代理
代理(Agents)是 LangChain 中的高级概念,它能够自主决策和执行任务,使用工具来完成复杂的任务。在 LangChain 1.2 中,代理 API 有了重大改进,提供了更灵活的方式来构建和使用代理。
安装依赖
在开始使用代理之前,需要安装以下依赖:
bash
pip install langchain langchain-openai python-dotenv langchain-community google-search-results什么是代理?
代理是能够自主决策和执行任务的组件,它可以使用工具来完成复杂的任务。代理根据用户的输入和环境信息,决定采取哪些行动来完成任务。
代理的工作流程通常包括:
- 接收用户的输入
- 分析输入,决定需要采取的行动
- 使用工具执行行动
- 分析工具的输出
- 决定是否需要进一步的行动
- 向用户提供最终答案
代理类型
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 应用。