Technical Project

Technical Project?

Technical Project는 6-7개의 사전 정의된 주제로 진행하는 프로젝트이다.
시험보고 팀을 나눴었다고 언급했는데, 그렇게 만들어진 팀원들과 함께 진행한다.

아 맞다!

혹시나 다음 기수 분들인데 참고용으로 이 게시글을 보고 계시다면,
Technical Project는 매 기수마다 주제가 바뀌는 것 같으니,
이런 과정으로 진행된다 정도만 알아두시면 될 것 같습니다.
(다음 기수가 어바인을 갈까..?)

Pasted image 20240301235603.png
^주제 적어놓은 사진. 내 갤러리에 없어서 유겸이 블로그에서 훔쳐옴

Melinda, Patrick, Daniel 멘토들이 주제를 미리 정해와서 팀별로 배정해줬다.

우리 팀은 3번 Sales Order OCR이 주제였고, 3번이라 Team 3가 되었다.
팀명은 Six Guys. 남정네만 6명이라 Six Guys로 했다.

Sales Order OCR 프로젝트 소개

쉽게 설명하기 위해 배경지식부터 천천히 설명해보겠다.

문제 상황

어떤 회사에서 다른 회사의 물건을 살 때,
구매하겠다는 의사와 함께 구매할 물품들을 명시한 구매 내역서(Purchase Order)를 제출한다.

판매하는 회사에서는 판매 내역(Sales Order)을 회사의 자원관리 시스템에 기록하고,
물건이 다음 과정들을 거쳐가며 판매가 될 것이다.

Pasted image 20240302171305.png
^Sales Order를 기록하는 흐름

그런데, 이 "판매 내역"을 만드는 과정이 불편하다.
디지털 방식이 아닌, 구매 내역서 이미지 파일을 확인해서 직접 시스템에 기록하는 상황을 가정한다.
이렇게 이미지에 있는 내용을 직접 기록하는 것은 에러가 발생하기 쉽고, 귀찮다.

이 귀찮은 과정을...

이 귀찮은 과정(구매 내역서를 보고 판매 내역 정보를 기록하는 과정)을 OCR로 인식해서 자동으로 처리하자는 것이 이 프로젝트의 목적이다.

프로젝트 진행 과정

주제 구체화가 필요하다.

위의 프로젝트 소개에서 언급한 내용이면 개발을 바로 할 수 있을 것 같지만, 전혀 아니었다.

  • 입력은 어떻게 주어지는지
  • ERP 시스템에 기록만 하면 끝나는 건지, 다른 모듈과 상호작용해서 실제로 판매라는 행위를 수행하는 건지
  • 보안은 어느 정도까지 신경 써야 되는 건지
  • 우리만의 앱을 만들어도 되는 건지, 기존 ERPNext에 plugin으로 추가할 건지
  • ...

위처럼 너무 많은 질문이 이어졌다.
Patrick과 Hitomi에게도 여쭤봤는데, 뭔가 정해진 답은 없는 느낌이었다.
우리끼리 이런 질문들 잘 이어 나가면서, 우리들만의 답을 내보라는 것 같았다.

우리가 구체화한 주제 1

정해진 답은 없으니.. 우리들만의 답을 내보았다.

첫번째로 생각했던 프로젝트의 실행 흐름은 아래와 같다.

  1. 구매자들은 판매자에게 구매 내역서를 메일로 전송한다.
  2. 구매 내역서들이 pdf파일로 seller@irvinetechhub.com으로 전달된다.
  3. 판매자의 컴퓨터에서 작동되고 있는 Mail fetcher는 이메일로 전달받은 구매 내역서를 로컬에 저장한다.
  4. 판매자의 컴퓨터에서 Sales order parsercron job으로 여러 프로세스가 돌아가고 있다.
  5. 각 parser는 동시다발적으로 로컬에 저장된 구매 내역서를 파싱하여 판매 내역 정보를 추출한다.
  6. 추출된 판매 내역 정보는 ERPNext (오픈소스 비즈니스 자원 관리 시스템)에 저장된다.

하지만 이 방법은 적당한 데모를 빠르게 보여주기에는 기간이 길게 걸릴 것 같았고,
로컬에 저장된 pdf파일을 자동으로 처리하다보니, UI적인 부분이 없어서 데모하기도 적합하지 않았다.
그래서 아래 방법을 선택했다.

우리가 구체화한 주제 2 (채택)

채택된 프로젝트의 실행 흐름은 아래와 같다.

  1. Six Guys 앱을 실행한다.
  2. 판매자는 구매자로부터 받은 구매 내역서를 앱 내부의 카메라로 촬영한다.
  3. 촬영된 구매 내역서 이미지는 OCR 기술을 통해 text로 변환된다.
  4. 변환된 text는 알아보기 힘든 형태다. 따라서, NLP 기술로 유용한 정보만 추출한다.
  5. 판매자가 인식된 데이터에 문제가 없는지 확인하고, 수정한다.
  6. 완료 버튼을 클릭하면 판매 내역이 ERPNext 시스템에 기록된다.

이제 무엇을 해야할까?
앱도 만들어야 되고, OCR은 어떤 기술을 사용할지도 정해야 하고, NLP 기술을 어떻게 적용할지도 결정해야 하고, ERPNext API도 공부해야 한다.

그전에, 설계 문서 먼저 작성하게 되었다.

설계 먼저

System overview, Architectural design, Data design, Interface design, Security design, Error handling, Testing에 대해 작성했다.

