Share
Sign In
RAG + Graph DB를 이용하여 추천 시스템 만들기에 대한 고민
S
SangYeon_Lee
안녕하세요, 이번 글에서는 벨루가에서 최근 시작하게 된 추천 시스템 프로젝트에 대해 소개하려 합니다. 추천 시스템은 이제 우리 일상 속에 깊숙이 자리잡았습니다. 쇼핑몰에서 상품을 추천받기도 하고, 음악 스트리밍 서비스에서 새로운 아티스트를 발견하기도 하죠.
이런 추천 시스템은 크게 두 가지 상황에서 사용 될 수 있다고 보았습니다.
첫째는 사용자가 직접 추천을 요청하는 경우이고,
둘째는 사용자의 행동과 상황을 분석하여 자동으로 추천하는 경우입니다.
개인적으로는 후자에 더 관심이 있는데요, 사용자의 니즈를 예측하여 능동적으로 추천하는 시스템을 만들고 싶었습니다.
그리고 우리 벨루가에서 탬플릿화 또는 솔루션화 될 수 있게 설계를 하면 좋겠다고도 생각했습니다.
나아가 수많은 카페24, 고도몰, 네이버 스마트 스토어와 연결하여 사용할 수 있겠다는 생각도 해봅니다.
하지만 막상 프로젝트를 시작하려니 고민이 많이 됐습니다. 사용성을 이해하고 신용카드 관련 도메인 지식이 가지고 있는게 아니거든요. 이럴 때는 어떻게 해야 할까요?
저희는 데이터에서 힌트를 찾기로 했습니다. 데이터 확보가 용이한 것 부터 생각해보기로. 아니면 약간의 상상으로 데이터를 만들 수 있다면 최소한의 검증을 할 수 있다고 생각했죠.
그리고 당현히 벨루가 팀은 RAG(Retrieval-Augmented Generation)와 Graph DB를 활용하기로 했습니다. RAG는 정보 검색과 생성을 결합하여 정확한 답변을 만들어내는 강력한 도구입니다. 여기에 Graph DB를 결합하면 데이터 간의 복잡한 관계성을 더 잘 활용할 수 있죠.
물론 Graph DB를 사용하는 데는 비용과 성능 이슈가 있습니다. 그리고 GPT, Claude, Gemini, Llama 3, Cohere 등과 같은 언어 모델 API를 사용하는 것도 속도와 비용 면에서 부담이 될 수 있죠. 하지만 개인화된 추천의 가치를 생각한다면 이 정도 투자는 충분히 의미 있다고 생각했습니다. 그리고 앞으로 더욱더 개인화는 세계적인 흐름이 될 것이라 생각 하고 있습니다.
또 한 가지 고민은 Graph DB의 엔티티를 어떻게 구분할 것인가였습니다. 사람이 일일이 정의하는 것도 방법이지만, 언어 모델을 활용한 자동화도 생각해 볼 만합니다. 이를 통해 시스템의 효율성을 한층 높일 수 있을 것 같았죠.
벨루가팀은 이 프로젝트를 통해 신용카드 맛집 추천 시스템을 만들어 보려 합니다. 사용자의 위치 정보, 신용카드 정보, 맛집 정보 등을 종합하여 가장 혜택을 많이 받을 수 있는 맛집을 추천하는 거죠. 이를 통해 신용카드 사용률도 높이고, 사용자 경험도 개선할 수 있을 것이라 기대하고 있습니다.
사실 저 자신은 추천 시스템을 잘 활용하지 않는 편인데요, 그 이유는 추천이 제 취향과 잘 맞지 않기 때문이었습니다. 하지만 이번 프로젝트를 통해 진정으로 개인화된 추천 시스템을 만들어 본다면, 저 같은 사용자들의 만족도도 크게 향상시킬 수 있지 않을까요?
물론 이 여정이 순탄치만은 않을 것입니다. 주어진 시간은 3~4주 정도, 시행착오도 있을 테고, 예상치 못한 어려움도 만날 수 있죠. 하지만 그 과정에서 배우고 성장하는 것, 그것이 이 프로젝트의 가장 큰 의미라고 생각합니다. 작은 성공부터 하나씩 쌓아가다 보면, 분명 값진 결실을 맺을 수 있을 거예요.
프로젝트가 완성되는 그 날까지, 벨루가는 계속해서 도전하겠습니다. 이 블로그를 통해 그 여정을 여러분과 함께 나누고 싶네요. 앞으로의 이야기가 기대되시나요? 저도 마찬가지랍니다.
여러분도 각자의 분야에서 새로운 도전을 시작해 보시는 건 어떨까요? 언제나 여러분의 도전을 응원하겠습니다. 다음 글에서 다시 만나요, 감사합니다!
예상 되는 설계 방향
데이터(예상)
사용자 프로필 (필수):
1.
UserID (고유 식별자)
2.
나이
3.
성별
4.
선호 음식 카테고리 (한식, 중식, 일식, 양식 등)
5.
선호 가격대 (저렴한, 보통, 고급)
6.
식사 시간대 (아침, 점심, 저녁, 야식)
7.
알레르기 정보 (땅콩, 갑각류, 유제품 등)
사용자 프로필 (선택):
1.
직업
2.
결혼 여부
3.
가족 구성원 수
4.
소득 수준
5.
주거 지역
사용자 위치 데이터 (필수):
1.
실시간 GPS 좌표
2.
위치 업데이트 시간
사용자 카드 정보 (필수):
1.
카드 발급사
2.
카드 종류 (신용카드, 체크카드)
3.
카드 등급 (일반, 골드, 플래티넘 등)
4.
카드별 혜택 (할인율, 적립률, 무이자 할부 등)
맛집 데이터 (필수):
1.
맛집 ID (고유 식별자)
2.
맛집 이름
3.
맛집 위치 (GPS 좌표)
4.
음식 카테고리 (한식, 중식, 일식, 양식 등)
5.
가격대 (저렴한, 보통, 고급)
6.
영업 시간
7.
전화번호
8.
메뉴 정보
9.
카드 혜택 (할인율, 적립률 등)
맛집 데이터 (선택):
1.
평점
2.
리뷰 개수
3.
리뷰 내용
4.
대표 메뉴
5.
주차 가능 여부
6.
예약 가능 여부
7.
웨이팅 시간
8.
식당 사진
카드사 제휴 데이터 (필수):
1.
제휴 맛집 ID
2.
제휴 카드사
3.
제휴 카드 종류
4.
제휴 혜택 (할인율, 적립률 등)
5.
제휴 기간
개략적인 설계
우리 개발자분이 작업 중인 그래프 DB 모습
3
👍😂😍
3
    youni
    넘 어렵... 네요 ㅎ
    S
    SangYeon_Lee
    네 이건 좀 어려운 부분들이 있습니다. 언제 시간되면 좀 풀어서 보완 해 보겠습니다.
    커맨드스페이스
    너무 기대됩니다!! 좋은 내용 정리해주셔서 감사드려요.
