paint-brush
머신러닝 없이 기본 추천 엔진을 구축하는 방법~에 의해@thestartupdeveloper
700 판독값
700 판독값

머신러닝 없이 기본 추천 엔진을 구축하는 방법

~에 의해 Aditya Kumar11m2024/03/18
Read on Terminal Reader

너무 오래; 읽다

이 기사에서는 기계 학습 모델 없이 추천 엔진을 개발하는 방법을 살펴보고 주요 요구 사항, 시스템 아키텍처 및 사용된 도구에 대한 통찰력을 제공합니다. 사용자 관심을 포착하고, 고품질 추천을 생성하고, 최적의 시스템 성능을 보장하기 위한 전략을 알아보세요.
featured image - 머신러닝 없이 기본 추천 엔진을 구축하는 방법
Aditya Kumar HackerNoon profile picture
0-item


추천 시스템은 우리 삶에 없어서는 안 될 필수 요소가 되었습니다. 이러한 지능형 알고리즘은 우리의 온라인 경험을 형성하고 우리가 소비하는 콘텐츠, 구매하는 제품, 탐색하는 서비스에 영향을 미치는 데 중추적인 역할을 합니다. Netflix 와 같은 플랫폼에서 콘텐츠를 스트리밍하든, Spotify 에서 새로운 음악을 찾든, 온라인 쇼핑을 하든 추천 시스템은 뒤에서 조용히 작동하여 상호 작용을 개인화하고 향상시킵니다.


이러한 추천 시스템의 고유한 요소는 과거 행동과 사용자 패턴을 기반으로 선호도를 이해하고 예측하는 능력입니다. 이러한 시스템은 우리의 과거 선택을 분석하여 맞춤형 제안을 선별하여 시간과 노력을 절약하는 동시에 우리의 관심사에 맞는 콘텐츠/제품을 소개합니다. 이는 사용자 만족도를 높이고 발견을 촉진하여 다른 방법으로는 접하지 못했을 새롭고 관련성 높은 제품을 소개합니다.


높은 수준에서 개발자는 이러한 알고리즘이 기계 학습 및 딥 러닝 시스템(신경망이라고도 함)에 의해 구동된다는 것을 이해합니다. 하지만 신경망을 배포하는 수고를 겪지 않고 추천 엔진을 구축할 수 있는 방법이 있다고 말하면 어떻게 될까요? 넷 또는 기계 학습 모델?


이 질문은 초기 및 중간 단계 스타트업의 맥락에서 특히 관련이 있습니다. 왜냐하면 스타트업에는 모델을 훈련할 수 있는 구조화된 데이터가 많지 않기 때문입니다. 그리고 우리가 이미 알고 있듯이 대부분의 기계 학습 모델은 적절한 교육 데이터 없이는 정확한 예측을 제공하지 않습니다.


저는 최근에 기본 추천 엔진을 구축하고 배포했습니다. 음성 우선 소셜 네트워크 , 이로 인해 주요 지표가 40% 증가했습니다. 이 블로그를 작성하는 시점에 시스템은 매달 3천만 개가 넘는 추천을 생성하고 있습니다. 이 추천 시스템은 소셜 네트워크용으로 구축되었지만 제품 추천, 음악 추천, 텍스트 및 비디오 플랫폼의 콘텐츠 추천 등 모든 사용 사례에 기본 아키텍처를 적용할 수 있습니다. 문제 설명을 설명하는 것부터 시작하겠습니다.


엔지니어링 관점에서 본 문제 설명

나는 광범위한 제품 요구 사항 문서 그리고 후속 엔지니어링 요구 사항 문서 이미 매일 수천 명의 사용자가 사용하는 제품에 대한 추천 시스템을 구축하고 있었기 때문입니다. 하지만 이 블로그를 짧고 정확하게 유지하기 위해 높은 수준의 요구 사항만 작성한 다음 동일한 솔루션에 대해 논의하겠습니다. 귀하의 제품에 대한 추천 시스템(단순 또는 신경망 기반)을 구축하고 있는데 어딘가에 갇혀 있다면 언제든지 저에게 연락하십시오. 트위터 또는 링크드인 , 귀하의 질문에 기꺼이 답변해 드리겠습니다.


