LangChain从0到1:解锁Tools工具的无限可能

LangChain从0到1:解锁Tools工具的无限可能

本文较长,建议点赞收藏,以免遗失。更多AI大模型开发 学习视频/籽料/面试题 都在这>>Github<<

揭开 LangChain 中 Tools 的神秘面纱

在大模型开发的广阔天地中,LangChain 宛如一颗璀璨的明星,为开发者们提供了强大的支持和便利。它就像是一个万能的工具箱,里面装满了各种实用的工具,帮助我们更高效地构建基于大语言模型的应用程序。而 Tools(工具)作为 LangChain 中的关键组成部分,更是发挥着举足轻重的作用。它能让大语言模型突破自身的限制,与外部世界进行交互,从而实现更加复杂和智能的功能。就好比给大模型插上了翅膀,让它能够在实际应用的天空中自由翱翔。接下来,就让我们一起深入探索 LangChain 中 Tools 的奥秘吧!

Tools 是什么

在 LangChain 的体系里,Tools(工具)是一类极为特殊且关键的存在,简单来说,它是语言模型(LLM)与外部系统交互的桥梁,能够让语言模型突破单纯文本处理的局限 ,极大地扩展了其功能边界。

想象一下,语言模型就像是一位知识渊博的学者,拥有海量的知识储备,但它的知识往往局限于预先训练的数据中,对于实时信息、外部系统的操作等就显得力不从心。而 Tools 的出现,就像是给这位学者配备了各种助手,这些助手可以帮他查询最新的新闻、调用专业的数据库、执行复杂的计算任务等等。

常见的 Tools 交互方式有很多,比如网络搜索,当语言模型需要获取最新的资讯时,就可以借助像 SerpAPI 这样的搜索工具,在互联网的海量信息中查找相关内容;再比如 API 调用,通过调用各类 API,语言模型能够获取实时的天气数据、股票行情等。以查询天气为例,模型可以利用 OpenWeatherMap 的 API 工具,根据用户输入的城市名称,获取该城市当前的天气状况。这些交互方式让语言模型能够与现实世界的各种数据和服务进行连接,从而实现更加智能和实用的功能。

可以说,Tools 对于增强语言模型的能力至关重要。它弥补了语言模型在数学计算、实时数据获取、特定领域知识应用等方面的不足。比如在处理一些需要精确计算的问题时,PythonREPLTool 工具就可以让模型执行 Python 代码进行数学运算;在需要获取最新信息的场景下,搜索类工具能帮助模型及时获取到最新的新闻、行业动态等。有了 Tools 的加持,语言模型在实际应用中变得更加灵活和强大,能够满足更多复杂场景的需求,从单纯的文本生成转变为能够解决实际问题的智能助手。

Tools 的核心构成要素

LangChain 中的 Tools 看似复杂,但其核心构成要素却有着清晰的逻辑和分工 ,主要包含名称、输入、描述、函数和返回直接结果这几个关键部分。这些要素各自承担着独特的职责,共同协作,使得 Tools 能够高效地发挥作用,为语言模型与外部系统的交互提供有力支持。下面就来详细剖析一下这些核心构成要素。

名称(name)

名称就像是工具的身份证,是其唯一的标识符。在 LangChain 的工具库中,每个工具都被赋予了一个独一无二的名称,这个名称在程序中扮演着至关重要的角色。它方便我们在复杂的程序架构中准确无误地调用所需的工具,就好比在图书馆中,每本书都有一个特定的编号,我们可以通过这个编号快速找到想要的书籍。例如,当我们需要使用查询维基百科的工具时,其名称 "WikipediaQueryRun" 就能够帮助我们迅速定位并调用这个工具,而不会与其他工具混淆。同时,名称也便于程序对工具进行管理和维护,就像给每个工具贴上了一个清晰的标签,让开发者能够一目了然地知道每个工具的用途和功能。

输入(input)

输入是工具执行功能的 "原料",是工具运行的基础。不同的工具对输入有着不同的要求和格式,这就好比不同的机器需要不同类型的燃料才能正常运转。以搜索类工具为例,它通常需要一个关键词作为输入,这个关键词就是我们希望获取信息的主题。像 "Python 教程" 这样的关键词输入到搜索工具中,工具就能根据这个关键词在互联网或指定的数据库中进行搜索,从而为我们返回相关的信息。再比如,对于一个数学计算工具,它可能需要两个数字以及具体的运算符号作为输入,如 "3""+""5",这样工具才能准确地执行加法运算,得出 "8" 的结果。如果输入不符合工具的要求格式,工具就无法正常工作,就像给汽车加了错误的燃料,汽车就无法启动一样。所以,在使用工具时,我们必须确保输入的正确性和完整性,以保证工具能够顺利地执行任务,为我们提供准确的结果。

