데보션앱 소개페이지 바로가기
로그인 선택

신고하기

CLOSE
신고사유 (대표 사유 1개)
상세내용 (선택)
0/200
  • 신고한 게시글은 더 이상 보이지 않습니다.
  • 이용약관과 운영정책에 따라 신고사유에 해당하는지 검토 후 조치됩니다.
  • 허위 신고인 경우, 신고자의 서비스 이용이 제한될 수 있으니 유의하시어 신중하게 신고해 주세요.
(이 회원이 작성한 모든 댓글과 커뮤니티 게시물이 보이지 않고, 알림도 오지 않습니다.)

미리보기

커뮤니티

      1,234

      badge 23.06.15

      글 등록

      카테고리를 선택해주세요.

      DEVOTEE를 활성화 시키면
      지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.

      버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.

      임시저장함에 저장되었습니다. 저장일시 : 2022.5.17 14:29:08

      임시저장함

      제목을 선택하시면 이어서 작성이 가능하며,
      최대 20건까지 저장합니다.
      컨텐츠 유형, 제목, 저장일시, 삭제로 이뤄진 임시저장 목록
      컨텐츠 유형 제목 저장일 삭제

      데보션 블로그 게재 요청

      CLOSE
      • *
      • *

      본인인증

      효율적인 데보션 서비스 이용 및
      고객님의 소중한 개인정보보호를 위해
      본인인증을 진행해주세요. 본인인증 미 진행 시 로그인이 제한됩니다.
      본인인증 실패

      본인인증 로그인에 실패하였습니다.
      회원이 아니시거나 본인인증 등록이
      완료되지 않은 사용자입니다.

      회원정보 연결

      OpenLab - OpenLLM, LLaMA3 을 이용한 RAG 구축 + Ollama 사용법 정리

      Judy 24.06.02
      256 0 0
      DEVOTEE 요약
      스터디 멤버들이 OpenLLM을 이용해 RAG 챗봇 코드를 이해하고, 주석을 포함한 완성된 챗봇 코드를 제출할 예정입니다. 근로기준법 PDF를 로드해 청크로 분리하고, 이를 임베딩하여 벡터 저장소에 저장한 후 RAG 체인을 구성해 Query에 응답하는 방식입니다. 또한, Ollama를 사용해 로컬 환경에서 LLM을 쉽게 실행할 수 있도록 하고 GGUF 파일 형식을 이용해 LLM을 빠르게 로컬에서 실행하는 방법도 다루었습니다.
      DEVOTEE 추천 블로그

      스터디 운영자님의 스터디 운영 경과와 함께 스터디 내용 요약 정리해보았습니다.

      0. 스터디 운영 공지

      1. 대부분의 멤버가 OpenLLM을 이용한 RAG 코드 개념 이해하는 것으로 확인되어

      2. 다음 스터디(6/19) 전(6/16)까지 3개 주제별로 OpenLLM 을 이용한 챗봇까지 개발해서

      3. 충분한 주석을 포함하고 챗봇 화면을 캡처해서 완성된 코드 버전을 제출할 예정입니다.

      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/

      댓글 0

      DEVOTEE를 활성화 시키면
      지금 작성한 댓글에 AI가 댓글을 달아줍니다.

      Judy 님의 최신 블로그

      더보기

      DEVOTEE 추천 블로그

      동영상 기고하기