높은 수준에서 우리는 엔지니어링 관점에서 다음과 같은 요구 사항을 갖고 있었습니다.


  1. 시스템은 키워드 형태로 사용자의 관심을 포착할 수 있어야 합니다. 또한 시스템은 특정 키워드에 대한 사용자의 관심도를 분류할 수 있어야 합니다.


  2. 시스템은 다른 사용자에 대한 사용자의 관심을 포착할 수 있어야 합니다. 다른 사용자가 만든 콘텐츠에 대한 사용자의 관심도를 분류할 수 있어야 합니다.


  3. 시스템은 사용자의 관심사에 따라 고품질 추천을 생성할 수 있어야 합니다.


  4. 시스템은 사용자가 이미 보거나 거부한 추천이 X일 동안 다시 나타나지 않도록 보장할 수 있어야 합니다.


  5. 시스템에는 동일한 작성자의 게시물이 동일한 페이지에 그룹화되지 않도록 하는 논리가 있어야 합니다 . 시스템은 사용자가 10개의 게시물(페이지 크기)을 소비하는 경우 해당 게시물이 모두 다른 작성자의 게시물인지 확인하기 위해 최선을 다해야 합니다.


  6. 시스템은 빨라야 합니다. P99 대기 시간은 150밀리초 미만입니다.


  7. 고가용성, 확장성, 보안, 신뢰성, 유지 관리 가능성 등 기타 모든 비기능적 요구 사항이 충족되어야 합니다.


다시 말하지만, 이것은 문제 설명의 매우 단순화된 목록입니다. 실제로 이 추천 엔진을 기존 시스템에 통합하는 동안 발생할 수 있는 많은 엣지 케이스와 코너 케이스를 다루었기 때문에 문서의 길이는 3000단어 이상이었습니다. 솔루션으로 넘어 갑시다.


솔루션 - 추천 엔진의 높은 수준의 작업

문제에 대한 해결책을 하나씩 논의한 다음 전체 시스템의 전반적인 작동을 설명하겠습니다.

첫 번째 문제는 사용자의 관심분야를 파악하고 특정 관심분야에 따라 관심도 수준을 정의하는 것입니다.

이를 위해 우리는 소셜 그래프 . 간단히 말해서 소셜 그래프는 소셜 네트워크에 있는 다양한 개체 간의 관계와 연결을 저장합니다. 이러한 엔터티는 서로 다른 사용자일 수도 있고 특정 관심 분야를 가진 사용자의 관계일 수도 있습니다. 소셜 그래프는 특정 시스템 내의 관계를 이해하고 구조화하는 강력한 방법입니다. 간결함을 위해 소셜 그래프에 대해 자세히 설명하지는 않지만, 구글링을 추천해 드리고 자세히 알아보도록 하겠습니다. 다음은 추천 엔진을 위해 구축한 소셜 그래프의 단순화된 버전입니다.


샘플 소셜 그래프


위 이미지에서 볼 수 있듯이 우리는 상호작용(좋아요, 댓글, 공유) 횟수와 이러한 상호작용의 최신성(마지막으로 발생했을 때) 등 많은 정보를 두 사용자 간의 관계 데이터로 저장하고 있습니다. 사용자와 관심. 우리는 두 개의 서로 다른 관심 키워드 간의 관계도 저장하고 있습니다. 나는 사용했다 아마존 해왕성 , AWS에서 관리하는 그래프 데이터베이스로 이 소셜 그래프를 저장합니다. Neo4j, JanusGraph, ArrangoDB 등과 같은 다른 그래프 데이터베이스를 사용할 수 있습니다.


이러한 관심 키워드는 주로 명사입니다. 게시물의 내용을 이러한 키워드(명사)로 분류하는 시스템이 있습니다. AWS Comprehend를 기반으로 합니다. 기계 학습을 사용하여 텍스트를 엔터티, 핵심 문구 등으로 나누는 자연어 처리(NLP) 서비스입니다. 마찬가지로 모든 관리형 NLP 서비스(여러 가지 사용 가능)를 사용하여 동일한 작업을 수행할 수 있습니다. 기계 학습 모델을 배우거나 배포할 필요가 없습니다! 이미 머신러닝을 이해하고 있다면 확인해 보세요. Huggingface의 오픈 소스 NLP 모델 .


