프로젝트 질의 응답

TIL Day 134

By polaris0208

프로젝트에 대한 질의 응답

소개 (본인의 장점 및 기술 핵심적으로 어필)

AI를 이용한 교육 프로그램, 교재 개발 직무를 희망하고 있습니다. 직무를 위해 자연어 처리와 LLM 랭체인, RAG 관련 기술을 익혔고 이를 바탕으로 LLM을 이용한 스토리텔링 챗봇 프로젝트를 진행하고, LLM을 이용한 퀴즈 중심의 자기주도 학습 서비스를 개발 및 배포한 경험이 있습니다.

[1] 본인 프로젝트에 대한 이해도 / 최종 프로젝트의 배경 / 프로젝트가 실행되는지 기술 중점으로 얘기

최종 프로젝트의 배경

AI 서비스 관련 기술을 학습하는 과정에서 학습자들에게 도움을 줄 수 있는 서비스가 있으면 좋겠다는 생각을 했고 기획으로 이어졌습니다. 처음에는 교재의 학습 수준을 확인 할 수 있는 퀴즈 위주의 챗봇 구상에서 보다 신뢰할 수 있는 정보를 확인할 수 있도록 공식문서 기능을 추가하는 것으로 프로젝트를 계획하였습니다.

프로젝트가 실행 기술 중점

서비스는 크게 DRF로 이루어진 백엔드, 리액트의 프론트엔드, 포스트그레스큐엘의 DB로 구성됩니다. 그리고 이를 보조하기 위해 redis, pgadmin의 서비스가 추가되었습니다. 서비스의 핵심 기술은 LLM을 이용한 챗봇과 퀴즈 생성이며, 학습자에게 신뢰할 수 있는 정보를 제공하기 위해 RAG 시스템과 다양한 프롬프팅 기술을 사용하였습니다. 배포는 AWS를 이용하여 S3에서 정적파일, EC2에서 백엔드 서버를 배포하며, 둘 사이를 Route53, ELB 를 통해 연결하였습니다. 또한 Cloudfront를 이용하여 정적파일의 빠른 처리를 보장하였습니다.

[2] 팀 내에서 어떤 어려움이 있었고 어떻게 해결했는지? /프로젝트 일정이 지연되었을 때 어떻게 대응했는지?

팀 내에서 어떤 어려움

팀 내에서 의견이 충돌하는 경우가 있으면 저의 경우에는 최소한 2가지의 대안을 준비하고 의견을 제시하도록 노력했습니다. 예를 들어 JWT 토큰 보관방식의 경우가 그랬습니다. 기술적 어려움이 있는 경우에는 전체 팀원이 실시간으로 문제를 공유하며 해결하려고 노력하였습니다.

프로젝트 일정이 지연

프로젝트 일정이 지연된 경우는 없었으나, 추가 기능을 개발하는 과정에서 유저테스트 일정 상 계획했던 모든 기능을 개발하기에 시간이 부족했던 경험이 있습니다. 회의를 통해 두가지를 고려하여 취사선택하였습니다. 첫 번째로 고려한 점은 추가되었을 때 이점이 있는지와 기한 내에 개발이 가능한 점, 두 번째는 조기에 개발이 완료되었을 때 추가로 개선이 가능한 점이었습니다. 그 결과 추가된 기능이 소셜 로그인 기능과 단체 퀴즈 기능이었고, 단체 퀴즈 기능은 조기에 완성되어 추가로 개선이 이루어질 수 있었습니다.

[3] 프로젝트에서 맡은 역할은 무엇이었나요?

프로젝트 초기 단계에서는 SA 문서 작성과 프로젝트 개발환경 통일을 위해 Docker 컨테이너 구성을 맡았습니다. 개발 중후반에는 주로 백엔드에서 LLM 및 RAG 구성을 담당하면서 백엔드 측에서의 프론트엔드와의 연결 조율 역할을 수행했습니다. 추가 기능 개발에서는 소셜 로그인 기능을 전담하여 개발하였습니다.

[4] 우리프로젝트를 구상하면서 다른 유사한 프로젝트들 대비, 뭘 더 고민했고, 그 고민을 통해서 어떤 기술을 넣었는지?

프로젝트 계획 단계에서 조사한 결과 대부분의 유사한 서비스는 퀴즈 기능만 제공하고, 해당 퀴즈들도 사전에 제작되거나 레퍼런스를 신용할 수 없는 경우가 많았습니다. 때문에 기존 서비스 기획에서 단순 퀴즈만 제공하지 않고 요약과 질문을 통한 학습과 퀴즈를 통한 학습성과 확인이 가능한 하나의 작은 학습 싸이클을 경험할 수 있는 서비스 구조로 확장였고, 사용되는 레퍼런스 또한 최신 기준 공식문서를 활용하는 것을 추가하였습니다.

[5] 사용자 피드백을 반영한 적이 있는지? 어떻게 반영했는지?

주된 피드백은 응답 속도와 서비스 이용 설명에 관한 것이었습니다. 응답 속도는 풀링 속도를 줄이고 Redis 캐싱을 통해 30퍼센트 정도 속도를 상승 시켰으며, 메인 페이지에 추가적인 서비스 이용 설명을 추가하고, 각 페이지에도 플레이스 홀더 및 모달을 이용한 안내를 추가하였습니다.

