Busca pienso para tu gato con MongoDB, vectores y LLMs

Clara Jiménez Recio

t3chfest
2024
Foto de Clara Jiménez Recio
Mi gata Nita en Pixelart
Logo de MongoDB
MongoDB

¡Hola! 👋🏻

Free-time Alexa Skills Developer 🤓

Full Stack Developer & Lover 👩🏻‍💻❤️

Alexa Champion 🏆

Logo de WiV Spain
Logo de la Comunidad de Alexa en Español
Logo de Alexa Champion
Mi gata Nita en Pixelart
Logo de MongoDB
MongoDB
QR para escanear que dirige a esta presentación
t3chfest
2024

tinyurl.com/gatos-mongo

1

Búsqueda Textual

Veterinario atendiendo a un gato

True

Origins

imagen de un buscador web
True Origins
Mi gata Nita en Pixelart
Logo de MongoDB
MongoDB

1

Búsqueda Textual

Mi gata Nita en Pixelart
Logo de MongoDB
MongoDB
Veterinario atendiendo a un gato

True

Origins

1

Búsqueda Textual

imagen de un buscador web
True Origins
{
  "name": "True Origins Pure Adult",
  "description": "Alimento completo True Origins Pure Adult para gatos esterilizados",
  "composition": "Proteína de pollo deshidratada (30%), Pollo fresco (26%), Patata (14%), Proteína de guisante,...",
  "characteristics": [
    "Este pienso refuerza el sistema muscular de tu gato.",
    "Contiene taurina que mejora el funcionamiento del corazón.",
    "Contiene un alto nivel vitamínico.",
    "Alimento completo para tus mininos.",
    ...
  ]
}

👌

Mi gata Nita en Pixelart
Logo de MongoDB
MongoDB

2

MongoDB Atlas Search

  • Apache Lucene
  • Fuzzy Searching
  • Synonyms
  • Custom Scoring
  • Rich Queries
  • Autocomplete
Imagen de una lupa buscando información en un texto
Mi gata Nita en Pixelart
Logo de MongoDB
MongoDB

3

Search Index

{
  "name": {
    "type": "String"
  }
}
{
  "name": {
    "type": ["String"]
  }
}
{
  "analyzer": "lucene.standard",
  "mappings": {
    "dynamic": false,
    "fields": {
      "name": {
        "type": "string"
      }
    }
  }
}

string, array of strings

Mi gata Nita en Pixelart
Logo de MongoDB
MongoDB

3

Search Index

{
  "translations": [
    {
      "lang": {
        "type": "String"
      },
      "name": {
        "type": "String"
      }
    }
  ]
}
{
  "analyzer": "lucene.standard",
  "mappings": {
    "dynamic": false,
    "fields": {
      "translations": {
        "dynamic": false,
        "type": "embeddedDocuments",
        "fields": {
          "name": {
            "type": "string"
          }
        }
      }
    }
  }
}

array of objects

Mi gata Nita en Pixelart
Logo de MongoDB
MongoDB

3

Search Index

{
  "analyzer": "lucene.standard",
  "mappings": {
    "dynamic": false,
    "fields": {
      "translations": {
        "type": "document",
        "fields": {
          "es": {
            "type": "document",
            "fields": {
              "name": {
                "type": "string"
              }
            }
          },
          "en": {
            "type": "document",
            "fields": {
              "name": {
                "type": "string"
              }
            }
          }
          ...
        }
      }
    }
  }
}
{
  "translations": {
    "es": {
      "name": {
        "type": "String"
      }
    },
    "en": {
      "name": {
        "type": "String"
      }
    }
    ...
  }
}

dictionary

Mi gata Nita en Pixelart
Logo de MongoDB
MongoDB

4

Analyzers

pienso

gatos

esterilizados

pienso

especial

para

gatos

esterilizados

🔎 Pienso gatos esterilizados

{
  "description": "Pienso especial para gatos ESTERILIZADOS"
}

Analyzer

Analyzer

Tokens

🕵️‍♀️

🕵️‍♀️

Mi gata Nita en Pixelart
Logo de MongoDB
MongoDB

4

Analyzers

