LangChain SQL案例介绍
企业数据通常存储在 SQL 数据库中。
LLM 使使用自然语言与 SQL 数据库交互成为可能。
LangChain 提供 SQL 链和代理,可根据自然语言提示构建和运行 SQL 查询。
它们与 SQLAlchemy 支持的任何 SQL 方言(如 MySQL、PostgreSQL、Oracle SQL、Databricks、SQLite)兼容。
它们支持以下使用情况:
- 生成根据自然语言问题运行的查询
- 创建可根据数据库数据回答问题的聊天机器人
- 根据用户希望分析的见解创建自定义仪表板
概述
LangChain 提供与 SQL 数据库交互的工具:
- 根据用户的自然语言问题创建 SQL 查询
- 使用链查询 SQL 数据库,以创建和执行查询
- 使用代理与 SQL 数据库交互,实现强大而灵活的查询
快速开始
首先,获取所需软件包并设置环境变量:
pip install langchain langchain-experimental openai
# 设置 env 变量 OPENAI_API_KEY,或从 .env 文件加载
# import dotenv
# dotenv.load_env()
下面的示例将使用 SQLite 连接 Chinook 数据库。
按照安装步骤在与本笔记本相同的目录下创建 Chinook.db:
- 将此文件保存到 Chinook_Sqlite.sql 目录中
- 运行 sqlite3 Chinook.db
- 运行 .read Chinook_Sqlite.sql
- 测试 SELECT * FROM Artist LIMIT 10;
现在,Chinhook.db 就在我们的目录中了。
让我们创建一个 SQLDatabaseChain 来创建和执行 SQL 查询。
from langchain.utilities import SQLDatabase
from langchain.llms import OpenAI
from langchain_experimental.sql import SQLDatabaseChain
db = SQLDatabase.from_uri("sqlite:///Chinook.db")
llm = OpenAI(temperature=0, verbose=True)
db_chain = SQLDatabaseChain.from_llm(llm, db, verbose=True)
通过自然语言查询数据库
db_chain.run("有多少员工?")
执行日志
> Entering new SQLDatabaseChain chain...
有多少员工?
SQLQuery:SELECT COUNT(*) FROM "Employee";
SQLResult: [(8,)]
Answer:There are 8 employees.
> Finished chain.
'There are 8 employees.'
请注意,这既创建了查询,也执行了查询。
在下面的章节中,我们将介绍概述中提到的 3 种不同的使用情况。
案例 1:文本到 SQL 查询
from langchain.chat_models import ChatOpenAI
from langchain.chains import create_sql_query_chain
让我们创建建立 SQL 查询的链:
chain = create_sql_query_chain(ChatOpenAI(temperature=0), db)
response = chain.invoke({"question":"有多少员工"})
print(response)
返回
SELECT COUNT(*) FROM Employee
根据用户问题创建 SQL 查询后,我们就可以执行查询了:
db.run(response)
返回
'[(8,)]'
我们可以看到,SQL 查询生成器链只创建了查询,而我们单独处理了查询的执行。