使用 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)
相关推荐
lusasky1 天前
AgentScope、LangChain、AutoGen 全方位对比 + 混用可行性指南
microsoft·langchain
聪明努力的积极向上1 天前
【MYSQL】字符串拼接和参数化sql语句区别
数据库·sql·mysql
文刀竹肃1 天前
DVWA -SQL Injection-通关教程-完结
前端·数据库·sql·安全·网络安全·oracle
Honmaple1 天前
中国四级城市联动数据,包含港澳台,内含json , sql , python 脚本
python·sql·json
思成不止于此1 天前
【MySQL 零基础入门】MySQL 约束精讲(一):基础约束篇
数据库·笔记·sql·学习·mysql
ActionTech1 天前
SCALE | SQLFlash 在 SQL 优化维度上的表现评估
数据库·sql
他是龙5511 天前
43:SQL注入进阶(请求类型、方法与格式实战)
数据库·sql
小小测试开发1 天前
SQL常用语法全解析:从入门到进阶的实战指南
数据库·sql
Hello.Reader1 天前
Flink SQL EXPLAIN “看懂计划”到“用 PLAN_ADVICE 调优”
大数据·sql·flink
前端阿森纳1 天前
从产品经理视角拆解 LangChain 的抽象设计
langchain·llm·aigc