LangChain 中的 SQLDatabaseChain | 豆包MarsCode AI刷题

317 阅读5分钟

LangChain 中的 SQLDatabaseChain

随着自然语言处理(NLP)和大规模语言模型(LLM)技术的发展,计算机与用户的交互方式正在发生革命性的变化。以往的查询和操作数据库的方式需要用户通过编写SQL语句明确告诉计算机如何处理数据。然而,随着自然语言处理技术的不断进步,现在用户可以直接通过自然语言提出问题,计算机自动解析并转化为SQL查询语句,进而执行查询并返回结果。这种新型的交互方式使得与数据库的沟通更加直观和高效,尤其对于那些不熟悉SQL的用户而言,极大地降低了操作的门槛。

在这一进程中,LangChain 提供了强大的支持,尤其是其中的 SQLDatabaseChain。通过结合大语言模型和数据库查询的功能,LangChain 使得数据库查询和管理变得更加灵活与智能。。

什么是 SQLDatabaseChain?

SQLDatabaseChain 是 LangChain 库中的一个重要组件,旨在将大语言模型与数据库查询结合起来。它的核心功能是允许用户通过自然语言向数据库提问,并将语言模型生成的查询语句发送给数据库进行执行。模型不仅能够生成正确的SQL查询语句,还能够处理数据库返回的结果并将其转化为用户易于理解的自然语言答案。

工作原理

SQLDatabaseChain 的工作原理可以分为以下几个步骤:

  1. 接收自然语言问题:用户向系统提出问题,例如“去年的总销售额是多少?”。
  2. 解析问题并生成 SQL 查询:LangChain 使用语言模型解析问题的语义,理解问题中的关键信息(如时间、计算类型等),并自动生成相应的SQL查询语句。
  3. 执行查询:生成的SQL查询语句被发送到数据库进行执行,数据库返回相应的查询结果。
  4. 解析并返回答案:当数据库返回数据后,模型进一步处理这些数据,并将结果转化为自然语言格式返回给用户,例如“去年的总销售额为1,000,000元”。

这种方式不仅避免了用户需要编写SQL语句的繁琐,而且能够根据自然语言问题自动推理出最合适的查询方式,提高了操作的便捷性。

实际应用场景:鲜花销售数据库

为了更好地理解 SQLDatabaseChain 的使用方法,我们将通过一个具体的案例来演示这一过程。在这个案例中,我们的任务是查询一个鲜花销售数据库,该数据库包含有关鲜花的信息,如名称、类型、来源、销售价格、库存数量等数据。我们将使用 LangChain 中的 SQLDatabaseChain 来简化查询过程,使得用户能够通过自然语言向数据库提问,而不需要直接编写 SQL 语句。

数据库表结构

假设我们有一个名为 FlowerShop.db 的 SQLite 数据库,其中包含一个 Flowers 表,表结构如下:

Column NameTypeDescription
IDINTEGER鲜花的唯一标识符
NameTEXT鲜花的名称
TypeTEXT鲜花的类型
SourceTEXT鲜花的来源国家
PurchasePriceREAL进货价格
SalePriceREAL销售价格
StockQuantityINTEGER库存数量
SoldQuantityINTEGER销售数量
ExpiryDateDATE过期日期
DescriptionTEXT鲜花的描述
EntryDateDATE记录入库的日期

该表记录了五种不同鲜花的基本信息,包括每种鲜花的名称、销售价格、库存数量等数据。接下来,我们将通过 LangChain 提供的功能来实现自然语言查询。

安装 LangChain

首先,确保安装了 LangChain 库。如果尚未安装,可以使用以下命令:

pip install langchain

接下来,我们需要安装 langchain-experimental,它包含了与数据库交互的实验性功能:

pip install langchain-experimental

创建数据库

我们使用 SQLite 创建一个数据库并插入鲜花数据:

import sqlite3

# 连接到数据库
conn = sqlite3.connect("FlowerShop.db")
cursor = conn.cursor()

# 执行SQL命令来创建Flowers表
cursor.execute(
    """
        CREATE TABLE Flowers (
            ID INTEGER PRIMARY KEY, 
            Name TEXT NOT NULL, 
            Type TEXT NOT NULL, 
            Source TEXT NOT NULL, 
            PurchasePrice REAL, 
            SalePrice REAL,
            StockQuantity INTEGER, 
            SoldQuantity INTEGER, 
            ExpiryDate DATE,  
            Description TEXT, 
            EntryDate DATE DEFAULT CURRENT_DATE 
        );
    """
)

# 插入5种鲜花的数据
flowers = [
    (
        "Rose",
        "Flower",
        "France",
        1.2,
        2.5,
        100,
        10,
        "2023-12-31",
        "A beautiful red rose",
    ),
    (
        "Tulip",
        "Flower",
        "Netherlands",
        0.8,
        2.0,
        150,
        25,
        "2023-12-31",
        "A colorful tulip",
    ),
    ("Lily", "Flower", "China", 1.5, 3.0, 80, 5, "2023-12-31", "An elegant white lily"),
    (
        "Daisy",
        "Flower",
        "USA",
        0.7,
        1.8,
        120,
        15,
        "2023-12-31",
        "A cheerful daisy flower",
    ),
    (
        "Orchid",
        "Flower",
        "Brazil",
        2.0,
        4.0,
        50,
        2,
        "2023-12-31",
        "A delicate purple orchid",
    ),
]

for flower in flowers:
    cursor.execute(
        """
        INSERT INTO Flowers (Name, Type, Source, PurchasePrice, SalePrice, StockQuantity, SoldQuantity, ExpiryDate, Description) 
        VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?);
    """,
        flower,
    )

# 提交更改
conn.commit()

# 关闭数据库连接
conn.close()

使用 LangChain 查询数据库

现在,我们将通过 LangChain 来实现自然语言查询。在这个示例中,我们将使用 SQLDatabaseChain 来连接数据库,并执行一些查询操作:

from langchain.utilities import SQLDatabase
from langchain_experimental.sql import SQLDatabaseChain
import os
from langchain_openai import ChatOpenAI  # ChatOpenAI模型

db = SQLDatabase.from_uri("sqlite:///FlowerShop.db")

llm = ChatOpenAI(model=os.environ["LLM_MODELEND"], temperature=0, verbose=True)

db_chain = SQLDatabaseChain.from_llm(llm, db, verbose=True)

response = db_chain.run("有多少种不同的鲜花?")
print(response)

response = db_chain.run("哪种鲜花的存货数量最少?")
print(response)

response = db_chain.run("平均销售价格是多少?")
print(response)

response = db_chain.run("从法国进口的鲜花有多少种?")
print(response)

response = db_chain.run("哪种鲜花的销售量最高?")
print(response)

总结

LangChain 的 SQLDatabaseChain 为与数据库的交互提供了一种全新的方式。通过自然语言输入,结合大语言模型的强大解析能力,用户能够轻松地与数据库进行高效互动,而不必编写复杂的 SQL 查询语句。这种自然语言查询的方式不仅大大简化了数据库管理,还提高了用户体验,尤其对于那些不熟悉SQL的用户而言,极大地降低了操作的复杂度。