%pip install --upgrade --quiet docx2txt langchain-community
로드된 문서를 쪼개는 역할을 하고, 일반적으로 CharacterTextSplitter, RecursiveCharacterTextSplitter 가 사용된다.
%pip install -qU langchain-text-splitters
참고 URL
https://python.langchain.com/v0.1/docs/modules/data_connection/document_transformers/
Docx2txtLoader 는 docx 만 읽을 수 있기 때문에 미리 변환해두자.
from langchain_community.document_loaders import Docx2txtLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
# 200개씩 겹쳐서 쪼갠다.
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1500, chunk_overlap=200)
# 문서 가져오기.
loader = Docx2txtLoader("./document.docx")
# 일반 텍스트 로드도 가능하다.
# loader = TextLoader("./document.txt")
document_list = loader.load_and_split(text_splitter=text_splitter)
쪼갠 문서를 벡터 변환하는 모델 선택
from dotenv import load_dotenv
from langchain_community.embeddings import OllamaEmbeddings
load_dotenv()
# 한국어 지원되는 ollama 임베딩 모델 고르기.
# 좀 많이 떨어지지만 llama3.2:1b 모델을 골랐다. 실행만 하기 위함.
embeddings = OllamaEmbeddings(
model="llama3.2:1b"
)
쪼개진 문서가 벡터로 변환되면 벡터 database 에 저장한다.
로컬에 별도 저장하여 재사용 하자.
%pip install -qU langchain-chroma
# 벡터 데이터베이스 저장용
from langchain_chroma import Chroma
chroma_database = Chroma.from_documents(
documents=document_list, # 쪼개진 문서
embedding=embeddings, # llama3.2:1b"
persist_directory="./chroma_db", # database 가 저장되는 경로
collection_name="chroma_tax" # 테이블 명칭
)
조금 지칠때쯤 끝났다. 4분 21초 소요...
query = "이 문서의 제목은?"
# Vector database 에서 검색.
# 유사도 검색 2개만... (기본값은 4개...)
retrieved_docs = chroma_database.similarity_search(query, k=2)
from langchain_community.chat_models import ChatOllama
# pull 받은 모델 사용
chat = ChatOllama(
model="llama3.2:1b"
)
prompt = f"""[Identity]
- [Context] 를 참고하여 질문에 답변 주세요.
[Context]
{retrieved_docs}
Question : {query}
"""
response = chat.invoke(prompt)
response.content
뭔가 모델이 구린지 결과가 썩 좋지는 못하다...