Chroma는 고차원 벡터 데이터를 효율적으로 저장하고 검색하기 위해 벡터 유사성 검색 기술을 활용하는 오픈 소스 벡터 데이터베이스입니다.

Chroma는 애플리케이션에 내장된 데이터베이스로, 패키지 형식으로 코드에 내장됩니다. 그 장점은 단순함에 있습니다. 만약 LLM 메모리를 구현하고 텍스트 유사성 언어 검색을 지원하는 벡터 데이터베이스가 필요한 LLM 애플리케이션을 개발 중이고 독립적인 벡터 데이터베이스를 설치하고 싶지 않다면, Chroma는 좋은 선택입니다. 이 튜토리얼은 주로 JavaScript를 기반으로 합니다.

1. 패키지 설치

npm install --save chromadb # yarn add chromadb

2. Chroma 클라이언트 초기화

const {ChromaClient} = require('chromadb');
const client = new ChromaClient();

3. 컬렉션 생성

Chroma 데이터베이스의 컬렉션은 Mysql의 테이블과 유사하며, 여기에 벡터 데이터(문서 및 기타 소스 데이터 포함)가 저장됩니다. 아래는 컬렉션을 생성하는 예제입니다:

const {OpenAIEmbeddingFunction} = require('chromadb');
const embedder = new OpenAIEmbeddingFunction({openai_api_key: "your_api_key"})
const collection = await client.createCollection({name: "my_collection", embeddingFunction: embedder})

여기서는 openai 텍스트 임베딩 모델을 사용하여 텍스트 벡터를 계산하므로 openai api 키를 제공해야 합니다. 물론 embeddingFunction 매개변수를 생략하고 Chroma의 내장 모델을 사용하여 벡터를 계산하거나 다른 오픈 소스 텍스트 임베딩 모델로 교체할 수도 있습니다.

4. 데이터 추가

컬렉션을 정의한 후, 데이터를 컬렉션에 추가하고 나중에 쉽게 조회하기 위해 Chroma가 데이터를 저장하고 텍스트 데이터의 벡터를 기반으로 전용 벡터 인덱스를 생성합니다.

await collection.add({
    ids: ["id1", "id2"],
    metadatas: [{"source": "my_source"}, {"source": "my_source"}],
    documents: ["This is a document", "This is another document"],
}) 

Chroma의 내장 함수를 사용하여 사전에 계산된 텍스트 벡터를 사용하여, Chroma의 기본 임베딩 함수를 사용하지 않고:

await collection.add({
    ids: ["id1", "id2"],
    embeddings: [[1.2, 2.3, 4.5], [6.7, 8.2, 9.2]],
    where: [{"source": "my_source"}, {"source": "my_source"}],
    documents: ["This is a document", "This is another document"]
}) 

5. 컬렉션 데이터 조회

쿼리 조건으로 설정된 queryTexts를 기반으로, Chroma는 가장 유사한 nResults 결과를 반환합니다.

const results = await collection.query({
    nResults: 2, 
    queryTexts: ["This is a query document"]
})