Next Software

Next Software
Photo by Juanjo Jaramillo / Unsplash

세계적으로 존재하는 다양한 프로덕트의 카테고리 중에서 제일 빠르게 발전하고 있는 분야이자 기술적으로 선도하고 있는 분야는 단연코 소프트웨어 시장이라고 생각한다. 다른 시장과는 다르게 scalability가 크고 risk가 적기에 많은 사람들이 도전하고 있고 그만큼 빠른 발전이 이뤄진다. 이번 글에서는 소프트웨어 시장 안에서 우리는 어떠한 미래를 준비해야 되는지 다뤄보자.

New Software

작년 말 ChatGPT의 시작으로 새로운 소프트웨어의 패러다임이 열렸다. 정해진 태스크만 수행할 수 있던 ML모델이 아닌 general한 질문을 zero-shot (아무 예시 없이 대뜸 물어보는 것)으로 대답해줄 수 있는 모델이 된 것이다. 냉정하게 지금까지 연구되던 NLP와 달라진 것은 하나도 없지만 폭발적으로 증가한 모델의 크기와 instruction이라는 개념의 도입으로 인해 기존에는 느끼지 못했던 wow point를 느끼게 되었다. GPT-3까지는 AI의 능력에 대해 신기해하긴 했지만 사람에게는 도움이 될 정도는 아니었다. 하지만 GPT-3.5부터 사람에게 경이로움을 주고 실제로 도움이 될 수 있는 수준까지 성장하게 된 것이다.

이 LLM은 결국 인간이 그토록 원하던 인공적으로 만든 지능, 즉 AI의 시작이라고 봐야 한다. LLM 이전에는 정해진 태스크만을 수행할 수 있던 ML모델들이 있었지만 현재 관점에서 이를 다시 바라보면 AI라기보단 말 그대로 "머신러닝"에 더 가깝다. AI와 머신러닝이 같은 것으로 불렸지만 현재에선 다시 분리되어야 한다고 생각한다.

우리가 소프트웨어를 다시 정의해보자.

Software 1.0: 정해진 대로 행동함
Software 2.0: 정해진 데이터셋과 최대한 유사하게 행동함
Software 3.0: 정해진 프롬프트대로 행동함

버전이 올라갈 수록 확장성은 올라가지만 안정성과 속도는 낮아진다.

Software 1.0 vs 2.0

머신러닝 서비스를 생각해보자. 2012년 AlexNet이 등장하고 나서 머신러닝의 3차 겨울이 끝나고 봄이 찾아왔다. 전세계적으로 수많은 연구자들이 머신러닝을 연구하기 시작했고 2016년, 2017년 어느 정도의 하입이 생기기도 했지만 2019년, 2020년 정도부터는 안정화되기 시작했다. 하입이 생겼을 때는 머신러닝 기술만으로 지금까지의 서비스들을 대체하고자 하였기 때문이라고 생각하고, 안정화되었을 때는 기존의 서비스들과 머신러닝 기술 간의 조화를 찾았기 때문이라고 생각한다. (물론 머신러닝 기술의 발전으로 인해 조화를 찾기까지의 난이도가 낮아진 것도 맞다.)

머신러닝에게 100%는 없다. 알고리즘에게는 100%가 있다. 하지만 머신러닝은 수많은 인력을 대체할 수 있다. 이 트레이드오프 관계 속에서 적절한 밸런스를 찾아야 한다. 만약 100%가 필요한 곳이라면 머신러닝을 쓰지 않아야 한다. 95%의 성능으로 인력을 성공적으로 대체할 수 있는 분야라면 당연히 도입해야 한다. 페이스북이나 인스타그램에서 팔로워 추천을 생각해보자. 유저에게 추천된 팔로워 중 1명이 마음에 안 들 수 있다. 그러나 19명의 마음에 드는 팔로워로 인해 유저가 원하는 팔로워를 빠르게 찾을 수 있다. 이를 사람이 하지 않고 머신러닝으로 대체함으로써 수많은 인력을 대체하면서 유저에게 가치를 제공하고 잘못 추천된 경우 얻게 되는 리스크는 굉장히 적다.

처음에는 머신러닝 기술을 대대적으로 내세운 회사들이 많았지만 다들 PMF를 찾지 못했고 백 단에 자연스럽게 기술이 스며든 회사들이 오히려 PMF를 잘 찾게 되었다. 추천, 검색, 음성 인식/합성 등의 분야를 통해 구글, 아마존, 메타 등등이 대표적인 예시겠다. 이런 회사들의 특징을 보면 100%가 필요한 곳에는 머신러닝을 쓰지 않았다. 높은 확률을 갖는 것 자체가 가치를 제공할 수 있는 곳에 머신러닝을 적용한다. 유저가 상품을 검색했을 때 어떤 상품이 나올지는 머신러닝을 쓰지만 상품 자체의 이미지나 설명을 머신러닝으로 대체하지는 않는다. 이미지나 설명은 100% 정확해야 하기 때문이다.

Software 2.0 vs 3.0

