[Workshop] 'LLM을 활용한 RAG 구현하기' 워크샵 후기 및 내용 공유

2023. 12. 22. 15:10Research/Large Language Model

728x90

튜링의 사과와 프로그래머스가 주최한 'LLM을 활용한 RAG 구현하기' 워크샵에 다녀왔습니다.

2023년 12월 21일 목요일 오후 7시 30분 부터 오후 10시까지 강남역 프로그래머스 강의장에서 진행하였습니다.

워크샵은 튜링의 사과 운영진 대표이신 조한열 대표님께서 진행해주셨습니다. 워크샵 내용은 기본적인 RAG에 대한 설명과 간단한 실습이였습니다. 워크샵은 'RAG가 이런 것이구나'라고 느끼기에 충분한 난이도와 내용이었던 것 같습니다. 워크샵에서 진행했던 코드에 대해 간단하게 설명하겠습니다. (코드 공개에 대해 조한열 대표님께 허락을 맡았습니다.)

우선 transformer와 chromadb를 설치합니다. transformer 라이브러리는 허깅페이스의 pretrained 모델을 이용할 수 있게 해줍니다. chromadb는 RAG에서 사용할 벡터 데이터베이스 구축을 위한 라이브러리입니다. 

허깅페이스에서 한국어를 이용하여 학습한 모델과 tokenizer를 가져옵니다.

!pip install transformers==4.31.0
!pip install chromadb==0.4.6
from transformers import AutoTokenizer, AutoModel
model_checkpoint = "jhgan/ko-sroberta-multitask"
tokenizer = AutoTokenizer.from_pretrained(model_checkpoint)
model = AutoModel.from_pretrained(model_checkpoint)

 

입력받은 텍스트를 임베딩하는 함수를 정의합니다.

def embedding_for_text(text):
    inputs = tokenizer(text, return_tensors="pt", padding=True, truncation=False)
    outputs = model(**inputs)
    return outputs.last_hidden_state[0].detach().numpy()[0].tolist()

 

입력받은 문서를 분할하는 함수를 정의합니다.

def split_documents(document, max_length):
    splitted = []
    chunk, doc_length = "", 0
    for doc in [ doc.strip() for doc in document.split("\n") ]:
        if len(doc) == 0:
          continue

        if doc_length > 0 and len(doc) + doc_length > max_length:
            splitted.append(chunk.strip())
            chunk = ""
            doc_length = 0
        chunk += doc + " "
        doc_length += len(doc)

    if len(chunk) > 0:
        splitted.append(chunk)

    return splitted

 

그리고 증강할 문서를 정의합니다.

