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

打印 上一主题 下一主题

主题 1015|帖子 1015|积分 3045

从泰坦尼克号数据集创建一个测试 SQL 数据库。
保举使用 SQL 与 CSV 数据交互,因为与任意 Python 相比,它更轻易限制权限和清算查询。
大多数 都可以轻松地将 CSV 文件作为表加载到SQL 数据库中(DuckDB、SQLite 等)。完成此操作后,就可以使用 SQL 用例指南中概述的全部链和署理创建技术。下面是我们如何使用 SQLite 执行此操作的简朴示例:
主要包罗了以下几个步调,涉及到的数据操作、模型调用和数据库交互。以下是详细解释:
1. 导入相关库

  1. import pandas as pd
  2. from pyprojroot import here
  3. from langchain_community.utilities import SQLDatabase
  4. 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 数据库

  1. df = pd.read_csv(here("data/for_upload/titanic.csv"))
  2. db_path = str(here("data")) + "/test_sqldb.db"
  3. db_path = f"sqlite:///{db_path}"
  4. engine = create_engine(db_path)
  5. 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

  1. db = SQLDatabase(engine=engine)
复制代码


  • db = SQLDatabase(engine=engine)
    :使用 Langchain 库中的 SQLDatabase 类,传入 engine 对象,初始化与 SQLite 数据库的毗连。SQLDatabase 提供了对数据库的高级封装,方便执行 SQL 查询等操作。

4. 加载环境变量并设置 API 密钥

  1. import os
  2. from dotenv import load_dotenv
  3. import warnings
  4. warnings.filterwarnings("ignore")  # 忽略警告
  5. load_dotenv()  # 加载 .env 文件中的环境变量
  6. 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 语言模型

  1. from langchain_openai import ChatOpenAI
  2. llm = ChatOpenAI(
  3.     openai_api_base=os.getenv("OPENAI_API_BASE"),
  4.     openai_api_key=os.getenv("OPENAI_API_KEY"),
  5.     temperature=0
  6. )
复制代码


  • 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 执行查询

  1. 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 查询来获取相关数据。
完整代码:
  1. import pandas as pd
  2. from pyprojroot import here
  3. from langchain_community.utilities import SQLDatabase
  4. from sqlalchemy import create_engine
  5. import osfrom dotenv import load_dotenvimport 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)# 初始化 SQLDatabasedb = SQLDatabase(engine=engine)
  6. # 输出数据库中可以使用的表名print(db.get_usable_table_names())# 加载 LLMfrom langchain_openai import ChatOpenAI
  7. llm = ChatOpenAI(
  8.     openai_api_base=os.getenv("OPENAI_API_BASE"),
  9.     openai_api_key=os.getenv("OPENAI_API_KEY"),
  10.     temperature=0
  11. )
  12. # 初始化 agent_executorfrom langchain_community.agent_toolkits import create_sql_agentagent_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"})
  13. print(response)
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

曂沅仴駦

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表