뒤로
이강훈
이강훈 ·

개발자 눈치 안보고 DB정보 확인하기

10XAI 1기 부트캠프를 참여 하면서 진행한 프로젝트를 공유 해볼까 합니다.
제가 정한 주제는 ai를 통한 db를 자연어로 조회하는 프로그램이었습니다.
너무 뜬구름 잡는 주제가 아닌 초급자 수준에서 실무에서 사용가능한 주제를
생각하다가 정하게되었습니다.
프로젝트 진행은 langchain으로 진행하게되었습니다.
(저는 앱개발자 출신이라서 코딩에 익숙하고, llm모델 변경에 유연한 프레임워크라서 선택하게 되었습니다.)

다음 순서대로 글을 써보겠습니다.

  • 프로젝트 진행 절차(간략히)

  • 데모버전&깃헙

  • 추가개발

  • 부트캠프 후기

1.모든 테이블 컬럼의 comment 추가하기

테스트에 사용된 데이터는 mysql(https://dev.mysql.com/doc/index-other.html)에서 제공하는

employee 데이터를 활용하였습니다. 여기의 데이터는 모두 6개의 데이터가 있는데 테이블 이름과 데이터 수, 데이터 의미는 아래와 같습니다.

  1. departments | 부서의 이름 | 9개

  2. dept_emp | 각 직원의 부서정보 | 331,603개

  3. dept_manager | 각 부서의 매니저 | 24개

  4. employees | 직원의 정보 | 300,024개

  5. salaries | 직원의 임금정보 | 2,844,047개

  6. titles | 직원의 부서 변경 정보 | 443,308개

스크린샷 2024-01-08 오후 10.43.59.png

실제로 적용된 결과의 일부입니다.

2. Extending the SQL Toolkit​

few_shots = {

"총직원의수":" select count(*) from employees",

"직원의 정보": """

SELECT a.emp_no AS '직원 고유 번호', a.birth_date AS '태어난 날짜', a.first_name AS '성', a.last_name AS '이름', a.gender AS '성별', a.hire_date AS '입사날짜',c.dept_name as '부서명',d.salary as '임금' FROM employees as a,dept_emp as b, departments as c,salaries as d where a.emp_no = b.emp_no and b.dept_no = c.dept_no and a.emp_no = d.emp_no order by d.salary desc """,

"직원의 임금 정보":"""

SELECT a.first_name AS '성', a.last_name AS '이름', a.gender AS '성별', a.hire_date AS '입사날짜',c.dept_name as '부서명',d.salary as '임금' FROM employees as a,dept_emp as b, departments as c,salaries as d where a.emp_no = b.emp_no and b.dept_no = c.dept_no and a.emp_no = d.emp_no and a.emp_no='10011' order by d.salary desc """

}

문서를 보면은 언뜻 예상질문을 fow_shots에 적용해야되나 싶지만 많은 테스트를 해보진 않았지만 짧은 경험으로 테이블간의 연결되는 컬럼 위주로 적어주는게 좋은듯 했습니다. 예를 들어 직원의 임금정보는 직원테이블과 임금 테이블 2개를 join하여 나타낼수 있었다. 이렇게 추가된 query가 단순한 임금정보만 알 수 있는게 아니라 "임금이 제일 높은 직원의 정보" 라는 질문 또한 매끄럽게 결과를 나타내는 걸 알 수 있었습니다. 그래서 예상 질문에 기반해서 query를 정의하기 보단 연관성 있는 테이블간의 join query문을 작성 후 예상 질문과 함께 정의 했습니다.

그후 prompt를 작성은 다음과 같이 했습니다.

단계별로 생각해 봅시다.

1. 다음 문맥만 사용하여 질문에 답하세요.

context: 위의 few_shots

2. 답을 모른다면 그냥 "N"이라고 말하세요.

3. 사용자의 질문에 답할 수 있는 SQL 쿼리를 작성합니다.

4. 쿼리는 영어로만 작성하되 모든 열에 한글 별칭을 추가합니다.

5. WHERE 절은 변경하지 마세요.

6. 얼마나 유사한지 0-100점 척도로 점수를 매깁니다.

7. 답변은 다음과 같은 JSON 형식이어야 합니다.

- JSON 키는 쿼리, 점수

- 쿼리는 답변 쿼리 또는 N

- 점수는 비슷한 숫자

여기서 중요하게 생각하것은 답변을 json답변하기, 스스로 지어내지 않기, few_shots에서 관련 된 점수 측정

이렇게 3가지로 요약할 수 있다.

json으로 답한 내용에서 query가 생성되면 그대로 실행해서 실행값을 나타내주었다.

하지만 query에 답변이 N 이거나 점수가 90이하 인 경우는 query와 질문의 연관도가 낮다는 생각 하에 다시 쿼리문을 작성하는 로직으로 이어진다.

3. Extending the SQL Toolkit예외 처리

Extending the SQL Toolkit과정에서 답변이 N이거나 연관 점수가 90점 이하인 경우에는 다시 질문을 기반으로 새로운 query를 만드러 내는 로직을 추가하였다.

1) 한글의 질문을 영어로 변경하기