描述(description)

描述是对工具用途的详细说明,它在代理决策过程中起着关键的指导作用。一个清晰、准确的描述就像是一份详细的使用说明书,能够帮助代理(agent)判断在什么情况下使用该工具最为合适。比如,有一个工具的描述是 "该工具用于获取指定城市的实时天气数据,输入为城市名称",当代理接收到用户询问 "北京今天的天气如何" 这样的问题时,通过对这个描述的理解,代理就能判断出可以使用这个工具来解决用户的问题,因为问题中涉及到了城市名称和天气查询,与工具的描述高度匹配。如果描述模糊不清,代理就很难准确地判断工具的使用时机,就像没有说明书的工具,我们很难知道它的用途和使用方法一样。所以,在定义工具时,一定要编写详细、明确的描述,这样才能让代理更好地利用工具,提高解决问题的效率和准确性。

函数(func)

函数是工具功能的具体实现,是工具的核心 "引擎"。它包含了工具执行任务的具体逻辑和操作步骤。以一个简单的加法工具为例,其函数可能如下所示:

python 复制代码
def add_numbers(a, b):
    return a + b

在这个函数中,它接收两个参数ab,然后执行加法运算,最后返回结果。当代理决定使用这个加法工具时,就会调用这个函数,并传入相应的参数。比如,代理传入参数35,函数就会执行加法运算,返回8。这个过程就像是工厂中的生产线,输入的参数是原材料,函数按照既定的规则对原材料进行加工,最终输出我们需要的产品。不同的工具其函数实现也各不相同,复杂的工具函数可能会涉及到网络请求、数据库查询等多种操作,以实现更为复杂的功能。

返回直接结果(return_direct)

返回直接结果是一个控制工具输出方式的参数。当return_direct设置为True时,代理将直接返回工具的结果,而不是将其作为思考过程的一部分。这在一些简单直接的场景中非常有用,比如当用户询问 "3 加 5 等于多少" 时,使用加法工具计算后,直接返回结果 "8",能够快速地响应用户的问题,提高交互效率。而在一些需要代理进行综合分析和推理的场景中,可能就不需要直接返回结果,而是将工具的结果作为进一步思考和处理的依据。例如,在一个需要回答复杂问题的场景中,可能需要先调用多个工具获取不同的信息,然后再对这些信息进行整合和分析,最后得出最终的答案。所以,return_direct参数的设置需要根据具体的应用场景和需求来灵活调整,以达到最佳的使用效果。

LangChain 中那些实用的默认 Tools

LangChain 提供了丰富多样的默认 Tools,这些工具涵盖了搜索、数据查询、文件操作、代码执行等多个领域,为开发者们解决各种实际问题提供了极大的便利。下面,我们就来详细了解一下这些实用的工具。

搜索类工具

搜索类工具就像是我们在信息海洋中的导航仪,能够帮助我们快速找到所需的信息。在 LangChain 中,常见的搜索类工具包括 BingSearchRun、GoogleSearchRun 等。以 BingSearchRun 为例,它可以调用必应搜索的 API,在互联网上搜索相关信息。假如你想了解最近的时事新闻,只需要使用 BingSearchRun 工具,输入 "最近一周的国际新闻",它就能迅速在网络上搜索相关内容,并返回包含新闻标题、摘要和链接的结果。通过这些结果,你可以快速了解国际上发生的大事,而无需在众多新闻网站中逐一查找。同样,GoogleSearchRun 工具则借助谷歌搜索强大的搜索能力,为我们提供精准的搜索结果。这些搜索类工具在需要获取实时信息、了解行业动态等场景中发挥着重要作用,让我们能够紧跟时代的步伐,获取最新、最准确的信息。

数据查询类工具

