从泰坦尼克号数据集创建一个测试 SQL 数据库。
保举使用 SQL 与 CSV 数据交互,因为与任意 Python 相比,它更轻易限制权限和清算查询。
大多数 都可以轻松地将 CSV 文件作为表加载到SQL 数据库中(DuckDB、SQLite 等)。完成此操作后,就可以使用 SQL 用例指南中概述的全部链和署理创建技术。下面是我们如何使用 SQLite 执行此操作的简朴示例:
主要包罗了以下几个步调,涉及到的数据操作、模型调用和数据库交互。以下是详细解释:
1. 导入相关库
- 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 数据库
- 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
- db = SQLDatabase(engine=engine)
复制代码
- db = SQLDatabase(engine=engine)
:使用 Langchain 库中的 SQLDatabase 类,传入 engine 对象,初始化与 SQLite 数据库的毗连。SQLDatabase 提供了对数据库的高级封装,方便执行 SQL 查询等操作。
4. 加载环境变量并设置 API 密钥
- 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 语言模型
- 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 执行查询
- 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 查询来获取相关数据。
完整代码:
- import pandas as pd
- from pyprojroot import here
- from langchain_community.utilities import SQLDatabase
- from sqlalchemy import create_engine
- 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)
- # 输出数据库中可以使用的表名print(db.get_usable_table_names())# 加载 LLMfrom 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_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"})
- print(response)
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |