Introdução geral
O SQLite-Utils-Ask é uma ferramenta avançada criada para ajudar os usuários a realizar consultas de dados com perguntas e respostas em bancos de dados SQLite e arquivos CSV/JSON com o auxílio do LLM (Large Language Model). A ferramenta é capaz de gerar automaticamente consultas SQL apropriadas com base nas perguntas do usuário e executar as consultas para retornar os resultados, simplificando bastante o processo de análise e processamento de dados.
Lista de funções
- questionamento em linguagem naturalPerguntas: faça perguntas sobre os dados no banco de dados por meio de linguagem natural, e a ferramenta gerará automaticamente as consultas SQL correspondentes.
- Compatibilidade do banco de dadosSuporte ao banco de dados SQLite para facilitar o gerenciamento e a consulta de dados.
- Manuseio de arquivos CSV/JSONSuporte à consulta direta de arquivos CSV, TSV ou JSON.
- Pesquisa de vários documentosSuporte a consultas federadas para vários documentos.
- ferramenta de linha de comandoInterface de linha de comando: fornece uma interface de linha de comando fácil de usar que permite aos usuários executar consultas rapidamente.
- Suporte a plug-insPode ser integrado a ferramentas como o sqlite-utils para ampliar a funcionalidade e os cenários de aplicativos.
Fazer perguntas sobre bancos de dados SQLite e arquivos CSV/JSON no Terminal
Estou trabalhando na minha ferramenta CLI sqlite-utils para oCriei um novo plug-in que permite fazer perguntas em linguagem humana diretamente para bancos de dados SQLite e arquivos CSV/JSON em seu computador.
Seu nome é sqlite-utils-ask. Instale-o da seguinte forma:
Instalação do sqlite-utils sqlite-utils-ask
Ele obtém a chave de API da variável de ambienteOPENAI_API_KEY
ou você pode instalar o LLM e usar oConjunto de chaves llm openaiArmazene a chave em um arquivo de configuração.
Então, você pode usá-lo da seguinte forma:
curl -O https://datasette.io/content.db
sqlite-utils perguntou a content.db " Qual é o número de downloads do sqlite-utils pypi em 2024?"
Esse comando extrairá o esquema SQL do arquivo de banco de dados fornecido, o enviará ao LLM com sua pergunta, retornará a consulta SQL e tentará executá-la para produzir resultados.
Se tudo correr bem, ele fornecerá a seguinte resposta:
SELECT SUM(downloads)
FROM stats
WHERE package = 'sqlite-utils' AND date >= '2024-01-01' AND date < '2025-01-01'.
[
{
"SUM(downloads)": 4300221
}
]
Se a execução da consulta SQL falhar (devido a algum erro de sintaxe), ele passará esse erro de volta ao modelo para correção e tentará novamente até três vezes antes de desistir.
aumentar-v/--verbose
para ver os prompts exatos que ele usa:
Prompt do sistema.
Você receberá um esquema SQLite seguido de uma pergunta. Gere uma única consulta SQL para responder a essa pergunta.
Gere uma única consulta SQL para responder a essa pergunta. Retorne essa consulta em um ```sql ...'' Retornar essa consulta em uma ``sql ...''
Retornar essa consulta em um bloco de código vedado ``sql ...''.
Exemplo: Quantos repositórios existem?
Resposta: bloco de código vedado ``sql ...''.
```sql
select count(*) from repos
Prompt.
...
CREATE TABLE [stats] (
[pacote] TEXTO,
[data] TEXTO,
[downloads] INTEGER,
PRIMARY KEY ([package], [date])
);
...
quantos downloads do sqlite-utils pypi em 2024?
Eu trunquei o texto acima para incluir apenas as tabelas relevantes - na verdade, ele contém o esquema completo de cada tabela desse banco de dados.
Por padrão, a ferramenta enviará apenas esse esquema de banco de dados e sua pergunta para o LLM e, se você adicionar a opção `-e/--examples`, ela também incluirá cinco valores públicos para cada coluna de texto nesse esquema, com um comprimento médio de menos de 32 caracteres. Por exemplo, o envio dos valores "CA", "FL" e "TX" para a coluna `state` pode sugerir que o modelo deve usar as abreviações de estado abreviações de estado em vez de nomes completos.
#### Problemas ao solicitar dados CSV e JSON
O núcleo da CLI do `sqlite-utils` normalmente é executado diretamente em arquivos SQLite, mas há três anos adicionei a capacidade de usar o comando [sqlite-utils memory](https://simonwillison.net/2021/Jun/19/sqlite-utils-memory/) para obter diretamente dados CSV e JSON. Há três anos, adicionei a capacidade de executar consultas SQL diretamente em arquivos CSV e JSON usando o comando [sqlite-utils memory](). Isso funciona carregando dados em um banco de dados SQLite na memória antes de executar a consulta SQL.
Decidi reutilizar esse mecanismo para habilitar dicas LLM diretamente em dados CSV e JSON.
O comando ``sqlite-utils ask-files`` tem a seguinte aparência:
```shell
sqlite-utils ask-files transaction.csv "Total de vendas por ano"
Esse comando aceita um ou mais arquivos, que você pode fornecer em uma combinação de formatos CSV, TSV e JSON. Cada arquivo fornecido será importado para uma tabela diferente, permitindo que o modelo construa consultas de junção, se necessário.
Nota de implementação
A implementação principal do plug-in é aproximadamente250 linhas de código PythonUsosqlite-utils
register_commands()Ganchos de plug-in para adicionarperguntar
responder cantandoperguntar-arquivos
Comando.
Ele adiciona o LLM como uma dependência e usa a funçãoAPI do Pythonpara abstrair os detalhes do diálogo com o modelo. Isso significa que osqlite-utils-ask
Qualquer modelo compatível com o LLM ou seus plug-ins pode ser usado - se você quiser passar o Claude 3.5 O Sonnet executa o prompt e você pode fazer o seguinte:
sqlite-utils instala o llm-claude-3
sqlite-utils ask content.db "count rows in news table" -m claude-3.5-sonnet
Inicialmente, o padrão do plug-in é gpt-4o-mini para aproveitar o cache automático de dicas do modelo: se você executar várias perguntas no mesmo esquema, acabará enviando o mesmo prefixo de dica longo várias vezes, e o cache de dicas da OpenAI deve entrar em ação automaticamente e fornecer um desconto 50% para esses tokens de entrada.
Em seguida, analisei os números reais e descobri o seguintegpt-4o-mini
É barato o suficiente para que, mesmo sem armazenar em cache 4.000 token hints (que é um esquema SQL bem grande), o custo seja inferior a um décimo de centavo. Portanto, nem vale a pena mencionar essa economia de cache!