기본적으로 알아할 요소 정리
1. 인코딩 - 자연어나 데이터를 컴퓨터가 이해할 수 있는 변환
2. 임베딩 - 텍스트(문장, 단어 등)를 **고차원 벡터(Vector)**로 변환하는 과정
예를 들어, 단어나 문장 같은 텍스트를 고정 길이의 숫자 배열로 바꾸어 의미적으로 비슷한 단어일수록 벡터 공간에서 가까운 위치에 있도록 만드는 것입니다.
이렇게 변환된 벡터는 유사도 계산, 검색, 추천, 분류 등 다양한 머신러닝 및 자연어처리 작업에서 활용됩니다.
임베딩 모델 또한 주어진 대규모 데이터를 기반으로 각 항목을 의미 있는 벡터 표현으로 변환하는 방법을 학습함
임베딩 마다의 차이
1. 학습 데이터셋과 방식
2. 모델 구조와 아키텍처
3. 학습 목표와 손실 함수
4. 벡터 차원 수 (embedding dimension).
5. 전처리 및 후처리 기법
임베딩 유형
1. OpenAI 임베딩 (예: text-embedding-3-large)
2. Hugging Face 임베딩 (예: sentence-transformers, intfloat/multilingual-e5)
3. Cohere 임베딩
4. Google Universal Sentence Encoder (USE)
5. 오픈소스 임베딩 (BERT, RoBERTa, DistilBERT 등)
6. 기타 등등
3. vectorstore - 자연어 텍스트, 이미지, 오디오 등의 비정형 데이터를 임베딩이라는 과정을 통해 고차원 벡터 형태로 변환하고, 이를 효율적으로 저장하고 빠르게 검색할 수 있게 설계된 데이터베이스 시스템
주요 역할
1.임베딩 벡터 저장
2. ANN 기반 검색 << 이넘이 이번 137회 정보관리기술사에 나옴.....
- Locality Sensitive Hashing (LSH): 비슷한 데이터는 같은 해시 버킷으로 매핑될 확률이 높도록
- Hierarchical Navigable Small World (HNSW): 여러 개 층의 그래프로 구성, 높은 층에서는 대략적인 위치를 빠르게 파악하고 낮은 층에서는 세밀한 위치를 찾는 방식
코드
> pip install pypdf
> ollama pull mxbai-embed-large
import ollama
from langchain_community.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.vectorstores import FAISS
from langchain.embeddings.base import Embeddings
from langchain.chains import RetrievalQA
from langchain_ollama import OllamaLLM
# Ollama 임베딩 래퍼 클래스 정의
class OllamaEmbeddings(Embeddings):
def __init__(self, model_name="mxbai-embed-large"):
self.model_name = model_name
def embed_documents(self, texts):
embeddings = []
for text in texts:
response = ollama.embeddings(model=self.model_name, prompt=text)
embeddings.append(response["embedding"])
return embeddings
def embed_query(self, text):
response = ollama.embeddings(model=self.model_name, prompt=text)
return response["embedding"]
# 1. PDF 로드 및 분할
loader = PyPDFLoader("2025_1Q_conference_kor.pdf")
documents = loader.load()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=50)
split_docs = text_splitter.split_documents(documents)
# 2. 임베딩 생성 및 벡터스토어 구축
embeddings = OllamaEmbeddings(model_name="mxbai-embed-large")
vectorstore = FAISS.from_documents(split_docs, embeddings)
# 3. 리트리버 생성
retriever = vectorstore.as_retriever(search_kwargs={"k":3})
# 4. Ollama LLM 초기화
llm = OllamaLLM(model="ollama-ko-0710:latest", base_url="http://localhost:11434")
# 5. RAG 체인 생성
chain= RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=retriever, return_source_documents=True)
# 6. 질의 응답
query = "2025년 1분기 현황 알려줘."
result = chain.invoke({"query": query})
answer = result["result"] # 실제 답변
sources = result["source_documents"] # 참고된 문서 리스트
print("답변:", answer)
print("참고 문서 개수:", len(sources))
결과
PDF 파일 실제 내용
일단 pdf 파일을 참조하는구나 정도는 알수 있엇다.