인공지능과 데이터 분야에 대한 관심이 점점 커지고 있는 요즘, 많은 사람이 실제로 어떻게 기술을 활용할 수 있을지 고민하고 있다. 이번 강의는 파이썬과 OpenAI API를 이용해 데이터를 다루고, 의미 있는 결과물을 도출하는 과정을 다룬다. 파이썬을 어느 정도 다룰 줄 안다면 누구나 따라 할 수 있는 실습 프로젝트들로 구성되어 있어, 학습자가 자신의 실력을 자연스럽게 발전시킬 수 있는 기회를 제공한다.
8개의 다양한 프로젝트를 통해, 자연어 처리부터 감정 분석, 데이터 시각화까지 다루며 현업에서 바로 적용할 수 있는 스킬들을 익힐 수 있다. 실제로 데이터 수집부터 분석, 그리고 모델 튜닝까지의 전체 과정을 경험하면서 AI와 데이터 사이언스의 기본기를 확실히 다질 수 있을 것이다.
지금 이 강의를 통해, 데이터의 세계에서 원하는 결과를 보다 쉽게 얻어보라. 어렵게 느껴질 수 있는 AI 기술이 실습과 프로젝트를 통해 친숙해질 것이다.

데이터 처리를 자동화 하기 위한 프로젝트로
SQL쿼리를 직접적으로 작성하기는 어려우나
충분히 정보를 검색하고 수집할 수 있게 OpenAI를 이용한 프로젝트 수행이 목표이다

프로젝트의 수행 목적으로는 PM, 마케팅, 영업직군에 속하는 비 개발 직군인원이 데이터 처리가 필요한 상황이 발생할 때 개발 직군 부서에게 요청하여 업무를 처리하는 복잡한 절차의 사안을 빠르게 해소하는게 주 목적이다.

프로젝트 수행 순서는
1) 표 데이터(Tabular Data)를 수집
2) 이를 SQL DB로 전환 후 OpenAPI를 활용해
3) 임시 SQL쿼리로 변환 후
4) 목표하는 업무내용을 자연어로 전달하면 해당업무를 OpenAPI가 SQL DB 업무를 수행후 이 결과를 전달하는것이 목표이다.

DB는 개인이 직접 보유하는 경우는 적으니 임의의 예제 데이터셋을 다운받아 사용함
사용하고자 하는 예시 데이터셋은 https://www.kaggle.com/datasets/heemalichaudhari/adidas-sales-dataset?resource=download

Kaggle에 업로드되어 있는 위 데이터셋을 활용
import pandas as pd
import os
from openai import OpenAI
df = pd.read_excel("./data/Adidas US Sales Datasets.xlsx", header=4, usecols="B:N")

엑셀로 데이터를 열람한다면 위 사진처럼 1~4행까지는 빈 셀이고
B~N열까지만 데이터가 채워져 있기에
이에 맞춰서 header, usecols 옵션으로
5행이 header, B:N 열 데이터만 사용으로 인자값을 인가한다.
df.columns = [col.replace(' ', '_')for col in df.columns]

다음으로 간단한 데이터 전처리로
column에 포함되어 있는 빈칸 문자열을 _(언더바) 문자열로 치환한다.

불러온 데이터는 위 df.info()메서드를 활용하여 각 columns별로 어떤 데이터가 포함되어있는지 확인하자
from sqlalchemy import create_engine
from sqlalchemy import text
temp_db = create_engine('sqlite:///:memory:', echo=True)
data = df.to_sql(name='Salses', con=temp_db)
다음으로 파이썬 개발환경에서 SQL DB를 다루는 것을 지원하는 라이브러리인 sqlalchemy를 통해
임시 DB를 하나 생성한 후
pandas 라이브러리로 처리된 엑셀 데이터를
Slaes라는 테이블 이름으로 명기하여 임시 SQL_DB인 temp_db에 해당 데이터를 연결한다.

연결이 완료되면 위 사진처럼 pandas라이브러리로 관리하던 데이터셋이
sqlalchemy라이브러리를 통해 SQL DB로 핸들링이 가능해진다.
이는 SQL 쿼리 명령어로 데이터셋의 관리가 가능하다는 것이네 아래는 예시 코드이다.

이렇게 command 텍스트 명령어를 살펴본다면 Python 언어가 아닌 SQL 쿼리 언어인데도
해당 텍스트 명령어를 입력하면
그 SQL DB 쿼리 제어문으로 인식하여 수행결과를 확인 할 수 있다.
이제 프로젝트의 주 목적인
SQL 쿼리문을 수동으로 작성하지 아니하고 OpenAI API를 활용하여 SQL쿼리문을 자동으로 작성하고
그 결과값을 출력하는 방식이다

여기서부터 본격적으로 파이썬 개발환경에서 SQL DB의 핸들링이 가능해졌으니
임의의 자연어 명령어(NLP Request)를 OpenAI API를 통해 입력하면 GPT API가 이를 수행하기 위한 SQL 커리 명령어를 생성하는 과정을 수행한다.

자연어 명령어를 생성하기 위해서는 위 3가지 함수가 필요하다.
1) OpenAI API를 사용하여 어떤 데이터셋에 접근하여 해당 명령을 수행해야 하는지 알려주는 함수
2) 사용자가 자연어 명령(NLP Request)를 입력하면 이를 API에 전달하는 함수
3) 자연어 명령을 입력하면 그 결과물을 가져오는 함수
총 3가지가 필요하다.
https://platform.openai.com/account/api-keys

API키는 OpenAI 홈페이지에서 발급을 받은 뒤 사용한다.
발급받은 키는 환경설정파일 .env파일을 프로젝트 폴더에 생성하고
이를 불러오는 식으로 사용한다.


