[AI]4단계_LangChain_기반_멀티스텝_AI_구현_검토_성향기반_장소추천 - 100-hours-a-week/12-marong-Wiki GitHub Wiki

LangChain Retrieval 기반 추론 흐름 설계

1. 개요

  • 직접 함수 호출 및 배치 실행: Python 스크립트 실행, 배치 스크립트로 일괄 추천 결과 저장
  • 입력값: 사용자 ID, MBTI/음식/취미 임베딩, 위경도, 선호, 반경 등
  • DB 저장: 추천 결과는 MySQL(추천 세션) + ChromaDB(히스토리/임베딩) 동시 저장
  • LLM/자연어 미사용: LLM 응답이 아닌 벡터/수치 기반 추천

2. 함수 호출 예시

recommend_places_for_pair(
    manitto_id="1001",
    manittee_id="1002",
    manitto_mbti_vector=[...],
    manittee_mbti_vector=[...],
    manitto_food_vector=[...],
    manittee_food_vector=[...],
    latitude=37.4011,
    longitude=127.1062,
    max_distance=2000,
    top_k=10,
)

파라미터 설명

  • manitto_id, manittee_id: 마니또/마니띠 식별자
  • *_mbti_vector: 각 유저별 MBTI 임베딩 벡터 (보통 768차원)
  • *_food_vector: 각 유저별 음식 선호 임베딩 벡터
  • latitude, longitude: 기준 위치
  • max_distance: 검색 반경 (미터)
  • top_k: 반환할 최상위 장소 개수

3. 처리 단계 요약

  1. 입력값 수집: 각 쌍의 정보 벡터화
  2. ChromaDB 벡터 검색: 장소 임베딩 벡터와 유저 쌍 벡터의 유사도 기반 TOP-K 후보 추출
  3. 평점/거리/유사도 기반 가중치 계산:
    • 리뷰 평점, 위경도 거리, 음식/MBTI 임베딩 유사도 각각 엔트로피 가중치 방식으로 점수화
    • 최종 Score = f(평점, 거리, 유사도)
  4. DB 저장:
    • 추천 결과(장소/점수/상세정보)는 MySQL,
    • 추천 임베딩 및 검색 히스토리는 ChromaDB에 저장

4. 실제 구현 예시 (간소화 버전)

def recommend_places_for_pair(
    manitto_id, manittee_id,
    manitto_mbti_vector, manittee_mbti_vector,
    manitto_food_vector, manittee_food_vector,
    latitude, longitude, max_distance=2000, top_k=10
):
    # (1) 벡터 평균 및 가중치 조합
    pair_vector = weighted_average(
        [manitto_mbti_vector, manittee_mbti_vector,
         manitto_food_vector, manittee_food_vector]
    )
    # (2) 장소 후보 ChromaDB 벡터 유사도 TOP-K
    candidates = chroma_query_top_k(
        embedding=pair_vector,
        latitude=latitude, longitude=longitude,
        max_distance=max_distance, k=top_k*2
    )
    # (3) 각 후보에 대해 평점, 거리, 유사도 엔트로피 가중 합산
    results = []
    for cand in candidates:
        score = calc_final_score(
            rating=cand['rating'],
            dist=haversine(latitude, longitude, cand['lat'], cand['lng']),
            sim=cand['similarity']
        )
        results.append({**cand, "score": score})
    # (4) 상위 top_k 추출
    results = sorted(results, key=lambda x: -x["score"])[:top_k]
    # (5) 결과 MySQL/ChromaDB에 저장
    save_recommendation(manitto_id, manittee_id, results)
    return results

5. 기대 효과

  • 명시적 함수 인자만으로 추천 프로세스 자동화 (API, 자연어 불필요)
  • 대량/병렬 처리 최적화: ThreadPoolExecutor로 N쌍 일괄 처리 가능
  • 디버깅/유지보수 용이: 함수 호출 기록, 입력/출력 추적
  • DB 이중 저장: 추천 결과 이력 관리 및 재현 가능

6. 확장 전략

  • 파라미터 추가: 혼잡도, 가격대 등 입력 확장 용이
  • 스코어링 함수 유연화: 엔트로피 가중치/선형 결합 등 실험 가능
  • 쿼리 히스토리 기반 추가 필터: 추천 다양성, 중복제거, 취소/거부 반영 등

7. 핵심 변화 요약

기존 (LangChain + RetrievalQA) 변경 (스크립트 기반 배치 추천)
LLM 자연어 쿼리 + JSON 함수 인자 기반 명시적 호출
RetrievalQA 등 LLM 체인 PyTorch 임베딩/ChromaDB/수치 계산
API 통신, LLM inference 배치 스크립트/DB 직접 저장
LLM 답변 다양성에 의존 명확한 가중치 기반 점수 산출, 결과 일관성