무제

[Langchain] Splitter / Vector DB 본문

Project/LLM

[Langchain] Splitter / Vector DB

mugan1 2024. 11. 10. 17:37

1. Spliter

 

1) CharacterTextSplitter : "\n\n" 을 기준으로 문자 단위로 텍스트를 분할하고, 청크의 크기를 문자 수로 측정

2) RecursiveCharacterTextSplitter:

텍스트를 재귀적으로 분할하여 의미적으로 관련 있는 텍스트 조각들이 같이 있도록 하는 목적으로 설계되었으며, 이 과정에서 문자 리스트(['\n\n', '\n', ' ', ''])의 문자를 순서대로 사용하여 텍스트를 분할하며, 분할된 청크들이 설정된 chunk_size보다 작아질 때까지 이 과정을 반복

 

-> 맥락을 유지함에 있어서는 RecursiveCharacterTextSplitter가 적합하다고는 하지만, 실제 프로젝트에서 어떤 Splitter가 효과적으로 사용되는지 실제적인 테스트 후에 선택을 해야겠다

 

from langchain.chat_models import ChatOpenAI
from langchain.document_loaders import UnstructuredFileLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter, CharacterTextSplitter

loader = UnstructuredFileLoader(r"/test.txt")

# splitter = RecursiveCharacterTextSplitter()
splitter = CharacterTextSplitter.from_tiktoken_encoder(
    separator="\n",
    chunk_size=500,
    chunk_overlap=100,
)

print(len(loader.load_and_split(text_splitter=splitter)))
loader.load_and_split(text_splitter=splitter)

 

2. Vector DB

venv 환경에서는 jupyter notebook kernel 충돌에러가 계속 발생해서(아마 비트수를 max로 할당해야할 듯)

일단 기존에 사용하던 conda 환경에서 테스트 하였음

 

기본적으로 Chroma, FAISS에서 vector를 저장한 뒤 유사성 검색을 할 수 있는 코드

embedding과 같은 경우는 CacheBackedEmbeddings를 사용하여 embedding 결과를 캐시에 저장할 수 있게 하였다

from langchain.chat_models import ChatOpenAI
from langchain.document_loaders import UnstructuredFileLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter, CharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings, CacheBackedEmbeddings, OllamaEmbeddings
from langchain.vectorstores import Chroma
from langchain.vectorstores.faiss import FAISS
from langchain.storage import LocalFileStore

cache_dir = LocalFileStore("./.cache/")

loader = UnstructuredFileLoader(r"/test.txt")

# splitter = RecursiveCharacterTextSplitter()
splitter = CharacterTextSplitter.from_tiktoken_encoder(
    separator="\n",
    chunk_size=200,
    chunk_overlap=100,
)

docs = loader.load_and_split(text_splitter=splitter)
embeddings = OpenAIEmbeddings()
cached_embeddings = CacheBackedEmbeddings.from_bytes_store(embeddings, cache_dir)

vectorstore = FAISS.from_documents(docs, cached_embeddings)
results = vectorstore.similarity_search("question?")
print(results)

 

vector DB는 qdrant를 사용할 예정인데,

로컬 서버를 docker로 가져와서 langchain과 연동하는 작업 중이다.

'Project > LLM' 카테고리의 다른 글

[Langchain] Retriever  (2) 2024.11.17
[Langchain] Qdrant Vector DB  (2) 2024.11.12
[Langchain] Memory  (0) 2024.10.25
[Langchain] Cache  (0) 2024.10.23
[Langchain] Template  (2) 2024.10.21
Comments