۲۹ شهریور ۱۴۰۳

Techboy

اخبار و اطلاعات روز تکنولوژی

نحوه استفاده از GPT به عنوان یک زبان طبیعی برای موتور جستجوی SQL

خروجی هوش مصنوعی مولد همیشه قابل اعتماد نیست، اما در اینجا نحوه بهبود کد و جستجوهای ایجاد شده توسط فناوری پشت سر ChatGPT و جلوگیری از ارسال داده های حساس آورده شده است.

خروجی هوش مصنوعی مولد همیشه قابل اعتماد نیست، اما در اینجا نحوه بهبود کد و جستجوهای ایجاد شده توسط فناوری پشت سر ChatGPT و جلوگیری از ارسال داده های حساس آورده شده است.

به لطف فناوری پشت ChatGPT، پرس و جو از مجموعه داده به زبان انگلیسی ساده به طرز شگفت آوری ساده شده است.

همانند بیشتر هوش مصنوعی مولد، نتایج API OpenAI همچنان باقی است ناقص است، به این معنی که شما نمی توانید فقط به آنها اعتماد کنید. خوشبختانه، اکنون می‌توانید کد بنویسید تا از GPT بپرسید چگونه پاسخ را محاسبه می‌کند—و سپس اگر با این رویکرد موافق هستید، می‌توانید کد را خودتان اجرا کنید. این به این معنی است که شما می توانید سوالاتی را به زبان طبیعی بپرسید، مانند “کل فروش بر اساس منطقه در سال گذشته چقدر بود؟” و از صحت پاسخ اطمینان داشته باشید.

در اینجا یک تکنیک سریع و کثیف برای تنظیم یک جستجوی زبان طبیعی از پایگاه داده خود با GPT وجود دارد:

  1. ساختار داده‌های خود، چند ردیف نمونه یا هر دو را در یک رشته متن قرار دهید.
  2. با آن اطلاعات به همراه سؤال زبان طبیعی خود، یک «پیام» برای هوش مصنوعی ایجاد کنید.
  3. پست را به API GPT-3.5-turbo OpenAI بفرستید و برای پاسخ به سوال خود درخواست SQL کنید.
  4. برای محاسبه پاسخ شما، SQL را اجرا کنید که بر روی مجموعه داده شما باز می گردد.
  5. (اختیاری) یک برنامه کاربردی تعاملی ایجاد کنید تا جستجوی مجموعه داده به زبان انگلیسی ساده را آسان کنید.

این روش در هنگام مدیریت داده های دنیای واقعی چندین مزیت دارد. با ارسال تنها ساختار داده و برخی ردیف‌های نمونه (که می‌تواند شامل داده‌های جعلی باشد)، نیازی به ارسال داده‌های حساس واقعی به OpenAI نیست. همچنین اگر داده های شما برای محدودیت های اندازه سریع OpenAI بیش از حد بزرگ باشد، جای نگرانی نیست. و با درخواست SQL به‌جای پاسخ نهایی، امکان بررسی نحوه ایجاد پاسخ GPT در این فرآیند نشان داده می‌شود.

هوش مصنوعی مولد برای جستارهای سازمانی

اگر در مورد استفاده از هوش مصنوعی مولد برای توسعه پرس و جوهای سطح سازمانی جدی هستید، ممکن است بخواهید ابزارهایی مانند LangChain، چارچوبی برای کار با چندین مدل زبان بزرگ مختلف (LLM)، نه تنها GPT OpenAI. OpenAI همچنین اخیراً امکان گنجاندن تماس‌های تابعی را اعلام کرده است. درخواست‌های API، که با هدف آسان‌تر کردن و قابل اعتماد کردن پرس‌وجو و کارهای مشابه است. اما برای یک نمونه اولیه سریع یا استفاده شخصی شما، فرآیندی که در اینجا توضیح داده شده است یک راه آسان برای شروع است. نمایش من با R انجام می‌شود، اما این تکنیک تقریباً در هر زبان برنامه‌نویسی کار می‌کند.

مرحله ۱: داده های نمونه خود را به یک رشته تک نویسه تبدیل کنید

داده‌های نمونه در این مرحله می‌تواند شامل طرح پایگاه داده و/یا چند ردیف داده باشد. تبدیل همه آن به یک رشته تک نویسه مهم است زیرا بخشی از جستار بزرگتر رشته متنی خواهد بود که به GPT 3.5 ارسال می کنید.

اگر داده های شما از قبل در پایگاه داده SQL هستند، این مرحله باید بسیار آسان باشد. اگر اینطور نیست، پیشنهاد می‌کنم آن را به فرمت SQL-queryable تبدیل کنید. چرا؟ پس از آزمایش نتایج کد R و SQL، من به کد SQL که GPT تولید می کند بیشتر از کد R آن اطمینان دارم. (من گمان می کنم دلیل آن این است که LLM داده های SQL بیشتری نسبت به R برای آموزش داشت.)

