이번 강의에서는 벡터 스토어의 개념부터 실제 구현까지 자세하고 쉽게 설명해드리겠습니다. 마지막에는 작동 가능한 전체 실습 코드를 제공하겠습니다.
pip install langchain==0.0.235
pip install chromadb==0.3.26
pip install openai==0.27.10
pip install tiktoken==0.4.0
pip install python-dotenv==1.0.0
참고: 버전 호환성을 위해 명시된 버전으로 설치하는 것이 좋습니다.
.env
파일을 사용하겠습니다..env
파일 생성 및 설정.env
파일을 생성합니다.OPENAI_API_KEY=여러분의_OpenAI_API_키
import os
from dotenv import load_dotenv
# .env 파일에서 API 키 로드
load_dotenv()
OPENAI_API_KEY = os.getenv('OPENAI_API_KEY')
from langchain.embeddings import OpenAIEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import Chroma
from langchain.document_loaders import TextLoader
# OpenAI API 키 설정
os.environ['OPENAI_API_KEY'] = OPENAI_API_KEY
# 문서 로더를 사용하여 문서 로드
loader = TextLoader("data/FDR_State_of_Union_1944.txt")
documents = loader.load()
"data/FDR_State_of_Union_1944.txt"
는 분석하고자 하는 텍스트 파일입니다.# 문서를 작은 조각으로 분할
text_splitter = CharacterTextSplitter.from_tiktoken_encoder(chunk_size=500, chunk_overlap=0)
docs = text_splitter.split_documents(documents)
chunk_size=500
: 각 조각의 길이를 500 토큰으로 설정합니다.chunk_overlap=0
: 조각 간에 겹침이 없도록 합니다.# OpenAI Embeddings 초기화
embedding_function = OpenAIEmbeddings()
# 벡터 스토어에 문서와 벡터 저장
persist_directory = 'db/speech_embedding_db'
vectordb = Chroma.from_documents(docs, embedding_function, persist_directory=persist_directory)
# 데이터베이스 저장
vectordb.persist()
persist_directory
: 벡터 스토어를 저장할 디렉토리입니다.vectordb.persist()
: 데이터베이스를 디스크에 저장합니다.# 저장된 벡터 스토어 로드
vectordb = Chroma(persist_directory=persist_directory, embedding_function=embedding_function)
# 유사성 검색 예시
query = "루스벨트가 식품법의 비용에 대해 뭐라고 말했나요?"
results = vectordb.similarity_search(query)
similarity_search
: 쿼리와 유사한 문서를 검색합니다.# 결과 출력
for idx, doc in enumerate(results):
print(f"결과 {idx+1}:\n{doc.page_content}\n")
벡터 스토어에 새로운 문서를 추가하고 검색하는 방법입니다.
# 새로운 문서 로드
loader_new = TextLoader("data/Lincoln_State_of_Union_1862.txt")
documents_new = loader_new.load()
# 문서 분할
docs_new = text_splitter.split_documents(documents_new)
# 기존 벡터 스토어에 새로운 문서 추가
vectordb.add_documents(docs_new)
vectordb.persist()
add_documents
: 새로운 문서를 기존 벡터 스토어에 추가합니다.vectordb.persist()
: 변경 사항을 저장합니다.# 업데이트된 벡터 스토어 로드
vectordb = Chroma(persist_directory=persist_directory, embedding_function=embedding_function)
# 새로운 쿼리로 유사성 검색
query_new = "링컨이 노예제에 대해 뭐라고 말했나요?"
results_new = vectordb.similarity_search(query_new)
# 결과 출력
for idx, doc in enumerate(results_new):
print(f"결과 {idx+1}:\n{doc.page_content}\n")
아래는 위의 모든 내용을 합친 전체 코드입니다.
import os
from dotenv import load_dotenv
# .env 파일에서 API 키 로드
load_dotenv()
OPENAI_API_KEY = os.getenv('OPENAI_API_KEY')
from langchain.embeddings import OpenAIEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import Chroma
from langchain.document_loaders import TextLoader
# OpenAI API 키 설정
os.environ['OPENAI_API_KEY'] = OPENAI_API_KEY
# 문서 로더를 사용하여 문서 로드
loader = TextLoader("data/FDR_State_of_Union_1944.txt")
documents = loader.load()
# 문서를 작은 조각으로 분할
text_splitter = CharacterTextSplitter.from_tiktoken_encoder(chunk_size=500, chunk_overlap=0)
docs = text_splitter.split_documents(documents)
# OpenAI Embeddings 초기화
embedding_function = OpenAIEmbeddings()
# 벡터 스토어에 문서와 벡터 저장
persist_directory = 'db/speech_embedding_db'
vectordb = Chroma.from_documents(docs, embedding_function, persist_directory=persist_directory)
# 데이터베이스 저장
vectordb.persist()
# 저장된 벡터 스토어 로드
vectordb = Chroma(persist_directory=persist_directory, embedding_function=embedding_function)
# 유사성 검색 예시
query = "루스벨트가 식품법의 비용에 대해 뭐라고 말했나요?"
results = vectordb.similarity_search(query)
# 결과 출력
for idx, doc in enumerate(results):
print(f"결과 {idx+1}:\n{doc.page_content}\n")
# 새로운 문서 로드 및 분할
loader_new = TextLoader("data/Lincoln_State_of_Union_1862.txt")
documents_new = loader_new.load()
docs_new = text_splitter.split_documents(documents_new)
# 기존 벡터 스토어에 새로운 문서 추가
vectordb.add_documents(docs_new)
vectordb.persist()
# 업데이트된 벡터 스토어 로드
vectordb = Chroma(persist_directory=persist_directory, embedding_function=embedding_function)
# 새로운 쿼리로 유사성 검색
query_new = "링컨이 노예제에 대해 뭐라고 말했나요?"
results_new = vectordb.similarity_search(query_new)
# 결과 출력
for idx, doc in enumerate(results_new):
print(f"결과 {idx+1}:\n{doc.page_content}\n")
왜 분할할까요?
분할 방법
CharacterTextSplitter
를 사용하여 문서를 일정한 길이로 분할합니다.chunk_size
와 chunk_overlap
을 조절하여 분할 크기와 겹침을 설정할 수 있습니다.벡터화란?
OpenAI Embeddings 사용
코사인 유사도
검색 과정
데이터베이스 저장
vectordb.persist()
를 호출하여 벡터 스토어를 디스크에 저장합니다.데이터베이스 로드
persist_directory
와 embedding_function
을 지정하여 로드합니다.새로운 문서 추가
add_documents
메서드를 사용하여 새로운 문서를 추가할 수 있습니다.persist()
를 호출하여 변경 사항을 저장합니다.데이터 관리
이번 강의에서는 벡터 스토어의 개념부터 실제 구현까지 자세히 알아보았습니다. 벡터 스토어는 대량의 텍스트 데이터를 효율적으로 관리하고 검색할 수 있는 강력한 도구입니다.
LangChain과 ChromaDB를 사용하면 이러한 벡터 스토어를 쉽게 구축하고 활용할 수 있습니다. 이 실습을 통해 벡터 스토어의 기본적인 사용 방법을 이해하고, 실제로 구현해보았습니다.
다른 벡터 스토어 옵션 탐색
고급 기능 활용
혹시 추가로 궁금한 점이나 더 알고 싶은 내용이 있으시면 언제든지 말씀해주세요! 😊
pip install chromadb
오류 발생 시, Python 버전을 낮춰 보세요. 현재 Python 3.13 사용 중.
파이썬 버전을 낮추려면 다음과 같은 단계들을 따르시면 됩니다.
현재 파이썬 버전 확인:
python --version
기존 파이썬 버전 제거 (Linux/macOS 기준):
sudo apt remove python3
또는
brew uninstall python
원하는 파이썬 버전 설치:
brew install python@3.x # x는 원하는 버전 숫자로 변경하세요.
pyenv
를 사용해서 특정 버전을 설치하고 관리할 수도 있습니다:pyenv install 3.x.y
pyenv global 3.x.y # 기본 버전을 새 버전으로 변경합니다.
버전 확인:
python --version
이렇게 하면 원하는 파이썬 버전으로 환경을 설정할 수 있습니다. pyenv
를 활용하면 여러 버전을 동시에 관리하기 편리하니 참고해 보세요.