Analyzer Separator Transformation Case sensitive Only exact matches
Standard word boundaries (language-neutral) lowercase No No
Simple non-letter characters lowercase No No
Whitespace whitespaces none Yes No
Keyword none none Yes Yes
  • Language Analyzers
  • Custom Analyzers (stemming, stopwords,...)
Mi gata Nita en Pixelart
Logo de MongoDB
MongoDB

4

Analyzers

Name Standard Simple Whitespace Keyword
True Origins true, origins true, origins True, Origins True Origins
Nature's Variety nature's, variety nature, s, variety Nature's, Variety Nature's Variety
Forza 10 forza, 10 forza Forza, 10 Forza 10

Tokens 🇦🇧🇨

Mi gata Nita en Pixelart
Logo de MongoDB
MongoDB

4

Analyzers

Analyzer Tokens Matches
Standard true, origins
Simple true, origins
Whitespace True, Origins
Keyword True Origins

🔎 True Origins

Pienso True Origins para gatos
Mi gata Nita en Pixelart
Logo de MongoDB
MongoDB

4

Analyzers

Analyzer Tokens Matches
Standard true, origins
Simple true, origins
Whitespace True, Origins
Keyword True Origins

🔎 true origins

Pienso True Origins para gatos
Mi gata Nita en Pixelart
Logo de MongoDB
MongoDB

4

Analyzers

Analyzer Tokens Matches
Standard nature's, variety
Simple nature, s, variety
Whitespace Nature's, Variety
Keyword Nature's Variety

🔎 Nature's Variety

Pienso Nature's Variety para gatos
Mi gata Nita en Pixelart
Logo de MongoDB
MongoDB

4

Analyzers

Analyzer Tokens Matches
Standard nature's, variety
Simple nature, s, variety
Whitespace Nature's, Variety
Keyword Nature's Variety

🔎 Nature's

Pienso Nature's Variety para gatos
Mi gata Nita en Pixelart
Logo de MongoDB
MongoDB

4

Analyzers

🔎 Forza 10

Pienso Forza 10 para gatos
Analyzer Tokens Matches
Standard forza, 10
Simple forza
Whitespace Forza, 10
Keyword Forza 10
Mi gata Nita en Pixelart
Logo de MongoDB
MongoDB

4

Analyzers

🔎 10

Pienso Forza 10 para gatos
Analyzer Tokens Matches
Standard forza, 10
Simple forza
Whitespace Forza, 10
Keyword Forza 10
Mi gata Nita en Pixelart
Logo de MongoDB
MongoDB

5

Search Query

Operators:

  • text
  • phrase
  • compound
  • embeddedDocument
  • autocomplete
{
  "$search": {
    "autocomplete": {
      "query": "Pien",
      "path": "name",
      "fuzzy": {
        "maxEdits": 1,
        "maxExpansions": 10,
        "prefixLength": 2
      }
    }
  }
}
{
  "$search": {
    "text": {
      "query": "Pienso",
      "path": ["name", "description"],
      "fuzzy": {
        "maxEdits": 1,
        "maxExpansions": 10,
        "prefixLength": 0
      }
    }
  }
}
{
  "$search": {
    "phrase": {
      "query": "Pienso gatos esterilizados",
      "path": ["name", "description"],
      "slop": 2
    }
  }
}
{
  "$search": {
    "embeddedDocument": {
      "path": "translations",
      "operator": {
        "text": {
          "path": "translations.name",
          "query": "Pienso"
        }
      }
    }
  }
}
{
  "$search": {
    "compound": {
      "must": [
        {
          "text": {
            "query": "Pienso",
            "path": "name"
          }
        }
      ],
      "should": [
        {
          "phrase": {
            "query": "Pienso gatos esterilizados",
            "path": "description",
            "slop": 2
          }
        }
      ]
    }
  }
}
Mi gata Nita en Pixelart
Logo de MongoDB
MongoDB

6

Autocomplete

  • Check if a word or phrase contains a sequence of characters from an
    incomplete input string
  • Search-as-you-type applications
Imagen que representa un buscador de texto incompleto
Mi gata Nita en Pixelart
Logo de MongoDB
MongoDB

6

Autocomplete

