멀티 벡터 검색에서 직접 따라간 구현 흐름과 코드 증거를 다시 볼 수 있게 정리한 LLM 학습 기록입니다. 본문은 멀티 벡터 검색 (Multi-Vec…, 환경 설정, 실습 - 요약으로 검색 → 원본 반환 순서로 핵심 장면을 먼저 훑고, 멀티 벡터 시스템 초기화, 문서 인덱싱 (요약 → 원본 매핑), 멀티 벡터 검색 테스트 같은 코드로 실제 구현을 이어서 확인할 수 있습니다. ipynb/md 원본과 19개 코드 블록, 16개 실행 셀을 함께 남겨 구현 흐름을 다시 따라갈 수 있게 정리했습니다. 주요 스택은 langchain, os, uuid, getpass입니다.

빠르게 볼 수 있는 포인트: 멀티 벡터 검색 (Multi-Vector Retrieval) 실습, 환경 설정, 실습 - 요약으로 검색 → 원본 반환.

남겨둔 자료: ipynb/md 원본과 19개 코드 블록, 16개 실행 셀을 함께 남겨 구현 흐름을 다시 따라갈 수 있게 정리했습니다. 주요 스택은 langchain, os, uuid, getpass입니다.

주요 스택: langchain, os, uuid, getpass, datasets

Snapshot

Item Value
Track LLM
Type Archive Note
Source Files ipynb, md
Code Blocks 19
Execution Cells 16
Libraries langchain, os, uuid, getpass, datasets, langchain_openai, langchain_core, langchain_chroma
Source Note 3-5 (실습)멀티_벡터_검색

What This Note Covers

멀티 벡터 검색 (Multi-Vector Retrieval) 실습

LangChain 1.0+ / GPT-4o-mini / 네이버 뉴스 데이터셋

  • 읽을 포인트: 세부 흐름: 멀티 벡터 검색이란?

멀티 벡터 검색이란?

💡 멀티 벡터 검색이란?는 이 노트에서 핵심 구현을 보여주는 코드 블록입니다. 원본 노트에서 구현 흐름을 가장 잘 보여주는 핵심 코드 중 하나입니다.

환경 설정

환경 설정 코드를 직접 따라가며 환경 설정 흐름을 확인했습니다.

  • 읽을 포인트: 환경 설정 아래 코드와 함께 읽으면 구현 포인트가 더 또렷해지는 구간입니다.

실습 - 요약으로 검색 → 원본 반환

멀티 벡터 시스템 초기화, 멀티 벡터 검색 테스트, RAG 시스템 구축 같은 코드를 직접 따라가며 실습 - 요약으로 검색 → 원본 반환 흐름을 확인했습니다.

  • 읽을 포인트: 세부 흐름: 멀티 벡터 시스템 초기화, 멀티 벡터 검색 테스트, RAG 시스템 구축

멀티 벡터 시스템 초기화

실습 - 요약으로 검색 → 원본 반환 > 멀티 벡터 시스템 초기화 아래 코드와 함께 읽으면 구현 포인트가 더 또렷해지는 구간입니다.

멀티 벡터 검색 테스트

실습 - 요약으로 검색 → 원본 반환 > 멀티 벡터 검색 테스트 아래 코드와 함께 읽으면 구현 포인트가 더 또렷해지는 구간입니다.

RAG 시스템 구축

검색과 컨텍스트 주입 단계를 실제 코드로 묶어 보는 구간입니다.

Why This Matters

RAG 검색 파이프라인

  • 왜 필요한가: LLM이 외부 지식을 안정적으로 참조하게 하려면, 생성 전에 관련 문서를 정확히 찾아오는 검색 단계가 먼저 필요합니다.
  • 왜 이 방식을 쓰는가: 이 방식은 모델 파라미터만 믿지 않고 최신 문서나 도메인 지식을 붙일 수 있어서 실제 서비스형 QA에 적합합니다.
  • 원리: 문서를 청크로 나누고 임베딩한 뒤, 질문과 가까운 벡터를 검색해 프롬프트에 함께 넣는 구조로 동작합니다.

임베딩과 표현 학습

  • 왜 필요한가: 텍스트나 토큰을 그대로는 모델이 다룰 수 없기 때문에, 의미를 담은 수치 벡터 표현으로 바꾸는 단계가 필요합니다.
  • 왜 이 방식을 쓰는가: Word2Vec, FastText, GloVe 같은 방식은 같은 단어라도 주변 문맥이나 서브워드 정보를 반영해 비교 가능한 표현 공간을 만듭니다.
  • 원리: 자주 함께 등장하는 단어는 가까운 벡터가 되도록 학습해, 의미적으로 비슷한 표현이 공간에서도 가까워지게 합니다.

프롬프트 체인 구성

  • 왜 필요한가: LLM 호출을 재현 가능하게 만들려면 입력 조합, 프롬프트 템플릿, 후처리 순서를 구조화할 필요가 있습니다.
  • 왜 이 방식을 쓰는가: 체인 구조는 실험 중 프롬프트와 입력 변형을 비교하기 쉽고, 이후 RAG나 에이전트 단계로 확장하기도 좋습니다.
  • 원리: 질문과 컨텍스트를 정해진 템플릿에 넣고, 모델 호출 결과를 다음 단계 입력으로 넘기며 처리 흐름을 구성합니다.

Implementation Flow

  1. 멀티 벡터 검색 (Multi-Vector Retrieval) 실습: 멀티 벡터 검색이란?
  2. 환경 설정: 환경 설정 코드를 직접 따라가며 환경 설정 흐름을 확인했습니다.
  3. 실습 - 요약으로 검색 → 원본 반환: 멀티 벡터 시스템 초기화, 멀티 벡터 검색 테스트

Code Highlights

멀티 벡터 시스템 초기화

멀티 벡터 시스템 초기화는 이 노트에서 핵심 구현을 보여주는 코드 블록입니다. 코드 안에서는 parent 문서 저장 (docstore 역할), 예: docstore = { “A”: Document(…), “B”: Document…, MultiVectorRetriever 기능 구현 흐름이 주석과 함께 드러납니다.

from langchain_core.documents import Document
from langchain_core.runnables import RunnableLambda

# -------------------------------------------------------
# 1) parent 문서 저장 (docstore 역할)
# -------------------------------------------------------
# 예: docstore = { "A": Document(...), "B": Document(...) }
parent_store = docstore

# -------------------------------------------------------
# 2) MultiVectorRetriever 기능 구현
#    - child 벡터 저장소 = vectorstore
#    - parent 문서 = parent_store
#    - id_key = "doc_id"
# -------------------------------------------------------
def multivector_retrieve(query):
    # 1. child 문서 검색
    child_docs = vectorstore.similarity_search(query, k=5)

    # 2. child -> parent id 매핑
    parent_ids = {doc.metadata["doc_id"] for doc in child_docs}

    # 3. parent 문서 반환
    parent_docs = [parent_store[id] for id in parent_ids in id in parent_store]

    return parent_docs

# LCEL Runnable 형태의 retriever 만들기 (MultiVectorRetriever 대체)
# ... trimmed ...

문서 인덱싱 (요약 → 원본 매핑)

문서 인덱싱 (요약 → 원본 매핑)는 이 노트에서 핵심 구현을 보여주는 코드 블록입니다. 코드 안에서는 고유 ID 생성, 원본 문서 (DocStore 저장용), 요약 문서 (VectorStore 검색용) 흐름이 주석과 함께 드러납니다.

import uuid
from langchain_core.documents import Document

doc_ids = []
summary_docs = []
full_docs = []

for idx, item in enumerate(data):
    # 고유 ID 생성
    doc_id = str(uuid.uuid4())
    doc_ids.append(doc_id)

    # -------------------------
    # 1) 원본 문서 (DocStore 저장용)
    # -------------------------
    full_doc = Document(
        page_content=item['document'],
        metadata={
            "doc_id": doc_id,
            "title": item.get('title', f'뉴스_{idx}'),
            "type": "full_document"
        }
    )
    full_docs.append(full_doc)

    # -------------------------
    # 2) 요약 문서 (VectorStore 검색용)
    # -------------------------
# ... trimmed ...

멀티 벡터 검색 테스트

멀티 벡터 검색 테스트는 이 노트에서 핵심 구현을 보여주는 코드 블록입니다. 코드 안에서는 dict 하나를 입력으로 전달 흐름이 주석과 함께 드러납니다.

def search_documents(query, k=3):
    print(f"검색 쿼리: {query}")
    print("="*80)

    # dict 하나를 입력으로 전달
    results = retriever.invoke({"query":query, "k":k})

    print(f"검색 결과: {len(results)}개 문서")

    for i, doc in enumerate(results, 1):
        print(f"\n[문서 {i}]")
        print(f"제목: {doc.metadata.get('title', 'N/A')[:70]}")
        print(f"타입: {doc.metadata.get('type', 'N/A')}")
        print(f"길이: {len(doc.page_content)}자")
        print(f"내용 미리보기:")
        print(f"{doc.page_content[:200]}...")

    print("="*80)
    return results

print("검색 함수 준비 완료")

RAG 시스템 구축

RAG 시스템 구축는 이 노트에서 핵심 구현을 보여주는 코드 블록입니다. 코드 안에서는 문서 검색, 컨텍스트 생성, 답변 생성 흐름이 주석과 함께 드러납니다.

def ask_question(question, k=3):
    print("질문: {question}")
    print("="*80)

    # 문서 검색
    docs = retriever.invoke({"query": question, "k":k})
    print(f"검색 완료")

    if not docs:
        print("관련 문서를 찾지 못했습니다")
        return None

    for i, doc in enumerate(docs, 1):
        print(f"  {i}. {doc.metadata.get('title', 'N/A')[:60]}")

    # 컨텍스트 생성
    context = "\n".join([
        f"[기사 {i+1}] {doc.metadata.get('title', '')}\n{doc.page_content}"
        for i, doc in enumerate(docs)
    ])

    # 답변 생성
    print(f"\n GPT-4o-mini 답변 생성중")
    answer = rag_chain.invoke({"context": context, "question": question})


    print("\n" + "="*80)
    print(" 답변:")
# ... trimmed ...

Source Bundle

  • Source path: 13_LLM_GenAI/Code_Snippets/3-5 (실습)멀티_벡터_검색.md
  • Source formats: ipynb, md
  • Companion files: 3-5 (실습)멀티_벡터_검색.ipynb, 3-5 (실습)멀티_벡터_검색.md
  • Note type: code-note
  • Last updated in the source vault: 2026-03-08T03:33:14
  • Related notes: 13_LLM_code_Roadmap.md, 13_LLM_GenAI_Code_Summary.md
  • External references: localhost

Note Preview

LangChain 1.0+ / GPT-4o-mini / 네이버 뉴스 데이터셋