본문 바로가기

LLM

[Session 0]:Scratch 나만의 GPT Project

반응형

*참고로 이거 안봐도 나만의 GPT 만들 수 있도록 포스팅은 하는데 읽어 보면 재밌을거에요. 웬만한 지식으론 이해 안될텐데 가능하게 적어 둠

 

CONTENTS

01. 개발에 앞서...

02. RAG Open source 퍼포먼스는?

03. 무엇을 만들어 볼까?

 

[개발에 앞서...]

 

개발에 앞서선 기획을 해야겠지.

 

시장 조사는 스킵할려고요. 왜냐면 무엇을 컨텐츠로 잡을지 모르겠어요 아직. 재밌는게 생각이 안나네요. 혹시라도 댓글에 뭐 만들어 주세요 라고 적으면 고민은 해볼게요.

 

일단 전체적으로 나만의 GPT를 만들려면 Open AI 에서 제공하는 바닐라 GPT로는 조금 어려울거 같아요. 쟤는 인터넷 세상에 떠돌고 누군가가 학습 시킬려고 만든 데이터를 토대로 만들어진 애라 내 이름도 모를거에요. 

 

그래서 막연히 내가 학습 시키고 싶은 걸 GPT에게 학습 시키는거부터 시작해볼려고요.

 

그럴려면 뭘 해야할까요?

 

1. GPT를 학습 시키기 위한 무엇인가를 만들어야 할거에요. 

 

- 여기서 무엇인가는 Retrieval Augmented Generation(RAG)를 활용해볼게요. RAG 관련해서는 제 블로그 첫 포스트에간략히 설명해뒀어요. 아니면 구글에 그냥 스윽 쳐보면 잘 나와요.

 

그래도 3줄 요약 해드림

- Retrieve(검색) 외부 지식 소스에서 임베딩 모델을 통해 벡터 데이터 베이스의 추가 컨텍스트와 동일한 벡터 공간에 임베딩함. 다시 말해 새로 지식을 임베딩 모델로 점으로 수천 차원에 한 점으로 찍히고 질문에 맞는 답변인지 아닌지 GPT가 질문의 의미를 분석하고 이걸 벡터화하여 점으로 표기하고 그 점과 가장 가까운 애를 검색한다는 말임. (답변 찾기)

- Augmented(강화) 너만의 Prompt를 만들어서 너가 학습 시킨 답변에 대한 정답을 유저가 보다 정확하게 받아 볼수 있도록 만드는 거임

- Generate(생성) 이제 GPT가 너가 학습시킨 데이터와 Prompt를 받아들임. 그리고 생성함.

 

2. Retrieve 과정에서 고려해야할 점을 생각해보자

- 고려사항 1. 어떤 데이터를 학습 시키는 것이 현 기술 상황에서 가장 Nice할까?

- 고려사항 2. 학습 시킬 내용을 어떻게 청킹하면 잘 학습이 될까? 잘 학습이 되었다는 척도는 무엇으로 결정해야할까?

- 고려사항 3. 일단 생각 안남.

 

3. Augmented 과정에서 고려해야할 점을 생각해보자

- 고려사항 1. Prompt Template에 대해서 상용화를 한다는 가정하에 고찰이 필요함

a. 이게 텍스트로 들어온다 이미지로 들어온다를 정해줘야하는건지?

b. 텍스트라면 유저들이 기입할 수 있는 모든 경우의 수를 다 생각해서 정해줘야하는지?

c. 아니면 Formation만 정해주면 되는건지?

 

결론 : 일단 Augemented 한 케이스를 조금 조사하고 벤치마킹 하는걸로 한다.

 

4. Generating

- 고려할게 없다. 그냥 GPT API 키 넣고 돌려보자.

 

 

[RAG Open source 퍼포먼스는?]

 

