Menu Docs
Página inicial do Docs
/
Atlas
/

Como criar incorporações de vetor

Você pode armazenar incorporações de vetores junto aos seus outros dados no Atlas. Essas incorporações capturam relacionamentos significativos nos seus dados e permitem que você execute pesquisas semânticas e implemente o RAG com o Atlas Vector Search.

Use o tutorial a seguir para aprender como criar incorporações vetoriais e consultá-las usando o Atlas Vector Search. Especificamente, você executa as seguintes ações:

  1. Defina uma função que utiliza um modelo de incorporação para gerar incorporações vetoriais.

  2. Crie incorporações a partir dos seus dados e armazene-as no Atlas.

  3. Crie incorporações a partir de seus termos de pesquisa e execute uma query de pesquisa vetorial.

Para aplicativos de produção, normalmente você escreve um script para gerar incorporações vetoriais. Você pode começar com o código de amostra nesta página e personalizá-lo para seu caso de uso.


➤ Use o menu suspenso Selecione sua linguagem para definir o idioma dos exemplos nesta página.

Trabalhe com uma versão executável deste tutorial como um notebook do Python.

Para concluir este tutorial, você deve ter o seguinte:

  • Uma conta do Atlas com um cluster executando o MongoDB versão 6.0.11, 7.0.2, ou posterior (incluindo RCs). Certifique-se de que seu endereço IP esteja incluído na lista de acesso do seu projeto Atlas. Para saber mais, consulte Criar um cluster.

  • Um terminal e editor de código para executar seu projeto C#.

  • .NET 8.0 ou superior instalado.

  • Um token de acesso da Hugging Face, chave de API da Voyage AI ou chave de API da OpenAI.

  • Uma conta do Atlas com um cluster executando o MongoDB versão 6.0.11, 7.0.2 ou posterior (incluindo RCs). Certifique-se de que seu endereço IP esteja incluído na lista de acesso do seu projeto Atlas. Para saber mais, consulte Criar um cluster.

  • Java Development Kit (JDK) versão 8 ou posterior.

  • Um ambiente para configurar e executar um aplicação Java . Recomendamos que você use um ambiente de desenvolvimento integrado (IDE) como IntelliJ IDEA ou Eclipse IDE para configurar Maven ou Gradle para construir e executar seu projeto.

  • Uma conta do Atlas com um cluster executando o MongoDB versão 6.0.11, 7.0.2 ou posterior (incluindo RCs). Certifique-se de que seu endereço IP esteja incluído na lista de acesso do seu projeto Atlas. Para saber mais, consulte Criar um cluster.

  • Um editor de terminal e código para executar seu projeto Node.js.

  • npm e Node.js instalado.

  • Se você estiver usando um modelo proprietário, deverá ter uma chave de API.

  • Uma conta do Atlas com um cluster executando o MongoDB versão 6.0.11, 7.0.2 ou posterior (incluindo RCs). Certifique-se de que seu endereço IP esteja incluído na lista de acesso do seu projeto Atlas. Para saber mais, consulte Criar um cluster.

  • Um ambiente para executar notebooks Python interativos, como o VS Code ou Colab.

  • Se você estiver usando um modelo proprietário, deverá ter uma chave de API.

1

Em uma janela de terminal, execute os seguintes comandos para inicializar seu projeto:

dotnet new console -o MyCompany.Embeddings
cd MyCompany.Embeddings
2

Em uma janela do terminal, execute os seguintes comandos:

dotnet add package MongoDB.Driver
3

Exporte suas variáveis de ambiente, set no PowerShell ou use o gerenciador de variáveis de ambiente do seu IDE para tornar a string de conexão e o token de acesso do HuggingFace disponíveis para seu projeto.

export HUGGINGFACE_ACCESS_TOKEN="<access-token>"
export ATLAS_CONNECTION_STRING="<connection-string>"

Substitua o valor do espaço reservado <access-token> pelo token de acesso do Abraçando a Face.

Substitua o <connection-string> valor do espaço reservado pela string de conexão SRVdo seu Atlas cluster.

Sua string de conexão deve usar o seguinte formato:

mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net
4

Crie uma nova classe em um arquivo com o mesmo nome chamado AIService.cs e cole o código a seguir. Esse código define uma tarefa assíncrona chamada GetEmbeddingsAsync para gerar uma array de incorporações para uma array de entradas de string fornecidas. Esta função utiliza o modelo de incorporação mxbai-embed-large-v1.

AIService.cs
namespace MyCompany.Embeddings;
using System;
using System.Net.Http;
using System.Text.Json;
using System.Threading.Tasks;
using System.Net.Http.Headers;
public class AIService
{
private static readonly string? HuggingFaceAccessToken = Environment.GetEnvironmentVariable("HUGGINGFACE_ACCESS_TOKEN");
private static readonly HttpClient Client = new HttpClient();
public async Task<Dictionary<string, float[]>> GetEmbeddingsAsync(string[] texts)
{
const string modelName = "mixedbread-ai/mxbai-embed-large-v1";
const string url = $"https://api-inference.huggingface.co/models/{modelName}";
Client.DefaultRequestHeaders.Authorization
= new AuthenticationHeaderValue("Bearer", HuggingFaceAccessToken);
var data = new { inputs = texts };
var dataJson = JsonSerializer.Serialize(data);
var content = new StringContent(dataJson,null, "application/json");
var response = await Client.PostAsync(url, content);
response.EnsureSuccessStatusCode();
var responseString = await response.Content.ReadAsStringAsync();
var embeddings = JsonSerializer.Deserialize<float[][]>(responseString);
if (embeddings is null)
{
throw new ApplicationException("Failed to deserialize embeddings response to an array of floats.");
}
Dictionary<string, float[]> documentData = new Dictionary<string, float[]>();
var embeddingCount = embeddings.Length;
foreach (var value in Enumerable.Range(0, embeddingCount))
{
// Pair each embedding with the text used to generate it.
documentData[texts[value]] = embeddings[value];
}
return documentData;
}
}

Observação

503 ao chamar modelos de Face Abraços

Ocasionalmente, você pode receber erros 503 ao chamar modelos a partir do hub de modelos Hugging Face. Para resolver esse problema, tente novamente após um breve intervalo.

1

Em uma janela de terminal, execute os seguintes comandos para inicializar seu projeto:

dotnet new console -o MyCompany.Embeddings
cd MyCompany.Embeddings
2

Em uma janela do terminal, execute os seguintes comandos:

dotnet add package MongoDB.Driver
3

Exporte suas variáveis de ambiente, set no PowerShell ou use o gerenciador de variáveis de ambiente do seu IDE para tornar a string de conexão e a chave da API Voyage AI disponíveis para o seu projeto.

export VOYAGE_API_KEY="<api-key>"
export ATLAS_CONNECTION_STRING="<connection-string>"

Substitua o valor do espaço reservado <api-key> pela sua chave de API da Voyage AI.

Substitua o <connection-string> valor do espaço reservado pela string de conexão SRVdo seu Atlas cluster.

Sua string de conexão deve usar o seguinte formato:

mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net
4

Crie uma nova classe em um arquivo com o mesmo nome chamado AIService.cs e cole o código a seguir. Esse código define uma tarefa assíncrona denominada GetEmbeddingsAsync para gerar uma matriz de incorporações para uma matriz de entradas de string fornecidas. Esta função usa o modelo voyage-3-large da Voyage AI para gerar uma incorporação para uma determinada entrada.

AIService.cs
namespace MyCompany.Embeddings;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Text.Json;
using System.Text.Json.Serialization;
using System.Threading.Tasks;
public class AIService
{
private static readonly string? VoyageApiKey = Environment.GetEnvironmentVariable("VOYAGE_API_KEY");
private static readonly string EmbeddingModelName = "voyage-3-large";
private static readonly string ApiEndpoint = "https://api.voyageai.com/v1/embeddings";
public async Task<Dictionary<string, float[]>> GetEmbeddingsAsync(string[] texts)
{
Dictionary<string, float[]> documentData = new Dictionary<string, float[]>();
try
{
using HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", VoyageApiKey);
var requestBody = new
{
input = texts,
model = EmbeddingModelName,
truncation = true
};
var content = new StringContent(
JsonSerializer.Serialize(requestBody),
Encoding.UTF8,
"application/json");
HttpResponseMessage response = await client.PostAsync(ApiEndpoint, content);
if (response.IsSuccessStatusCode)
{
string responseBody = await response.Content.ReadAsStringAsync();
var embeddingResponse = JsonSerializer.Deserialize<EmbeddingResponse>(responseBody);
if (embeddingResponse != null && embeddingResponse.Data != null)
{
foreach (var embeddingResult in embeddingResponse.Data)
{
if (embeddingResult.Index < texts.Length)
{
documentData[texts[embeddingResult.Index]] =
embeddingResult.Embedding.Select(e => (float)e).ToArray();
}
}
}
}
else
{
throw new ApplicationException($"Error calling Voyage API: {response.ReasonPhrase}");
}
}
catch (Exception e)
{
throw new ApplicationException(e.Message);
}
return documentData;
}
private class EmbeddingResponse
{
[JsonPropertyName("object")]
public string Object { get; set; } = string.Empty;
[JsonPropertyName("data")]
public List<EmbeddingResult>? Data { get; set; }
[JsonPropertyName("model")]
public string Model { get; set; } = string.Empty;
[JsonPropertyName("usage")]
public Usage? Usage { get; set; }
}
private class EmbeddingResult
{
[JsonPropertyName("object")]
public string Object { get; set; } = string.Empty;
[JsonPropertyName("embedding")]
public List<double> Embedding { get; set; } = new();
[JsonPropertyName("index")]
public int Index { get; set; }
}
private class Usage
{
[JsonPropertyName("total_tokens")]
public int TotalTokens { get; set; }
}
}
1

Em uma janela de terminal, execute os seguintes comandos para inicializar seu projeto:

dotnet new console -o MyCompany.Embeddings
cd MyCompany.Embeddings
2

Em uma janela do terminal, execute os seguintes comandos:

dotnet add package MongoDB.Driver
dotnet add package OpenAI
3

Exporte suas variáveis de ambiente, set no PowerShell ou use o gerenciador de variáveis de ambiente do seu IDE para tornar a string de conexão e o token de acesso do HuggingFace disponíveis para o seu projeto.

export OPENAI_API_KEY="<api-key>"
export ATLAS_CONNECTION_STRING="<connection-string>"

Substitua o valor do espaço reservado <api-key> por sua chave de API OpenAI.

Substitua o <connection-string> valor do espaço reservado pela string de conexão SRVdo seu Atlas cluster.

Sua string de conexão deve usar o seguinte formato:

mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net
4

Crie uma nova classe em um arquivo com o mesmo nome chamado AIService.cs e cole o código a seguir. Esse código define uma tarefa assíncrona chamada GetEmbeddingsAsync para gerar uma array de incorporações para uma array de entradas de string fornecidas. Essa função usa o modelo text-embedding-3-small da OpenAI para gerar uma incorporação para uma determinada entrada.

AIService.cs
namespace MyCompany.Embeddings;
using OpenAI.Embeddings;
using System;
using System.Threading.Tasks;
public class AIService
{
private static readonly string? OpenAIApiKey = Environment.GetEnvironmentVariable("OPENAI_API_KEY");
private static readonly string EmbeddingModelName = "text-embedding-3-small";
public async Task<Dictionary<string, float[]>> GetEmbeddingsAsync(string[] texts)
{
EmbeddingClient embeddingClient = new(model: EmbeddingModelName, apiKey: OpenAIApiKey);
Dictionary<string, float[]> documentData = new Dictionary<string, float[]>();
try
{
var result = await embeddingClient.GenerateEmbeddingsAsync(texts);
var embeddingCount = result.Value.Count;
foreach (var index in Enumerable.Range(0, embeddingCount))
{
// Pair each embedding with the text used to generate it.
documentData[texts[index]] = result.Value[index].ToFloats().ToArray();
}
}
catch (Exception e)
{
throw new ApplicationException(e.Message);
}
return documentData;
}
}

Nesta seção, você usa um modelo de incorporação para gerar incorporações vetoriais. Selecione uma aba dependendo se você deseja usar um modelo de incorporação de código aberto ou um modelo proprietário. Para obter incorporações de última geração, utilize a Voyage AI.

1

Em uma janela de terminal, execute os seguintes comandos para criar um novo diretório chamado my-embeddings-project e inicializar seu projeto:

mkdir my-embeddings-project
cd my-embeddings-project
go mod init my-embeddings-project
2

Em uma janela do terminal, execute os seguintes comandos:

go get github.com/joho/godotenv
go get go.mongodb.org/mongo-driver/v2/mongo
go get github.com/tmc/langchaingo/llms
3

Em seu projeto, crie um arquivo .env para armazenar sua string de conexão do Atlas e o token de acesso do Hugging Face.

HUGGINGFACEHUB_API_TOKEN = "<access-token>"
ATLAS_CONNECTION_STRING = "<connection-string>"

Substitua o valor do espaço reservado <access-token> pelo token de acesso do Abraçando a Face.

Substitua o <connection-string> valor do espaço reservado pela string de conexão SRVdo seu Atlas cluster.

Sua string de conexão deve usar o seguinte formato:

mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net
4
  1. Crie um diretório no seu projeto chamado common para armazenar o código comum que você usará nas etapas posteriores:

    mkdir common && cd common
  2. Crie um arquivo chamado get-embeddings.go e cole o código a seguir. Esse código define uma função chamada GetEmbeddings para gerar uma incorporação para uma determinada entrada. Essa função especifica:

    get-embeddings.go
    package common
    import (
    "context"
    "log"
    "github.com/tmc/langchaingo/embeddings/huggingface"
    )
    func GetEmbeddings(documents []string) [][]float32 {
    hf, err := huggingface.NewHuggingface(
    huggingface.WithModel("mixedbread-ai/mxbai-embed-large-v1"),
    huggingface.WithTask("feature-extraction"))
    if err != nil {
    log.Fatalf("failed to connect to Hugging Face: %v", err)
    }
    embs, err := hf.EmbedDocuments(context.Background(), documents)
    if err != nil {
    log.Fatalf("failed to generate embeddings: %v", err)
    }
    return embs
    }

    Observação

    503 ao chamar modelos de Face Abraços

    Ocasionalmente, você pode receber erros 503 ao chamar modelos a partir do hub de modelos Hugging Face. Para resolver esse problema, tente novamente após um breve intervalo.

  3. Volte para o diretório raiz do projeto principal.

    cd ../
1

Em uma janela de terminal, execute os seguintes comandos para criar um novo diretório chamado my-embeddings-project e inicializar seu projeto:

mkdir my-embeddings-project
cd my-embeddings-project
go mod init my-embeddings-project
2

Em uma janela do terminal, execute os seguintes comandos:

go get github.com/joho/godotenv
go get go.mongodb.org/mongo-driver/v2/mongo
3

Na janela do terminal, execute os seguintes comandos para definir as variáveis de ambiente necessárias.

export VOYAGE_API_KEY="<api-key>"
export ATLAS_CONNECTION_STRING="<connection-string>"

Substitua os valores de espaço reservado <api-key> e <connection-string> pela sua chave de API da Voyage e a string de conexão SRV para o seu cluster Atlas.

Observação

Sua string de conexão deve usar o seguinte formato:

mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net
4
  1. Crie um diretório em seu projeto chamado common para armazenar o código que você usará em várias etapas:

    mkdir common && cd common
  2. Crie um arquivo chamado get-embeddings.go e cole o código a seguir. Este código define uma função chamada GetEmbeddings que utiliza o modelo voyage-3-large da Voyage AI para gerar uma incorporação para uma entrada específica.

    get-embeddings.go
    package common
    import (
    "bytes"
    "context"
    "encoding/json"
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
    "os"
    "time"
    )
    var apiKey = os.Getenv("VOYAGE_API_KEY")
    // Fetch embeddings using Voyage AI REST API
    func GetEmbeddings(docs []string) [][]float32 {
    if apiKey == "" {
    log.Fatalf("VOYAGE_API_KEY environment variable is not set")
    return nil
    }
    url := "https://api.voyageai.com/v1/embeddings"
    // Prepare request body according to the API specification
    requestBody := map[string]interface{}{
    "input": docs,
    "model": "voyage-3-large",
    "output_dimension": 1024,
    }
    requestBytes, err := json.Marshal(requestBody)
    if err != nil {
    log.Fatalf("failed to marshal request body: %v", err)
    return nil
    }
    // Create context with timeout
    ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
    defer cancel()
    req, err := http.NewRequestWithContext(ctx, "POST", url, bytes.NewBuffer(requestBytes))
    if err != nil {
    log.Fatalf("failed to create HTTP request: %v", err)
    return nil
    }
    req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", apiKey))
    req.Header.Set("Content-Type", "application/json")
    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
    log.Fatalf("failed to make API request: %v", err)
    return nil
    }
    defer resp.Body.Close()
    if resp.StatusCode != http.StatusOK {
    body, _ := ioutil.ReadAll(resp.Body)
    log.Fatalf("unexpected status code %d: %s", resp.StatusCode, string(body))
    return nil
    }
    // Response structure according to the API specification
    var response struct {
    Object string `json:"object"`
    Data []struct {
    Object string `json:"object"`
    Embedding []float32 `json:"embedding"`
    Index int `json:"index"`
    } `json:"data"`
    Model string `json:"model"`
    Usage struct {
    TotalTokens int `json:"total_tokens"`
    } `json:"usage"`
    }
    if err := json.NewDecoder(resp.Body).Decode(&response); err != nil {
    log.Fatalf("failed to parse API response: %v", err)
    return nil
    }
    // Extract embeddings from the response
    embeddings := make([][]float32, len(response.Data))
    for i, item := range response.Data {
    embeddings[i] = item.Embedding
    }
    return embeddings
    }
  3. Volte para o diretório raiz do projeto principal.

    cd ../
1

Em uma janela de terminal, execute os seguintes comandos para criar um novo diretório chamado my-embeddings-project e inicializar seu projeto:

mkdir my-embeddings-project
cd my-embeddings-project
go mod init my-embeddings-project
2

Em uma janela do terminal, execute os seguintes comandos:

go get github.com/joho/godotenv
go get go.mongodb.org/mongo-driver/v2/mongo
go get github.com/milosgajdos/go-embeddings/openai
3

No seu projeto, crie um arquivo .env para armazenar sua string de conexão e o token de API OpenAI.

OPENAI_API_KEY = "<api-key>"
ATLAS_CONNECTION_STRING = "<connection-string>"

Substitua os valores de espaço reservado <api-key> e <connection-string> pela sua chave de API da OpenAI e pela string de conexão SRV do seu cluster to Atlas.

Observação

Sua string de conexão deve usar o seguinte formato:

mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net
4
  1. Crie um diretório em seu projeto chamado common para armazenar o código que você usará em várias etapas:

    mkdir common && cd common
  2. Crie um arquivo denominado get-embeddings.go e cole o seguinte código. Esse código define uma função chamada GetEmbeddings que usa o modelo text-embedding-3-small da OpenAI para gerar uma incorporação para uma determinada entrada.

    get-embeddings.go
    package common
    import (
    "context"
    "log"
    "github.com/milosgajdos/go-embeddings/openai"
    )
    func GetEmbeddings(docs []string) [][]float64 {
    c := openai.NewClient()
    embReq := &openai.EmbeddingRequest{
    Input: docs,
    Model: openai.TextSmallV3,
    EncodingFormat: openai.EncodingFloat,
    }
    embs, err := c.Embed(context.Background(), embReq)
    if err != nil {
    log.Fatalf("failed to connect to OpenAI: %v", err)
    }
    var vectors [][]float64
    for _, emb := range embs {
    vectors = append(vectors, emb.Vector)
    }
    return vectors
    }
  3. Volte para o diretório raiz do projeto principal.

    cd ../

Nesta seção, você usa um modelo de incorporação para gerar incorporações vetoriais. Selecione uma aba dependendo se você deseja usar um modelo de incorporação de código aberto ou um modelo proprietário. Para obter incorporações de última geração, utilize a Voyage AI.

1
  1. No seu IDE, crie um projeto Java usando Maven ou Gradle.

  2. Adicione as seguintes dependências, dependendo do seu gerenciador de pacotes:

    Se você estiver utilizando o Maven, adicione as seguintes dependências à array dependencies no arquivo pom.xml do seu projeto:

    pom.xml
    <dependencies>
    <!-- MongoDB Java Sync Driver v5.2.0 or later -->
    <dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>mongodb-driver-sync</artifactId>
    <version>[5.2.0,)</version>
    </dependency>
    <!-- Java library for working with Hugging Face models -->
    <dependency>
    <groupId>dev.langchain4j</groupId>
    <artifactId>langchain4j-hugging-face</artifactId>
    <version>1.1.0-beta7</version>
    </dependency>
    </dependencies>

    Se você estiver usando o Gradle, adicione o seguinte à array dependencies no arquivo build.gradle do seu projeto:

    build.gradle
    dependencies {
    // MongoDB Java Sync Driver v5.2.0 or later
    implementation 'org.mongodb:mongodb-driver-sync:[5.2.0,)'
    // Java library for working with Hugging Face models
    implementation 'dev.langchain4j:langchain4j-hugging-face:1.1.0-beta7'
    }
  3. Execute seu gerenciador de pacote para instalar as dependências em seu projeto.

2

Observação

Este exemplo define as variáveis do projeto no IDE. Os aplicativos de produção podem gerenciar variáveis de ambiente por meio de uma configuração de sistema, pipeline CI/CD ou gerenciador de segredos, mas você pode adaptar o código fornecido para se adequar ao seu caso de uso.