머신러닝과 LLM도 유사한 관계를 가지고 있다. LLM은 세상의 모든 지식을 미리 습든했기에 데이터셋 구축 없이도 사용 가능하지만 머신러닝처럼 명확한 objective가 주어져 있지 않기 때문에 정해진 objective에선 머신러닝보다 성능이 낮을 수 있다. 즉 데이터셋 구축 비용을 아끼고 성능 저하가 발생한다. 물론 머신러닝은 완벽한 데이터셋이 존재한다는 가정 하에 해당 데이터셋에서 LLM보다 훨씬 나은 결과를 보여주겠지만 그런 데이터셋을 구축하는 것이 매우 어려우므로 태스크에 따라 LLM을 사용할지, 머신러닝을 사용할지 잘 정의해야 한다.

지금 ChatGPT가 등장하고 나서 소프트웨어의 변화를 생각해보자. 처음에는 모든 사람들이 LLM만으로 다 될 줄 알고 LLM으로만 소프트웨어를 만들고 서비스를 만들었다. 유저의 쿼리에 맞는 상품을 추천하기 위해서 존재하는 상품들을 전부 context로 넣고 유저의 쿼리에 맞는 상품을 추천해달라고 했다. 물론 LLM은 이런 일반적인 태스크에 대한 역량이 있기에 당연히 좋은 추천을 해주었다. 하지만 상품 수가 더 많아지고 context의 한계가 오고 추천의 속도가 느려지면서 사람들은 새로운 방법을 찾게 되었다. 그것은 바로 vector search이다. vector search는 상품을 미리 임베딩해두고 (임베딩이란 컴퓨터가 이해할 수 있는 형태로 실수값 리스트로 변환하는 과정을 의미한다.) user query를 임베딩하여 제일 가까운 상품을 찾는 방법이다. 전통적인 머신러닝 기법이며 Software 2.0이라고 볼 수 있다. 해당 기법은 zero-shot으로 임베딩하며 할루시네이션이 발생하지 않는다. 즉 확장성은 잃지 않고 서비스의 안정성과 속도를 얻을 수 있는 좋은 방법이 된다.

Software Version

지금까지 풀어서 설명한 Software 1.0, 2.0, 3.0의 차이를 표로 명확히 정리해보자.

Version Stability Generality Speed Cost Context Size Design
Software 1.0 High Low High Low Large Algorithm
Software 2.0 Normal Normal Normal Normal Medium Data
Software 3.0 Low High Low High Small Prompt

각각의 버전은 위와 같은 특징을 갖고 있다. 새로 나온 Software 3.0과 함께 우리는 어떠한 소프트웨어를 만들어야 할까?

Next Software

낮은 버전의 소프트웨어는 필수적이다.

  • 낮은 버전의 소프트웨어는 높은 버전의 소프트웨어가 필수적이지 않다. 하지만 높은 버전의 소프트웨어는 낮은 버전의 소프트웨어와 반드시 함께 해야 한다.
  • 아무리 확장성이 좋은 프로덕트라도 기본적인 안정성은 확보되어야 하기 때문이다.

기능 하나를 여러 버전의 소프트웨어 조합으로 이룰 수 있다.

  • 기능 하나를 한 버전의 소프트웨어로만 만들어야 할 필요가 없다.
  • "검색"이라는 기능을 예시로 들어보자.
  • 유저의 쿼리와 유저의 history 정보로 유저에게 필요한 검색 결과를 찾아준다.
  • Database에서 SQL로 호출하는 Software 1.0과 specific-task에 대해 pretraining된 Software 2.0과 모든 query를 이해할 수 있는 Software 3.0 을 적절히 조합했을 때 최고의 성능이 나온다.
  • Software 3.0으로만 검색한다면 hallucination issue로 골치아플 것이고 Software 2.0으로만 검색한다면 hard filtering이 전혀 안될 수도 있다.
  • Software 1.0으로만 개발하던 기능이 있다면 2.0, 3.0의 도입을 고려해보자. 항상 더 좋은 것은 아니지만 분명 1.0이 해결하지 못하는 새로운 breakthrough를 찾을 수도 있다.

소프트웨어 버전 간의 책임을 명확히 해야 한다.

  • 소프트웨어 버전별로 장단점이 명확하다. 각자의 장점만을 최대한 살릴 수 있도록 롤을 분배해야 한다.
  • 소프트웨어 버전 간의 아웃풋 전달 방식은 명료해야 하며 각자의 역할이 명확해야 한다.
  • 일반적으로 user input -> 3.0 -> 2.0 -> 1.0 -> 2.0 -> 3.0 -> output 의 형태를 가지며 중간 단계는 스킵될 수 있다.


Next Software를 개발할 때 반드시 고려해야 할 점 3가지이다.

  1. 낮은 버전의 소프트웨어는 필수적이다.
  2. 기능 하나를 여러 버전의 소프트웨어 조합으로 이룰 수 있다.
  3. 소프트웨어 버전 간의 책임을 명확히 해야 한다.