在数据驱动的时代,数据查询类工具是我们获取和分析数据的得力助手。QuerySQLDataBaseTool、InfoSQLDatabaseTool 等工具就是这一类别的代表。比如,当我们面对一个庞大的数据库,里面存储着公司多年的销售数据,而我们需要查询某个地区在特定时间段内的销售总额时,就可以使用 QuerySQLDataBaseTool 工具。通过它,我们只需用自然语言描述查询需求,如 "查询北京地区在 2023 年 1 月到 6 月的销售总额",它就能将自然语言转换为 SQL 查询语句,并在数据库中执行查询操作,最终返回我们需要的销售总额数据。而 InfoSQLDatabaseTool 工具则更侧重于获取数据库的结构信息,比如表的字段、数据类型等,这对于我们了解数据库的架构,进行更深入的数据挖掘和分析非常有帮助。在数据分析、报表生成等场景中,这些数据查询类工具能够让我们轻松地从海量的数据中提取有价值的信息,为决策提供有力支持。

文件操作类工具

文件操作类工具是我们管理文件的好帮手,能够帮助我们高效地进行文件的复制、删除、移动等操作。CopyFileTool、DeleteFileTool 等工具就属于这一类别。比如,在一个项目中,我们可能需要将一些重要的配置文件复制到不同的目录中,以满足不同环境的需求。这时,CopyFileTool 工具就派上用场了,我们只需指定源文件路径和目标文件路径,它就能快速地完成文件复制操作,节省了我们手动复制的时间和精力。再比如,当我们完成一个任务后,一些临时文件已经不再需要,使用 DeleteFileTool 工具,输入要删除的文件路径,就能轻松地删除这些文件,释放磁盘空间,保持文件系统的整洁。在文件管理、项目部署等场景中,这些文件操作类工具能够大大提高我们的工作效率,让文件管理变得更加轻松和便捷。

代码执行类工具

代码执行类工具为我们提供了一个动态执行代码的环境,让我们能够在需要时灵活地运行和调试代码。PythonREPLTool 就是这类工具的典型代表。假设我们在开发一个数据分析项目时,需要验证一个复杂的数学计算逻辑是否正确,或者测试一段新编写的 Python 代码的功能。这时,我们可以使用 PythonREPLTool 工具,将代码输入到工具中,它会立即执行代码,并返回执行结果。如果代码中存在语法错误或逻辑错误,它也会及时给出错误提示,帮助我们快速定位和解决问题。在开发调试、算法验证等场景中,PythonREPLTool 工具就像是一个随时可用的代码实验室,让我们能够快速验证想法,提高开发效率,为我们的编程工作提供了极大的便利。

手把手教你使用 Tools

安装与基本配置

在开始使用 LangChain 的 Tools 之前,我们首先需要完成相关的安装和基本配置工作。这是我们开启工具之旅的第一步,就像搭建房屋需要先打好地基一样,只有基础稳固,后续的操作才能顺利进行。

安装 LangChain 可以使用 pip 这个常用的 Python 包管理工具。在命令行中输入以下命令:

复制代码
pip install langchain

这个命令会从 Python Package Index(PyPI)上下载并安装 LangChain 及其依赖项。安装过程可能需要一些时间,具体取决于你的网络速度和计算机性能。在安装过程中,请确保你的网络连接稳定,以免出现安装中断的情况。

除了 LangChain 本身,根据你要使用的具体工具,可能还需要安装一些额外的依赖库。比如,如果你想使用基于搜索引擎的工具,可能需要安装对应的搜索引擎 API 库;如果要使用数据库查询工具,就需要安装相应的数据库驱动。以使用 WikipediaQueryRun 工具为例,我们需要安装wikipedia库,在命令行中输入:

复制代码
pip install wikipedia

这样就完成了wikipedia库的安装,为使用 Wikipedia 相关工具做好了准备。

在使用一些需要 API 密钥的工具时,如 OpenAI 相关的工具,我们还需要配置 API 密钥。以 OpenAI 为例,我们可以通过环境变量来设置 API 密钥。在 Python 代码中,可以这样设置:

lua 复制代码
import os

os.environ["OPENAI_API_KEY"] = "your_openai_api_key"

"your_openai_api_key"替换为你自己的 OpenAI API 密钥。这样,当我们在代码中使用 OpenAI 相关的工具时,LangChain 就能够通过这个环境变量获取到 API 密钥,从而正常调用 OpenAI 的服务。需要注意的是,API 密钥是非常敏感的信息,不要将其直接硬编码在代码中,并且要妥善保管,避免泄露。

单个 Tool 的使用示例