A. 현재 RAG Open source 종류는 많을 텐데 구글에 검색해보니 대표적인 8개가 있는거 같다.

  1. RAG on Hugging Face Transformers (link)
  2. REALM library (link)
  3. NVIDIA NeMo Guardrails (link
  4. LangChain (link)
  5. LlamaIndex (link
  6. Weaviate Verba: The Golden RAGtriever (link)
  7. Deepset Haystack (link)
  8. Arize AI Phoenix (link)

B. 각각 어떤 애들인지 Research를 해보자

 

1. RAG on Hugging Face Transformer

 

- Composition : pretrained dense retrieval(DRP) & Seq2Seq 모델(딱봐도 pre-trained되어 정확한 제어불가가 제약일듯)

- Usage : Fine-tuned on downstream NLP task 라고 함. (말 그대로 이미 학습 된애들을 가지고 task를 진행한다는 말임)

- Limitation : 이미 학습된 애들이라 사실 기반의 Knowledge를 downstream task에 적용 시키는건 좋지만 정확한 데이터 접근 및 학습된 지식을 제어하는 능력이 제한적

 

아무리 GPT가 Syntetic Sementic한 분석 및 결과 도출 능력이 좋더라도 RAG가 이런 제약이 있으면 나만의 GPT에 하자가 분명이 있을거 같음. 일단 계속 리서치 해보자.

 

2. REALM Library

 

Realm 관련 논문은 2020 NIPS에 발표된 'Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks'로 pre-training으로 미처 parameterize하지 못한 외부의 지식들을 활용할 수 있는 general한 seq2seq 구조를 제안한 논문입니다.

 

- Composition

모델 (내가 Retrival 할때 벡터로 학습한다고 설명했는데 이건 다른 방법임)

 

간단히 말해서 수천차원 속의 벡터 값과 질문 벡터 값의 길이가 가장 짧은 내용 = 학습 데이터에 대한 분포를 생성하기 위해 document를 latent variable로 분류해서 marginalization 진행. 그리고 target token을 확률적으로 계산 후 Generating 한다고 이해하면 조금 편할거에요.

 

Layer 1. RAG-Sequence Model  - 동일하게 검색된 문서를 사용하여 target sequence를 생성, 그리고 top-K approximation을 통해 seq2seq prob 값을 얻기 위해 검색된 passage를 marginalized single latent variable로 처리

 

Layer 2. RAG-Token Model - RAG-Token Model은 각 target token에 대해 다른 latent passage를 사용(다른 문서 사용이라고 해석하면 됨), 이를 통해 generator는 답변을 생성할때 여러 doc에서 내용을 선택 할 수 있다.

 

* 이해 잘 안되시면 독자 여러분 데이터를 GPT나 BERT가 찾을 수 있게 만들어주는거라고 생각하세요(GIF참조)

META에서 RAG 전체 학습 방법이라고 함(seq2seq for decoder)

 

- Usage : 텍스트 corpus(말뭉치)에서 문서를 검색 한 후 검색된 문서를 활용하여 질의 응답 작업 처리 (요건 ChatBot용도로 쓰면 괜찮을 거 같은데.. 빠르게 만들어서 주관적 퍼포먼스를 공유해줄게요.) Open QA Benchmark Dataset 기준 margin이 4~16% 절대 정확도로 성능이 우수하다고 함.

 

- Limitation : 이것도 위키피디아 base로 pre-trained된 모델인점, 그리고 논문 마지막에 읽어보면 저자들은 RAG가 가진 neural retrieval mechanism이 아닌, overlap 기반의 BM25 retrieval, freezed neural retrieval로 진행 그리고 A/B 테스트 결과 성능 향상이 없다고 함. 고로 위키피디아가 아닌 독스 기반의 데이터를 추가 학습한다고 해서 Dramatic한 무엇인가가 나올지는 의문

 

3. NVIDIA (NeMo-Guardrails)

Composition : nemo 가드레일은 RAG 그 자체라기 보다 RAG와 LLM을 활용한 어플리케이션을 만들 때, LLM의 Hallucination을 감소하시켜, 정확하고 적절하게 응답하도록 한다고 함. (오픈소스 툴킷 LangChain 위에서 주로 실행한다고 한다. Lang Chain은 아래에서 설명 할게요.)

 

Usage

 - Question / Answering (aka RAG)

 - Domain-specific Assistant (aka chatbot)

 - LLM Endpoints (Hallucination(aka bull shit) 방지)

 - LangChain 

 

Limitation

- 일단 코드를 짤 줄 아는사람이 생각하면서 넣어야 하는게 제약인데 (내 제약은 아니라 추후에 저도 개발하면서 설명해드릴게요. 한번도 안해본 친구라 감이 안와요)

 

4. LangChain (일단 제일 중요함, 마음속으로 얘를 써야하지 하고 이 포스팅을 쓰는거라서요/ 중요하다는 근거는 Use Case가 너무 많아요)

랭체인(LangChain)은 노출하여 대규모 언어 모델과 애플리케이션의 통합을 간소화하는 SDK이다. 다시 말해, 랭체인을 통해 Data Source를 Fetch 하고 청킹 된 Context를 임베딩하여, 벡터 데이터 베이스에 저장과 검색을 할 수 있도록 통합시켜 결론적으로 LLM모델에 프롬프트를 보내고 응답 할 데이터를 찾는 통합 SDK라고 생각하면 된다.

 

Composition

LangChain Templates

복잡해 보이지만 크게 Model I/O, Agent, Data Connection, Call back Function, Memory 정도만 기억하자.

 

Model I/O 모듈은 LLM과의 상호 작용을 다루고 기본적으로 효과적인 Prompt 생성, Model API 생성, 결과 해석을 어시스트 하는 역할이다.

 

Agent 는 랭체인에서 아주 강력한 모듈이다. LLM은 추론과 행동이 가능(ReAct Prompt 기법)한데 랭체인에서는 LLM을 사용하여 Prompt를 행동 계획으로 추출한다. 다시 말해 하드코딩 한다고 생각하면 되며, 언어 모델에서는 추론 엔진으로 사용 되어 어떤 순서로 어떤 동작을 취할지 결정한다.

 

Memory 는 LLM이 상태 비저장형이라 이전 Response가 저장이 되지 않아 단기 / 장기 메모리를 쉽게 추가 할 수 있도록 도와준다. 메세지 기록은 외부 소스에 저장되어 장기 메모리를 유지할 수 있다. Redis를 사용하면 쓸만할듯.

 

Call Back Function 은 로깅, 모니터링, 스트리밍 및 기타 작업에 유용하다. 파이프라인 내에서 특정 상황이 발생할 때 호출되는 사용자 지정 콜백 핸들러를 작성 할 수 있으며, 기본 콜백은 모든 단계의 출력을 콘솔에 간단히 print out한다.

 

Data Connection 은 ETL 파이프 라인에 해당하며, PDF / Excel / Csv와 같은 외부 문서를 로드하고, 이를 처리하기 위해 일괄적으로 단어 임베딩으로 변환 후 벡터 디비에 저장 및 쿼리를 통해 검색함.

 

Usage

 

웬만한 LLM관련 어플리케이션에 활용할 수 있을것으로 보입니다. 하지만 앞서 말한대로 Vector기반과 Marginalization기반의 결과 추론 중 어떤게 더 퍼포먼스가 좋을지 궁금해졌다. 

 

Limitation

 

이미 만들어진 라이브러리라서 간단히 프로그래밍하기엔 좋지만 성능은 과연 어떨지 궁금합니다.

 

5~8번 are coming soon ;)

반응형

'LLM' 카테고리의 다른 글

Retrieve Augmented Generation (RAG)  (1) 2023.12.01