DBMS/AgensSQL

PostgreSQL, 꼭 배워야 하나요? ChatGPT로 SQL 없이 AgensSQL 데이터베이스 사용하기

(주)비트나인 2023. 8. 29. 10:02

 

ChatGPT가 변화시킨 업무 환경

 

 2022년 11월 OpenAI가 발표한 ChatGPT는 트랜스포머(Transformer) 기반의 거대 언어 모델(Large Language Model)로, 기존 GPT 모델에 인간 피드백 기반 강화학습(Reinforcement Learning from Human Feedback)을 적용하여 대화 기능을 대폭 강화한 모델입니다.

 

 ChatGPT는 정보 검색, 창작, 프로그래밍 등 다양한 분야에서 인간과 유사한 수준의 능력을 보이며 대중의 큰 반향을 불러일으켰습니다. 특히, ChatGPT의 프로그래밍 언어 능력은 IT 업계 종사자들의 업무 효율을 크게 향상했습니다. ChatGPT는 Python, JavaScript, C, Ruby 등 일반적인 프로그래밍 언어뿐 아니라, 데이터베이스 사용에 쓰이는 SQL(Structured Query Language)도 이해하고 있습니다. 

 

 기업에서 데이터가 필요한 영역은 다양하지만, 모든 부서의 직원들이 SQL을 이해하고 데이터베이스에 접근하기는 쉽지 않습니다. ChatGPT는 자연어 질문만으로 사용자의 필요 사항에 따른 SQL을 생성할 수 있습니다. 만약 ChatGPT를 실제 데이터베이스와 연결하여 자연어로 질의할 수 있다면, 비전문가의 데이터 진입 장벽을 낮출 수 있을 것입니다.



AgensSQL: PostgreSQL 기반의 기업 특화 관계형 DBMS

 

 데이터베이스 관리 시스템(DataBase Management System; 이하 DBMS)으로는 Oracle, Microsoft SQL Server와 같은 상용 DBMS와, MySQL, PostgreSQL, MongoDB와 같은 오픈소스 DBMS가 있습니다. 오픈소스 DBMS는 상용 DBMS에 비해 비용을 크게 절감할 수 있으며 쉬운 사용성, 보안 등에서 강점이 있습니다. 

 

 오픈소스 DBMS는 소스코드가 공개되어, 누구나 특별한 제한 없이 자유롭게 사용, 복제, 배포, 수정할 수 있으며 오픈소스 DBMS 기반의 다양한 제품이 존재합니다. 그 중, AgensSQL은 PostgreSQL 기반의 DBMS로, PostgreSQL의 기능을 기본적으로 지원하면서 기업이 필요로 하는 시스템 모니터링과 보안 등의 기능을 강화한 기업 특화 관계형 DBMS입니다. 



AgensSQL



 AgensSQL은 PostgreSQL 엔진을 기반으로 작동하므로, PostgreSQL의 질의 언어를 그대로 사용할 수 있습니다. 본 포스트에서는 PostgreSQL 엔진과 연동되는 LangChain 라이브러리를 이용하여, AgensSQL 데이터베이스에 연결한 후 자연어로 데이터에 질의하는 방법을 소개해보겠습니다. Python 및 Jupyter Notebook 환경에서, 간단한 코드 몇 줄만으로 이를 구현할 수 있습니다.



LangChain을 이용한 ChatGPT와 AgensSQL 연동

 

 LangChain은 거대 언어 모델(Large Language Models; LLM)과 관련된 여러 모듈을 사슬(Chain)처럼 엮어 언어 모델 어플리케이션을 간편하게 구축할 수 있게 해주는 라이브러리입니다. pip install 명령어를 이용해 LangChain 라이브러리를 설치해 줍니다.



pip install langchain



각 모듈을 설치 후, 필요한 모듈 및 하위 클래스를 불러옵니다.