No seu IDE, crie um novo modelo de configuração e adicione as seguintes variáveis ao seu projeto:

  • Se você estiver usando o IntelliJ IDEA, crie um novo modelo de configuração de execução Application, depois adicione suas variáveis como valores separados por ponto e vírgula no campo Environment variables (por exemplo, FOO=123;BAR=456). Aplique as alterações e clique em OK.

    Para saber mais, consulte a seção Criar uma configuração de execução/depuração a partir de um modelo da documentação do IntelliJ IDEA.

  • Se você estiver usando o Eclipse, crie uma nova configuração de inicialização Java Application e, em seguida, adicione cada variável como um novo par de valores-chave na guia Environment. Aplique as alterações e clique em OK.

    Para saber mais, consulte a seção Criando uma configuração de inicialização do aplicação Java da documentação do IDE do Eclipse.

Variáveis de ambiente
HUGGING_FACE_ACCESS_TOKEN=<access-token>
ATLAS_CONNECTION_STRING=<connection-string>

Atualize os espaços reservados com os seguintes valores:

  • Substitua o valor do espaço reservado "<access-token>" pelo seu token de acesso do Hugging Face.

  • Substitua o <connection-string> valor do espaço reservado pela string de conexão SRVdo seu Atlas cluster.

    Sua string de conexão deve usar o seguinte formato:

    mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net
3

Crie um arquivo denominado EmbeddingProvider.java e cole o seguinte código.

Este código define dois métodos para gerar incorporações para uma determinada entrada usando o modelo de incorporação de código aberto mxbai-embed-large-v:1

  • Várias Entradas: O getEmbeddings método aceita uma array de entradas de textoList<String>(), permitindo criar várias incorporações em uma única chamada de API. O método converte as arrays de floats fornecidas pela API em arrays BSON de double para armazenamento em seu Atlas cluster.

  • Entrada única: o getEmbedding método aceita um String único, que representa uma query que você deseja fazer em relação aos dados vetoriais. O método converte a array de flutuantes fornecida pela API em uma array BSON de valores duplos para usar ao fazer query em sua coleção.

EmbeddingProvider.java
import dev.langchain4j.data.embedding.Embedding;
import dev.langchain4j.data.segment.TextSegment;
import dev.langchain4j.model.huggingface.HuggingFaceEmbeddingModel;
import dev.langchain4j.model.output.Response;
import org.bson.BsonArray;
import org.bson.BsonDouble;
import java.util.List;
import static java.time.Duration.ofSeconds;
public class EmbeddingProvider {
private static HuggingFaceEmbeddingModel embeddingModel;
private static HuggingFaceEmbeddingModel getEmbeddingModel() {
if (embeddingModel == null) {
String accessToken = System.getenv("HUGGING_FACE_ACCESS_TOKEN");
if (accessToken == null || accessToken.isEmpty()) {
throw new RuntimeException("HUGGING_FACE_ACCESS_TOKEN env variable is not set or is empty.");
}
embeddingModel = HuggingFaceEmbeddingModel.builder()
.accessToken(accessToken)
.modelId("mixedbread-ai/mxbai-embed-large-v1")
.waitForModel(true)
.timeout(ofSeconds(60))
.build();
}
return embeddingModel;
}
/**
* Takes an array of strings and returns a BSON array of embeddings to
* store in the database.
*/
public List<BsonArray> getEmbeddings(List<String> texts) {
List<TextSegment> textSegments = texts.stream()
.map(TextSegment::from)
.toList();
Response<List<Embedding>> response = getEmbeddingModel().embedAll(textSegments);
return response.content().stream()
.map(e -> new BsonArray(
e.vectorAsList().stream()
.map(BsonDouble::new)
.toList()))
.toList();
}
/**
* Takes a single string and returns a BSON array embedding to
* use in a vector query.
*/
public BsonArray getEmbedding(String text) {
Response<Embedding> response = getEmbeddingModel().embed(text);
return new BsonArray(
response.content().vectorAsList().stream()
.map(BsonDouble::new)
.toList());
}
}
1
  1. No seu IDE, crie um projeto Java usando Maven ou Gradle.

  2. Adicione as seguintes dependências, dependendo do seu gerenciador de pacotes:

    Se você estiver utilizando o Maven, adicione as seguintes dependências à array dependencies no arquivo pom.xml do seu projeto:

    pom.xml
    <dependencies>
    <!-- MongoDB Java Sync Driver v5.2.0 or later -->
    <dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>mongodb-driver-sync</artifactId>
    <version>[5.2.0,)</version>
    </dependency>
    <!-- Java library for working with Voyage AI models -->
    <dependency>
    <groupId>dev.langchain4j</groupId>
    <artifactId>langchain4j-voyage-ai</artifactId>
    <version>1.1.0-beta7</version>
    </dependency>
    </dependencies>

    Se você estiver usando o Gradle, adicione o seguinte à array dependencies no arquivo build.gradle do seu projeto:

    build.gradle
    dependencies {
    // MongoDB Java Sync Driver v5.2.0 or later
    implementation 'org.mongodb:mongodb-driver-sync:[5.2.0,)'
    // Java library for working with Voyage AI models
    implementation 'dev.langchain4j:langchain4j-voyage-ai:1.1.0-beta7'
    }
  3. Execute seu gerenciador de pacote para instalar as dependências em seu projeto.

2

Observação

Este exemplo define as variáveis do projeto no IDE. Os aplicativos de produção podem gerenciar variáveis de ambiente por meio de uma configuração de sistema, pipeline CI/CD ou gerenciador de segredos, mas você pode adaptar o código fornecido para se adequar ao seu caso de uso.

No seu IDE, crie um novo modelo de configuração e adicione as seguintes variáveis ao seu projeto:

Variáveis de ambiente
VOYAGE_AI_KEY=<api-key>
ATLAS_CONNECTION_STRING=<connection-string>

Atualize os espaços reservados com os seguintes valores:

  • Substitua o valor do espaço reservado <api-key> pela sua chave de API da Voyage AI.

  • Substitua o <connection-string> valor do espaço reservado pela string de conexão SRVdo seu Atlas cluster.

    Sua string de conexão deve usar o seguinte formato:

    mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net
3

Crie um arquivo denominado EmbeddingProvider.java e cole o seguinte código.

Este código define dois métodos para gerar incorporações para uma determinada entrada usando o modelo de incorporações voyage-3-large da Voyage AI:

  • Várias Entradas: O getEmbeddings método aceita uma array de entradas de textoList<String>(), permitindo criar várias incorporações em uma única chamada de API. O método converte as arrays de floats fornecidas pela API em arrays BSON de double para armazenamento em seu Atlas cluster.

  • Entrada única: o getEmbedding método aceita um String único, que representa uma query que você deseja fazer em relação aos dados vetoriais. O método converte a array de flutuantes fornecida pela API em uma array BSON de valores duplos para usar ao fazer query em sua coleção.

EmbeddingProvider.java
import dev.langchain4j.data.embedding.Embedding;
import dev.langchain4j.data.segment.TextSegment;
import dev.langchain4j.model.embedding.EmbeddingModel;
import dev.langchain4j.model.voyageai.VoyageAiEmbeddingModel;
import dev.langchain4j.model.output.Response;
import org.bson.BsonArray;
import org.bson.BsonDouble;
import java.util.List;
public class EmbeddingProvider {
private static EmbeddingModel embeddingModel;
private static EmbeddingModel getEmbeddingModel() {
if (embeddingModel == null) {
String apiKey = System.getenv("VOYAGE_AI_KEY");
if (apiKey == null || apiKey.isEmpty()) {
throw new IllegalStateException("VOYAGE_AI_KEY env variable is not set or is empty.");
}
return VoyageAiEmbeddingModel.builder()
.apiKey(apiKey)
.modelName("voyage-3-large")
.build();
}
return embeddingModel;
}
/**
* Takes an array of strings and returns a BSON array of embeddings to
* store in the database.
*/
public List<BsonArray> getEmbeddings(List<String> texts) {
List<TextSegment> textSegments = texts.stream()
.map(TextSegment::from)
.toList();
Response<List<Embedding>> response = getEmbeddingModel().embedAll(textSegments);
return response.content().stream()
.map(e -> new BsonArray(
e.vectorAsList().stream()
.map(BsonDouble::new)
.toList()))
.toList();
}
/**
* Takes a single string and returns a BSON array embedding to
* use in a vector query.
*/
public BsonArray getEmbedding(String text) {
Response<Embedding> response = getEmbeddingModel().embed(text);
return new BsonArray(
response.content().vectorAsList().stream()
.map(BsonDouble::new)
.toList());
}
}
1
  1. No seu IDE, crie um projeto Java usando Maven ou Gradle.

  2. Adicione as seguintes dependências, dependendo do seu gerenciador de pacotes:

    Se você estiver utilizando o Maven, adicione as seguintes dependências à array dependencies no arquivo pom.xml do seu projeto:

    pom.xml
    <dependencies>
    <!-- MongoDB Java Sync Driver v5.2.0 or later -->
    <dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>mongodb-driver-sync</artifactId>
    <version>[5.2.0,)</version>
    </dependency>
    <!-- Java library for working with OpenAI models -->
    <dependency>
    <groupId>dev.langchain4j</groupId>
    <artifactId>langchain4j-open-ai</artifactId>
    <version>0.35.0</version>
    </dependency>
    </dependencies>

    Se você estiver usando o Gradle, adicione o seguinte à array dependencies no arquivo build.gradle do seu projeto:

    build.gradle
    dependencies {
    // MongoDB Java Sync Driver v5.2.0 or later
    implementation 'org.mongodb:mongodb-driver-sync:[5.2.0,)'
    // Java library for working with OpenAI models
    implementation 'dev.langchain4j:langchain4j-open-ai:0.35.0'
    }
  3. Execute seu gerenciador de pacote para instalar as dependências em seu projeto.

2

Observação

Este exemplo define as variáveis do projeto no IDE. Os aplicativos de produção podem gerenciar variáveis de ambiente por meio de uma configuração de sistema, pipeline CI/CD ou gerenciador de segredos, mas você pode adaptar o código fornecido para se adequar ao seu caso de uso.

No seu IDE, crie um novo modelo de configuração e adicione as seguintes variáveis ao seu projeto:

Variáveis de ambiente
OPEN_AI_API_KEY=<api-key>
ATLAS_CONNECTION_STRING=<connection-string>

Atualize os espaços reservados com os seguintes valores:

  • Substitua o valor do espaço reservado ``<api-key>`` pela sua chave de API OpenAI.

  • Substitua o <connection-string> valor do espaço reservado pela string de conexão SRVdo seu Atlas cluster.

    Sua string de conexão deve usar o seguinte formato:

    mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net
3

Crie um arquivo denominado EmbeddingProvider.java e cole o seguinte código.

Este código define dois métodos para gerar incorporações para uma determinada entrada usando o modelo de incorporação text-embedding-3-small OpenAI:

  • Várias Entradas: O getEmbeddings método aceita uma array de entradas de textoList<String>(), permitindo criar várias incorporações em uma única chamada de API. O método converte as arrays de floats fornecidas pela API em arrays BSON de double para armazenamento em seu Atlas cluster.

  • Entrada única: o getEmbedding método aceita um String único, que representa uma query que você deseja fazer em relação aos dados vetoriais. O método converte a array de flutuantes fornecida pela API em uma array BSON de valores duplos para usar ao fazer query em sua coleção.

EmbeddingProvider.java
import dev.langchain4j.data.embedding.Embedding;
import dev.langchain4j.data.segment.TextSegment;
import dev.langchain4j.model.openai.OpenAiEmbeddingModel;
import dev.langchain4j.model.output.Response;
import org.bson.BsonArray;
import org.bson.BsonDouble;
import java.util.List;
import static java.time.Duration.ofSeconds;
public class EmbeddingProvider {
private static OpenAiEmbeddingModel embeddingModel;
private static OpenAiEmbeddingModel getEmbeddingModel() {
if (embeddingModel == null) {
String apiKey = System.getenv("OPEN_AI_API_KEY");
if (apiKey == null || apiKey.isEmpty()) {
throw new IllegalStateException("OPEN_AI_API_KEY env variable is not set or is empty.");
}
return OpenAiEmbeddingModel.builder()
.apiKey(apiKey)
.modelName("text-embedding-3-small")
.timeout(ofSeconds(60))
.build();
}
return embeddingModel;
}
/**
* Takes an array of strings and returns a BSON array of embeddings to
* store in the database.
*/
public List<BsonArray> getEmbeddings(List<String> texts) {
List<TextSegment> textSegments = texts.stream()
.map(TextSegment::from)
.toList();
Response<List<Embedding>> response = getEmbeddingModel().embedAll(textSegments);
return response.content().stream()
.map(e -> new BsonArray(
e.vectorAsList().stream()
.map(BsonDouble::new)
.toList()))
.toList();
}
/**
* Takes a single string and returns a BSON array embedding to
* use in a vector query.
*/
public BsonArray getEmbedding(String text) {
Response<Embedding> response = getEmbeddingModel().embed(text);
return new BsonArray(
response.content().vectorAsList().stream()
.map(BsonDouble::new)
.toList());
}
}

Nesta seção, você usa um modelo de incorporação para gerar incorporações vetoriais. Selecione uma aba dependendo se você deseja usar um modelo de incorporação de código aberto ou um modelo proprietário. Para obter incorporações de última geração, utilize a Voyage AI.

Esta seção também inclui uma função opcional que você pode usar para compactar suas incorporações para armazenamento eficiente e melhor desempenho de consulta. Para saber mais, consulte Compactação de vetores.

1

Em uma janela de terminal, execute os seguintes comandos para criar um novo diretório chamado my-embeddings-project e inicializar seu projeto:

mkdir my-embeddings-project
cd my-embeddings-project
npm init -y
2

Configure seu projeto para usar módulos ES adicionando "type": "module" ao seu arquivo package.json e salvando-o.

{
"type": "module",
// other fields...
}
3

Em uma janela de terminal, execute o seguinte comando:

npm install mongodb @xenova/transformers
4
  1. No seu projeto, crie um arquivo .env para armazenar sua string de conexão do Atlas.

    ATLAS_CONNECTION_STRING="<connection-string>"
  2. Substitua o <connection-string> valor do espaço reservado pela string de conexão SRVdo seu Atlas cluster.

    Observação

    Requisitos mínimos de versão do Node.js

    O Node.js v20.x introduziu a opção --env-file. Se você estiver usando uma versão mais antiga do Node.js, adicione o pacote dotenv ao seu projeto ou use um método diferente para gerenciar suas variáveis de ambiente.

  3. Salve o arquivo.

5
  1. Crie um arquivo denominado get-embeddings.js.

    touch get-embeddings.js
  2. Cole o seguinte código no arquivo.

    Este código define uma função chamada getEmbedding para gerar uma incorporação para uma determinada entrada. Essa função especifica:

    get-embeddings.js
    import { pipeline } from '@xenova/transformers';
    // Function to generate embeddings for a given data source
    export async function getEmbedding(data) {
    const embedder = await pipeline(
    'feature-extraction',
    'Xenova/nomic-embed-text-v1');
    const results = await embedder(data, { pooling: 'mean', normalize: true });
    return Array.from(results.data);
    }
  3. Salve o arquivo.

1

Em uma janela de terminal, execute os seguintes comandos para criar um novo diretório chamado my-embeddings-project e inicializar seu projeto:

mkdir my-embeddings-project
cd my-embeddings-project
npm init -y
2

Configure seu projeto para usar módulos ES adicionando "type": "module" ao seu arquivo package.json e salvando-o.

{
"type": "module",
// other fields...
}
3

Em uma janela de terminal, execute o seguinte comando:

npm install mongodb voyageai
4
  1. No seu projeto, crie um arquivo .env com o seguinte conteúdo:

    VOYAGE_API_KEY = "<api-key>"
    ATLAS_CONNECTION_STRING = "<connection-string>"
  2. Substitua <api-key> os <connection-string> valores de placeholder e pela chave da API do Voyage e pela string de conexão SRVdo Atlas cluster. Sua string de conexão deve usar o seguinte formato:

    mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net

    Observação

    Requisitos mínimos de versão do Node.js

    O Node.js v20.x introduziu a opção --env-file. Se você estiver usando uma versão mais antiga do Node.js, adicione o pacote dotenv ao seu projeto ou use um método diferente para gerenciar suas variáveis de ambiente.

  3. Salve o arquivo.

5
  1. Crie um arquivo denominado get-embeddings.js.

  2. Cole o seguinte código. Este código define uma função denominada getEmbedding que utiliza o modelo voyage-3-large para gerar uma incorporação para uma determinada entrada de texto.

    get-embeddings.js
    import { VoyageAIClient } from 'voyageai';
    // Set up Voyage AI configuration
    const client = new VoyageAIClient({apiKey: process.env.VOYAGE_API_KEY});
    // Function to generate embeddings using the Voyage AI API
    export async function getEmbedding(text) {
    const results = await client.embed({
    input: text,
    model: "voyage-3-large"
    });
    return results.data[0].embedding;
    }

    Dica

  3. Salve o arquivo.

1

Em uma janela de terminal, execute os seguintes comandos para criar um novo diretório chamado my-embeddings-project e inicializar seu projeto:

mkdir my-embeddings-project
cd my-embeddings-project
npm init -y
2

Configure seu projeto para usar módulos ES adicionando "type": "module" ao seu arquivo package.json e salvando-o.

{
"type": "module",
// other fields...
}
3

Em uma janela de terminal, execute o seguinte comando:

npm install mongodb openai
4
  1. Em seu projeto, crie um arquivo .env para armazenar sua string de conexão do Atlas e a chave de API da OpenAI.

    OPENAI_API_KEY = "<api-key>"
    ATLAS_CONNECTION_STRING = "<connection-string>"
  2. Substitua os valores de espaço reservado <api-key> e <connection-string> por sua chave de API da OpenAI e a string de conexão SRV pra seu Cluster do Atlas. Sua string de conexão deve usar o seguinte formato:

    mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net

    Observação

    Requisitos mínimos de versão do Node.js

    O Node.js v20.x introduziu a opção --env-file. Se você estiver usando uma versão mais antiga do Node.js, adicione o pacote dotenv ao seu projeto ou use um método diferente para gerenciar suas variáveis de ambiente.

  3. Salve o arquivo.

5
  1. Crie um arquivo denominado get-embeddings.js.

  2. Cole o seguinte código. Esse código define uma função chamada getEmbedding que usa o modelo text-embedding-3-small da OpenAI para gerar uma incorporação para uma determinada entrada.

    get-embeddings.js
    import OpenAI from 'openai';
    // Set up OpenAI configuration
    const openai = new OpenAI({apiKey: process.env.OPENAI_API_KEY});
    // Function to generate embeddings using the OpenAI API
    export async function getEmbedding(text) {
    const results = await openai.embeddings.create({
    model: "text-embedding-3-small",
    input: text,
    encoding_format: "float",
    });
    return results.data[0].embedding;
    }
  3. Salve o arquivo.

Nesta seção, você usa um modelo de incorporação para gerar incorporações vetoriais. Selecione uma aba dependendo se você deseja usar um modelo de incorporação de código aberto ou um modelo proprietário. Para obter incorporações de última geração, utilize a Voyage AI.

Esta seção também inclui uma função opcional que você pode usar para compactar suas incorporações para armazenamento eficiente e melhor desempenho de consulta. Para saber mais, consulte Compactação de vetores.

1

Crie um notebook Python interativo salvando um arquivo com a extensão .ipynb e, em seguida, execute o seguinte comando no notebook para instalar as dependências:

pip install --quiet --upgrade sentence-transformers pymongo einops
2

Cole e execute o seguinte código no seu notebook para criar uma função que gera incorporações vetoriais usando um modelo de incorporação de código aberto da Nomic AI. Este código faz o seguinte:

  • Carrega o modelo de incorporação de1nomic-embed-text-v.

  • Cria uma função chamada get_embedding que usa o modelo para gerar incorporações para uma determinada entrada de texto. A precisão padrão é float32.

  • Gera incorporações para a string, foo.

from sentence_transformers import SentenceTransformer
# Load the embedding model
model = SentenceTransformer("nomic-ai/nomic-embed-text-v1", trust_remote_code=True)
# Define a function to generate embeddings
def get_embedding(data, precision="float32"):
return model.encode(data, precision=precision).tolist()
# Generate an embedding
embedding = get_embedding("foo")
print(embedding)
[-0.02980827 0.03841474 -0.02561123 ... -0.0532876 -0.0335409 -0.02591543]
1

Crie um notebook Python interativo salvando um arquivo com a extensão .ipynb e, em seguida, execute o seguinte comando no notebook para instalar as dependências:

pip install --quiet --upgrade voyageai pymongo
2

Cole e execute o código a seguir em seu bloco de anotações para criar uma função chamada get_embedding que gera incorporações vetoriais usando um modelo de incorporação da Voyage AI. Substitua <api-key> pela sua chave API do Voyage.

A função especifica o seguinte:

  • voyage-3-large como o modelo de incorporação a ser usado.

  • input_type para otimizar suas incorporações para recuperação. Para saber mais, consulte a API Python da Voyage AI.

Dica

Para todos os modelos e parâmetros, consulte Incorporações de texto Voyage AI.

import os
import voyageai
# Specify your Voyage API key and embedding model
os.environ["VOYAGE_API_KEY"] = "<api-key>"
model = "voyage-3-large"
vo = voyageai.Client()
# Define a function to generate embeddings
def get_embedding(data, input_type = "document"):
embeddings = vo.embed(
data, model = model, input_type = input_type
).embeddings
return embeddings[0]
# Generate an embedding
embedding = get_embedding("foo")
print(embedding)
[-0.016463523730635643, -0.040630217641592026, -0.026241062209010124, -0.006248823832720518, ... -0.003811582690104842, -0.01361055113375187, 0.047476209700107574, -0.0030144075863063335]
1

