ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • ai 활용 - 텍스트 분석 라이브러리와 생성형 ai의 사용
    프로젝트/법잘알 2024. 2. 2. 22:29

    국회 공공데이터 활용 공모전 공고를 보고 프론트엔드 개발자인 과 동기와 바로 해보자는 얘기가 나왔다.

    하지만 공고를 늦게 확인해서 시간이 한 달밖에 남지 않았었고, 짧은 시간안에 ai 개발자를 구하기 힘들어서 백엔드 개발자인 내가 동시에 ai까지 구현해보게 되었다.

     

    내가 ai 개발자가 아니기 때문에 유튜브와 구글링, 공식 문서등을 참고하며 개발을 해서 어려운 라이브러리의 코드를 한 줄 한 줄 이해하고 코딩한 것은 아니지만 최대한 원리를 이해하고 사용했다. 요즘은 많은 서비스에 ai 기술을 도입하는데, 백엔드와 ai 간의 호출이 어떻게 이루어지는지도 궁금했었는데 이번 기회에 직접 구현해보면서 백엔드 개발자로서 조금이나마 ai 기술을 이해하게 되었다.

     

     

    chanhee01/LawSearch_AI: 국회 공공데이터 활용 경진대회 - open ai (github.com)

     

    코드는 위의 깃허브 링크에 있으니 코드를 보여주기보다 설명을 하도록 하겠다.

     

    일단 BillDataLoader를 통해서 국회의원 '발의법률안 공공데이터'의 법안의 제목들을 하나하나 mysql에 insert 했다. 이후에 실제로 요청이 왔을 때 호출되는 코드는 selectBill.py, BillInfoSearch.py, open_ai.py이다. 우선, selectBill.py에서는 PyKomoran과 TF-IDF라는 라이브러리를 사용한다.

     

     

    selectBill.py

     

     

    PyKomoran 라이브러리

    한국어의 형태소 분석을 해주는 라이브러리이다. 우리나라 법안을 추천하는 서비스이기에 한국어 분석이 필요했으며, 대용량 뭉치를 기반으로 명사, 동사, 형용사를 분석해주는데, 단어 단위로 나눈 다음에 TF-IDF 라이브러리로 보낸다.

     

     

    TF-IDF 라이브러리 (Term Frequency-Inverse Document Frequency)

    문서의 핵심 단어를 추출하거나 검색 엔진에서 문서의 중요도를 판단하는 데 사용되는 통계 라이브러리이다. TF는 특정 단어가 문서 내에 얼마나 자주 등장하는지, IDF는 해당 단어가 문장에서 얼마나 중요한 단어인지 분석한다.PyKomoran을 통해 분석한 단어는 보통 목적어에 있는 단어가 중요한 단어로 인식되어서 가중치를 받게 했다. '내가 교통 사고를 당했다'라는 문장의 핵심은 '교통 사고'이고 목적어가 가장 중요한 단어이기 때문이다.

    TF와 IDF의 값을 곱하여 얻어지는 TF-IDF 값은 특정 문서에서 특정 단어의 중요도를 나타내는 수치이며, 이 수치를 통해 법안을 추천한다. Python에서 scikit-learn 라이브러리를 사용해 TF-IDF를 계산했다.

     

     

    BillInfoSearch.py

    이 라이브러리들로 핵심을 파악한 다음에 db에 저장된 법안들 중, 가장 관련있는 법안을 선택한다. 그 법안을 BillInfoSearch로 넘긴 다음 '의안 정보'라는 공공 데이터에 법안 이름을 파라미터로 보낸다.

    법안 이름으로 요청을 보낸다.

    이렇게 해서 법안 이름을 가지고 법안의 내용을 반환받게 되었다.

     

     

    open_ai.py

    마지막으로 open_ai.py에서 chat gpt인 생성형 ai를 사용한다. 여기에서 핵심 내용을 요약해주며, 그에 따른 국회의 관련 위원회를 사용자에게 반환해서 추후에 문의를 하거나 건의를 할 수 있도록 했다. 아래에 사진을 첨부하도록 했다.

     

    여기서 법안 이름, 관련 국회 위원회, 요약된 내용을 flask로 반환을 하고, 백엔드가 요청을 하면 값들을 보내준다.

     

    즉, 프론트엔드가 스프링으로 요청을 하면 스프링에서 아래와 같은 코드로 flask에 요청을 한다.

     public String getBills(GptRequestDto request) {
        RestTemplate restTemplate = new RestTemplate();
        String flaskUrl = "http://43.203.106.131:5000/api/send-data";
    
        HttpEntity<GptRequestDto> entity = new HttpEntity<>(request);
    
        // Flask 서버에 POST 요청 보내기
        ResponseEntity<String> response = restTemplate.exchange(flaskUrl, HttpMethod.POST, entity, String.class);
    
        return response.getBody();
    }

     

     

     

     

    내가 ai 개발자가 아니기도 하고, 시간이 한정적이기 때문에 직접 모델을 구현해서 학습시키고 싶었지만 그러지 못했다.

    (라이브러리 가져다 쓰는게 너무 힘들어서 학습 시키려 했지만 시간적 여유가 부족하다는 다른 개발자의 말을 듣고 그만뒀다....)

     

    그래서 외부 라이브러리를 가져다 사용했는데, 이 때문에 정확도가 매번 높지는 않지만, 서비스에 찾고 싶은 법안에 대해 자주 언급하면 ai가 알맞은 법안을 추천할 확률이 높아진다고 언급해서 정확도를 높였다.

     

    예선 보고서 제출 때 찍은 실제 영상의 캡쳐 사진입니다. 사용자가 입력한 상황에 따라 법안을 추천 및 요약해줍니다.

     

     

     

     

    ai 개발을 하면서..

    사실 처음 해보는 것이고, 공부를 충분히 할 시간도 없었기 때문에 완벽한 ai를 구현하지 못했고, 스트레스를 너무 많이 받았다.. 그런데도 이렇게 서비스를 구현해보니 얻어가는 것이 굉장히 많았다. ai와 백엔드가 어떻게 통신하는지 너무 궁금했었는데, 프론트엔드가 백엔드에 요청을 하면 백엔드는 ai쪽에 요청을 해서 데이터를 얻어오면 되는 것이었다.

    진짜 너무 힘들었지만 좋은 경험이었고, 다음 학기에 인공지능 응용 과목도 수강하고, 정보통신종합설계에서 ai 서비스를 개발하는데, 백엔드 개발자로 참여하면서 ai 모델링 구현과 직접 학습에도 참여할 예정이라 이번 경험은 값진 경험이었다고 생각한다.

    비록 구글링과 유튜브에 의존한 개발이었지만 짧은 시간안에 백엔드 뿐만 아니라 간단한 ai 로직까지 구현해서 너무 뿌듯했다.

Designed by Tistory.