أداة CLI تتيح لك طرح أسئلة GPT حول أي قاعدة بيانات Postgres. ما عليك سوى تقديم تفاصيل الاتصال الخاصة بك، وستقوم قاعدة البيانات Ask-your-database بتحميل المخطط تلقائيًا، والحصول على بيانات الأمثلة، وتشغيل الاستعلامات نيابةً عنك. يعمل بشكل أفضل مع 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
يستخدم هذا المثال نموذج قاعدة بيانات IMDB postgres من 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 للمعالجة في السحابة. توخي القدر المناسب من الحذر اعتمادًا على بياناتك.