Skip to content

工具使用

工具(Tools)是 LangChain 中的重要组件,它允许代理与外部服务和功能进行交互。本节将详细介绍 LangChain 中的工具使用方法。

安装依赖

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

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

什么是工具?

工具是代理可以使用的外部服务或功能,如搜索、计算、数据库查询等。工具扩展了代理的能力,使它能够完成更复杂的任务。

内置工具

LangChain 提供了多种内置工具,以下是一些常用的内置工具:

工具名称描述依赖包
serpapi用于搜索网络langchain-community
llm-math用于数学计算langchain-community
python_repl用于执行 Python 代码langchain-community
wikipedia用于查询维基百科langchain-community
requests用于发送 HTTP 请求langchain-community
terminal用于执行终端命令langchain-community
file_system用于操作文件系统langchain-community

加载内置工具

示例:加载内置工具

python
from langchain_openai import OpenAI
from langchain.agents import load_tools

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

# 加载工具
tools = load_tools(["serpapi", "llm-math"], llm=llm)
print("Loaded tools:", [tool.name for tool in tools])

使用内置工具

示例:使用 serpapi 工具进行搜索

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=llm)

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

# 运行代理
response = agent.run("Who is the current president of the United States?")
print(response)

示例:使用 llm-math 工具进行计算

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(["llm-math"], llm=llm)

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

# 运行代理
response = agent.run("What is 12345 * 67890?")
print(response)

示例:使用 python_repl 工具执行代码

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(["python_repl"], llm=llm)

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

# 运行代理
response = agent.run("Write a Python function to calculate the factorial of a number, then calculate the factorial of 10.")
print(response)

创建自定义工具

除了使用内置工具,还可以创建自定义工具,扩展代理的能力。

示例:创建自定义工具

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 WeatherInput(BaseModel):
    location: str = Field(description="城市名称")

# 创建自定义工具
class WeatherTool(BaseTool):
    name = "get_weather"
    description = "获取指定城市的天气信息"
    args_schema: Type[BaseModel] = WeatherInput

    def _run(self, location: str) -> str:
        # 模拟天气 API 调用
        return f"{location} 的当前温度是 25°C,天气晴朗"

    def _arun(self, location: str) -> str:
        # 异步实现(可选)
        raise NotImplementedError("get_weather 工具不支持异步操作")

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

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

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

# 运行代理
response = agent.run("北京的天气怎么样?")
print(response)

工具的高级配置

配置工具的参数

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="数学表达式")
    precision: Optional[int] = Field(default=2, description="计算结果的小数位数")

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

    def _run(self, expression: str, precision: int = 2) -> str:
        try:
            result = eval(expression)
            formatted_result = round(result, precision)
            return f"计算结果: {formatted_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.14159 * 2.71828 等于多少?保留 4 位小数。")
print(response)

工具的异步实现

python
import asyncio
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 SleepInput(BaseModel):
    seconds: int = Field(description="睡眠的秒数")

# 创建自定义工具
class SleepTool(BaseTool):
    name = "sleep"
    description = "暂停指定的秒数"
    args_schema: Type[BaseModel] = SleepInput

    def _run(self, seconds: int) -> str:
        import time
        time.sleep(seconds)
        return f"已暂停 {seconds} 秒"

    async def _arun(self, seconds: int) -> str:
        await asyncio.sleep(seconds)
        return f"已暂停 {seconds} 秒"

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

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

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

# 运行代理
response = agent.run("暂停 2 秒,然后说 'Hello World'")
print(response)

工具的最佳实践

1. 明确工具的用途

在创建工具时,确保工具的名称和描述清晰明确,便于代理理解工具的用途。

2. 处理错误情况

在工具的实现中,添加错误处理逻辑,确保工具在遇到错误时能够返回有用的错误信息。

3. 限制工具的范围

工具的功能应该单一明确,避免创建功能过于复杂的工具。

4. 提供详细的输入模式

使用 Pydantic 模型定义工具的输入模式,提供详细的字段描述,便于代理正确使用工具。

5. 测试工具的性能

在使用工具之前,测试工具的性能和可靠性,确保工具能够正常工作。

示例:创建一个完整的工具集

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 WeatherInput(BaseModel):
    location: str = Field(description="城市名称")

# 创建天气工具
class WeatherTool(BaseTool):
    name = "get_weather"
    description = "获取指定城市的天气信息"
    args_schema: Type[BaseModel] = WeatherInput

    def _run(self, location: str) -> str:
        # 模拟天气 API 调用
        return f"{location} 的当前温度是 25°C,天气晴朗"

# 定义计算器工具输入模式
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 = [WeatherTool(), CalculatorTool()]

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

# 运行代理
response = agent.run("北京的天气怎么样?3 + 5 * 2 等于多少?")
print(response)

总结

工具是 LangChain 中的重要组件,它允许代理与外部服务和功能进行交互,扩展了代理的能力。通过本文的介绍,您应该已经了解了如何使用内置工具和创建自定义工具,以及如何配置工具的参数和实现异步操作。

在实际应用中,您可以根据具体需求创建合适的工具,构建功能强大的 LLM 应用。