나만의 GPT 만들기, Embedding

매일매일 LLM 관련 새로운 발표들이 쏟아져 나오고 있다.
이미 ChatGPT 는 전 국민이 아는 단어이고, 많은 사람들이 사용하고 있다.
(당연히 나도 결제해서 유료 모델인 GPT4를 매우 유용하게 사용하고 있다.)

그럼 나는 이걸 이용해서 뭘 할 수 있을까?
작금의 LLM은 한계가 어디까지이고 잠재력은 어디까지일까?
직접 사용해 보고 느껴보자.
(LLM 은 GPT를 기준으로 보겠다. 가장 쓰기 쉽고, 잘 하고 있으므로.)

여기서 수행해본 코드는 내 github 에서 볼 수 있다. 나 혼자 써본 것이라 정리는 안 했다.

1. GPT 의 한계점

GPT 를 많이 사용해본 사람들은 알겠지만, 한계점이 뚜렷하다.

  • 모델 자체는 학습 시점까지, 학습에 사용된 지식이 끝이다.
  • 긴 토큰 (글, 대화 등) 은 너무 비싸서, context 를 길게 유지 할 수 없다.

첫번째로, 지식이 업데이트가 안된다. 그래서 bing 을 보면 검색엔진과 함께 돌면서 출처를 읽고 이를 가지고 GPT 가 대화를 한다. auto-gpt, bard 모두 마찬가지이다. 검색을 하고, 그 결과를 prompt에 같이 넣어서 gpt 가 올바른 지식을 이용하여 대화를 하도록 한다.

두번째로, 긴 토큰을 사실상 사용할 수가 없다.  Transformer 의 구조를 보면 알겠지만, 이 짧은 글에 설명할만한 내용은 아니므로 생략하고, 한마디로 너무 비싸다. 장편 소설을 GPT 가 한번에 쓰거나 읽을 수 없다는 것.  앞서 말한 지식을 같이 넣어주는 것도 한계가 있다는 것이다.

물론 GPT 는 모델이 올라가면서 토큰 사이즈도 커져가고 있는데, 비싼 것은 아직 어쩔 수 없다.

그렇다면, 어떻게 이를 해결할까? 우리는 모두 사람처럼 기억력도 있고, 검색 능력도 있는 것을 원한다.

2. Embeddings 를 이용한 기억력 구현

현재의 유망한 프로젝트 (또는 플랫폼) 들은 모두 이 방법을 사용하는 것 같다.
바로바로 Embeddings (!!) 를 기반으로 한 데이터 관리 이다.

이게 뭔지, 어떻게 돌아가는 것인지 부터 설명을 하겠다.

2.1. Embeddings

쉽게 말하면 "글""벡터"로 바꿔 놓는 것이다.

Word2Vec 을 봤었던 사람이라면 쉽게 이해할 것이다.
Word2Vec 은 글을 무대기로 주면 단어가 vector 로 표현되면서 아래와 같은 것이 된다.

한국 - 일본 + 서울 ??? 라고 물어보면, 도쿄! 가 튀어나온다.

2010년대에 많이 연구되었던 NLP 쪽의 연구 주제(?) 인데, 검색 엔진에 많은 기여를 했다고 한다. ( word2vec 을 만든 tomas mikolov 의 키노트를 현장에서 들은 적이 있는데, 그때 나는 이 분야를 하나도 몰랐던 학생이었고, 상당히 재미있었던 기억이 있다.)

어쨌든, 이걸 단어가 아니라 글 단위로 하는 것이다.  OpenAI Embeddings 문서를 참조하면, 자세한 설명을 볼 수 있다.