{
  "analyzer": "lucene.standard",
  "mappings": {
    "dynamic": false,
    "fields": {
      "name": {
        "type": "autocomplete",
        "tokenization": "edgeGram",
        "minGrams": 2,
        "maxGrams": 8,
        "foldDiacritics": true
      }
    }
  }
}

standard pienso, para, gatos

edgeGram

pi, pie, pien, piens, pienso, pienso[space], pienso p, pa, par, para, para[space], para g, para ga, para gat, ga, gat, gato, gatos

rightEdgeGram

os, tos, atos, gatos, [space]gatos, a gatos, ra gatos, ra, ara, para, [space]para, o para, so para, nso para, so, nso, enso, ienso, pienso

nGram

pi, pie, pien, piens, pienso, pienso[space], pienso p, ie, ien, iens, ienso, ienso[space], ienso p, ienso pa, en, ens, enso, enso[space], enso p, enso pa, enso par, ns, nso, nso[space], nso p, nso pa, nso par, nso para,... 😵

Autocomplete Index (string, array of strings)

Mi gata Nita en Pixelart
Logo de MongoDB
MongoDB

6

Autocomplete

{
  "analyzer": "lucene.standard",
  "mappings": {
    "dynamic": false,
    "fields": {
      "translations": {
        "dynamic": false,
        "type": "embeddedDocuments",
        "fields": {
          "name": {
            "type": "autocomplete",
            "tokenization": "edgeGram",
            "minGrams": 2,
            "maxGrams": 8,
            "foldDiacritics": true
          }
        }
      }
    }
  }
}

Autocomplete Index (array of objects)

Mi gata Nita en Pixelart
Logo de MongoDB
MongoDB

6

Autocomplete

{
  "analyzer": "lucene.standard",
  "mappings": {
    "dynamic": false,
    "fields": {
      "translations": {
        "type": "document",
        "fields": {
          "es": {
            "type": "document",
            "fields": {
              "name": {
                "type": "autocomplete",
                "tokenization": "edgeGram",
                "minGrams": 2,
                "maxGrams": 8,
                "foldDiacritics": true
              }
            }
          },
          ...
        }
      }
    }
  }
}
{
  "$search": {
    "autocomplete": {
      "query": "Pien",
      "path": ["translations.es.name", "translations.en.name", ...]
    }
  }
}

🇪🇸🇫🇷🇩🇪🇺🇲🏴󠁧󠁢󠁥󠁮󠁧󠁿󠁧󠁢󠁥󠁮󠁧󠁿🇵🇹🇳🇱🇨🇳

😶‍🌫️

Autocomplete Index (dictionary)

compound 😵‍💫

Mi gata Nita en Pixelart
Logo de MongoDB
MongoDB

6

Autocomplete

Name Standard Simple Whitespace Keyword
True Origins tr, tru, true, true[space], true o, true or, true ori, or, ori, orig, origi, origin, origins tr, tru, true, true[space], true o, true or, true ori, or, ori, orig, origi, origin, origins Tr, Tru, True, True[space], True O, True Or, True Ori, Or, Ori, Orig, Origi, Origin, Origins Tr, Tru, True, True[space], True O, True Or, True Ori
Nature's Variety na, nat, natu, natur, nature, nature', nature's, va, var, vari, varie, variet, variety na, nat, natu, natur, nature, nature', nature's, va, var, vari, varie, variet, variety Na, Nat, Natu, Natur, Nature, Nature', Nature's, Va, Var, Vari, Varie, Variet, Variety Na, Nat, Natu, Natur, Nature, Nature', Nature's
Forza 10 fo, for, forz, forza, forza[space], forza 1, forza 10, 10 fo, for, forz, forza Fo, For, Forz, Forza, Forza[space], Forza 1, Forza 10, 10 Fo, For, Forz, Forza, Forza[space], Forza 1, Forza 10

Tokens 🇦🇧🇨

(usando edgeGram)

Mi gata Nita en Pixelart
Logo de MongoDB
MongoDB

7

"No es un bug, es una feature"