두 번째 문제는 사용자의 관심을 기반으로 고품질 추천을 생성하는 것입니다.

다음 다이어그램은 시스템 작동 방식을 단순화하고 상위 수준으로 표현한 것입니다.

추천 시스템이 어떻게 작동하는지에 대한 단순화된 상위 수준 표현입니다.


위의 내용은 쉬워 보이지만 각 단계에서 더 많은 일이 진행되고 있으며 이러한 사항을 신중하게 고려한 다음 시스템이 최적으로 작동하도록 프로그래밍해야 합니다.


단계별로 설명하겠습니다.


1단계 - 게시물 콘텐츠를 벡터 임베딩으로 변환

이러한 추천을 생성하려면 먼저 게시물의 내용을 다음과 같은 것으로 변환해야 합니다. 벡터 임베딩 . 최근 LLM 브랜드가 상승하면서 OpenAI(ChatGPT 제조사)와 벡터 데이터베이스 , 벡터 임베딩은 일상적인 용어가 되고 있습니다. 그것이 무엇인지, 어떻게 작동하는지 자세히 설명하지는 않겠지만, 이에 대해 더 자세히 읽어 보시기를 적극 권장합니다. 그러나 피드에 대한 실행 가능한 후보를 생성하려면 콘텐츠 개인 정보 보호 및 조정(욕설, 남용, 성적인 콘텐츠, 괴롭힘 제거, 차단된 사용자 필터링 등)과 같은 사항도 고려해야 합니다.


벡터 임베딩을 생성하기 위해 사용 사례에 따라 OpenAI 임베딩 모델 , Amazon Titan 또는 오픈 소스 텍스트 임베딩 모델과 같은 주요 임베딩 모델을 사용할 수 있습니다. 우리는 친근한 가격, 성능 및 운영 용이성 때문에 Amazon Titan을 선택했습니다.


2단계 - 사용자 관심분야 쿼리

이제 상황이 흥미로워집니다. 특정 비즈니스 요구 사항에 따라 쿼리를 디자인할 수 있습니다. 예를 들어, 특정 키워드나 사용자에 대한 참여 수보다 관심사를 쿼리하는 동안 참여의 최신성에 더 많은 가중치를 부여합니다. 또한 사용자가 관심을 갖는 다양한 유형(키워드 또는 다른 사용자)을 찾기 위해 여러 병렬 쿼리를 실행합니다. 단일 사용자에 대해 여러 피드를 생성하므로 추세에 따라 특정 주제를 홍보하는 몇 가지 쿼리도 실행합니다. 예를 들어 크리스마스 근처에는 많은 크리스마스 관련 게시물이 표시되거나 지진이 발생한 경우 지진 관련 게시물이 표시됩니다. 말할 필요도 없이 이 주제는 사용자가 여정에서 관심을 표현한 경우에만 쿼리 결과에 나타납니다.


따라서 비즈니스 사용 사례와 구동하려는 동작에 적합한 논리를 선택하고 여러 쿼리를 실행하여 모든 사용자의 관심 사항이 포함된 충분히 큰 목록을 얻으세요.


3단계 - 찾은 관심분야를 기반으로 ANN 검색을 수행합니다.

벡터 데이터베이스는 주로 다음과 같은 특정 유형의 검색을 수행하는 데 사용됩니다. 대략적인 최근접 이웃 검색 (ANN). 다시 말하지만, 다양한 관심사를 분류하는 방식과 하나의 대규모 ANN 검색을 수행하는지 또는 병렬 차이 검색을 수행하는지 여부는 전적으로 사용 사례 및 비즈니스 요구 사항을 기반으로 해야 합니다. 최상의 최종 사용자 경험을 위해서는 집단 기반 검색 이상의 작업을 수행한 다음 결과를 정렬하는 것이 좋습니다(이 블로그 후반부에서 이에 대해 논의할 예정). 이 경우 ANN 검색은 플랫폼에서 사용자의 관심 사항과 유사한(가까운) 다른 게시물을 찾는 것입니다.