Crie um notebook Python interativo salvando um arquivo com a extensão .ipynb e, em seguida, execute o seguinte comando no notebook para instalar as dependências:

pip install --quiet --upgrade openai pymongo
2

Cole e execute o código a seguir em seu notebook para criar uma função que gere embeddings vetoriais usando um modelo de embedding proprietário da OpenAI. Substitua <api-key> pela sua chave de API OpenAI. Este código faz o seguinte:

  • Especifica o modelo de incorporação text-embedding-3-small.

  • Cria uma função chamada get_embedding que chama a API do modelo para gerar uma incorporação para uma determinada entrada de texto.

  • Testa a função gerando uma única incorporação para a string foo.

import os
from openai import OpenAI
# Specify your OpenAI API key and embedding model
os.environ["OPENAI_API_KEY"] = "<api-key>"
model = "text-embedding-3-small"
openai_client = OpenAI()
# Define a function to generate embeddings
def get_embedding(text):
"""Generates vector embeddings for the given text."""
embedding = openai_client.embeddings.create(input = [text], model=model).data[0].embedding
return embedding
# Generate an embedding
embedding = get_embedding("foo")
print(embedding)
[-0.005843308754265308, -0.013111298903822899, -0.014585349708795547, 0.03580040484666824, 0.02671629749238491, ... ]

Dica

Para mais detalhes da API e uma lista de modelos disponíveis, consulte a documentação da OpenAI.

Nesta seção, você cria incorporações vetoriais a partir dos seus dados utilizando a função que você definiu e então armazena estas incorporações em uma coleção no Atlas.

Selecione uma guia com base no desejo de criar incorporações a partir de novos dados ou de dados existentes que você já possui no Atlas.

1

Crie uma nova classe em um arquivo com o mesmo nome chamado DataService.cs e cole o código a seguir. Este código define uma tarefa assíncrona chamada AddDocumentsAsync que adiciona documentos ao Atlas. Esta função usa o método Collection.InsertManyAsync() do C# driver para inserir uma lista do tipo BsonDocument. Cada documento contém:

  • Um campo text que contém o resumo do filme.

  • Um embedding campo que contém a array de floats gerada a partir das incorporações vetoriais.

DataService.cs
namespace MyCompany.Embeddings;
using MongoDB.Driver;
using MongoDB.Bson;
public class DataService
{
private static readonly string? ConnectionString = Environment.GetEnvironmentVariable("ATLAS_CONNECTION_STRING");
private static readonly MongoClient Client = new MongoClient(ConnectionString);
private static readonly IMongoDatabase Database = Client.GetDatabase("sample_db");
private static readonly IMongoCollection<BsonDocument> Collection = Database.GetCollection<BsonDocument>("embeddings");
public async Task AddDocumentsAsync(Dictionary<string, float[]> embeddings)
{
var documents = new List<BsonDocument>();
foreach( KeyValuePair<string, float[]> var in embeddings )
{
var document = new BsonDocument
{
{
"text", var.Key
},
{
"embedding", new BsonArray(var.Value)
}
};
documents.Add(document);
}
await Collection.InsertManyAsync(documents);
Console.WriteLine($"Successfully inserted {embeddings.Count} documents into Atlas");
documents.Clear();
}
}
2

Use o código a seguir para gerar incorporações a partir de uma coleção existente no Atlas.

Especificamente, este código usa a função GetEmbeddingsAsync que você definiu para gerar incorporações a partir de uma array de textos de amostra e ingeri-los na coleção sample_db.embeddings no Atlas.

Program.cs
using MyCompany.Embeddings;
var aiService = new AIService();
var texts = new string[]
{
"Titanic: The story of the 1912 sinking of the largest luxury liner ever built",
"The Lion King: Lion cub and future king Simba searches for his identity",
"Avatar: A marine is dispatched to the moon Pandora on a unique mission"
};
var embeddings = await aiService.GetEmbeddingsAsync(texts);
var dataService = new DataService();
await dataService.AddDocumentsAsync(embeddings);
3
dotnet run MyCompany.Embeddings.csproj
Successfully inserted 3 documents into Atlas

Você também pode visualizar suas incorporações vetoriais na interface do Atlas navegando até a coleção sample_db.embeddings no seu cluster.

Observação

Este exemplo usa a coleção sample_airbnb.listingsAndReviews de nossos dados de amostra, mas você pode adaptar o código para funcionar com qualquer coleção em seu cluster.

1

Crie uma nova classe em um arquivo de mesmo nome chamado DataService.cs e cole o código a seguir. Este código cria duas funções que executam as seguintes tarefas:

  • Conecte-se ao seu cluster do Atlas.

  • O método GetDocuments obtém um subconjunto de documentos da coleção sample_airbnb.listingsAndReviews que têm um campo summary não vazio.

  • A tarefa assíncrona AddEmbeddings cria um novo campo embeddings nos documentos da coleção sample_airbnb.listingsAndReviews cujo _id corresponde a um dos documentos recuperados pelo método GetDocuments.

DataService.cs
namespace MyCompany.Embeddings;
using MongoDB.Driver;
using MongoDB.Bson;
public class DataService
{
private static readonly string? ConnectionString = Environment.GetEnvironmentVariable("ATLAS_CONNECTION_STRING");
private static readonly MongoClient Client = new MongoClient(ConnectionString);
private static readonly IMongoDatabase Database = Client.GetDatabase("sample_airbnb");
private static readonly IMongoCollection<BsonDocument> Collection = Database.GetCollection<BsonDocument>("listingsAndReviews");
public List<BsonDocument>? GetDocuments()
{
var filter = Builders<BsonDocument>.Filter.And(
Builders<BsonDocument>.Filter.And(
Builders<BsonDocument>.Filter.Exists("summary", true),
Builders<BsonDocument>.Filter.Ne("summary", "")
),
Builders<BsonDocument>.Filter.Exists("embeddings", false)
);
return Collection.Find(filter).Limit(50).ToList();
}
public async Task<long> AddEmbeddings(Dictionary<string, float[]> embeddings)
{
var listWrites = new List<WriteModel<BsonDocument>>();
foreach( var kvp in embeddings )
{
var filterForUpdate = Builders<BsonDocument>.Filter.Eq("summary", kvp.Key);
var updateDefinition = Builders<BsonDocument>.Update.Set("embeddings", kvp.Value);
listWrites.Add(new UpdateOneModel<BsonDocument>(filterForUpdate, updateDefinition));
}
var result = await Collection.BulkWriteAsync(listWrites);
listWrites.Clear();
return result.ModifiedCount;
}
}
2

Use o código a seguir para gerar incorporações a partir de uma coleção existente no Atlas.

Especificamente, este código usa a função GetEmbeddingsAsync que você definiu para gerar incorporações a partir de uma array de textos de amostra e ingeri-los na coleção sample_db.embeddings no Atlas.

Program.cs
using MyCompany.Embeddings;
var dataService = new DataService();
var documents = dataService.GetDocuments();
if (documents != null)
{
Console.WriteLine("Generating embeddings.");
var aiService = new AIService();
var summaries = new List<string>();
foreach (var document in documents)
{
var summary = document.GetValue("summary").ToString();
if (summary != null)
{
summaries.Add(summary);
}
}
try
{
if (summaries.Count > 0)
{
var embeddings = await aiService.GetEmbeddingsAsync(summaries.ToArray());
try
{
var updatedCount = await dataService.AddEmbeddings(embeddings);
Console.WriteLine($"{updatedCount} documents updated successfully.");
} catch (Exception e)
{
Console.WriteLine($"Error adding embeddings to MongoDB: {e.Message}");
}
}
}
catch (Exception e)
{
Console.WriteLine($"Error creating embeddings for summaries: {e.Message}");
}
}
else
{
Console.WriteLine("No documents found");
}
3
dotnet run MyCompany.Embeddings.csproj
Generating embeddings.
50 documents updated successfully.
1

Use o código a seguir para gerar incorporações a partir de uma coleção existente no Atlas.

Especificamente, este código usa a função GetEmbeddings que você definiu e o driver do MongoDB Go para gerar incorporações a partir de uma array de textos de amostra e ingeri-los na coleção sample_db.embeddings no Atlas.

create-embeddings.go
package main
import (
"context"
"fmt"
"log"
"my-embeddings-project/common"
"os"
"github.com/joho/godotenv"
"go.mongodb.org/mongo-driver/v2/mongo"
"go.mongodb.org/mongo-driver/v2/mongo/options"
)
var data = []string{
"Titanic: The story of the 1912 sinking of the largest luxury liner ever built",
"The Lion King: Lion cub and future king Simba searches for his identity",
"Avatar: A marine is dispatched to the moon Pandora on a unique mission",
}
type TextWithEmbedding struct {
Text string
Embedding []float32
}
func main() {
ctx := context.Background()
if err := godotenv.Load(); err != nil {
log.Println("no .env file found")
}
// Connect to your Atlas cluster
uri := os.Getenv("ATLAS_CONNECTION_STRING")
if uri == "" {
log.Fatal("set your 'ATLAS_CONNECTION_STRING' environment variable.")
}
clientOptions := options.Client().ApplyURI(uri)
client, err := mongo.Connect(clientOptions)
if err != nil {
log.Fatalf("failed to connect to the server: %v", err)
}
defer func() { _ = client.Disconnect(ctx) }()
// Set the namespace
coll := client.Database("sample_db").Collection("embeddings")
embeddings := common.GetEmbeddings(data)
docsToInsert := make([]interface{}, len(embeddings))
for i, string := range data {
docsToInsert[i] = TextWithEmbedding{
Text: string,
Embedding: embeddings[i],
}
}
result, err := coll.InsertMany(ctx, docsToInsert)
if err != nil {
log.Fatalf("failed to insert documents: %v", err)
}
fmt.Printf("Successfully inserted %v documents into Atlas\n", len(result.InsertedIDs))
}
create-embeddings.go
package main
import (
"context"
"fmt"
"log"
"my-embeddings-project/common"
"os"
"github.com/joho/godotenv"
"go.mongodb.org/mongo-driver/v2/mongo"
"go.mongodb.org/mongo-driver/v2/mongo/options"
)
var data = []string{
"Titanic: The story of the 1912 sinking of the largest luxury liner ever built",
"The Lion King: Lion cub and future king Simba searches for his identity",
"Avatar: A marine is dispatched to the moon Pandora on a unique mission",
}
type TextWithEmbedding struct {
Text string
Embedding []float64
}
func main() {
ctx := context.Background()
if err := godotenv.Load(); err != nil {
log.Println("no .env file found")
}
// Connect to your Atlas cluster
uri := os.Getenv("ATLAS_CONNECTION_STRING")
if uri == "" {
log.Fatal("set your 'ATLAS_CONNECTION_STRING' environment variable.")
}
clientOptions := options.Client().ApplyURI(uri)
client, err := mongo.Connect(clientOptions)
if err != nil {
log.Fatalf("failed to connect to the server: %v", err)
}
defer func() { _ = client.Disconnect(ctx) }()
// Set the namespace
coll := client.Database("sample_db").Collection("embeddings")
embeddings := common.GetEmbeddings(data)
docsToInsert := make([]interface{}, len(data))
for i, movie := range data {
docsToInsert[i] = TextWithEmbedding{
Text: movie,
Embedding: embeddings[i],
}
}
result, err := coll.InsertMany(ctx, docsToInsert)
if err != nil {
log.Fatalf("failed to insert documents: %v", err)
}
fmt.Printf("Successfully inserted %v documents into Atlas\n", len(result.InsertedIDs))
}
2
go run create-embeddings.go
Successfully inserted 3 documents into Atlas
go run create-embeddings.go
Successfully inserted 3 documents into Atlas

Você também pode visualizar suas incorporações vetoriais na interface do Atlas navegando até a coleção sample_db.embeddings no seu cluster.

Observação

Este exemplo usa a coleção sample_airbnb.listingsAndReviews de nossos dados de amostra, mas você pode adaptar o código para funcionar com qualquer coleção em seu cluster.

1

Use o código a seguir para gerar incorporações a partir de uma coleção existente no Atlas. Especificamente, esse código faz o seguinte:

  • Conecta-se ao seu cluster do Atlas.

  • Obtém um subconjunto de documentos da coleção sample_airbnb.listingsAndReviews que tem um campo summary não vazio.

  • Gera incorporações do campo summary de cada documento usando a função GetEmbeddings que você definiu.

  • Atualiza cada documento com um novo campo embeddings que contém o valor de incorporação usando o Go Driver do MongoDB.

create-embeddings.go
package main
import (
"context"
"log"
"my-embeddings-project/common"
"os"
"github.com/joho/godotenv"
"go.mongodb.org/mongo-driver/v2/bson"
"go.mongodb.org/mongo-driver/v2/mongo"
"go.mongodb.org/mongo-driver/v2/mongo/options"
)
func main() {
ctx := context.Background()
if err := godotenv.Load(); err != nil {
log.Println("no .env file found")
}
// Connect to your Atlas cluster
uri := os.Getenv("ATLAS_CONNECTION_STRING")
if uri == "" {
log.Fatal("set your 'ATLAS_CONNECTION_STRING' environment variable.")
}
clientOptions := options.Client().ApplyURI(uri)
client, err := mongo.Connect(clientOptions)
if err != nil {
log.Fatalf("failed to connect to the server: %v", err)
}
defer func() { _ = client.Disconnect(ctx) }()
// Set the namespace
coll := client.Database("sample_airbnb").Collection("listingsAndReviews")
filter := bson.D{
{"$and",
bson.A{
bson.D{
{"$and",
bson.A{
bson.D{{"summary", bson.D{{"$exists", true}}}},
bson.D{{"summary", bson.D{{"$ne", ""}}}},
},
}},
bson.D{{"embeddings", bson.D{{"$exists", false}}}},
}},
}
opts := options.Find().SetLimit(50)
cursor, err := coll.Find(ctx, filter, opts)
if err != nil {
log.Fatalf("failed to retrieve documents: %v", err)
}
var listings []common.Listing
if err = cursor.All(ctx, &listings); err != nil {
log.Fatalf("failed to unmarshal retrieved documents to Listing object: %v", err)
}
var summaries []string
for _, listing := range listings {
summaries = append(summaries, listing.Summary)
}
log.Println("Generating embeddings.")
embeddings := common.GetEmbeddings(summaries)
docsToUpdate := make([]mongo.WriteModel, len(listings))
for i := range listings {
docsToUpdate[i] = mongo.NewUpdateOneModel().
SetFilter(bson.D{{"_id", listings[i].ID}}).
SetUpdate(bson.D{{"$set", bson.D{{"embeddings", embeddings[i]}}}})
}
bulkWriteOptions := options.BulkWrite().SetOrdered(false)
result, err := coll.BulkWrite(context.Background(), docsToUpdate, bulkWriteOptions)
if err != nil {
log.Fatalf("failed to write embeddings to existing documents: %v", err)
}
log.Printf("Successfully added embeddings to %v documents", result.ModifiedCount)
}
2

Para simplificar a ordenação e a desordenação de objetos Go de e para o BSON, crie um arquivo que contenha modelos para os documentos nesta coleção.

  1. Mover para o diretório common.

    cd common
  2. Crie um arquivo denominado models.go e cole o seguinte código nele:

    models.go
    package common
    import (
    "time"
    "go.mongodb.org/mongo-driver/v2/bson"
    )
    type Image struct {
    ThumbnailURL string `bson:"thumbnail_url"`
    MediumURL string `bson:"medium_url"`
    PictureURL string `bson:"picture_url"`
    XLPictureURL string `bson:"xl_picture_url"`
    }
    type Host struct {
    ID string `bson:"host_id"`
    URL string `bson:"host_url"`
    Name string `bson:"host_name"`
    Location string `bson:"host_location"`
    About string `bson:"host_about"`
    ThumbnailURL string `bson:"host_thumbnail_url"`
    PictureURL string `bson:"host_picture_url"`
    Neighborhood string `bson:"host_neighborhood"`
    IsSuperhost bool `bson:"host_is_superhost"`
    HasProfilePic bool `bson:"host_has_profile_pic"`
    IdentityVerified bool `bson:"host_identity_verified"`
    ListingsCount int32 `bson:"host_listings_count"`
    TotalListingsCount int32 `bson:"host_total_listings_count"`
    Verifications []string `bson:"host_verifications"`
    }
    type Location struct {
    Type string `bson:"type"`
    Coordinates []float64 `bson:"coordinates"`
    IsLocationExact bool `bson:"is_location_exact"`
    }
    type Address struct {
    Street string `bson:"street"`
    Suburb string `bson:"suburb"`
    GovernmentArea string `bson:"government_area"`
    Market string `bson:"market"`
    Country string `bson:"Country"`
    CountryCode string `bson:"country_code"`
    Location Location `bson:"location"`
    }
    type Availability struct {
    Thirty int32 `bson:"availability_30"`
    Sixty int32 `bson:"availability_60"`
    Ninety int32 `bson:"availability_90"`
    ThreeSixtyFive int32 `bson:"availability_365"`
    }
    type ReviewScores struct {
    Accuracy int32 `bson:"review_scores_accuracy"`
    Cleanliness int32 `bson:"review_scores_cleanliness"`
    CheckIn int32 `bson:"review_scores_checkin"`
    Communication int32 `bson:"review_scores_communication"`
    Location int32 `bson:"review_scores_location"`
    Value int32 `bson:"review_scores_value"`
    Rating int32 `bson:"review_scores_rating"`
    }
    type Review struct {
    ID string `bson:"_id"`
    Date time.Time `bson:"date,omitempty"`
    ListingId string `bson:"listing_id"`
    ReviewerId string `bson:"reviewer_id"`
    ReviewerName string `bson:"reviewer_name"`
    Comments string `bson:"comments"`
    }
    type Listing struct {
    ID string `bson:"_id"`
    ListingURL string `bson:"listing_url"`
    Name string `bson:"name"`
    Summary string `bson:"summary"`
    Space string `bson:"space"`
    Description string `bson:"description"`
    NeighborhoodOverview string `bson:"neighborhood_overview"`
    Notes string `bson:"notes"`
    Transit string `bson:"transit"`
    Access string `bson:"access"`
    Interaction string `bson:"interaction"`
    HouseRules string `bson:"house_rules"`
    PropertyType string `bson:"property_type"`
    RoomType string `bson:"room_type"`
    BedType string `bson:"bed_type"`
    MinimumNights string `bson:"minimum_nights"`
    MaximumNights string `bson:"maximum_nights"`
    CancellationPolicy string `bson:"cancellation_policy"`
    LastScraped time.Time `bson:"last_scraped,omitempty"`
    CalendarLastScraped time.Time `bson:"calendar_last_scraped,omitempty"`
    FirstReview time.Time `bson:"first_review,omitempty"`
    LastReview time.Time `bson:"last_review,omitempty"`
    Accommodates int32 `bson:"accommodates"`
    Bedrooms int32 `bson:"bedrooms"`
    Beds int32 `bson:"beds"`
    NumberOfReviews int32 `bson:"number_of_reviews"`
    Bathrooms bson.Decimal128 `bson:"bathrooms"`
    Amenities []string `bson:"amenities"`
    Price bson.Decimal128 `bson:"price"`
    WeeklyPrice bson.Decimal128 `bson:"weekly_price"`
    MonthlyPrice bson.Decimal128 `bson:"monthly_price"`
    CleaningFee bson.Decimal128 `bson:"cleaning_fee"`
    ExtraPeople bson.Decimal128 `bson:"extra_people"`
    GuestsIncluded bson.Decimal128 `bson:"guests_included"`
    Image Image `bson:"images"`
    Host Host `bson:"host"`
    Address Address `bson:"address"`
    Availability Availability `bson:"availability"`
    ReviewScores ReviewScores `bson:"review_scores"`
    Reviews []Review `bson:"reviews"`
    Embeddings []float32 `bson:"embeddings,omitempty"`
    }
    models.go
    package common
    import (
    "time"
    "go.mongodb.org/mongo-driver/v2/bson"
    )
    type Image struct {
    ThumbnailURL string `bson:"thumbnail_url"`
    MediumURL string `bson:"medium_url"`
    PictureURL string `bson:"picture_url"`
    XLPictureURL string `bson:"xl_picture_url"`
    }
    type Host struct {
    ID string `bson:"host_id"`
    URL string `bson:"host_url"`
    Name string `bson:"host_name"`
    Location string `bson:"host_location"`
    About string `bson:"host_about"`
    ThumbnailURL string `bson:"host_thumbnail_url"`
    PictureURL string `bson:"host_picture_url"`
    Neighborhood string `bson:"host_neighborhood"`
    IsSuperhost bool `bson:"host_is_superhost"`
    HasProfilePic bool `bson:"host_has_profile_pic"`
    IdentityVerified bool `bson:"host_identity_verified"`
    ListingsCount int32 `bson:"host_listings_count"`
    TotalListingsCount int32 `bson:"host_total_listings_count"`
    Verifications []string `bson:"host_verifications"`
    }
    type Location struct {
    Type string `bson:"type"`
    Coordinates []float64 `bson:"coordinates"`
    IsLocationExact bool `bson:"is_location_exact"`
    }
    type Address struct {
    Street string `bson:"street"`
    Suburb string `bson:"suburb"`
    GovernmentArea string `bson:"government_area"`
    Market string `bson:"market"`
    Country string `bson:"Country"`
    CountryCode string `bson:"country_code"`
    Location Location `bson:"location"`
    }
    type Availability struct {
    Thirty int32 `bson:"availability_30"`
    Sixty int32 `bson:"availability_60"`
    Ninety int32 `bson:"availability_90"`
    ThreeSixtyFive int32 `bson:"availability_365"`
    }
    type ReviewScores struct {
    Accuracy int32 `bson:"review_scores_accuracy"`
    Cleanliness int32 `bson:"review_scores_cleanliness"`
    CheckIn int32 `bson:"review_scores_checkin"`
    Communication int32 `bson:"review_scores_communication"`
    Location int32 `bson:"review_scores_location"`
    Value int32 `bson:"review_scores_value"`
    Rating int32 `bson:"review_scores_rating"`
    }
    type Review struct {
    ID string `bson:"_id"`
    Date time.Time `bson:"date,omitempty"`
    ListingId string `bson:"listing_id"`
    ReviewerId string `bson:"reviewer_id"`
    ReviewerName string `bson:"reviewer_name"`
    Comments string `bson:"comments"`
    }
    type Listing struct {
    ID string `bson:"_id"`
    ListingURL string `bson:"listing_url"`
    Name string `bson:"name"`
    Summary string `bson:"summary"`
    Space string `bson:"space"`
    Description string `bson:"description"`
    NeighborhoodOverview string `bson:"neighborhood_overview"`
    Notes string `bson:"notes"`
    Transit string `bson:"transit"`
    Access string `bson:"access"`
    Interaction string `bson:"interaction"`
    HouseRules string `bson:"house_rules"`
    PropertyType string `bson:"property_type"`
    RoomType string `bson:"room_type"`
    BedType string `bson:"bed_type"`
    MinimumNights string `bson:"minimum_nights"`
    MaximumNights string `bson:"maximum_nights"`
    CancellationPolicy string `bson:"cancellation_policy"`
    LastScraped time.Time `bson:"last_scraped,omitempty"`
    CalendarLastScraped time.Time `bson:"calendar_last_scraped,omitempty"`
    FirstReview time.Time `bson:"first_review,omitempty"`
    LastReview time.Time `bson:"last_review,omitempty"`
    Accommodates int32 `bson:"accommodates"`
    Bedrooms int32 `bson:"bedrooms"`
    Beds int32 `bson:"beds"`
    NumberOfReviews int32 `bson:"number_of_reviews"`
    Bathrooms bson.Decimal128 `bson:"bathrooms"`
    Amenities []string `bson:"amenities"`
    Price bson.Decimal128 `bson:"price"`
    WeeklyPrice bson.Decimal128 `bson:"weekly_price"`
    MonthlyPrice bson.Decimal128 `bson:"monthly_price"`
    CleaningFee bson.Decimal128 `bson:"cleaning_fee"`
    ExtraPeople bson.Decimal128 `bson:"extra_people"`
    GuestsIncluded bson.Decimal128 `bson:"guests_included"`
    Image Image `bson:"images"`
    Host Host `bson:"host"`
    Address Address `bson:"address"`
    Availability Availability `bson:"availability"`
    ReviewScores ReviewScores `bson:"review_scores"`
    Reviews []Review `bson:"reviews"`
    Embeddings []float64 `bson:"embeddings,omitempty"`
    }
  3. Volte para o diretório raiz do projeto .

    cd ../