글을 벡터로 만들어 두면, 위 한계를 극복하기 위한 많은 방법들을 시도해볼 수 있다. Embeddings 를 사용하는 행위들은 아래와 같은 특징을 가진다.

  1. 우선 싸다.  OpenAI 에서 22년12월 발표한 2세대 Embedding 모델인 text-embedding-ada-002 기준, 1달러당 약 3000 페이지의 글을 벡터화 시킬 수 있다. (OpenAI 문서)
  2. 벡터화된 글은 검색, 추천, 분류 등 여러가지 행위에 대해 아주 빠르고, 싸다. 따라서 한계를 극복하기 중간 단계로 활용하기 좋다.

분류를 예를 들어보자. 수많은 글 쪼가리(?)들을 벡터화 시켜두면, 벡터들끼리의 유사성을 검사해서 비슷하게 모인 친구들끼리 묶어주면 (ex, k-means) 바로 분류가 완성이다. 검색, 추천도 마찬가지이다. 비슷한 벡터를 잘 찾아주면 된다.

"비슷한 글 찾기" 문제를 "비슷한 벡터 찾기" 문제로 치환했다. 이제 이 벡터들을 활용해 보자.

2.2. Vector Database

수많은 글을 embedding 해서 벡터로 만들었다. 이제 이 벡터를 활용해야 한다. 벡터 형태의 데이터가 많이 생겼고, 이를 다루기 위한 저장소가 필요하다. 이것이 바로 요즘 가장 핫하다는 VectorDB 이다. 얼마나 핫한지 몇 가지 소개를 하자면,

  • Pinecone, 2023.04.27, Series B $100M 투자, Valuation $750M
  • Chroma, 2023 초, Seed $18M 투자
  • Milvus (Zilliz 모회사), 2023초, $60M 추가 투자
  • QDrant, 2023 초, $7.5M 투자
  • Weaviate 등 그 외 다수의 VectorDB  프로젝트가 쏟아져 나오는 중.

수많은 글들을 다 저장하고, 필요한 부분들을 추출하는 기능을 벡터로 대신하면 엄청 효율적이다. 이 벡터들을 다시 효율적으로 저장하고, 꺼내 쓰는 데이터베이스가 VectorDB 이다. 이제 우리는 큰 텍스트 데이터가 아닌, 작은 벡터들로 싸고, 빠르게 저장하고 꺼내 쓸 수 있게 되었다.

2.3. 기억 저장소 사용하기

이제 이 VectorDB 는 기억 저장소이다. 필요할 때, 필요한 글만 써내 쓸 수 있다. 예를 들면,

"일론 머스크는 트위터를 얼마를 주고 샀지?" 라는 질문을 하자.

이 질문을 다시 벡터로 만들어서 VectorDB 에 검색을 한다. 그러면, 유사한 벡터가, (=비슷한 글들이) 뽑혀져 나온다. 수많은 글 (기억) 에서 연관 글 (기억) 만 뽑힌 것이다. 이 글을 다시 GPT prompt 에 질문과 함께 넣어주면, GPT 는 추출된 기억을 참고하여 답을 해주게 된다.

원리는 간단하다! 기억에 해당하는 내용을 미리 embedding 해서 vector 로 만들어 DB 에 저장을 해야 하지만.

범용 인공지능으로 향하고 있다는 Auto-GPT, LangChain 모두 위와 같은 방식을 사용한다. 구글링을 포함한 여러 방법으로 글들을 추출해서 같이 prompt 에 넣어주고, embedding 에서 VectorDB 에 저장한다. 필요하면, 또다시 VectorDB 에 계속 넣어주면서 장기 기억공간을 확장시키고, 필요한 내용만 GPT에 넣어서 활용한다.

3. 나만의 GPT 만들기

자 그럼 이제 나도 해보자. 과연 Auto-GPT 나 Langchain 의 usecase 처럼 잘 될까? 어떤 것이 잘되고 어떤 것은 안될까?

3.1. Youtuber GPT

