--- id: [[P-Reinforce|P-Reinforce]]-AUTO-HBS-001 category: AI_and_ML confidence_score: 1.00 tags: [auto-reinforced, hybrid-search, bm25, vector-search, rag, search-optimization] last_reinforced: 2026-05-04 --- # [[Hybrid Search|Hybrid Search]] ## πŸ“Œ ν•œ 쀄 톡찰 (The Karpathy Summary) > "κ²€μƒ‰μ˜ μ–‘μ†μž‘μ΄ μ „λž΅: ν‚€μ›Œλ“œ 기반의 μ •ν™•μ„±([[Keyword Search|Keyword Search]])κ³Ό λ¬Έλ§₯ 기반의 μœ μ—°μ„±([[Semantic Search|Semantic Search]])을 κ²°ν•©ν•˜μ—¬, μ–΄λ–€ ν˜•νƒœμ˜ μ§ˆλ¬Έμ—λ„ 졜적의 정닡을 μ°Ύμ•„λ‚΄λŠ” ν•˜μ΄λΈŒλ¦¬λ“œ 검색 μ•„ν‚€ν…μ²˜." ## πŸ“– κ΅¬μ‘°ν™”λœ 지식 (Synthesized Content) ν•˜μ΄λΈŒλ¦¬λ“œ 검색은 전톡적인 ν‚€μ›Œλ“œ 기반 검색과 ν˜„λŒ€μ μΈ 벑터 기반 의미둠적 검색을 ν†΅ν•©ν•˜μ—¬ μƒν˜Έλ³΄μ™„μ μœΌλ‘œ ν™œμš©ν•˜λŠ” κΈ°μˆ μž…λ‹ˆλ‹€. 1. **ꡬ성 μš”μ†Œ (The Duo)**: * **[[Keyword Search|Keyword Search]] (BM25)**: λ¬Έμ„œ λ‚΄ λ‹¨μ–΄μ˜ λΉˆλ„μ™€ ν¬μ†Œμ„±μ„ κ³„μ‚°ν•©λ‹ˆλ‹€. νŠΉμ • μš©μ–΄, λͺ¨λΈλͺ…, 고유 λͺ…사 검색에 맀우 μ •ν™•ν•©λ‹ˆλ‹€. * **[[Semantic Search|Semantic Search]] (Vector)**: ν…μŠ€νŠΈμ˜ 의미λ₯Ό 고차원 곡간에 λ§€ν•‘ν•©λ‹ˆλ‹€. λ™μ˜μ–΄, λ¬Έλ§₯, 질문의 μ˜λ„λ₯Ό νŒŒμ•…ν•˜λŠ” 데 νƒμ›”ν•©λ‹ˆλ‹€. 2. **κ²°ν•© 방식 (Fusion Logic)**: 두 λ°©μ‹μ—μ„œ λ„μΆœλœ κ²°κ³Όλ₯Ό ν•˜λ‚˜λ‘œ ν†΅ν•©ν•˜κΈ° μœ„ν•΄ μˆœμœ„λ₯Ό μž¬μ‘°μ •ν•˜λŠ” 과정이 ν•„μš”ν•©λ‹ˆλ‹€. * **Reciprocal Rank Fusion (RRF)**: 각 λ°©μ‹μ˜ μˆœμœ„(Rank)λ§Œμ„ μ‚¬μš©ν•˜μ—¬ κ°€μ€‘μΉ˜λ₯Ό λ§€κΈ°κ³  ν†΅ν•©ν•©λ‹ˆλ‹€. 점수 체계가 달라도 효과적으둜 κ²°ν•©ν•  수 μžˆμ–΄ κ°€μž₯ 널리 μ“°μž…λ‹ˆλ‹€. * **Weighted Scoring**: ν‚€μ›Œλ“œ μ μˆ˜μ™€ 벑터 μ μˆ˜μ— μž„μ˜μ˜ κ°€μ€‘μΉ˜(예: Keyword 0.3, Vector 0.7)λ₯Ό κ³±ν•˜μ—¬ ν•©μ‚°ν•©λ‹ˆλ‹€. 3. **μ™œ ν•˜μ΄λΈŒλ¦¬λ“œμΈκ°€?**: * 벑터 검색은 'iPhone 15 Pro'와 같은 νŠΉμ • μ œν’ˆλͺ…을 찾을 λ•Œ '슀마트폰' κ΄€λ ¨ λ¬Έμ„œλ₯Ό κ°€μ Έμ˜€λŠ” λ“± μ§€λ‚˜μΉ˜κ²Œ μΌλ°˜ν™”λ  μœ„ν—˜μ΄ μžˆμŠ΅λ‹ˆλ‹€. * ν‚€μ›Œλ“œ 검색은 '지식 관리 방법'을 물을 λ•Œ 'PKM'μ΄λ‚˜ 'Second Brain' 같은 μœ μ˜μ–΄κ°€ ν¬ν•¨λœ 핡심 λ¬Έμ„œλ₯Ό 놓칠 수 μžˆμŠ΅λ‹ˆλ‹€. * ν•˜μ΄λΈŒλ¦¬λ“œλŠ” 이 두 μ‚¬κ°μ§€λŒ€λ₯Ό λͺ¨λ‘ λ³΄μ™„ν•©λ‹ˆλ‹€. ## βš–οΈ Trade-offs & Caveats * **μ‹œμŠ€ν…œ λ³΅μž‘λ„**: 두 μ’…λ₯˜μ˜ 인덱슀(Inverted Index & Vector Index)λ₯Ό μœ μ§€ν•˜κ³  관리해야 ν•˜λ―€λ‘œ 운영 λ¦¬μ†ŒμŠ€κ°€ μ¦κ°€ν•©λ‹ˆλ‹€. * **Fusion νŒŒλΌλ―Έν„° νŠœλ‹**: 도메인 νŠΉμ„±μ— 따라 ν‚€μ›Œλ“œμ™€ 벑터 쀑 μ–΄λŠ μͺ½μ— 더 무게λ₯Ό λ‘˜μ§€ κ²°μ •ν•˜λŠ” νŠœλ‹ 과정이 ν•„μš”ν•©λ‹ˆλ‹€. * **μ˜€λ²„ν—€λ“œ**: 두 번의 검색 과정을 거쳐야 ν•˜λ―€λ‘œ Naive RAG λŒ€λΉ„ 응닡 속도가 μ†Œν­ 느렀질 수 μžˆμŠ΅λ‹ˆλ‹€. ## πŸ’» μ‹€μ „ κ΅¬ν˜„ μ½”λ“œ (Boilerplate) Python ν™˜κ²½μ—μ„œ `RRF(Reciprocal Rank Fusion)`λ₯Ό κ΅¬ν˜„ν•˜λŠ” 핡심 κ°œλ… λ‘œμ§μž…λ‹ˆλ‹€. ```python def reciprocal_rank_fusion(keyword_results, vector_results, k=60): """ keyword_results, vector_results: [(id, rank), ...] ν˜•νƒœμ˜ 리슀트 """ scores = {} # 1. ν‚€μ›Œλ“œ κ²°κ³Ό 점수 ν•©μ‚° for doc_id, rank in keyword_results: scores[doc_id] = scores.get(doc_id, 0) + 1 / (k + rank) # 2. 벑터 κ²°κ³Ό 점수 ν•©μ‚° for doc_id, rank in vector_results: scores[doc_id] = scores.get(doc_id, 0) + 1 / (k + rank) # 3. 점수 높은 순으둜 μ •λ ¬ν•˜μ—¬ μ΅œμ’… μˆœμœ„ λ„μΆœ final_rank = sorted(scores.items(), key=lambda x: x[1], reverse=True) return final_rank # μ˜ˆμ‹œ 데이터 kw_res = [("docA", 1), ("docB", 2)] vec_res = [("docC", 1), ("docA", 2)] final = reciprocal_rank_fusion(kw_res, vec_res) print(f"Fused Results: {final}") ``` ## πŸ”— 지식 μ—°κ²° (Graph) * **기반 기술**: [[Information Retrieval (IR)|Information Retrieval (IR)]], [[BM25|BM25]], [[Vector Search|Vector Search]] * **ν™œμš© μ•„ν‚€ν…μ²˜**: [[Retrieval-Augmented Generation (RAG)|Advanced RAG]], [[Enterprise Search|μ—”ν„°ν”„λΌμ΄μ¦ˆ 검색]] * **평가 μ§€ν‘œ**: [[nDCG|nDCG]], [[MAP|MAP]] --- *Last updated: 2026-05-04*