3. langchain中的tool使用 (How to handle tool errors)

本教程将介绍如何使用LangChain库构建一个复杂的工具链。我们将逐步解释代码的运行逻辑,并展示如何处理工具调用中的异常。

1. 初始化聊天模型

首先,我们需要初始化一聊天模型。这可以通过以下代码实现:

from langchain_openai import ChatOpenAI

llm = ChatOpenAI(
    temperature=0,
    model="GLM-4-Plus",
    openai_api_key="your api key",
    openai_api_base="https://open.bigmodel.cn/api/paas/v4/"
)

这里,我们创建了一个ChatOpenAI实例,设置了模型的温度、模型名称、API密钥和API基础URL。

2. 定义工具

接下来,我们定义一个工具,该工具将用于执行复杂的操作:

from langchain_core.tools import tool

@tool
def complex_tool(int_arg: int, float_arg: float, dict_arg: dict) -> int:
    """Do something complex with a complex tool."""
    
    raise ValueError
    return int_arg * float_arg

llm_with_tools = llm.bind_tools(
    [complex_tool],
)

这里,我们使用@tool装饰器定义了一个名为complex_tool的函数,该函数接受三个参数:int_argfloat_argdict_arg。函数体中故意抛出一个ValueError异常,以模拟工具执行中的错误。

3. 定义工具链

然后,我们定义一个工具链,该工具链将模型与工具结合使用:

chain = llm_with_tools | (lambda msg: msg.tool_calls[0]["args"]) | complex_tool

这里,我们使用管道操作符|将模型、一个lambda函数和工具连接起来。lambda函数用于提取工具调用的参数。

4. 调用工具链

接下来,我们尝试调用工具链:

chain.invoke(
    "use complex tool. the args are 5, 2.1, empty dictionary. don't forget dict_arg"
)

由于complex_tool中存在故意抛出的ValueError异常,调用将失败,并显示如下错误信息:

ValueError: 

5. 处理异常

为了处理工具调用中的异常,我们定义一个新的函数try_except_tool

from typing import Any
from langchain_core.runnables import Runnable, RunnableConfig

def try_except_tool(tool_args: dict, config: RunnableConfig) -> Runnable:
    try:
        complex_tool.invoke(tool_args, config=config)
    except Exception as e:
        return f"Calling tool with arguments:\n\n{tool_args}\n\nraised the following error:\n\n{type(e)}: {e}"

chain = llm_with_tools | (lambda msg: msg.tool_calls[0]["args"]) | try_except_tool

print(
    chain.invoke(
        "use complex tool. the args are 5, 2.1, empty dictionary. don't forget dict_arg"
    )
)

这个函数尝试调用工具,并在捕获到异常时返回错误信息。调用结果如下:

Calling tool with arguments:

{'dict_arg': {}, 'float_arg': 2.1, 'int_arg': 5}

raised the following error:

<class 'ValueError'>: 

6. 定义无错误的工具

为了演示工具链的正常运行,我们定义一个不抛出异常的工具:

@tool
def complex_tool_NoError(int_arg: int, float_arg: float, dict_arg: dict) -> int:
    """Do something complex with a complex tool."""
    
    return int_arg * float_arg

chain = llm_with_tools | (lambda msg: msg.tool_calls[0]["args"]) | complex_tool_NoError

better_model = llm.bind_tools(
    [complex_tool_NoError], tool_choice="complex_tool_NoError"
)

better_chain = better_model | (lambda msg: msg.tool_calls[0]["args"]) | complex_tool

chain_with_fallback = chain.with_fallbacks([better_chain])

chain_with_fallback.invoke(
    "use complex tool. the args are 5, 2.1, empty dictionary. don't forget dict_arg"
)

这里,我们定义了一个新的工具complex_tool_NoError,该工具正常返回参数的乘积。我们还创建了一个带有回退机制的工具链chain_with_fallback,以确保在主工具链失败时可以调用备选工具链。

调用结果如下:

10.5

这表明工具链成功执行并返回了正确的结果。

总结

通过本教程,我们学习了如何使用LangChain构建复杂的工具链,并处理工具调用中的异常。希望这能帮助你更好地理解和应用LangChain库。
参考链接:https://python.langchain.com/docs/how_to/tools_error/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值