"매 search = 매 space 의 매 traverse 를 매 objective 의 만족 까지". 매 algorithmic search (BFS/DFS/A*) 부터 매 information retrieval (lexical + semantic) 까지 매 unify 하는 매 abstraction. 매 2026 년 의 search 는 매 vector embedding + LLM rerank + agent loop 의 매 hybrid stack.
매 핵심
매 search 의 두 의미
Algorithmic search: 매 state space 의 매 traverse — 매 BFS, DFS, A*, MCTS.
Information retrieval (IR): 매 corpus 에서 매 query 에 매 relevant document 추출 — 매 BM25, dense vector, hybrid.
매 generative answer: LLM (Claude Opus 4.7 / GPT-5) 의 매 retrieved context 의 매 grounded answer.
매 agent loop: 매 multi-hop — 매 search → 매 reason → 매 search again.
매 응용
RAG: 매 LLM 의 매 long-tail knowledge 보강.
Code search: 매 codebase semantic + AST search.
Pathfinding: 매 robotics, game AI.
Game tree: 매 chess/go 의 매 minimax + MCTS.
Web search: 매 Google, Bing, Perplexity, Exa, Tavily.
💻 패턴
Pattern 1: Hybrid retrieval (BM25 + dense)
fromrank_bm25importBM25Okapiimportnumpyasnpfromsklearn.metrics.pairwiseimportcosine_similarityclassHybridRetriever:def__init__(self,docs,embeddings,embed_fn):self.docs=docsself.bm25=BM25Okapi([d.split()fordindocs])self.embs=embeddingsself.embed_fn=embed_fndefsearch(self,query,k=10,alpha=0.5):bm25_scores=self.bm25.get_scores(query.split())q_emb=self.embed_fn(query)dense_scores=cosine_similarity([q_emb],self.embs)[0]# 매 normalize + weighted combine.bm25_n=(bm25_scores-bm25_scores.min())/(bm25_scores.ptp()+1e-9)dense_n=(dense_scores-dense_scores.min())/(dense_scores.ptp()+1e-9)scores=alpha*dense_n+(1-alpha)*bm25_ntop=np.argsort(-scores)[:k]return[(self.docs[i],scores[i])foriintop]
Pattern 2: Reciprocal rank fusion
defrrf(rankings:list[list[int]],k=60):"""매 rankings: 각 retriever 의 매 doc-id ordered list."""scores={}forrankinginrankings:forrank,doc_idinenumerate(ranking):scores[doc_id]=scores.get(doc_id,0)+1/(k+rank)returnsorted(scores,key=scores.get,reverse=True)
Pattern 3: LLM rerank
importanthropicclient=anthropic.Anthropic()asyncdefllm_rerank(query:str,candidates:list[str],top_k=5):prompt=f"""Rate each document 1-10 for relevance to query.
Query: {query}Documents:
{chr(10).join(f'[{i}] {c[:300]}'fori,cinenumerate(candidates))}Output JSON: {{"scores": [{{"id": 0, "score": 8.5}}, ...]}}"""msg=awaitclient.messages.create(model="claude-opus-4-7",max_tokens=1024,messages=[{"role":"user","content":prompt}],)importjson,redata=json.loads(re.search(r"\{.*\}",msg.content[0].text,re.S).group())ranked=sorted(data["scores"],key=lambdax:-x["score"])[:top_k]return[candidates[r["id"]]forrinranked]