一、前言

    在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解决了现在开发人工智能应用的一些切实痛点。


三、前提条件 

3.1. 基础环境

  1.  操作系统:不限

3.2. 安装虚拟环境

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

四、技术实现

4.1. 方式一 - tool注解

# -*- coding: utf-8 -*-
from pydantic import BaseModel, Field
from langchain_core.tools import tool

class ToolInput(BaseModel):
    region: str = Field(description="地区")

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

if __name__ == '__main__':
    # 打印下该工具的相关信息
    print("名称: ", get_current_weather.name)
    print("描述: ", get_current_weather.description)

    # 调用工具
    print(get_current_weather.invoke({"region": "广州"}))

    print(get_current_weather.invoke({"region": "深圳"}))

调用结果:

4.2. 方式二 - StructuredTool类

# -*- coding: utf-8 -*-
from pydantic import BaseModel, Field
from langchain_core.tools import  StructuredTool


class ToolInput(BaseModel):
    region: str = Field(description="地区")

def get_current_weather(region):
    if '广州' == region:
        return '目前我市多云间晴,局部有阵雨,气温29~32℃,吹轻微的东南风。'
    else:
        return '目前我市暴雨,气温30~33℃。'

get_current_weather_tool = StructuredTool.from_function(
    func=get_current_weather,
    coroutine=aget_current_weather,
    name="get_current_weather",
    description="获取指定地区的实时天气",
    return_direct=True,
    args_schema=ToolInput,
)

if __name__ == '__main__':
    # 打印下该工具的相关信息
    print("名称: ", get_current_weather_tool.name)
    print("描述: ", get_current_weather_tool.description)

    # 调用工具
    print(get_current_weather_tool.invoke({"region": "广州"}))

    print(get_current_weather_tool.invoke({"region": "深圳"}))

调用结果:

4.3. 方式三 - BaseTool类

# -*- coding: utf-8 -*-
from typing import Any, Type

from langchain_core.tools import BaseTool
from pydantic import BaseModel, Field

class ToolInput(BaseModel):
    region: str = Field(description="地区")

class MyTool(BaseTool):

    name: str = 'get_current_weather'
    description: str = "获取指定地区的实时天气"
    args_schema: Type[BaseModel] = ToolInput

    def _run(self, *args: Any, **kwargs: Any) -> Any:
        region = kwargs.get('region')
        if '广州' == region:
            return '目前我市多云间晴,局部有阵雨,气温29~32℃,吹轻微的东南风。'
        else:
            return '目前我市暴雨,气温30~33℃。'

if __name__ == '__main__':
    myTool = MyTool()

    # 打印下该工具的相关信息
    print("名称: ", myTool.name)
    print("描述: ", myTool.description)

    # 调用工具
    print(myTool.invoke({"region": "广州"}))

    print(myTool.invoke({"region": "深圳"}))

调用结果:


五、附带说明

5.1. 问题一

from langchain_core.pydantic_v1 import BaseModel, Field 过期

调整为

from pydantic import BaseModel, Field

Logo

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

更多推荐