langchain.agents.tools
时间: 2025-01-03 09:31:51 浏览: 8
### 关于 `langchain.agents.tools` 模块
#### 工具(Tools)
工具是在 LangChain 中由代理使用的功能组件,这些组件允许代理执行特定的任务。通过集成不同的工具,代理能够完成更加复杂的操作。例如,代理可以通过调用搜索引擎获取最新信息、利用数据库检索数据或是借助代码执行器运行脚本。
为了创建自定义工具,在 Python 中通常会继承 `BaseTool` 类,并实现必要的方法以适应具体需求[^3]。
#### 自定义工具 (Custom Tools)
存在两种主要的方式来自定义工具:
1. **字符串输入和输出工具**
这类工具接收字符串作为参数并返回处理后的字符串结果。对于简单的任务来说非常方便实用。下面展示了一个基本的例子,说明如何构建一个基于函数装饰器的简单工具:
```python
from langchain.tools import tool
@tool
def greet(name: str) -> str:
"""Return a greeting message."""
return f"Hello {name}"
```
2. **结构化工具 (Structured Tools)**
当需要传递复杂的数据结构给工具时,则应考虑使用结构化的工具形式。这使得开发者可以在不改变接口的情况下灵活调整内部逻辑。这里给出一段示范代码片段,展示了怎样定义带有 JSON Schema 的高级工具:
```python
import jsonschema
from typing import Any, Dict
from pydantic import BaseModel
from langchain.tools import StructuredTool
class CalculatorInput(BaseModel):
operation: str
operands: list[float]
class CalculatorOutput(BaseModel):
result: float
class CalculatorTool(StructuredTool):
name = "calculator"
description = (
"A simple calculator that supports basic arithmetic operations."
)
input_schema = CalculatorInput.schema()
output_schema = CalculatorOutput.schema()
def _run(self, inputs: Dict[str, Any]) -> dict:
try:
parsed_input = CalculatorInput(**inputs)
match parsed_input.operation.lower():
case "+":
res = sum(parsed_input.operands)
case "-":
res = parsed_input.operands[0] - sum(parsed_input.operands[1:])
case "*":
res = 1
for num in parsed_input.operands:
res *= num
case "/":
res = parsed_input.operands[0]
for divisor in parsed_input.operands[1:]:
if divisor != 0:
res /= divisor
else:
raise ValueError("Division by zero is not allowed.")
response = {"result": res}
except Exception as e:
error_msg = str(e)
response = {"error": error_msg}
finally:
validated_output = CalculatorOutput.parse_obj(response).dict()
return validated_output
```
上述例子中,`CalculatorTool` 是一个支持四则运算的计算器工具,它接受包含操作符 (`operation`) 和操作数列表 (`operands`) 的字典对象作为输入,并按照指定的操作计算最终的结果。此外还实现了异常捕获机制来确保程序的安全性和稳定性[^1]。
阅读全文