Multi Threading 적용 및 사용자 피드백 기반 유지 보수 - 100-hours-a-week/12-marong-Wiki GitHub Wiki

📍 Multi Threading

멀티 스레딩 적용을 통한 장소 추천 속도 최적화

from concurrent.futures import ThreadPoolExecutor

with ThreadPoolExecutor(max_workers=3) as executor:
    futures = [
        executor.submit(process_pair, pair, week_index, chroma_client, embedding_model, mbti_model)
        for pair in pairs
    ]

ThreadPoolExecutor를 통해 스레드의 개수를 3으로 정하고 멀티스레딩

max_worker 값 평균 응답 시간 (ms) 안정성 비고
2 498ms 안정적 별도 오류 없음, 모든 기기에서 안정 작동
3 267ms 안정적 속도 대폭 개선, 오류 없이 안정 작동
4 이상 230ms 일부 불안정 특정 기기(CPU 환경)에서 illegal instruction / segmentation fault와 같은 C++ 관련 오류가 발생하기도 함


멀티 스레드 개수를 과다하게 증가하였을 때 발생하는 문제

zsh: illegal hardware instruction  python main.py
  • C++ 레벨에서 CPU instruction set을 잘못 사용하거나 메모리 접근 충돌 발생
  • 따라서 안정성과 속도 최적화 측면을 고려할 때 max_worker=3이 가장 균형적인 멀티 스레드 개수라고 판단하여 코드에 반영


📍 사용자 피드백 기반 유지 보수

  • 추천 로직 특성 상 MBTI, 선호/비선호 음식, 식당/카페의 메타데이터(거리, 평균 별점)이 반영되며 본인과 마니띠의 성향을 평균내어 추천하는 방식이므로 개인이 싫어하는 음식이 충분히 고려되지 않는 문제가 있었음
  • 따라서 싫어하는 음식의 음의 가중치 반영을 더욱 강화하였음
# 기존 코드
def recommend(self, lat, lng, radius_km=10.0, top_k=5, like_foods=[], dislike_foods=[]):
        try:
            food_embs = []
            for food in like_foods:
                food_embs.append(1.5 * self.embedding_model.encode(food, convert_to_tensor=True, device=self.device))
            for food in dislike_foods:
                food_embs.append(-1.5 * self.embedding_model.encode(food, convert_to_tensor=True, device=self.device))
# 변화 코드
def recommend(self, lat, lng, radius_km=10.0, top_k=5, like_foods=[], dislike_foods=[]):
        try:
            food_embs = []
            for food in like_foods:
                food_embs.append(1.5 * self.embedding_model.encode(food, convert_to_tensor=True, device=self.device))
            for food in dislike_foods:
                food_embs.append(-4.5 * self.embedding_model.encode(food, convert_to_tensor=True, device=self.device))

향후 사용자와 마니띠의 추천 점수를 별도 계산하여 유지, 보수 기간에 다음과 같이 추천 산식을 정교화할 계획임.

후보 함수: 시그모이드 함수, 가우시안 함수(RBF)

경우 추천 점수
두 수가 양이고 임베딩 벡터 간 차이가 작다 높음
두 수가 양이지만 임베딩 벡터 간 차이가 크다 낮음
두 수가 음이고 임베딩 벡터 간 차이가 작다 낮음
두 수가 음이고 임베딩 벡터 간 차이가 크다 매우 낮음
# 시그모이드 함수

import math
def sigmoid(x):
    return 1 / (1 + math.exp(-x))
# 가우시안 함수

import math
def gaussian_similarity(a, b, sigma=1.0):
    diff = a - b
    return math.exp(- (diff ** 2) / (2 * sigma ** 2))
⚠️ **GitHub.com Fallback** ⚠️