LLM RAG의 핵심 기술, 벡터 데이터베이스 크로마 분석
BIM 칼럼니스트 강태욱의 이슈 & 토크
이번 호에서는 대규모 언어 모델(LLM : Large Language Model)의 검색증강생성(RAG : Retrieval-Augmented Generation) 구현 시 핵심 기술인 임베딩 벡터 데이터베이스로 유명한 크로마(Chroma)의 핵심 구조를 간략히 분석한다. RAG는 생성형 AI의 환각현상을 줄여 전문가적인 정보를 생성하는 데에 도움을 준다.
크로마의 동작 방식을 이해하면 LLM 기술 개발 시 이해도와 응용력을 높일 수 있다. 참고로, 벡터 베이터베이스는 다양하게 있으나 크로마는 사용하기 쉽고 오픈되어 있어 현재 많이 활용되고 있다.
■ 강태욱
건설환경 공학을 전공하였고 소프트웨어 공학을 융합하여 세상이 돌아가는 원리를 분석하거나 성찰하기를 좋아한다. 건설과 소프트웨어 공학의 조화로운 융합을 추구하고 있다. 팟캐스트 방송을 통해 이와 관련된 작은 메시지를 만들어 나가고 있다. 현재 한국건설기술연구원에서 BIM/GIS/FM/BEMS/역설계 등과 관련해 연구를 하고 있으며, 연구위원으로 근무하고 있다.
페이스북 | www.facebook.com/laputa999
블로그 | http://daddynkidsmakers.blogspot.com
홈페이지 | https://dxbim.blogspot.com
팟캐스트 | www.facebook.com/groups/digestpodcast
그림 1. 벡터 데이터베이스의 종류
크로마는 AI 지원 오픈소스 벡터 베이터베이스로, RAG를 처리할 때 필수로 사용되는 데이터베이스 중 하나이다. 크로마를 이용해 LLM 기반의 다양한 앱(지식 서비스 등)을 개발할 수 있다. 예를 들어, 각종 건설 규정, BIM 관련 지침 등을 요약하고 설명해주는 전문가 시스템을 개발할 때 사용할 수 있다.
그림 2
크로마는 임베딩 벡터를 메타데이터와 함께 저장하고, 질의를 통해 해당 임베딩 도큐먼트를 검색할 수 있다. 크로마는 독립적인 서버로서 동작할 수 있다.
설치 및 사용
윈도우 명령창이나 터미널을 실행한다. 크로마 설치를 위해 다음과 같이 터미널에 명령을 입력한다.
pip install chromadb
벡터 데이터베이스에 저장되는 단위는 다음과 같다.
collection = client.create_collectoin(name='test', embedding_function=emb_fn)
collection.add(
embeddings=[
[1.1, 2.3, 3.2],
[4.5, 6.9, 4.4],
[1.1, 2.3, 3.2]
],
metadatas=[
{"uri": "img1.png", "style": "style1"},
{"uri": "img2.png", "style": "style2"},
{"uri": "img3.png", "style": "style1"}
],
documents=["doc1", "doc2", "doc3"],
ids=["id1", "id2", "id3"],
)
여기에서 보는 것과 같이, 벡터 좌표계에 위치할 임베딩 벡터, 벡터에 매달아 놓을 메타데이터와 도큐먼트, ID를 하나의 컬랙션 단위로 저장한다. 이를 통해 벡터 간 유사도, 거리 등을 계산해 원하는 도큐먼트, 메타데이터 등을 얻을 수 있다. 이 때 임베딩 벡터는 미리 학습된 임베딩 모델을 사용할 수 있다.
질의해서 원하는 벡터를 얻으려면 벡터 공간에서 거리 계산이 필수적이다. 이 때 사용하는 함수는 <그림 3>과 같다.
그림 3
컬렉션에 벡터 추가와 질의는 다음과 같다.
collection.add(
documents=["doc1", "doc2", "doc3", ...],
embeddings=[[1.1, 2.3, 3.2], [4.5, 6.9, 4.4], [1.1, 2.3, 3.2], ...],
metadatas=[{"chapter": "3", "verse": "16"}, {"chapter": "3", "verse": "5"}, {"chapter": "29", "verse": "11"}, ...],
ids=["id1", "id2", "id3", ...]
)
collection.query(
query_texts=["doc10", "thus spake zarathustra", ...],
n_results=10,
where={"metadata_field": "is_equal_to_this"},
where_document={"$contains":"search_string"}
)
여기서, where의 metadata_field를 이용해 다음과 같은 조건 비교 연산이 가능하다.
$eq, $ne, $gt, $gte, $lt, $lte
그리고, 논리 연산자인 $and, $or를 지원한다.
크로마는 향후 워크플로, 가시화, 질의 계획, 분석 기능을 준비하고 있다.
■ 자세한 기사 내용은 PDF로 제공됩니다.
강태욱
작성일 : 2024-10-07
조회수 : 3108