引言
在AI与编程的世界中,创建工具是构建复杂系统的一项基本能力。无论是为了处理数据还是增强功能,工具都是大规模分布式计算和应用程序的基础。在本文中,我们将探讨LangChain中创建工具的多种方法,以及如何在这些方法之间进行选择,以使您的LLM或agent更强大。
主要内容
1. 工具的基本组成
在LangChain中,一个工具包括以下几个部分:
- 名称(name):工具在工具集合中必须是唯一的。
- 描述(description):描述工具的功能,并为LLM或agent提供上下文。
- 参数模式(args_schema):可选,但推荐用于参数验证与提供更详细的信息。
- 直接返回(return_direct):对于代理很重要的属性,若为True,表示调用工具后立即返回结果给用户。
以下是LangChain支持的工具创建方式:
- 函数
- LangChainRunnables
- 从BaseTool子类化
2. 使用@tool装饰器创建工具
最简单的自定义工具创建方法是使用@tool装饰器。装饰器会默认使用函数名作为工具名,并将函数的docstring作为工具描述。
from langchain_core.tools import tool
@tool
def multiply(a: int, b: int) -> int:
"""Multiply two numbers."""
return a * b
# 示例 - 使用API代理服务提高访问稳定性
print(multiply.name) # 输出: multiply
print(multiply.description) # 输出: Multiply two numbers.
3. 使用StructuredTool.from_function
当需要额外配置时,使用StructuredTool.from_function方法,比如支持同步和异步实现。
from langchain_core.tools import StructuredTool
def multiply(a: int, b: int) -> int:
"""Multiply two numbers."""
return a * b
calculator = StructuredTool.from_function(func=multiply, coroutine=multiply)
print(calculator.invoke({"a": 2, "b": 3})) # 输出: 6
4. 从BaseTool子类化
通过从BaseTool子类化,您可以实现最大程度的自定义,但这也要求写更多的代码。
from langchain.pydantic_v1 import BaseModel
from langchain_core.tools import BaseTool
class CalculatorInput(BaseModel):
a: int
b: int
class CustomCalculatorTool(BaseTool):
...
multiply = CustomCalculatorTool()
print(multiply.invoke({"a": 2, "b": 3})) # 输出: 6
代码示例
以下是一个完整的代码示例,展示了使用@tool装饰器和StructuredTool.from_function创建工具的不同方法。
# 使用API代理服务提高访问稳定性
from langchain_core.tools import tool, StructuredTool
@tool
def multiply_sync(a: int, b: int) -> int:
"""Multiply two numbers."""
return a * b
async def multiply_async(a: int, b: int) -> int:
"""Multiply two numbers asynchronously."""
return a * b
calculator = StructuredTool.from_function(func=multiply_sync, coroutine=multiply_async)
常见问题和解决方案
- 工具名冲突:确保每个工具在工具集合中名称唯一。
- 参数验证失败:使用
args_schema提供严格的参数验证。 - 异步调用失败:确保异步工具有对应的
invoke和ainvoke实现。
总结和进一步学习资源
掌握LangChain工具的创建与使用不仅能提高你的AI系统的效率,还能使其更灵活和可扩展。为深入学习LangChain的更多特性,可以查看以下资源:
- LangChain官方文档
- LangChain GitHub仓库
参考资料
- LangChain文档和API参考
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力! ---END---