در R، بسته sqldf به شما امکان می دهد پرس و جوهای SQL را روی یک قاب داده R اجرا کنید ، و این چیزی است که در این مثال استفاده خواهم کرد. یک کتابخانه sqldf مشابه در پایتون وجود دارد. برای داده‌های بزرگ‌تر که عملکرد مهم است، ممکن است بخواهید پروژه duckdb را بررسی کنید. p>

اطلاعات سرشماری برای نسخه آزمایشی

توجه داشته باشید که برای نمایش خود، از یک فایل CSV با داده های جمعیت ایالت سرشماری ایالات متحده استفاده خواهم کرد که در states.csv.

کد زیر فایل داده را به R وارد می کند، از sqldf استفاده می کند تا ببیند اگر قاب داده یک جدول پایگاه داده SQL بود، طرحواره SQL چگونه به نظر می رسید، سه ردیف نمونه را با dplyr استخراج می کند. تابع filter() است و هر دو ردیف طرحواره و نمونه را به رشته های کاراکتری تبدیل می کند. سلب مسئولیت: ChatGPT قسمت پایه R apply() از کد را نوشت که داده ها را به یک رشته تبدیل می کند (من معمولاً این کارها را با purrr انجام می دهم).


library(rio)
library(dplyr)
library(sqldf)
library(glue)
states <- rio::import("https://raw.githubusercontent.com/smach/SampleData/main/states.csv") |>
  filter(!is.na(Region))

states_schema <- sqldf("PRAGMA table_info(states)")
states_schema_string <- paste(apply(states_schema, 1, paste, collapse = "\t"), collapse = "\n")

states_sample <- dplyr::sample_n(states, 3)
states_sample_string <- paste(apply(states_sample, 1, paste, collapse = "\t"), collapse = "\n")

مرحله ۲: یک درخواست برای LLM ایجاد کنید

قالب باید چیزی شبیه به «به گونه‌ای رفتار کنید که گویی یک دانشمند داده هستید. شما یک جدول SQLite به نام {table_name} با طرح زیر دارید: ```{schema}```. سطرهای اول به این شکل هستند: ```{rows_sample}```. بر اساس این داده ها، یک پرسش SQL برای پاسخ به سؤال زیر بنویسید: {query}. فقط SQL را برگردانید، توضیحات اضافه نشود.”

عملکرد زیر یک پرس و جو در آن نوع قالب ایجاد می کند و آرگومان هایی را برای طرح داده، ردیف های نمونه، پرس و جو کاربر و نام جدول می گیرد.