3
go run create-embeddings.go
2024/10/10 09:58:03 Generating embeddings.
2024/10/10 09:58:12 Successfully added embeddings to 50 documents

Você pode visualizar suas incorporações vetoriais na interface do Atlas navegando até a coleção sample_airbnb.listingsAndReviews no seu cluster e expandindo os campos em um documento.

1

Crie um arquivo denominado CreateEmbeddings.java e cole o seguinte código.

Este código utiliza o getEmbeddings método e o MongoDB Java Sync Driver para fazer o seguinte:

  1. Conecte-se ao seu cluster do Atlas.

  2. Obtenha a array de textos de exemplo.

  3. Gere incorporações de cada texto utilizando o método getEmbeddings que você definiu anteriormente.

  4. Gerencie as incorporações na coleção sample_db.embeddings no Atlas.

CreateEmbeddings.java
import com.mongodb.MongoException;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.result.InsertManyResult;
import org.bson.BsonArray;
import org.bson.Document;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class CreateEmbeddings {
static List<String> data = Arrays.asList(
"Titanic: The story of the 1912 sinking of the largest luxury liner ever built",
"The Lion King: Lion cub and future king Simba searches for his identity",
"Avatar: A marine is dispatched to the moon Pandora on a unique mission"
);
public static void main(String[] args){
String uri = System.getenv("ATLAS_CONNECTION_STRING");
if (uri == null || uri.isEmpty()) {
throw new RuntimeException("ATLAS_CONNECTION_STRING env variable is not set or is empty.");
}
// establish connection and set namespace
try (MongoClient mongoClient = MongoClients.create(uri)) {
MongoDatabase database = mongoClient.getDatabase("sample_db");
MongoCollection<Document> collection = database.getCollection("embeddings");
System.out.println("Creating embeddings for " + data.size() + " documents");
EmbeddingProvider embeddingProvider = new EmbeddingProvider();
// generate embeddings for new inputted data
List<BsonArray> embeddings = embeddingProvider.getEmbeddings(data);
List<Document> documents = new ArrayList<>();
int i = 0;
for (String text : data) {
Document doc = new Document("text", text).append("embedding", embeddings.get(i));
documents.add(doc);
i++;
}
// insert the embeddings into the Atlas collection
List<String> insertedIds = new ArrayList<>();
try {
InsertManyResult result = collection.insertMany(documents);
result.getInsertedIds().values()
.forEach(doc -> insertedIds.add(doc.toString()));
System.out.println("Inserted " + insertedIds.size() + " documents with the following ids to " + collection.getNamespace() + " collection: \n " + insertedIds);
} catch (MongoException me) {
throw new RuntimeException("Failed to insert documents", me);
}
} catch (MongoException me) {
throw new RuntimeException("Failed to connect to MongoDB ", me);
} catch (Exception e) {
throw new RuntimeException("Operation failed: ", e);
}
}
}
2

Salve e execute o arquivo. A saída se assemelha a:

Creating embeddings for 3 documents
Inserted 3 documents with the following ids to sample_db.embeddings collection:
[BsonObjectId{value=6735ff620d88451041f6dd40}, BsonObjectId{value=6735ff620d88451041f6dd41}, BsonObjectId{value=6735ff620d88451041f6dd42}]

Você também pode visualizar suas incorporações vetoriais na interface do Atlas navegando até a coleção sample_db.embeddings no seu cluster.

Observação

Este exemplo usa a coleção sample_airbnb.listingsAndReviews de nossos dados de amostra, mas você pode adaptar o código para funcionar com qualquer coleção em seu cluster.

1

Crie um arquivo denominado CreateEmbeddings.java e cole o seguinte código.

Este código utiliza o getEmbeddings método e o MongoDB Java Sync Driver para fazer o seguinte:

  1. Conecte-se ao seu cluster do Atlas.

  2. Obtenha um subconjunto de documentos da coleção sample_airbnb.listingsAndReviews que possuem um campo summary não vazio.

  3. Gere incorporações a partir do campo summary de cada documento usando o método getEmbeddings definido anteriormente.

  4. Atualize cada documento com um novo campo embeddings que contém o valor de incorporação.

CreateEmbeddings.java
import com.mongodb.MongoException;
import com.mongodb.bulk.BulkWriteResult;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoCursor;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.BulkWriteOptions;
import com.mongodb.client.model.Filters;
import com.mongodb.client.model.UpdateOneModel;
import com.mongodb.client.model.Updates;
import com.mongodb.client.model.WriteModel;
import org.bson.BsonArray;
import org.bson.Document;
import org.bson.conversions.Bson;
import java.util.ArrayList;
import java.util.List;
public class CreateEmbeddings {
public static void main(String[] args){
String uri = System.getenv("ATLAS_CONNECTION_STRING");
if (uri == null || uri.isEmpty()) {
throw new RuntimeException("ATLAS_CONNECTION_STRING env variable is not set or is empty.");
}
// establish connection and set namespace
try (MongoClient mongoClient = MongoClients.create(uri)) {
MongoDatabase database = mongoClient.getDatabase("sample_airbnb");
MongoCollection<Document> collection = database.getCollection("listingsAndReviews");
Bson filterCriteria = Filters.and(
Filters.and(Filters.exists("summary"),
Filters.ne("summary", null),
Filters.ne("summary", "")),
Filters.exists("embeddings", false));
try (MongoCursor<Document> cursor = collection.find(filterCriteria).limit(50).iterator()) {
List<String> summaries = new ArrayList<>();
List<String> documentIds = new ArrayList<>();
int i = 0;
while (cursor.hasNext()) {
Document document = cursor.next();
String summary = document.getString("summary");
String id = document.get("_id").toString();
summaries.add(summary);
documentIds.add(id);
i++;
}
System.out.println("Generating embeddings for " + summaries.size() + " documents.");
System.out.println("This operation may take up to several minutes.");
EmbeddingProvider embeddingProvider = new EmbeddingProvider();
List<BsonArray> embeddings = embeddingProvider.getEmbeddings(summaries);
List<WriteModel<Document>> updateDocuments = new ArrayList<>();
for (int j = 0; j < summaries.size(); j++) {
UpdateOneModel<Document> updateDoc = new UpdateOneModel<>(
Filters.eq("_id", documentIds.get(j)),
Updates.set("embeddings", embeddings.get(j)));
updateDocuments.add(updateDoc);
}
int updatedDocsCount = 0;
try {
BulkWriteOptions options = new BulkWriteOptions().ordered(false);
BulkWriteResult result = collection.bulkWrite(updateDocuments, options);
updatedDocsCount = result.getModifiedCount();
} catch (MongoException me) {
throw new RuntimeException("Failed to insert documents", me);
}
System.out.println("Added embeddings successfully to " + updatedDocsCount + " documents.");
}
} catch (MongoException me) {
throw new RuntimeException("Failed to connect to MongoDB", me);
} catch (Exception e) {
throw new RuntimeException("Operation failed: ", e);
}
}
}
2

Salve e execute o arquivo. A saída se assemelha a:

Generating embeddings for 50 documents.
This operation may take up to several minutes.
Added embeddings successfully to 50 documents.

Você também pode visualizar suas incorporações vetoriais na interface do Atlas navegando até a coleção sample_airbnb.listingsAndReviews no seu cluster.

1

Use o código a seguir para gerar incorporações a partir de uma coleção existente no Atlas. Este código utiliza a função getEmbedding que você definiu e o driver Node.js para gerar incorporações de um array de textos de amostra e inseri-los na coleção sample_db.embeddings no Atlas.

create-embeddings.js
1import { MongoClient } from 'mongodb';
2import { getEmbedding } from './get-embeddings.js';
3// import { convertEmbeddingsToBSON } from './convert-embeddings.js';
4
5// Data to embed
6const texts = [
7 "Titanic: The story of the 1912 sinking of the largest luxury liner ever built",
8 "The Lion King: Lion cub and future king Simba searches for his identity",
9 "Avatar: A marine is dispatched to the moon Pandora on a unique mission"
10]
11
12async function run() {
13
14 // Connect to your Atlas cluster
15 const client = new MongoClient(process.env.ATLAS_CONNECTION_STRING);
16
17 try {
18 await client.connect();
19 const db = client.db("sample_db");
20 const collection = db.collection("embeddings");
21
22 console.log("Generating embeddings and inserting documents...");
23 const insertDocuments = [];
24 await Promise.all(texts.map(async text => {
25 // Check if the document already exists
26 const existingDoc = await collection.findOne({ text: text });
27
28 // Generate an embedding using the function that you defined
29 var embedding = await getEmbedding(text);
30
31 // Uncomment the following lines to convert the generated embedding into BSON format
32 // const bsonEmbedding = await convertEmbeddingsToBSON([embedding]); // Since convertEmbeddingsToBSON is designed to handle arrays
33 // embedding = bsonEmbedding; // Use BSON embedding instead of the original float32 embedding
34
35 // Add the document with the embedding to array of documents for bulk insert
36 if (!existingDoc) {
37 insertDocuments.push({
38 text: text,
39 embedding: embedding
40 })
41 }
42 }));
43
44 // Continue processing documents if an error occurs during an operation
45 const options = { ordered: false };
46
47 // Insert documents with embeddings into Atlas
48 const result = await collection.insertMany(insertDocuments, options);
49 console.log("Count of documents inserted: " + result.insertedCount);
50
51 } catch (err) {
52 console.log(err.stack);
53 }
54 finally {
55 await client.close();
56 }
57}
58run().catch(console.dir);
2
node --env-file=.env create-embeddings.js
Generating embeddings and inserting documents...
Count of documents inserted: 3

Você pode visualizar suas incorporações vetoriais na IU do Atlas navegando até a coleção sample_db.embeddings no seu cluster.

Observação

Este exemplo usa a coleção sample_airbnb.listingsAndReviews de nossos dados de amostra, mas você pode adaptar o código para funcionar com qualquer coleção em seu cluster.

1

Use o código a seguir para gerar incorporações a partir de uma coleção existente no Atlas. Especificamente, esse código faz o seguinte:

  • Conecta-se ao seu cluster do Atlas.

  • Obtém um subconjunto de documentos da coleção sample_airbnb.listingsAndReviews que tem um campo summary não vazio.

  • Gera incorporações do campo summary de cada documento usando a função getEmbedding que você definiu.

  • Atualiza cada documento com um novo campo embedding que contém o valor de incorporação usando o Node.js Driver do MongoDB

create-embeddings.js
1import { MongoClient } from 'mongodb';
2import { getEmbedding } from './get-embeddings.js';
3// import { convertEmbeddingsToBSON } from './convert-embeddings.js';
4
5async function run() {
6
7 // Connect to your Atlas cluster
8 const client = new MongoClient(process.env.ATLAS_CONNECTION_STRING);
9
10 try {
11 await client.connect();
12 const db = client.db("sample_airbnb");
13 const collection = db.collection("listingsAndReviews");
14
15 // Filter to exclude null or empty summary fields
16 const filter = { "summary": { "$nin": [ null, "" ] } };
17
18 // Get a subset of documents from the collection
19 const documents = await collection.find(filter).limit(50).toArray();
20
21 console.log("Generating embeddings and updating documents...");
22 const updateDocuments = [];
23 await Promise.all(documents.map(async doc => {
24
25 // Generate an embedding using the function that you defined
26 var embedding = await getEmbedding(doc.summary);
27
28 // Uncomment the following lines to convert the generated embedding into BSON format
29 // const bsonEmbedding = await convertEmbeddingsToBSON([embedding]); // Since convertEmbeddingsToBSON is designed to handle arrays
30 // embedding = bsonEmbedding; // Use BSON embedding instead of the original float32 embedding
31
32 // Add the embedding to an array of update operations
33 updateDocuments.push(
34 {
35 updateOne: {
36 filter: { "_id": doc._id },
37 update: { $set: { "embedding": embedding } }
38 }
39 }
40 )
41 }));
42
43 // Continue processing documents if an error occurs during an operation
44 const options = { ordered: false };
45
46 // Update documents with the new embedding field
47 const result = await collection.bulkWrite(updateDocuments, options);
48 console.log("Count of documents updated: " + result.modifiedCount);
49
50 } catch (err) {
51 console.log(err.stack);
52 }
53 finally {
54 await client.close();
55 }
56}
57run().catch(console.dir);
2
node --env-file=.env create-embeddings.js
Generating embeddings and updating documents...
Count of documents updated: 50

Você pode visualizar suas incorporações vetoriais na interface do Atlas navegando até a coleção sample_airbnb.listingsAndReviews no seu cluster e expandindo os campos em um documento.

1

O código a seguir define uma array de textos de amostra.

# Sample data
texts = [
"Titanic: The story of the 1912 sinking of the largest luxury liner ever built",
"The Lion King: Lion cub and future king Simba searches for his identity",
"Avatar: A marine is dispatched to the moon Pandora on a unique mission"
]
2

Utilize a função get_embedding para gerar incorporações a partir dos textos de amostra. Suas incorporações podem variar dependendo do modelo que você usa.

# Generate embeddings from the sample data
embeddings = []
for text in texts:
embedding = get_embedding(text)
# Uncomment the following line to convert to BSON
# embedding = generate_bson_vector(embedding, BinaryVectorDtype.FLOAT32)
embeddings.append(embedding)
# Print the embeddings
print(f"\nText: {text}")
print(f"Embedding: {embedding[:3]}... (truncated)")
Text: Titanic: The story of the 1912 sinking of the largest luxury liner ever built
Embedding: [-0.01089042 0.05926645 -0.00291325]... (truncated)
Text: The Lion King: Lion cub and future king Simba searches for his identity
Embedding: [-0.05607051 -0.01360618 0.00523855]... (truncated)
Text: Avatar: A marine is dispatched to the moon Pandora on a unique mission
Embedding: [-0.0275258 0.01144342 -0.02360895]... (truncated)
3

Siga as etapas abaixo para criar documentos com as incorporações e inseri-los no seu cluster do Atlas:

  1. Defina uma função para criar documentos.

    def create_docs_with_embeddings(embeddings, data):
    docs = []
    for i, (embedding, text) in enumerate(zip(embeddings, data)):
    doc = {
    "_id": i,
    "text": text,
    "embedding": embedding,
    }
    docs.append(doc)
    return docs
  2. Crie os documentos com suas incorporações.

    # Create documents with embeddings and sample data
    docs = create_docs_with_embeddings(embeddings, texts)
  3. Ingerir os documentos no Atlas.

    Cole e execute o seguinte código em seu notebook, substituindo <connection-string> pela SRV string de conexão do seu cluster Atlas.

    Observação

    Sua string de conexão deve usar o seguinte formato:

    mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net

    Este código faz o seguinte:

    • Conecta-se ao seu cluster do Atlas.

    • Insere os documentos no banco de dados e na coleção especificada.

    import pymongo
    # Connect to your Atlas cluster
    mongo_client = pymongo.MongoClient("<connection-string>")
    db = mongo_client["sample_db"]
    collection = db["embeddings"]
    # Ingest data into Atlas
    collection.insert_many(docs)
    InsertManyResult([0, 1, 2], acknowledged=True)

    Você pode validar suas incorporações vetoriais visualizando-as na IU do Atlas para o namespace sample_db.embeddings no seu cluster.

Observação

Este exemplo usa a coleção sample_airbnb.listingsAndReviews de nossos dados de amostra, mas você pode adaptar o código para funcionar com qualquer coleção em seu cluster.

1

Carregar dados do seu cluster do Atlas. O código a seguir obtém um subconjunto de documentos 50 da coleção sample_airbnb.listingAndReviews.

Substitua <connection-string> pela string de conexão SRV do seu cluster do Atlas.

Observação

Sua string de conexão deve usar o seguinte formato:

mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net
import pymongo
# Connect to your Atlas cluster
mongo_client = pymongo.MongoClient("<connection-string>")
db = mongo_client["sample_airbnb"]
collection = db["listingsAndReviews"]
# Define a filter to exclude documents with null or empty 'summary' fields
filter = { 'summary': { '$exists': True, "$nin": [ None, "" ] } }
# Get a subset of documents in the collection
documents = collection.find(filter, {'_id': 1, 'summary': 1}).limit(50)
2

Gere incorporações usando os documentos que você carregou na etapa anterior. Este código faz o seguinte:

  • Gera incorporações do campo summary de cada documento usando a função get_embedding que você definiu.

  • Atualiza cada documento com um novo campo embedding que contém o valor das incorporações.

Observação

Esta operação pode levar alguns minutos para ser concluída.

from pymongo import UpdateOne
# Generate the list of bulk write operations
operations = []
for doc in documents:
summary = doc["summary"]
# Generate embeddings for this document
embedding = get_embedding(summary)
# Uncomment the following line to convert to BSON vectors
# embedding = generate_bson_vector(embedding, BinaryVectorDtype.FLOAT32)
# Add the update operation to the list
operations.append(UpdateOne(
{"_id": doc["_id"]},
{"$set": {
"embedding": embedding
}}
))
# Execute the bulk write operation
if operations:
result = collection.bulk_write(operations)
updated_doc_count = result.modified_count
print(f"Updated {updated_doc_count} documents.")
Updated 50 documents.

Nesta seção, você indexa as incorporações vetoriais na sua coleção e cria uma incorporação que é usada para executar uma query de pesquisa de vetor de amostra.

Quando você executa a query, o Atlas Vector Search retorna documentos cujas incorporações estão mais próximas da incorporação de sua query de pesquisa vetorial. Isso indica que eles são semelhantes em significado.

1

Para habilitar queries de pesquisa vetorial em seus dados, você deve criar um índice do Atlas Vector Search em sua coleção.

