Postgres 데이터베이스에 대해 GPT에 질문할 수 있는 CLI 도구입니다. 연결 세부 정보를 제공하기만 하면 데이터베이스 요청이 자동으로 스키마를 로드하고 예제 데이터를 가져오고 쿼리를 실행합니다. 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
이 예에서는 RyanMarcus/imdb_pg_dataset의 IMDB postgres 데이터베이스 예를 사용하고 있습니다. 이 아카이브를 다운로드하고 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로 전송됩니다. 데이터에 따라 적절한 주의를 기울이십시오.