Un outil CLI qui vous permettra de poser des questions GPT sur n'importe quelle base de données Postgres. Fournissez simplement vos détails de connexion et Ask-your-database charge automatiquement le schéma, obtient des exemples de données et exécute des requêtes pour vous. Cela fonctionne mieux avec GPT-4.
Remarque : Cela exécutera directement les requêtes fournies par GPT sur la base de données que vous fournissez. À moins qu'il ne s'agisse d'une connexion en lecture seule, cela signifie qu'elle peut supprimer ou mettre à jour des données par accident. Veuillez utiliser avec prudence et toujours conserver des sauvegardes de vos données.
Tout d'abord, créez un fichier de configuration JSON :
{
"openAIAPIKey" : " xxx " ,
"openAIModel" : " gpt-4 " ,
"dbTimeoutMs" : 20000 ,
"apiTimeoutMs" : 30000 ,
"postgresConnection" : {
"host" : " localhost " ,
"port" : 5432 ,
"database" : " imdb " ,
"user" : " imdb " ,
"password" : " 1234 "
}
}
Ensuite, appelez ceci avec le fichier de configuration comme ceci :
npx ask-your-database myConfig.json
Cet exemple utilise un exemple de base de données postgres IMDB de RyanMarcus/imdb_pg_dataset. Vous pouvez le charger en téléchargeant cette archive et en utilisant pg_restore --database=db_name --user=user imdb_pg11
.
Tout d’abord, cela vous en dira un peu plus sur votre base de données et vous posera une première question :
> npx [email protected] imdbConfig.json
You are connected to the database imdb. It has the following tables:
aka_name, aka_title, cast_info, char_name, comp_cast_type, company_name, company_type,
complete_cast, info_type, keyword, kind_type, link_type, movie_companies, movie_info,
movie_info_idx, movie_keyword, movie_link, name, person_info, role_type, title
? Ask me a question about this database, and I'll try to answer! (q to quit)
Ensuite, vous pouvez poser une question, par exemple :
> What movies did Keanu Reeves act in?
Si la réponse inclut une requête SQL, cet outil l'exécutera automatiquement pour vous et affichera les résultats :
To answer your question, we'll need to join the 'name' table to find Keanu Reeves' person_id,
and then join the 'cast_info' table to get the movie_ids in which Keanu Reeves appeared as an
actor, and finally join the 'title' table to get the titles of those movies.
Please run the following query:
SELECT title.title
FROM name
JOIN cast_info ON name.id = cast_info.person_id
JOIN title ON cast_info.movie_id = title.id
JOIN role_type ON cast_info.role_id = role_type.id
WHERE name.name ILIKE 'Reeves, Keanu' AND role_type.role = 'actor';
Returned 253 rows. Here are the first 101 rows:
┌─────────┬────────────────────────────────────────────────────────────────────────────┐
│ (index) │ title │
├─────────┼────────────────────────────────────────────────────────────────────────────┤
│ 0 │ '101 Biggest Celebrity Oops' │
│ 1 │ '1992 MTV Movie Awards' │
│ 2 │ '1993 MTV Movie Awards' │
│ 3 │ '1995 MTV Movie Awards' │
│ 4 │ '1999 MTV Movie Awards' │
│ 5 │ '2000 Blockbuster Entertainment Awards' │
│ 6 │ '2003 MTV Movie Awards' │
│ 7 │ '2004 Taurus World Stunt Awards' │
│ 8 │ '2006 MTV Movie Awards' │
│ 9 │ '47 Ronin' │
│ 10 │ "A Man's Story" │
│ 11 │ 'A Scanner Darkly' │
... some results truncated
Lorsque vous envoyez la réponse à GPT, le résultat sera inclus :
> This is great, but it includes things that aren't movies. Can you filter to only
movies, and also sort to show the most recent first?
En utilisant les nouveaux résultats et le contexte passé, GPT exécutera alors davantage de requêtes et améliorera ses résultats :
To filter only movies and sort them by the most recent first, we need to join the 'kind_type'
table to get the movie kind and filter by 'movie', and order the result by 'production_year'
in descending order. Please run the following query:
SELECT title.title, title.production_year
FROM name
JOIN cast_info ON name.id = cast_info.person_id
JOIN title ON cast_info.movie_id = title.id
JOIN role_type ON cast_info.role_id = role_type.id
JOIN kind_type ON title.kind_id = kind_type.id
WHERE name.name ILIKE 'Reeves, Keanu' AND role_type.role = 'actor' AND kind_type.kind = 'movie'
ORDER BY title.production_year DESC;
Returned 64 rows. Here are the first 51 rows:
┌─────────┬─────────────────────────────────────┬─────────────────┐
│ (index) │ title │ production_year │
├─────────┼─────────────────────────────────────┼─────────────────┤
│ 0 │ 'John Wick' │ null │
│ 1 │ 'Passengers' │ null │
│ 2 │ 'Jekyll' │ null │
│ 3 │ 'Jekyll' │ null │
│ 4 │ 'Man of Tai Chi' │ 2013 │
│ 5 │ '47 Ronin' │ 2013 │
│ 6 │ 'Side by Side' │ 2012 │
│ 7 │ 'Generation Um...' │ 2012 │
│ 8 │ 'Sunset Strip' │ 2012 │
... some results truncated
(Notre exemple d'ensemble de données comprend uniquement les données jusqu'en 2013)
Ensuite, vous pouvez continuer à affiner les résultats :
> This is great, but can you omit the ones with null production_year?
La réponse :
To omit the ones with null production_year, add a condition in the WHERE clause. Please run the
following query:
SELECT title.title, title.production_year
FROM name
JOIN cast_info ON name.id = cast_info.person_id
JOIN title ON cast_info.movie_id = title.id
JOIN role_type ON cast_info.role_id = role_type.id
JOIN kind_type ON title.kind_id = kind_type.id
WHERE name.name ILIKE 'Reeves, Keanu' AND role_type.role = 'actor' AND kind_type.kind = 'movie' AND title.production_year IS NOT NULL
ORDER BY title.production_year DESC;
Returned 60 rows. Here are the first 51 rows:
┌─────────┬─────────────────────────────────────┬─────────────────┐
│ (index) │ title │ production_year │
├─────────┼─────────────────────────────────────┼─────────────────┤
│ 0 │ '47 Ronin' │ 2013 │
│ 1 │ 'Man of Tai Chi' │ 2013 │
│ 2 │ 'Sunset Strip' │ 2012 │
│ 3 │ 'Side by Side' │ 2012 │
│ 4 │ 'Generation Um...' │ 2012 │
│ 5 │ "A Man's Story" │ 2010 │
│ 6 │ "Henry's Crime" │ 2010 │
│ 7 │ 'The Private Lives of Pippa Lee' │ 2009 │
│ 8 │ 'Street Kings' │ 2008 │
│ 9 │ 'The Day the Earth Stood Still' │ 2008 │
... some results truncated
Et ainsi de suite!
Cela combine quelques choses simples ensemble :
En utilisant pnpm ou le gestionnaire de packages Node de votre choix :
pnpm install
pnpm start yourConfig.json
Notez que votre schéma de base de données et toutes les données interrogées par GPT seront envoyés à OpenAI pour traitement dans le cloud. Faites preuve de la prudence appropriée en fonction de vos données.