YYYEJI

[MAC] 문서 임베딩(Document Embedding) 코드 파해치기 본문

인공지능 챗봇

[MAC] 문서 임베딩(Document Embedding) 코드 파해치기

YEJI ⍢ 2025. 8. 5. 12:46
728x90
 

문서 임베딩(Document Embedding)이란?

문서 임베딩이란 텍스트를 벡터(숫자 배열)로 변환하는 과정입니다!!문서의 의미적 특성을 수치화하여, 컴퓨터가 이해하고 처리할 수 있는 형태로 변환합니다!! 문서 임베딩의 목적은?텍스트 간

yyyeji.tistory.com

↑↑↑  문서 임베딩이란  ↑↑↑

 

 

코드를 바로 살펴볼까요?🙋‍♀️

 

 

먼저 Embedding 모델을 생성합니다!

from langchain_openai import AzureOpenAIEmbeddings

# OpenAIEmbeddings 모델 생성
embeddings_model = AzureOpenAIEmbeddings(model = "text-embedding-3-small",
                                          dimensions=1024,
                                         )

# 임베딩 객체 출력
embeddings_model

# 임베딩 모델의 임베딩 차원 확인
embeddings_model.dimensions

저는 Azure 환경에서 OpenAI 임베딩 모델을 사용하는 클래스를 사용했구요

모델은 "text-embedding-3-small"을 사용한다고 지정했습니다.

(이 모델은 경량이면서 빠른 임베딩 생성이 가능해요!)

 

 

생성된 임베딩 객체 embeddings_model로

.embed_query() 또는 .embed_documents() 메소드를 사용할 수 있어요><

 

 

.embed_query(): 텍스트(쿼리)를 벡터로 변환

(사용자의 질문을 벡터화)

.embed_documents(): 여러 개의 텍스트를 한 번에 벡터로 변환

(모든 문서를 벡터 DB에 저장)

.embedding_ctx_length(): 해당 임베딩 모델이 할 번에 처리할 수 있는 최대 토큰 수 반환

 

 


.embed_documents

를 사용해보겠습니다!!

# 문서 컬렉션
documents = [
    "인공지능은 컴퓨터 과학의 한 분야입니다.",
    "머신러닝은 인공지능의 하위 분야입니다.",
    "딥러닝은 머신러닝의 한 종류입니다.",
    "자연어 처리는 컴퓨터가 인간의 언어를 이해하고 생성하는 기술입니다.",
    "컴퓨터 비전은 컴퓨터가 디지털 이미지나 비디오를 이해하는 방법을 연구합니다."
]

# 문서 임베딩
document_embeddings_openai = embeddings_model.embed_documents(documents)

# 임베딩 결과 출력
print(f"임베딩 백터의 개수: {len(document_embeddings_openai)}")
print(f"각 벡터의 차원: {len(document_embeddings_openai[0])}")

documents라는 문서 리스트를 준비했구요!

 

 

.embed_documents() 메소드를 통해 여러 문서를 한 번에 임베딩(문서→숫자)해준 뒤

임베딩 결과를 확인해줬습니다.

 

 

임베딩 벡터의 개수 == 문서 개수

(벡터는 텍스트의 의미를 수치로 표현한 것)

각 벡터의 차원은 임베딩 모델에 따라 고정됩니다!

 

 


.embed_query

를 사용해보면

q = embeddings_model.embed_query("인공지능이란 무엇인가요?")   # 질문도 임베딩 해야됨

# 쿼리 임베딩 결과 출력
len(q)
print(q)

한 개의 질문(텍스트)를 벡터로 변환해서 

결과는 1차원 리스트(벡터)로 반환돼요!

 


임베딩한 벡터를 가지고 가장 비슷한 문서를 찾아볼게요!

from langchain_community.utils.math import cosine_similarity   # cosine 유사도 검사
import numpy as np

# 쿼리와 가장 유사한 문서 찾기 함수
def find_most_similar(
        query: str,
        doc_embeddings: np.ndarray,
        embeddings_model=AzureOpenAIEmbeddings(model="text-embedding-3-small",
                                               dimensions=1024)
        ) -> tuple[str, float]:

    # 쿼리 임베딩: OpenAI 임베딩 사용
    query_embedding = embeddings_model.embed_query(query)

    # 코사인 유사도 계산
    similarities = cosine_similarity([query_embedding], doc_embeddings)[0]

    # 가장 유사한 문서 인덱스 찾기
    most_similar_idx = np.argmax(similarities)

    # 가장 유사한 문서와 유사도 반환: 문서, 유사도
    return documents[most_similar_idx], similarities[most_similar_idx]

# 예제 쿼리
queries = [
    "인공지능이란 무엇인가요?",
    "딥러닝과 머신러닝의 관계는 어떻게 되나요?",
    "컴퓨터가 이미지를 이해하는 방법은?"
]

# 각 쿼리에 대해 가장 유사한 문서 찾기
for query in queries:
    most_similar_doc, similarity = find_most_similar(query, document_embeddings_openai)
    print(f"쿼리: {query}")
    print(f"가장 유사한 문서: {most_similar_doc}")
    print(f"유사도: {similarity}")
    print("-" * 100)

문서 임베딩 + 쿼리 임베딩을 한 후  (같은 벡터 공간)

코사인 유사도 계산 → 가장 비슷한 문서 찾기의 흐름을 보여줍니다

 

 

embed_documents()로 모든 문서를 벡터로 변환하고,

embed_query()로 질문을 같은 차원의 벡터로 변환하고,

코사인 유사도(두 벡터의 방향이 얼마나 비슷한지) 계산을 하게 됩니다.!

np.argmax()로 유사도가 가장 높은 인덱스를 찾습니다.

 

 

코사인 유사도는 "크기"보단 "방향(의미)"에 집중하기 때문에 

의미적 검색(Semantic search)에 적합하다고 볼 수 있습니다!

 


 

그럼 Embedding 과정은 왜 필요한가???

문서 검색(RAG)에서 쿼리와 문서를 같은 방식으로 임베딩해야

벡터 DB에서 cosine similarity 같은 유사도 계산이 가능해집니다!!

 

 

728x90