Translate incoming Question to English without changing the meaning.
해당 질문을 의미 변경없이 영어로 변역합니다.

2) 영어 질문의 토대로 관련있는 테이블 추출

 A schema is a list of tables in a database and the information that describes them. 
                Based on the database schema below, Answer only table names that can answer the user's question.
                {schema}

                Question: {question}
                example: dept_emp,employees,salaries

{schema}는 데이터베이스 안에 있는 6개의 테이블의 정보이다 {question}는 1)번에서 생성된 영어 질문이 들어가며 답변은 example과 같이 테이블 이름만 나오도록 설정

3)추출된 테이블과 해당 테이블의 컬럼정보를 이용하여 최종 query를 작성

Based on the table schema below, 
                Write a query that matches the rules,
                DON'T make anything up.
                {schema}
                
                1. write a SQL query that would answer the user's question:
                2. SQL query style is MariaDB server
                3. query is only english but Add Korean alias to all columns
                5. You must select {tbnm} table and use all of them unconditionally.
                6. The WHERE clause is not required to be written
                7. The WHERE clause can only select the colum_name of the contents of {column}.
                8. The value of each column is represented by the {columex}, which we'll refer to as the

                

                Question: {question}
                SQL Query:

2번에서 추출된 테이블을 기준으로 해당테이블의 컬럼이름과 comment정보, 약간의 예시 정보를 prompt를 제공하여 최종query를 작성하고 작성된 쿼리를 수행하여 결과값을 표출하도록하였습니다.

데모버전& Github

https://7yymfoyzx2fm2pp3fjm7pf.streamlit.app/ - 데모링크

데모링크에 들어가시면 여러페이지가 있는데 왼쪽에 테스트 페이지에서 테스트하시면 됩니다.!

깃헙에서는 해당 데모버전의 소스가 나와있으니 참고하시면 될꺼같습니다.

스크린샷 2024-01-08 오후 11.43.57.png데모버전 실행 이미지!!

추가적인 개발 계획

  • query도 확인할 수 있도록 같이 표출하기

  • GPT처럼 자연스러운 대화형으로 개발하기

  • few_shots추가해서 더욱 정교하게 만들기

  • 예외처리 추가하기(답변의 실패한 질문들을 자동으로 db저장하는 기능 추가)

  • 답변을 그래픽으로 구현하기

10XAI 부트캠프 후기

저는 개발자직업이라서 AI에 대한 관심은 있엇지만 발전속도가 빠르다보니 따라가는 벅차서 막상 시작하기가 힘들었습니다. 하지만 우연히 부트캠프를 알게되어 AI에 대한 발걸음을 시작하게되었습니다. 아직 1기라서 커리큘럼이 정착되지 않지만, 10XAI에서는 초급,중급,고급 으로 분류 하여 커리큘럼을 제공하고 있으며 아이디어는 있지만 코딩을 할줄 모르는 사람들도 초급 강의를 듣고 자신의 아이디어를 차근차근 구현할 수 있는 장점이 있습니다.(초급,중급,고급의 기준을 코딩을 얼마냐 사용하는가의 기준입니다. 초급은 코딩작업없이 진행하는 학습입니다.)
하지만 자신의 아이디어를 만들다 보면 수업과정에 없는 문제점들도 있습니다. 이러한 문제점은 융대장님이 슬랙과 카카오톡, 줌회의를 통해서 적극적으로 도와 드리고 있어서 끈기만 있다면 멋진 아이디어를 실현 시킬 수 있다고 생각됩니다.

저 또한 많은 도움으로 아이디어를 실행시킬수 있었습니다.(감사합니다 ㅠㅠㅠ 10XAI 짱짱!)

긴글 읽어주셔서 감사합니다. 짧게 쓰려고 했는데 쓰다보니 이렇게 길어졌네요 내용이 뒤죽박죽이 된거 같은데 혹시나 쫌더 좋은 방법 있으신분들은 알려주세요!!

4

댓글

로그인 후 댓글을 남길 수 있습니다.

아직 댓글이 없습니다.