使用 SQL 和表格数据进行问答和 RAG(4)— 使用 SQL 与 CSV 数据交互

泰坦尼克号数据集创建一个测试 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 数据库,并将表命名为 titanicindex=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_KEYOPENAI_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():这个方法调用了 LangchainSQL Agent,它能根据自然语言问题自动生成 SQL 查询并执行。input 是用户问题,这里用户询问的是 "Tell me more about Anders Johan Andersson"
  • agent_executor 是一个事先创建的 SQL Agent,它通过 OpenAI 的语言模型来自动生成相应的 SQL 查询并从数据库中提取数据。

总结:

这段代码的核心目的是:

  1. 将 Titanic 数据集上传到 SQLite 数据库。
  2. 使用 Langchain 和 OpenAI 模型结合,实现自然语言查询数据库。
  3. 自动执行 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)
相关推荐
love静思冥想1 小时前
批量执行 SQL 脚本的 Shell 脚本及注意事项
数据库·sql·oracle
GoodStudyAndDayDayUp1 小时前
Java手动打印执行过的sql
java·开发语言·sql
Z灏1 小时前
canal同步es,sql注意事项
数据库·sql·elasticsearch·canal
黑客老陈1 小时前
SRC技巧篇 | 利用工具批量挖掘SRC
网络·python·sql·安全·web安全
黑客老李13 小时前
BaseCTF scxml 详解
开发语言·网络·数据库·python·sql·安全
五行星辰14 小时前
SQL与数据库交互:Java的财富管理
数据库·sql·交互
大鳥15 小时前
深入了解 StarRocks 表类型:解锁高效数据分析的密码
数据库·starrocks·sql
Amd79418 小时前
深入剖析数据删除操作:DELETE 语句的使用与管理实践
sql·postgresql·性能优化·数据库管理·数据完整性·数据删除·delete 语句
RoadToTheExpert1 天前
SqlServerExpress安装及C#和Java代码连接说明
sql·server·studio·management·2008