Pienso Nature's Variety para perros
Pienso True Origins para perros
Pienzo Forza 10 para perros
Pienso Forza 10 para gatos
Pienso Nature's Variety para gatos
Pienso True Origins para gatos
{
  "$search": {
    "autocomplete": {
      "query": "Pienso",
      "path": "name"
    }
  }
}
Mi gata Nita en Pixelart
Logo de MongoDB
MongoDB
Arena para gatos
Rascador para gatos
Juguete para gatos
{
  "$search": {
    "autocomplete": {
      "query": "Pienso gatos",
      "path": "name"
    }
  }
}

7

"No es un bug, es una feature"

Mi gata Nita en Pixelart
Logo de MongoDB
MongoDB
{
  "$search": {
    "compound": {
      "must": [
        {
          "autocomplete": {
            "query": "Pienso",
            "path": "name"
          }
        },
        {
          "autocomplete": {
            "query": "gatos",
            "path": "name"
          }
        }
      ]
    }
  }
}
Pienso Forza 10 para gatos
Pienso Nature's Variety para gatos
Pienso True Origins para gatos

7

"No es un bug, es una feature"

Mi gata Nita en Pixelart
Logo de MongoDB
MongoDB
{
  "$search": {
    "autocomplete": {
      "query": "Pienso gatos",
      "path": "name",
      "tokenOrder": "sequential",
    }
  }
}

7

"No es un bug, es una feature"

Pienso Forza 10 para gatos
Pienso Nature's Variety para gatos
Pienso True Origins para gatos
Mi gata Nita en Pixelart
Logo de MongoDB
MongoDB

8

Búsqueda Semántica

Alta proteína animal, con l-carnitina porque está castrado y taurina para el corazón,...

imagen de un buscador web
¿Qué pienso tiene más proteína de origen animal? También quiero que tenga l-carnitina y taurina
Veterinario atendiendo a un gato
Mi gata Nita en Pixelart
Logo de MongoDB
MongoDB

8

Búsqueda Semántica

Alta proteína animal, con l-carnitina porque está castrado y taurina para el corazón,...

Veterinario atendiendo a un gato
Mi gata Nita en Pixelart
Logo de MongoDB
MongoDB

8

Búsqueda Semántica

Mi gata Nita en Pixelart
Logo de MongoDB
MongoDB

8

Búsqueda Semántica

{
  "name": "True Origins Pure Adult",
  "description": "Alimento completo True Origins Pure Adult para gatos esterilizados",
  "composition": "Proteína de pollo deshidratada (30%), Pollo fresco (26%), Patata (14%), Proteína de guisante,...",
  "characteristics": [
    "Este pienso refuerza el sistema muscular de tu gato.",
    "Contiene taurina que mejora el funcionamiento del corazón.",
    "Contiene un alto nivel vitamínico.",
    "Alimento completo para tus mininos.",
    ...
  ]
}
imagen de un buscador web
¿Qué pienso tiene más proteína de origen animal? También quiero que tenga l-carnitina y taurina

🤔

Mi gata Nita en Pixelart
Logo de MongoDB
MongoDB

8

Búsqueda Semántica

{
  "name": "True Origins Pure Adult",
  "description": "Alimento completo True Origins Pure Adult para gatos esterilizados",
  "composition": "Proteína de pollo deshidratada (30%), Pollo fresco (26%), Patata (14%), Proteína de guisante,...",
  "characteristics": [
    "Este pienso refuerza el sistema muscular de tu gato.",
    "Contiene taurina que mejora el funcionamiento del corazón.",
    "Contiene un alto nivel vitamínico.",
    "Alimento completo para tus mininos.",
    ...
  ]
}
imagen de un buscador web
¿Qué pienso tiene más proteína de origen animal? También quiero que tenga l-carnitina y taurina

🤔

Mi gata Nita en Pixelart
Logo de MongoDB
MongoDB

8

Búsqueda Semántica

{
  "name": "True Origins Pure Adult",
  "description": "Alimento completo True Origins Pure Adult para gatos esterilizados",
  "composition": "Proteína de pollo deshidratada (30%), Pollo fresco (26%), Patata (14%), Proteína de guisante,...",
  "characteristics": [
    "Este pienso refuerza el sistema muscular de tu gato.",
    "Contiene taurina que mejora el funcionamiento del corazón.",
    "Contiene un alto nivel vitamínico.",
    "Alimento completo para tus mininos.",
    ...
  ]
}
imagen de un buscador web
¿Qué pienso tiene más proteína de origen animal? También quiero que tenga l-carnitina y taurina

