티스토리 뷰
금요일(2024년 8월 9일) RAG에 대해 직원들에게 설명하는 시간이 있었습니다.
그 시간에 했던 설명을 정리했습니다.
이날 참석했던 사람들 중에 인공지능(머신러닝, 딥러닝, 자연어 처리, 랭체인 등)에 대해 모르는 사람도 섞여 있어서 최대한 쉽게 설명했습니다.
내용은 지금까지 제가 학습했던 여러 글들을 정리한 것에 제 나름의 판단을 추가하여 설명한 것이기에 잘못된 부분이 있을 수 있습니다.
1. 언어모델
a. 언어모델이란 "문맥을 통해 다음에 나올 단어(말)를 예측하면서 문장을 완성하는 모델"입니다.
i. 예를 들어 "나는 회사에 출근할 때 <마스크>를 타고 출근합니다. <마스크>는 사람이 많고 복잡하지만 정확한 시각에 도착할 수 있어서 이용하고 있습니다" 라는 문장에서 <마스크>에 들어갈 수 있는 단어를 찾는 것이 언어모델이라 말할 수 있습니다. <마스크>에는 "지하철", "버스", "자가용" 등이 있을 수 있습니다. 앞뒤 문맥을 봤을 때 "지하철"이 적당한 단어가 될 것입니다.
ii. 이러한 형태로 단어를 예측할 수 있도록 하는 것이 언어모델입니다.
iii. 이 모델을 통해 다음 단어를 예측하면서 문장이 완성될 수 있습니다.
b. 언어모델 종류
i. GPT / BERT / claude / llama / gemini 등이 있습니다. 특히 GPT(Generative Pre-trained transformer)는 많은 문장을 위에 예를 든 것처럼 문장에서 단어를 마스크 처리하여 적당한 단어를 찾는 사전 훈련된(Pre-trained) 생성 모델입니다.
ii. GPT와 chatGPT는 다른 것입니다. chatGPT는 언어모델인 GPT를 활용하여 만든 챗봇을 의미합니다.
2. Fine Tuning 과 RAG(Retrieval Augmented Generation)
a. 머신러닝(딥러닝) 기본
i. 당뇨병 예측 모델을 예로 들어 설명합니다.
1) 특성(Features) : x1, x2, x3 가 있다고 가정. 주어진 데이터 값.
2) 레이블(label, target) : 변수 y를 사용. 결과 값으로 y=0(당뇨가 아닌 경우), y=1(당뇨인 경우)
3) 가중치(weights) : x1, x2, x3에 각각 곱해지는 값(w1, w2, w3)
4) 편향(bias: b) : 함수식에서 상수항을 의미
5) 모델 : y = w1 * x1 + w2 * x2 + w3 * x3 + b
6) 한 행에 x1, x2, x3, y 네 개의 열을 가진 데이터를 10,000개로 훈련을 한다고 가정합니다.
ii. 당뇨병 예측 모델을 훈련한다는 것은 w1, w2, w3, b 값을 찾는 과정
1) 첫 행에서 y_hat = w1 * x1 + w2 * x2 + w3 * x3 + b 값을 구하고 y_hat과 y 값을 비교합니다. 이러한 과정을 10,000 행에서 모두 구하여 y-hat과 y의 차이를 손실로 계산합니다. 이때 w1, w2, w3, b 값은 임의의 값입니다.
2) 이 손실을 줄이는 방향으로 훈련데이터를 반복하면서 이 값(가중치, 편향)을 찾습니다. 물론 10,000개 데이터를 훈련데이터(train dataset), 검증데이터(validation dataset), 시험데이터(test dataset)로 나누고 하는 것들이 있지만 그냥 간단하게 설명합니다.
3) 이렇게 구한 w1, w2, w3, b 값과 예측해야할 데이터(x1, x2, x3)를 이 모델 식에 넣었을 때 결과값(y)이 0이면 당뇨가 아니고 1이면 당뇨로 예측하는 것입니다.
4) 기본에 대해서 설명한 이유는 Fine Tuning과 RAG를 설명하기 위함입니다.
iii. 머신러닝 모델은 가중치 값과 편향을 찾아 예측하고자 하는 데이터를 모델 식에 대입하여 결과를 예측하는 것입니다. 이는 딥러닝에서도 비슷한 형태로 진행됩니다. 이 부분은 다음에 기회가 되면 설명하겠습니다.
iv. 머신 / 딥 러닝에서 모델이라는 의미는 훈련을 통해 구한 가중치와 편향을 보관하고 있다고 생각하면 됩니다. 예측할 데이터에 이 가중치를 곱하고 편향을 더해서 결과를 구하고 예측하는 것입니다.
b. 데이터 10,000개를 훈련을 하여 가중치와 편향을 구했다고 가정합니다.
i. 일정 시간이 지나 4,000개의 추가 데이터가 발생했다고 했을 때 이를 모델에 적용하는 방법입니다.
ii. 방법 1 : 처음 10,000개 데이터와 추가 4,000개 데이터를 모두 섞어서 처음부터 새로 훈련하는 방법입니다.
iii. 방법 2 : 처음 10,000개 데이터로 훈련한 모델에서 모델이 구한 가중치와 편향이 있습니다. 추가된 데이터 4,000개로 훈련을 진행하고 결과로 이전 가중치와 편향을 조정합니다. 그래서 데이터 14,000개에 대한 새로운 가중치와 편향이 생성됩니다. 이 방법은 "방법 1"보다 정확하지는 않을 수 있지만 시간과 비용을 절약할 수 있습니다. 추가 학습된 모델은 새로운 가중치와 편향을 가지고 있습니다.
iv. 방법 3 : 처음 10,000개를 훈련한 가중치와 편향은 그대로 두고 4,000개의 특성을 보관하여 앞으로 예측해야할 데이터는 처음 10,000개 모델을 기반으로 하지만 추가된 4,000개 데이터의 특성을 더 비중있게 적용하는 방법입니다. 이 방법은 처음 10,000개 데이터를 통해 구한 가중치와 편향이 그대로 유지됩니다.
c. 방법 1 : 시간과 비용이 많이 필요합니다. "GPT 3"에서 "GPT 4"로 모델이 진화되는 경우라 생각하면 됩니다. 이렇게 전체적으로 GPT를 훈련시키는 비용이 우리돈으로 50억이 넘게 들어간다고 합니다. 그리고 모델을 학습하는데 몇 개월이 걸릴 수도 있습니다.
d. 방법 2 : 시간과 비용이 방법 1에 비해 다소 적습니다. 예를 들어 법률 전문 언어 모델을 만들고자 하면 "GPT 3" 모델에 법률과 관련된 데이터들을 추가하고 학습하여 가중치를 조정하고 새로운 가중치와 편향을 가진 모델을 저장하는 것입니다. 이 모델에는 처음 가중치, 편향과 다른 값을 가집니다. 이 모델을 불러와 예측, 생성등의 결과를 도출합니다. 이러한 방법을 Fine Tuning이라 말할 수 있습니다.
예전 인공지능을 배우면서 프로젝트를 진행할 때 Fine Tuning을 하여 훈련하는데 48시간 이상이 필요했던 것으로 기억합니다.
e. 방법 3 : 시간과 비용이 매우 저렴합니다. 예를 들어 A라는 법률회사에서 관리 지침서가 있고 이것을 참조하여 법률 문서를 작성한다고 했을 때 그 지침을 언어모델과 결합하려고 시도할 수 있습니다. 이때 언어모델은 그대로 두고 지침서만을 별도 DB로 보관하여 지침서를 우선하여 검색하고 결과를 도출한다고 할 경우에 해당합니다. 원 언어모델의 가중치와 편향은 그대로입니다. 이 방법이 RAG이라 말할 수 있습니다.
3. RAG 기본 코드
<코드는 테디노트 블로그와 langchain documents를 참조했습니다>
4. 결과
a. 결과입니다. 처음은 코드를 모두 넣었고 두 번째부터는 question과 답변만 적겠습니다.
question = "대법원장 임명에 관해 알려주세요."
response = chain.invoke(question)
print(response)
답변 : 대법원장은 대법관회의의 동의를 얻어 임명하며, 임기는 6년으로 하며 중임할 수 없습니다.
b. question = "상해를 입힌 사람에 대한 처벌은 어떻게 되나요?"
답변 : 상해를 입힌 사람에 대한 처벌은 7년 이하의 징역, 10년 이하의 자격정지 또는 1천만원 이하의 벌금에 처한다.
c. question = "헌법에서 국무위원과 관련된 내용을 불릿 형태로 정리해주세요."
답변 : - 국무위원과 정부위원의 성명
- 부의안건과 그 내용
- 의장의 보고
- 위원회의 보고서
- 의사
- 표결수
- 기명ㆍ전자ㆍ호명투표의 투표자 및 찬반의원 성명
- 의원의 발언보충서
- 서면질문과 답변서
- 정부의 청원처리결과보고서
- 정부의 국정감사 또는 조사결과처리보고서
- 기타 본회의 또는 의장이 필요하다고 인정하는 사항
d. question = "국무위원의 역할과 책임에 대해 설명해주시고 관련된 법조항을 마지막에 표기해주세요."
답변 : 국무위원은 대통령을 보좌하고 국정을 처리하는 역할을 맡고 있으며, 국무회의의 의장을 맡습니다. 국무위원은 국정을 처리함에 있어서 대통령에게 책임을 집니다. 관련 법조항은 헌법 제86조입니다.
5. 진행해야할 사항(과제)
a. 위의 코드는 가장 기본적인 내용입니다. 여기에 옵션들이 무수히 많습니다. 예를 들면 문서 분할에서 chunk_size=300과 chunk_size=1000일 때도 결과가 달라집니다.
b. 옵션에서 선택해야하는 몇가지를 예로 들겠습니다.
i. 문서 분할 : CharacterTextSplitter, RecursiveCharacterTextSplitter 등
ii. vectorstores : FAISS, Chroma 등
iii. retriever : sparse, dense 등
iv. retriever search_type : similarity, mmr 등
v. chunk_size, chunk_overlap을 제외하고도 옵션을 조합할 수 있는 것이 천만 가지 이상이라고 합니다.
c. 이렇게 구현된 RAG와 chatbot을 연계하여 채팅을 통해 결과를 유도해야 합니다.
6. 마무리
RAG를 설명하면서 인공지능에 대해 전반적으로 내용을 전달했습니다.
RAG의 옵션 부분은 설명할 부분이 많아서 좀더 정리가 필요합니다.
또 공유해야할 것들이 있으면 다시 글을 올리겠습니다.
'machineLearning > GPT' 카테고리의 다른 글
| 시 짓기 2 - GPT (1) | 2024.08.18 |
|---|---|
| 시 짓기 - GPT (0) | 2024.08.16 |
| 챗봇 (0) | 2024.07.26 |
| 랭체인을 이용한 챗봇을 만들며 하는 작업 (0) | 2024.07.02 |
| 랭체인 모델의 매개변수에 대한 설명 (0) | 2024.06.28 |
- Total
- Today
- Yesterday
- 챗봇
- 약수
- streamlit
- programmers.co.kr
- programmers
- LLM
- FewShot
- 텐서플로우
- prompt
- ChatGPT
- AI_고교수학
- 감히 아름다움
- Chatbot
- 미분법
- TensorFlow
- 랭체인
- 고등학교 수학
- 로피탈정리
- 미분계수
- 도함수
- 변화율
- RAG
- GPT
- checkpoint
- 미분
- 프로그래머스
- Python
- router chain
- LangChain
- 파이썬
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |