Appearance
工具使用
工具(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 应用。