Para tornar a análise de dados acessível a usuários sem familiaridade com SQL, o PolarDB for AI oferece um modelo de IA proprietário e integrado para conversão de linguagem natural em SQL baseada em modelos de linguagem grandes (NL2SQL baseado em LLM). Em comparação aos métodos tradicionais de NL2SQL, o modelo NL2SQL baseado em LLM proporciona uma compreensão de linguagem mais avançada e gera instruções SQL compatíveis com mais funções, como aritmética de datas. O modelo entende até mesmo relações simples de mapeamento, como valid->isValid=1. Com o ajuste fino adequado, ele aprende seus padrões comuns de SQL e aplica automaticamente condições como datastatus=1.
Exemplo
/*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_nl2sql, SELECT 'List the names and leave counts of the 2 students with the most leave requests, sorted in descending order.') WITH (basic_index_name='schema_index');
output: SELECT s.student_name, COUNT(sc.id) AS leave_count FROM students s JOIN student_courses sc ON s.id = sc.student_id WHERE sc.status = 0 GROUP BY s.student_name ORDER BY leave_count DESC LIMIT 2;
Fluxo de trabalho do NL2SQL
Para ajudar você a implementar aplicações de NL2SQL, dividimos o processo em três etapas: início rápido, otimização e ajuste, e implantação em produção.
Etapa de início rápido: crie rapidamente capacidades básicas de NL2SQL do zero.
Etapa de otimização e ajuste: otimize profundamente seus cenários de negócios específicos.
Etapa de implantação em produção: implante seu sistema de NL2SQL no ambiente de produção.
Pré-requisitos
-
Adicione um nó de IA e configure uma conta de banco de dados para ele. Para obter mais informações, consulte Ativar o recurso PolarDB for AI.
NotaSe você adicionou um nó de IA ao adquirir o cluster, configure diretamente uma conta de banco de dados para esse nó.
A conta de banco de dados do nó de IA deve ter permissões de Read/Write para ler e gravar no banco de dados de destino.
-
Conecte-se ao cluster PolarDB usando o Cluster Endpoint. Para obter mais informações, consulte Fazer login no PolarDB for AI.
ImportanteAo se conectar ao cluster pela linha de comando, adicione a opção
-c.Ao usar o PolarDB for AI no Data Management (DMS), o DMS se conecta ao cluster PolarDB usando o Primary address por padrão, o que impede o roteamento das instruções SQL para o nó de IA. Altere manualmente o endereço de conexão para o Cluster Endpoint.
Observações
-
Como formular perguntas: uma pergunta bem formulada inclui uma condição, valores de coluna de destino e um possível nome de coluna. Por exemplo:
SELECT 'What is the property name of a "house" or "apartment" with more than one room?'Neste exemplo, 'with more than one room' é a condição, 'house' e 'apartment' são os valores da coluna, e 'property name' é um possível nome de coluna.
-
Precisão dos resultados da consulta: o desempenho do modelo NL2SQL baseado em LLM depende de vários fatores. Para garantir que os resultados atendam às suas expectativas, considere o seguinte:
Riqueza dos comentários de tabelas e colunas: adicionar comentários detalhados a cada tabela e coluna melhora a precisão da consulta.
Correspondência entre a pergunta e os comentários das colunas: quanto maior a correspondência semântica entre as palavras-chave da sua pergunta e os comentários das colunas, maior será a precisão da consulta.
Tamanho da instrução SQL gerada: consultas com menos colunas envolvidas e condições mais simples tendem a ser mais precisas.
Complexidade lógica da instrução SQL gerada: quanto menos sintaxe avançada a instrução utilizar, mais precisa será a consulta.
Uso
Padronizar tabelas de dados
Para que o NL2SQL baseado em LLM funcione, o modelo precisa compreender suas tabelas de dados e respectivas colunas. Portanto, adicione comentários às tabelas e colunas mais utilizadas antes de começar.
-
Comentários de tabela
Os comentários de tabela ajudam o modelo NL2SQL baseado em LLM a entender o conteúdo da tabela, facilitando a localização precisa das tabelas necessárias para uma consulta. Um bom comentário resume de forma concisa os dados da tabela (por exemplo, "pedidos" ou "inventário"), deve ter no máximo dez palavras e evitar detalhes excessivos.
-
Comentários de coluna
Os comentários de coluna devem ser substantivos ou frases comuns que descrevam com precisão os dados da coluna, como "ID do Pedido", "Data" ou "Nome da Loja". Você também pode incluir dados de amostra ou mapeamentos de valores no comentário da coluna. Por exemplo, para uma coluna chamada
isValid, o comentário pode serIndicates whether the item is valid. 0: No. 1: Yes..
Caso não seja possível modificar os comentários existentes, substitua-os usando o recurso de comentários personalizados de tabela e coluna. Para obter mais informações, consulte Uso avançado - Comentários personalizados de tabela e coluna.
Preparação de dados
Prepare dados de teste que reflitam seu cenário de negócios. Os exemplos neste tópico usam o seguinte conjunto de dados de teste: Test Dataset.sql.
-
Criar uma tabela de índice de recuperação
Para extrair dados de uma tabela de dados, crie uma tabela de índice de recuperação para ela. Especifique um nome de tabela personalizado que siga as convenções de nomenclatura do banco de dados. Este tópico usa
schema_indexcomo exemplo. A seguinte instrução SQL cria uma tabela de índice de recuperação:/*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));NotaA tabela de índice de recuperação não aparece na lista padrão de tabelas. Para visualizar suas informações, execute a instrução
/*polar4ai*/SHOW TABLES;.Para remover uma tabela de índice de recuperação, como
schema_index, execute a instrução/*polar4ai*/DROP TABLE IF EXISTS schema_index;.
-
Importar informações da tabela de dados para a tabela de índice de recuperação
A instrução abaixo orienta o PolarDB for AI a vetorizar todas as tabelas do banco de dados atual. Por padrão, a amostragem de valores de coluna está desativada.
/*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_text2vec, SELECT '') WITH (mode='async', resource='schema') INTO schema_index;Parâmetros
_polar4ai_text2vecé o modelo de incorporação de texto.Após
INTO, especifique o nome da tabela de índice de recuperação criada na Etapa 1: Criar uma tabela de índice de recuperação.-
Configure os seguintes parâmetros na cláusula
WITH():Parâmetro
Obrigatório
Descrição
mode
Sim
Modo de gravação de dados. Defina como
asyncpara especificar o modo assíncrono.resource
Sim
Tipo de recurso. Defina como
schemapara indicar que a vetorização ocorre nas informações da tabela de dados.tables_included
Não
Especifica as tabelas a serem vetorizadas.
O valor padrão é
'', o que significa que todas as tabelas são vetorizadas. Para especificar várias tabelas, forneça seus nomes como uma única string separada por vírgulas.to_sample
Não
Determina se deve haver amostragem de valores de coluna. A amostragem aumenta o tempo de importação de dados, mas pode melhorar a qualidade do SQL gerado para tabelas com menos de 15 colunas. Valores válidos:
-
0 (padrão): não amostra valores de coluna.
-
1: amostra valores de coluna.
columns_excluded
Não
Especifica as colunas a serem excluídas das operações de NL2SQL baseado em LLM.
O valor padrão é
'', o que significa que todas as colunas de todas as tabelas envolvidas na conversão vetorial participam da operação subsequente de NL2SQL baseado em LLM. Ao definir este parâmetro, concatene as colunas a serem excluídas da operação subsequente de NL2SQL baseado em LLM em uma string no formatotable_name1.column_name1,table_name1.column_name2,table_name2.column_name1.Exemplo: esta instrução vetoriza as tabelas
graph_info,image_infoetext_infono banco de dados atual e ativa a amostragem de valores de coluna. Ela também exclui a colunatimeda tabelagraph_infoe a colunaextda tabelatext_infodas operações de NL2SQL baseado em LLM./*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_text2vec, SELECT '') WITH (mode='async', resource='schema', tables_included='graph_info,image_info,text_info', to_sample=1, columns_excluded='graph_info.time,text_info.ext') INTO schema_index; -
-
Verificar o status da tarefa
A instrução de importação retorna um
task_id, comobce632ea-97e9-11ee-bdd2-492f4dfe0918. Use esse ID com o comando a seguir para verificar o status da tarefa. A tarefa estará concluída quando o status mostrarfinish./*polar4ai*/SHOW TASK `bce632ea-97e9-11ee-bdd2-492f4dfe0918`;Execute a seguinte instrução SQL para visualizar as informações do índice de recuperação:
/*polar4ai*/SELECT * FROM schema_index;
Usar o NL2SQL baseado em LLM
Sintaxe
/*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_nl2sql, SELECT '<question>') WITH (basic_index_name='<basic_index_name>');
Parâmetros
-
Substitua
<question>pela sua pergunta em linguagem natural. A tabela a seguir fornece exemplos.Exemplos do tópico
Outros cenários
Mostre os nomes dos professores e as disciplinas que lecionam, classificados em ordem alfabética crescente pelo nome do professor.
Encontre os 10 alunos com mais solicitações de licença, ordene-os em ordem decrescente pelo número de licenças e mostre seus nomes e a contagem de licenças.
Consulte os nomes e locais das aulas realizadas entre 1º de outubro de 2023 e 3 de outubro de 2023.
Para alunos matriculados em mais de duas disciplinas, mostre seus nomes e contagens de disciplinas, classificados em ordem decrescente pela contagem de disciplinas.
Encontre os nomes e números de telefone dos alunos cujo endereço contenha "Beijing" ou "Shanghai".
Quais são os IDs, funções e nomes dos profissionais que realizaram dois ou mais tratamentos?
Qual é o nome da raça de cachorro mais comum?
Qual proprietário pagou mais pelo tratamento do seu cachorro? Liste o ID e o sobrenome do proprietário.
Informe o ID e o sobrenome do proprietário que mais gastou com o tratamento do seu cachorro.
Qual é a descrição do tipo de tratamento com o menor custo total?
-
Configure os seguintes parâmetros na cláusula
WITH():Parâmetro
Obrigatório
Descrição
basic_index_name
Sim
Nome da tabela de índice de recuperação no banco de dados atual.
to_optimize
Não
Especifica se deve haver otimização de SQL. Valores válidos:
-
0 (padrão): nenhuma otimização é realizada.
-
1: ativa a otimização de SQL. O PolarDB for AI reescreve o SQL gerado para melhorar seu desempenho.
basic_index_top
Não
Número máximo de tabelas relevantes a serem recuperadas. Deve ser um inteiro de 1 a 10.
-
O valor padrão é 3. Um valor de 1 geralmente é suficiente para consultas de tabela única.
-
Se uma consulta envolver várias tabelas, defina este valor como 4 ou superior para expandir a recuperação e melhorar os resultados.
basic_index_threshold
Não
Limiar de similaridade para recuperação de tabelas. O valor deve estar no intervalo (0,1].
O padrão é 0,1. Uma tabela só é recuperada se sua pontuação de relevância exceder esse limiar.
-
Exemplos
-
Exemplo 1: consulta básica com classificação
/*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_nl2sql, SELECT 'Show the names of teachers and the courses they teach, sorted in ascending alphabetical order by teacher name.') WITH (basic_index_name='schema_index');SELECT t.teacher_name, c.course_name FROM teachers t JOIN courses c ON t.id = c.teacher_id ORDER BY t.teacher_name ASC; -
Exemplo 2: consulta condicional com limitação e classificação
/*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_nl2sql, SELECT 'Find the 2 students with the most leave requests, sort them in descending order by the number of leave requests, and show their names and the leave count.') WITH (basic_index_name='schema_index');SELECT s.student_name, COUNT(sc.id) AS leave_count FROM students s JOIN student_courses sc ON s.id = sc.student_id WHERE sc.status = 0 GROUP BY s.student_name ORDER BY leave_count DESC LIMIT 2;
Uso avançado
O PolarDB for AI oferece quatro cenários de uso avançado. Se você encontrar os problemas a seguir, consulte as instruções correspondentes.
Configurar modelo de pergunta: configure modelos genéricos de perguntas para que o modelo gere instruções SQL baseadas em conhecimento específico.
Criar tabela de configuração: pré-processe perguntas ou pós-processe as instruções SQL geradas.
Comentários personalizados de tabela e coluna: caso não possa modificar os comentários originais da tabela ou coluna, adicione novos comentários para substituí-los.
Suporte a tabelas largas: quando uma tabela contém muitas colunas ou você encontra o erro
Please use column index to avoid oversize table information., crie uma tabela de índice de colunas para que o modelo possa trabalhar com tabelas largas.
Configurar modelos de pergunta
Os modelos de pergunta ajudam o modelo a entender questões dos usuários em domínios de conhecimento específicos. Configure modelos gerais de perguntas para fornecer conhecimento específico ao modelo, que ele usará para gerar SQL.
Procedimento
-
Criar uma tabela de modelo de pergunta
O nome da tabela de modelo de pergunta deve começar com
polar4ai_nl2sql_pattern, e seu esquema deve incluir as cinco colunas definidas na seguinte instruçãoCREATE TABLE.DROP TABLE IF EXISTS `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 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;Descrições das colunas
Parâmetro
Descrição
template question
Uma pergunta parametrizada que serve como entrada para o modelo de NL2SQL baseado em LLM.
Na pergunta do modelo, escreva os parâmetros no formato
#{XXX}.template description
Um resumo da pergunta do modelo, com entidades como datas, anos ou organizações extraídas como parâmetros. Essas entidades geralmente mapeiam para colunas específicas em uma tabela.
Na descrição do modelo, escreva os parâmetros no formato
[XXX], e sua ordem deve ser consistente com a ordem dos parâmetros na pergunta do modelo.template SQL
O SQL correto para a pergunta do modelo. Neste SQL, os parâmetros da pergunta do modelo são tratados como variáveis.
NotaOs parâmetros na pergunta do modelo e no SQL do modelo não precisam ser idênticos, mas devem estar relacionados. Por exemplo, os parâmetros podem compartilhar um prefixo comum, e seus valores podem ter um mapeamento um para um. Com
#{category}e#{categoryCode}, quando os valores de parâmetro paracategorysão "marca ordinária", "marca especial" e "marca coletiva", os valores correspondentes decategoryCodesão 0, 1 e 2, respectivamente. Para detalhes, veja o exemplo abaixo.template parameters
Uma string JSON composta por três parâmetros:
table_name,param_infoeexplanation.-
table_name
string: o nome da tabela usado no SQL do modelo. -
param_info
array: descrição dos parâmetros no SQL do modelo.-
param_name
string: o nome do parâmetro. -
value
array: valores de amostra para o parâmetro.Nota-
Se o parâmetro tiver um conjunto finito de valores enumerados, liste todos eles no array value, se possível.
-
Se você fornecer apenas valores de amostra, liste de 2 a 4 exemplos.
-
Se os parâmetros forem interdependentes, mapeie-os usando o índice do array. Por exemplo, com
#{category}e#{categoryCode}, "marca ordinária" emcategorycorresponde a 0 emcategoryCode, e "marca especial" corresponde a 1 emcategoryCode. Para detalhes, veja o exemplo abaixo.
-
-
-
explanation
string: notas adicionais, que geralmente descrevem requisitos para o SQL gerado, como quais informações retornar ou como interpretar campos específicos.
NotaSe os parâmetros do modelo não forem necessários, defina o valor como um dos seguintes:
-
NULL
-
Uma string vazia
-
Uma string de lista vazia: []
Exemplo
Pergunta do modelo
Descrição do modelo
SQL do modelo
Parâmetros do modelo
Query for courses with course name #{courseName} and teaching status #{status}
What are the courses with [Course Name] and [Teaching Status]?
SELECT course_name, course_time, course_location FROM courses WHERE course_name=#{courseName} AND status=#{statusCode}[{"table_name":"courses","param_info":[{"param_name":"#{courseName}","value":["Mathematics","Physics","Chemistry","English","History","Geography","Biology","Computer Science","Art","Music","Physical Education","Programming","Literature","Psychology","Philosophy","Economics","Sociology","Physics Lab","Chemistry Lab","Biology Lab"]},{"param_name": "#{status}", "value": ["Not started","In progress"]},{"param_name": "#{statusCode}","value": [0,1]}], "explanation": "Output the course name (course_name), course time (course_time), and course location (course_location). Note: status is a constant mapping type. The variable mapping field is statusCode."}]
What are the national standards planned for release in year #{issueDate} with project status #{projectStat}?
What are the [Project Status] national standards planned for release in [Year]?
SELECT DISTINCT planNum, projectCnName, projectStat FROM sy_cd_me_buss_std_gjbzjh WHERE `planNum` IS NOT NULL AND `dataStatus` != 3 AND `isValid` = 1 AND projectStat=#{projectStat} AND DATE_FORMAT(`issueDate`, '%Y')=#{issueDate}[{"table_name":"sy_cd_me_buss_std_gjbzjh","param_info":[{"param_name":"#{issueDate}","value":[2009,2010,2011,2012]},{"param_name":"#{projectStat}","value":["Seeking comments","Published","Under review"]}],"explanation":"Output standard name (projectCnName), plan number, and project status."}]
What are the trademarks with category #{category} and international classification #{intCls}?
What are the trademarks for [Trademark Type] in [International Classification]?
SELECT DISTINCT tmName, regNo, status FROM sy_cd_me_buss_ip_tdmk_new WHERE dataStatus!=3 AND isValid = 1 AND category=#{categoryCode} AND intCls=#{intClsCode}[{"table_name":"sy_cd_me_buss_ip_tdmk_new","param_info":[{"param_name":"#{intCls}","value":["Chemical raw materials","Paints","Cosmetics and cleaning preparations","Fuels and lubricants","Pharmaceuticals"]},{"param_name":"#{category}","value":["ordinary trademark","special trademark","collective trademark"]},{"param_name":"#{intClsCode}","value":[1,2,3,4,5]},{"param_name":"#{categoryCode}","value":[0,1,2]}],"explanation":"Output trademark name (tmName), application/registration number (regNo), and trademark status (status). Note: category is a constant mapping type. The variable mapping field is categoryCode. intCls is a constant mapping type. The variable mapping field is intClsCode."}]
Por exemplo, para criar a primeira pergunta de modelo mostrada na tabela acima, execute o seguinte SQL:
INSERT INTO `polar4ai_nl2sql_pattern` (`pattern_question`,`pattern_description`,`pattern_sql`,`pattern_params`) VALUES ('Query for courses with course name #{courseName} and teaching status #{status}','What are the courses with 【Course Name】【Teaching Status】?','SELECT course_name, course_time, course_location FROM courses WHERE course_name=#{courseName} AND status=#{statusCode}','[{"table_name":"courses","param_info":[{"param_name":"#{courseName}","value":["Mathematics","Physics","Chemistry","English","History","Geography","Biology","Computer Science","Art","Music","Physical Education","Programming","Literature","Psychology","Philosophy","Economics","Sociology","Physics Lab","Chemistry Lab","Biology Lab"]},{"param_name": "#{status}", "value": ["Not started","In progress"]},{"param_name": "#{statusCode}","value": [0,1]}], "explanation": "Output the course name (course_name), course time (course_time), and course location (course_location). Note: status is a constant mapping type. The variable mapping field is statusCode."}]'); -
-
Criar uma tabela de índice de modelo de pergunta
Use um nome personalizado para a tabela de índice, desde que siga as convenções de nomenclatura do banco de dados. Este exemplo usa
pattern_index. Execute o seguinte SQL para criar a tabela de índice de modelo de pergunta:/*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));NotaA tabela de índice de modelo de pergunta não aparece na lista de objetos do banco de dados. Para visualizá-la, execute
/*polar4ai*/SHOW TABLES;.Para excluir a tabela de índice de modelo de pergunta, por exemplo,
pattern_index, execute a instrução SQL/*polar4ai*/DROP TABLE IF EXISTS pattern_index;.
-
Importar dados para a tabela de índice
NotaA tabela de modelo de pergunta não pode estar vazia. Antes de executar o SQL para importar dados, adicione pelo menos um registro.
/*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_text2vec, SELECT '') WITH (mode='async', resource='pattern') INTO pattern_index;Parâmetros
_polar4ai_text2vecé o modelo de vetorização de texto.Após
INTO, especifique o nome da tabela de índice de modelo de pergunta criada na Etapa 2.-
Configure vários parâmetros na cláusula
WITH():Parâmetro
Obrigatório
Descrição
mode
Sim
Especifica o modo de gravação. Deve ser
asyncpara modo assíncrono.resource
Sim
Especifica o tipo de recurso. Deve ser
patternpara vetorizar informações do modelo de pergunta.pattern_table_name
Não
Nome da tabela de modelo de pergunta a ser vetorizada. Este é o nome da tabela da Etapa 1.
O valor padrão é
polar4ai_nl2sql_pattern, o que significa que a vetorização ocorre na tabelapolar4ai_nl2sql_pattern. Se você definir este parâmetro, deverá especificar um nome de tabela que comece compolar4ai_nl2sql_pattern.Para manter tabelas de índice de modelo de pergunta diferentes para cenários ou domínios de negócios distintos, especifique nomes de tabela diferentes ao criá-las. Por exemplo, se você criar uma tabela
polar4ai_nl2sql_pattern_userpara cenários relacionados a usuários, poderá definir o nome do índice comopattern_index_userna Etapa 2. Ao importar as informações, use a seguinte instrução SQL:/*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_text2vec, SELECT '') WITH (mode='async', resource='pattern', pattern_table_name='polar4ai_nl2sql_pattern_user') INTO pattern_index_user;
-
Verificar o status da tarefa
Após executar a instrução de importação, o sistema retorna um
task_id, comobce632ea-97e9-11ee-bdd2-492f4dfe0918. Execute o comando a seguir para verificar o status da tarefa./*polar4ai*/SHOW TASK `bce632ea-97e9-11ee-bdd2-492f4dfe0918`;Quando o status da tarefa for
finish, a importação estará concluída e o modelo poderá referenciar as informações do modelo de pergunta. Execute a seguinte instrução SQL para visualizar as informações do índice de modelo de pergunta:/*polar4ai*/SELECT * FROM pattern_index;NotaSe os dados na tabela
polar4ai_nl2sql_patternforem alterados, execute novamente o procedimento na Etapa 3. -
Executar uma consulta online com modelos de pergunta
Execute a seguinte instrução SQL para realizar uma consulta online usando NL2SQL baseado em LLM e modelos de pergunta:
/*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_nl2sql, SELECT 'Query for courses with the course name Mathematics and status in progress') WITH (basic_index_name='schema_index', pattern_index_name='pattern_index');SELECT course_name, course_time, course_location FROM courses WHERE course_name='Mathematics' AND status=1;Parâmetros
Após SELECT, insira a pergunta a ser convertida em SQL.
basic_index_nameé o nome da tabela de índice de busca do banco de dados atual.pattern_index_nameé o nome da tabela de índice de modelo de pergunta.-
Configure vários parâmetros na cláusula
WITH(). Para descrições de outros parâmetros, consulte Executar uma consulta online com NL2SQL baseado em LLM.Parâmetro
Descrição
Intervalo de valores
pattern_index_top
Número de modelos de pergunta mais próximos a serem recuperados.
Intervalo de valores: [1,10].
O valor padrão é 2, o que significa que apenas os 2 principais modelos são recuperados para a pergunta atual.
pattern_index_threshold
Limiar de similaridade para recuperar um modelo de pergunta.
Intervalo de valores: (0,1].
O valor padrão é 0,85, o que significa que um modelo só é selecionado se sua pontuação de similaridade vetorial exceder 0,85.
Criar uma tabela de configuração
Use uma tabela de configuração para pré-processar perguntas ou pós-processar o SQL gerado.
Casos de uso
-
Cenário 1: Substituir termos específicos em uma pergunta, como nomes, jargões do setor ou nomes de produtos.
Por exemplo: para todas as perguntas envolvendo
Zhang San, substituaZhang SanporZS001. Nesse caso, para as perguntasWhat were Zhang San's sales last month?eWhat are Zhang San's total sales for this year?, use uma tabela de configuração para pré-processá-las emWhat were ZS001's sales last month?eWhat are ZS001's total sales for this year?antes da chamada final ao modelo de linguagem grande. -
Cenário 2: Adicionar contexto extra a perguntas que contêm termos específicos.
Por exemplo, para todas as perguntas envolvendo
Total Sales, a fórmula de cálculoTotal Sales = SUM(Sales)deve ser anexada. Antes da chamada final ao modelo grande, essas informações podem ser adicionadas por meio de uma tabela de configuração e são anexadas quando a pergunta atende à condição correspondente. -
Cenário 3: Mapear e substituir valores para tabelas ou colunas específicas no SQL final.
Por exemplo, para todas as instruções SQL que envolvem a tabela
student_courses, substituastatus = 'leave'porstatus = 0como medida alternativa para mapeamento de valores de coluna.
Sintaxe
Use a seguinte instrução SQL para criar a tabela de configuração. O nome da tabela polar4ai_nl2sql_llm_config é fixo e não pode ser alterado.
DROP TABLE IF EXISTS `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 'Indicates if the configuration row is active',
`text_condition` text COMMENT 'Text condition for pre-processing',
`query_function` text COMMENT 'Query processing function',
`formula_function` text COMMENT 'Formula information function',
`sql_condition` text COMMENT 'SQL condition for post-processing',
`sql_function` text COMMENT 'SQL processing function',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
Alterações nos dados da tabela polar4ai_nl2sql_llm_config entram em vigor imediatamente. Nenhuma operação adicional é necessária.
Parâmetros
|
Parâmetro |
Descrição |
Valor |
Exemplo |
|
is_functional |
Indica se a regra nesta linha está ativa. Por padrão, todas as regras na tabela de configuração são aplicadas a cada consulta NL2SQL. Para desativar temporariamente uma regra de configuração sem excluí-la, defina is_functional como 0. |
|
|
|
text_condition |
Pré-processamento: avalia uma condição em relação ao texto da pergunta. Se a condição for atendida, as funções nas colunas query_function e formula_function serão aplicadas. |
|
Se text_condition for Por exemplo:
|
|
query_function |
Pré-processamento: transforma o texto da pergunta. Esta função é aplicada quando text_condition corresponde. |
|
Se query_function for Por exemplo:
|
|
formula_function |
Pré-processamento: adiciona informações contextuais, como uma fórmula, para conceitos específicos de negócios em uma pergunta. Esta função é aplicada quando text_condition corresponde. |
- |
Se formula_function for |
|
sql_condition |
Pós-processamento: avalia uma condição em relação à instrução SQL gerada pelo modelo. Se a condição for atendida, a função na coluna sql_function será aplicada. |
|
Se sql_condition for Por exemplo:
|
|
sql_function |
Pós-processamento: transforma o SQL gerado. Isso é útil para impor mapeamentos de valores baseados em lógica de negócios. Esta função é aplicada quando sql_condition corresponde. |
|
Se sql_function estiver definido como |
Exemplo
|
is_functional |
text_condition |
query_function |
formula_function |
sql_condition |
sql_function |
||
|
1 |
|
Li Si&&!!Wang Wu` |
|
||||
|
1 |
|
||||||
|
1 |
|
student_courses&&!!courses` |
|
-
Ao executar sem uma tabela de configuração, a seguinte consulta:
/*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_nl2sql, SELECT '筛选出2个请假次数最多的学生,按照学生的请假次数降序排列,显示学生的名字和请假次数。') WITH (basic_index_name='schema_index');SELECT s.student_name, COUNT(sc.id) AS leave_count FROM students s JOIN student_courses sc ON s.id = sc.student_id WHERE sc.status = 0 GROUP BY s.student_name ORDER BY leave_count DESC LIMIT 2; Crie a tabela de configuração conforme descrito na seção Sintaxe.
-
Adicione um registro de configuração. Esta regra especifica que, se uma instrução SQL referenciar a tabela
studentsou a tabelastudent_courses, mas não a tabelacourses, o sistema substituirástatus = 0porstatus = 10.INSERT INTO `polar4ai_nl2sql_llm_config` (`is_functional`,`sql_condition`,`sql_function`) VALUES (1,'students||student_courses&&!!courses','{"replace":{"status = 0":"status = 10"}}'); -
Execute a consulta da Etapa 1 novamente. O valor de
statusno SQL gerado agora é substituído conforme especificado pela regra./*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_nl2sql, SELECT '筛选出2个请假次数最多的学生,按照学生的请假次数降序排列,显示学生的名字和请假次数。') WITH (basic_index_name='schema_index');SELECT s.student_name, COUNT(sc.id) AS leave_count FROM students s JOIN student_courses sc ON s.id = sc.student_id WHERE sc.status = 10 GROUP BY s.student_name ORDER BY leave_count DESC LIMIT 2;
Personalizar comentários de tabela e coluna
Se não for possível modificar os comentários originais de uma tabela ou coluna conforme descrito em Preparar suas tabelas de dados, adicione comentários personalizados à tabela polar4ai_nl2sql_table_extra_info. Esses comentários substituem os originais quando você usa o NL2SQL baseado em LLM.
Sintaxe
A seguinte instrução SQL cria a tabela de comentários personalizados. O nome da tabela polar4ai_nl2sql_table_extra_info não pode ser alterado.
DROP TABLE IF EXISTS `polar4ai_nl2sql_table_extra_info`;
CREATE TABLE `polar4ai_nl2sql_table_extra_info` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'Primary key',
`table_name` text COMMENT 'Table name',
`table_comment` text COMMENT 'Table description',
`column_name` text COMMENT 'Column name',
`column_comment` text COMMENT 'Column description',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
Se você alterar os dados na tabela polar4ai_nl2sql_table_extra_info, execute novamente a etapa para importar informações da tabela de dados para o índice de esquema para que as alterações entrem em vigor.
Exemplo
Crie a tabela de comentários personalizados.
-
Atualize o comentário da coluna
statusna tabelastudent_courses. Este exemplo adiciona um novo mapeamento de opção: 2-Absent.INSERT INTO `polar4ai_nl2sql_table_extra_info` (`table_name`,`table_comment`,`column_name`,`column_comment`) VALUES ('student_courses','Student-course information table','status','Student status: 0-On leave, 1-Normal, 2-Absent.'); -
Execute novamente a etapa para importar informações da tabela de dados para o índice de esquema.
/*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_text2vec, SELECT '') WITH (mode='async', resource='schema') INTO schema_index; -
Verifique o status da tarefa.
Após executar a instrução de importação, o sistema retorna um
task_id, comobce632ea-97e9-11ee-bdd2-492f4dfe0918. Use o comando a seguir para verificar o status da importação. QuandotaskStatusforfinish, a tarefa estará concluída./*polar4ai*/SHOW TASK `bce632ea-97e9-11ee-bdd2-492f4dfe0918`; -
Execute uma consulta usando o NL2SQL baseado em LLM.
/*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_nl2sql, SELECT 'Show the names and number of absences for the 2 students with the most absences, sorted in descending order.') WITH (basic_index_name='schema_index');SELECT s.student_name, COUNT(sc.id) AS absence_count FROM student_courses sc JOIN students s ON sc.student_id = s.id WHERE sc.status = 2 GROUP BY s.student_name ORDER BY absence_count DESC LIMIT 2;A saída mostra que o modelo NL2SQL baseado em LLM agora mapeia corretamente Absent para o valor 2 na coluna
statusda tabelastudent_courses.
Suporte a tabelas largas
Se suas tabelas de dados incluírem tabelas largas com muitas colunas, ou se você receber o erro Please use column index to avoid oversize table information. ao usar o NL2SQL baseado em LLM, utilize este procedimento.
Ao usar o NL2SQL baseado em LLM online, tanto basic_index_name quanto pattern_index_name na cláusula WITH() podem usar o mesmo column_index_name. Diferentemente da indexação schema ou pattern, este método serve apenas para simplificar informações.
Para a maioria das solicitações, o parâmetro column_index_name não tem efeito. Ele é necessário apenas para solicitações NL2SQL que atingem o limite de tamanho. Nesses casos, column_index_name simplifica as informações da tabela. Isso pode causar alguma perda de precisão, mas evita efetivamente erros no modelo NL2SQL baseado em LLM causados por um prompt excessivamente longo.
-
Crie uma tabela de índice de colunas.
Use um nome personalizado para a tabela de índice de colunas, desde que siga as convenções de nomenclatura do banco de dados e não entre em conflito com os nomes das tabelas existentes. Apenas uma tabela de índice de colunas é necessária por banco de dados. Use a seguinte instrução CREATE TABLE:
/*polar4ai*/CREATE TABLE column_index(id integer, table_name varchar, table_comment text_ik_max_word, column_name text_ik_max_word, column_comment text_ik_max_word, is_primary integer, is_foreign integer, vecs vector_768, ext text_ik_max_word, PRIMARY KEY (id));NotaA tabela de índice de colunas não é exibida diretamente no banco de dados. Para visualizar suas informações, execute a instrução SQL
/*polar4ai*/SHOW TABLES;.Para excluir a tabela de índice de colunas, por exemplo
column_index, execute a instrução SQL/*polar4ai*/DROP TABLE IF EXISTS column_index;.
-
Importe informações no nível de coluna das tabelas de dados para a tabela de índice de colunas.
/*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_text2vec, select '') WITH (mode='async', resource='column') into column_index; -
Verifique o status da tarefa.
Após executar a instrução de importação, o sistema retorna um
task_id, comobce632ea-97e9-11ee-bdd2-492f4dfe0918. Execute o comando a seguir para visualizar o status da importação. A tarefa estará concluída quando otaskStatusforfinish./*polar4ai*/SHOW TASK `bce632ea-97e9-11ee-bdd2-492f4dfe0918`; -
Use o NL2SQL baseado em LLM online com tabelas largas.
/*polar4ai*/SELECT * FROM PREDICT (MODEL _polar4ai_nl2sql, SELECT 'Sort by teacher name in ascending alphabetical order, and display the teacher''s name and the names of the courses they teach.') WITH (basic_index_name='schema_index', column_index_name='column_index');