/velugadoc
Subscribe
벡터 데이터베이스 vs 그래프 데이터베이스 차이
최근 검색 증강 생성(RAG: Retrieval Augmented Generation)에 대한 관심이 급증하고 있습니다. 이 기술에 대한 기대와 함께 실망도 많습니다. 문서나 데이터를 나누는 방법에서부터 임베딩 방법, 그 외 전처리 및 후처리 등 다양한 방법이 문제 해결에 적용될 수 있습니다. 하지만 일반적인 RAG 기술을 적용할 때는 생각보다 만족스러운 결과를 얻지 못하는 경우가 많습니다. 이번 글에서는 벡터 데이터베이스와 그래프 데이터베이스의 차이를 예시를 통해 가볍게 설명해 보고자 합니다. 대규모 언어 모델(LLM)을 핵심 애플리케이션에 도입하려는 경우, LLM의 예측 불가능한 특성으로 인해 부정확한 추론이나 명백한 오류 같은 문제가 발생할 수 있습니다. 이는 정확성, 설명 가능성, 신뢰성을 중시하는 기업들에게 큰 문제로 다가옵니다. 이러한 문제를 극복하기 위해 검색 증강 생성이 주요 고려 사항이 됩니다. 지식 그래프와 벡터 데이터베이스는 검색 증강 생성을 구현하기 위한 잠재적인 솔루션으로 주목받고 있습니다. 그렇다면 LLM에 보다 정확하고 신뢰할 수 있으며 설명 가능한 기반을 제공하는 것은 무엇일까요? LLM 기반 구축을 위해 지식 그래프와 벡터 데이터베이스 중 하나를 선택할 때 고려해야 할 몇 가지 핵심 요소를 살펴보겠습니다. 복잡한 질문에 대한 답변 질문의 복잡성이 높을수록 벡터 데이터베이스가 빠르고 효율적으로 결과를 반환하기 어려워집니다. 쿼리에 더 많은 주제를 추가하면 데이터베이스가 원하는 정보를 찾기 힘들어집니다. 예를 들어, 지식 그래프와 벡터 데이터베이스 모두 "우리 회사의 CEO는 누구인가?"라는 질문에 쉽게 답변할 수 있지만, "지난 12개월 동안 최소 두 명의 구성원이 투표를 기권한 이사회 회의는 무엇인가?"와 같은 질문에는 지식 그래프가 벡터 데이터베이스보다 더 빠르게 답변할 수 있습니다. 벡터 데이터베이스는 벡터 공간 내 주제들의 유사성을 기반으로 답을 찾을 가능성이 높지만, 지식 그래프는 관계를 통해 정확한 정보를 찾아 반환합니다. 완전한 응답 얻기 벡터 데이터베이스는 유사성 점수 및 사전 정의된 결과 제한에 의존하기 때문에 답변을 반환할 때 불완전하거나 관련 없는 결과를 제공할 가능성이 있습니다. 예를 들어, "윤선도가 쓴 모든 책을 나열하시오"라는 질문에 벡터 데이터베이스는 다음과 같은 결과를 반환할 수 있습니다. 불완전한 제목 목록 (사전 정의된 제한이 너무 낮음): 예를 들어, 결과 제한이 3으로 설정되어 있고 윤선도가 쓴 책이 10권이라면, 벡터 데이터베이스는 3권의 책 제목만 반환하고 나머지 7권은 누락됩니다. 윤선도의 모든 제목과 다른 저자의 일부 제목 (사전 정의된 제한이 너무 높음): 반대로, 결과 제한이 20으로 설정되어 있고 윤선도가 쓴 책이 10권이라면, 벡터 데이터베이스는 윤선도의 모든 책 10권과 함께 다른 저자의 책 10권을 추가로 반환할 수 있습니다. 이는 사용자가 원하는 정보 외에 불필요한 정보까지 포함되어 검색 결과의 정확성을 떨어뜨립니다. 사용자 또는 개발자가 모든 가능한 쿼리에 대한 사전 정의된 제한을 알 수 없기 때문에 벡터 데이터베이스만으로 정확한 답변을 얻는 것은 쉽지 않습니다. 그래서 결과를 이용해 LLM에 보내어 다시 응답을 생성합니다. 반면, 그래프 데이터베이스를 사용한 지식 그래프는 엔티티가 관계에 의해 직접 연결되므로 각 엔티티마다 관계 수가 다릅니다. 지식 그래프는 정확한 답변만 검색하여 반환합니다. 이 경우 지식 그래프 쿼리는 윤선도가 쓴 모든 책만 반환하고 다른 것은 반환하지 않습니다. 다만, 그래프 데이터베이스의 단점은 초기 데이터베이스를 잘 구축해야 한다는 점입니다. 신뢰할 수 있는 응답 얻기 벡터 데이터베이스는 두 개의 사실 정보를 연결하여 부정확한 추론을 할 수 있습니다. 예를 들어, "제품 관리 팀에는 누가 있습니까?"라는 질문에 벡터 데이터베이스는 제품 팀이 생성한 문서(사실)에 대한 빈번한 댓글 액세스 권한(사실)이 있는 사람이 제품 팀에 속한다고 잘못 추론하여 결과에 이름을 반환할 수 있습니다. 그래프 데이터베이스로 구현한 지식 그래프는 노드와 관계를 사용하여 조직 내 사람들의 관계를 식별하기 때문에 제품 팀에 속한 사람만 반환합니다. 지식 그래프 쿼리는 연결된 정보의 흐름을 따라가므로 응답이 일관되게 정확하고 설명 가능합니다. 벡터 데이터베이스의 장단점 장점: 고차원 벡터 공간에서의 유사성 검색에 강점이 있습니다. 다양한 종류의 데이터를 빠르게 검색하고 분석할 수 있습니다.
SangYeon_Lee
SSE(Server-Sent Events)를 활용한 실시간 스트리밍 도입 고민
최근 웹 애플리케이션에서 실시간 기능의 중요성이 점점 더 커지고 있는 것을 체감하고 있는 중에 벨루가도 SSE(Server-Sent Events) 을 적용하여 AI 답변을 제공하면 어떨까를 고민하며 프로젝트를 진행해보고 그 경험을 공유하고자 합니다. 지금도 벨루가는 스트리밍 방식으로 AI답변을 제공하고 있지만 단순 텍스트를 스트리밍하고 있는 구조로 되어 있어 클라이언트 개발자의 부담이 크며 유지보수 또한 쉽지 않은 구조로 이루어져 있습니다. 모든 메타데이터(출처, 답변생성 프로세스등..)를 답변과 함께 텍스트로 전달 되기 때문입니다. SSE(Server-Sent Events)란 무엇인가? SSE(Server-Sent Events) 는 서버가 클라이언트(웹 브라우저)에 정보를 푸시하는 방식입니다. 웹에서는 보통 클라이언트가 서버에 요청(request)을 보내고 서버가 응답(response)을 반환하는 구조인데, SSE는 이와 반대로 서버에서 초기 연결 후 계속해서 데이터를 클라이언트에게 보낼 수 있게 해줍니다. 이 기술은 특히 뉴스 피드, 실시간 알림, 또는 챗봇과 같은 애플리케이션에 매우 유용합니다. 이미지 출처: Exploring SSE (Server-Sent Events): Real-Time Updates for Your Applications! SSE의 선택 이유 WebSocket과 같은 다른 기술들도 고려했지만, SSE를 선택한 이유는 서버 설정이 간단하고, 양방향이 아닌 클라이언트와의 단방향 통신만 하면 되기 때문입니다. SSE는 HTTP를 사용하기 때문에 기존 웹 인프라와의 호환성도 뛰어나다는 장점이 있습니다. 구현 과정 API 서버 Python의 FastAPI 프레임워크를 사용하여 서버를 구축했습니다. 이 서버는 사용자로부터 질문을 받아 OpenAI의 GPT-3.5 모델에 전달하고, 생성된 응답을 실시간으로 사용자에게 스트리밍하는 역할을 합니다. 챗봇 서버 생성: FastAPI를 사용하여 웹 서버를 구축하고, CORS 설정을 통해 모든 출처에서의 접근을 허용했습니다. GPT-3.5 연동: 사용자의 입력을 받아 처리한 후, 생성된 텍스트를 실시간으로 스트리밍하기 위해 SSE를 구현했습니다. 스트리밍 로직: sse_generator 함수는 GPT 모델로부터 받은 데이터를 yield를 통해 클라이언트에 전송하고 await asyncio.sleep(0) 을 사용하여 이벤트 루프의 블로킹을 방지하고 다른 네트워크 태스크에 CPU 자원을 제공해서 클라이언트가 실시간으로 데이터를 받을 수 있도록 구현했습니다. 클라이언트 서버 웹 클라이언트는 React를 사용하여 구현했습니다. React를 선택한 이유는 특별한 이유가 있다기 보다는 벨루가 클라이언트가 React로 개발되어 있기 때문입니다. React는 동적인 UI를 구축하기에 적합하며, 컴포넌트 기반의 구조 덕분에 유지보수와 코드 관리가 용이하다는 장점이 있고 무엇보다 중요한건 Server-Sent Events(SSE) 를 활용하여 서버로부터의 스트리밍 데이터를 효과적으로 처리할 수 있다는 것입니다.
박진훈
챗봇 & 대화형 마케팅
대화형 마케팅(Conversational Marketing, CM)은 고객과의 실시간 대화를 통해 관계를 구축하고, 고객의 요구를 즉시 파악하여 개인화된 경험을 제공하는 마케팅 접근 방식입니다. 이 전략은 전통적인 마케팅의 일방적인 커뮤니케이션을 벗어나, 고객과의 쌍방향 대화를 통해 신뢰와 충성도를 증진시키는 데 중점을 둡니다. 다음은 대화형 마케팅의 몇 가지 주요 특징과 예시를 포함하여 설명합니다. 대화형 AI나 AI 챗봇을 활용한 마케팅은 고객 서비스와 상호작용의 효율성을 높이는 동시에 개인화된 경험을 제공하여 고객 만족도를 크게 향상시킬 수 있습니다. AI 챗봇은 실시간으로 대화하면서 고객의 질문에 답하고, 필요한 정보를 제공하는 등 다양한 역할을 수행합니다. 여기에 AI 챗봇을 활용한 마케팅 전략에 대해 자세히 설명드리겠습니다. 1. 실시간 고객 지원 설명: AI 챗봇은 고객이 언제든지 원하는 정보를 즉시 얻을 수 있도록 도와줍니다. 이는 고객의 문의에 빠르게 응답하고, 만족도를 높이는 데 기여합니다. 예시: 웹사이트에 방문한 고객이 제품에 대해 궁금한 점을 챗봇에게 질문하고, 챗봇이 데이터베이스에서 즉시 관련 정보를 찾아 답변합니다. 2. 개인화된 추천 제공 설명: AI 챗봇은 고객의 이전 대화 내용, 구매 이력, 선호도를 분석하여 맞춤형 제안을 할 수 있습니다. 예시: 고객이 온라인 쇼핑몰에서 노트북을 검색할 때, 챗봇이 사용자의 구매 이력과 선호도를 분석하여 최적의 노트북을 추천합니다. 3. 구매 과정 최적화 설명: AI 챗봇은 고객의 구매 결정 과정을 돕고, 각 단계에서 필요한 정보를 제공하여 구매를 촉진합니다. 예시: 고객이 결제 과정에서 어려움을 겪을 때, 챗봇이 즉시 도움을 제공하며 결제 완료를 돕습니다. 4. 고객 참여 유도 설명: AI 챗봇은 대화를 통해 고객 참여를 유도하고, 이를 통해 고객의 의견을 수집하거나 피드백을 받습니다. 예시: 챗봇이 고객에게 최근 구매 제품에 대한 만족도 조사를 실시하고, 이를 바탕으로 서비스 개선에 활용합니다. 5. 장기적 관계 구축 설명: AI 챗봇은 정기적으로 고객에게 유용한 정보를 제공하고, 고객의 요구에 꾸준히 응답함으로써 신뢰 관계를 구축합니다. 예시: 챗봇이 고객의 생일이나 기념일에 맞춰 특별 할인 정보나 축하 메시지를 보내 관계를 강화합니다. AI 챗봇을 이용한 대화형 마케팅은 기업이 고객과의 지속적인 상호작용을 통해 더욱 신속하고 효과적으로 응대할 수 있게 도와줍니다. 이를 통해 고객 경험을 향상시키고, 브랜드 충성도를 높이는 데 크게 기여할 수 있습니다.
SangYeon_Lee