Kinetica 语言到 SQL 聊天模型
本笔记本演示了如何使用 Kinetica 将自然语言转换为 SQL 并简化数据检索的过程。此演示旨在展示创建和使用链的机制 而不是大型语言模型的能力。
概述
通过 Kinetica 大型语言模型工作流,您可以在数据库中创建一个大型语言模型上下文,提供
进行推理所需的信息,包括表、注释、规则和
示例。调用 ChatKinetica.load_messages_from_context()
将从数据库中检索
上下文信息,以便用于创建聊天提示。
聊天提示由 SystemMessage
和成对的
包含问题/SQL的HumanMessage
/AIMessage
样本
您可以将样本对附加到此列表中,但这并不旨在
促进典型的自然语言对话。
当您从聊天提示创建链并执行时,Kinetica LLM将
根据输入生成SQL。您可以选择使用KineticaSqlOutputParser
来
执行SQL并将结果作为数据框返回。
目前,支持2个用于SQL生成的LLM:
- Kinetica SQL-GPT:该LLM基于OpenAI ChatGPT API。
- Kinetica SqlAssist:该LLM专门构建以与Kinetica 数据库集成,并且可以在安全的客户场所运行。
在本演示中,我们将使用 SqlAssist。请参阅 Kinetica 文档 网站 获取更多信息。
前提条件
要开始使用,您需要一个 Kinetica DB 实例。如果您没有,可以 获取一个 免费的开发实例。
您需要安装以下软件包...
# Install Langchain community and core packages
%pip install --upgrade --quiet langchain-core langchain-community
# Install Kineitca DB connection package
%pip install --upgrade --quiet 'gpudb>=7.2.0.8' typeguard pandas tqdm
# Install packages needed for this tutorial
%pip install --upgrade --quiet faker ipykernel
数据库连接
您必须在以下环境变量中设置数据库连接。如果您使用的是虚拟环境,可以在项目的 .env
文件中设置它们:
KINETICA_URL
: 数据库连接 URLKINETICA_USER
: 数据库用户KINETICA_PASSWD
: 安全密码。
如果您可以创建 KineticaChatLLM
的实例,那么您已成功连接。
<!--IMPORTS:[{"imported": "ChatKinetica", "source": "langchain_community.chat_models.kinetica", "docs": "https://python.langchain.com/api_reference/community/chat_models/langchain_community.chat_models.kinetica.ChatKinetica.html", "title": "Kinetica Language To SQL Chat Model"}]-->
from langchain_community.chat_models.kinetica import ChatKinetica
kinetica_llm = ChatKinetica()
# Test table we will create
table_name = "demo.user_profiles"
# LLM Context we will create
kinetica_ctx = "demo.test_llm_ctx"
创建测试数据
在生成 SQL 之前,我们需要创建一个 Kinetica 表和一个可以推断该表的 LLM 上下文。
创建一些虚假用户资料
我们将使用 faker
包创建一个包含 100 个虚假资料的数据框。
from typing import Generator
import pandas as pd
from faker import Faker
Faker.seed(5467)
faker = Faker(locale="en-US")
def profile_gen(count: int) -> Generator:
for id in range(0, count):
rec = dict(id=id, **faker.simple_profile())
rec["birthdate"] = pd.Timestamp(rec["birthdate"])
yield rec
load_df = pd.DataFrame.from_records(data=profile_gen(100), index="id")
print(load_df.head())
username name sex \
id
0 eduardo69 Haley Beck F
1 lbarrera Joshua Stephens M
2 bburton Paula Kaiser F
3 melissa49 Wendy Reese F
4 melissacarter Manuel Rios M
address mail \
id
0 59836 Carla Causeway Suite 939\nPort Eugene, I... meltondenise@yahoo.com
1 3108 Christina Forges\nPort Timothychester, KY... erica80@hotmail.com
2 Unit 7405 Box 3052\nDPO AE 09858 timothypotts@gmail.com
3 6408 Christopher Hill Apt. 459\nNew Benjamin, ... dadams@gmail.com
4 2241 Bell Gardens Suite 723\nScottside, CA 38463 williamayala@gmail.com
birthdate
id
0 1997-12-08
1 1924-08-03
2 1933-12-05
3 1988-10-26
4 1931-03-19
从数据框创建 Kinetica 表
from gpudb import GPUdbTable
gpudb_table = GPUdbTable.from_df(
load_df,
db=kinetica_llm.kdbc,
table_name=table_name,
clear_table=True,
load_data=True,
)
# See the Kinetica column types
print(gpudb_table.type_as_df())
name type properties
0 username string [char32]
1 name string [char32]
2 sex string [char2]
3 address string [char64]
4 mail string [char32]
5 birthdate long [timestamp]
创建 LLM 上下文
您可以使用 Kinetica Workbench UI 创建 LLM 上下文,或者可以使用 CREATE OR REPLACE CONTEXT
语法手动创建它。
在这里,我们从引用我们创建的表的 SQL 语法中创建一个上下文。
from gpudb import GPUdbSamplesClause, GPUdbSqlContext, GPUdbTableClause
table_ctx = GPUdbTableClause(table=table_name, comment="Contains user profiles.")
samples_ctx = GPUdbSamplesClause(
samples=[
(
"How many male users are there?",
f"""
select count(1) as num_users
from {table_name}
where sex = 'M';
""",
)
]
)
context_sql = GPUdbSqlContext(
name=kinetica_ctx, tables=[table_ctx], samples=samples_ctx
).build_sql()
print(context_sql)
count_affected = kinetica_llm.kdbc.execute(context_sql)
count_affected
CREATE OR REPLACE CONTEXT "demo"."test_llm_ctx" (
TABLE = "demo"."user_profiles",
COMMENT = 'Contains user profiles.'
),
(
SAMPLES = (
'How many male users are there?' = 'select count(1) as num_users
from demo.user_profiles
where sex = ''M'';' )
)
1
使用 LangChain 进行推理
在下面的示例中,我们将从之前创建的表和 LLM 上下文创建一个链。这个链将生成 SQL 并将结果数据作为数据框返回。