Инструмент CLI, который позволит вам задавать вопросы GPT о любой базе данных Postgres. Просто укажите данные вашего подключения, и Ask-ваша база данных автоматически загрузит схему, получит примеры данных и выполнит для вас запросы. Лучше всего работает с GPT-4.
Примечание. При этом запросы, предоставленные GPT, будут напрямую выполняться в предоставленной вами базе данных. Если это соединение не предназначено только для чтения, это означает, что оно может случайно удалить или обновить данные. Пожалуйста, используйте с осторожностью и всегда сохраняйте резервные копии своих данных.
Сначала создайте файл конфигурации JSON:
{
"openAIAPIKey" : " xxx " ,
"openAIModel" : " gpt-4 " ,
"dbTimeoutMs" : 20000 ,
"apiTimeoutMs" : 30000 ,
"postgresConnection" : {
"host" : " localhost " ,
"port" : 5432 ,
"database" : " imdb " ,
"user" : " imdb " ,
"password" : " 1234 "
}
}
Затем вызовите это с помощью файла конфигурации следующим образом:
npx ask-your-database myConfig.json
В этом примере используется пример базы данных Postgres IMDB из RyanMarcus/imdb_pg_dataset. Вы можете загрузить его, загрузив этот архив и используя pg_restore --database=db_name --user=user imdb_pg11
.
Во-первых, это расскажет вам немного о вашей базе данных и побудит вас задать первоначальный вопрос:
> 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)
Затем можно задать вопрос, например:
> What movies did Keanu Reeves act in?
Если ответ включает SQL-запрос, этот инструмент автоматически запустит его и покажет результаты:
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
Когда вы отправляете ответ в GPT, результат будет включен:
> 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?
Используя новые результаты и прошлый контекст, GPT затем выполнит больше запросов и улучшит свои результаты:
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
(Наш пример набора данных включает только данные до 2013 года)
Затем вы можете продолжить уточнение результатов:
> This is great, but can you omit the ones with null production_year?
Ответ:
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
И так далее!
Это объединяет несколько простых вещей:
Используя pnpm или другой менеджер пакетов Node:
pnpm install
pnpm start yourConfig.json
Обратите внимание, что ваша схема базы данных и любые данные, запрошенные GPT, будут отправлены в OpenAI для обработки в облаке. Соблюдайте соответствующую осторожность в зависимости от ваших данных.