Conclua as etapas a seguir para criar um índice na coleção sample_db.embeddings que especifica o campo embedding como o tipo de vetor e a medida de similaridade como dotProduct.

  1. Cole o código a seguir para adicionar uma função CreateVectorIndex à sua classe DataService em DataService.cs.

    DataService.cs
    namespace MyCompany.Embeddings;
    using MongoDB.Driver;
    using MongoDB.Bson;
    public class DataService
    {
    private static readonly string? ConnectionString = Environment.GetEnvironmentVariable("ATLAS_CONNECTION_STRING");
    private static readonly MongoClient Client = new MongoClient(ConnectionString);
    private static readonly IMongoDatabase Database = Client.GetDatabase("sample_db");
    private static readonly IMongoCollection<BsonDocument> Collection = Database.GetCollection<BsonDocument>("embeddings");
    public async Task AddDocumentsAsync(Dictionary<string, float[]> embeddings)
    {
    // Method details...
    }
    public void CreateVectorIndex()
    {
    try
    {
    var searchIndexView = Collection.SearchIndexes;
    var name = "vector_index";
    var type = SearchIndexType.VectorSearch;
    var definition = new BsonDocument
    {
    { "fields", new BsonArray
    {
    new BsonDocument
    {
    { "type", "vector" },
    { "path", "embedding" },
    { "numDimensions", <dimensions> },
    { "similarity", "dotProduct" }
    }
    }
    }
    };
    var model = new CreateSearchIndexModel(name, type, definition);
    searchIndexView.CreateOne(model);
    Console.WriteLine($"New search index named {name} is building.");
    // Polling for index status
    Console.WriteLine("Polling to check if the index is ready. This may take up to a minute.");
    bool queryable = false;
    while (!queryable)
    {
    var indexes = searchIndexView.List();
    foreach (var index in indexes.ToEnumerable())
    {
    if (index["name"] == name)
    {
    queryable = index["queryable"].AsBoolean;
    }
    }
    if (!queryable)
    {
    Thread.Sleep(5000);
    }
    }
    Console.WriteLine($"{name} is ready for querying.");
    }
    catch (Exception e)
    {
    Console.WriteLine($"Exception: {e.Message}");
    }
    }
    }
  2. Substitua o valor do espaço reservado <dimensions> por 1024 se você usou a Voyage AI ou o modelo de código aberto ou por 1536 se usou o modelo da OpenAI.

  3. Atualize o código no seu Program.cs.

    Remova o código que populou os documentos iniciais e substitua-o pelo seguinte código para criar o índice:

    Program.cs
    using MyCompany.Embeddings;
    var dataService = new DataService();
    dataService.CreateVectorIndex();
  4. Salve o arquivo e, em seguida, compile e execute seu projeto para criar o índice:

    dotnet run MyCompany.Embeddings
    New search index named vector_index is building.
    Polling to check if the index is ready. This may take up to a minute.
    vector_index is ready for querying.

Observação

O índice deve levar cerca de um minuto para ser criado. Enquanto ele é compilado, o índice está em um estado de sincronização inicial. Quando a construção estiver concluída, você poderá começar a fazer query nos dados em sua coleção.

Para saber mais, consulte Criar um índice do Atlas Vector Search.

2
  1. Cole o código a seguir para adicionar uma função PerformVectorQuery à sua classe DataService em DataService.cs.

    Para executar uma query de pesquisa vetorial, gere um vetor de query para passar para seu pipeline de agregação.

    Por exemplo, este código faz o seguinte:

    • Cria uma incorporação de query usando sua função de incorporação definida.

    • Utilize esta incorporação no campo queryVector e especifique o caminho para a query.

    • Usa $vectorSearch para executar uma pesquisa ENN.

    • Retorna documentos semanticamente semelhantes classificados por relevância com as respectivas pontuações de pesquisa.

    DataService.cs
    namespace MyCompany.Embeddings;
    using MongoDB.Driver;
    using MongoDB.Bson;
    public class DataService
    {
    private static readonly string? ConnectionString = Environment.GetEnvironmentVariable("ATLAS_CONNECTION_STRING");
    private static readonly MongoClient Client = new MongoClient(ConnectionString);
    private static readonly IMongoDatabase Database = Client.GetDatabase("sample_db");
    private static readonly IMongoCollection<BsonDocument> Collection = Database.GetCollection<BsonDocument>("embeddings");
    public async Task AddDocumentsAsync(Dictionary<string, float[]> embeddings)
    {
    // Method details...
    }
    public void CreateVectorIndex()
    {
    // Method details...
    }
    public List<BsonDocument>? PerformVectorQuery(float[] vector)
    {
    var vectorSearchStage = new BsonDocument
    {
    {
    "$vectorSearch",
    new BsonDocument
    {
    { "index", "vector_index" },
    { "path", "embedding" },
    { "queryVector", new BsonArray(vector) },
    { "exact", true },
    { "limit", 5 }
    }
    }
    };
    var projectStage = new BsonDocument
    {
    {
    "$project",
    new BsonDocument
    {
    { "_id", 0 },
    { "text", 1 },
    { "score",
    new BsonDocument
    {
    { "$meta", "vectorSearchScore"}
    }
    }
    }
    }
    };
    var pipeline = new[] { vectorSearchStage, projectStage };
    return Collection.Aggregate<BsonDocument>(pipeline).ToList();
    }
    }
  2. Atualize o código no seu Program.cs.

    Remova o código que criou o índice vetorial e adicione código para executar uma consulta:

    Program.cs
    using MongoDB.Bson;
    using MyCompany.Embeddings;
    var aiService = new AIService();
    var queryString = "ocean tragedy";
    var queryEmbedding = await aiService.GetEmbeddingsAsync([queryString]);
    if (!queryEmbedding.Any())
    {
    Console.WriteLine("No embeddings found.");
    }
    else
    {
    var dataService = new DataService();
    var matchingDocuments = dataService.PerformVectorQuery(queryEmbedding[queryString]);
    if (matchingDocuments == null)
    {
    Console.WriteLine("No documents matched the query.");
    }
    else
    {
    foreach (var document in matchingDocuments)
    {
    Console.WriteLine(document.ToJson());
    }
    }
    }
  3. Salve o arquivo, e então compile e execute seu projeto para realizar a consulta:

    dotnet run MyCompany.Embeddings.csproj
    { "text" : "Titanic: The story of the 1912 sinking of the largest luxury liner ever built", "score" : 100.17414855957031 }
    { "text" : "Avatar: A marine is dispatched to the moon Pandora on a unique mission", "score" : 65.705635070800781 }
    { "text" : "The Lion King: Lion cub and future king Simba searches for his identity", "score" : 52.486415863037109 }
1

Para habilitar queries de pesquisa vetorial em seus dados, você deve criar um índice do Atlas Vector Search em sua coleção.

Conclua as etapas a seguir para criar um índice na coleção sample_airbnb.listingsAndReviews que especifica o campo embeddings como o tipo de vetor e a medida de similaridade como euclidean.

  1. Cole o código a seguir para adicionar a função CreateVectorIndex à classe DataService no seu DataService.cs.

    DataService.cs
    namespace MyCompany.Embeddings;
    using MongoDB.Driver;
    using MongoDB.Bson;
    public class DataService
    {
    private static readonly string? ConnectionString = Environment.GetEnvironmentVariable("ATLAS_CONNECTION_STRING");
    private static readonly MongoClient Client = new MongoClient(ConnectionString);
    private static readonly IMongoDatabase Database = Client.GetDatabase("sample_airbnb");
    private static readonly IMongoCollection<BsonDocument> Collection = Database.GetCollection<BsonDocument>("listingsAndReviews");
    public List<BsonDocument>? GetDocuments()
    {
    // Method details...
    }
    public async Task<long> AddEmbeddings(Dictionary<string, float[]> embeddings)
    {
    // Method details...
    }
    public void CreateVectorIndex()
    {
    try
    {
    var searchIndexView = Collection.SearchIndexes;
    var name = "vector_index";
    var type = SearchIndexType.VectorSearch;
    var definition = new BsonDocument
    {
    { "fields", new BsonArray
    {
    new BsonDocument
    {
    { "type", "vector" },
    { "path", "embeddings" },
    { "numDimensions", <dimensions> },
    { "similarity", "dotProduct" }
    }
    }
    }
    };
    var model = new CreateSearchIndexModel(name, type, definition);
    searchIndexView.CreateOne(model);
    Console.WriteLine($"New search index named {name} is building.");
    // Polling for index status
    Console.WriteLine("Polling to check if the index is ready. This may take up to a minute.");
    bool queryable = false;
    while (!queryable)
    {
    var indexes = searchIndexView.List();
    foreach (var index in indexes.ToEnumerable())
    {
    if (index["name"] == name)
    {
    queryable = index["queryable"].AsBoolean;
    }
    }
    if (!queryable)
    {
    Thread.Sleep(5000);
    }
    }
    Console.WriteLine($"{name} is ready for querying.");
    }
    catch (Exception e)
    {
    Console.WriteLine($"Exception: {e.Message}");
    }
    }
    }
  2. Substitua o valor do espaço reservado <dimensions> por 1024 se você usou a Voyage AI ou o modelo de código aberto ou por 1536 se usou o modelo da OpenAI.

  3. Atualize o código no seu Program.cs.

    Remova o código que adicionou incorporações aos documentos existentes e substitua-o pelo seguinte código para criar o índice:

    Program.cs
    using MyCompany.Embeddings;
    var dataService = new DataService();
    dataService.CreateVectorIndex();
  4. Salve o arquivo e, em seguida, compile e execute seu projeto para criar o índice:

    dotnet run MyCompany.Embeddings
    New search index named vector_index is building.
    Polling to check if the index is ready. This may take up to a minute.
    vector_index is ready for querying.

Observação

O índice deve levar cerca de um minuto para ser criado. Enquanto ele é compilado, o índice está em um estado de sincronização inicial. Quando a construção estiver concluída, você poderá começar a fazer query nos dados em sua coleção.

Para saber mais, consulte Criar um índice do Atlas Vector Search.

2
  1. Cole o código a seguir para adicionar uma função PerformVectorQuery à sua classe DataService em DataService.cs.

    Para executar uma query de pesquisa vetorial, gere um vetor de query para passar para seu pipeline de agregação.

    Por exemplo, este código faz o seguinte:

    • Cria uma incorporação de query usando sua função de incorporação definida.

    • Utilize esta incorporação no campo queryVector e especifique o caminho para a query.

    • Usa $vectorSearch para executar uma pesquisa ENN.

    • Retorna documentos semanticamente semelhantes classificados por relevância com as respectivas pontuações de pesquisa.

    DataService.cs
    namespace MyCompany.Embeddings;
    using MongoDB.Driver;
    using MongoDB.Bson;
    public class DataService
    {
    private static readonly string? ConnectionString = Environment.GetEnvironmentVariable("ATLAS_CONNECTION_STRING");
    private static readonly MongoClient Client = new MongoClient(ConnectionString);
    private static readonly IMongoDatabase Database = Client.GetDatabase("sample_airbnb");
    private static readonly IMongoCollection<BsonDocument> Collection = Database.GetCollection<BsonDocument>("listingsAndReviews");
    public List<BsonDocument>? GetDocuments()
    {
    // Method details...
    }
    public async Task<long> AddEmbeddings(Dictionary<string, float[]> embeddings)
    {
    // Method details...
    }
    public void CreateVectorIndex()
    {
    // Method details...
    }
    public List<BsonDocument>? PerformVectorQuery(float[] vector)
    {
    var vectorSearchStage = new BsonDocument
    {
    {
    "$vectorSearch",
    new BsonDocument
    {
    { "index", "vector_index" },
    { "path", "embeddings" },
    { "queryVector", new BsonArray(vector) },
    { "exact", true },
    { "limit", 5 }
    }
    }
    };
    var projectStage = new BsonDocument
    {
    {
    "$project",
    new BsonDocument
    {
    { "_id", 0 },
    { "summary", 1 },
    { "score",
    new BsonDocument
    {
    { "$meta", "vectorSearchScore"}
    }
    }
    }
    }
    };
    var pipeline = new[] { vectorSearchStage, projectStage };
    return Collection.Aggregate<BsonDocument>(pipeline).ToList();
    }
    }
  2. Atualize o código no seu Program.cs.

    Remova o código que criou o índice vetorial e adicione código para executar uma consulta:

    Program.cs
    using MongoDB.Bson;
    using MyCompany.Embeddings;
    var aiService = new AIService();
    var queryString = "beach house";
    var queryEmbedding = await aiService.GetEmbeddingsAsync([queryString]);
    if (!queryEmbedding.Any())
    {
    Console.WriteLine("No embeddings found.");
    }
    else
    {
    var dataService = new DataService();
    var matchingDocuments = dataService.PerformVectorQuery(queryEmbedding[queryString]);
    if (matchingDocuments == null)
    {
    Console.WriteLine("No documents matched the query.");
    }
    else
    {
    foreach (var document in matchingDocuments)
    {
    Console.WriteLine(document.ToJson());
    }
    }
    }
  3. Salve o arquivo, e então compile e execute seu projeto para realizar a consulta:

    dotnet run MyCompany.Embeddings.csproj
    { "summary" : "Near to underground metro station. Walking distance to seaside. 2 floors 1 entry. Husband, wife, girl and boy is living.", "score" : 88.884147644042969 }
    { "summary" : "A friendly apartment block where everyone knows each other and there is a strong communal vibe. Property has a huge backyard with vege garden and skate ramp. 7min walk to the beach and 2min to buses.", "score" : 86.136398315429688 }
    { "summary" : "Having a large airy living room. The apartment is well divided. Fully furnished and cozy. The building has a 24h doorman and camera services in the corridors. It is very well located, close to the beach, restaurants, pubs and several shops and supermarkets. And it offers a good mobility being close to the subway.", "score" : 86.087783813476562 }
    { "summary" : "Room 2 Private room in charming recently renovated federation guest house at Coogee Beach. Prices are per room for 2 People only. A queen and a single bed. Not suitable for group booking All rooms have TV, desk, wardrobe, beds, unlimited wifi 2 mins from the beach, cafes and transport. This is not a party house but a safe and clean place to stay. Share bathrooms and kitchen... All common areas are cleaned daily.", "score" : 85.689559936523438 }
    { "summary" : "Fully furnished 3+1 flat decorated with vintage style. Located at the heart of Moda/Kadıköy, close to seaside and also to the public transportation (tram, metro, ferry, bus stations) 10 minutes walk.", "score" : 85.614166259765625 }
1

Para habilitar queries de pesquisa vetorial em seus dados, você deve criar um índice do Atlas Vector Search em sua coleção.

Conclua as etapas a seguir para criar um índice na coleção sample_db.embeddings que especifica o campo embedding como o tipo de vetor e a medida de similaridade como dotProduct.

  1. Crie um arquivo chamado create-index.go e cole o código a seguir.

    create-index.go
    package main
    import (
    "context"
    "fmt"
    "log"
    "os"
    "time"
    "github.com/joho/godotenv"
    "go.mongodb.org/mongo-driver/v2/bson"
    "go.mongodb.org/mongo-driver/v2/mongo"
    "go.mongodb.org/mongo-driver/v2/mongo/options"
    )
    func main() {
    ctx := context.Background()
    if err := godotenv.Load(); err != nil {
    log.Println("no .env file found")
    }
    // Connect to your Atlas cluster
    uri := os.Getenv("ATLAS_CONNECTION_STRING")
    if uri == "" {
    log.Fatal("set your 'ATLAS_CONNECTION_STRING' environment variable.")
    }
    clientOptions := options.Client().ApplyURI(uri)
    client, err := mongo.Connect(clientOptions)
    if err != nil {
    log.Fatalf("failed to connect to the server: %v", err)
    }
    defer func() { _ = client.Disconnect(ctx) }()
    // Set the namespace
    coll := client.Database("sample_db").Collection("embeddings")
    indexName := "vector_index"
    opts := options.SearchIndexes().SetName(indexName).SetType("vectorSearch")
    type vectorDefinitionField struct {
    Type string `bson:"type"`
    Path string `bson:"path"`
    NumDimensions int `bson:"numDimensions"`
    Similarity string `bson:"similarity"`
    }
    type vectorDefinition struct {
    Fields []vectorDefinitionField `bson:"fields"`
    }
    indexModel := mongo.SearchIndexModel{
    Definition: vectorDefinition{
    Fields: []vectorDefinitionField{{
    Type: "vector",
    Path: "embedding",
    NumDimensions: <dimensions>,
    Similarity: "dotProduct"}},
    },
    Options: opts,
    }
    log.Println("Creating the index.")
    searchIndexName, err := coll.SearchIndexes().CreateOne(ctx, indexModel)
    if err != nil {
    log.Fatalf("failed to create the search index: %v", err)
    }
    // Await the creation of the index.
    log.Println("Polling to confirm successful index creation.")
    searchIndexes := coll.SearchIndexes()
    var doc bson.Raw
    for doc == nil {
    cursor, err := searchIndexes.List(ctx, options.SearchIndexes().SetName(searchIndexName))
    if err != nil {
    fmt.Errorf("failed to list search indexes: %w", err)
    }
    if !cursor.Next(ctx) {
    break
    }
    name := cursor.Current.Lookup("name").StringValue()
    queryable := cursor.Current.Lookup("queryable").Boolean()
    if name == searchIndexName && queryable {
    doc = cursor.Current
    } else {
    time.Sleep(5 * time.Second)
    }
    }
    log.Println("Name of Index Created: " + searchIndexName)
    }
  2. Substitua o valor do espaço reservado <dimensions> por 1024 se você usou a Voyage AI ou o modelo de código aberto ou por 1536 se usou o modelo da OpenAI.

  3. Salve o arquivo e execute o seguinte comando:

    go run create-index.go
    2024/10/09 17:38:51 Creating the index.
    2024/10/09 17:38:52 Polling to confirm successful index creation.
    2024/10/09 17:39:22 Name of Index Created: vector_index

Observação

O índice deve levar cerca de um minuto para ser criado. Enquanto ele é compilado, o índice está em um estado de sincronização inicial. Quando a construção estiver concluída, você poderá começar a fazer query nos dados em sua coleção.

Para saber mais, consulte Criar um índice do Atlas Vector Search.

2
  1. Crie um arquivo chamado vector-query.go e cole o código a seguir.

    Para executar uma query de pesquisa vetorial, gere um vetor de query para passar para seu pipeline de agregação.

    Por exemplo, este código faz o seguinte:

    • Cria uma incorporação de query usando sua função de incorporação definida.

    • Utilize esta incorporação no campo queryVector e especifique o caminho para a query.

    • Usa $vectorSearch para executar uma pesquisa ENN.

    • Retorna documentos semanticamente semelhantes classificados por relevância com as respectivas pontuações de pesquisa.

    vector-query.go
    package main
    import (
    "context"
    "fmt"
    "log"
    "my-embeddings-project/common"
    "os"
    "github.com/joho/godotenv"
    "go.mongodb.org/mongo-driver/v2/bson"
    "go.mongodb.org/mongo-driver/v2/mongo"
    "go.mongodb.org/mongo-driver/v2/mongo/options"
    )
    type TextAndScore struct {
    Text string `bson:"text"`
    Score float32 `bson:"score"`
    }
    func main() {
    ctx := context.Background()
    // Connect to your Atlas cluster
    if err := godotenv.Load(); err != nil {
    log.Println("no .env file found")
    }
    // Connect to your Atlas cluster
    uri := os.Getenv("ATLAS_CONNECTION_STRING")
    if uri == "" {
    log.Fatal("set your 'ATLAS_CONNECTION_STRING' environment variable.")
    }
    clientOptions := options.Client().ApplyURI(uri)
    client, err := mongo.Connect(clientOptions)
    if err != nil {
    log.Fatalf("failed to connect to the server: %v", err)
    }
    defer func() { _ = client.Disconnect(ctx) }()
    // Set the namespace
    coll := client.Database("sample_db").Collection("embeddings")
    query := "ocean tragedy"
    queryEmbedding := common.GetEmbeddings([]string{query})
    pipeline := mongo.Pipeline{
    bson.D{
    {"$vectorSearch", bson.D{
    {"queryVector", queryEmbedding[0]},
    {"index", "vector_index"},
    {"path", "embedding"},
    {"exact", true},
    {"limit", 5},
    }},
    },
    bson.D{
    {"$project", bson.D{
    {"_id", 0},
    {"text", 1},
    {"score", bson.D{
    {"$meta", "vectorSearchScore"},
    }},
    }},
    },
    }
    // Run the pipeline
    cursor, err := coll.Aggregate(ctx, pipeline)
    if err != nil {
    log.Fatalf("failed to run aggregation: %v", err)
    }
    defer func() { _ = cursor.Close(ctx) }()
    var matchingDocs []TextAndScore
    if err = cursor.All(ctx, &matchingDocs); err != nil {
    log.Fatalf("failed to unmarshal results to TextAndScore objects: %v", err)
    }
    for _, doc := range matchingDocs {
    fmt.Printf("Text: %v\nScore: %v\n", doc.Text, doc.Score)
    }
    }
    vector-query.go
    package main
    import (
    "context"
    "fmt"
    "log"
    "my-embeddings-project/common"
    "os"
    "github.com/joho/godotenv"
    "go.mongodb.org/mongo-driver/v2/bson"
    "go.mongodb.org/mongo-driver/v2/mongo"
    "go.mongodb.org/mongo-driver/v2/mongo/options"
    )
    type TextAndScore struct {
    Text string `bson:"text"`
    Score float64 `bson:"score"`
    }
    func main() {
    ctx := context.Background()
    // Connect to your Atlas cluster
    if err := godotenv.Load(); err != nil {
    log.Println("no .env file found")
    }
    // Connect to your Atlas cluster
    uri := os.Getenv("ATLAS_CONNECTION_STRING")
    if uri == "" {
    log.Fatal("set your 'ATLAS_CONNECTION_STRING' environment variable.")
    }
    clientOptions := options.Client().ApplyURI(uri)
    client, err := mongo.Connect(clientOptions)
    if err != nil {
    log.Fatalf("failed to connect to the server: %v", err)
    }
    defer func() { _ = client.Disconnect(ctx) }()
    // Set the namespace
    coll := client.Database("sample_db").Collection("embeddings")
    query := "ocean tragedy"
    queryEmbedding := common.GetEmbeddings([]string{query})
    pipeline := mongo.Pipeline{
    bson.D{
    {"$vectorSearch", bson.D{
    {"queryVector", queryEmbedding[0]},
    {"index", "vector_index"},
    {"path", "embedding"},
    {"exact", true},
    {"limit", 5},
    }},
    },
    bson.D{
    {"$project", bson.D{
    {"_id", 0},
    {"text", 1},
    {"score", bson.D{
    {"$meta", "vectorSearchScore"},
    }},
    }},
    },
    }
    // Run the pipeline
    cursor, err := coll.Aggregate(ctx, pipeline)
    if err != nil {
    log.Fatalf("failed to run aggregation: %v", err)
    }
    defer func() { _ = cursor.Close(ctx) }()
    var matchingDocs []TextAndScore
    if err = cursor.All(ctx, &matchingDocs); err != nil {
    log.Fatalf("failed to unmarshal results to TextAndScore objects: %v", err)
    }
    for _, doc := range matchingDocs {
    fmt.Printf("Text: %v\nScore: %v\n", doc.Text, doc.Score)
    }
    }
  2. Salve o arquivo e execute o seguinte comando:

    go run vector-query.go
    Text: Titanic: The story of the 1912 sinking of the largest luxury liner ever built
    Score: 0.0042472864
    Text: Avatar: A marine is dispatched to the moon Pandora on a unique mission
    Score: 0.0031167597
    Text: The Lion King: Lion cub and future king Simba searches for his identity
    Score: 0.0024476869
    go run vector-query.go
    Text: Titanic: The story of the 1912 sinking of the largest luxury liner ever built
    Score: 0.4552372694015503
    Text: Avatar: A marine is dispatched to the moon Pandora on a unique mission
    Score: 0.4050072133541107
    Text: The Lion King: Lion cub and future king Simba searches for his identity
    Score: 0.35942140221595764
