728x90
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항에 따라 휴일근로 및 야간근로를 한 경우
...
- Answer: 연장근로수당은 주휴일에 지급됩니다.
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/
728x90
반응형
'프로그램 활용 > 인공지능(AI)' 카테고리의 다른 글
AI LLM RAG 구성 (0) | 2024.12.05 |
---|---|
Ollama와 LangChain으로 RAG 구현하기 (with Python) (2) | 2024.12.05 |
AI Ollama 설치와 운영 : 로컬 환경에서 대규모 언어 모델을 쉽게 실행하기 (0) | 2024.12.05 |
ollama 설치 및 사용법 (0) | 2024.12.05 |
AI 2024년에 시도해 볼 만한 상위 5가지 벡터 데이터베이스 (2) | 2024.12.04 |