O ChatBI utiliza a tecnologia de linguagem natural para SQL (NL2SQL) para ajudar empresas a gerar relatórios por meio de consultas em linguagem natural. Este tópico usa o sistema de gestão de restaurantes "Alixiang" como exemplo para apresentar os principais recursos do ChatBI e permitir que você comece rapidamente a usar o serviço com eficiência.
Ative o recurso PolarDB for AI
-
Adicione um nó de IA e defina a conta de banco de dados para conexão ao nó de IA. Para mais informações, consulte Ative o recurso PolarDB for AI.
NotaSe você já adicionou um nó de IA durante a compra do cluster, defina diretamente a conta de banco de dados para o nó de IA. Para mais informações, consulte Crie uma conta padrão.
Essa conta deve ter permissões de leitura e gravação nas tabelas de dados de destino para garantir a execução de todas as operações de banco de dados no processo de conversão do ChatBI.
-
Use o Cluster Endpoint para conectar-se ao cluster PolarDB. Para mais informações, consulte Fazer login no PolarDB for AI.
NotaAo conectar-se ao cluster pela linha de comando, adicione a opção
-c.Por padrão, o DMS conecta-se ao cluster usando o Primary address. Altere-o manualmente para o Cluster Endpoint. Após a alteração, feche a janela SQL original e abra uma nova para executar instruções SQL.
Preparação de dados
"Alixiang" é uma empresa fictícia de restaurantes. O sistema de gestão de contas contém as três tabelas a seguir. Clique em para baixá-las.
Adicione comentários às tabelas e colunas com base no esquema da tabela. Isso ajuda o Modelo de Linguagem Grande (LLM) a reconhecer e compreender melhor os dados, aumentando a precisão e a eficiência do modelo durante o processamento e a análise.
CREATE TABLE restaurant_info (
id INT COMMENT 'Outlet ID',
position VARCHAR(128) COMMENT 'Outlet location',
PRIMARY KEY (id)
) COMMENT='Outlet table';
CREATE TABLE menu_info (
id INT COMMENT 'Menu item ID',
name VARCHAR(64) COMMENT 'Menu item name',
type INT COMMENT 'Menu item type',
unit_price INT COMMENT 'Unit price',
PRIMARY KEY (id)
) COMMENT='Menu table';
CREATE TABLE bill_info (
id INT COMMENT 'Bill ID',
items VARCHAR(512) COMMENT 'Ordered items',
actural_amount INT COMMENT 'Actual amount paid',
restaurant_id INT COMMENT 'Outlet ID',
waiter VARCHAR(16) COMMENT 'Waiter',
diner_count INT COMMENT 'Number of diners',
pay_time DATE COMMENT 'Order time',
PRIMARY KEY (id)
) COMMENT='Bill table';
Usar o ChatBI
Use o modelo NL2SQL do PolarDB for AI para gerar instruções SQL correspondentes às perguntas dos usuários.
Crie um índice de esquema de tabela
Execute a seguinte instrução SQL para criar um índice de esquema de tabela chamado schema_index e fornecer informações do esquema ao Modelo de Linguagem Grande (LLM).
/*polar4ai*/CREATE TABLE schema_index(id integer, table_name varchar, table_comment text_ik_max_word, table_ddl text_ik_max_word, column_names text_ik_max_word, column_comments text_ik_max_word, sample_values text_ik_max_word, vecs vector_768,ext text_ik_max_word, PRIMARY key (id));
Essa tabela não fica visível diretamente no banco de dados. Execute a seguinte instrução SQL para visualizar as informações.
/*polar4ai*/SHOW TABLES;
Em seguida, importe o esquema da tabela de dados para a tabela de índice schema_index usando a instrução SQL abaixo.
/*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_text2vec, SELECT '') WITH (mode='async', resource='schema') INTO schema_index;
Durante a execução da instrução, o PolarDB for AI vetoriza todas as tabelas no banco de dados atual e amostra os valores das colunas por padrão.
Após a execução, o sistema retorna o task_id da tarefa em segundo plano, como bce632ea-97e9-11ee-bdd2-492f4dfe0918. Use o SQL a seguir para consultar o status da tarefa atual. A criação do índice estará concluída quando o taskStatus retornado for finish.
/*polar4ai*/SHOW TASK `bce632ea-97e9-11ee-bdd2-492f4dfe0918`;
Usar o modelo NL2SQL para responder perguntas
Execute a seguinte instrução SQL para utilizar o NL2SQL baseado em LLM online. No exemplo abaixo, a consulta do usuário é Qual é a receita total desta semana?, e o índice de esquema de tabela utilizado é schema_index.
/*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_nl2sql, select 'What is the total revenue for this week') WITH (basic_index_name='schema_index');
Aguarde um momento para receber a resposta do LLM. O resultado esperado é o seguinte:

Com base no exemplo acima, também é possível fazer perguntas típicas que abrangem vários cenários, como GROUP BY, JOIN de múltiplas tabelas, ORDER BY e fórmulas.
|
Nº |
Pergunta do usuário |
Valor retornado pelo NL2SQL |
|
1 |
Classificar pontos de venda por receita |
|
|
2 |
Qual ponto de venda em Xangai tem a maior receita? |
|
|
3 |
Qual é o gasto médio por pessoa em Xangai? |
|
|
4 |
Quais são os 10 itens de menu mais pedidos neste mês? |
|
|
5 |
Qual é a porcentagem de crescimento mensal da receita deste mês em relação ao mês passado? |
|
|
6 |
Qual ponto de venda em Xangai tem o maior fluxo de clientes? |
|
O modelo NL2SQL baseado em LLM responde eficazmente às perguntas dos usuários, mas algumas respostas podem não atender às expectativas. Por exemplo, na segunda pergunta, o usuário deseja que o nome do ponto de venda seja retornado. Se a pergunta for reformulada como Qual ponto de venda em Xangai tem a maior receita? Por favor, retorne o nome do ponto de venda, o modelo retornará a seguinte instrução SQL: SELECT r.name FROM bill_info b JOIN restaurant_info r ON b.restaurant_id = r.id WHERE r.position = 'Shanghai' ORDER BY b.actural_amount DESC LIMIT 1;. Também é possível melhorar a precisão ajustando o modelo. As seções a seguir abordam essas questões.
Ajustar o modelo
Configure modelos de perguntas
Modelos gerais de perguntas orientam o modelo introduzindo conhecimentos específicos, permitindo a geração de instruções SQL com base nesse conhecimento.
-
Execute o SQL a seguir para criar a tabela de modelo de perguntas
polar4ai_nl2sql_pattern.CREATE TABLE `polar4ai_nl2sql_pattern` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'Primary key', `pattern_question` text COMMENT 'Template question', `pattern_description` text COMMENT 'Template description', `pattern_sql` text COMMENT 'Template SQL', `pattern_params` text COMMENT 'Template parameters', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;O nome da tabela deve começar com
polar4ai_nl2sql_pattern, e o esquema deve incluir as cinco colunas presentes na instruçãoCREATE TABLEacima. -
Em seguida, crie a tabela de índice
pattern_indexpara o modelo de perguntas./*polar4ai*/CREATE TABLE pattern_index(id integer, pattern_question text_ik_max_word, pattern_description text_ik_max_word, pattern_sql text_ik_max_word, pattern_params text_ik_max_word, pattern_tables text_ik_max_word, vecs vector_768, PRIMARY key (id));Configure um modelo para a segunda pergunta, usado no ajuste fino para retornar o endereço da loja.
Execute a seguinte instrução SQL para adicionar um novo padrão:
INSERT INTO polar4ai_nl2sql_pattern (id, pattern_question, pattern_description, pattern_sql, pattern_params) VALUES ( 1, "Which outlet in #{position} has the highest revenue?", "Which outlet in [location] has the highest revenue?", "SELECT r.position FROM bill_info b JOIN restaurant_info r ON b.restaurant_id = r.id WHERE r.position LIKE '%#{position}%' GROUP BY r.position ORDER BY SUM(b.actural_amount) DESC LIMIT 1;", '[{"table_name":"bill_info","param_info":[{"param_name":"#{position}","value":["Shanghai"]}], "explanation": "Location of consumption"}]' );O padrão usa slots para corresponder a múltiplos locais. Insira a instrução SQL correta na coluna
pattern_sqle marque o slot com#{}. A colunapattern_paramsserve para pós-processamento adicional das informações da tabela, mas pode ser ignorada aqui. -
Importe as informações do modelo de perguntas para a tabela de índice.
/*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_text2vec, SELECT '') WITH (mode='async', resource='pattern') INTO pattern_index;Assim como no processo de criação de índice para
schema_index, um ID de tarefa também é retornado. Execute/*polar4ai*/show task 'xxx-xxx-xxx'para verificar o status da tarefa atual.NotaSe os dados na tabela
polar4ai_nl2sql_patternforem atualizados, recrie opattern_indexe importe os dados novamente. Use a seguinte instrução SQL para exclua o índice antigo:/*polar4ai*/DROP TABLE pattern_index;Reexecute a instrução SQL problemática e adicione a dica
pattern_index./*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_nl2sql, select 'Which outlet in Shanghai has the highest revenue?') WITH (basic_index_name='schema_index',pattern_index_name='pattern_index');
Crie uma tabela de configuração
Utilize uma tabela de configuração para pré-processar perguntas ou pós-processar o SQL final gerado.
Dicas de significado de vocabulário
Na sexta pergunta, como o Modelo de Linguagem Grande (LLM) não consegue compreender com precisão o termo 'tráfego de pedestres', realize o pré-processamento configurando a tabela polar4ai_nl2sql_llm_config.
CREATE TABLE `polar4ai_nl2sql_llm_config` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'Primary key',
`is_functional` int(11) NOT NULL DEFAULT '1' COMMENT 'Is active',
`text_condition` text COMMENT 'Text condition',
`query_function` text COMMENT 'Query processing',
`formula_function` text COMMENT 'Formula information',
`sql_condition` text COMMENT 'SQL condition',
`sql_function` text COMMENT 'SQL processing',
PRIMARY KEY (`id`)
);
Insira o item de configuração relevante para definir que o LLM considere "tráfego de clientes" ou "fluxo de clientes" como "número de clientes".
INSERT INTO polar4ai_nl2sql_llm_config (id, is_functional, text_condition, query_function, formula_function, sql_condition, sql_function) VALUES (
1,
1,
"customer traffic||customer flow",
"",
"Customer traffic or customer flow is calculated as the sum of the number of diners",
"",
""
);
Neste caso, o valor 1 para is_functional indica que o item de configuração é válido. O valor do campo text_condition é 'people traffic||customer traffic', correspondendo a perguntas que contenham 'people traffic' ou 'customer traffic'. O campo formula_function explica termos especializados ao Modelo de Linguagem Grande (LLM) usando texto ou fórmulas.
Nesta situação, execute diretamente a geração de SQL sem criar uma tabela de índice ou realizar vetorização. O resultado é o seguinte.

Dicas de correspondência difusa
Na pergunta 3, o uso do operador = para recuperar nomes de lugares falhará se o nome não for uma correspondência exata. Portanto, utilize uma busca difusa para correspondência de nomes de lugares. Adicione o seguinte item de configuração.
INSERT INTO polar4ai_nl2sql_llm_config (id, is_functional, text_condition, query_function, formula_function, sql_condition, sql_function) VALUES (
2,
1,
"",
"",
"Matching for the outlet location 'position' requires a fuzzy search",
"",
""
);
Se text_condition estiver vazio, o item de configuração se aplica globalmente. (Use com cautela.)
O resultado é mostrado na figura abaixo. Observe que a correspondência de local utiliza com sucesso uma busca difusa.

Da mesma forma, para a pergunta 5, adicione as fórmulas de cálculo de comparação mensal e anual à tabela de configuração polar4ai_nl2sql_llm_config para melhorar a precisão do SQL gerado. Teste isso por conta própria.
Saída de gráfico
Após gerar uma instrução SQL com NL2SQL, recupere o resultado da consulta e exiba-o visualmente com gráficos, como gráficos de colunas, de linhas e de pizza. A solução NL2Chart no PolarDB executa sua instrução SQL com base na sua pergunta e retorna um relatório correspondente, suportando gráficos de colunas, de pizza e de linhas.
-
Suponha que sua instrução no NL2SQL seja a seguinte:
/*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_nl2sql, select 'Merchant type statistics') WITH (basic_index_name='schema_index',pattern_index_name='pattern_index');Depois que a instrução SQL correspondente for gerada, verifique se ela executa e retorna um resultado significativo e não vazio.
SELECT merchtype AS merchant_type, COUNT(*) AS product_count FROM hkrt_merchant_info GROUP BY merchtype; -
Use o NL2Chart:
Sintaxe
/*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_nl2chart, <SQL_statement>) WITH (usr_query = <usr_query>, result_type = <result_type>);Parâmetros
Nome do parâmetro
Descrição
Valor de exemplo
usr_query
A pergunta inserida pelo usuário, usada para esclarecer os requisitos de geração do gráfico.
"Estatísticas de vendas para cada trimestre de 2023"
result_type
Especifique o tipo de resultado retornado. Atualmente, apenas
'IMAGE'é suportado.'IMAGE'Instrução SQL
A instrução de consulta SQL gerada pelo módulo NL2SQL, usada para recuperar dados.
SELECT quarter, sales FROM sales_data WHERE year = 2023Exemplo: Converter o resultado da consulta da instrução SQL gerada em um gráfico
/*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_nl2chart, SELECT merchtype AS merchant_type, COUNT(*) AS number_of_merchants FROM hkrt_merchant_info GROUP BY merchtype) WITH (usr_query = 'Merchant type statistics', result_type='IMAGE');O resultado é o seguinte:
NotaO link retornado é uma URL de imagem válida por 90 minutos.
http://db4ai-xxx-xx-xxxx-xxx-xxxx.aliyuncs.com/pc-bpze47ma2c515087l6/OSSAccessKeyId=xxxxxxx&Expires=1716130199&Signature=KvPFzfMebIEmqxPIXURurwwbsXM%3D
-
(Opcional) Seleção de tipo de gráfico e seleção forçada
O modelo selecione um gráfico apropriado com base na compreensão da pergunta do usuário e dos dados. Recomendamos usar a pergunta do usuário para orientar o modelo na geração do gráfico.
A tabela a seguir mostra o mapeamento entre tipos de perguntas e tipos de gráficos:
Tipo de pergunta
Tipo de gráfico
Exemplo de pergunta do usuário
Descrição
Estatísticas de quantidade
Gráfico de colunas
"Forneça estatísticas de vendas por cidade"
Mostra comparações numéricas entre diferentes categorias, como quantidade, valor total ou frequência.
Mudança de tendência
Gráfico de linhas
"Mostre a tendência de crescimento de usuários no último ano"
Exibe a tendência dos dados ao longo do tempo ou em categorias ordenadas, enfatizando a continuidade.
Distribuição de proporção
Gráfico de pizza
"Mostre a proporção de vendas de cada linha de produtos"
Adequado para mostrar a relação proporcional das partes em relação ao todo. Os dados devem ser categóricos e ter um total claro.
Force um tipo específico de gráfico modificando o parâmetro
usr_query. Adicione um comando complementar ao final do parâmetrousr_query:-- Enter the output SQL into nl2chart to draw a line chart /*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_nl2chart, SELECT merchtype AS merchant_type, COUNT(*) AS number_of_merchants FROM hkrt_merchant_info GROUP BY merchtype ) WITH (usr_query = 'Merchant type statistics, draw a line chart', result_type='IMAGE');
-- Enter the output SQL into nl2chart to draw a pie chart /*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_nl2chart, SELECT merchtype AS merchant_type, COUNT(*) AS number_of_merchants FROM hkrt_merchant_info GROUP BY merchtype ) WITH (usr_query = 'Merchant type statistics, draw a pie chart', result_type='IMAGE');
Para mais informações, consulte NL2Chart: Gerar gráficos inteligentes a partir de linguagem natural.
Retreinar e ajustar o modelo
Se o modelo não atender às necessidades do seu negócio, retreine-o e ajuste seus parâmetros internos para obter melhores resultados.
Condições
Este recurso está disponível apenas para clusters com nós de IA da especificação polar.mysql.x8.2xlarge.gpu (16 núcleos, 125 GB e uma GU100).
Treine apenas um modelo por vez.
Implante apenas um modelo por vez.
Instruções
Treinar o modelo
/*polar4ai*/CREATE MODEL udf_qwen14b WITH (model_class='qwen-turbo', model_parameter=(basic_index_name='schema_index', pattern_index_name='pattern_index',training_type='efficient_sft')) as (SELECT '')
Parâmetros
|
Nome do parâmetro |
Descrição |
Padrão |
Valores válidos/Intervalo |
|
model_class |
O tipo de modelo. Atualmente suporta {'qwen-14b-chat', 'qwen-turbo'}. |
Nenhum |
{'qwen-14b-chat', 'qwen-turbo'} |
|
model_parameter |
Configurações de parâmetros do modelo, incluindo parâmetros obrigatórios e opcionais. |
Nenhum |
Nenhum |
|
basic_index_name |
O nome da tabela de índice de onde as informações do banco de dados nos dados de treinamento são obtidas. Deve ser uma tabela de índice de banco de dados. |
Nenhum |
Nenhum |
|
pattern_index_name |
O nome da tabela de índice de onde as informações do modelo de perguntas nos dados de treinamento são obtidas. Deve ser uma tabela de índice de modelo de perguntas. |
Nenhum |
Nenhum |
|
training_type |
O tipo de treinamento. Os valores válidos são {'efficient_sft', 'sft'}. 'efficient_sft' indica treinamento eficiente, geralmente usando o método LoRa. 'sft' indica treinamento de parâmetros completos. |
Nenhum |
{'efficient_sft', 'sft'} |
|
n_epochs |
O número de épocas. Quantidade de vezes que o modelo aprende com o conjunto de dados durante o treinamento. O intervalo recomendado é de 1 a 3, ajustável conforme necessário. |
3 |
[1, 200] |
|
learning_rate |
A taxa de aprendizado. Representa o peso incremental do parâmetro para cada atualização de dados. Uma taxa de aprendizado maior resulta em mudanças maiores nos parâmetros e tem maior impacto no modelo. |
'3e-4' |
Nenhum |
|
batch_size |
O tamanho do lote. Representa o passo dos dados para atualizações de parâmetros do modelo. O tamanho de lote recomendado é 16 ou 32. |
16 |
{8, 16, 32} |
|
lr_scheduler_type |
A política de taxa de aprendizado. Altera dinamicamente a taxa de aprendizado usada ao atualizar pesos durante o treinamento. |
'linear' |
{'linear', 'cosine', 'cosine_with_restarts', 'polynomial', 'constant', 'constant_with_warmup', 'inverse_sqrt', 'reduce_lr_on_plateau'} |
|
eval_steps |
O intervalo de passos para validação do modelo, usado para avaliação periódica da precisão e perda do treinamento. |
50 |
[1, 2147483647] |
|
sequence_length |
O comprimento da sequência dos dados de treinamento. Comprimento máximo de uma única amostra. Dados que excederem esse comprimento serão truncados automaticamente. |
2048 |
[500, 2048] |
|
lr_warmup_ratio |
A proporção do total de etapas de treinamento usadas para aquecimento. |
0,05 |
(0, 1) |
|
weight_decay |
Regularização L2, que ajuda a reduzir o overfitting. |
0,01 |
(0, 0,2) |
|
gradient_checkpointing |
Ativa ou desativa o checkpoint de gradiente para economizar memória GPU. |
'True' |
{'True', 'False'} |
|
use_flash_attn |
Especifique se deve usar Flash Attention. |
'True' |
{'True', 'False'} |
|
lora_rank |
O tamanho do rank no treinamento LoRa, que afeta o grau de influência dos dados de treinamento no modelo. |
8 |
{2, 4, 8, 16, 32, 64} |
|
lora_alpha |
O coeficiente de escala no treinamento LoRa, usado para ajustar os pesos iniciais de treinamento. |
32 |
{8, 16, 32, 64} |
|
lora_dropout |
A proporção de neurônios descartados aleatoriamente durante o treinamento. Isso previne overfitting e melhora a capacidade de generalização do modelo. |
0,1 |
(0, 0,2) |
|
lora_target_modules |
Selecione módulos específicos do modelo para ajuste fino e otimização. |
'ALL' |
{'ALL', 'AUTO'} |
Visualize um modelo
/*polar4ai*/SHOW model udf_qwen14b
Exclua um modelo
/*polar4ai*/DROP model udf_qwen14b
Visualize todos os modelos
/*polar4ai*/SHOW models
Implantar um modelo
Um modelo treinado só pode ser usado no NL2SQL após ser implantado.
/*polar4ai*/deploy model udf_qwen14b
Visualize uma implantação
/*polar4ai*/SHOW deployment udf_qwen14b
Exclua uma implantação
/*polar4ai*/DROP deployment udf_qwen14b
Visualize todas as implantações
/*polar4ai*/SHOW deployments
Usar um modelo implantado para linguagem natural para SQL
/*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_nl2sql, SELECT 'What is the content for id=1?') WITH (basic_index_name='schema_index', llm_model='udf_qwen14b')
Parâmetros
|
Parâmetro |
Descrição |
|
basic_index_name |
Não pode estar vazio. Especifique a tabela de índice para as informações do banco de dados relacionadas à pergunta atual. |
|
llm_model |
Opcional. Se deixar vazio, o modelo não ajustado será usado para linguagem natural para SQL. Se especifique um valor, certifique-se de que seja o nome de uma implantação no estado "serving". Modelos não totalmente implantados não podem ser usados aqui. |