1

Para habilitar queries de pesquisa vetorial em seus dados, você deve criar um índice do Atlas Vector Search em sua coleção.

Conclua as etapas a seguir para criar um índice na coleção sample_airbnb.listingsAndReviews que especifica o campo embeddings como o tipo de vetor e a medida de similaridade como euclidean.

  1. Crie um arquivo chamado create-index.go e cole o código a seguir.

    create-index.go
    package main
    import (
    "context"
    "fmt"
    "log"
    "os"
    "time"
    "github.com/joho/godotenv"
    "go.mongodb.org/mongo-driver/bson"
    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/options"
    )
    func main() {
    ctx := context.Background()
    if err := godotenv.Load(); err != nil {
    log.Println("no .env file found")
    }
    // Connect to your Atlas cluster
    uri := os.Getenv("ATLAS_CONNECTION_STRING")
    if uri == "" {
    log.Fatal("set your 'ATLAS_CONNECTION_STRING' environment variable.")
    }
    clientOptions := options.Client().ApplyURI(uri)
    client, err := mongo.Connect(ctx, clientOptions)
    if err != nil {
    log.Fatalf("failed to connect to the server: %v", err)
    }
    defer func() { _ = client.Disconnect(ctx) }()
    // Set the namespace
    coll := client.Database("sample_airbnb").Collection("listingsAndReviews")
    indexName := "vector_index"
    opts := options.SearchIndexes().SetName(indexName).SetType("vectorSearch")
    type vectorDefinitionField struct {
    Type string `bson:"type"`
    Path string `bson:"path"`
    NumDimensions int `bson:"numDimensions"`
    Similarity string `bson:"similarity"`
    }
    type vectorDefinition struct {
    Fields []vectorDefinitionField `bson:"fields"`
    }
    indexModel := mongo.SearchIndexModel{
    Definition: vectorDefinition{
    Fields: []vectorDefinitionField{{
    Type: "vector",
    Path: "embeddings",
    NumDimensions: <dimensions>,
    Similarity: "dotProduct"}},
    },
    Options: opts,
    }
    log.Println("Creating the index.")
    searchIndexName, err := coll.SearchIndexes().CreateOne(ctx, indexModel)
    if err != nil {
    log.Fatalf("failed to create the search index: %v", err)
    }
    // Await the creation of the index.
    log.Println("Polling to confirm successful index creation.")
    searchIndexes := coll.SearchIndexes()
    var doc bson.Raw
    for doc == nil {
    cursor, err := searchIndexes.List(ctx, options.SearchIndexes().SetName(searchIndexName))
    if err != nil {
    fmt.Errorf("failed to list search indexes: %w", err)
    }
    if !cursor.Next(ctx) {
    break
    }
    name := cursor.Current.Lookup("name").StringValue()
    queryable := cursor.Current.Lookup("queryable").Boolean()
    if name == searchIndexName && queryable {
    doc = cursor.Current
    } else {
    time.Sleep(5 * time.Second)
    }
    }
    log.Println("Name of Index Created: " + searchIndexName)
    }
  2. Substitua o valor do espaço reservado <dimensions> por 1024 se você usou a Voyage AI ou o modelo de código aberto ou por 1536 se usou o modelo da OpenAI.

  3. Salve o arquivo e execute o seguinte comando:

    go run create-index.go
    2024/10/10 10:03:12 Creating the index.
    2024/10/10 10:03:13 Polling to confirm successful index creation.
    2024/10/10 10:03:44 Name of Index Created: vector_index

Observação

O índice deve levar cerca de um minuto para ser criado. Enquanto ele é compilado, o índice está em um estado de sincronização inicial. Quando a construção estiver concluída, você poderá começar a fazer query nos dados em sua coleção.

Para saber mais, consulte Criar um índice do Atlas Vector Search.

2
  1. Crie um arquivo chamado vector-query.go e cole o código a seguir.

    Para executar uma query de pesquisa vetorial, gere um vetor de query para passar para seu pipeline de agregação.

    Por exemplo, este código faz o seguinte:

    • Cria uma incorporação de query usando sua função de incorporação definida.

    • Utilize esta incorporação no campo queryVector e especifique o caminho para a query.

    • Usa $vectorSearch para executar uma pesquisa ENN.

    • Retorna documentos semanticamente semelhantes classificados por relevância com as respectivas pontuações de pesquisa.

    vector-query.go
    package main
    import (
    "context"
    "fmt"
    "log"
    "my-embeddings-project/common"
    "os"
    "github.com/joho/godotenv"
    "go.mongodb.org/mongo-driver/bson"
    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/options"
    )
    type SummaryAndScore struct {
    Summary string `bson:"summary"`
    Score float32 `bson:"score"`
    }
    func main() {
    ctx := context.Background()
    // Connect to your Atlas cluster
    if err := godotenv.Load(); err != nil {
    log.Println("no .env file found")
    }
    // Connect to your Atlas cluster
    uri := os.Getenv("ATLAS_CONNECTION_STRING")
    if uri == "" {
    log.Fatal("set your 'ATLAS_CONNECTION_STRING' environment variable.")
    }
    clientOptions := options.Client().ApplyURI(uri)
    client, err := mongo.Connect(ctx, clientOptions)
    if err != nil {
    log.Fatalf("failed to connect to the server: %v", err)
    }
    defer func() { _ = client.Disconnect(ctx) }()
    // Set the namespace
    coll := client.Database("sample_airbnb").Collection("listingsAndReviews")
    query := "beach house"
    queryEmbedding := common.GetEmbeddings([]string{query})
    pipeline := mongo.Pipeline{
    bson.D{
    {"$vectorSearch", bson.D{
    {"queryVector", queryEmbedding[0]},
    {"index", "vector_index"},
    {"path", "embeddings"},
    {"exact", true},
    {"limit", 5},
    }},
    },
    bson.D{
    {"$project", bson.D{
    {"_id", 0},
    {"summary", 1},
    {"score", bson.D{
    {"$meta", "vectorSearchScore"},
    }},
    }},
    },
    }
    // Run the pipeline
    cursor, err := coll.Aggregate(ctx, pipeline)
    if err != nil {
    log.Fatalf("failed to run aggregation: %v", err)
    }
    defer func() { _ = cursor.Close(ctx) }()
    var matchingDocs []SummaryAndScore
    if err = cursor.All(ctx, &matchingDocs); err != nil {
    log.Fatalf("failed to unmarshal results to SummaryAndScore objects: %v", err)
    }
    for _, doc := range matchingDocs {
    fmt.Printf("Summary: %v\nScore: %v\n", doc.Summary, doc.Score)
    }
    }
    vector-query.go
    package main
    import (
    "context"
    "fmt"
    "log"
    "my-embeddings-project/common"
    "os"
    "github.com/joho/godotenv"
    "go.mongodb.org/mongo-driver/bson"
    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/options"
    )
    type SummaryAndScore struct {
    Summary string `bson:"summary"`
    Score float64 `bson:"score"`
    }
    func main() {
    ctx := context.Background()
    // Connect to your Atlas cluster
    if err := godotenv.Load(); err != nil {
    log.Println("no .env file found")
    }
    // Connect to your Atlas cluster
    uri := os.Getenv("ATLAS_CONNECTION_STRING")
    if uri == "" {
    log.Fatal("set your 'ATLAS_CONNECTION_STRING' environment variable.")
    }
    clientOptions := options.Client().ApplyURI(uri)
    client, err := mongo.Connect(ctx, clientOptions)
    if err != nil {
    log.Fatalf("failed to connect to the server: %v", err)
    }
    defer func() { _ = client.Disconnect(ctx) }()
    // Set the namespace
    coll := client.Database("sample_airbnb").Collection("listingsAndReviews")
    query := "beach house"
    queryEmbedding := common.GetEmbeddings([]string{query})
    pipeline := mongo.Pipeline{
    bson.D{
    {"$vectorSearch", bson.D{
    {"queryVector", queryEmbedding[0]},
    {"index", "vector_index"},
    {"path", "embeddings"},
    {"exact", true},
    {"limit", 5},
    }},
    },
    bson.D{
    {"$project", bson.D{
    {"_id", 0},
    {"summary", 1},
    {"score", bson.D{
    {"$meta", "vectorSearchScore"},
    }},
    }},
    },
    }
    // Run the pipeline
    cursor, err := coll.Aggregate(ctx, pipeline)
    if err != nil {
    log.Fatalf("failed to run aggregation: %v", err)
    }
    defer func() { _ = cursor.Close(ctx) }()
    var matchingDocs []SummaryAndScore
    if err = cursor.All(ctx, &matchingDocs); err != nil {
    log.Fatalf("failed to unmarshal results to SummaryAndScore objects: %v", err)
    }
    for _, doc := range matchingDocs {
    fmt.Printf("Summary: %v\nScore: %v\n", doc.Summary, doc.Score)
    }
    }
  2. Salve o arquivo e execute o seguinte comando:

    go run vector-query.go
    Summary: Near to underground metro station. Walking distance to seaside. 2 floors 1 entry. Husband, wife, girl and boy is living.
    Score: 0.0045180833
    Summary: A beautiful and comfortable 1 Bedroom Air Conditioned Condo in Makaha Valley - stunning Ocean & Mountain views All the amenities of home, suited for longer stays. Full kitchen & large bathroom. Several gas BBQ's for all guests to use & a large heated pool surrounded by reclining chairs to sunbathe. The Ocean you see in the pictures is not even a mile away, known as the famous Makaha Surfing Beach. Golfing, hiking,snorkeling paddle boarding, surfing are all just minutes from the front door.
    Score: 0.004480799
    Summary: Having a large airy living room. The apartment is well divided. Fully furnished and cozy. The building has a 24h doorman and camera services in the corridors. It is very well located, close to the beach, restaurants, pubs and several shops and supermarkets. And it offers a good mobility being close to the subway.
    Score: 0.0042421296
    Summary: Room 2 Private room in charming recently renovated federation guest house at Coogee Beach. Prices are per room for 2 People only. A queen and a single bed. Not suitable for group booking All rooms have TV, desk, wardrobe, beds, unlimited wifi 2 mins from the beach, cafes and transport. This is not a party house but a safe and clean place to stay. Share bathrooms and kitchen... All common areas are cleaned daily.
    Score: 0.004227752
    Summary: A friendly apartment block where everyone knows each other and there is a strong communal vibe. Property has a huge backyard with vege garden and skate ramp. 7min walk to the beach and 2min to buses.
    Score: 0.0042201905
    go run vector-query.go
    Summary: A friendly apartment block where everyone knows each other and there is a strong communal vibe. Property has a huge backyard with vege garden and skate ramp. 7min walk to the beach and 2min to buses.
    Score: 0.4832950830459595
    Summary: Room 2 Private room in charming recently renovated federation guest house at Coogee Beach. Prices are per room for 2 People only. A queen and a single bed. Not suitable for group booking All rooms have TV, desk, wardrobe, beds, unlimited wifi 2 mins from the beach, cafes and transport. This is not a party house but a safe and clean place to stay. Share bathrooms and kitchen... All common areas are cleaned daily.
    Score: 0.48093676567077637
    Summary: THIS IS A VERY SPACIOUS 1 BEDROOM FULL CONDO (SLEEPS 4) AT THE BEAUTIFUL VALLEY ISLE RESORT ON THE BEACH IN LAHAINA, MAUI!! YOU WILL LOVE THE PERFECT LOCATION OF THIS VERY NICE HIGH RISE! ALSO THIS SPACIOUS FULL CONDO, FULL KITCHEN, BIG BALCONY!!
    Score: 0.4629695415496826
    Summary: A beautiful and comfortable 1 Bedroom Air Conditioned Condo in Makaha Valley - stunning Ocean & Mountain views All the amenities of home, suited for longer stays. Full kitchen & large bathroom. Several gas BBQ's for all guests to use & a large heated pool surrounded by reclining chairs to sunbathe. The Ocean you see in the pictures is not even a mile away, known as the famous Makaha Surfing Beach. Golfing, hiking,snorkeling paddle boarding, surfing are all just minutes from the front door.
    Score: 0.45800843834877014
    Summary: The Apartment has a living room, toilet, bedroom (suite) and American kitchen. Well located, on the Copacabana beach block a 05 Min. walk from Ipanema beach (Arpoador). Internet wifi, cable tv, air conditioning in the bedroom, ceiling fans in the bedroom and living room, kitchen with microwave, cooker, Blender, dishes, cutlery and service area with fridge, washing machine, clothesline for drying clothes and closet with several utensils for use. The property boasts 45 m2.
    Score: 0.45398443937301636
1

Para habilitar queries de pesquisa vetorial em seus dados, você deve criar um índice do Atlas Vector Search em sua coleção.

Conclua as etapas a seguir para criar um índice na coleção sample_db.embeddings que especifica o campo embedding como o tipo de vetor e a medida de similaridade como dotProduct.

  1. Crie um arquivo chamado CreateIndex.java e cole o seguinte código:

    CreateIndex.java
    import com.mongodb.MongoException;
    import com.mongodb.client.ListSearchIndexesIterable;
    import com.mongodb.client.MongoClient;
    import com.mongodb.client.MongoClients;
    import com.mongodb.client.MongoCollection;
    import com.mongodb.client.MongoCursor;
    import com.mongodb.client.MongoDatabase;
    import com.mongodb.client.model.SearchIndexModel;
    import com.mongodb.client.model.SearchIndexType;
    import org.bson.Document;
    import org.bson.conversions.Bson;
    import java.util.Collections;
    import java.util.List;
    public class CreateIndex {
    public static void main(String[] args) {
    String uri = System.getenv("ATLAS_CONNECTION_STRING");
    if (uri == null || uri.isEmpty()) {
    throw new IllegalStateException("ATLAS_CONNECTION_STRING env variable is not set or is empty.");
    }
    // establish connection and set namespace
    try (MongoClient mongoClient = MongoClients.create(uri)) {
    MongoDatabase database = mongoClient.getDatabase("sample_db");
    MongoCollection<Document> collection = database.getCollection("embeddings");
    // define the index details
    String indexName = "vector_index";
    int dimensionsHuggingFaceModel = 1024;
    int dimensionsOpenAiModel = 1536;
    Bson definition = new Document(
    "fields",
    Collections.singletonList(
    new Document("type", "vector")
    .append("path", "embedding")
    .append("numDimensions", <dimensions>) // replace with var for the model used
    .append("similarity", "dotProduct")));
    // define the index model using the specified details
    SearchIndexModel indexModel = new SearchIndexModel(
    indexName,
    definition,
    SearchIndexType.vectorSearch());
    // Create the index using the model
    try {
    List<String> result = collection.createSearchIndexes(Collections.singletonList(indexModel));
    System.out.println("Successfully created a vector index named: " + result);
    } catch (Exception e) {
    throw new RuntimeException(e);
    }
    // Wait for Atlas to build the index and make it queryable
    System.out.println("Polling to confirm the index has completed building.");
    System.out.println("It may take up to a minute for the index to build before you can query using it.");
    ListSearchIndexesIterable<Document> searchIndexes = collection.listSearchIndexes();
    Document doc = null;
    while (doc == null) {
    try (MongoCursor<Document> cursor = searchIndexes.iterator()) {
    if (!cursor.hasNext()) {
    break;
    }
    Document current = cursor.next();
    String name = current.getString("name");
    boolean queryable = current.getBoolean("queryable");
    if (name.equals(indexName) && queryable) {
    doc = current;
    } else {
    Thread.sleep(500);
    }
    } catch (Exception e) {
    throw new RuntimeException(e);
    }
    }
    System.out.println(indexName + " index is ready to query");
    } catch (MongoException me) {
    throw new RuntimeException("Failed to connect to MongoDB ", me);
    } catch (Exception e) {
    throw new RuntimeException("Operation failed: ", e);
    }
    }
    }
  2. Substitua o valor do espaço reservado <dimensions> pela variável apropriada para o modelo que você usou:

    • dimensionsHuggingFaceModel: 1024 dimensões (modelo "mixedbread-ai/mxbai-embed-large-v1")

    • dimensionsVoyageAiModel: 1024 dimensões (modelo "voyage-3-large")

    • dimensionsOpenAiModel: 1536 dimensões (modelo "text-embedding-3-small")

    Observação

    O número de dimensões é determinado pelo modelo utilizado para gerar as incorporações. Se você adaptar este código para usar um modelo diferente, certifique-se de passar o valor correto para numDimensions. Consulte também a seção Escolhendo um modelo de incorporação.

  3. Salve e execute o arquivo. A saída se assemelha a:

    Successfully created a vector index named: [vector_index]
    Polling to confirm the index has completed building.
    It may take up to a minute for the index to build before you can query using it.
    vector_index index is ready to query

Observação

O índice deve levar cerca de um minuto para ser criado. Enquanto ele é compilado, o índice está em um estado de sincronização inicial. Quando a construção estiver concluída, você poderá começar a fazer query nos dados em sua coleção.

Para saber mais, consulte Criar um índice do Atlas Vector Search.

2
  1. Crie um arquivo chamado VectorQuery.java e cole o código a seguir.

    Para executar uma query de pesquisa vetorial, gere um vetor de query para passar para seu pipeline de agregação.

    Por exemplo, este código faz o seguinte:

    • Cria uma incorporação de query usando sua função de incorporação definida.

    • Utilize esta incorporação no campo queryVector e especifique o caminho para a query.

    • Usa $vectorSearch para executar uma pesquisa ENN.

    • Retorna documentos semanticamente semelhantes classificados por relevância com as respectivas pontuações de pesquisa.

    VectorQuery.java
    import com.mongodb.MongoException;
    import com.mongodb.client.MongoClient;
    import com.mongodb.client.MongoClients;
    import com.mongodb.client.MongoCollection;
    import com.mongodb.client.MongoDatabase;
    import com.mongodb.client.model.search.FieldSearchPath;
    import org.bson.BsonArray;
    import org.bson.BsonValue;
    import org.bson.Document;
    import org.bson.conversions.Bson;
    import java.util.ArrayList;
    import java.util.List;
    import static com.mongodb.client.model.Aggregates.project;
    import static com.mongodb.client.model.Aggregates.vectorSearch;
    import static com.mongodb.client.model.Projections.exclude;
    import static com.mongodb.client.model.Projections.fields;
    import static com.mongodb.client.model.Projections.include;
    import static com.mongodb.client.model.Projections.metaVectorSearchScore;
    import static com.mongodb.client.model.search.SearchPath.fieldPath;
    import static com.mongodb.client.model.search.VectorSearchOptions.exactVectorSearchOptions;
    import static java.util.Arrays.asList;
    public class VectorQuery {
    public static void main(String[] args) {
    String uri = System.getenv("ATLAS_CONNECTION_STRING");
    if (uri == null || uri.isEmpty()) {
    throw new IllegalStateException("ATLAS_CONNECTION_STRING env variable is not set or is empty.");
    }
    // establish connection and set namespace
    try (MongoClient mongoClient = MongoClients.create(uri)) {
    MongoDatabase database = mongoClient.getDatabase("sample_db");
    MongoCollection<Document> collection = database.getCollection("embeddings");
    // define $vectorSearch query options
    String query = "ocean tragedy";
    EmbeddingProvider embeddingProvider = new EmbeddingProvider();
    BsonArray embeddingBsonArray = embeddingProvider.getEmbedding(query);
    List<Double> embedding = new ArrayList<>();
    for (BsonValue value : embeddingBsonArray.stream().toList()) {
    embedding.add(value.asDouble().getValue());
    }
    // define $vectorSearch pipeline
    String indexName = "vector_index";
    FieldSearchPath fieldSearchPath = fieldPath("embedding");
    int limit = 5;
    List<Bson> pipeline = asList(
    vectorSearch(
    fieldSearchPath,
    embedding,
    indexName,
    limit,
    exactVectorSearchOptions()
    ),
    project(
    fields(exclude("_id"), include("text"),
    metaVectorSearchScore("score"))));
    // run query and print results
    List<Document> results = collection.aggregate(pipeline).into(new ArrayList<>());
    if (results.isEmpty()) {
    System.out.println("No results found.");
    } else {
    results.forEach(doc -> {
    System.out.println("Text: " + doc.getString("text"));
    System.out.println("Score: " + doc.getDouble("score"));
    });
    }
    } catch (MongoException me) {
    throw new RuntimeException("Failed to connect to MongoDB ", me);
    } catch (Exception e) {
    throw new RuntimeException("Operation failed: ", e);
    }
    }
    }
  2. Salve e execute o arquivo. O resultado se assemelha a um dos seguintes, dependendo do modelo usado:

    Text: Titanic: The story of the 1912 sinking of the largest luxury liner ever built
    Score: 0.004247286356985569
    Text: Avatar: A marine is dispatched to the moon Pandora on a unique mission
    Score: 0.003116759704425931
    Text: The Lion King: Lion cub and future king Simba searches for his identity
    Score: 0.002447686856612563
    Text: Titanic: The story of the 1912 sinking of the largest luxury liner ever built
    Score: 0.45522359013557434
    Text: Avatar: A marine is dispatched to the moon Pandora on a unique mission
    Score: 0.4049977660179138
    Text: The Lion King: Lion cub and future king Simba searches for his identity
    Score: 0.35942474007606506
