创建高效的LangChain工具:从函数到异步实现

92 阅读3分钟

引言

在构建智能代理时,工具的创建至关重要。工具不仅可以帮助智能代理执行特定的任务,还为其提供丰富的上下文信息以提升执行能力。本文将详细介绍如何在LangChain框架中创建工具,从基本的函数实现到复杂的异步工具,并讨论可能的挑战和解决方案。

主要内容

创建工具的基本要素

每个工具都由几个基本组件构成:

  • name:工具名称,需在工具集内唯一。
  • description:工具描述,用于提供上下文。
  • args_schema:使用Pydantic BaseModel定义的参数验证模式。
  • return_direct:如果为True,工具将直接返回结果。

使用函数创建工具

@tool装饰器

通过@tool装饰器可以简单地将函数转换为工具。函数的名称默认为工具名,文档字符串作为描述。

from langchain_core.tools import tool

@tool
def multiply(a: int, b: int) -> int:
    """Multiply two numbers."""
    return a * b

print(multiply.name)  # Multiply
print(multiply.description)  # Multiply two numbers.

支持异步实现

可以创建异步版本的工具,以提高处理效率。

from langchain_core.tools import tool

@tool
async def amultiply(a: int, b: int) -> int:
    """Multiply two numbers."""
    return a * b

利用StructuredTool提供更多可配置性

StructuredTool可以提供同步和异步实现,从而灵活应对不同需求。

from langchain_core.tools import StructuredTool

def multiply(a: int, b: int) -> int:
    """Multiply two numbers."""
    return a * b

async def amultiply(a: int, b: int) -> int:
    """Multiply two numbers."""
    return a * b

calculator = StructuredTool.from_function(
    func=multiply, coroutine=amultiply
)

print(calculator.invoke({"a": 2, "b": 3}))  # 6

用Runnables创建工具

LangChain支持将Runnables转换为工具,通过as_tool方法进行实现。

from langchain_core.language_models import GenericFakeChatModel
from langchain_core.prompts import ChatPromptTemplate

prompt = ChatPromptTemplate.from_messages(
    [("human", "Hello. Please respond in the style of {answer_style}.")]
)

# Placeholder LLM
llm = GenericFakeChatModel(messages=iter(["hello matey"]))

chain = prompt | llm
as_tool = chain.as_tool(name="Style responder", description="Responds in given style.")

代码示例

下面是一个完整的工具创建示例,展示了如何使用StructuredTool并处理可能的错误。

from langchain_core.tools import StructuredTool, ToolException

def get_weather(city: str) -> int:
    """Get weather for the given city."""
    raise ToolException(f"Error: There is no city by the name of {city}.")

get_weather_tool = StructuredTool.from_function(
    func=get_weather,
    handle_tool_error=True,
)

# 使用API代理服务提高访问稳定性
print(get_weather_tool.invoke({"city": "foobar"}))

常见问题和解决方案

工具的访问稳定性

对于某些地区的网络限制,开发者可能需要考虑使用API代理服务以提高访问稳定性。

异步与同步的选择

在异步代码库中使用异步工具能避免不必要的开销。然而,在某些情况下需要同时实现同步与异步版本。

处理工具错误

为工具指定错误处理器可以提高错误处理的灵活性。

总结和进一步学习资源

创建LangChain工具不仅可以提升代理的能力,还可以通过自定义参数和错误处理来优化工具的行为。要进一步了解LangChain工具的创建,请参考以下资源:

参考资料

  1. LangChain官方文档
  2. Pydantic文档

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力! ---END---