了解了安装和配置后,我们通过一个具体的例子来看看单个 Tool 的使用方法。这里我们以 WikipediaQueryRun 工具为例,它可以帮助我们在维基百科上查询相关信息,就像在知识的海洋中找到了一把精准的导航钥匙。

首先,我们需要导入必要的模块和类。在 Python 中,使用以下代码导入:

javascript 复制代码
from langchain_community.tools import WikipediaQueryRun

from langchain_community.utilities import WikipediaAPIWrapper

这里,WikipediaQueryRun是我们要使用的工具类,WikipediaAPIWrapper则是用于包装维基百科 API 的工具,它为WikipediaQueryRun提供了与维基百科交互的基础。

接下来,我们需要初始化工具。在初始化过程中,我们可以设置一些参数来定制工具的行为。比如,我们可以设置查询结果返回的最大数量和每个结果的最大字符数。代码如下:

ini 复制代码
# 设置API包装器,限制返回的最大结果数和字符数

api_wrapper = WikipediaAPIWrapper(top_k_results=1, doc_content_chars_max=100)

# 初始化Wikipedia查询工具

tool = WikipediaQueryRun(api_wrapper=api_wrapper)

在这段代码中,我们创建了一个WikipediaAPIWrapper对象api_wrapper,并设置top_k_results=1表示只返回一个查询结果,doc_content_chars_max=100表示每个结果的最大字符数为 100。然后,我们使用这个api_wrapper来初始化WikipediaQueryRun工具tool

最后,我们就可以调用工具来执行查询任务了。比如,我们想查询关于 "LangChain" 的信息,可以使用以下代码:

ini 复制代码
# 执行查询

result = tool.invoke({"query": "LangChain"})

print(result)

在这段代码中,我们使用tool.invoke()方法来调用工具,并传入一个包含查询关键词的字典{"query": "LangChain"}invoke()方法会执行查询操作,并返回查询结果。我们将结果打印出来,就可以看到关于 "LangChain" 的简要介绍。

通过这个例子,我们可以看到单个 Tool 的使用并不复杂,只需要按照导入工具、初始化参数、调用工具这几个步骤,就能够轻松地使用工具获取我们需要的信息。

多个 Tools 协作完成复杂任务

在实际应用中,很多复杂的任务往往需要多个工具的协作才能完成。就像建造一座房子,需要泥瓦工、木工、电工等多个工种的协同合作一样,不同的工具在任务中扮演着不同的角色,共同为实现最终目标而努力。我们构建一个查询某城市天气并规划旅行行程的场景,来展示多个工具是如何协作的。

首先,我们需要用到两个工具:一个是用于查询天气的工具,比如 OpenWeatherMapAPIWrapper;另一个是用于规划旅行行程的工具,我们可以自定义一个简单的行程规划工具。

假设我们已经安装好了相关的依赖库,并配置好了 OpenWeatherMap 的 API 密钥(通过环境变量os.environ["OPENWEATHERMAP_API_KEY"]设置)。以下是代码示例:

python 复制代码
from langchain_community.tools import BaseTool
from langchain_community.utilities import OpenWeatherMapAPIWrapper


# 自定义行程规划工具
class TravelItineraryTool(BaseTool):
    name = "travel_itinerary_planner"
    description = "规划旅行行程,输入为城市名称和旅行天数,输出为旅行行程安排"

    def _run(self, city: str, days: int):
        itinerary = f"在{city}的{days}天旅行行程:\n"
        itinerary += "第一天:参观当地著名景点1\n"
        itinerary += "第二天:体验当地特色美食\n"
        # 这里可以根据实际情况更复杂地生成行程
        return itinerary

    def _arun(self, city: str, days: int):
        raise NotImplementedError


# 初始化天气查询工具
weather_api_wrapper = OpenWeatherMapAPIWrapper()
weather_tool = OpenWeatherMapAPIWrapper()

# 初始化行程规划工具
itinerary_tool = TravelItineraryTool()


# 模拟代理执行任务
def execute_task(city: str, days: int):
    # 查询天气
    weather = weather_tool.run(f"{city}天气")
    # 规划行程
    itinerary = itinerary_tool.run(city=city, days=days)
    result = f"城市:{city}\n天气:{weather}\n旅行行程:{itinerary}"
    return result


# 执行任务
city = "北京"
days = 3
result = execute_task(city, days)
print(result)

在这段代码中,我们首先定义了一个自定义的行程规划工具TravelItineraryTool,它继承自BaseTool,并重写了_run方法来实现行程规划的逻辑。然后,我们初始化了天气查询工具OpenWeatherMapAPIWrapper和行程规划工具TravelItineraryTool

