[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. 처리 단계 요약
- 입력값 수집: 각 쌍의 정보 벡터화
- ChromaDB 벡터 검색: 장소 임베딩 벡터와 유저 쌍 벡터의 유사도 기반 TOP-K 후보 추출
- 평점/거리/유사도 기반 가중치 계산:
- 리뷰 평점, 위경도 거리, 음식/MBTI 임베딩 유사도 각각 엔트로피 가중치 방식으로 점수화
- 최종 Score = f(평점, 거리, 유사도)
- 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 답변 다양성에 의존 |
명확한 가중치 기반 점수 산출, 결과 일관성 |