Llama3-KO 를 이용해 RAG 를 구현해 보겠습니다.
RAG 에 사용할 PDF로 근로기준법을 다운로드하여 사용했습니다.
https://www.law.go.kr/법령/근로기준법
필요한 라이브러리 임포트
import os
import warnings
warnings.filterwarnings("ignore")
Text(PDF) Loader
from langchain_community.document_loaders import PyMuPDFLoader
# PyMuPDFLoader 을 이용해 PDF 파일 로드
loader = PyMuPDFLoader("labor_low.pdf")
pages = loader.load()
TextSplitter
from langchain.text_splitter import RecursiveCharacterTextSplitter
# 문서를 문장으로 분리
## 청크 크기 500, 각 청크의 50자씩 겹치도록 청크를 나눈다
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=50,
)
docs = text_splitter.split_documents(pages)
Text Vector Embedding
from langchain.embeddings import HuggingFaceEmbeddings
# 문장을 임베딩으로 변환하고 벡터 저장소에 저장
embeddings = HuggingFaceEmbeddings(
model_name='BAAI/bge-m3',
#model_kwargs={'device':'cpu'},
model_kwargs={'device':'cuda'},
encode_kwargs={'normalize_embeddings':True},
)
VectorStore(Chroma)
# 벡터 저장소 생성
from langchain.vectorstores import Chroma
vectorstore = Chroma.from_documents(docs, embeddings)
# 벡터 저장소 경로 설정
## 현재 경로에 'vectorstore' 경로 생성
vectorstore_path = 'vectorstore'
os.makedirs(vectorstore_path, exist_ok=True)
# 벡터 저장소 생성 및 저장
vectorstore = Chroma.from_documents(docs, embeddings, persist_directory=vectorstore_path)
# 벡터스토어 데이터를 디스크에 저장
vectorstore.persist()
print("Vectorstore created and persisted")
Model
from langchain_community.chat_models import ChatOllama
# Ollama 를 이용해 로컬에서 LLM 실행
## llama3-ko-instruct 모델 다운로드는 Ollama 사용법 참조
model = ChatOllama(model="llama3-ko-instruct", temperature=0)
Retriever
retriever = vectorstore.as_retriever(search_kwargs={'k': 3})
LangChain
from langchain_core.runnables import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
# Prompt 템플릿 생성
template = '''친절한 챗봇으로서 상대방의 요청에 최대한 자세하고 친절하게 답하자. 모든 대답은 한국어(Korean)으로 대답해줘.":
{context}
Question: {question}
'''
prompt = ChatPromptTemplate.from_template(template)
def format_docs(docs):
return '\n\n'.join([d.page_content for d in docs])
# RAG Chain 연결
rag_chain = (
{'context': retriever | format_docs, 'question': RunnablePassthrough()}
| prompt
| model
| StrOutputParser()
)
# Chain 실행
query = "연장근로수당에 대해 알려 줘"
answer = rag_chain.invoke(query)
print("Query:", query)
print("Answer:", answer)
teddylee777/Llama-3-Open-Ko-8B-gguf 모델
teddylee777/Llama-3-Open-Ko-8B-Instruct-preview-gguf 모델
설치
curl -fsSL https://ollama.com/install.sh | sh
모델 다운로드 (Pull)
https://ollama.com/
에서 Docker Hub 처럼 모델을 다운로드(Pull) 할 수 있다.
# ollama pull <model>
ollama pull llama3
모델 실행
# ollama run <model>
ollama run llama3
현재 로컬의 모델 조회
ollama list
HuggingFace 에 업로드된 gguf 모델을 Ollama 를 이용해 로컬에서 돌려봅니다.
1. gguf 모델 다운로드
# wget <허깅페이스 모델 url>
wget https://huggingface.co/teddylee777/Llama-3-Open-Ko-8B-gguf/resolve/main/Llama-3-Open-Ko-8B-Q8_0.gguf
2. GGUF 파일 경로에 Modelfile 파일 작성
FROM Llama-3-Open-Ko-8B-Q8_0.gguf
TEMPLATE """{{- if .System }}
<s>{{ .System }}</s>
{{- end }}
<s>Human:
{{ .Prompt }}</s>
<s>Assistant:
"""
SYSTEM """A chat between a curious user and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the user's questions."""
PARAMETER temperature 0
PARAMETER num_predict 3000
PARAMETER num_ctx 4096
PARAMETER stop <s>
PARAMETER stop </s>
3. 모델 생성(추가)
# ollama create <생성 및 실행할 모델명> -f Modelfile
ollama create llama3-ko -f Modelfile
이렇게 생성한 모델을 ollama run llama3-ko
와 같이 즉시 실행할 수도 있고
RAG 등과 함께 사용할 때 다음 코드 형태로 사용할 수도 있다.
from langchain_community.chat_models import ChatOllama
# Ollama 를 이용해 로컬에서 LLM 실행
model = ChatOllama(model="llama3-ko")
https://devocean.sk.com/internal/board/viewArticleForAjax.do?id=166016
https://wooiljeong.github.io/ml/gguf-llm/
감사합니다 덕분에 많은 도움이 되었습니다~