create_prompt <- function(schema, rows_sample, query, table_name) {
  glue::glue("Act as if you're a data scientist. You have a SQLite table named {table_name} with the following schema:
  
             ```
             {schema}
             ```
             
             The first rows look like this: 
             
             ```{rows_sample}```
             
             Based on this data, write a SQL query to answer the following question: {query}. Return the SQL query ONLY. Do not include any additional explanation.")
}

مرحله ۳: ارسال داده ها به API OpenAI

می‌توانید با برش و چسباندن داده‌ها در یکی از رابط‌های وب OpenAI شروع کنید تا نتایج را در ChatGPT یا زمین بازی OpenAI API ببینید. ChatGPT برای استفاده هزینه ای دریافت نمی کند، اما نمی توانید نتایج را تغییر دهید. زمین بازی به شما امکان می‌دهد چیزهایی مانند دما را تنظیم کنید – به این معنی که واکنش باید چقدر “تصادفی” یا خلاقانه باشد – و اینکه از کدام مدل می‌خواهید استفاده کنید. برای کد SQL، دما را روی ۰ تنظیم کردم.

بعد، یک سوال زبان طبیعی را در متغیر my_query ذخیره می‌کنم، با تابع create_prompt() خود یک درخواست ایجاد می‌کنم و می‌بینم وقتی آن درخواست را در آن قرار می‌دهم چه اتفاقی می‌افتد. زمین بازی API:


> my_query <- "What were the highest and lowest Population changes in 2020 by Division?"
> my_prompt <- get_query(states_schema_string, states_sample_string, my_query, "states")
> cat(my_prompt)
Act as if you're a data scientist. You have a SQLite table named states with the following schema:
  
```
۰	State	TEXT	۰	NA	۰
۱	Pop_2000	INTEGER	۰	NA	۰
۲	Pop_2010	INTEGER	۰	NA	۰
۳	Pop_2020	INTEGER	۰	NA	۰
۴	PctChange_2000	REAL	۰	NA	۰
۵	PctChange_2010	REAL	۰	NA	۰
۶	PctChange_2020	REAL	۰	NA	۰
۷	State Code	TEXT	۰	NA	۰
۸	Region	TEXT	۰	NA	۰
۹	Division	TEXT	۰	NA	۰
```

The first rows look like this: 

```Delaware	 ۷۸۳۶۰۰	 ۸۹۷۹۳۴	 ۹۸۹۹۴۸	۱۷.۶	۱۴.۶	۱۰.۲	DE	South	South Atlantic
Montana	 ۹۰۲۱۹۵	 ۹۸۹۴۱۵	۱۰۸۴۲۲۵	۱۲.۹	 ۹.۷	 ۹.۶	MT	West	Mountain
Arizona	۵۱۳۰۶۳۲	۶۳۹۲۰۱۷	۷۱۵۱۵۰۲	۴۰.۰	۲۴.۶	۱۱.۹	AZ	West	Mountain```

Based on this data, write a SQL query to answer the following question: What were the highest and lowest Population changes in 2020 by Division?. Return the SQL query ONLY. Do not include any additional explanation.

کد وارد شده در زمین بازی OpenAI

اعلام وارد زمین بازی OpenAI API و کد SQL حاصل شد.

در اینجا نتایج زمانی که SQL پیشنهادی را اجرا می‌کنم نشان می‌دهد:


sqldf("SELECT Division, MAX(PctChange_2020) AS Highest_PctChange_2020,      MIN(PctChange_2020) AS Lowest_PctChange_2020 FROM states GROUP BY Division;")
            Division Highest_PctChange_2020 Lowest_PctChange_2020
۱ East North Central                    4.7                  -0.1
۲ East South Central                    8.9                  -0.2
۳    Middle Atlantic                    5.7                   2.4
۴           Mountain                   18.4                   2.3
۵        New England                    7.4                   0.9
۶            Pacific                   14.6                   3.3
۷     South Atlantic                   14.6                  -3.2
۸ West North Central                   15.8                   2.8
۹ West South Central                   15.9                   2.7

ChatGPT نه تنها SQL دقیق ایجاد کرد، بلکه من مجبور نبودم به GPT بگویم که “تغییر جمعیت ۲۰۲۰” در ستون Pop_2020 است.

مرحله ۴: نتایج کد SQL بازگشتی توسط GPT را اجرا کنید

ارسال و بازگرداندن داده ها به و از OpenAI به صورت برنامه نویسی به جای برش و چسباندن آنها در یک رابط وب بسیار راحت تر است. چند بسته بسته R برای کار با OpenAI API وجود دارد. بلوک کد زیر با استفاده از بسته openai یک درخواست به API می فرستد، پاسخ API را ذخیره می کند، بخشی از پاسخ حاوی متن را با کد SQL درخواستی استخراج می کند، آن کد را چاپ می کند و کد را اجرا می کند. SQL روی داده ها.


library(openai)
my_results <- openai::create_chat_completion(model =  "gpt-3.5-turbo", temperature = 0, messages =  list(
  list(role = "user", content = my_prompt)
)) 
the_answer <- my_results$choices$message.content

cat(the_answer) SELECT Division, MAX(PctChange_2020) AS Highest_Population_Change, MIN(PctChange_2020) AS Lowest_Population_Change FROM states GROUP BY Division;
sqldf(the_answer) Division Highest_Population_Change Lowest_Population_Change ۱ East North Central 4.7 -0.1 ۲ East South Central 8.9 -0.2 ۳ Middle Atlantic 5.7 2.4 ۴ Mountain 18.4 2.3 ۵ New England 7.4 0.9 ۶ Pacific 14.6 3.3 ۷ South Atlantic 14.6 -3.2 ۸ West North Central 15.8 2.8 ۹ West South Central 15.9 2.7

اگر می‌خواهید از API استفاده کنید، به کلید OpenAI API نیاز دارید. برای این بسته، کلید باید در یک متغیر محیطی سیستم مانند OPENAI_API_KEY ذخیره شود. توجه داشته باشید که استفاده از API رایگان نیست، اما من این پروژه را بیش از ده بار یک روز قبل از اینکه آن را به ویرایشگر خود تبدیل کنم، اجرا کردم و کل استفاده از حساب من ۱ سنت بود.

مرحله ۵ (اختیاری): یک برنامه تعاملی ایجاد کنید

شما اکنون تمام کدهای مورد نیاز برای اجرای پرس و جو خود را در یک گردش کار R در یک اسکریپت یا ترمینال دارید. اما اگر می‌خواهید یک برنامه تعاملی برای جستجوی داده‌ها به زبان ساده بسازید، من کد یک برنامه اصلی Shiny را اضافه کرده‌ام که می‌توانید از آن استفاده کنید.