임베딩 벡터는 인공지능이 어떤 유형의 데이터든 표현하는 데 사용되는 기본 방법으로, 많은 알고리즘에서 데이터를 표현하기 위해 피처 벡터를 활용합니다. 이러한 벡터는 텍스트, 이미지, 오디오, 그리고 비디오를 표현할 수 있습니다. 오픈 소스 임베딩 모델을 활용하거나 openai API와 같은 클라우드 서비스 API를 사용하여 피처 벡터를 계산하는 여러 가지 방법이 있습니다.

Chroma는 인기있는 임베딩 모델을 가볍게 감싸는 래퍼를 제공하여 응용 프로그램에서 쉽게 활용할 수 있도록 합니다.

Transformers.js

Chroma는 Transformers.js를 사용하여 로컬 기기에서 임베딩 모델을 실행하여 피처 벡터를 생성할 수 있습니다. Transformers는 "Xenova/all-MiniLM-L6-v2" 모델을 사용합니다. 이를 실행하려면 명령줄에서 npm install @xenova/transformers를 실행하여 Transformers.js 라이브러리를 설치하십시오.

const {ChromaClient} = require('chromadb');
const client = new ChromaClient({path: "http://localhost:8000"});
const {TransformersEmbeddingFunction} = require('chromadb');
const embedder = new TransformersEmbeddingFunction();

(async () => {
    // embeddingFunction 매개변수를 통해 사용할 임베딩 함수를 지정합니다
    const collection = await client.getOrCreateCollection({name: "name", embeddingFunction: embedder})

    // 벡터를 지정하지 않고 데이터 추가; add 함수는 텍스트 벡터를 계산하기 위해 embeddingFunction 함수를 호출합니다
    await collection.add({
        ids: ["id1", "id2", "id3"],
        metadatas: [{"chapter": "3", "verse": "16"}, {"chapter": "3", "verse": "5"}, {"chapter": "29", "verse": "11"}], 
        documents: ["lorem ipsum...", "doc2", "doc3"], 
    })

    // embeddingFunction 함수를 호출하여 queryTexts의 벡터를 계산한 뒤 유사한 데이터를 검색합니다
    const results = await collection.query({
        nResults: 2, 
        queryTexts: ["lorem ipsum"]
    }) 
})();

OPENAI

Chroma는 OpenAI의 임베딩 모델 API에 대한 편리한 래퍼를 제공합니다. OpenAI API에 호출하려면 OpenAI 계정을 등록하여 API 키를 생성해야 합니다.

const {OpenAIEmbeddingFunction} = require('chromadb');
const embedder = new OpenAIEmbeddingFunction({openai_api_key: "apiKey"})

// 직접 사용하기
const embeddings = embedder.generate(["document1","document2"])

// embeddingFunction 매개변수를 사용하여 임베딩 함수를 지정합니다
const collection = await client.createCollection({name: "name", embeddingFunction: embedder})
const collection = await client.getCollection({name: "name", embeddingFunction: embedder})

model_name 매개변수를 선택적으로 전달하여 사용할 OpenAI 임베딩 모델을 선택할 수 있습니다. 기본적으로 Chroma는 text-embedding-ada-002를 사용합니다.

사용자 지정 임베딩 함수

다른 임베딩 모델을 사용하는 경우 EmbeddingFunction 기본 클래스를 통합하고 선택한 모델을 호출하여 벡터를 생성할 수 있습니다.

참고: 사용자 지정 임베딩 함수는 필수가 아니며, 자체 임베딩 모델을 사용하여 사전에 벡터를 계산한 후 해당 벡터를 사용하여 Chroma 데이터를 읽고 쓸 수 있습니다.

class MyEmbeddingFunction {
  private api_key: string;

  constructor(api_key: string) {
    this.api_key = api_key;
  }

  public async generate(texts: string[]): Promise<number[][]> {
    // 사용자 지정 모델을 호출하여 벡터를 계산합니다
    return embeddings;
  }
}