본문 바로가기

AI

랭체인으로 의미기반 문서 나누기 (langchain sementic chuncker 사용법)

728x90
반응형

랭체인을 활용하여 RAG를 구현해 보려고 하는데 

문서를 좀 더 잘 분해하여 임베딩 시켜 저장하면 좋을 것 같아 찾아봄.

 

어차피 임베딩해서 저장하는 이유는

Vector Space에 문서를 잘 뿌려 놓고 다시 잘 찾아오기 위한 것이다. 

 

문서를 좀 더 잘게 쪼개 놓으면 원하는 내용을 찾아오기 쉬울 것 같았는데 

일부 예제에서 문서 길이를 보고 자르는 게 있길래

의미 기반으로 자를 순 없을지 찾아보니 역시 기능이 있었다. 

 

sementic chunker

이름도 멋지게 잘 만들어 놨군 ㅋㅋ

https://python.langchain.com/v0.2/docs/how_to/semantic-chunker/

 

How to split text based on semantic similarity | 🦜️🔗 LangChain

Taken from Greg Kamradt's wonderful notebook:

python.langchain.com

 

한글도 잘 되는지 보려고 신문기사 하나로 실험해 봄

 

https://www.hankyung.com/article/202405149217i

 

퇴사하고 베트남서 '당구장' 차린 30대, 한 달 수입이… [방준식의 재+부팅]

퇴사하고 베트남서 '당구장' 차린 30대, 한 달 수입이… [방준식의 재+부팅], 호찌민에서 작당 당구장 운영 김재남 씨 2021년 지사 발령후 정착하기로 결심 "10대들 PC방 대신 당구장 몰려 현지 평균

www.hankyung.com

 

위 기사를 활용해 의미 기반으로 잘 짤리는지 테스트 했다. 

 

문장 단위로 임베딩을 하고 앞 뒤 문장이 아래 3가지 계산법중 하나로 일부 수치를 넘어갔을 때 

문서를 구분하는 방식이다. 

 

percentile

standard_deviation

interquartile 

 

아래와 같은 방식으로 의미기반 청킹 방식을 정하고 짤라봤다. 

from langchain_experimental.text_splitter import SemanticChunker
from langchain_openai.embeddings import OpenAIEmbeddings

text_splitter = SemanticChunker(OpenAIEmbeddings())
// 청커 방식 정하기
text_splitter = SemanticChunker(
    OpenAIEmbeddings(), breakpoint_threshold_type="interquartile"
)
// 문서 읽기
with open("news_test.txt") as f:
    news_test = f.read()
    
docs = text_splitter.create_documents([news_test])
print(len(docs))
for doc in docs:
  print("################\n")
  print(doc.page_content)

 

아래 결과가 기본 방식인  percentile 방식인데 내생각에 가장 잘 된것 같았다. 

#######로 문서를 구분해 봤는데 

시작 부분이 따로 구분이 됐고, 

당구장 사업의 의미 따로, 현재 당구장 운영 비용이나 매출에 관한 내용 따로 

잘 구분 되었다. 

 

 

문서를 직접 보고 구분하는 것도 방법이지만

이렇게 자동으로 의미기반으로 구분해서 저장해보는 것도 

시도해볼만한것 같다. 

 

728x90
반응형