document = """
안녕하세요. Growth Hub for Developers, 『튜링의 사과』 입니다. 『튜링의 사과』 는 개발 경력 20년 이상의 개발자들이 운영하는 개발자들의 성장 공간이자 오프라인 아지트입니다. 2호선 뚝섬역 5번 출구 바로 옆(성수동)에 위치하고 있습니다.
성수동 『튜링의 사과』 아지트 이용 방법을 안내해드립니다.
1. 공간구성
『튜링의 사과』 아지트는 크게 5개 모듈로 구성되어 있습니다.
(1) 개발자 서점 Developer’s Book Store
IT 전문 출판사들과 함께 선정한 필독 도서를 구매하실 수 있습니다.
(2) 몰입형 작업공간 Immersive Workspace
개발 작업에 몰입할 수 있는 공간을 대여해서 사용하실 수 있습니다.
(3) 자율형 작업공간 / 강의실 Free Workspace
강의가 없을 때는 개인/팀별 작업을 자유롭게 진행할 수 있습니다.
(4) 아그리파 존 AGLIPPA Zone
최신 트렌드의 생성형 인공지능 서비스를 체험할 수 있습니다.
(5) 휴게 공간 Refresh Zone
편안한 쇼파형 의자에서 최신 만화/웹툰을 보며 휴식할 수 있습니다.
각각의 공간 이용 방법은 아래에서 상세하게 안내해드립니다.
2. 이용시간
① 월-금 : 08:30 ~ 24:00
② 토/일 : 10:00 ~ 22:00
③ 야간/새벽 시간 예약제 운영
3. 각 공간별 이용 방법
(1) 개발자 서점
IT 전문 출판사들과 함께 엄선한 개발 도서를 판매합니다.
판매가: 도서 정가의 90%
마일리지 포인트: 5% 적립 (소멸시효 : 적립일 기준 5년 경과 시)
결제수단: 신용카드 및 간편결제(카카오페이, 삼성페이, 애플페이)
(2) 몰입형 작업공간
편안한 의자와 보조 모니터가 비치되어 있어 개발에 몰입할 수 있는 공간입니다.
총 13석의 안락한 작업 공간을 대여합니다.
하루종일 앉아있어도 허리가 아프지 않은 고급 의자가 제공됩니다.
LG 4K 27인치 모니터가 자리마다 놓여있습니다.
작업 공간 내에 개발 도서가 비치되어 있어 자유롭게 열람이 가능합니다.
■ 이용료
2시간 기본 : 7,000원(선결제)
연장 1시간 : 3,000원(후결제 가능)
종일권 : 평일 30,000원 / 주말 및 공휴일 21,000원(선결제)
결제수단: 신용카드 및 간편결제(카카오페이, 삼성페이, 애플페이)
야간/새벽 시간에 몰입형 작업공간을 이용하실 분들은 인포데스크에 문의해주세요.
5명 이상 이용시 공간을 오픈하며, 1인당 이용비용은 25,000원입니다.
새벽 6시까지 사용하실 수 있습니다.
(3) 자율형 작업공간 / 강의실
개발 강의를 들을 수 있고, 강의가 없는 날은 자율형 작업 공간으로 대여할 수 있습니다.
■ 이용료
1시간 기본 : 2,000원(선결제)
연장 1시간 : 2,000원(후결제 가능)
종일권 : 평일 20,000원 / 주말 및 공휴일 14,000원(선결제)
■ 강의
인공지능부터 개발 기술까지 개발자의 성장을 위한 다양한 강의를 제공합니다.
일부 강의는 수강료의 90%를 『튜링의 사과』에서 사용 가능한 포인트로 페이백해드립니다.
■ 강의실 대관
총 24석을 이용할 수 있습니다.
대관료는 시간당 10만원입니다. (오전시간은 7만원)
세금계산서 발급 가능합니다.
대관 문의 및 예약은 인포데스크나 홈페이지의 채널톡, 디스코드 채널을 이용해주세요.
(4) 아그리파 존
요즘 핫하게 성장하고 있는 생성형 인공지능 기술을 체험하실 수 있습니다.
4개의 개방형 좌석 제공
무료로 자유롭게 이용할 수 있습니다.
(5) 휴게 공간
최신 만화/웹툰 책과 보드게임 등이 비치되어 있습니다.
쇼파형 의자에 앉아서 휴식을 취할 수 있습니다.
식수/얼음은 코웨이 정수기를 이용하시면 됩니다.
멀티 자판기에서 음료와 간단한 간식류를 구매하실 수 있습니다.
멀티 자판기는 신용카드 결제만 가능합니다. (현금/크레딧 및 간편결제 불가)
4. 크레딧 적립
도서 구매부터 공간 이용까지 『튜링의 사과』가 제공하는 모든 서비스를 현금처럼 사용하실 수 있습니다.
10만원 이상 결제시, 10% 보너스 크레딧을 추가로 적립해드립니다.
크레딧은 『튜링의 사과』 전용 모바일 앱을 통해 사용하실 수 있습니다.
크레딧을 적립하실 분들은 인포데스크에 문의해주세요.
멀티 자판기 결제에는 사용하실 수 없습니다.
5. 기타사항
(1) 화장실
화장실은 탕비공간 뒤편에 위치해 있습니다.
1층에도 화장실이 있으며, 1층 엘리베이터 좌측에 위치해 있습니다.
휴지통은 여자 화장실에만 생리용품 처리를 위해 비치되어 있습니다.
(2) 주차
주차 공간이 협소하여 주차 지원이 불가능합니다.
주변 건물의 주차료가 다소 비싼 관계로 대중교통을 이용해주세요.
(3) 흡연
『튜링의 사과』 주변은 금연 공간입니다.
흡연은 맞은편 건물(A-tower) 주차장 입구 흡연공간을 이용해주세요.
함께 일하는 쾌적한 공간을 위해 불편하시더라도 조금만 양해해주세요.
6. 운영진
조한열 (24년차 개발자)
서울대 컴퓨터공학과 졸업
북잼/아스타리아 대표
본엔젤스/알토스벤처스 투자 유치 경험
임준석 (25년차 개발자)
서울대 컴퓨터공학과 졸업
타이니팜 게임 총괄 개발
컴투스 개발 총괄
싱타 개발이사
박재성 (크리에이터/프로듀서)
서울대 컴퓨터공학과 졸업
삼성전자/컴투스/엑스엘게임즈
싱타 대표
웨스트웨이브 프로듀서
7. 찾아오시는 길
뚝섬역 5번 출구, 스타벅스 옆 흰색 빌딩 건물(밀크 빌딩) 지하 1층으로 오세요.
주소: 서울시 성동구 상원길 26
8. Contact Us
■ 홈페이지 채널톡
https://turingapple.com
■ 디스코드 채널
https://discord.gg/Md3yRcTRv9
■ 인포데스크 전화번호
02-463-0726
"""

 

문서를 분할하는 함수를 통해 앞서 입력한 문서를 분할합니다.

documents = split_documents(document, 128)

 

chromadb를 통해서 벡터 데이터베이스를 구축합니다.

import chromadb
client = chromadb.PersistentClient(path="./test.db")
def embedding_function(texts):
    return [ embedding_for_text(text) for text in texts]
db = client.get_or_create_collection(
    name="document",
    embedding_function=embedding_function
)
for idx, doc in enumerate(documents):
    db.add(
        documents=[ doc ],
        ids=[ str(idx) ]
    )

 

입력받은 질문을 통해 문서에서 필요한 문맥을 추출하는 함수를 정의합니다.

def build_context(question):
    context = ""
    for doc in db.query(query_embeddings=embedding_for_text(question), n_results=1)["documents"][0]:
        context += doc + '\n\n'
    return context
   
def generate_prompt(question, context):
    return f"다음 문맥에 기반해서 질문에 대해 한 두 문장으로 답변을 해줘.\n\n문맥:\n{context}\n질문: {question}"

 

아래와 같이 질문을 통해 문맥을 도출합니다. 

question = "주차는 가능해?"
context = build_context(question)
prompt = generate_prompt(question, context)
print(prompt)

 

위의 과정을 거쳐 얻은 질문과 문맥을 이용하여  chatGPT 같은 LLM 모델에 입력하면, 나만의 LLM 모델을 만들 수가 있게됩니다!