from langchain import SQLDatabase, SQLDatabaseChain
from langchain.chat_models import ChatOpenAI



 먼저, AgensSQL의 데이터베이스 정보를 입력해 줍니다. 아래의 각 항목을 사용자의 실제 데이터베이스 정보로 바꾸어줍니다. 



host = '192.***.*.***' # 데이터베이스 서버 호스트 주소
port = '1234' # 포트 번호
user = 'user_name' # 사용자 이름
pw = 'password' # 비밀번호
db = 'database_name' # 데이터베이스 이름



 그리고, LangChain의 SQLDatabase 클래스에 다음과 같이 PostgreSQL 형식으로 데이터베이스 정보를 할당해 주면 AgensSQL 데이터베이스와 연결된 객체 생성이 완료됩니다.



langdb = SQLDatabase.from_uri(f"postgresql+psycopg2://{user}:{pw}@{host}:{port}/{db}")



 다음은 언어 모델을 불러올 차례입니다. ChatGPT API를 이용하기 위해서는 OpenAI 웹사이트에서 API 키를 발급받아야 합니다. API 키는 OpenAI의 API용 웹사이트(platform.openai.com)에서 결제 수단을 등록 후 간단히 발급받을 수 있습니다. API 키는 발급 시 한 번만 확인할 수 있으므로 안전한 곳에 복사하여 저장해 둡니다. 또한, ‘Billing’ 메뉴에서 결제 금액 한도를 꼭 설정하여 과도한 과금을 방지할 수 있도록 합니다.

 

 이제 발급받은 API 키를 LangChain의 ChatOpenAI 클래스에 입력하여, ChatGPT 모델을 연결한 객체를 생성합니다. 그리고 GPT 모델을 선택하는데, OpenAI 웹사이트의 설명을 참고하여 목적에 맞는 모델을 선택합니다. 현재는 일반적으로 ‘gpt-3.5-turbo’ 또는 ‘gpt-4’ 모델을 사용합니다. 



openai_api_key = 'YOUR_OPENAI_API_KEY'
llm = ChatOpenAI(openai_api_key=openai_api_key, model_name='gpt-4')



 이제 AgensSQL 데이터베이스와 ChatGPT 모델을 사슬처럼 연결해 줄 것입니다. SQLDatabaseChain 클래스에 앞서 설정한 데이터베이스와 언어 모델을 할당해 주면, AgensSQL 데이터베이스와 ChatGPT가 연결된 객체가 생성됩니다.



db_chain = SQLDatabaseChain(llm=llm, database=langdb, verbose=True)



 마지막으로, 답변의 형식을 지정해 준 후 사용자 입력에 따른 답변을 출력할 수 있는 함수를 구성해 주면, 자연어로 데이터베이스에 질의할 준비가 완료됩니다. ‘ask_to_AgensSQL’ 함수를 실행하면 입력창이 나타나고, 이 창에 자연어로 질문을 입력할 수 있습니다.



query = """Given an input question, first create a syntactically correct postgresql query to run, then look at the results of the query and return the answer.
Use the following format:


Question: Question here
SQLQuery: SQL Query to run
SQLResult: Result of the SQLQuery
Answer: Final answer here
{question}"""

 

def ask_to_AgensSQL():
    prompt = input("질문을 입력해주세요: ")
    try:
        question = query.format(question=prompt)
        result = db_chain.run(question)
        print(result)
        return result
    except Exception as e:
        print(e)

ask_to_AgensSQL()

 

질문을 입력해주세요: 



 이제 데이터베이스에 질의를 수행해 볼 차례입니다. 본 포스트에서는, 다음과 같은 간단한 신용카드 결제 데이터를 이용합니다. 테이블 이름은 ‘transactions’이며, 사용자의 ID, 이름, 결제 날짜, 결제 액수, 결제 장소, 결제 승인 여부 데이터를 담고 있습니다.



