LLaMA3 을 이용한 RAG 구축 + Ollama 사용법 정리

Judy·2024년 6월 2일
4

OpenLLM스터디

목록 보기
7/10

1. RAG

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)

Output

  • teddylee777/Llama-3-Open-Ko-8B-gguf 모델

    • Answer: 연장근로수당은 근로기준법 제56조에 따라 통상임금의 50%를 가산하여 지급해야 합니다
  • teddylee777/Llama-3-Open-Ko-8B-Instruct-preview-gguf 모델

    • Answer: 연장근로수당은 주휴일에 지급됩니다.
      제71조(연장근로수당) ① 사용자는 근로시간을 초과하여 근로한 경우에는 그 초과된 시간에 대하여 연장근로수당을 지급하여야 한다. 다만, 다음 각 호의 어느 하나에 해당하는 경우에는 그러하지 아니하다.
      1. 「근로기준법」 제56조제2항에 따라 휴일근로를 한 경우
      2. 「근로기준법」 제57조제2항에 따라 야간근로를 한 경우
      3. 「근로기준법」 제58조제2항에 따라 휴일에 근로한 경우
      4. 「근로기준법」 제59조제2항에 따라 휴일근로 및 야간근로를 한 경우
      ...

2. Ollama : 배포의 혁신

  • Get up and running with large language models locally.
  • 오픈소스 LLM 모델을 local에서 띄워서 구동하는 가장 손쉬운 방법
  • windows, macos에서도 구동되기 때문에 리눅스 환경이 아니어도 간단하게 모델들을 다운로드 받아서 구동시킬 수 있다
  • 구동되면 langchain과도 바로 연결된다
  • 단일 바이너리에 모든 구현체(서버 + 클라이언트) 를 다 집어넣은 형태
  • llamap.cpp 기반

명령어

설치

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 로 실행하기

HuggingFace 에 업로드된 gguf 모델을 Ollama 를 이용해 로컬에서 돌려봅니다.

gguf?

  • GGUF(Georgi Gerganov Unified Format)
  • 오픈소스 모델을 로컬 환경에서 쉽고 빠르게 실행할 수 있는 파일 형식
  • GGML을 사용하여 대형 모델을 실행하는 프로그램과 모델을 저장하는 파일 형식
    • GGML : 컴퓨터에서도 큰 모델을 빠르게 돌릴 수 있는 ML용 라이브러리
  • 모델을 빠르고 쉽게 불러오고 저장할 수 있게 해주는 바이너리(0, 1) 형식으로 설계됨
  • 개발자들은 보통 PyTorch 같은 프로그래밍 도구를 사용해 모델을 만든 후, GGML에서 쓸 수 있도록 GGUF 형식으로 저장한다

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")

Reference

https://devocean.sk.com/internal/board/viewArticleForAjax.do?id=166016
https://wooiljeong.github.io/ml/gguf-llm/

profile
NLP Researcher

2개의 댓글

comment-user-thumbnail
2024년 6월 28일

감사합니다 덕분에 많은 도움이 되었습니다~

답글 달기
comment-user-thumbnail
2024년 9월 5일

글 잘 읽었습니다..!! 혹시 huggingfaceembeddings 라이브러리를 사용할 때 (벡터 저장소에 저장하는 부분) 에서 torch 버전이나 cuda 오류가 뜨지는 않았나요,,? 호환성 문제가 있었는지 궁금합니다..

답글 달기