[6] 초기계획과 어떤게 달라졌는지, 어떻게 변화에 적응 했는지

초기에는 AI 서비스 개발 학습자를 위한 랜덤 퀴즈 서비스에서 출발하였으나, 기존 서비스와의 차별점이 적고 학습자들이 가장 많이 겪는 어려움 중 하나가 잘못된 정보나, 오래된 정보에서 온다고 생각하였고, 공식문서 레퍼런스를 할용한 기능을 추가하기로 계획하였습니다. 이에 더불어 보다 종합적인 학습 경험을 제공하기 위해서 개념 요약 기능과 QNA 기능을 추가하였습니다. 이후 추가 기능을 개발하는 과정에서 사용자의 흥미를 유발하기 위하여 단체 퀴즈 기능 또한 추가하였습니다.

[7] 버전관리를 어떻게 활용했는지?

깃 컨배션을 만들어 활용하였고, 새로운 기능을 개발 할 때는 각자 브랜치를 생성하여 개발한 뒤에 슬렉을 통해 사전 공지를 남기고 회의 시간에 의견을 공유한 뒤에 통합하였습니다. 최초 MVP 개발시에는 프론트엔드와 백엔드 리포지토리를 분리해서 개발하였고, 이후에는 배포를 준비하기 위해 통합된 리프지토리에서 docker 컨테이너를 실행한 상태에서 개발하였습니다.

[8] 어떤기술들을 써봤는지를 본인들 프로젝트에서의 경험을 빗대어 설명

이전 경험들을 토대로 프로젝트 초기에 중요하게 생각한 기술은 Docker 컨테이너 였습니다. 개발 초기부터 개발환경을 통일하는 것이 중요하다고 판단했기 때문입니다. 다음으로 고려한 것은 LLM 모델이었습니다. 가장 중요하게 생각한 점은 프롬프트가 들어갈 컨텍스트 용량이었고 gpt-4o/mini 를 사용했습니다. 개발이 진행되는 도중에 Gemini나 다른 모델을 고려할 수 있었지만 사용자 정의 Json 출력을 보장하는 “구조화된 출력” 기능을 사용해야 했기 때문에 gpt-4o 모델을 유지하였습니다. 신뢰성 있는 정보를 바탕으로 챗봇답변 및 QnA 답변을 제공하기 위해 RAG를 구축하였고, 대규몬 데이터가 있는 공식 문서의 경우 벡터 DB를 활용하여 구성했습니다. FAISS와 BM25를 결합하여 앙상블 리트리버를 구성하였고 코드 예제와 설명이 많은 데이터의 특성을 고려하여 키워드 검색이 주요한 BM25의 비율을 줄였스니다. 프롬프트 엔지니어링에서는 페르소나 설정, few shot 말고도 positive example/negative example을 시도했습니다. 기능 개선 과정에서 응답 속도를 높이기 이해여 Redis를 사용하였고, RAG에 필요한 데이터들을 캐싱 워밍으로 불러오고, QnA에서 지속적으로 사용하는 대화 내역 또한 사용자의 서비스 사용시간을 고려하여 비교적 짧은 시간 동안 캐시를 유지하도록 설계하였습니다.

[9] 프로젝트에서 아쉬운점이 있다면? - 해당 아쉬운점을 개선한다면 어떻게 하고싶은지? - 해당 솔루션을 처음부터 적용하지 못한 이유는 무엇인지?

비동기 기능을 통한 추가 속도 개선, 초기 MVP 개발에서는 고려하지 않았으나 추가 레퍼런스와 기능들이 추가되면서 필요성을 느끼게 되었습니다.

[10] API 설계 과정은 어떻게 진행했는지?

백엔드에서 개발 및 Postman을 이요한 테스트 후 OpenAPI를 이용하여 Swagger UI 구성하여 프로트엔드에 전달하였고, 이후에 프론트엔드와 조율하여 입출력을 조절하였습니다.

[11] 프로젝트에서 사용한 데이터베이스 구조를 설명해 주세요.

사용자 정보와 핵심 기능인 채팅 정보, 퀴즈 정보가 있으며 각 기능에 필요한 레퍼런스 정보로 DB가 구성됩니다. 각 기능은 사용자 정보와 연동되어 작동합니다. 채팅 정보에서는 사용자 입력과, 응답, 사용되는 레퍼런스 정보가 기록되며, 퀴즈 정보에는 퀴즈 정보, 선태지, 정답, 사용자의 퀴즈 결과 및 피드백이 저장됩니다.

인성

원활한 협업을 위한 본인만의 노력 / 갈등해결을 위한 본인만의 경험

보통 팀에서의 갈등은 문제에 대해 가지고 있는 인식이 다를 때 발생한다고 생각했습니다. 따라서 의견 충돌이 있는 경우에는 항상 동료들이 가지고 있는 생각을 확인하고 팀원들끼리 공통된 인식을 가지고자 했습니다.

Tags: TIL LLM Tools