내가 막 만든거 아님... 이거 그대로 복사해서 넣었음.
2025.05.13 [1100회] 21대 대선 D-21..표심 흔들 변수는?
https://program.imbc.com/BBS/toron?list_id=5464660&list_use=1&page=1&bbs_id=toron_content
Langchain의 TextLoader 와 RecursiveCharacterTextSplitter 를 사용했다.
청크는 200byte, overlap은 50byte 설정
허깅페이스의 sentence-transformers/paraphrase-xlm-r-multilingual-v1 을 사용했다. Vector dimension 은 768임.
Ollama 로 미리 받아놓은 exaone3.5:7.8b 을 사용했다. 일단 한국어를 잘하니까...
Faiss 를 사용했다. 허깅페이스 embedding 설정.
from langchain_text_splitters import RecursiveCharacterTextSplitter
from modules.llm.embedding_huggingface import getEmbeddingHuggingface
from langchain_community.document_loaders import TextLoader
from langchain_community.vectorstores.faiss import FAISS
import os
# TXT 파일 로드
loader = TextLoader("./100min.txt", encoding="utf-8")
documents = loader.load()
# 문서 분할
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=200,
chunk_overlap=50,
length_function=len
)
split_docs = text_splitter.split_documents(documents)
# 임베딩 모델 불러오기
embedding_model = getEmbeddingHuggingface()
# FAISS 벡터 저장소에 문서 저장
try:
vectorstore = FAISS.from_documents(
documents=split_docs,
embedding=embedding_model
)
# 인덱스를 로컬에 저장 (예: ./faiss_index)
vectorstore.save_local("faiss_index_100_min")
print("Documents processed and FAISS index saved successfully")
except Exception as e:
print(f"Error processing documents: {e}")
import os
from langchain.chains import RetrievalQA
from langchain_community.vectorstores.faiss import FAISS
from langchain_community.llms import Ollama
from langchain.prompts import PromptTemplate
from langchain_huggingface import HuggingFaceEmbeddings
# 1. 허깅페이스 임베딩 로드
embedding_model_name = "sentence-transformers/paraphrase-xlm-r-multilingual-v1"
# 허깅페이스 토큰 설정
huggingface_token = os.getenv("HUGGINGFACE_API_KEY")
# 2. 허깅페이스 임베딩 모델 초기화
embeddings = HuggingFaceEmbeddings(
model_name=embedding_model_name,
model_kwargs={"device": "cpu"},
encode_kwargs={"normalize_embeddings": True}
)
# 3. FAISS 인덱스를 저장한 경로
faiss_index_path = "faiss_index_100_min"
vectorstore = FAISS.load_local(
folder_path=faiss_index_path,
embeddings=embeddings,
allow_dangerous_deserialization=True
)
# 4. Retriever 설정
retriever = vectorstore.as_retriever()
# 5. LLM 설정
llm = Ollama(model="exaone3.5:7.8b")
# 6. 커스텀 프롬프트 정의
custom_prompt = PromptTemplate(
input_variables=["context", "question"],
template="""
당신은 정치 및 경제 전문가입니다. 다음의 토론을 참고하여 질문 내용에 대한 답변을 작성하세요.
** 매우 중요: 제공되는 토론 내용 외의 내용은 절대 작성하지 마세요.**
** 매우 중요: 제공되는 토론 외의 판단은 하지 마세요.**
*한국어* 로 답변하세요.
토론 내용:
{context}
질문:
{question}
각 토론자들의 토론 요약:
""".strip()
)
# 7. 체인 구성
chain = RetrievalQA.from_chain_type(
llm=llm,
retriever=retriever,
chain_type_kwargs={"prompt": custom_prompt}
)
# 8. 체인 실행
result = chain({"query": "오늘 토론 내용을 요약해줘"})
print(result["result"])