4단계 - 순서를 지정하여 결과를 캐시 데이터베이스에 저장합니다.

우리가 해결해야 할 문제 중 하나는 속도이기 때문에 캐시 데이터베이스입니다. 특정 사용자에 대한 게시물의 고유 ID를 저장하기 위해 redis 정렬 세트를 사용했습니다. 사용자 피드의 게시물 순서가 중요하기 때문에 redis 정렬 세트를 사용했습니다. 또한 해결해야 할 또 다른 문제는 " 시스템에는 동일한 작성자의 게시물이 동일한 페이지에 그룹화되지 않도록 하는 논리가 있어야 한다 "는 것입니다. 동일한 작성자의 콘텐츠가 반복되는 것을 피하기 위해 특정 작성자의 게시물이 특정 사용자의 피드(정렬된 집합)의 어느 위치에 삽입되면 동일한 작성자의 다른 게시물이 삽입되지 않도록 하는 간단한 알고리즘을 작성했습니다. 연속적인 10개의 위치에 대해(최종 사용자에게 피드를 제공하는 동안 페이지 크기는 10이므로 복잡성을 피하기 위해 정적으로 유지했습니다).


사용자의 특정 추천 순서를 결정하기 위해 다음 사항을 고려했습니다.


  1. 해당 사용자에 대한 특정 관심사(또는 다른 사용자)와의 관계 강도 : 소셜 그래프에서 다양한 데이터 포인트를 취하는 산술 공식에 의해 결정됩니다. 이 모든 것은 마지막으로 생성된 좋아요의 타임스탬프, 생성된 좋아요 수, 마지막 댓글 등과 같은 참여 데이터입니다. 사용자 참여 행동은 무언가에 대한 관심을 나타내는 지표입니다.


  2. 플랫폼에서 게시물의 인기도: 이를 결정하기 위해 우리는 참여, 노출 대 참여 비율, 참여한 고유 사용자 수 등과 같은 다양한 요소를 사용하여 해당 참여 점수를 생성하는 알고리즘을 만들었습니다. 플랫폼 수준에서 게시합니다.


일부 피드에서는 인기를 우선시합니다. 다른 경우에는 소셜 그래프를 우선시합니다. 그러나 대부분은 모두 이 둘의 건강한 혼합입니다.


시스템 작동 방식

위의 다이어그램에서 볼 수 있듯이 시스템은 의도적으로 매우 단순하게 유지되었습니다. 다음은 시스템 작동 방식입니다.


  1. 사용자 A가 게시물을 생성하면 게시물 서비스는 해당 게시물을 저장한 후 대기열에 게시/구독 이벤트를 트리거하며, 이는 후보 생성을 위한 백그라운드 서비스에서 수신됩니다. 우리는 사용 Google 게시/구독 게시/구독 기능을 위해.


  2. 이 백그라운드 서비스는 이를 비동기적으로 수신하고 앞서 설명한 기능(개인정보 확인, 조정 확인, 키워드 생성)을 수행한 다음 벡터 임베딩을 생성하여 벡터 데이터베이스에 저장합니다. 우리는 사용하고 있습니다 벡터 데이터베이스인 AstraDB (나중에 논의됨).


  3. 기본 NoSQL 데이터베이스를 업데이트한 후 사용자가 참여할 때마다(좋아요/댓글/공유 등) 사후 서비스는 추천 엔진 서비스에 게시/구독 이벤트를 트리거합니다.


  4. 이 추천 엔진 서비스는 ANN 검색을 수행하고 Redis 데이터베이스를 업데이트하여 그래프 데이터베이스를 업데이트한 다음 거의 실시간으로 사용자의 추천 피드를 업데이트합니다. 따라서 더 많은 사용자가 상호작용할수록 피드는 계속해서 좋아집니다. 권장사항이 특정 키워드 목록에 치우쳐 있지 않은지 확인하는 검사가 있습니다 . 그래프 데이터베이스를 쿼리하는 동안 이러한 검사가 수행됩니다. 또한 이 서비스는 참여 점수를 비동기식으로 업데이트합니다. 게시물을 보는 사용자에 대해서도 참여 점수가 다시 계산됩니다.


  5. 위의 모든 단계는 백그라운드에서 비동기적으로 수행되므로 이러한 계산은 최종 사용자 경험에 영향을 미치지 않습니다.


  6. 피드는 최종적으로 피드 서비스를 통해 최종 사용자에게 제공됩니다. 이 서비스는 redis와 기본 NoSQL 데이터베이스( 다이나모DB ), P99 대기 시간은 110밀리초 미만입니다. 두 데이터베이스 모두 규모에 관계없이 한 자릿수 밀리초의 대기 시간으로 쿼리 결과를 반환합니다.


