임베딩 벡터는 인공지능이 어떤 유형의 데이터든 표현하는 데 사용되는 기본 방법으로, 많은 알고리즘에서 데이터를 표현하기 위해 피처 벡터를 활용합니다. 이러한 벡터는 텍스트, 이미지, 오디오, 그리고 비디오를 표현할 수 있습니다. 오픈 소스 임베딩 모델을 활용하거나 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;
}
}