本教程将介绍如何使用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_arg
、float_arg
和dict_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/