一、前言

    在Langchain框架中,创建自定义工具是实现特定功能和增强应用灵活性的关键步骤。然而,在这一过程中,可能会遇到工具调用异常的问题,这对应用的稳定性和用户体验构成挑战。当自定义工具与外部API或其他组件进行交互时,各种原因可能导致调用失败,例如网络问题、API响应格式不符、或者输入参数错误等。这些异常情况不仅影响工具的正常运行,还可能导致用户获取到不完整或错误的信息。

    为了有效应对这些挑战,我们应当在设计自定义工具时,加入异常处理机制。这包括验证输入参数的合法性、使用重试机制来处理临时性的网络故障、以及定义清晰的错误响应,确保用户能够理解发生了什么问题。

    合理的错误处理策略和对异常情况的敏感性,对于提升Langchain应用的可靠性和用户信任度至关重要。通过充分考虑这些因素,我们才能够更有效地利用Langchain框架的强大功能,为用户提供更加可靠和个性化的服务。

    前置学习:开源模型应用落地-LangChain实用小技巧-创建自定义工具(二十一)


二、术语

2.1.LangChain

    是一个全方位的、基于大语言模型这种预测能力的应用开发工具。LangChain的预构建链功能,就像乐高积木一样,无论你是新手还是经验丰富的开发者,都可以选择适合自己的部分快速构建项目。对于希望进行更深入工作的开发者,LangChain 提供的模块化组件则允许你根据自己的需求定制和创建应用中的功能链条。

    LangChain本质上就是对各种大模型提供的API的套壳,是为了方便我们使用这些 API,搭建起来的一些框架、模块和接口。

   LangChain的主要特性:
        1.可以连接多种数据源,比如网页链接、本地PDF文件、向量数据库等
        2.允许语言模型与其环境交互
        3.封装了Model I/O(输入/输出)、Retrieval(检索器)、Memory(记忆)、Agents(决策和调度)等核心组件
        4.可以使用链的方式组装这些组件,以便最好地完成特定用例。
        5.围绕以上设计原则,LangChain解决了现在开发人工智能应用的一些切实痛点。

2.2.LCEL(Language Chain Execution Language)

    是一个用于定义和执行链式语言模型的表达式语言。LCEL 的设计目的是为了提供一个高层次的抽象,允许开发者以声明的方式构建复杂的语言处理任务。


三、前提条件 

3.1. 基础环境

  1.  操作系统:不限

3.2. 安装虚拟环境

conda create --name langchain python=3.10
conda activate langchain
pip install langchain langchain-core langchain-community langchain-openai

四、技术实现

4.1. 构建正常流程

# -*- coding: utf-8 -*-
import os
from langchain_openai import ChatOpenAI
from langchain_core.tools import tool

os.environ["OPENAI_API_KEY"] = "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"


@tool("get_current_weather")
def get_current_weather(region):
    """获取指定地区的实时天气"""
    if '广州' == region.lower():
        return '目前我市多云间晴,局部有阵雨,气温29~32℃,吹轻微的东南风。'
    else:
        return '目前我市暴雨,气温30~33℃。'

if __name__ == '__main__':

    llm = ChatOpenAI(model="gpt-4o-mini", temperature=0.5)

    llm_with_tools = llm.bind_tools([get_current_weather])

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

    print(chain.invoke("广州现在天气如何?"))

调用结果:

4.2. 构建异常流程

# -*- coding: utf-8 -*-
import os
from langchain_openai import ChatOpenAI
from langchain_core.tools import tool

os.environ["OPENAI_API_KEY"] = "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"


@tool("get_current_weather")
def get_current_weather(region):
    """获取指定地区的实时天气"""
    print(f'region: {region}')
    if '广州' == region.lower():
        return '目前我市多云间晴,局部有阵雨,气温29~32℃,吹轻微的东南风。'
    else:
        raise ValueError('未传入正确参数')


if __name__ == '__main__':

    llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)

    llm_with_tools = llm.bind_tools([get_current_weather])

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

    print(chain.invoke("广州现在天气如何?"))

调用结果:

4.3. 异常捕获处理

# -*- coding: utf-8 -*-
import os
from typing import Any

from langchain_openai import ChatOpenAI
from langchain_core.tools import tool

os.environ["OPENAI_API_KEY"] = "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"


@tool("get_current_weather")
def get_current_weather(region):
    """获取指定地区的实时天气"""
    print(f'region: {region}')
    if '广州' == region.lower():
        return '目前我市多云间晴,局部有阵雨,气温29~32℃,吹轻微的东南风。'
    else:
        raise ValueError('未传入正确参数')


def try_except_tool(region: str) -> Any:
    try:
        return get_current_weather.invoke(region)
    except Exception as e:
       return f'参数"{region}"有误'


if __name__ == '__main__':

    llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)

    llm_with_tools = llm.bind_tools([get_current_weather])

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

    print(chain.invoke("广州现在天气如何?"))

调用结果:

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