설계 문서를 작성하며 우리의 생각에 있던 허점들을 더 자세히 살펴볼 수 있었다.

Pasted image 20240302002224.png
^간단하게 excalidraw에 설계를 작성해봤다.

아래는 우리가 작성해서 제출한 설계 문서이다.

연구

진행에 앞서, 아래 서술할 내용들을 조사했다.

OCR 기술

처음에는 학습도 고려대상이었다.
따라서, 학습 시킬 생각으로 OCR 모델을 학습시키는 논문들을 찾아보았다.

하지만, 제한된 시간동안 데이터셋을 구하는 것이 문제였다.
데이터셋은 우리 태스크에 딱 들어맞는 것이 없었고,
직접 데이터셋을 만들기에는 시간이 부족할 것 같았다.
따라서, API를 활용하게 되었다.

조사한 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 등의 모듈도 사용해볼 생각이었다.

Pasted image 20240302172729.png
^OCR 조사 문서의 일부분을 캡처한 사진이다.

NLP 적용 방법

원래는 OCR로 추출한 글자에 regex로 Sales Order 데이터에 들어가야 될 객체들을 추출하려 했는데, 여러가지 문제가 있었다:

  1. 양식이 일정하더라도 OCR이 몇몇 글자 인식을 실패한다면, OCR로 추출된 글자에 누락된 내용들이 생겨서 regex 적용이 힘들다.
  2. 주어지는 양식이 일정하지 않다. 회사마다 자기 회사의 구매 내역서 양식으로 제출한다.

위 문제들 때문에, LLM (Large Language Model)을 활용해서 개발하기로 했다.

Adaptive Few-shot learning

우리가 LLM을 사용할 때, 주어지는 양식이 일정하지 않다는 문제를 해결하기 위해 적용한 방법론에 이름을 붙여봤다.
사실 이름을 붙일 정도로 새로운 시도는 아니었고, Few-shot learning을 통해 다양한 양식을 해결해보자는 것이었다.

우리가 풀어야 하는 문제는 아래와 같이 표현할 수 있다.
구매 내역서 pdf ---1. OCR---> OCR 추출 문자열 ---2. LLM---> 판매 내역 json
그 중에서도, 지금은 2. LLM 부분을 해결하려는 것이다.

구매 내역 양식이 달라지면 OCR 추출 문자열도 크게 바뀐다.
따라서 판매 내역 json을 만들어 내는 데 문제가 생길 수도 있다.
이 상황에서 우리는 양식별로 OCR 추출 문자열 : 판매 내역 json 쌍을 런타임에 수집해서,
다음에 해당 양식을 인식하게 되면 Few-shot learning을 적용하여 성능을 높여보려고 했다.

위 내용에 대한 데모는 여기에서 확인할 수 있다.

ERPNext API

ERPPNext 도큐먼트에서 API 관련 내용을 찾아서 학습하여 적용했다.
주요 학습 포인트는 다음과 같다:

  • 로그인/로그아웃 방법
  • Sales Order 클래스 구조
  • Sales Order draft 생성하는 방법

Pasted image 20240302180559.png
^ERPNext 도큐먼트 중 일부

결과물

img

위 이미지 링크에 연결된 GitHub repo에서 확인할 수 있다.

아키텍처 구조는 아래와 같다.
Pasted image 20240302181540.png

최종 발표

최종 발표를 잘 마쳤다 ^_^
영어는 너무 어렵다.

팀별로 돌아가면서 발표를 했는데, 우리조는 맨 마지막이었던 것 같다.
멘토분들이 앞에 앉아 계셨고, 발표 내용에 포함되지 않았던 내용들(e.g. 이 제품의 출시 가격은 얼마인가)도 질문하셔서 답하기가 꽤나 어려웠던 것 같다.

우리조는 사실 Yany가 다 발표하기로 했었다.
하지만 미국까지 왔는데 최대한 영어 많이 써보고 싶어서, Technical Project 발표는 내가 맡기로 했다.
대본도 없는데 긴장까지 해서 영어가 더 어려웠다 ㅋㅋ

Pasted image 20240302184634.png
^발표를 하러가는 나와 발표를 마친 Yany

회고

처음에는 간단해보이는 프로젝트였지만, 문제 정의 자체를 우리가 한다는 점이 꽤나 어려웠다.
문제 정의를 하려면, 얼마나 깊게 파고들어야 되는지, 얼마나 많은 시간이 우리에게 있는지, 팀원이 어떤 기술 스택을 가졌는지, ... 모두 고려해서 정의를 해야 한다.

정말 이상적이지만 정말 어려운 문제를 선택한다면 기간 내에 끝내지 못 할 것이고,
정말 쉽지만 너무 허술한 문제를 선택한다면 우리가 얻어가는 게 없을 것이다.

우리도 Patrick과 지속적으로 상의하며 문제를 구체화했는데,
그 과정에서 이러한 문제의 레벨 조정이 잘 이뤄졌고,
결과적으로 프로젝트를 잘 완성할 수 있었던 것 같다.

사실은 미국가서 엄청난 논문을 써보자는 포부로 출발했던 나였기에,
결과적으로 그 엄청난 논문을 작성할 수 없었던 것이 아쉽지 않다면 거짓말이다.
하지만, 친구들, 멘토들과 쌓은 소중한 추억은 무엇과 비교할 수 없는, 앞으로도 두고두고 기억에 남을 좋은 경험이었다.

Pasted image 20240303120502.png
^Melinda와 사진을 찍고 훈훈하게 마무리 했다 ^_^