무제
[Langchain] Splitter / Vector DB 본문
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