사용된 도구 및 기술

  1. 일부 서비스는 다음으로 작성되었습니다. 프로그래밍 언어로 이동 , 다른 것들은 다음으로 작성되었습니다. NodeJS (타이프스크립트 사용).


  2. 우리는 사용하고 있습니다 Datastax의 AstraDB 벡터 데이터베이스로 사용됩니다. 우리는 Pinecone, MilvusWeaviate 와 같은 여러 다른 데이터베이스를 평가한 후 이 결정에 도달했습니다. 벡터 및 기타 데이터 유형에 대한 뛰어난 쿼리 및 인덱싱 기능 외에도 주머니에 친숙한 서버리스 가격 계획을 제공합니다. 이는 우리 플랫폼의 다른 여러 기능에서 데이터베이스로 사용하는 Cassandra 엔진 위에서 실행되며 매우 개발자 친화적인 CQL 쿼리 인터페이스를 제공합니다. 벡터 사용 사례에 시도해 볼 것을 적극 권장합니다.


  3. 우리는 사용 Google 게시/구독 비동기 통신의 경우 현재 규모(총 사용자 수는 소수, 일일 활성 사용자 수는 수천 명)에서는 비용 효율성이 매우 높기 때문입니다. 나는 초당 수천 개의 이벤트를 사용하여 소수의 lakh 사용자 규모로 실행했습니다. 잘 작동하며 사용 및 확장이 쉽습니다.


  4. 레디스 - 속도, 단순성 및 강력한 데이터 구조. 2024년에 왜 Redis를 사용하는지 논의할 필요는 없을 것 같습니다.


  5. DynamoDB - 확장성이 뛰어나고 사용하기 쉬우며 분당 수십만 건의 쿼리에도 불구하고 총 청구액이 상당히 낮은 서버리스 모드에서 실행합니다. 또한 읽기 및 쓰기 시 매우 강력한 인덱싱 기능과 한 자릿수 밀리초의 대기 시간을 제공합니다.


앞으로 해결해야 할 문제

상상할 수 있듯이 이와 동일한 설정을 조정하여 모든 사용 사례에 대한 기본 추천 엔진을 구축할 수 있습니다. 그러나 우리는 소셜 네트워크이기 때문에 이 시스템을 보다 효율적으로 만들기 위해서는 몇 가지 조정이 필요합니다.


  1. 사용자에게 가장 관련성이 높은 키워드와 사용자를 예측하려면 소셜 그래프 수준에서 머신러닝/딥러닝 알고리즘이 필요합니다. 현재로서는 데이터 세트가 너무 작아서 아주 새로운 제품이므로 정확하게 예측할 수 없습니다. 그러나 데이터가 증가함에 따라 현재의 간단한 쿼리와 수식을 기계 학습 알고리즘의 출력으로 대체해야 합니다.


  2. 다양한 키워드와 사용자 간의 관계를 미세 조정하고 더욱 세분화해야 합니다. 그들은 지금 매우 높은 수준에 있습니다. 하지만 더 깊은 내용이 필요합니다. 먼저 권장 사항을 구체화하려면 그래프에서 2차 및 3차 관계를 탐색해야 합니다.


  3. 현재는 임베딩 모델을 미세 조정하고 있지 않습니다. 우리는 가까운 장래에 그렇게 해야 할 것입니다.


끝 메모

이 블로그가 도움이 되었기를 바랍니다. 질문, 의심 또는 제안 사항이 있는 경우 언제든지 저에게 연락해 주십시오. 트위터 , 링크드인 또는 인스 타 그램 . 이 기사를 친구나 동료들과 공유하세요.


여기에도 게시되었습니다.