[AI] 4. 워드 문서를 학습해보자.

늘 공부하는 괴짜·2025년 3월 24일
0

AI : Langchain (RAG)

목록 보기
4/38

1. docx2txt 다운로드

%pip install --upgrade --quiet docx2txt langchain-community

참고 URL
https://python.langchain.com/api_reference/community/document_loaders/langchain_community.document_loaders.word_document.Docx2txtLoader.html

2. langchain-text-splitters 다운로드

로드된 문서를 쪼개는 역할을 하고, 일반적으로 CharacterTextSplitter, RecursiveCharacterTextSplitter 가 사용된다.

%pip install -qU langchain-text-splitters

참고 URL
https://python.langchain.com/v0.1/docs/modules/data_connection/document_transformers/

3. docx 문서 읽기.

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)

4. Embbeding - Vector 변환

쪼갠 문서를 벡터 변환하는 모델 선택

from dotenv import load_dotenv
from langchain_community.embeddings import OllamaEmbeddings

load_dotenv()

# 한국어 지원되는 ollama 임베딩 모델 고르기.
# 좀 많이 떨어지지만 llama3.2:1b 모델을 골랐다. 실행만 하기 위함.
embeddings = OllamaEmbeddings(
    model="llama3.2:1b"
)

5. Vector database 에 저장 - chroma db

쪼개진 문서가 벡터로 변환되면 벡터 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초 소요...

6. 질의(Query) 만들기.

query = "이 문서의 제목은?"

# Vector database 에서 검색.
# 유사도 검색 2개만... (기본값은 4개...)
retrieved_docs = chroma_database.similarity_search(query, k=2)

7. 질문 프롬프트 (llm)

from langchain_community.chat_models import ChatOllama

# pull 받은 모델 사용
chat = ChatOllama(
    model="llama3.2:1b"
)  

8. 결과 확인

prompt = f"""[Identity]
- [Context] 를 참고하여 질문에 답변 주세요.

[Context]
{retrieved_docs} 

Question : {query}
"""

response = chat.invoke(prompt)

response.content

뭔가 모델이 구린지 결과가 썩 좋지는 못하다...

profile
인공지능이라는 옷을 입었습니다. 뭔가 멋지면서도 잘 맞습니다.

0개의 댓글