Pycon Korea 2020에서 들은 내용을 정리해 보았습니다.
Day 1: Elastic App Search 로 파이썬 애플리케이션에서 검색 기능 사용하기
- 애플리케이션에서 필요한 검색 기능 에 대해 다룸
- 식당 검색의 경우
- 텍스트 검색 (음식점 이름)
- 범위 검색 (메뉴 가격, 오픈 시간)
- boolean 검색 (반려견 출입 가능 여부)
- 스마트폰의 GPS 기능을 활용한 위치 검색 (내 위치에서 반경 1km 이내)
- RDB와 Elastic의 차이
RDB
: 데이터에서 인덱스 순서대로 원하는 결과를 찾음. 정렬하면 시간이 더 소요. SQL에 최대한 자세히 적어야 함Elastic
: TF-IDF 이용한 점수 기반의 full text 검색- json 쿼리
- TF(Term Frequency): 찾는 검색어를 많이 포함할수록 도큐먼트의 정확도 높아짐
- IDF(Inverse Document Frequency): 검색어가 전체 도큐먼트 사이에서 빈번할수록 도큐먼트의 정확도 낮아짐
- 위치 검색 도 지원. 위치 검색에 관한 json key들이 있음
Elastic App Search
- Enterprise Search의 한 종류 -> Elastic의 대부분은 무료로 사용할 수 있다는데, 이건 무료 아닌가?
- ELK 스택에 추가로
App Search
라는 엔진을 더 띄워야 함 - 하나의 데이터셋 = 하나의 엔진
- App Search 클라이언트는
pip
로 설치
데모
- GitHub 링크
- 엔드포인트는 로컬은 localhost, 클라우드는 클라우드 엔드포인트 사용
Elastic Cloud
: 무료로 14일 간 사용 가능. 3개의 Public Cloud사 선택 가능- 사이즈에 비례하는 요금
Enterprise Search
인스턴스 생성
- 먼저
elastic
이라는 슈퍼 계정의 비밀번호가 나옴. 이건 다시 제공되지 않기 때문에, 반드시 복사해 두어야 함!- 슈퍼 계정은 봉인하고, 적절한 권한의 다른 계정 사용 권장
App Search Engine
생성- 준비해 둔 dataset 사용 (게임들의 정보인 듯)
- 언어 선택할 수 있는데, 한국어 선택해도 한국어 형태소 분석기가 적용되진 않음. Universal로 해도 됨
- 코드
- base endpoint에서
https://
는 빼야 함 - private api-key 필요
- base endpoint에서
- 데이터를 100개 레코드씩 slice하여 업로드 (총 4,000개 정도 됨)
- 대시보드에서 schema가 자동으로 생성된 것을 확인할 수 있음. 레코드별로 데이터 삭제할 수도 있음
- 기본적으로 모두
text
타입으로 들어가는데, 필요한 칼럼은number
로 변경 - 스키마가 변경되면 데이터를 새로 삽입해야 함?
대시보드 기능
- Query Tester
- 검색 결과 테스트 창
- 레코드별 score 를 확인할 수 있음. score별로 정렬됨
- Relevance Tuning
- 필드의 가중치 부여로 검색 순위 조정
- 기존 score 기반 순위가 아닌, global sales(전세계 판매량)라는 칼럼 순으로 검색 순위를 조정할 수 있음
- Synonyms
- 기본적으로는 전방일치 검색만 가능
- pikachu의 동의어를 pokemon으로 설정하면, pikachu로 검색할 경우 pokemon도 나옴
- Curations
- 특정 게임을 promotion 하고 싶을 때
- 특정 게임은 재고가 없거나 해당 기업 이슈 등으로 인해 hide 하고 싶을 때
- score가 1.0으로 낮은 레코드가 promotion으로 인해 가장 상위에 나옴
- 이와 같이 서비스 운영에 필요한 여러 기능들을 제공함
기타
- 사용자의 API 호출 기록 합산. 인기 검색어 등 확인 가능
- Generate Preview
- 결과 예시 화면 제공
- skyscanner 같이 검색 결과와 정렬, 필터링 UI 제공
- Download zip package 누르면, 해당 화면을 node.js로 작성된 코드로 확인할 수 있음
Day 1: 왕코보 코딩교육 삽질기
- 스파르타코딩클럽 대표
- 일반인을 위한 보급형 코딩교육 진행 (온/오프라인)
원칙 1. 내가 가르치고 싶은 정도가 아님, 그들에게 필요한 최소 단위를 생각
이 정도는 알아야 하지 않을까?
라고 생각하지 쉬움- 예: from과 import의 차이
- 입문자는 변수, 자료형(튜플까지 가지 않고 리스트, 딕셔너리만), 함수, 조건문, 반복문 이 5개만 알면 됨
- 변수도 복잡하게 설명하지 않고,
a라는 박스에 5를 넣는다
라는 식으로 설명 - 그러나 꼭 짚어줘야 하는 건 설명 e.g. 변수명에 특수문자나 한글은 쓰지 않는 것,
=
과==
의 차이
- 변수도 복잡하게 설명하지 않고,
- 이 선을 잘 지켜야 함
- 아예 모르면 뭘로 검색해야 할지도 모름
- 검색해서 알 수 있을 정도로만 설명
- 연습할 때는 쉬운 개념으로
- 소수 판별하기 말고, 홀짝 판별하기
원칙 2. 모르는 말을 쓰지 않기. 비유를 많이 들기
- 비개발자에게 API를 설명해야 할 경우
- 튜터 면접 단골 질문이기도 함
Application Programming Interface
,서버와 클라이언트의 연결
, … 이렇게 설명하면 머리 아픔
- 비유를 할 경우, 모르는 개념을 언급하지 않기! 모르는 단어가 나오면 계속 물어보는 사람은 없음. 그냥 넘어가는 경우가 많음
- 대안: 은행(서버) 창구(API)에서 고객(Client)이 거래를 하기 위해 필요한 서류, 규칙 등이 있다!
원칙 3. 계속 이해를 못하면 설명을 그만하라
- Flask를 설명할 경우, DB-Server의 개념으로 설명 -> 이해 안 되면 다르게 설명 -> 그래도 이해가 안 되면 다르게 설명 -> … -> 끝없는 굴레
- 자전거 타기와 같이, 계속 개념적인 이해를 시키기보단 눈과 손으로 이해해야 함. 그러다 보면 머리도 이해하게 됨
그래도 나는 원리가 중요해!
라고 생각하며, 세세하게 이해하려고 하는 사람이 있음- 단호하게 거절. 익숙해지면 까 봐야 함
원칙 4. 준비는 그만. 얼른 판으로 나가자
- 너무 많이 준비하기보다, 사이드 프로젝트를 해야 실력이 비약적으로 향상됨
- 배운 것을 적용할 수 있도록, 내 프로젝트를 만들도록 유도. 다만 큰 문제를 겪고 있을 때만(e.g. 인코딩 문제) 도와 줌
Day 2: 자연어처리 초보자의 BERT 도전기
- 슬라이드 링크
- 블록체인 분산 컴퓨팅 회사인 Common Computer 소속
BERT
(Bidirectional Encoder Representaions from Transformers)- 문장 sequence를 입력받으면 텍스트의 특징을 추출하는 모델. 2018년 Google에서 공개
- Mask Language Model: 입력 문장에 빈 칸을 뚫어 예측
- NSP: 원래 문장과 랜덤 문장 중 다음 문장이 어떤 것인지 예측
- 기존 NLP 모델 과의 차이점
Word2Vec
은 맥락과 관계 없이 단어 벡터화BERT
는 문장의 맥락을 고려 하여, 문장을 통째로 벡터화
- BERT로 Question Answering
- 입력 문장 중 어느 지점에 답이 있는지 - 시작 지점이 될 확률이 높은 부분과 끝 지점이 될 확률이 높은 부분을 찾아냄
- KorQuAD 2.0
- 한국어 Question Answering Dataset
- 대기업에서 리더보드 상위 차지하고 있음
- KorQuAD 2.1
- 한글 Wiki에서 답이 들어 있는 부분을 찾아내는 Task
- Pre-Training과 Fine-Tuning
- Pre-Training: 많은 라벨링되어 있지 않은 데이터 학습
- Fine-Tuning: 주어진 Task에 맞게 모델 수정. Question Answering에 맞게 수정 필요
- Python으로 처리하는 것의 장점
- 사용 가능한 라이브러리 많음
- 간결하고 이해하기 쉬운 코드. Python 500줄이면 C++은 1000줄 넘기도 함
- BERT 모델 학습에 이용한 자료
- 페이스북 그룹 TensorFlow KR 글
- Huggingface Transformers:
Pytorch
+Tensorflow
환경에서 BERT 모델을 돌릴 수 있는 라이브러리 - SQuAD 데이터셋(40MB) 대신 KorQuAD 데이터(7GB) 넣기
- 영어에 비해 한글 데이터의 사이즈 및 메모리 사용량이 훨씬 큼
Redis
DB로 파이프라인 개발- 학습에 필요한 만큼의 데이터만 불러오고, 나머지는 Python의 가비지 콜렉터에 맡김 + 256개 CPI로 멀티 프로세싱 + Profiler로 병목점 확인
pandas
는 속도가 느려 native 함수(open
)로 한 줄씩 읽음
- 현재까지는 모델 고도화보다는 엔지니어링(전처리) 과정이 훨씬 많았음
- GPT-3
- 사람이 말하듯이 자연스러운 텍스트 생성
- 텍스트를 요약한 표 생성
- 모델의 사이즈가 다른 모델이 비해 훨씬 큼. 개인 GPU로는 학습조차 어려움
- 대신 학습 완료하면 어떤 Task든 Fine-Tuning하지 않아도 해 냄
- GPT-3를 이용한 한국어 번역이 목표
- Ainize
- Bert API 실행해 볼 수 있음. 웹에서 바로 요청도 가능
- KoNLPy API도 있음. GPU 옵션도 있는 듯
Day 2: TDD와 Flipped Classroom을 활용한 파이썬 교육
대학에 와서 프로그래밍 관련 수업을 처음 듣는 학부 1학년 학생들, 그 중에서도 공과대학이 아닌 학생만 들을 수 있는 분반에서 파이썬을 재밌고 효과적으로 가르치기 위해 시도했던 교수법들을 소개합니다. Flipped Classroom을 사용해서 파이썬 이론 교육을 강화하고 TDD를 접목 시켜서 파이썬 실습 교육을 진행했습니다. 두 가지 개념이 무엇이고, 어떻게 교육에 적용시켜서 어떠한 결과가 나왔는지에 대해 설명합니다.
- 슬라이드 링크
- 서울대학교 컴퓨터공학부 대학원 석박사통합과정으로, 학부 수업 진행 방식 에 관한 시도
- 프로그래밍을 처음 배우는 학부 1학년, 비공대생 분반 학생 대상
- 패시브, 액티브한 수업 활동
- 패시브: 강의 듣기, 책 읽어오기 등
- 액티브: 그룹 토론, 실습, 가르치기 등
Flipped Classroom
: 강의에 패시브와 액티브 활동을 바뀐 것.- 보통 수업: 강의 시간에 이론 교육(패시브), 개인 시간에 과제(액티브)
- Flipped Classroom: 강의 시간에 토론 등의 활동(액티브), 개인 시간에 이론 교육(패시브)하여 수업 시간의 효율을 극대화함
- 개인적으로 프로그래밍 강의는 이론 강의와 달리 수업 시간에 교수님이 개념을 설명하는 것이 개인적으로 학습하는 것보다 효율이 떨어진다고 생각. 매우 좋은 접근 방법인 듯
- 강의 전에 수업 내용 영상 시청(패시브) -> 강의 시작 직후 영상에 대한 퀴즈(액티브) -> 강의 시간에는 퀴즈 풀이, 디스커션, 코딩 실습 -> 이후 텀 프로젝트
- 자유롭게 질문하는 분위기가 형성되고, 직접 코딩하며 시행착오를 겪을 수 있음
- 예: 강의 내용이
파이썬 for문
일 경우- 퀴즈: 다음 코드에서 for문의 반복 시행 횟수를 구하시오
- 디스커션: for문을 이용하여 정수 list에서 가장 큰 수를 찾는 알고리즘을 구현하려면?
- 1학년 때부터 알고리즘에 대한 기초를 다지는 좋은 기회가 될 듯
TDD
(Test-Driven Development)- 스스로 테스트하며 학습하는 것
- Unit Test 후 구현, 디버깅, 리팩토링 통해 성공할 때까지 직접 구현
- 스스로 해결할 수 없는 경우에만 조교가 도와줌
- TDD 실습의 성과
- 정성적 성과: 학생들이 테스트 케이스를 보면서 의도를 가지고 코딩하고, 의도에서 무엇이 누락되었는지를 피드백받음
- 정량적 성과: 모든 학생이 필수 문제 통과!! 즉 실습을 따라오지 못한 학생이 0명
- 강의평가: 원점수 공개할 수 없기 때문에, 평균 대비 몇 시그마인지만 제공
- 해당 수업은 컴공 과목 평균 대비 모든 평가 항목에서 +0.5 표준편차(학교 전체 대비 +0.3 표준편차). 원점수로는 만점에 가까웠음
- 프로그래밍 수업이 많은 컴공 과목의 특성상, 이 방법의 효과가 더 컸다고 할 수 있음
- 결론
- 액티브한 교육 활동의 비중을 늘리자
- 코딩 실습에는 테스트를 제공하자 (코딩 테스트처럼)