# Record Managers

***

Los Record Managers hacen un seguimiento de tus documentos indexados, evitando embeddings vectoriales duplicados en [Vector Store](https://docs.flowiseai.com/espanol/documentacion-oficial/integraciones/langchain/vector-stores).

Cuando se realizan upserts de fragmentos de documentos, cada fragmento será hasheado usando el algoritmo [SHA-1](https://github.com/emn178/js-sha1). Estos hashes se almacenarán en el Record Manager. Si existe un hash, el proceso de embedding y upsert será omitido.

En algunos casos, podrías querer eliminar documentos existentes que se derivan de las mismas fuentes que los nuevos documentos que se están indexando. Para eso, hay 3 modos de limpieza para Record Manager:

{% tabs %}
{% tab title="Incremental" %}
Cuando estás haciendo upsert de múltiples documentos y quieres evitar la eliminación de los documentos existentes que no son parte del proceso actual de upsert, usa el modo de limpieza **Incremental**.

1. Tengamos un Record Manager con modo de limpieza `Incremental` y `source` como SourceId Key

<div align="left"><figure><img src="https://4068692976-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FUiD7nOmFRK805sNuiieJ%2Fuploads%2Fgit-blob-6bc3f51ca7b4369b85eb5ede1eb016b92668fe26%2Fimage%20(4)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1).png?alt=media" alt="" width="264"><figcaption></figcaption></figure> <figure><img src="https://4068692976-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FUiD7nOmFRK805sNuiieJ%2Fuploads%2Fgit-blob-ac1b4de9cf6bcacae3f54b629a70649d2474a946%2Fimage%20(5)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1).png?alt=media" alt="" width="410"><figcaption></figcaption></figure></div>

2. Y tengamos los siguientes 2 documentos:

| Texto | Metadata         |
| ----- | ---------------- |
| Cat   | `{source:"cat"}` |
| Dog   | `{source:"dog"}` |

<div align="left"><figure><img src="https://4068692976-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FUiD7nOmFRK805sNuiieJ%2Fuploads%2Fgit-blob-d040dbe83e5ea9c5e2e1b4bd7a1def041fb3f133%2Fimage%20(11)%20(1)%20(1)%20(1)%20(1).png?alt=media" alt="" width="202"><figcaption></figcaption></figure> <figure><img src="https://4068692976-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FUiD7nOmFRK805sNuiieJ%2Fuploads%2Fgit-blob-619c9b67b5c9723d3a66674160aab86415bdd72e%2Fimage%20(10)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1).png?alt=media" alt="" width="563"><figcaption></figcaption></figure></div>

<div align="left"><figure><img src="https://4068692976-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FUiD7nOmFRK805sNuiieJ%2Fuploads%2Fgit-blob-d136f640ec9900fb5de4a69bcd2ee936ef743518%2Fimage%20(2)%20(1)%20(1)%20(1)%20(1)%20(2).png?alt=media" alt="" width="231"><figcaption></figcaption></figure> <figure><img src="https://4068692976-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FUiD7nOmFRK805sNuiieJ%2Fuploads%2Fgit-blob-15be701ecbf46d5327fca8fbf12abf0fa9051614%2Fimage%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(2).png?alt=media" alt="" width="563"><figcaption></figcaption></figure></div>

3. Después de un upsert, veremos 2 documentos que se han insertado:

<figure><img src="https://4068692976-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FUiD7nOmFRK805sNuiieJ%2Fuploads%2Fgit-blob-68b63505584eac3d8284c0610f48810f68512a3f%2Fimage%20(9)%20(1)%20(1)%20(1)%20(1)%20(2).png?alt=media" alt="" width="433"><figcaption></figcaption></figure>

4. Ahora, si eliminamos el documento **Dog** y actualizamos **Cat** a **Cats**, veremos lo siguiente:

<figure><img src="https://4068692976-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FUiD7nOmFRK805sNuiieJ%2Fuploads%2Fgit-blob-6a43418e6212eb27b15a979772b8d2a0defc1641%2Fimage%20(13)%20(2).png?alt=media" alt="" width="425"><figcaption></figcaption></figure>

* El documento original **Cat** es eliminado
* Un nuevo documento con **Cats** es añadido
* El documento **Dog** no se modifica
* Los embeddings vectoriales restantes en Vector Store son **Cats** y **Dog**

<figure><img src="https://4068692976-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FUiD7nOmFRK805sNuiieJ%2Fuploads%2Fgit-blob-556cd567062208462709811056ead6738c0c8e5c%2Fimage%20(15)%20(1)%20(1).png?alt=media" alt="" width="448"><figcaption></figcaption></figure>
{% endtab %}

{% tab title="Full" %}
Cuando estás haciendo upsert de múltiples documentos, el modo de limpieza **Full** eliminará automáticamente cualquier embedding vectorial que no sea parte del proceso actual de upsert.

1. Tengamos un Record Manager con limpieza `Full`. No necesitamos tener un SourceId Key para el modo de limpieza Full.

<div align="left"><figure><img src="https://4068692976-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FUiD7nOmFRK805sNuiieJ%2Fuploads%2Fgit-blob-6bc3f51ca7b4369b85eb5ede1eb016b92668fe26%2Fimage%20(4)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1).png?alt=media" alt="" width="264"><figcaption></figcaption></figure> <figure><img src="https://4068692976-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FUiD7nOmFRK805sNuiieJ%2Fuploads%2Fgit-blob-57bcd68d64f60e8564d6528498c4d87a6bb9f5ec%2Fimage%20(17)%20(1)%20(1).png?alt=media" alt="" width="407"><figcaption></figcaption></figure></div>

2. Y tengamos los siguientes 2 documentos:

| Texto | Metadata         |
| ----- | ---------------- |
| Cat   | `{source:"cat"}` |
| Dog   | `{source:"dog"}` |

<div align="left"><figure><img src="https://4068692976-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FUiD7nOmFRK805sNuiieJ%2Fuploads%2Fgit-blob-d040dbe83e5ea9c5e2e1b4bd7a1def041fb3f133%2Fimage%20(11)%20(1)%20(1)%20(1)%20(1).png?alt=media" alt="" width="202"><figcaption></figcaption></figure> <figure><img src="https://4068692976-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FUiD7nOmFRK805sNuiieJ%2Fuploads%2Fgit-blob-619c9b67b5c9723d3a66674160aab86415bdd72e%2Fimage%20(10)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1).png?alt=media" alt="" width="563"><figcaption></figcaption></figure></div>

<div align="left"><figure><img src="https://4068692976-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FUiD7nOmFRK805sNuiieJ%2Fuploads%2Fgit-blob-d136f640ec9900fb5de4a69bcd2ee936ef743518%2Fimage%20(2)%20(1)%20(1)%20(1)%20(1)%20(2).png?alt=media" alt="" width="231"><figcaption></figcaption></figure> <figure><img src="https://4068692976-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FUiD7nOmFRK805sNuiieJ%2Fuploads%2Fgit-blob-15be701ecbf46d5327fca8fbf12abf0fa9051614%2Fimage%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(2).png?alt=media" alt="" width="563"><figcaption></figcaption></figure></div>

3. Después de un upsert, veremos 2 documentos que se han insertado:

<figure><img src="https://4068692976-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FUiD7nOmFRK805sNuiieJ%2Fuploads%2Fgit-blob-68b63505584eac3d8284c0610f48810f68512a3f%2Fimage%20(9)%20(1)%20(1)%20(1)%20(1)%20(2).png?alt=media" alt="" width="433"><figcaption></figcaption></figure>

4. Ahora, si eliminamos el documento **Dog** y actualizamos **Cat** a **Cats**, veremos lo siguiente:

<figure><img src="https://4068692976-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FUiD7nOmFRK805sNuiieJ%2Fuploads%2Fgit-blob-c77749e2813034fdf4bcf296f4e9f804a0721fa0%2Fimage%20(18)%20(1)%20(1).png?alt=media" alt="" width="430"><figcaption></figcaption></figure>

* El documento original **Cat** es eliminado
* Un nuevo documento con **Cats** es añadido
* El documento **Dog** es eliminado
* El único embedding vectorial restante en Vector Store es **Cats**

<figure><img src="https://4068692976-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FUiD7nOmFRK805sNuiieJ%2Fuploads%2Fgit-blob-63b3b7ce19c1a265bfef0721599082b99f859918%2Fimage%20(19)%20(1)%20(1).png?alt=media" alt="" width="527"><figcaption></figcaption></figure>
{% endtab %}

{% tab title="None" %}
No se realizará ninguna limpieza
{% endtab %}
{% endtabs %}

Los nodos Record Manager actualmente disponibles son:

* SQLite
* MySQL
* PostgresQL

## Recursos

* [LangChain Indexing - Cómo funciona](https://js.langchain.com/docs/how_to/indexing/#how-it-works)
