从泰坦尼克号数据集创建一个测试 SQL 数据库。
推荐使用 SQL 与 CSV 数据交互,因为与任意 Python 相比,它更容易限制权限和清理查询。
大多数 都可以轻松地将 CSV 文件作为表加载到SQL 数据库中(DuckDB、SQLite 等)。完成此操作后,就可以使用 SQL 用例指南中概述的所有链和代理创建技术。下面是我们如何使用 SQLite 执行此操作的简单示例:
主要包含了以下几个步骤,涉及到的数据操作、模型调用和数据库交互。以下是详细解释:
1. 导入相关库
python
import pandas as pd
from pyprojroot import here
from langchain_community.utilities import SQLDatabase
from sqlalchemy import create_engine
pandas
:用于数据处理和操作,尤其是用于读取 CSV 文件并加载到 DataFrame 中。pyprojroot
:用于帮助处理相对路径,在这里它用来定位数据文件的路径。langchain_community.utilities.SQLDatabase
:Langchain 库中的一个工具,用于连接和查询 SQL 数据库。sqlalchemy.create_engine
:SQLAlchemy 库的create_engine
函数用于创建数据库引擎,这里用于连接 SQLite 数据库。
2. 读取 CSV 文件并上传到 SQLite 数据库
python
df = pd.read_csv(here("data/for_upload/titanic.csv"))
db_path = str(here("data")) + "/test_sqldb.db"
db_path = f"sqlite:///{db_path}"
engine = create_engine(db_path)
df.to_sql("titanic", engine, index=False)
df = pd.read_csv(here("data/for_upload/titanic.csv"))
:使用pandas
读取存储在data/for_upload/titanic.csv
路径中的 Titanic 数据集,并将其加载为一个 DataFrame 对象df
。db_path = f"sqlite:///{db_path}"
:构建一个 SQLite 数据库的连接 URI,db_path
是指向 SQLite 数据库文件的路径。engine = create_engine(db_path)
:使用SQLAlchemy
创建一个与 SQLite 数据库的连接引擎。df.to_sql("titanic", engine, index=False)
:将df
中的数据上传到 SQLite 数据库,并将表命名为titanic
。index=False
意味着不上传 DataFrame 的索引列。
3. 连接到数据库并初始化 SQLDatabase
python
db = SQLDatabase(engine=engine)
db = SQLDatabase(engine=engine)
:使用Langchain
库中的SQLDatabase
类,传入engine
对象,初始化与 SQLite 数据库的连接。SQLDatabase
提供了对数据库的高级封装,方便执行 SQL 查询等操作。
4. 加载环境变量并设置 API 密钥
python
import os
from dotenv import load_dotenv
import warnings
warnings.filterwarnings("ignore") # 忽略警告
load_dotenv() # 加载 .env 文件中的环境变量
print(os.getenv("OPENAI_API_KEY")) # 获取并打印 OPENAI_API_KEY 环境变量
load_dotenv()
:加载.env
文件中的环境变量(如 OpenAI 的 API 密钥)。该.env
文件应该位于项目根目录,里面包含环境变量,如OPENAI_API_KEY
和OPENAI_API_BASE
。warnings.filterwarnings("ignore")
:禁用警告信息,这通常用于防止输出一些不必要的警告。os.getenv("OPENAI_API_KEY")
:获取环境变量中的OPENAI_API_KEY
,该密钥将用于访问 OpenAI 的 API。
5. 设置 OpenAI 语言模型
python
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
openai_api_base=os.getenv("OPENAI_API_BASE"),
openai_api_key=os.getenv("OPENAI_API_KEY"),
temperature=0
)
ChatOpenAI
:这是Langchain
中与 OpenAI 的语言模型接口,支持通过 API 调用 OpenAI 的 GPT 模型。openai_api_base=os.getenv("OPENAI_API_BASE")
:API 的基础 URL,通常会从环境变量中获取。openai_api_key=os.getenv("OPENAI_API_KEY")
:OpenAI API 的密钥,连接 OpenAI 的服务。temperature=0
:控制生成文本的"创意"程度。temperature
越高,生成的文本越具有随机性;设置为0
时,结果较为确定。
6. 使用 Agent 执行查询
python
agent_executor.invoke({"input": "Tell me more about Anders Johan Andersson"})
agent_executor.invoke()
:这个方法调用了Langchain
的SQL Agent
,它能根据自然语言问题自动生成 SQL 查询并执行。input
是用户问题,这里用户询问的是"Tell me more about Anders Johan Andersson"
。agent_executor
是一个事先创建的SQL Agent
,它通过 OpenAI 的语言模型来自动生成相应的 SQL 查询并从数据库中提取数据。
总结:
这段代码的核心目的是:
- 将 Titanic 数据集上传到 SQLite 数据库。
- 使用
Langchain
和 OpenAI 模型结合,实现自然语言查询数据库。 - 自动执行 SQL 查询,并返回结果。
代码运行的过程中,会利用数据库中的 Titanic 数据表,接受用户的自然语言查询(例如关于某个人的信息),并通过自动生成 SQL 查询来获取相关数据。
完整代码:
python
import pandas as pd
from pyprojroot import here
from langchain_community.utilities import SQLDatabase
from sqlalchemy import create_engine
import os
from dotenv import load_dotenv
import warnings
# 加载环境变量
load_dotenv()
# 忽略警告
warnings.filterwarnings("ignore")
df = pd.read_csv(here("data/for_upload/titanic.csv"))
# 设置数据库路径
db_path = str(here("data")) + "/test_sqldb.db"
db_path = f"sqlite:///{db_path}"
# 创建数据库引擎
engine = create_engine(db_path)
# 假设 df 已经是一个 DataFrame, 并将其写入数据库
df.to_sql("titanic", engine, index=False)
# 初始化 SQLDatabase
db = SQLDatabase(engine=engine)
# 输出数据库中可以使用的表名
print(db.get_usable_table_names())
# 加载 LLM
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
openai_api_base=os.getenv("OPENAI_API_BASE"),
openai_api_key=os.getenv("OPENAI_API_KEY"),
temperature=0
)
# 初始化 agent_executor
from langchain_community.agent_toolkits import create_sql_agent
agent_executor = create_sql_agent(llm, db=db, agent_type="openai-tools", verbose=True)
# 执行查询
response = agent_executor.invoke({"input": "Tell me more about Anders Johan Andersson"})
print(response)