이 글은 졸업 프로젝트를 진행하며 작성한 글입니다. 아직 프로젝트의 초기 단계이며 저는 개발 경험이 굉장히 적은 감자임을 감안하고 읽어주세요.
저희의 졸업 프로젝트 주제는 👩⚖️고시생들을 위한 판례 암기 어플리케이션👨⚖️입니다.
왜 이런 주제를 선택했냐구요?
가장 큰 이유는 팀원 중에 관련 고시를 준비했던 분이 있어서입니다. 그 분이 직접 느꼈던 불편함에서 출발하여 주제를 발전해나가고 있습니다.
1. 사진을 찍으면 텍스트를 추출해 암기장을 만들 수 있는 기능
원래는 평범하게 암기장 내용을 직접 입력하여 작성하는 것을 주로 하고, 이 기능은 시간이 되면 추가할 부가 기능 정도로 생각했습니다.
하지만 멘토님과 이야기를 나눈 결과, 외워야 될 판례의 양이 많다보니 입력할 양이 너무 많아 불편할 수 있다는 생각이 들었습니다.
또한, 이미 교재나 강의 자료가 있는 고시생들이 많기에 차라리 그 자료를 사진으로 찍어 텍스트를 추출해 암기장을 생성할 수 있다면 간편하겠다는 피드백을 받았습니다.
이 기능을 구현하기 위해서 네이버 clova ocr을 사용하고자 합니다.
2. 문장의 유사도를 측정하여 채점하는 퀴즈
저는 고시에 관해 아무것도 모르지만...팀원분의 말을 들으니 답안 작성 시 거의 토시 하나 안 틀리고 판례 요지를 똑같이 적어야 한다고 하더라고요.
그러니 저희 어플에선 퀴즈 기능을 제공할 때 문장 단위의 답안이 많겠다는 생각이 들었고, 이를 좀 효율적으로 채점하기 위해선 입력 답안과 정답 간의 유사도를 측정해 제시하면 좋겠다는 생각이 들었습니다.
이 기능을 구현하기 위해서는 Sentence-BERT (S-BERT)를 사용하고자 합니다.
사실 전 도커가 뭔지 잘 모르기도 하고 예전에 한 번 사용해봤을 때 너무 복잡+용량이 커서 최대한 도커를 사용하지 않으려 했습니다.
하지만...도커 없이 환경구축을 하니 에러가 너무 많이 나더라고요ㅠㅠ
고집부려 최대한 에러를 해결해보려 했으나 승복하고 결국 도커를 실행했습니다ㅎ
저는 이 이슈를 참고한게 많은 도움이 되었습니다.
환경 설정 방법은 도커가 설치되었다는 전제 하에 설명하겠습니다.
1. Docker 이미지를 pull한다.
VScode에서 터미널을 키시고 docker pull klbm126/kosbert_image:latest 를 입력합니다. pull하는 데에 시간이 좀 걸리기에 인내심이 필요합니다.
2. Docker를 run한다.
1번 단계가 성공적으로 끝나면,
docker run -it --name=kosbert_image klbm126/kosbert_image:latest 를 입력합니다.
그러면 kosbert_image라는 이름의 컨테이너가 실행됩니다.
(이슈에선 --rm 을 추가적으로 적으셨는데, 이는 컨테이너가 종료될때마다 삭제되도록 하는 옵션입니다. 저는 컨테이너를 살려놓기 위해 뺐습니다.)
3. 글에 적힌대로 열심히 git clone과 pip install 등을 한다.
저 같은 경우엔 requirements.txt 설치과정에서
ERROR: huggingface-hub 0.0.12 has requirement packaging>=20.9, but you'll have packaging 20.4 which is incompatible.
이러한 에러가 떴습니다.
이는 pip install --upgrade huggingface-hub을 통해 해결할 수 있다는 글을 봐서 실행했더니
ERROR: transformers 4.8.1 has requirement huggingface-hub==0.0.12, but you'll have huggingface-hub 0.11.0 which is incompatible.
...
해결할 수 있는 문제가 아닌 거 같네요.
4. KoSentenceBERT_SKTBERT의 transformers, tokenizers, sentence_transformers 디렉토리를 /opt/conda/lib/python3.7/site-packages에 옮겨준다.
이슈에 나온대로 저도 이 글을 참고하여 VScode를 활용해 파일을 옮겼습니다.
먼저 VScode에서 remote development를 설치하세요.
그 다음 단계에서 저는 remote-containers: attach to running container...가 안 뜨더라고요?
당황스러웠지만 Remote Explorer: Focus on Containers View 이런게 있길래 한번 클릭해봤습니다.
그러면
이런식으로 왼쪽에 container 목록을 볼 수 있는 탭이 뜨는데요,
빨간색으로 표시한 부분을 클릭하면 원래 하고자 한 attach to container가 가능합니다.
파일을 옮기는 더 멋진 방법이 있을거 같지만...전 그냥 복붙했습니다.
이슈에 적힌대로 그냥 복붙하면 transformers_copy 이런 이름으로 붙여넣어지기 때문에 site_packages에 있는 기존의 transformers, tokenizers, sentence_transformers는 삭제해주세요.
5. readme파일에 있는 구글 드라이브 링크에서 result파일을 다운받아 KoSentenceBERT_SKTBERT의 output 디렉토리에 넣는다.
이 부분은 소스코드 깃허브의 readme 파일에 나온대로 하시면 됩니다.
6. SemanticSearch.py를 실행해본다.
바로 run without debugging으로 실행해보니 python debugger가 없다 이런 메세지가 뜨는데 그건 그냥 하란대로 설치하면 됩니다.
그 다음에 실행하면 어떤 python 버전으로 실행할거냐 뜨는데 그것도 그냥 선택하면 됩니다.
드디어 실행...두근두근
역시 바로 될 리 없고 에러를 만났습니다.
[에러 #1] TypeError: hf_bucket_url() got an unexpected keyword argument 'postfix'
건든적도 없는 configuration_utils.py에 있는 hf_bucket_url()이 혼자 에러를 만나네요?
pip install 부분에서 뭔가 오류가 있었던거 아닌가 싶어서 pip install --no-deps --force-reinstall -r requirements.txt 명령어로 다시 설치했더니 해결됐습니다.
[에러 #2] ValueError: Path ./output/training_sts not found
이건 상대 경로 문제인거 같습니다.
저는 KoBERT와 KoSentenceBERT_SKTBERT의 상위 폴더인 workspace에서 코드를 돌리는 중이었는데, KoSentenceBERT_SKTBERT 폴더에서 코드를 돌리니 해결되었습니다.
[에러 #3] FileNotFoundError: [Errno 2] No such file or directory: './output/training_sts/0_Transformer/sentence_xlnet_config.json'
에러 경로를 확인해보니 Transformer.py에서 에러가 났습니다.
에러가 나지 않는 팀원과 비교해보니 Transformer.py 코드 자체가 아예 다르더라고요. (똑같이 설치했는데 대체 왜??)
그래서 팀원 분의 Transformer.py를 복붙해왔습니다.
[에러 #4] File "src/gluonnlp/data/fast_bert_tokenizer.pyx", line 36, in gluonnlp.data.fast_bert_tokenizer.BasicTokenizer.tokenize
TypeError: Argument 'text' has incorrect type (expected str, got list)
이것도 경로를 따라가보니 SentenceTransformer.py에서 난 오류였습니다.
옮겨야되니 디렉토리들(transformers, sentence_transformers, tokeenizers)가 다 잘 안 옮겨진 모양이더라고요.
이것 또한 에러가 나지 않은 팀원 분의 SentenceTransformer.py를 복붙해왔습니다.
다만 팀원 분의 코드에선 21번째 줄이
from . import __DOWNLOAD_SERVER__
이었는데 저는 오류가 나길래 기존의
from . import MODEL_HUB_ORGANIZATION
로 다시 바꿨습니다.
에러 3으로 가장 애를 먹었는데 해결방법은 영...시원찮네요.
아무튼 우여곡절 끝에 실행 성공!!
스프링 부트 경험이 없음을 미리 밝히고 시작합니다. 관련 부분에 대한 피드백도 대환영입니다.
1. https://start.spring.io/ 에서 프로젝트를 생성한다.
사이트에 접속하면 이런 화면이 뜹니다.
제가 설정한 환경은
인프런에서 김영한 강사님의 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 을 참고하여 세팅했습니다. 다만 강의에선 웹 사이트, 제가 만들고자 하는 건 모바일 앱이라 필요한 의존성이 다르지 않을까 싶어 그 부분은 임의로 선택했습니다. 의존성에 대한 공부는 아직 부족하여 나중에 수정사항이 생길 거 같은데, 추후에 글을 업데이트 하도록 하겠습니다.
2. generate를 클릭해 프로젝트를 생성한다.
generate 버튼을 클릭하면 이렇게 저장할 곳을 물어보는 창이 뜹니다. 원하는 위치에 저장하시고 압축 파일을 푸시면 되겠습니다.
3. 인텔리제이에서 프로젝트를 연다.
표시한 open을 클릭하여 아까 저장한 프로젝트를 열면 끝!
참고한 글: 링크
1. 깃허브에서 새 레포지토리를 생성한다.
레포지토리 이름을 입력하고 create repository를 클릭하시면 됩니다.
이때, 에러가 생길수도 있어 README 파일은 추가하지 말아주세요.
2. 인텔리제이 상단바의 VCS->Create Git Repository를 클릭한다.

3. 원하는 프로젝트를 클릭합니다.

4. 프로젝트 폴더에서 우클릭->Git->Add를 선택한다.

5. 프로젝트 폴더에서 우클릭->Git->Commit Directory를 선택한다.
그러면 이렇게 화면이 바뀝니다.
저는 이미 커밋을 한 번 한 상태라 Changes 부분은 다를겁니다. Initial commit이라고 적힌 부분에 커밋 메세지를 적은 후 하단의 commit 버튼을 클릭하시면 됩니다.
6. 프로젝트 폴더에서 우클릭->Git->Push를 선택한다.
그러면 다음과 같은 창이 뜹니다.
저는 이미 브랜치를 지정해놓은 상태라 push할 브랜치가 뜨지만, 처음 하시는 분들은 origin : develop 부분이 define remote로 뜹니다. 그걸 클릭하시면 다음과 같은 창이 뜹니다.

URL 부분에 생성한 레포지토리의 링크를 넣으시고 OK를 누르면 됩니다.
그러면 변경된 파일 목록이 뜨게 되는데, 확인하시고 push를 눌러주세요.
이 때, 저처럼 organization의 레포지토리를 만든 경우 push를 할 때 third-party 유저에겐 권한이 없다는 에러가 발생할 수 있습니다. 해결 방법은 다음과 같습니다.
1. Organization의 settings를 클릭한다.

2. Third-party Access의 OAuth application policy를 클릭한다.

3. Remove restrictions를 클릭한다.

이렇게 얼추 S-BERT를 포함한 백엔드를 위한 환경 세팅 끝!
사실 아직 모를 뿐 무언가 더 해야 되는 일들이 있을수도 있겠지만...일단은 스프링 공부에 집중을 하려고 합니다.
나 자신 졸업 프로젝트 화이팅👍✨
잘 읽었어요~