AISmarteasy – 시맨틱 커널 포크로 개발하기 5b – Worker – Memory – Vector Database – Pinecone
llm의 태생적 한계를 극복하는 두 가지 방법은 검색엔진 활용과 벡터 데이터베이스다.
검색엔진은 llm의 훈련 시점 이후에 데이터를 제공할 수 있도록 하고, 벡터 데이터베이스는 훈련에 사용하지 않은 데이터 – 기업이나 개인 내부 데이터 – 를 제공할 수 있도록 한다. llm을 rag한다는 것은 결국 이 두 가지 지원을 받게 한다는 것이 된다.
벡터 데이터베이스 중 개인적으로 제일 잘 나가는 것으로 꼽는 파인콘에 대해서 알아보자.
벡터
데이터베이스는 데이터를 사용하고 관리해주는 것이고. 그럼 벡터는?
벡터는 행이 1개 또는 열이 1개인 행렬이다.
벡터 데이터베이스는 데이터를 벡터로 변환 관리한다. 이 과정을 임베딩(embedding)이라고 한다. 왜 이렇게 할까? 자연어를 벡터로 해보니 자연어 검색 결과가 넘 잘 되더라. 벡터 처리하는 거만 할 수도 있지만, 장기 기억되어 사용되어야 하는 데이터라면 전문적으로 관리가 필요하다. 벡터 데이터베이스 출현. llm 연동 ai 애플리케이션의 장기 기억 기술로 벡터 데이터베이스가 사용.
임베딩 하려면 자연어를 벡터로 바꿔줘야 하는데, 이걸 하려면 llm 수준의 훈련이 있어야 한다. openai는 임베딩 api를 제공한다.
시간이 지나면 벡터 데이터베이스들도 llm을 가지고 임베딩을 하겠지만, 지금은 llm 벤더가 제공하는 서비스를 통해 자연어 데이터를 임베딩 하고 임베딩 데이터를 벡터 데이터베이스에서 관리한다. 쿼리 할 때는 쿼리를 임베딩 하고 이것을 가지고 벡터 데이터베이스를 쿼리 한다.
벡터 데이터베이스가 뭐고, 어떻게 동작하는지 알고 싶다면, 파인콘 사이트에 올라온 아래 글을 읽어보자.
What is a Vector Database & How Does it Work? Use Cases + Examples
기업 데이터는 대부분 관계형 데이터베이스에서 관리되고 있고. 벡터 데이터베이스가 등장했다고 해서 바로 대체할 수 있을 거 같지는 않다. 관계형 데이터베이스로 관리되는 도메인에, ai 기능이 더해진다면 이를 위해 관계형 데이터베이스와 벡터 데이터베이스가 협업 할 아키텍처가 필요하다. 파인콘은 대표적인 클라우드인 aws에서 어떻게 이를 가능하게 할 지도 고민해 온 것 같다.
llm을 훈련할 때 최종 결과를 벡터 데이터베이스 관리한다면, 벡터 데이터베이스 형태의 llm이 등장할 수 있을 것 같다.
벡터 데이터베이스로 관리되는 레코드는 자연어 텍스트와 이것을 임베딩 한 벡터와 메타 데이터로 정의된다.
관계형 데이터베이스로 보면, 설계가 동일한 하나의 테이블만 필요하다. 레코드가 많을 뿐이다.
형태가 같은 레코드라도 자연어 레코드들은 의미로 구분될 수 있기 때문에, 의미로 묶이는 레코드들로 인덱싱 해야 한다. 벡터 데이터베이스의 인덱싱 단위가 관계형 데이터베이스에서의 데이터베이스 수준에 가깝다.
API 사용하기
파인콘은 api를 제공한다. 사용 방법은 레퍼런스를 참조한다.
1. api를 사용하려면, api 키가 있어야 한다. envisonment도 알아야 한다.
2. 데이터를 관리하려면 데이터베이스를 생성해야 겠지. 인덱스를 만든다. 레코드에 벡터도 있기 때문에 인덱스 만들 때 이와 관련된 설정도 해 줘야 한다.
3. 인덱스의 레코드들을 묶는 또 다른 기준으로 네임스페이스가 있다.
인덱스는 여러 네임스페이스에 속할 수 있고, 하나의 인덱스에 여러 네임스페이스를 지정할 수 있다. n:n이라는 것.
인덱스에서 레코드를 관리하기 때문에, 레코드를 생성할 때 인덱스를 지정해야 한다. 해당 데이터가 어떤 네임스페이스에 속하는지도 정해줘야 하니까 레코드를 생성 시 인덱스와 네임스페이스를 지정해야 한다. 네임스페이스를 지정하지 않으면, 기본 네임스페이스 인 “”(빈 문자열)가 사용된다.
4. 컬렉션이 있다. A collection is a static copy of an index. It is a non-queryable representation of a set of vectors and metadata.
인덱스의 static 복사본을 만들어 두겠다는 거는, 이렇게 만들어진 컬렉션으로 인덱스를 복구하거나 다른 설정으로 같은 레코드들에 대한 인덱스를 만들 수도 있다는 거겠지.