from dotenv import load_dotenv
import os
load_dotenv() # .env 파일의 환경 변수를 불러옴
api_key = os.getenv('OPENAI_API_KEY')
# API 키가 정상적으로 불러와졌는지 확인
#print(f"API Key: {api_key}")
API_KEY를 위 코드를 통해 vscode환경에서 사용하도록 환경설정이 완료되었다면 아래의 코드를 실행하여
OpenAI API의 사용을 선언한다
client = openAI()
다음으로 컬럼명을 알리기 위한 함수를 설계한다
def table_def_prompt(df):
prompt = '''
SQLite SQL 정의를 기반으로 요청에 따라 SQL 쿼리 작성\n
### SQLite SQL 테이블과 속성(컬럼) 확인
### 테이블명 : Salses
### 컬럼명 :
{}'''.format(",\n".join("###\t" + str(x) for x in df.columns))
return prompt

다음으로 프롬포트 입력 함수를 설계한다
# 사용자로부터 어떤 것을 확인하고 싶은지 확인하는 함수
def prompt_input():
nlp_text = input("GPT한테 시키고 싶은 내용:")
return nlp_text

위 함수는 단순하게 유저 인터페이스 함수이기에 별다른 기능을 하는 함수는 아니다
이제 본격적으로 API Call을 수행하자

다음으로 API Call을 수행하기 전 주요 인자값에 대해 알아둘 필요성이 있으며,
이는 위와 같다.
https://platform.openai.com/docs/overview
위 인자값에 대한 설명 및 사용의 원본 document는 위 홈페이제 접속하여 확인하자

홈페이지에 접속하면 여러가지 모드 사용에 관한 내용이 있지만
프로젝트에 필요한 기능은 Chat Completions이며 해당 기능을 확인하도록 하자

위 사진처럼 기본적인 사용방법론을 알려주고 있으니
자주 사용하는 인자값은 위 정리된 인자값에 적절한 값을 적용하여 OpenAI API를 사용하도록 하자
먼저 앞에서 설계한 table_def_prompt와 prompt_input를 하나로 합친
command_prompt 구문을 설계하자
이 command_prompt가 모델에 입력되는 총 입력 데이터라 보면 된다.
command_prompt = str(table_def_prompt(df)) + \
'\n\nCommand: '+ str(nlp_command)

이렇게 위와 같이 command_prompt 구문을 완성한 뒤
이를 OpenAI에 입력하면된다
이때 입력시킬 코드는 아래와 같다.
content_msg = '''
You are an assistant that generates SQL queries
based on the given SQLite table definition and
a natural language request. The query should start
with 'SELECT' and end with a semicolon (;).'''
# 컨텐츠 메세지(GPT한테 수행하라고 명령하는 메세지)는 애래와 같다
# "당신은 주어진 SQLite 테이블 정의와 자연어 요청에 기반하여
# SQL 쿼리를 생성하는 어시스턴트입니다.
# 쿼리는 'SELECT'로 시작하고 세미콜론(;)으로 끝나야 합니다."
response = client.chat.completions.create(
model="gpt-4-turbo",
messages=[
{"role": "system", "content": content_msg},
{"role": "user", "content": f"A query to answer: {command_prompt}"},
],
max_tokens = 300,
temperature = 1.0,
stop=None
)

위 코드를 수행하면 response에 수행결과가 기록되는데 이 항목을 살펴보면 아래와 같다.

ChatCompletion(id='chatcmpl-
ACvNzYmai9YtTM9KW9B8jsBrC8hDn', choices=
[Choice(finish_reason='stop', index=0,
logprobs=None,
message=ChatCompletionMessage(
content='```sql\nSELECT State, SUM(Total_Sales)
AS Total_Sales_By_State\nFROM Salses\nGROUP BY
State;\n```', role='assistant',
function_call=None, tool_calls=None,
refusal=None))], created=1727643891,
model='gpt-4-turbo-2024-04-09',
object='chat.completion',
service_tier=None, system_fingerprint='fp_22b855c4b7',
usage=CompletionUsage(completion_tokens=29,
prompt_tokens=211, total_tokens=240,
completion_tokens_details={'reasoning_tokens': 0}))
이제 해당 결과에서 필요부분만 추출해보자
print(response.choices[0].message.content)

이렇게 결과물인 response의 데이터 구조를 확인하여
하위 메서드별로 계속 이동하다보면
원하는 SQL 쿼리 명령어를 확인할 수 있다.
def handle_res(response):
raw_response = response.choices[0].message.content
# 출력물에서 의미있는 명령어 구문만 추출
query_start = raw_response.find("SELECT")
query_end = raw_response.find(";") + 1 # 세미콜론까지 포함하여 추출
query = raw_response[query_start:query_end]
return query
출력한 코드에는 접두, 접미에 필요없는 단어가 있으니 이를 전처리 과정으로 삭제하자

이제 OpenAI로 생성한 쿼리구문을
DB에 입력하여 실행결과물을 확인하자
# OpenAI의 API로 자동생성한 SQL 쿼리문
cmd_query = handle_res(response)
with temp_db.connect() as conn:
result = conn.execute(text(cmd_query))

수행결과를 확인한다면
OpenAI API를 통해서 자동으로 SQL 쿼리(명령문)을 생성했고
이 명령문을 살짝 전처리 한 결과물을
temp_db에 입력하면
편리하게 자동생성한 SQL쿼리문으로 출력물을 확인 할 수 있다.
본 포스트는 메타코드 서포터즈로서 작성하였습니다