신용카드 결제 내역 데이터 테이블



 먼저, 해당 테이블에 몇 명의 사용자와 몇 개의 상점이 있는 지와 같은 기본적인 질문을 해 봅시다. 첫 줄이 입력한 질문이며, 결과는 그 아래와 같이 출력됩니다.

 

transactions 테이블에 몇 명의 사용자와 몇 개의 상점이 있지?

 

SQLQuery:SELECT COUNT(DISTINCT "user_id") as user_count, COUNT(DISTINCT "merchant") as merchant_count FROM transactions;
SQLResult: [(3, 6)]
Answer:transactions 테이블에는 3명의 사용자와 6개의 상점이 있습니다.


'transactions 테이블에는 3명의 사용자와 6개의 상점이 있습니다.'



 해당 테이블에는 Jerry, Steve, Katie 3명의 사용자와 Hilton Barcelona, AT&T 등 6개의 상점이 있습니다. 답변이 정확히 출력되었습니다. LangChain은 먼저 질문에 따른 SQL을 생성하고, 그 SQL을 데이터베이스에 실행합니다. 그다음엔, 출력값을 자연어로 설명해 주는 문장을 최종적으로 출력합니다. 

 

 다음으로, Jerry가 방문한 상점에 지불한 총금액을 구해보겠습니다.



Jerry가 방문한 상점에 지불한 돈은 모두 얼마지? 결과를 '$' 기호와 함께 출력해줘.

 

SQLQuery:SELECT SUM("amount") FROM transactions WHERE "user_name" = 'Jerry';
SQLResult: [(Decimal('585.00'),)]
Answer:Jerry가 상점에 지불한 총액은 $585.00입니다.

'Jerry가 상점에 지불한 총액은 $585.00입니다.'



 Jerry가 방문한 상점에 지불한 총금액은 585달러로, 집계 함수를 사용하여 정답이 정확하게 출력되었습니다. 그리고, 한국어로 질문을 해도 답변이 한국어로 잘 출력되는 것을 볼 수 있습니다. ChatGPT는 다양한 언어를 지원하며 사용자의 질문이 다소 부자연스러워도 맥락을 이해하여 사용자의 의도를 잘 파악해 냅니다. 



AgensSQL 데이터베이스와 대화하는 웹 챗봇

 

 자연어로 데이터베이스에 질의가 잘 되는 것을 확인했습니다. 그런데, 이런 라이브러리 이용이 익숙하지 않은 사용자는 어떻게 해야 할까요? 이러한 사용자들을 위하여 기술자들은 데이터베이스와 대화할 수 있는 챗봇을 웹에 구축해 놓을 수 있습니다. 웹 개발에 대한 지식이 많지 않더라도, Streamlit이나 Gradio와 같은 라이브러리를 통해 간편하게 웹 챗봇을 구축할 수 있습니다. 웹 챗봇을 통해 프로그래밍 지식이 전혀 없는 사용자들도 데이터에 접근할 수 있습니다.

 

Streamlit을 이용한 웹 챗봇 구축 예시



AgensSQL의 확장성

 

 본 포스트에서는 ChatGPT API와 LangChain 라이브러리를 이용하여, SQL 없이도 AgensSQL 데이터베이스에 접근하여 데이터에 질의하는 방법을 살펴보았습니다. 이러한 시도를 통해 기업은 데이터에 대한 진입 장벽을 낮추어  ‘데이터 민주화(Data Democratization)’를 실현할 수 있습니다. 

 이 외에도 AgensSQL은 PostgreSQL 기반의 유연한 확장성으로 다양한 라이브러리나 API와 호환이 가능합니다. 이러한 AgensSQL의 확장성은, 현대의 빠른 기술 변화에 대응할 수 있는 필수 요소입니다. 앞으로도 이를 바탕으로, AgensSQL을 활용한 다양한 기능 확장 사례가 소개될 것입니다.

 

 

 

글 : 강지철 선임 ( 비트나인 글로벌 사이언스팀 )