execute_task函数中,我们模拟了代理执行任务的过程。首先调用天气查询工具获取城市的天气信息,然后调用行程规划工具生成旅行行程。最后,将天气信息和旅行行程组合起来返回。

通过这个例子,我们可以看到多个工具之间的协作能够实现更加复杂和实用的功能。在实际应用中,我们可以根据具体的需求,灵活地组合不同的工具,让大语言模型能够完成各种各样的复杂任务,为用户提供更加全面和智能的服务。

实战演练:用 Tools 打造智能应用

智能客服系统

在当今数字化时代,智能客服系统已成为企业提升客户服务效率和质量的关键工具。而 LangChain 中的 Tools 在智能客服系统的构建中发挥着重要作用,能够让智能客服更加智能、高效地响应用户的问题。

在智能客服系统中,Tools 主要应用于与用户的交互环节。当用户提出问题时,智能客服首先会利用自然语言处理工具对用户的问题进行理解和分析,提取关键信息。然后,根据问题的类型和需求,调用相应的工具来获取答案。比如,如果用户询问产品的使用方法,智能客服可能会调用知识库查询工具,在产品知识库中查找相关的使用说明;如果用户询问的是最新的活动信息,智能客服则可以借助搜索工具,在企业的活动公告中查找最新的活动内容。

以一个电商智能客服为例,我们来看一下实现思路和关键代码。假设我们使用的是 OpenAI 的语言模型和 LangChain 框架,首先需要安装相关的依赖库:

复制代码
pip install langchain openai

然后,配置 OpenAI 的 API 密钥:

lua 复制代码
import os

os.environ["OPENAI_API_KEY"] = "your_openai_api_key"

接下来,定义一些工具。比如,我们定义一个查询商品库存的工具:

ini 复制代码
from langchain.agents import Tool
from langchain_community.utilities import SQLDatabase
from langchain_community.tools.sql_database.tool import QuerySQLDataBaseTool

# 连接到数据库
db = SQLDatabase.from_uri("sqlite:///ecommerce.db")
# 初始化查询数据库工具
sql_tool = QuerySQLDataBaseTool(db=db)

# 封装成查询商品库存的工具
def check_product_stock(product_id):
    query = f"SELECT stock FROM products WHERE product_id = {product_id}"
    result = sql_tool.run(query)
    return result

stock_tool = Tool(
    name="CheckProductStock",
    func=lambda query: check_product_stock(query),
    description="查询商品库存,输入为商品ID"
)

再定义一个智能代理,让它能够根据用户的问题选择合适的工具来回答:

ini 复制代码
from langchain.agents import initialize_agent
from langchain_openai import ChatOpenAI

# 初始化语言模型
llm = ChatOpenAI(temperature=0)
# 初始化代理
agent = initialize_agent(
    tools=[stock_tool],
    llm=llm,
    agent="zero-shot-react-description",
    verbose=True
)

最后,我们可以模拟用户提问,测试智能客服的效果:

ini 复制代码
user_question = "查询商品ID为1001的库存"

response = agent.run(user_question)

print(response)

通过以上代码,我们构建了一个简单的电商智能客服系统,它能够利用 Tools 查询商品库存,回答用户的问题。在实际应用中,我们还可以根据业务需求,添加更多的工具,如查询订单状态、推荐商品等,让智能客服系统更加完善。

数据分析助手

在数据驱动的决策时代,数据分析助手成为了数据分析师和业务人员的得力工具。LangChain 中的 Tools 能够帮助数据分析助手实现更强大的数据处理和分析功能,让数据分析变得更加高效和智能。

数据分析助手在处理数据时,常常需要连接各种数据库,获取数据并进行分析。Tools 在这个过程中扮演着重要的角色。比如,我们可以使用 QuerySQLDataBaseTool 工具连接到 SQL 数据库,执行数据查询操作。假设我们有一个销售数据库,里面存储着公司各个地区、各个时间段的销售数据。我们想要分析某个地区在特定时间段内的销售趋势,就可以使用这个工具编写 SQL 查询语句,从数据库中获取相关数据。

以处理销售数据为例,我们来展示一下具体的应用过程。首先,安装必要的依赖库:

复制代码
pip install langchain sqlalchemy pandas

然后,连接到销售数据库:

ini 复制代码
from langchain_community.utilities import SQLDatabase

