최근 Open AI의 상업용 API를 통해 일기를 분석해주는 AI 성장일기라는 웹 프로그램을 만들었다. 일기에서 볼 수 있는 핵심 가치, 반복된 사고, 감정 상태를 분석하고, 필요로 하는 다음 행동에 대해 추천하는 식으로 결과를 받았었다. 이 때, 나는 Prompt에 몇 가지 감정 상태에 대한 Scale값을 미리 전달했었는데, 같은 일기에 대해 매번 결과값이 상이한 것을 보았다. 몇몇의 지인들에게 프로그램을 사용하게 해보았더니, "답변이 좀 어색하다."라는 대답을 받았다.
스스로 AI에 대한 상식이 부족함을 느꼈다. 그래서 머신러닝과 인공지능에 대한 강의들을 속성으로 듣고 관련된 책을 찾았다. 실제 머신러닝 강의에서는 아래보다 더 많은 내용을 다룬다. 딥하게 가면 선형대수와 같은 수학에 대한 사전 지식이 필요하고, 학습기들에 대한 개념들도 심층적으로 다룬다. 모든 걸 다 이해할 수는 없었는데, 개념적인 부분만 간단하게 정리해보았다.
인공지능
인공지능이란, 인간의 지능을 모방하여 문제해결을 위해 사람처럼 학습하고 이해하는 기계를 만드는 분야를 말한다.
머신러닝은, 풀어서 기계학습을 말하는 것으로, 인공지능의 한 분야이다. 인간의 학습 능력을 기계를 통해 구현하는 분야를 말한다.
딥러닝은, 머신러닝 중에서도 심층 신경망 기반으로 학습을 하는 방법을 말한다.
머신러닝
머신러닝에서 중요한 것은, "학습"이다. 실생활에서 발생하는 문제를 해결하기 위해 기계를 사용하는데, MNIST(미국 우체국)과 같은 곳에서 제공하는 대량의 Data Set을 통해 충분한 데이터를 사전에 확보하는 것이 중요하다. 그러고 나면 우리는 데이터에 대한 1) 전처리를 하거나, 불필요한 데이터를 축소하는 2) 특징추출을 할 수 있다. 이후로는 어떠한 학습기를 사용해 문제를 해결할 것인가에 대한 고민이 남는다. 어떤 학습기 = 모델을 쓸 거냐에 대해 3) 모델 수립 및 분석을 하고, 4) 모델 평가를 한다. 학습기에 대한 모든 학습이 정상적으로 이루어져 새로운 문제들이 오차 없이 해결 된다면, 5) 배포의 단계를 거쳐 머신러닝 개발을 완료한다.
머신러닝의 기본 요소
머신러닝에서는, 데이터를 "Vector" 단위로 표현한다. Vector는 열벡터라고도 부르는데, 말그대로 N차원의 행렬을 말한다. 데이터의 특성이 무엇이냐에 따라 Vector의 차원은 여러개가 될 수 있다.
x = [1, 1, 1, 0, 0] ==> 이것을 세로로 둔 것을, "열 벡터"라고 한다. 열이 여러 개가 되면 그것을 차원이라고 부른다.
머신러닝의 주제
무엇을 어떻게 학습시킬 것이냐에 따라, 머신러닝의 주제는 달라질 수 있다. 대량의 데이터를 이산적으로 분류하고 싶다면 "분류"를, 시간적인 흐름에 따라 어떤 연관성을 파악하고 싶다면 "회귀"를, 그룹을 나누는 클러스터링을 하고 싶다면 "군집화"를, 원데이터에 불필요한 데이터를 축소하고 싶다면 "특징 추출"을 할 수 있다. 여기서 만약 복잡한 신경망 기술을 활용하게 되면 그건 "딥러닝"에 해당이 된다. 다른 머신러닝 방식과 다르게, 딥러닝을 활용하면 비정형 데이터를 효과적으로 처리할 수 있다.

학습 시스템 관련 개념
목표하고 하는 결과값을 미리 알고 있다면 그것은 "지도 학습"에 해당된다. 그렇지 않다면, 임의의 군집을 나누어 끊임 없이 오차를 줄여가는 방식과 같은 "비지도 학습"을 하게 된다. 두 가지를 섞은 게 "준지도 학습"이다. 이 외에도 파블로그의 개 실험과 같이 강화학습을 통해 학습을 하는 경우도 있다.