1

Para habilitar queries de pesquisa vetorial em seus dados, você deve criar um índice do Atlas Vector Search em sua coleção.

Conclua as etapas a seguir para criar um índice na coleção sample_airbnb.listingsAndReviews que especifica o campo embeddings como o tipo de vetor e a medida de similaridade como euclidean.

  1. Crie um arquivo chamado CreateIndex.java e cole o seguinte código:

    CreateIndex.java
    import com.mongodb.MongoException;
    import com.mongodb.client.MongoClient;
    import com.mongodb.client.MongoClients;
    import com.mongodb.client.MongoCollection;
    import com.mongodb.client.MongoDatabase;
    import com.mongodb.client.ListSearchIndexesIterable;
    import com.mongodb.client.MongoCursor;
    import com.mongodb.client.model.SearchIndexModel;
    import com.mongodb.client.model.SearchIndexType;
    import org.bson.Document;
    import org.bson.conversions.Bson;
    import java.util.Collections;
    import java.util.List;
    public class CreateIndex {
    public static void main(String[] args) {
    String uri = System.getenv("ATLAS_CONNECTION_STRING");
    if (uri == null || uri.isEmpty()) {
    throw new IllegalStateException("ATLAS_CONNECTION_STRING env variable is not set or is empty.");
    }
    // establish connection and set namespace
    try (MongoClient mongoClient = MongoClients.create(uri)) {
    MongoDatabase database = mongoClient.getDatabase("sample_airbnb");
    MongoCollection<Document> collection = database.getCollection("listingsAndReviews");
    // define the index details
    String indexName = "vector_index";
    int dimensionsHuggingFaceModel = 1024;
    int dimensionsOpenAiModel = 1536;
    Bson definition = new Document(
    "fields",
    Collections.singletonList(
    new Document("type", "vector")
    .append("path", "embeddings")
    .append("numDimensions", <dimensions>) // replace with var for the model used
    .append("similarity", "dotProduct")));
    // define the index model using the specified details
    SearchIndexModel indexModel = new SearchIndexModel(
    indexName,
    definition,
    SearchIndexType.vectorSearch());
    // create the index using the model
    try {
    List<String> result = collection.createSearchIndexes(Collections.singletonList(indexModel));
    System.out.println("Successfully created a vector index named: " + result);
    System.out.println("It may take up to a minute for the index to build before you can query using it.");
    } catch (Exception e) {
    throw new RuntimeException(e);
    }
    // wait for Atlas to build the index and make it queryable
    System.out.println("Polling to confirm the index has completed building.");
    ListSearchIndexesIterable<Document> searchIndexes = collection.listSearchIndexes();
    Document doc = null;
    while (doc == null) {
    try (MongoCursor<Document> cursor = searchIndexes.iterator()) {
    if (!cursor.hasNext()) {
    break;
    }
    Document current = cursor.next();
    String name = current.getString("name");
    boolean queryable = current.getBoolean("queryable");
    if (name.equals(indexName) && queryable) {
    doc = current;
    } else {
    Thread.sleep(500);
    }
    } catch (Exception e) {
    throw new RuntimeException(e);
    }
    }
    System.out.println(indexName + " index is ready to query");
    } catch (MongoException me) {
    throw new RuntimeException("Failed to connect to MongoDB ", me);
    } catch (Exception e) {
    throw new RuntimeException("Operation failed: ", e);
    }
    }
    }
  2. Substitua o valor do espaço reservado <dimensions> pela variável apropriada para o modelo que você usou:

    • dimensionsHuggingFaceModel: 1024 dimensões (código aberto)

    • dimensionsVoyageAiModel: 1024 dimensões (Voyage AI)

    • dimensionsOpenAiModel: 1536 dimensões

    Observação

    O número de dimensões é determinado pelo modelo utilizado para gerar as incorporações. Se você estiver usando um modelo diferente, certifique-se de passar o valor correto para numDimensions. Consulte também a seção Escolhendo um modelo de incorporação.

  3. Salve e execute o arquivo. A saída se assemelha a:

    Successfully created a vector index named: [vector_index]
    Polling to confirm the index has completed building.
    It may take up to a minute for the index to build before you can query using it.
    vector_index index is ready to query

Observação

O índice deve levar cerca de um minuto para ser criado. Enquanto ele é compilado, o índice está em um estado de sincronização inicial. Quando a construção estiver concluída, você poderá começar a fazer query nos dados em sua coleção.

Para saber mais, consulte Criar um índice do Atlas Vector Search.

2
  1. Crie um arquivo chamado VectorQuery.java e cole o código a seguir.

    Para executar uma query de pesquisa vetorial, gere um vetor de query para passar para seu pipeline de agregação.

    Por exemplo, este código faz o seguinte:

    • Cria uma incorporação de query usando sua função de incorporação definida.

    • Utilize esta incorporação no campo queryVector e especifique o caminho para a query.

    • Usa $vectorSearch para executar uma pesquisa ENN.

    • Retorna documentos semanticamente semelhantes classificados por relevância com as respectivas pontuações de pesquisa.

    VectorQuery.java
    import com.mongodb.MongoException;
    import com.mongodb.client.MongoClient;
    import com.mongodb.client.MongoClients;
    import com.mongodb.client.MongoCollection;
    import com.mongodb.client.MongoDatabase;
    import com.mongodb.client.model.search.FieldSearchPath;
    import org.bson.BsonArray;
    import org.bson.BsonValue;
    import org.bson.Document;
    import org.bson.conversions.Bson;
    import java.util.ArrayList;
    import java.util.List;
    import static com.mongodb.client.model.Aggregates.project;
    import static com.mongodb.client.model.Aggregates.vectorSearch;
    import static com.mongodb.client.model.Projections.exclude;
    import static com.mongodb.client.model.Projections.fields;
    import static com.mongodb.client.model.Projections.include;
    import static com.mongodb.client.model.Projections.metaVectorSearchScore;
    import static com.mongodb.client.model.search.SearchPath.fieldPath;
    import static com.mongodb.client.model.search.VectorSearchOptions.exactVectorSearchOptions;
    import static java.util.Arrays.asList;
    public class VectorQuery {
    public static void main(String[] args) {
    String uri = System.getenv("ATLAS_CONNECTION_STRING");
    if (uri == null || uri.isEmpty()) {
    throw new IllegalStateException("ATLAS_CONNECTION_STRING env variable is not set or is empty.");
    }
    // establish connection and set namespace
    try (MongoClient mongoClient = MongoClients.create(uri)) {
    MongoDatabase database = mongoClient.getDatabase("sample_airbnb");
    MongoCollection<Document> collection = database.getCollection("listingsAndReviews");
    // define the query and get the embedding
    String query = "beach house";
    EmbeddingProvider embeddingProvider = new EmbeddingProvider();
    BsonArray embeddingBsonArray = embeddingProvider.getEmbedding(query);
    List<Double> embedding = new ArrayList<>();
    for (BsonValue value : embeddingBsonArray.stream().toList()) {
    embedding.add(value.asDouble().getValue());
    }
    // define $vectorSearch pipeline
    String indexName = "vector_index";
    FieldSearchPath fieldSearchPath = fieldPath("embeddings");
    int limit = 5;
    List<Bson> pipeline = asList(
    vectorSearch(
    fieldSearchPath,
    embedding,
    indexName,
    limit,
    exactVectorSearchOptions()),
    project(
    fields(exclude("_id"), include("summary"),
    metaVectorSearchScore("score"))));
    // run query and print results
    List<Document> results = collection.aggregate(pipeline).into(new ArrayList<>());
    if (results.isEmpty()) {
    System.out.println("No results found.");
    } else {
    results.forEach(doc -> {
    System.out.println("Summary: " + doc.getString("summary"));
    System.out.println("Score: " + doc.getDouble("score"));
    });
    }
    } catch (MongoException me) {
    throw new RuntimeException("Failed to connect to MongoDB ", me);
    } catch (Exception e) {
    throw new RuntimeException("Operation failed: ", e);
    }
    }
    }
  2. Salve e execute o arquivo. O resultado se assemelha a um dos seguintes, dependendo do modelo usado:

    Summary: Near to underground metro station. Walking distance to seaside. 2 floors 1 entry. Husband, wife, girl and boy is living.
    Score: 0.004518083296716213
    Summary: A beautiful and comfortable 1 Bedroom Air Conditioned Condo in Makaha Valley - stunning Ocean & Mountain views All the amenities of home, suited for longer stays. Full kitchen & large bathroom. Several gas BBQ's for all guests to use & a large heated pool surrounded by reclining chairs to sunbathe. The Ocean you see in the pictures is not even a mile away, known as the famous Makaha Surfing Beach. Golfing, hiking,snorkeling paddle boarding, surfing are all just minutes from the front door.
    Score: 0.0044807991944253445
    Summary: Having a large airy living room. The apartment is well divided. Fully furnished and cozy. The building has a 24h doorman and camera services in the corridors. It is very well located, close to the beach, restaurants, pubs and several shops and supermarkets. And it offers a good mobility being close to the subway.
    Score: 0.004242129623889923
    Summary: Room 2 Private room in charming recently renovated federation guest house at Coogee Beach. Prices are per room for 2 People only. A queen and a single bed. Not suitable for group booking All rooms have TV, desk, wardrobe, beds, unlimited wifi 2 mins from the beach, cafes and transport. This is not a party house but a safe and clean place to stay. Share bathrooms and kitchen... All common areas are cleaned daily.
    Score: 0.004227751865983009
    Summary: A friendly apartment block where everyone knows each other and there is a strong communal vibe. Property has a huge backyard with vege garden and skate ramp. 7min walk to the beach and 2min to buses.
    Score: 0.004220190457999706
    Summary: A friendly apartment block where everyone knows each other and there is a strong communal vibe. Property has a huge backyard with vege garden and skate ramp. 7min walk to the beach and 2min to buses.
    Score: 0.4832950830459595
    Summary: Room 2 Private room in charming recently renovated federation guest house at Coogee Beach. Prices are per room for 2 People only. A queen and a single bed. Not suitable for group booking All rooms have TV, desk, wardrobe, beds, unlimited wifi 2 mins from the beach, cafes and transport. This is not a party house but a safe and clean place to stay. Share bathrooms and kitchen... All common areas are cleaned daily.
    Score: 0.48092085123062134
    Summary: THIS IS A VERY SPACIOUS 1 BEDROOM FULL CONDO (SLEEPS 4) AT THE BEAUTIFUL VALLEY ISLE RESORT ON THE BEACH IN LAHAINA, MAUI!! YOU WILL LOVE THE PERFECT LOCATION OF THIS VERY NICE HIGH RISE! ALSO THIS SPACIOUS FULL CONDO, FULL KITCHEN, BIG BALCONY!!
    Score: 0.4629460275173187
    Summary: A beautiful and comfortable 1 Bedroom Air Conditioned Condo in Makaha Valley - stunning Ocean & Mountain views All the amenities of home, suited for longer stays. Full kitchen & large bathroom. Several gas BBQ's for all guests to use & a large heated pool surrounded by reclining chairs to sunbathe. The Ocean you see in the pictures is not even a mile away, known as the famous Makaha Surfing Beach. Golfing, hiking,snorkeling paddle boarding, surfing are all just minutes from the front door.
    Score: 0.4581468403339386
    Summary: The Apartment has a living room, toilet, bedroom (suite) and American kitchen. Well located, on the Copacabana beach block a 05 Min. walk from Ipanema beach (Arpoador). Internet wifi, cable tv, air conditioning in the bedroom, ceiling fans in the bedroom and living room, kitchen with microwave, cooker, Blender, dishes, cutlery and service area with fridge, washing machine, clothesline for drying clothes and closet with several utensils for use. The property boasts 45 m2.
    Score: 0.45398443937301636
1

Para habilitar queries de pesquisa vetorial em seus dados, você deve criar um índice do Atlas Vector Search em sua coleção.

Conclua as etapas a seguir para criar um índice na coleção sample_db.embeddings que especifica o campo embedding como o tipo de vetor e a medida de similaridade como dotProduct.

  1. Crie um arquivo chamado create-index.js e cole o código a seguir.

    create-index.js
    import { MongoClient } from 'mongodb';
    // connect to your Atlas deployment
    const client = new MongoClient(process.env.ATLAS_CONNECTION_STRING);
    async function run() {
    try {
    const database = client.db("sample_db");
    const collection = database.collection("embeddings");
    // define your Atlas Vector Search index
    const index = {
    name: "vector_index",
    type: "vectorSearch",
    definition: {
    "fields": [
    {
    "type": "vector",
    "path": "embedding",
    "similarity": "dotProduct",
    "numDimensions": <dimensions>
    }
    ]
    }
    }
    // run the helper method
    const result = await collection.createSearchIndex(index);
    console.log(result);
    } finally {
    await client.close();
    }
    }
    run().catch(console.dir);
  2. Substitua o placeholder <dimensions> por um dos seguintes valores:

    • 768 se você usou nomic-embed-text-v1

    • 1024 se você usou voyage-3-large

    • 1536 se você usou text-embedding-3-small

  3. Salve o arquivo e execute o seguinte comando:

    node --env-file=.env create-index.js

Observação

O índice deve levar cerca de um minuto para ser criado. Enquanto ele é compilado, o índice está em um estado de sincronização inicial. Quando a construção estiver concluída, você poderá começar a fazer query nos dados em sua coleção.

Para saber mais, consulte Criar um índice do Atlas Vector Search.

2
  1. Crie um arquivo chamado vector-query.js e cole o código a seguir.

    Para executar uma query de pesquisa vetorial, gere um vetor de query para passar para seu pipeline de agregação.

    Por exemplo, este código faz o seguinte:

    • Cria uma incorporação de query usando sua função de incorporação definida.

    • Utilize esta incorporação no campo queryVector e especifique o caminho para a query.

    • Usa $vectorSearch para executar uma pesquisa ENN.

    • Retorna documentos semanticamente semelhantes classificados por relevância com as respectivas pontuações de pesquisa.

    vector-query.js
    import { MongoClient } from 'mongodb';
    import { getEmbedding } from './get-embeddings.js';
    // MongoDB connection URI and options
    const client = new MongoClient(process.env.ATLAS_CONNECTION_STRING);
    async function run() {
    try {
    // Connect to the MongoDB client
    await client.connect();
    // Specify the database and collection
    const database = client.db("sample_db");
    const collection = database.collection("embeddings");
    // Generate embedding for the search query
    const queryEmbedding = await getEmbedding("ocean tragedy");
    // Define the sample vector search pipeline
    const pipeline = [
    {
    $vectorSearch: {
    index: "vector_index",
    queryVector: queryEmbedding,
    path: "embedding",
    exact: true,
    limit: 5
    }
    },
    {
    $project: {
    _id: 0,
    text: 1,
    score: {
    $meta: "vectorSearchScore"
    }
    }
    }
    ];
    // run pipeline
    const result = collection.aggregate(pipeline);
    // print results
    for await (const doc of result) {
    console.dir(JSON.stringify(doc));
    }
    } finally {
    await client.close();
    }
    }
    run().catch(console.dir);
  2. Salve o arquivo e execute o seguinte comando:

    Observação

    A query pode levar algum tempo para ser concluída. Seus resultados podem variar dependendo do modelo de incorporação e se você comprimiu suas incorporações.

    node --env-file=.env vector-query.js
    '{"text":"Titanic: The story of the 1912 sinking of the largest luxury liner ever built","score":0.5103757977485657}'
    '{"text":"Avatar: A marine is dispatched to the moon Pandora on a unique mission","score":0.4616812467575073}'
    '{"text":"The Lion King: Lion cub and future king Simba searches for his identity","score":0.4115804433822632}'
    node --env-file=.env vector-query.js
    {"text":"Titanic: The story of the 1912 sinking of the largest luxury liner ever built","score":0.7007871866226196}
    {"text":"Avatar: A marine is dispatched to the moon Pandora on a unique mission","score":0.6327334046363831}
    {"text":"The Lion King: Lion cub and future king Simba searches for his identity","score":0.5544710159301758}
1

Para habilitar queries de pesquisa vetorial em seus dados, você deve criar um índice do Atlas Vector Search em sua coleção.

Conclua as etapas a seguir para criar um índice na coleção sample_airbnb.listingsAndReviews que especifica o campo embedding como o tipo de vetor e a medida de similaridade como dotProduct.

  1. Crie um arquivo chamado create-index.js e cole o código a seguir.

    create-index.js
    import { MongoClient } from 'mongodb';
    // connect to your Atlas deployment
    const client = new MongoClient(process.env.ATLAS_CONNECTION_STRING);
    async function run() {
    try {
    const database = client.db("sample_airbnb");
    const collection = database.collection("listingsAndReviews");
    // Define your Atlas Vector Search index
    const index = {
    name: "vector_index",
    type: "vectorSearch",
    definition: {
    "fields": [
    {
    "type": "vector",
    "path": "embedding",
    "similarity": "dotProduct",
    "numDimensions": <dimensions>
    }
    ]
    }
    }
    // Call the method to create the index
    const result = await collection.createSearchIndex(index);
    console.log(result);
    } finally {
    await client.close();
    }
    }
    run().catch(console.dir);
  2. Substitua o placeholder <dimensions> por um dos seguintes valores:

    • 768 se você usou nomic-embed-text-v1

    • 1024 se você usou voyage-3-large

    • 1536 se você usou text-embedding-3-small

  3. Salve o arquivo e execute o seguinte comando:

    node --env-file=.env create-index.js

Observação

O índice deve levar cerca de um minuto para ser criado. Enquanto ele é compilado, o índice está em um estado de sincronização inicial. Quando a construção estiver concluída, você poderá começar a fazer query nos dados em sua coleção.

Para saber mais, consulte Criar um índice do Atlas Vector Search.

