description: "@Irvine"
Technical Project
Technical Project는 6-7개의 사전 정의된 주제로 진행하는 프로젝트이다.
시험보고 팀을 나눴었다고 언급했는데, 그렇게 만들어진 팀원들과 함께 진행한다.
혹시나 다음 기수 분들인데 참고용으로 이 게시글을 보고 계시다면,
Technical Project는 매 기수마다 주제가 바뀌는 것 같으니,
이런 과정으로 진행된다 정도만 알아두시면 될 것 같습니다.
(다음 기수가 어바인을 갈까..?)
^주제 적어놓은 사진. 내 갤러리에 없어서 유겸이 블로그에서 훔쳐옴
Melinda
, Patrick
, Daniel
멘토들이 주제를 미리 정해와서 팀별로 배정해줬다.
우리 팀은 3번 Sales Order OCR
이 주제였고, 3번이라 Team 3가 되었다.
팀명은 Six Guys. 남정네만 6명이라 Six Guys로 했다.
쉽게 설명하기 위해 배경지식부터 천천히 설명해보겠다.
어떤 회사에서 다른 회사의 물건을 살 때,
구매하겠다는 의사와 함께 구매할 물품들을 명시한 구매 내역서(Purchase Order)
를 제출한다.
판매하는 회사에서는 판매 내역(Sales Order)을 회사의 자원관리 시스템에 기록하고,
물건이 다음 과정들을 거쳐가며 판매가 될 것이다.
^Sales Order를 기록하는 흐름
그런데, 이 "판매 내역"을 만드는 과정이 불편하다.
디지털 방식이 아닌, 구매 내역서 이미지 파일을 확인해서 직접 시스템에 기록하는 상황을 가정한다.
이렇게 이미지에 있는 내용을 직접 기록하는 것은 에러가 발생하기 쉽고, 귀찮다.
이 귀찮은 과정(구매 내역서를 보고 판매 내역 정보를 기록하는 과정)을 OCR로 인식해서 자동으로 처리하자는 것이 이 프로젝트의 목적이다.
위의 프로젝트 소개에서 언급한 내용이면 개발을 바로 할 수 있을 것 같지만, 전혀 아니었다.
위처럼 너무 많은 질문이 이어졌다.
Patrick과 Hitomi에게도 여쭤봤는데, 뭔가 정해진 답은 없는 느낌이었다.
우리끼리 이런 질문들 잘 이어 나가면서, 우리들만의 답을 내보라는 것 같았다.
정해진 답은 없으니.. 우리들만의 답을 내보았다.
첫번째로 생각했던 프로젝트의 실행 흐름은 아래와 같다.
Mail fetcher
는 이메일로 전달받은 구매 내역서를 로컬에 저장한다.Sales order parser
가 cron job
으로 여러 프로세스가 돌아가고 있다.하지만 이 방법은 적당한 데모를 빠르게 보여주기에는 기간이 길게 걸릴 것 같았고,
로컬에 저장된 pdf파일을 자동으로 처리하다보니, UI적인 부분이 없어서 데모하기도 적합하지 않았다.
그래서 아래 방법을 선택했다.
채택된 프로젝트의 실행 흐름은 아래와 같다.
이제 무엇을 해야할까?
앱도 만들어야 되고, OCR은 어떤 기술을 사용할지도 정해야 하고, NLP 기술을 어떻게 적용할지도 결정해야 하고, ERPNext API도 공부해야 한다.
그전에, 설계 문서 먼저 작성하게 되었다.
System overview, Architectural design, Data design, Interface design, Security design, Error handling, Testing에 대해 작성했다.
설계 문서를 작성하며 우리의 생각에 있던 허점들을 더 자세히 살펴볼 수 있었다.
^간단하게 excalidraw에 설계를 작성해봤다.
아래는 우리가 작성해서 제출한 설계 문서이다.
진행에 앞서, 아래 서술할 내용들을 조사했다.
처음에는 학습도 고려대상이었다.
따라서, 학습 시킬 생각으로 OCR 모델을 학습시키는 논문들을 찾아보았다.
하지만, 제한된 시간동안 데이터셋을 구하는 것이 문제였다.
데이터셋은 우리 태스크에 딱 들어맞는 것이 없었고,
직접 데이터셋을 만들기에는 시간이 부족할 것 같았다.
따라서, API를 활용하게 되었다.
pytesseract
, tesseract.js
, Cloud Vision API
, flutter의 플러그인 중 google_mlkit_text_recognition
를 비교했다.
몇가지 데모용 Purchase Order pdf를 대상으로 비교했을 때, Cloud Vision API와 mlkit이 가장 성능이 뛰어났다.
최종적으로는 flutter에서 손쉽게 다양한 AI 모듈을 실험해 볼 수 있는 mlkit을 선택했다.
선택적으로 entity extraction 등의 모듈도 사용해볼 생각이었다.
^OCR 조사 문서의 일부분을 캡처한 사진이다.
원래는 OCR로 추출한 글자에 regex로 Sales Order 데이터에 들어가야 될 객체들을 추출하려 했는데, 여러가지 문제가 있었다:
위 문제들 때문에, LLM (Large Language Model)을 활용해서 개발하기로 했다.
우리가 LLM을 사용할 때, 주어지는 양식이 일정하지 않다는 문제를 해결하기 위해 적용한 방법론에 이름을 붙여봤다.
사실 이름을 붙일 정도로 새로운 시도는 아니었고, Few-shot learning을 통해 다양한 양식을 해결해보자는 것이었다.
우리가 풀어야 하는 문제는 아래와 같이 표현할 수 있다.
구매 내역서 pdf
---1. OCR---> OCR 추출 문자열
---2. LLM---> 판매 내역 json
그 중에서도, 지금은 2. LLM 부분을 해결하려는 것이다.
구매 내역 양식이 달라지면 OCR 추출 문자열
도 크게 바뀐다.
따라서 판매 내역 json
을 만들어 내는 데 문제가 생길 수도 있다.
이 상황에서 우리는 양식별로 OCR 추출 문자열 : 판매 내역 json
쌍을 런타임에 수집해서,
다음에 해당 양식을 인식하게 되면 Few-shot learning을 적용하여 성능을 높여보려고 했다.
위 내용에 대한 데모는 여기에서 확인할 수 있다.
ERPPNext 도큐먼트에서 API 관련 내용을 찾아서 학습하여 적용했다.
주요 학습 포인트는 다음과 같다:
^ERPNext 도큐먼트 중 일부
최종 발표를 잘 마쳤다 ^_^
영어는 너무 어렵다.
팀별로 돌아가면서 발표를 했는데, 우리조는 맨 마지막이었던 것 같다.
멘토분들이 앞에 앉아 계셨고, 발표 내용에 포함되지 않았던 내용들(e.g. 이 제품의 출시 가격은 얼마인가)도 질문하셔서 답하기가 꽤나 어려웠던 것 같다.
우리조는 사실 Yany가 다 발표하기로 했었다.
하지만 미국까지 왔는데 최대한 영어 많이 써보고 싶어서, Technical Project 발표는 내가 맡기로 했다.
대본도 없는데 긴장까지 해서 영어가 더 어려웠다 ㅋㅋ
^발표를 하러가는 나와 발표를 마친 Yany
처음에는 간단해보이는 프로젝트였지만, 문제 정의 자체를 우리가 한다는 점이 꽤나 어려웠다.
문제 정의를 하려면, 얼마나 깊게 파고들어야 되는지, 얼마나 많은 시간이 우리에게 있는지, 팀원이 어떤 기술 스택을 가졌는지, ... 모두 고려해서 정의를 해야 한다.
정말 이상적이지만 정말 어려운 문제를 선택한다면 기간 내에 끝내지 못 할 것이고,
정말 쉽지만 너무 허술한 문제를 선택한다면 우리가 얻어가는 게 없을 것이다.
우리도 Patrick과 지속적으로 상의하며 문제를 구체화했는데,
그 과정에서 이러한 문제의 레벨 조정이 잘 이뤄졌고,
결과적으로 프로젝트를 잘 완성할 수 있었던 것 같다.
사실은 미국가서 엄청난 논문을 써보자는 포부로 출발했던 나였기에,
결과적으로 그 엄청난 논문을 작성할 수 없었던 것이 아쉽지 않다면 거짓말이다.
하지만, 친구들, 멘토들과 쌓은 소중한 추억은 무엇과 비교할 수 없는, 앞으로도 두고두고 기억에 남을 좋은 경험이었다.
^Melinda와 사진을 찍고 훈훈하게 마무리 했다 ^_^