딥러닝
심층신경망을 통해 학습을 하는 기술을 말한다. 이때 사용되는 것으로 RNN과 LSTM이 있는데 관련된 내용은 다음과 같다.
기본 순환 신경망(RNN)
RNN은 Recurrent Neural Network의 약자로, Recurrent는 재귀, 반복을 의미한다. 쉽게 말해 이전의 기억을 활용하는 신경망을 말한다. 주식의 시세와 같이 순서 정보를 가지고 있으며 출현 순서가 중요한 데이터를 처리할 때 유용하다. 입력층 - 은닉층 - 출력층으로 구성된 구조가 기존의 MLP(다층신경망)와 비슷하나, 은닉 노드에 가중치를 갖는 순환 엣지가 존재하여 직전에 발생한 정보를 현재의 입력으로 제공한다는 점이 다르다.
입력 → [기억] → 출력
↑ ↓
[기억]
RNN이 가진 단점은, 기울기 소실 문제로 긴 시퀀스에서 초기 정보가 점점 사라진다는 점이다. 그래서 LSTM이 등장했다.
LSTM와 GRU
LSTM은 Long Short-Term Memory의 약자로, 말그대로 장기기억과 단기 기억을 구분하는 신경망을 말한다. 중요한 기억은 오래 기억하며, 불필요한 정보는 삭제하는 방식으로 동작한다. 이것을 단순화한 것이 GRU이다.
LSTM의 경우,
입력 → [망각 게이트] → [입력 게이트] → [출력 게이트] → 출력
↑ ↓
[장기 기억 저장소]
GRU의 경우,
입력 → [초기화 게이트] → [업데이트 게이트] → 출력
RNN은 간단한 시계열 예측에 사용되며, LSTM의 경우 긴 문장을 번역하거나 음성을 인식할 때 사용되고, GRU는 상대적으로 짧은 텍스트를 분류하거나 감정을 분석할 때 유용하다고 한다.
LLM(Large Langauge Model)
LLM은 딥러닝에 기반을 둔 것으로, 자연어 처리 시 언어를 이해하고 생성할 수 있는 언어 모델이다. LLM은 크게 1) 상업용 API와 2) 오픈소스 LLM으로 나뉜다.
상업용 API LLM
Open AI에서 제공하는 상업용 API가 위에 해당된다. 토큰 단위로 비용을 지불하면서 Prompt 명령어를 통해 Data로부터 분석 결과를 받을 수 있다. 이러한 상업용 API는 범용적 언어 생성 능력이 뛰어하다. 그렇기에 단순 검색용으로 적합하지만, 특정 도메인에 특화된 결과값을 받기에는 적절하지 못하다.
오픈 소스 LLM
오픈 소스 LLM은 추가학습을 통해 특정 도메인에 특화된 방식으로 학습을 할 수 있다. 이를 sLLM이라고 부른다.
LLM은 말그대로 대량의 언어 데이터를 활용해 그럴듯한 대답을 만들어내는 데에 특화되어 있으나, 그 정보의 사실 유무에 대해 판단할 능력은 없다. 실제 Open AI의 API를 통해 일기를 분석했을 때, 내 일기를 엉뚱하게 분석하는 것을 종종 보았다. 이에 관해 평가해주었던 교수님들은 AI가 민감한 일기 정보를 부정적으로 분석할 걸 우려하셨다. 예를 들어 우울을 조장하는 듯한 멘트가 나오는 것처럼. 상업용 AI에서 겉만 멀쩡하지만 결과가 온전하지 않게 나타나는 문제를 "환각 현상"이라 부른다. 이를 해결하기 위해 RAG(검색 증강 생성)이라는 기술이 발전했다.
검색 증강 생성 RAG
검색 증강 생성 기술을 쉽게 보면, 마치 도서관 사서와도 같다. 질문을 받으면 관련된 문서나 데이터를 찾아보고, 그 데이터를 토대로 답변을 한다. 일반 LLM이 2년 전에 읽은 책들로만 답변을 한 다면, RAG 시스템은 도서관에서 최신 책을 찾아보고 답변을 해준다. 이런 방식은 최신 제품 정보를 제공하는 고객서비스나, 최신 의학 논문을 참고하는 의료 분야, 현재 법률 정보를 활용하는 법률 자문 서비스 등에 활용될 수 있다.
RAG 시스템에서 중요한 것은 "검색"이다. 검색을 하기 위해서는 검색 데이터를 벡터 DB에 저장하는 과정이 필요하다. 1) 사용자가 검색을 하면 검색 내용을 벡터 DB에 저장한다. 이후 2) 벡터 DB에서 검색을 한 후 요청값에 맞게 프롬프트를 완성한다. 이러한 과정을 겪으면 사실이 아닌 결과값을 사실에 가깝게 변경할 수 있다.
이제 내가 해야할 건 무엇일까?
나는 스프링을 통해서 일기 분석 앱을 만들었었다. 기존의 LLM 관련 강의들을 보면 주로 파이썬으로 이루어진 강의들이 많았는데, 당장 파이썬을 공부하는 것 보다는 기존 앱을 변경하는 방식이 나을 것 같았다. 위대한 Claude에게 한 번 너라면 어떻게 할 거냐 물어보았다. 이 친구가 내게 조언한 건 다음과 같았다.
[1] 프로젝트 개선 방안
- RAG 시스템 구현하기 : 일기 데이터를 벡터화하고, 유사한 감정/상황 패턴을 검색하게 한 뒤, 더 정확한 분석 결과를 제공하라.
- 사용자 피드백 시스템을 도입하라
- 감정 분석 결과의 일관성을 확보하라
[2] 추천 학습 경로
- Prompt Engineering 심화 학습
- 벡터 DB 구축 방버 학습
- Spring 에서 AI 통합 방법 학습
[3] 구성할 수 있는 아키텍처
[Client Layer]
↓ HTTP/REST
[API Layer]
↓
[Service Layer] → [AI Service Layer]
↓ ↓
[Repository Layer] [Vector DB Layer]
↓ ↓
[DB] [Vector Storage]
[4] 데이터 흐름
사용자 요청
↓
1. 일기 텍스트 접수
↓
2. 임베딩 생성 (OpenAI)
↓
3. 벡터 DB 검색
↓
4. 유사 일기 컨텍스트 구성
↓
5. GPT 분석 요청
↓
6. 결과 반환
벡터 DB는 PostgreSQL을 사용할 수 있을 것 같다. 우선, 코틀린을 먼저 공부하려 하고 있었기 때문에 이 부분은 잠시 보류하면서 차후 진행을 해봐야 겠다. 어쩌면 GRU를 사용해 감정 분석만 하는 프로그램을 만들 수도 있겠다.
[참고]
LLM을 활용한 실전 AI 애플리케이션 개발, 허정준 저.
방송통신대학교 머신러닝/빅데이터 강의