# 连接到MySQL数据库

db_user = "root"

db_password = "123456"

db_host = "localhost"

db_port = "3306"

db_name = "sales_db"

db = SQLDatabase.from_uri(f"mysql+pymysql://{db_user}:{db_password}@{db_host}:{db_port}/{db_name}")

接下来,定义一个分析销售数据的工具。比如,我们要查询某个地区在特定时间段内的销售总额:

ini 复制代码
from langchain.agents import Tool

def analyze_sales_data(region, start_date, end_date):
    query = f"SELECT SUM(sales_amount) FROM sales WHERE region = '{region}' AND sale_date BETWEEN '{start_date}' AND '{end_date}'"
    result = db.run(query)
    return result

sales_analysis_tool = Tool(
    name="AnalyzeSalesData",
    func=lambda query: analyze_sales_data(*query.split(",")),
    description="分析销售数据,输入为地区,开始日期,结束日期,用于查询特定地区在特定时间段内的销售总额"
)

再定义一个智能代理,让它能够根据用户的需求调用这个工具进行数据分析:

ini 复制代码
from langchain.agents import initialize_agent
from langchain_openai import ChatOpenAI

# 初始化语言模型
llm = ChatOpenAI(temperature=0)
# 初始化代理
agent = initialize_agent(
    tools=[sales_analysis_tool],
    llm=llm,
    agent="zero-shot-react-description",
    verbose=True
)

最后,我们可以模拟用户提问,让数据分析助手进行数据分析:

ini 复制代码
user_request = "北京,2023-01-01,2023-12-31"

response = agent.run(f"查询{user\_request}的销售总额")

print(response)

通过以上代码,我们实现了一个简单的数据分析助手,它能够利用 Tools 连接数据库,执行数据查询和分析操作,帮助我们快速获取所需的销售数据洞察。在实际应用中,我们还可以结合数据可视化工具,将分析结果以图表的形式展示出来,让数据洞察更加直观和易于理解。

自动化办公脚本

在日常办公中,我们常常会遇到一些重复性的任务,如文件整理、邮件发送等。这些任务不仅繁琐,而且容易出错,耗费我们大量的时间和精力。而自动化办公脚本的出现,为我们解决了这些烦恼,让办公变得更加高效和轻松。LangChain 中的 Tools 在自动化办公脚本的编写中发挥着重要作用,能够帮助我们实现各种复杂的办公自动化任务。

在自动化办公脚本中,Tools 可以用于实现各种文件操作和邮件发送等任务。比如,我们可以使用 CopyFileTool 工具复制文件,将重要的文件备份到不同的文件夹中;使用 DeleteFileTool 工具删除临时文件,释放磁盘空间,保持文件系统的整洁;使用 SendEmailTool 工具发送邮件,自动向团队成员发送会议通知、报告等。

以一个简单的自动化办公场景为例,假设我们需要每天将当天生成的销售报表文件复制到备份文件夹中,并向领导发送一封包含报表附件的邮件。我们可以使用 LangChain 的 Tools 来实现这个自动化办公脚本。首先,安装相关的依赖库:

复制代码
pip install langchain python-dotenv

然后,配置环境变量,用于存储邮件服务器的相关信息(假设使用的是 Gmail):

lua 复制代码
import os

from dotenv import load_dotenv

load_dotenv()

EMAIL_ADDRESS = os.getenv("EMAIL_ADDRESS")

EMAIL_PASSWORD = os.getenv("EMAIL_PASSWORD")

接下来,定义文件操作工具和邮件发送工具。这里我们自定义一个简单的邮件发送工具,利用 Python 的smtplibemail库来实现:

python 复制代码
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
from langchain_community.agent_toolkits import FileManagementToolkit
from langchain_community.utilities import PythonREPL

# 初始化文件管理工具包
with TemporaryDirectory() as temp_dir:
    toolkit = FileManagementToolkit(root_dir=temp_dir)
    file_tools = toolkit.get_tools()

# 自定义邮件发送工具
def send_email(to_email, subject, body, attachment_path=None):
    msg = MIMEMultipart()
    msg['From'] = EMAIL_ADDRESS
    msg['To'] = to_email
    msg['Subject'] = subject

    msg.attach(MIMEText(body, 'plain'))

    if attachment_path:
        with open(attachment_path, "rb") as f:
            part = MIMEApplication(f.read(), Name=os.path.basename(attachment_path))
            part['Content-Disposition'] = f'attachment; filename="{os.path.basename(attachment_path)}"'
            msg.attach(part)

    with smtplib.SMTP('smtp.gmail.com', 587) as server:
        server.starttls()
        server.login(EMAIL_ADDRESS, EMAIL_PASSWORD)
        server.sendmail(EMAIL_ADDRESS, to_email, msg.as_string())

