使用 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)
相关推荐
在路上`9 小时前
前端学习之后端java小白(四)之数据库设计
sql·学习
智海观潮14 小时前
Spark SQL解析查询parquet格式Hive表获取分区字段和查询条件
hive·sql·spark
李少兄15 小时前
IntelliJ IDEA 启动项目时配置端口指南
数据库·sql·intellij-idea
白云如幻16 小时前
【Java】QBC检索和本地SQL检索
java·数据库·sql
Awesome Baron16 小时前
《Learning Langchain》阅读笔记13-Agent(1):Agent Architecture
笔记·langchain·llm
coder_pig16 小时前
👦抠腚男孩的AI学习之旅 | 7、LangChain (三) - 实战:知识库问答机器人 (RAG )
langchain·aigc·ai编程
问道飞鱼18 小时前
【大数据相关】ClickHouse命令行与SQL语法详解
大数据·sql·clickhouse
阿加犀智能20 小时前
使用Langchain生成本地rag知识库并搭载大模型
服务器·python·langchain
乔巴先生241 天前
LLMCompiler:基于LangGraph的并行化Agent架构高效实现
人工智能·python·langchain·人机交互
naumy2 天前
sqlalchemy
sql