분류1 "코파일럿 런타임 백터 검색의 핵심" DiskANN 기초지식 다지기
페이지 정보
![profile_image](https://g5.webvision.co.kr/data/member_image/ad/admin.gif?1645343065)
본문
윈도우용 마이크로소프트 코파일럿 런타임(Copilot Runtime) 엣지 AI 개발 플랫폼의 주요 구성요소 중 하나는 DiskANN(Disk Accelerated Nearest Neighbors)이라는 새로운 벡터 검색 기술이다. 마이크로소프트 리서치의 장기 프로젝트를 기반으로 하는 DiskANN은 애플리케이션 내에 벡터 인덱스를 구축하고 관리하는 방법이다. 인메모리 및 디스크 저장을 함께 사용해서 메모리 내의 양자화된 벡터 그래프를 디스크의 고정밀 그래프에 매핑한다.
DiskANN이란?
정확히 똑같다고는 할 수 없지만 DiskANN은 SQL라이트와 같은 툴의 벡터 인덱스 버전이라고 생각하면 된다. 코드에 추가하면 코파일럿 런타임의 파이 실리카(Phi Silica)와 같은 SLM(Small Language Model)의 시맨틱 임베딩으로 구성된 벡터 인덱스를 간편하게 검색할 수 있다.
DiskANN은 데이터베이스가 아니라, 벡터 검색을 지원하도록 설계되지 않은 다른 저장소에 벡터 인덱스를 추가하기 위한 툴로 제공되는 일련의 알고리즘이라는 것을 이해하는 것이 중요하다. 따라서 DiskANN은 관계형이든 NoSQL 키 값 저장소든 상관없이 다른 임베디드 저장소의 이상적인 동반자라고 할 수 있다.
인메모리 및 디스크 저장을 위한 요구사항은 이전 윈도우 기본 메모리보다 2배 많은 메모리와 더 크고 빠른 SSD가 필요한 코파일럿+ PC의 하드웨어 사양을 이해하는 데 도움이 된다. CPU 요구사항은 다른 벡터 검색 알고리즘에 비해 낮아서, 애저 서비스에서 대규모로 구현할 경우 기존 방법에서 사용하는 CPU의 5%만 있으면 된다.
인덱싱되는 데이터를 위한 별도의 저장소가 필요하다. 인덱스와 임베딩 소스, 두 가지에 별도의 저장소를 둘 경우 그 자체의 문제점도 있다. 개인 식별 정보를 비롯한 규제 대상 데이터를 다루는 경우 소스 데이터의 암호화를 간과하면 안 된다. 이로 인해 쿼리에 오버헤드가 추가될 수 있는데, 흥미로운 점은 마이크로소프트가 보관 중인 데이터와 사용 중인 데이터를 모두 암호화해서 PII 유출 또는 맬웨어에 의한 프롬프트 조작 위험을 낮출 수 있는 소프트웨어 기반 보안 인클레이브를 개발 중이라는 것이다.
DiskANN은 바마나(Vamana) 그래프 인덱스를 사용해서 근사 최근접 이웃 검색을 구현한다. 자주 변경되는 데이터를 다루도록 설계됐으므로 로컬 파일, 또는 이메일이나 팀즈(Teams) 채팅 등 마이크로소프트 365와 같은 서비스에 보관된 데이터를 인덱싱해야 하는 에이전트형 AI 애플리케이션에 유용하다.
diskannpy 시작하기
diskannpy 파이썬 구현 형태로 제공되는 유용한 퀵스타트가 있다. diskannpy는 인덱싱 구축과 검색을 위한 클래스를 제공한다. 넘파이(NumPy)와 같은 수치 분석 파이썬 라이브러리를 사용해서 인덱스를 구축하고 사용해서 기존 데이터 과학 툴에 연결할 수 있는 옵션도 제공된다. 또한 인덱스를 중심으로 애플리케이션을 구축하기 전에 비주얼 스튜디오 코드에서 주피터(Jupyter) 노트북을 사용해서 인덱스를 테스트할 수 있다. 프로토타이핑에 노트북 기반 접근 방식을 사용하면 SLM 기반 애플리케이션의 요소를 개별적으로 개발해서 셀 간에 결과를 전달할 수 있다.
먼저 2개의 인덱스 빌더(Index Builder) 클래스 중 하나를 사용해서 넘파이 배열 또는 DiskANN 형식 벡터 파일의 내용으로 하이브리드 또는 인메모리 벡터 인덱스를 구축한다. diskannpy 라이브러리에는 배열에서 이 파일을 구축하기 위한 툴이 포함돼 있으므로 인덱스에 신속하게 임베딩을 추가할 수 있다. 인덱스 파일은 지정된 디렉터리에 저장되어 검색이 가능하다. 그 외에 인덱스를 업데이트하고 동적인 작업을 지원할 수 있는 기능이 있다.
검색은 간단한 클래스로, 검색 임베딩이 포함된 쿼리 배열과 함께 반환할 이웃의 수와 목록의 복잡성을 정의하는 매개변수가 있다. 목록이 클수록 결과를 제공하는 데 더 오랜 시간이 걸리지만 더 정확하다. 정확성과 지연 사이에서 절충해야 하므로 최종 코드를 커밋하기 전에 실험이 필요하다. 그 외에 쿼리를 일괄 처리해서 성능을 개선할 수 있는 옵션이 있다. 인덱스의 복잡성, 검색에 사용되는 거리 척도의 유형을 정의할 수 있다. 복잡성과 그래프 도수의 값은 클수록 좋지만 결과 인덱스를 생성하는 데 그만큼 더 오랜 시간이 걸린다.
diskannpy는 DiskANN 사용 방법을 익히기에 유용한 툴이다. 코파일럿 런타임이 발전하게 되면 아마 마이크로소프트는 코스모스 DB의 경우와 비슷한, 높은 수준의 추상화를 위한 일련의 래퍼를 제공할 것이다. 초기 코파일럿 런타임 발표를 보면 이 부분이 어떻게 작동할지에 대한 힌트가 있고, 검색 증강 생성(RAG) 기반 애플리케이션을 구축하는 데 사용되는 벡터 임베딩 API에 대한 언급이 나온다. 이는 코파일럿 런타임 업데이트를 통해 구현될 계획이다.
왜 DiskANN인가?
해당 프로젝트의 깃허브 리포지토리를 살펴보면 마이크로소프트가 코파일럿 런타임의 기본 기술 중 하나로 DiskANN을 선택한 이유를 쉽게 알 수 있다. DiskANN은 SSD와 인메모리 작업에 모두 최적화되며 많은 데이터를 경제적으로 인덱싱하는 하이브리드 접근 방식을 제공한다. 초기 마이크로소프트 리서치에서 발표한 DiskANN 논문에 따르면 하이브리드 SSD/RAM 인덱스는 대등한 순수 인메모리 알고리즘에 비해 5~10배 더 많은 벡터를 인덱싱할 수 있고, 약 10억 개의 벡터를 높은 검색 정확성과 5ms의 지연으로 처리할 수 있다.
물론 실제 엣지에 호스팅되는 SLM 애플리케이션이 그 정도로 많은 데이터를 인덱싱해야 하는 경우는 드물고, 따라서 성능과 정확성은 더 높을 것이다.
SLM에서 시맨틱 AI 애플리케이션을 구축하는 경우 처리량에 집중하면서 각 작업에 적은 수의 토큰을 사용해야 한다. RAG 애플리케이션을 위한 근거에 기초한 프롬프트를 구축하는 데 필요한 검색을 최대한 빠르게 유지할 수 있다면 간단한 답을 얻기 위해 기다려야 하는 사용자들의 불편을 줄일 수 있다.
시작 시점에 인메모리 인덱스를 로드하면 검색을 간소화해서 애플리케이션이 SLM을 위한 근거에 기초한 프롬프트를 구축하는 데 필요할 때만 소스 데이터에 액세스하도록 할 수 있다. 한 가지 유용한 옵션은 검색에 필터를 추가해서 결과를 정제하고 애플리케이션에 더 정확한 근거를 제공하는 기능이다.
지금은 코파일럿 런타임의 초기인 만큼 퍼즐을 완성하기 위해 필요한 조각 일부가 아직 없다. DiskANN 인덱스를 사용하기 위한 한 가지 필수 요소는 소스 데이터를 벡터 임베딩으로 인코딩하기 위한 툴이다. 이는 코드의 일부로, 또는 애플리케이션에 기본 벡터 인덱스 집합을 제공하기 위해 벡터 검색을 구축하는 데 필요하다.
다른 곳에서 볼 수 있는 DiskANN
코파일럿 런타임 외에 마이크로소프트는 코스모스 DB에 빠른 벡터 검색을 추가하기 위한 용도로도 DiskANN을 사용한다. 또한 마이크로소프트 365와 빙 서비스에도 DiskANN이 사용된다. 코스모스 DB에서는 고도로 분산된 대량의 데이터로 작업할 가능성이 높은 노SQL API에 벡터 검색을 추가하고 있다. DiskANN은 빠르게 변화하는 데이터를 지원하고, 이것이 코스모스 DB의 동적 확장과 함께 작동하면서 각각의 새로운 파티션에 새 인덱스를 추가한다. 그러면 사용 가능한 모든 파티션 인덱스에 병렬로 쿼리를 전달할 수 있다.
마이크로소프트 리서치는 꽤 오래 전부터 DiskANN과 같은 툴을 연구하고 있는데, 순수한 연구가 실제 제품(특히 코스모스 DB와 윈도우처럼 광범위하게 사용되는 제품)까지 이어지는 것은 반가운 일이다. 코파일럿 런타임의 일부로 빠르고 정확한 벡터 인덱스를 사용할 수 있으면 생성형 AI와 관련된 위험을 낮추고 인덱스를 PC에 유지해서 소스 데이터를 비공개로 유지하고 SLM의 근거를 확보할 수 있다. 여기에 윈도우의 기밀 컴퓨팅 기법을 결합한 마이크로소프트는 사용자 자체 디바이스에서 안전한 비공개 AI를 제공할 준비가 된 것으로 보인다.
editor@itworld.co.kr
댓글목록
등록된 댓글이 없습니다.