Home [Chatbot] Chapter7 챗봇 학습툴 만들기
Post
Cancel

[Chatbot] Chapter7 챗봇 학습툴 만들기

챗봇 학습툴 만들기

  • 챗봇이 학습 데이터를 관리하는 툴 만들기
  • 학습 데이터를 DB에 저장했을 때 실시간으로 챗봇 시스템에 적용될 수 있도록 제작
  • 챗봇이 이해할 수 있는 질문, 답변 데이터를 관리하기 위한 툴 필요
  • 챗봇의 답변 출력을 위해서만 사용되는 데이터
  • 챗봇 학습툴을 통해 저장된 질문 유형과 답변만 챗봇 엔진이 처리할 수 있음

프로젝트 구조

  • train_tools : 챗봇 학습툴 관련 파일
  • models : 챗봇 엔진에서 사용하는 딥러닝 모델 관련 파일
    • intent : 의도 분류 모델 관련 파일
    • ner : 개체 인식 모델 관련 파일
  • utils : 챗봇 개발에 필요한 유틸리티
  • config : 챗봇 개발에 필요한 설정
  • test : 챗봇 개발에 필요한 테스트 코드

학습용 데이터베이스 설계 및 데이터 테이블 생성

컬럼속성설명
idint primary key not null학습 데이터 id
intentvarchar(45)의도명, 의도가 없는 경우 NULL
nervarchar(45)개체명, 개체명이 없는 경우 NULL
querytext null질문 텍스트
answertext not null답변 텍스트
answer_imagevarchar(2048)답변에 들어갈 이미지 URL, 이미지 URL을 사용하지 않을 경우 NULL
  • DB 서버 접속 정보를 /config 디렉토리 내에 파일로 따로 관리
  • DatabaseConfig.py 파일을 생성하여 아래와 같이 작성
1
2
3
4
5
6
7
8
# DatabaseConfig.py - DB 접속 정보
DB_HOST = '127.0.0.1'
DB_USER = 'root'
DB_PASSWORD = '******'
DB_NAME = 'chatbot'

def DatabaseConfig():
    global DB_HOST, DB_USER, DB_PASSWORD, DB_NAME
  • 챗봇 데이터 학습용 테이블 생성
  • /train_tools/qna 디렉토리 내에 생성
  • create_train_data_table.py 파일을 생성하여 아래와 같이 작성
1
2
3
# create_train_data_table.py - 학습용 테이블 생성
import pymysql
from config.DatabaseConfig import *
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
db = None
try:
    db = pymysql.connect(
        user=DB_USER, 
        passwd=DB_PASSWORD, 
        host=DB_HOST, 
        db=DB_NAME, 
        charset='utf8'
    )

    # 테이블 생성 SQL 정의
    sql = '''
        CREATE TABLE IF NOT EXISTS `chatbot_train_data` (
        `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
        `intent` VARCHAR(45) NULL,
        `ner` VARCHAR(45) NULL,
        `query` TEXT NULL,
        `answer` TEXT NOT NULL,
        `answer_image` VARCHAR(2048) NULL,
        PRIMARY KEY (`id`)
        )
        ENGINE = InnoDB DEFAULT CHARSET=utf8
    '''

    # 테이블 생성
    with db.cursor() as cursor:
        cursor.execute(sql)

except Exception as e:
    print(e)

finally:
    if db is not None:
        db.close()

챗봇 학습 데이터 엑셀 파일 및 DB 연동

  • 엑셀 파일을 학습툴에 입력해 DB 내용을 업데이트 하는 형태로 만듦
  • train_data.xlsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# load_train_data.py - 엑셀 파일을 읽어와 DB와 데이터 동기화
import pymysql
import openpyxl

from config.DatabaseConfig import *

# 학습 데이터 초기화
def all_clear_train_data(db):
    # 기존 학습 데이터 삭제
    sql = '''
        DELETE FROM chatbot_train_data
    '''

    with db.cursor() as cursor:
        cursor.execute(sql)

    # Auto Increment 초기화
    sql = '''
        ALTER TABLE chatbot_train_data AUTO_INCREMENT=1
    '''

    with db.cursor() as cursor:
        cursor.execute(sql)

# DB에 데이터 저장
def insert_data(db, xls_row):
    intent, ner, query, answer, answer_img_url = xls_row

    sql = '''
        INSERT chatbot_train_data(intent, ner, query, answer, answer_image)
        VALUES('%s', '%s', '%s', '%s', '%s')
    ''' % (intent.value, ner.value, query.value, answer.value, answer_img_url.value)

    # 엑셀에서 불로운 셀에 데이터가 없는 경우 NULL로 치환
    sql = sql.replace("'None'", "null")

    with db.cursor() as cursor:
        cursor.execute(sql)
        print('{} 저장'.format(query.value))
        db.commit()

train_file = 'train_data.xlsx'
db = None
try:
    db = pymysql.connect(
        user=DB_USER, 
        passwd=DB_PASSWORD, 
        host=DB_HOST, 
        port=3306,
        db=DB_NAME, 
        charset='utf8'
    )

    # 기존 학습 데이터 초기화
    all_clear_train_data(db)

    # 학습 엑셀 파일 불러오기
    wb = openpyxl.load_workbook(train_file)
    sheet = wb['Sheet1']
    for row in sheet.iter_rows(min_row=2): # header는 불러오지 않음
        # 데이터 저장
        insert_data(db, row)

    wb.close()

except Exception as e:
    print(e)

finally:
    if db is not None:
        db.close()
1
2
안녕하세요 저장
반가워요 저장

image

This post is licensed under CC BY 4.0 by the author.