🤔

Mi gata Nita en Pixelart
Logo de MongoDB
MongoDB

9

MongoDB Atlas Vector Search

[0.9, 0.02, 0.1,...]

🔎 Question

[0.9, 0.08, 0.1,...]

MongoDB Atlas

Embedding

1

Store (& Index)

2

Embedding

3

$vectorSearch

4

¿Qué pienso tiene más proteína de origen animal? También quiero que tenga l-carnitina y taurina

composition_emb
composition

5

Matched Documents

Pienso Forza 10 para gatos
Pienso Nature's Variety para gatos
Pienso True Origins Wild para gatos
Pienso True Origins para gatos
Pienso Applaws para gatos

Approximate Nearest Neighbors (ANN)

Mi gata Nita en Pixelart
Logo de MongoDB
MongoDB

9

MongoDB Atlas Vector Search

  • K Nearest Neighbors (KNN)

Query Vector
Nearest Neighbor
Mi gata Nita en Pixelart
Logo de MongoDB
MongoDB

9

MongoDB Atlas Vector Search

  • Approximate Nearest Neighbors (ANN)

Entry Point
Query Vector
Nearest Neighbor
Mi gata Nita en Pixelart
Logo de MongoDB
MongoDB

9

MongoDB Atlas Vector Search

  • Approximate Nearest Neighbors (ANN)

  • Hierarchical Navigable Small World (HNSW)

Query Vector
Entry Point
Nearest Neighbor
  • mL = 1/ln(M)

  • M = 16

  • efConstruction = 100

  • Mmax = M

  • Mmax0 = 2M

Mi gata Nita en Pixelart
Logo de MongoDB
MongoDB

9

MongoDB Atlas Vector Search

{
  "fields": [
    {
      "type": "vector",
      "path": "composition_emb",
      "numDimensions": 2048,
      "similarity": "euclidean | cosine | dotProduct"
    },
    {
      "type": "filter",
      "path": "price"
    },
    ...
  ]
}

Mi gata Nita en Pixelart
Logo de MongoDB
MongoDB

9

MongoDB Atlas Vector Search

{
  "fields": [
    {
      "type": "vector",
      "path": "composition_emb",
      "numDimensions": 2048,
      "similarity": "euclidean | cosine | dotProduct"
    },
    {
      "type": "filter",
      "path": "price"
    },
    ...
  ]
}
Mi gata Nita en Pixelart
Logo de MongoDB
MongoDB

9

MongoDB Atlas Vector Search

{
  "$vectorSearch": {
    "index": "index_name",
    "path": "composition_emb",
    "queryVector": [0.9, 0.08, 0.1,...],
    "numCandidates": 20,
    "limit": 1,
    "filter": {
      price: { $lt: 50 }
    }
  }
}
efSearch
Mi gata Nita en Pixelart
Logo de MongoDB
MongoDB

[0.9, 0.02, 0.1,...]

🔎 Question

[0.9, 0.08, 0.1,...]

MongoDB Atlas

Embedding

1

2

Embedding

3

$vectorSearch

4

¿Qué pienso tiene más proteína de origen animal? También quiero que tenga l-carnitina y taurina

composition_emb
composition

Answer

Retrieval-augmented generation (RAG)

6

7

5

5

Context Documents

Prompt

LLM

10

MongoDB Atlas Vector Search + LLM

Store (& Index)

Mi gata Nita en Pixelart
Logo de MongoDB
MongoDB
Mi gata Nita en Pixelart
Logo de MongoDB
MongoDB

10

MongoDB Atlas Vector Search + LLM

OpenAI

LangChain

LlamaIndex

Hugging Face

Cohere

Nomic

Mi gata Nita en Pixelart
Logo de MongoDB
MongoDB

Clara Jiménez Recio

Logo de twitter

@clear_is_me

(aka         )

Logo de GitHub

clara-jr

Logo de Web

clara-jr.github.io

Nita

Mi gata Nita sentada en la cama
Made with Slides.com