Os vetores de incorporação são a maneira nativa para a inteligência artificial representar qualquer tipo de dados, e muitos algoritmos utilizam vetores de características para representar dados. Eles podem representar texto, imagens, assim como áudio e vídeo. Existem muitos métodos para calcular vetores de características, incluindo o uso de modelos de incorporação de código aberto ou alguns serviços de API em nuvem, como a API do openai.

Chroma fornece um invólucro leve para modelos populares de incorporação, tornando fácil o uso deles em suas aplicações.

Transformers.js

Chroma pode executar modelos de incorporação localmente em sua máquina usando o Transformers.js para gerar vetores de características. O Transformers utiliza o modelo "Xenova/all-MiniLM-L6-v2". Para executar isso, instale a biblioteca Transformers.js executando npm install @xenova/transformers no terminal.

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

(async () => {
    // Especifique a função de incorporação a ser usada através do parâmetro embeddingFunction
    const collection = await client.getOrCreateCollection({name: "name", embeddingFunction: embedder})

    // Adicione dados sem especificar vetores; a função de adição chamará a função de incorporação para computar vetores de texto
    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"], 
    })

    // Consulte dados, que também chamará a função de incorporação para calcular vetores para os textos da consulta e depois procurar dados similares
    const results = await collection.query({
        nResults: 2, 
        queryTexts: ["lorem ipsum"]
    }) 
})();

OPENAI

Chroma fornece um invólucro conveniente para a API do modelo de incorporação da OpenAI. Para fazer chamadas à API da OpenAI, você precisará de uma chave de API, que pode obter registrando uma conta na OpenAI.

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

// usar diretamente 
const embeddings = embedder.generate(["documento1","documento2"])

// Especifique a função de incorporação usando o parâmetro embeddingFunction
const collection = await client.createCollection({name: "name", embeddingFunction: embedder})
const collection = await client.getCollection({name: "name", embeddingFunction: embedder})

Você pode opcionalmente passar um parâmetro model_name para escolher o modelo de incorporação da OpenAI a ser usado. Por padrão, Chroma usa text-embedding-ada-002.

Funções de Incorporação Personalizadas

Se você usar outros modelos de incorporação, pode integrar a classe base EmbeddingFunction e chamar o modelo escolhido para gerar vetores.

Nota: Funções de incorporação personalizadas não são necessárias, pois você pode pré-calcular vetores usando seu próprio modelo de incorporação e depois usar os vetores para ler e escrever dados do Chroma.

class MyEmbeddingFunction {
  private api_key: string;

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

  public async generate(texts: string[]): Promise<number[][]> {
    // Chame seu próprio modelo para calcular vetores
    return embeddings;
  }
}