LLM & Generative AI/RAG in Practice

[LangChain RAG 구축 시리즈 Ep.16] 🧠 변환된 텍스트 문서를 OpenAI Embedding으로 벡터화하기

ygtoken 2025. 4. 5. 21:29
728x90

이 글에서는 이전에 생성한 .txt 형식의 자연어 문서를 OpenAI의 임베딩 모델을 활용해
벡터로 변환하고 ChromaDB에 저장하는 과정을 실습합니다.
이 벡터는 향후 검색(Retrieval)에서 핵심적인 역할을 하게 됩니다.


🎯 목표

  • .txt 문서를 읽어 자연어 텍스트로 로딩
  • OpenAI 임베딩 모델을 통해 벡터 생성
  • ChromaDB에 벡터를 저장하여 추후 검색 가능하도록 구성

🗂️ 파일 구성 예시

rag-iceberg-project/
├── docs/products.txt                  ← 이전 글에서 생성된 자연어 문서
├── chroma_db/                         ← 벡터 DB 저장 디렉토리
└── src/embed_documents.py            ← 이번 글에서 작성할 코드

🧠 Step 1. 텍스트 문서 로딩 및 임베딩 처리 함수

# src/embed_documents.py

import os                                           # 경로 처리를 위한 표준 모듈
from langchain.embeddings import OpenAIEmbeddings   # OpenAI 임베딩 클래스
from langchain.vectorstores import Chroma           # Chroma 벡터 저장소

def embed_and_store_text(doc_path: str, db_path: str, collection_name: str):
    """
    텍스트 문서를 로딩 → 임베딩 → ChromaDB에 저장
    """

    # 1. 텍스트 문서 불러오기 (.txt 파일 읽기)
    with open(doc_path, "r", encoding="utf-8") as f:
        text = f.read()  # 전체 내용을 하나의 문자열로 로드

    # 2. LangChain 임베딩 모델 초기화 (OpenAI 사용)
    embedding_model = OpenAIEmbeddings()  # 기본적으로 text-embedding-ada-002 사용

    # 3. 텍스트 문서를 임베딩하고 Chroma DB로 저장
    vectordb = Chroma.from_texts(
        texts=[text],                      # 벡터화할 텍스트 목록 (리스트 형태)
        embedding=embedding_model,         # 사용할 임베딩 모델
        persist_directory=db_path,         # 로컬 DB 저장 경로
        collection_name=collection_name    # 컬렉션 이름
    )

    # 4. 벡터 DB 디스크에 저장 (persist 필수)
    vectordb.persist()

    # 5. 완료 메시지 출력
    print(f"✅ 벡터 저장 완료: {db_path}/{collection_name}")

▶️ Step 2. main.py에서 호출 예시

# main.py

from src.embed_documents import embed_and_store_text  # 벡터 저장 함수 불러오기

# ✅ 파일 경로 지정
doc_path = "docs/products.txt"             # 전처리된 자연어 문서
db_path = "chroma_db"                      # 벡터 저장 위치
collection_name = "iceberg_tables"         # 벡터 컬렉션 이름

# ✅ 실행
embed_and_store_text(doc_path, db_path, collection_name)

✅ 출력 결과:

✅ 벡터 저장 완료: chroma_db/iceberg_tables

Chroma는 지정된 chroma_db/ 경로에 임베딩 데이터를 저장하고, 이후 검색기로 활용할 수 있게 됩니다.


💡 보충 팁: 여러 문서 저장도 가능할까?

물론입니다. texts=[text1, text2, ...] 형식으로 리스트를 구성하면
여러 문서를 동시에 벡터화하고 저장할 수 있습니다.


📎 요약 및 핵심 정리

  • .txt 형태의 자연어 문서를 OpenAI 임베딩을 통해 벡터로 변환했습니다.
  • ChromaDB에 저장된 벡터는 향후 질문-답변 검색 흐름에서 핵심 역할을 수행합니다.
  • embed_and_store_text() 함수는 다양한 문서에도 확장 가능합니다.
728x90