You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
from langchain.text_splitter import SentenceTransformersTokenTextSplitter
from langchain.document_loaders import UnstructuredMarkdownLoader
from embedding import EmbeddingLoader
steloader = EmbeddingLoader.SentenceTransformerEmbedding(model_name="model/BM-K/KoSimCSE-roberta-multitask/", multi_process=True, encode_kwargs={'normalize_embeddings':True})
ste_embedding = steloader.load()
docloader = UnstructuredMarkdownLoader(file_path="data/teamA/01_생계_지원/01_국민임대주택_공급.md")
doc = docloader.load()
print(doc) ### 제목 미리 저장해놔야 할듯, BaseDBLoader 수정해라.......
splitter = SentenceTransformersTokenTextSplitter(chunk_overlap=10, model_name="model/BM-K/KoSimCSE-roberta-multitask/", tokens_per_chunk=512)
print(splitter.split_documents(doc))
간단하게 예제 document 1개를 불러온 object와, max_seq_length(KoSimCSE-roberta-multitask model의 경우에는 512)에 따라 TokenTextSplit한 예제를 통해 기존 loader 어디에서 Issue가 발생할지를 진단한다.
실행 결과는 다음과 같다.
embedding model in path <model/BM-K/KoSimCSE-roberta-multitask/> has been loaded successfully.
Function call load took 3.466754s to run.
[Document(page_content='국민임대주택 공급\n\n국민임대주택 공급의 대상은 입주자 모집공고일 현재 무주택 세대구성원으로서 소득 및 자산보유기준을 충족하는 사람입니다.\n' ... )]
[Document(page_content='국민임대주택 공급 국민임대주택 공급의 대상은 입주자 모집공고일 현재 무주택 세대구성원으로서 소득 및 자산보유기준을 충족하는 사람입니다.' ... })]
첫 번째 결과가 document를 MarkdownLoader로 불러왔을 때,
두 번째 결과가 첫 번째 결과에 TokenTextSplitter를 붙인 경우이다.
결과적으로 문서 길이 자체가 짧기 때문에 chunk 개수가 여러 개로 나뉘지는 않았지만, 개행문자('\n' 등)가 전부 삭제됨을 알 수 있다.
현행 mdLoader.BaseDBLoader를 이용한 loading은 문서 split까지 전부 진행한 다음, 가장 첫 번째 문서에서 개행 문자를 이용해서 첫 번째 내용을 가져와 title로 사용한다.
이는 TokenTextSplitter에서 첫 번째 chunk의 전체 내용을 가져오는 결과를 가져온다.
Known Issue
HuggingFace Embedding model을 불러오기 한 뒤, 이용하는 과정에서 기존 document loader와 호환이 되지 않는 Issue가 발생하여 작성함.
일단 예제 스크립트를 통해 현상을 진단하고, 해결 방법까지 작성한다.
예제 스크립트는
embeddingtest/test_splitter(tokenizer).ipynb
이다. (추후에embeddingtest/testing
으로 옮길 예정)간단하게 예제 document 1개를 불러온 object와, max_seq_length(KoSimCSE-roberta-multitask model의 경우에는 512)에 따라 TokenTextSplit한 예제를 통해 기존 loader 어디에서 Issue가 발생할지를 진단한다.
실행 결과는 다음과 같다.
첫 번째 결과가 document를 MarkdownLoader로 불러왔을 때,
두 번째 결과가 첫 번째 결과에 TokenTextSplitter를 붙인 경우이다.
결과적으로 문서 길이 자체가 짧기 때문에 chunk 개수가 여러 개로 나뉘지는 않았지만, 개행문자('\n' 등)가 전부 삭제됨을 알 수 있다.
현행 mdLoader.BaseDBLoader를 이용한 loading은 문서 split까지 전부 진행한 다음, 가장 첫 번째 문서에서 개행 문자를 이용해서 첫 번째 내용을 가져와 title로 사용한다.
이는 TokenTextSplitter에서 첫 번째 chunk의 전체 내용을 가져오는 결과를 가져온다.
따라서 다음과 같은 오류가 발생하는 것이다(title을 이용해서 매칭되는 metadata를 찾는데, 개행문자가 존재하지 않아 전체 chunk로 검색을 한다).
해결 방법
결론적으로 BaseDBLoader의 수정이 필요하다.
loader에서 title을 찾는 순서를 이전의 document를 불러오고, split 한 이후에 개행문자를 통해 찾는 방식에서
document를 불러온 이후, title을 가져오고 그 이후에 split하도록 하면 문제가 해결될 것이라 기대한다.
The text was updated successfully, but these errors were encountered: