青训营X豆包MarsCode 技术训练营第八课 | 豆包MarsCode AI 刷题

25 阅读5分钟

学习笔记:自然语言数据库查询与LangChain应用

1. 结构化查询语言(SQL)与传统数据库管理

  • 定义:SQL是一种用于数据库管理系统(DBMS)的编程语言,用于查询、更新和管理关系数据库中的数据。
  • 操作要求:需要深入了解技术和数据结构,使用严格、专业且结构化的语言。

2. 自然语言处理(NLP)与数据库查询

  • 新范式:使用NLP技术,用户可以用自然语言与数据库交互,如提问“去年的总销售额是多少?”。
  • 过程
    1. 提出问题:用户用自然语言提出问题。
    2. LLM理解并转译:LLM解析问题,生成相应的SQL查询语句。
    3. 执行SQL查询:数据库执行SQL查询并返回结果。
    4. LLM接收并解释结果:LLM将结果转化为人类易懂的自然语言答案。
    5. 提供答案:LLM返回最终答案给用户。

下面这个图,非常清晰地解释了这个以LLM为驱动引擎,从自然语言的(模糊)询问,到自然语言的查询结果输出的流程。

这种范式结合了自然语言处理和传统数据库查询的功能,为用户提供了一个更为直观和高效的交互方式。下面我来解释下这个过程。

  1. 提出问题:用户用自然语言提出一个问题,例如“去年的总销售额是多少?”。
  2. LLM理解并转译:LLM首先会解析这个问题,理解其背后的意图和所需的信息。接着,模型会根据解析的内容,生成相应的SQL查询语句,例如 “SELECT SUM(sales) FROM sales_data WHERE year = 'last_year';”。
  3. 执行SQL查询:生成的SQL查询语句会被发送到相应的数据库进行执行。数据库处理这个查询,并返回所需的数据结果。
  4. LLM接收并解释结果:当数据库返回查询结果后,LLM会接收到这些数据。然后,LLM会开始解析这些数据,并将其转化为更容易被人类理解的答案格式。
  5. 提供答案:最后,LLM将结果转化为自然语言答案,并返回给用户。例如“去年的总销售额为1,000,000元”。

3. LangChain在数据库查询中的应用

  • 实战案例:通过LangChain实现自然语言查询鲜花销售数据。
  • 数据库选择:使用SQLite作为轻量级数据库示例,适合小型应用和演示。

4. 创建数据库表

  • Python sqlite3库:用于创建和管理SQLite数据库。
  • 表结构:创建Flowers表,包含鲜花的名称、类型、来源、价格、库存等字段。
  • 数据插入:将鲜花数据插入Flowers表。

image.png

5. 使用LangChain查询数据库

  • 安装langchain-experimental包:包含实验性的LangChain新功能。
  • SQLDatabaseChain:通过LLM将自然语言问题转换为SQL查询并执行。
  • 示例代码:展示如何使用SQLDatabaseChain查询数据库。

因为LangChain的数据库查询功能较新,目前还处于实验阶段,因此,需要先安装langchain-experimental包,这个包含有实验性的LangChain新功能。

pip install langchain-experimental

下面,我们就开始通过SQLDatabaseChain来查询数据库。代码如下:

# 导入langchain的实用工具和相关的模块
from langchain.utilities import SQLDatabase
from langchain.llms import OpenAI
from langchain_experimental.sql import SQLDatabaseChain

# 连接到FlowerShop数据库(之前我们使用的是Chinook.db)
db = SQLDatabase.from_uri("sqlite:///FlowerShop.db")

# 创建OpenAI的低级语言模型(LLM)实例,这里我们设置温度为0,意味着模型输出会更加确定性
llm = OpenAI(temperature=0, verbose=True)

# 创建SQL数据库链实例,它允许我们使用LLM来查询SQL数据库
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模块,然后连接到FlowerShop数据库,初始化OpenAI的LLM实例。之后用SQLDatabaseChain来创建一个从LLM到数据库的链接。

最后,用db_chain.run()方法来查询多个与鲜花运营相关的问题,Chain的内部会把这些自然语言转换为SQL语句,并查询数据库表,得到查询结果之后,又通过LLM把这个结果转换成自然语言。

因此,Chain的输出结果是我们可以理解的,也是可以直接传递给Chatbot的人话。

输出如下:

SQLDatabaseChain调用大语言模型,完美地完成了从自然语言(输入)到自然语言(输出)的新型SQL查询。

6. 使用LangChain Agent查询数据库

  • 优点:根据数据库架构和内容回答问题,具有纠错能力。
  • SQL代理:使用create_sql_agent函数初始化,包含SQLDatabaseToolkit工具箱。
  • 示例代码:展示如何使用SQL代理执行查询。

7. 总结与挑战

  • 转变意义:从“告诉计算机怎么做”到“告诉计算机我们想要什么”。
  • 挑战:自然语言的模糊性、对现有系统的依赖、过度依赖机器决策。

8. 思考题

  • Chain与Agent的异同:探讨两种方法的实现和底层逻辑。
  • 代码深入:研究LangChain如何通过提示工程指导模型生成SQL代码。

知识点与逻辑结构

  • 自然语言与数据库交互:介绍了自然语言处理如何简化数据库查询过程。
  • LangChain实战应用:通过具体案例展示了LangChain在数据库查询中的应用。
  • 技术实现:详细解释了如何使用Python和SQLite创建和管理数据库,以及如何通过LangChain进行自然语言查询。
  • 未来趋势:讨论了自然语言查询带来的变革和挑战。