email_tool = Tool(
    name="SendEmail",
    func=lambda query: send_email(*query.split(",")),
    description="发送邮件,输入为收件人邮箱,邮件主题,邮件内容,附件路径(可选)"
)

再定义一个智能代理,让它能够根据任务需求调用这些工具:

ini 复制代码
from langchain.agents import initialize_agent
from langchain_openai import ChatOpenAI

# 初始化语言模型
llm = ChatOpenAI(temperature=0)
# 初始化代理
agent = initialize_agent(
    tools=file_tools + [email_tool],
    llm=llm,
    agent="zero-shot-react-description",
    verbose=True
)

最后,我们可以模拟任务需求,让自动化办公脚本执行任务:

ini 复制代码
sales_report_path = "sales_report_20241010.csv"

backup_folder = "backup_sales_reports"

to_email = "manager@company.com"

subject = "每日销售报表"

body = "领导,这是今天的销售报表,请查收。"

user_task = f"将{sales_report_path}复制到{backup_folder},并向{to_email}发送邮件,主题为{subject},内容为{body},附件为{sales_report_path}"

response = agent.run(user_task)

print(response)

通过以上代码,我们实现了一个简单的自动化办公脚本,它能够利用 Tools 完成文件复制和邮件发送的任务,大大提高了办公效率。在实际应用中,我们可以根据具体的办公需求,添加更多的工具和功能,让自动化办公脚本更加智能化和个性化,满足不同场景下的办公自动化需求。

总结

通过本文的探索,我们对 LangChain 中的 Tools 有了全面而深入的了解。从揭开 Tools 的神秘面纱,认识到它作为语言模型与外部系统交互桥梁的重要性,到剖析其核心构成要素,包括名称、输入、描述、函数和返回直接结果,我们逐步掌握了 Tools 的内在逻辑。接着,我们详细了解了 LangChain 中丰富多样的默认 Tools,涵盖搜索、数据查询、文件操作、代码执行等多个领域,这些工具为我们解决各种实际问题提供了有力的支持。在使用方法上,我们从安装与基本配置开始,逐步深入到单个 Tool 的使用示例以及多个 Tools 协作完成复杂任务的实践,通过实际代码示例,我们掌握了如何在项目中灵活运用 Tools。最后,在实战演练环节,我们将 Tools 应用于智能客服系统、数据分析助手和自动化办公脚本等实际场景中,进一步验证了 Tools 的强大功能和广泛应用价值。

相关推荐
数智化管理手记1 小时前
手工统计指标误差大、效率低?指标管理系统如何告别人工算数痛点?
大数据·运维·数据库·人工智能·云计算
fthux5 小时前
RenoPit 能为普通业主做什么?看懂图纸、审查合同,提前发现装修坑
javascript·人工智能·ai·开源·github·chrome扩展·open source·edge扩展·firefox扩展
火山引擎开发者社区7 小时前
火山引擎混合云 veStack 智算平台 Day0 适配 Kimi K3
人工智能
RSABLOCKCHAIN7 小时前
AI Agents in LangGraph-2
人工智能·python
cd_949217218 小时前
哪些AI工具适合生成游戏开发用的3D道具模型?从道具草稿到引擎测试的选择方法
人工智能·3d
FII工业富联科技服务8 小时前
工业设备运维如何Agentic化?拆解Factory Brain的设备运维架构
大数据·运维·人工智能·架构·制造
糖果店的幽灵8 小时前
人已经用 WorkBuddy 找工作拿了面试,你还在一份份手工改简历
人工智能·面试·职场和发展·langgraph
qq29539 小时前
2026 财搭子决策模拟器:多智能体投研架构能力拆解
大数据·人工智能·架构
满怀冰雪10 小时前
12-PaddlePaddle, 飞桨, 分类模型, 训练循环, 损失函数, 优化器, cross_entropy, Adam
人工智能·深度学习·分类·paddlepaddle
冬奇Lab10 小时前
AI 评测系列(08):评测 CI/CD——持续质量门控
人工智能