무얼 해볼까 고민을 하다가, youtuber 검색기? 또는 chat with youtuber? 를 만들어야 겠다는 생각이 들었다.  요즘에는 youtube 에 양질의 자료들이 있는데, 이게 검색도 생각보다 잘 안되고, 영상을 봐야 정보를 얻을 수 있어서 글보다 습득 시간이 오래 걸리는 것이 불만이었다. 그래서, youtube 에 있는 정보를 글로 습득하면 좋겠다는 생각이 들었다.

흐름은 다음과 같다.

  1. 한 유투버의 영상 자막을 다 받는다.
  2. 영상 하나하나의 자막을 embedding 시킨다.
  3. 이 벡터로 검색하고, 가져와서 prompting 한다.

3.2. 침착맨 Meme 검색기 (Failed)

제일 처음 시도한 것은 침착맨의 쇼츠 컨텐츠 이다.
왜냐하면, Embedding 을 시킬 수 있는 단위가 그리 크지 않다. 20~30분 영상의 자막은 하나의 글로 취급해서 벡터화를 시킬 수가 없다. 그래서 일단은 쇼츠로 끊기는 컨텐츠를 해보고자 하다보니, 침착맨 쇼츠에는 밈들이 있으니 이를 데이터로 만들어보고자 했다.

결론은, 전혀 원하는 결과가 안 나왔다. 이유를 보아하니 첫째로 자막이 개판이다. 발음도 부정확하하고, 신조어들을 많이 쓰다보니 글의 퀄리티가 너무 후지다. 내가 봐도 자막이 이해가 안된다. 둘째로, 화자 구분이 안된다. 여러 명이 대화하면 누가 무슨 말을 한 건지 구분이 안되어서 의미가 해석이 잘 안 되는 것 같다 (추측임).

3.3 슈카월드 GPT (Failed)

다음은 슈카월드에 도전했다. 우선 여기는 혼자 말하고, 말이 꽤 정갈(?)한 정보성 컨텐츠 이기 때문에 괜찮을 것이라 생각했다. 문제는 하나의 주제인 하나의 영상이 너무 길다는 것. 요약 기능을 추가하면 될 것 같아서 시도해 보았다.

Try  1. 영상 자막을 받고, 요약을 하고, 임베딩을 시킨다. 그리고 활용한다.

OpenAI 의 요약을 사용했는데, 엄.... 너무 비싸더라. 오래 걸리길래 한숨 자고 왔더니 내가 걸어둔 $100를 다 소진했는데도, 못 끝냈다....;; 그래서 Hugging face 에 가서 한국어 요약 모델 찾아다가 적용 시키고 다시 진행했다. 요약은 잘 되었는데, 검색결과가 잘 안나오더라. 아마도 요약하면서 정보들이 날아가서 그런가? 라는 가설을 세우고 재 시도했다.

Try 2. 영상 자막을 받고, 잘라서 임베딩을 시킨후, 벡터들을 평균내서 영상하나의 벡터를 만든다. 그리고 활용한다. Prompt에 넣을 때도, 사이즈가 모자라니 요약을 해서 넣는다.

역시나 안된다. 질문들에 대해 척척 대답하지 못하고 헤매더라. 역시 마지막에 요약해서 정보가 날아가는 것이 문제일까? 아니면 한글이 문제일까?

3.4 MKBHD GPT (Succeeded)

이번엔 영어로 해보자. 내가 자주 보는 1600만 구독자의 테크유투버 MKBHD 채널의 영상을 대상으로 해봤다. 역시나 내용이 토큰 limit 을 넘어서 임베딩&요약을 기반으로 만들었다. 놀랍게도 잘 된다 (!!) . 한글이 문제라는 사실을 확신하게 되었다.

4. 직관적인 이해

4.1. GPT의 한국어와 영어 실력

기본적으로 현시점 기준, OpenAI 에서 API 로 사용할 수 있는 GPT 는 3.5버전이 제일 좋다. 문제는 이 친구가 한국어를 잘 못한다는 것. 4 버전은 꽤 잘하던데, 지금은 waitlist 에서 간택된 사람들만 사용할 수 있다. 사용 할 수 있다고 해도 너무 비싸다. 서비스로 운영할만한 마진이 나올까 하면 미지수.

