| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
- javascript
- html
- DATAPATH
- Java
- mysql
- DB
- react
- Pipelining
- php
- architecture
- Algorithm
- function
- Linux
- CSS
- MIPS
- data structure
- system
- openai
- for
- Rag
- github
- web
- instruction
- control
- AI
- Class
- python
- XML
- DS
- computer
- Today
- Total
YYYEJI
[MAC] 문서 임베딩(Document Embedding) 코드 파해치기 본문
문서 임베딩(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 같은 유사도 계산이 가능해집니다!!
'인공지능 챗봇' 카테고리의 다른 글
| [MAC] 벡터 저장소 FAISS(Facebook AI Similarity Search) 사용한 코드 살펴보기 (2) | 2025.08.05 |
|---|---|
| [MAC] 벡터 저장소 ChromaDB 사용한 코드 살펴보기 (2) | 2025.08.05 |
| [MAC] 데이터 로더 후 텍스트 분할(Text Splitting) 하는 과정 (7) | 2025.08.05 |
| [MAC] RAG 기술 사용할 때 웹 문서(WebBaseLoader), CSV(CSVLoader), PDF 파일(PyPDFLoader) 로더하는 방법 (10) | 2025.08.04 |
| [MAC] LangChain 주요 컴포넌트 파해치기 (16) | 2025.08.01 |