2
  1. Crie um arquivo chamado vector-query.js e cole o código a seguir.

    Para executar uma query de pesquisa vetorial, gere um vetor de query para passar para seu pipeline de agregação.

    Por exemplo, este código faz o seguinte:

    • Cria uma incorporação de query usando sua função de incorporação definida.

    • Utilize esta incorporação no campo queryVector e especifique o caminho para a query.

    • Usa $vectorSearch para executar uma pesquisa ENN.

    • Retorna documentos semanticamente semelhantes classificados por relevância com as respectivas pontuações de pesquisa.

    vector-query.js
    import { MongoClient } from 'mongodb';
    import { getEmbedding } from './get-embeddings.js';
    // MongoDB connection URI and options
    const client = new MongoClient(process.env.ATLAS_CONNECTION_STRING);
    async function run() {
    try {
    // Connect to the MongoDB client
    await client.connect();
    // Specify the database and collection
    const database = client.db("sample_airbnb");
    const collection = database.collection("listingsAndReviews");
    // Generate embedding for the search query
    const queryEmbedding = await getEmbedding("beach house");
    // Define the sample vector search pipeline
    const pipeline = [
    {
    $vectorSearch: {
    index: "vector_index",
    queryVector: queryEmbedding,
    path: "embedding",
    exact: true,
    limit: 5
    }
    },
    {
    $project: {
    _id: 0,
    summary: 1,
    score: {
    $meta: "vectorSearchScore"
    }
    }
    }
    ];
    // run pipeline
    const result = collection.aggregate(pipeline);
    // print results
    for await (const doc of result) {
    console.dir(JSON.stringify(doc));
    }
    } finally {
    await client.close();
    }
    }
    run().catch(console.dir);
  2. Salve o arquivo e execute o seguinte comando:

    Observação

    A query pode levar algum tempo para ser concluída. Seus resultados podem variar dependendo do modelo de incorporação e se você comprimiu suas incorporações.

    node --env-file=.env vector-query.js
    '{"summary":"Having a large airy living room. The apartment is well divided. Fully furnished and cozy. The building has a 24h doorman and camera services in the corridors. It is very well located, close to the beach, restaurants, pubs and several shops and supermarkets. And it offers a good mobility being close to the subway.","score":0.5334879159927368}'
    '{"summary":"A beautiful and comfortable 1 Bedroom Air Conditioned Condo in Makaha Valley - stunning Ocean & Mountain views All the amenities of home, suited for longer stays. Full kitchen & large bathroom. Several gas BBQ's for all guests to use & a large heated pool surrounded by reclining chairs to sunbathe. The Ocean you see in the pictures is not even a mile away, known as the famous Makaha Surfing Beach. Golfing, hiking,snorkeling paddle boarding, surfing are all just minutes from the front door.","score":0.5240535736083984}'
    '{"summary":"The Apartment has a living room, toilet, bedroom (suite) and American kitchen. Well located, on the Copacabana beach block a 05 Min. walk from Ipanema beach (Arpoador). Internet wifi, cable tv, air conditioning in the bedroom, ceiling fans in the bedroom and living room, kitchen with microwave, cooker, Blender, dishes, cutlery and service area with fridge, washing machine, clothesline for drying clothes and closet with several utensils for use. The property boasts 45 m2.","score":0.5232879519462585}'
    '{"summary":"Room 2 Private room in charming recently renovated federation guest house at Coogee Beach. Prices are per room for 2 People only. A queen and a single bed. Not suitable for group booking All rooms have TV, desk, wardrobe, beds, unlimited wifi 2 mins from the beach, cafes and transport. This is not a party house but a safe and clean place to stay. Share bathrooms and kitchen... All common areas are cleaned daily.","score":0.5186381340026855}'
    '{"summary":"A friendly apartment block where everyone knows each other and there is a strong communal vibe. Property has a huge backyard with vege garden and skate ramp. 7min walk to the beach and 2min to buses.","score":0.5078228116035461}'
    node --env-file=.env vector-query.js
    {"summary": "A friendly apartment block where everyone knows each other and there is a strong communal vibe. Property has a huge backyard with vege garden and skate ramp. 7min walk to the beach and 2min to buses.", "score": 0.483333021402359}
    {"summary": "Room 2 Private room in charming recently renovated federation guest house at Coogee Beach. Prices are per room for 2 People only. A queen and a single bed. Not suitable for group booking All rooms have TV, desk, wardrobe, beds, unlimited wifi 2 mins from the beach, cafes and transport. This is not a party house but a safe and clean place to stay. Share bathrooms and kitchen... All common areas are cleaned daily.", "score": 0.48092877864837646}
    {"summary": "THIS IS A VERY SPACIOUS 1 BEDROOM FULL CONDO (SLEEPS 4) AT THE BEAUTIFUL VALLEY ISLE RESORT ON THE BEACH IN LAHAINA, MAUI!! YOU WILL LOVE THE PERFECT LOCATION OF THIS VERY NICE HIGH RISE! ALSO THIS SPACIOUS FULL CONDO, FULL KITCHEN, BIG BALCONY!!", "score": 0.46294474601745605}
    {"summary": "A beautiful and comfortable 1 Bedroom Air Conditioned Condo in Makaha Valley - stunning Ocean & Mountain views All the amenities of home, suited for longer stays. Full kitchen & large bathroom. Several gas BBQ's for all guests to use & a large heated pool surrounded by reclining chairs to sunbathe. The Ocean you see in the pictures is not even a mile away, known as the famous Makaha Surfing Beach. Golfing, hiking,snorkeling paddle boarding, surfing are all just minutes from the front door.", "score": 0.4580020606517792}
    {"summary": "The Apartment has a living room, toilet, bedroom (suite) and American kitchen. Well located, on the Copacabana beach block a 05 Min. walk from Ipanema beach (Arpoador). Internet wifi, cable tv, air conditioning in the bedroom, ceiling fans in the bedroom and living room, kitchen with microwave, cooker, Blender, dishes, cutlery and service area with fridge, washing machine, clothesline for drying clothes and closet with several utensils for use. The property boasts 45 m2.", "score": 0.45400717854499817}
1

Para habilitar queries de pesquisa vetorial em seus dados, você deve criar um índice do Atlas Vector Search em sua coleção.

  1. Cole o código a seguir no seu notebook.

    from pymongo.operations import SearchIndexModel
    # Create your index model, then create the search index
    search_index_model = SearchIndexModel(
    definition = {
    "fields": [
    {
    "type": "vector",
    "path": "embedding",
    "similarity": "dotProduct",
    "numDimensions": <dimensions>
    }
    ]
    },
    name="vector_index",
    type="vectorSearch"
    )
    collection.create_search_index(model=search_index_model)
  2. Substitua o placeholder <dimensions> por um dos seguintes valores:

    • 768 se você usou nomic-embed-text-v1

    • 1024 se você usou voyage-3-large

    • 1536 se você usou text-embedding-3-small

  3. Execute o código.

    O índice deve levar cerca de um minuto para ser criado. Enquanto ele é compilado, o índice está em um estado de sincronização inicial. Quando a construção estiver concluída, você poderá começar a fazer query nos dados em sua coleção.

Para saber mais, consulte Criar um índice do Atlas Vector Search.

2

Para executar uma query de pesquisa vetorial, gere um vetor de query para passar para seu pipeline de agregação.

Por exemplo, este código faz o seguinte:

  • Cria uma incorporação de query usando sua função de incorporação definida.

  • Utilize esta incorporação no campo queryVector e especifique o caminho para a query.

  • Usa $vectorSearch para executar uma pesquisa ENN.

  • Retorna documentos semanticamente semelhantes classificados por relevância com as respectivas pontuações de pesquisa.

Observação

A query pode levar algum tempo para ser concluída. Seus resultados podem variar dependendo do modelo de incorporação e se você comprimiu suas incorporações.

# Generate embedding for the search query
query_embedding = get_embedding("ocean tragedy")
# Sample vector search pipeline
pipeline = [
{
"$vectorSearch": {
"index": "vector_index",
"queryVector": query_embedding,
"path": "embedding",
"exact": True,
"limit": 5
}
},
{
"$project": {
"_id": 0,
"text": 1,
"score": {
"$meta": "vectorSearchScore"
}
}
}
]
# Execute the search
results = collection.aggregate(pipeline)
# Print results
for i in results:
print(i)
{'data': 'Titanic: The story of the 1912 sinking of the largest luxury liner ever built', 'score': 0.7661112546920776}
{'data': 'Avatar: A marine is dispatched to the moon Pandora on a unique mission', 'score': 0.7050272822380066}
{'data': 'The Shawshank Redemption: A banker is sentenced to life in Shawshank State Penitentiary for the murders of his wife and her lover.', 'score': 0.7024770379066467}
{'data': 'Jurassic Park: Scientists clone dinosaurs to populate an island theme park, which soon goes awry.', 'score': 0.7011005282402039}
{'data': 'E.T. the Extra-Terrestrial: A young boy befriends an alien stranded on Earth and helps him return home.', 'score': 0.6877288222312927}
# Generate embedding for the search query
query_embedding = get_embedding("ocean tragedy", input_type = "query")
# Sample vector search pipeline
pipeline = [
{
"$vectorSearch": {
"index": "vector_index",
"queryVector": query_embedding,
"path": "embedding",
"exact": True,
"limit": 5
}
},
{
"$project": {
"_id": 0,
"text": 1,
"score": {
"$meta": "vectorSearchScore"
}
}
}
]
# Execute the search
results = collection.aggregate(pipeline)
# Print results
for i in results:
print(i)
{'text': 'Titanic: The story of the 1912 sinking of the largest luxury liner ever built', 'score': 0.6526920199394226}
{'text': 'Avatar: A marine is dispatched to the moon Pandora on a unique mission', 'score': 0.6279800534248352}
{'text': 'The Lion King: Lion cub and future king Simba searches for his identity', 'score': 0.5690147280693054}
# Generate embedding for the search query
query_embedding = get_embedding("ocean tragedy")
# Sample vector search pipeline
pipeline = [
{
"$vectorSearch": {
"index": "vector_index",
"queryVector": query_embedding,
"path": "embedding",
"exact": True,
"limit": 5
}
},
{
"$project": {
"_id": 0,
"text": 1,
"score": {
"$meta": "vectorSearchScore"
}
}
}
]
# Execute the search
results = collection.aggregate(pipeline)
# Print results
for i in results:
print(i)
{"text":"Titanic: The story of the 1912 sinking of the largest luxury liner ever built","score":0.7007871866226196}
{"text":"Avatar: A marine is dispatched to the moon Pandora on a unique mission","score":0.6327334046363831}
{"text":"The Lion King: Lion cub and future king Simba searches for his identity","score":0.5544710159301758}
1

Para habilitar queries de pesquisa vetorial em seus dados, você deve criar um índice do Atlas Vector Search em sua coleção.

  1. Cole o código a seguir no seu notebook.

    from pymongo.operations import SearchIndexModel
    # Create your index model, then create the search index
    search_index_model = SearchIndexModel(
    definition = {
    "fields": [
    {
    "type": "vector",
    "path": "embedding",
    "similarity": "dotProduct",
    "numDimensions": <dimensions>
    }
    ]
    },
    name="vector_index",
    type="vectorSearch"
    )
    collection.create_search_index(model=search_index_model)
  2. Substitua o placeholder <dimensions> por um dos seguintes valores:

    • 768 se você usou nomic-embed-text-v1

    • 1024 se você usou voyage-3-large

    • 1536 se você usou text-embedding-3-small

  3. Execute o código.

    O índice deve levar cerca de um minuto para ser criado. Enquanto ele é compilado, o índice está em um estado de sincronização inicial. Quando a construção estiver concluída, você poderá começar a fazer query nos dados em sua coleção.

Para saber mais, consulte Criar um índice do Atlas Vector Search.

2

Para executar uma query de pesquisa vetorial, gere um vetor de query para passar para seu pipeline de agregação.

Por exemplo, este código faz o seguinte:

  • Cria uma incorporação de query usando sua função de incorporação definida.

  • Utilize esta incorporação no campo queryVector e especifique o caminho para a query.

  • Usa $vectorSearch para executar uma pesquisa ENN.

  • Retorna documentos semanticamente semelhantes classificados por relevância com as respectivas pontuações de pesquisa.

Observação

A query pode levar algum tempo para ser concluída. Seus resultados podem variar dependendo do modelo de incorporação e se você comprimiu suas incorporações.

# Generate embedding for the search query
query_embedding = get_embedding("beach house")
# Sample vector search pipeline
pipeline = [
{
"$vectorSearch": {
"index": "vector_index",
"queryVector": query_embedding,
"path": "embedding",
"exact": True,
"limit": 5
}
},
{
"$project": {
"_id": 0,
"summary": 1,
"score": {
"$meta": "vectorSearchScore"
}
}
}
]
# Execute the search
results = collection.aggregate(pipeline)
# Print results
for i in results:
print(i)
{'summary': 'Having a large airy living room. The apartment is well divided. Fully furnished and cozy. The building has a 24h doorman and camera services in the corridors. It is very well located, close to the beach, restaurants, pubs and several shops and supermarkets. And it offers a good mobility being close to the subway.', 'score': 0.7847104072570801}
{'summary': 'The Apartment has a living room, toilet, bedroom (suite) and American kitchen. Well located, on the Copacabana beach block a 05 Min. walk from Ipanema beach (Arpoador). Internet wifi, cable tv, air conditioning in the bedroom, ceiling fans in the bedroom and living room, kitchen with microwave, cooker, Blender, dishes, cutlery and service area with fridge, washing machine, clothesline for drying clothes and closet with several utensils for use. The property boasts 45 m2.', 'score': 0.7780507802963257}
{'summary': "A beautiful and comfortable 1 Bedroom Air Conditioned Condo in Makaha Valley - stunning Ocean & Mountain views All the amenities of home, suited for longer stays. Full kitchen & large bathroom. Several gas BBQ's for all guests to use & a large heated pool surrounded by reclining chairs to sunbathe. The Ocean you see in the pictures is not even a mile away, known as the famous Makaha Surfing Beach. Golfing, hiking,snorkeling paddle boarding, surfing are all just minutes from the front door.", 'score': 0.7723637223243713}
{'summary': 'Room 2 Private room in charming recently renovated federation guest house at Coogee Beach. Prices are per room for 2 People only. A queen and a single bed. Not suitable for group booking All rooms have TV, desk, wardrobe, beds, unlimited wifi 2 mins from the beach, cafes and transport. This is not a party house but a safe and clean place to stay. Share bathrooms and kitchen... All common areas are cleaned daily.', 'score': 0.7665778398513794}
{'summary': 'A friendly apartment block where everyone knows each other and there is a strong communal vibe. Property has a huge backyard with vege garden and skate ramp. 7min walk to the beach and 2min to buses.', 'score': 0.7593404650688171}
# Generate embedding for the search query
query_embedding = get_embedding("beach house", input_type = "query")
# Sample vector search pipeline
pipeline = [
{
"$vectorSearch": {
"index": "vector_index",
"queryVector": query_embedding,
"path": "embedding",
"exact": True,
"limit": 5
}
},
{
"$project": {
"_id": 0,
"summary": 1,
"score": {
"$meta": "vectorSearchScore"
}
}
}
]
# Execute the search
results = collection.aggregate(pipeline)
# Print results
for i in results:
print(i)
{'summary': "A beautiful and comfortable 1 Bedroom Air Conditioned Condo in Makaha Valley - stunning Ocean & Mountain views All the amenities of home, suited for longer stays. Full kitchen & large bathroom. Several gas BBQ's for all guests to use & a large heated pool surrounded by reclining chairs to sunbathe. The Ocean you see in the pictures is not even a mile away, known as the famous Makaha Surfing Beach. Golfing, hiking,snorkeling paddle boarding, surfing are all just minutes from the front door.", 'score': 0.7093013525009155}
{'summary': 'THIS IS A VERY SPACIOUS 1 BEDROOM FULL CONDO (SLEEPS 4) AT THE BEAUTIFUL VALLEY ISLE RESORT ON THE BEACH IN LAHAINA, MAUI!! YOU WILL LOVE THE PERFECT LOCATION OF THIS VERY NICE HIGH RISE! ALSO THIS SPACIOUS FULL CONDO, FULL KITCHEN, BIG BALCONY!!', 'score': 0.6943346261978149}
{'summary': 'A friendly apartment block where everyone knows each other and there is a strong communal vibe. Property has a huge backyard with vege garden and skate ramp. 7min walk to the beach and 2min to buses.', 'score': 0.690493106842041}
{'summary': 'Room 2 Private room in charming recently renovated federation guest house at Coogee Beach. Prices are per room for 2 People only. A queen and a single bed. Not suitable for group booking All rooms have TV, desk, wardrobe, beds, unlimited wifi 2 mins from the beach, cafes and transport. This is not a party house but a safe and clean place to stay. Share bathrooms and kitchen... All common areas are cleaned daily.', 'score': 0.6894105076789856}
{'summary': 'Hello dear Guests, wellcome to istanbul. My House is 2+1 and at second floor. 1 privite room is for my international guests. House is Very close to Taksim Square. You can Walk in 30 minutes or you can take a bus. The bus stop is only 100 m from home. You can go Taksim, Eminönü, Karaköy, Kadıköy, Beyazıt, Sultanahmet easily from home. I have 1 bed, two people can sleep together. Second person should pay extra. You can use kitchen, bathroom, free Wifi, dishwasher, washing machine, Ironing.', 'score': 0.6832740306854248}
# Generate embedding for the search query
query_embedding = get_embedding("beach house")
# Sample vector search pipeline
pipeline = [
{
"$vectorSearch": {
"index": "vector_index",
"queryVector": query_embedding,
"path": "embedding",
"exact": True,
"limit": 5
}
},
{
"$project": {
"_id": 0,
"summary": 1,
"score": {
"$meta": "vectorSearchScore"
}
}
}
]
# Execute the search
results = collection.aggregate(pipeline)
# Print results
for i in results:
print(i)
{"summary": "A friendly apartment block where everyone knows each other and there is a strong communal vibe. Property has a huge backyard with vege garden and skate ramp. 7min walk to the beach and 2min to buses.", "score": 0.483333021402359}
{"summary": "Room 2 Private room in charming recently renovated federation guest house at Coogee Beach. Prices are per room for 2 People only. A queen and a single bed. Not suitable for group booking All rooms have TV, desk, wardrobe, beds, unlimited wifi 2 mins from the beach, cafes and transport. This is not a party house but a safe and clean place to stay. Share bathrooms and kitchen... All common areas are cleaned daily.", "score": 0.48092877864837646}
{"summary": "THIS IS A VERY SPACIOUS 1 BEDROOM FULL CONDO (SLEEPS 4) AT THE BEAUTIFUL VALLEY ISLE RESORT ON THE BEACH IN LAHAINA, MAUI!! YOU WILL LOVE THE PERFECT LOCATION OF THIS VERY NICE HIGH RISE! ALSO THIS SPACIOUS FULL CONDO, FULL KITCHEN, BIG BALCONY!!", "score": 0.46294474601745605}
{"summary": "A beautiful and comfortable 1 Bedroom Air Conditioned Condo in Makaha Valley - stunning Ocean & Mountain views All the amenities of home, suited for longer stays. Full kitchen & large bathroom. Several gas BBQ's for all guests to use & a large heated pool surrounded by reclining chairs to sunbathe. The Ocean you see in the pictures is not even a mile away, known as the famous Makaha Surfing Beach. Golfing, hiking,snorkeling paddle boarding, surfing are all just minutes from the front door.", "score": 0.4580020606517792}
{"summary": "The Apartment has a living room, toilet, bedroom (suite) and American kitchen. Well located, on the Copacabana beach block a 05 Min. walk from Ipanema beach (Arpoador). Internet wifi, cable tv, air conditioning in the bedroom, ceiling fans in the bedroom and living room, kitchen with microwave, cooker, Blender, dishes, cutlery and service area with fridge, washing machine, clothesline for drying clothes and closet with several utensils for use. The property boasts 45 m2.", "score": 0.45400717854499817}

Considere os seguintes fatores ao criar incorporações vetoriais:

Para criar incorporações vetoriais, você deve usar um modelo de incorporação. Modelos de incorporação são algoritmos usados para converter dados em incorporações. Você pode escolher um dos seguintes métodos para se conectar a um modelo de incorporação e criar incorporações vetoriais:

Método
Descrição

Carregue um modelo de código aberto

Se você não tiver uma chave de API para um modelo de incorporação proprietário, carregue um modelo de incorporação de código aberto localmente a partir do seu aplicativo.

Use um modelo proprietário

A maioria dos provedores de AI oferece APIs para seus modelos de incorporação proprietários que podem ser usados para a criação de incorporações vetoriais. Para embeddings de última geração, use Voyage AI.

Aproveite uma integração

Você pode integrar o Atlas Vector Search com estruturas de código aberto e serviços de IA para se conectar rapidamente a modelos de incorporação proprietários e de código aberto e gerar incorporações vetoriais para o Atlas Vector Search.

Para aprender mais, veja Integrar o MongoDB Atlas com tecnologias de IA.

O modelo de incorporação escolhido afeta os resultados da consulta e determina o número de dimensões que você especifica no índice do Atlas Vector Search. Cada modelo oferece vantagens diferentes, dependendo de seus dados e do caso de uso. Para incorporações de última geração, incluindo modelos de incorporação multimodais e específicos de domínio, use a Voyage AI.

Ao escolher um modelo de incorporação para o Atlas Vector Search, considere as seguintes métricas:

  • Dimensões de incorporação: o comprimento da incorporação do vetor.

    Embeddings menores são mais eficientes em termos de armazenamento, enquanto embeddings maiores podem capturar relacionamentos mais sutis em seus dados. O modelo que você escolher deve encontrar um equilíbrio entre eficiência e complexidade.

  • Máximo de tokens : o número de tokens que podem ser compactados em uma única incorporação.

  • Tamanho do modelo: o tamanho do modelo em gigabytes.

    Embora os modelos maiores tenham desempenho melhor, eles exigem mais recursos computacionais à medida que você dimensiona o Atlas Vector Search para produção.

  • Média de recuperação: uma pontuação que mede o desempenho dos sistemas de recuperação.

    Uma pontuação mais alta indica que o modelo é melhor na classificação de documentos relevantes no topo da lista de resultados recuperados. Essa pontuação é importante ao escolher um modelo para aplicativos RAG .

Se você tiver um grande número de vetores de ponto flutuante e quiser reduzir o armazenamento e a pegada do WiredTiger (como uso de disco e memória) em mongod, compacte suas incorporações convertendo-as em vetores binData.

BinData é um tipo de dados BSON que armazena dados binários. O tipo padrão para incorporações vetoriais é uma array de flutuantes de 32bits (float32). Os dados binários são mais eficientes em armazenamento do que o formato de array padrão e, portanto, exigem três vezes menos espaço em disco.

Armazenar vetores binData melhora o desempenho das consultas, pois menos recursos são necessários para carregar um documento no conjunto de trabalho. Isso pode melhorar significativamente a velocidade de consulta para queries vetoriais onde você está retornando mais de 20 documentos. Se você compactar suas incorporações float32, poderá consultá-las com vetores float32 ou binData.

O tutorial nesta página inclui uma função de exemplo que você pode usar para converter seus vetores float32 em vetores binData.

BSON Os vetores BinData são compatíveis com os seguintes drivers:

Vetores de ponto flutuante são tipicamente difíceis de compactar porque cada elemento no array possui seu próprio tipo (apesar de a maioria dos vetores ser uniformemente digitada). Por essa razão, converter a saída do vetor float de um modelo de incorporação em um vetor binData com subtipo float32 é um esquema de serialização mais eficiente. Vetores binData armazenam um único descritor de tipo para o vetor inteiro, o que reduz a sobrecarga de armazenamento.

Considere as seguintes estratégias para garantir que suas incorporações estejam corretas e ideais:

Depois de aprender a criar embeddings e consultá-los com o Atlas Vector Search, comece a criar aplicativos de IA generativos implementando a geração aumentada de recuperação (RAG):

Você também pode quantizar suas incorporações vetoriais de ponto flutuante de 32 bits em menos bits para reduzir ainda mais o consumo de recursos e melhorar a velocidade das consultas. Para aprender mais, consulte Quantização de vetores.

Voltar

Início rápido do Atlas Vector Search

Receber um selo de habilidade

Domine "RAG com MongoDB" gratuitamente!

Saiba mais

Nesta página