잘한다/못한다 라고 내가 평가를 내렸는데, 이것도 사실 주관적인 것이라 정량적으로 표현하기는 어렵다. 그냥 내가 써보기에 만족스러운가 느껴보는 것이다.

GPT4 가 공개되면 다시 한국 유투버로 도전을 해보겠다.

4.2. 한국어와 영어의 토큰 수

GPT 는 토큰 갯수로 처리하는 글의 양을 판단한다. 이 토큰수는 OpenAI Tokenizer 에서 계산해 볼 수 있다. 한글은 잘 안되어가지고, 직접 tiktoken 파이썬 패키지로 해볼수 있다.

이 포스트의 첫 문단을 한글로 tokenize하면, 477 token 이 나온다. 그런데, 이 문단을 번역기로 영어로 바꾼 후 tokenize 236 token 이 나온다...

같은 정보량이지만 한글로 쓰면  영어에 비해 토큰 수가 약 2배다.

이 얼마나 불리한가. 비용이 비싼 것도 문제지만, GPT와 대화할 때, prompt 에 넣어줄 수 있는 정보량이 반토막이라는 것이 큰 문제이다. 번역이 잘되면 번역을 갔다 오는 것이 더 유리할 수도 있다.

4.3. 그래서 어떤 문답이 가능한가?

한국어, 영어 차이는 알겠다. 영어로 한다고 치면, 어떤 것이 가능해 졌을까?

예를 들어보자.
"지금 제일 좋은 폰이 뭐야??" 라고 묻는다면, 이를 벡터화해서 유사한 영상을 찾는다. best smartphon of 2019 와 같은 영상들이 나오고, 이 영상 내용과 함께 질문을 prompting 한다면, 되돌아 오는 답은 바보 같다. 왜냐하면 영상 내용의 자막에서는 2019 시점이기 때문에 현존 좋은 폰은 과거의 폰이니까.

이를 해결할라면 시점을 고려해서 글을 바꿔줘야 하는데... 하면 되겠지.

다른 질문을 던져보자.

"아이폰 14의 스펙을 읊어줘" 라고 묻는다면, 아이폰 14 리뷰 영상이 나오고 여기서 정보를 찾아 읊어준다. 아주 잘 대답한다. 미래에 시점에 다시 묻는 다면, 그때 새로나온 폰에 대한 정보도 잘 읊어줄 것이다.

결국, 이렇게 해서는 논리적인 생각은 못하고, 추가 정보만 있는 대화 모델이 된 것이다. 이것이 작금의 한계점이라고 볼 수 있겠다.

이것도 조금 지나면 다들 해결해서 새로운 프로젝트들이 나오겠지만 말이다. 누가 어떻게 해결해줄까?

다음은?

일단 나는 코드를 정리해서 누구나 사용할 수 있게 오픈소스화 하고, 가볍게 서비스나 만들어 볼까 한다. 만들어지면 또 포스팅 하겠다. 아직은 데이터가 작아서 vectorDB를 사용하지 않고 직접 관리 했는데, DB 도 사용해볼 예정이다.

비슷한 예시로, https://paul-graham-gpt.vercel.app/ 와 같은 프로젝트가 있다. 유투버가 아닌 paul graham 의 에세이로 만들어진 것인데, 동작 원리는 동일하다.

lang chain 을 이용한 pdf gpt도 위와 원리가 동일하다. pdf 문서를 잘라서 embedding 시켜서 관련 부분만 넣어서 gpt 와 대화하는 방식.

이제 수 많은 fancy 한 프로젝트들의 실체(?)를 알았다. 막 다 될 것 같지만 그렇지 않다는 것. 무엇이 되고, 무엇이 안되는 지.

앞으로 또 어떻게 한계가 뚫릴지 기대가 되고, 이걸 지켜보는 것은 언제나 항상 즐겁다.