# Búsqueda de Embeddings

Consideremos un ejemplo de un robot que es la segunda parte del proyecto "AI Chat With Own Document" (en [la primera parte](https://docs.sherparpa.ru/es/sherpa-rpa/sherpa-designer/primery-robotov/ai-chat-with-own-document/create-embeddings) el robot calculó los embeddings de fragmentos del archivo de texto especificado y los guardó en un archivo en formato CSV). Este robot utiliza los embeddings obtenidos anteriormente y la red neuronal ChatGPT para responder a cualquier pregunta sobre el contenido del documento. Es decir, al operar este robot se pueden introducir cualquier consulta en lenguaje natural, y la red neuronal dará una respuesta basándose en el contenido del documento.

El proyecto del robot consta de un diagrama. Así, si se describe paso a paso, este robot funciona de la siguiente manera:

1. Carga el archivo CSV creado en la primera parte del proyecto con fragmentos de texto y sus correspondientes embeddings.
2. Abre una ventana para ingresar la consulta.
3. Ejecuta la consulta del usuario.
4. En caso de que el usuario ingrese una cadena (palabra), obtiene los embeddings de esa cadena (palabra).
5. Envía la consulta al modelo GPT.
6. Abre una ventana con la respuesta a la consulta del modelo GPT.
7. Después de eso, abre una ventana para ingresar la consulta y ejecuta la consulta del usuario.

El diagrama del proyecto se ve así (para mayor comodidad, los bloques del diagrama están numerados):<br>

<figure><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXdAqvEZJ3KaQ8H16JlSOkgr4TcJrdtl6crZpNYDSxGKyEm1LE53JK4sdDsjbIrFbQEN8ku8DPKnLpxvsRyTEgpBBhaP6erkURcmJb5CCRoTkccifsN8s-SU8M6C1Ypb19Ub2O00ASq0lC8-yKFDDxZLChY?key=A0aTFSxqdqslY-UYAcmeGA" alt=""><figcaption></figcaption></figure>

<figure><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXfSLDcQoTB7-9ElrTwZUgiQ8Tg89lf1NEDhvDTeE41EZQifX9Z7sWtMeiBClageBYZGqQjA6SdVJ7xALx3sNIZB1rpnSp_B7pzrLvUUl-GUrWXylg-vHvV74cIvBnQ3GiaSZKIV9k83cPR-bd3VmVh40ODd?key=A0aTFSxqdqslY-UYAcmeGA" alt=""><figcaption></figcaption></figure>

1. **Bloque "Inicio"** (desde este bloque comienza cualquier diagrama).
2. El bloque "Cargar desde CSV" permite cargar una Tabla de Datos desde un documento CSV. Para este bloque se especifican las siguientes propiedades:

* Ruta al archivo (ruta al archivo desde el cual se debe cargar la Tabla de Datos);
* Separador (símbolo separador);
* Codificación (codificación del archivo).

<figure><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXfnsix4ZXfEEtwsm4RnZNddE0N6mMqw4s-M1n6njnVMrI93KAoHPBh-17ckRQyiL66G3tN_VibTUO0jhm6fvy-HgqgYpDCREVsSJY6FUYGX2_tmxJ0oTjlXffpERSLlTZ73cpCJ1FfrfVMahUccS_PQp-Qs?key=A0aTFSxqdqslY-UYAcmeGA" alt=""><figcaption></figcaption></figure>

3. **Bloque "Ventana para ingresar texto"** muestra una ventana modal destinada a recibir información del usuario. Para este bloque se especifican las siguientes propiedades:

* Título (texto que se reflejará en el título de la ventana de diálogo);
* Mensaje (texto que se reflejará dentro de la ventana de diálogo).

<figure><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXfOHLB8bYv11BDhsF68fggWdW20-01tPTQBoc7Hm4sL-CkboFI2qMb6RJZ7i35msfZYemJX92F-XpbqtLuycyceB4SZ8z_Lyy17Cxyzpake4gtEfZKVlSXlscTSd_hzMKsJZx8R-kmxth4CCaYaBMcjJ1ll?key=A0aTFSxqdqslY-UYAcmeGA" alt=""><figcaption></figcaption></figure>

4. **Bloque "Condición"** verifica la condición especificada por su veracidad, después de lo cual la ejecución del escenario continúa hacia la salida "Sí" (si la condición se cumple) o hacia la salida "No" (si la condición no se cumplió).

La condición se escribe en el formato: "variable" es igual (==)/ mayor (>)/ menor (<) "valor".

Por ejemplo: $a == "Hola", es decir, si el valor de la variable $a es "Hola", entonces salida "Sí", de lo contrario – salida "No".

$Result > 5, es decir, si el valor de la variable $Result es menor que 5, entonces salida "Sí", de lo contrario – salida "No".

En este caso, se establece como condición: $TextQuery.Length == 0. Es decir, si la longitud de la cadena es cero, entonces salida "Sí".

<figure><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXeLnv36adJubnuarHFIvY7FtnBj1Jedp-HAKq3cKrUwBLqfyDK2lFvYZBzvIS2WV2uKz55u2s1u6cbvCcOYWq97NUULkNzD20-RtTL1I_rCMeHkpybZiBYGSRU7ELqC7YIcljV3_LE6rUF96nSjwgtFpw?key=A0aTFSxqdqslY-UYAcmeGA" alt=""><figcaption></figcaption></figure>

5. **Bloque "Obtener embeddings"** permite obtener embeddings de una cadena o lista de cadenas utilizando el servicio Open AI. Para este bloque se especifican las siguientes propiedades:

* Texto (texto de entrada para el cual se calcularán los embeddings);
* Modelo (modelo de la red neuronal para generar la respuesta);
* Tiempo de espera (tiempo máximo de espera para la respuesta en segundos).

<figure><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXel5PCjUpfZmi-5nhkNz4PxAWPEgFHwEPnjONaVCQT24nY2Y1RBHe6UJBa2YPn91j1KvdFygbTNTjJiPkbpNkCSot2fWov0ONVgjLlCn2nIswSXyZYfo5_bqpkmiKcDbvyXWB4fZZT21kXQ38RPZZgwLhs?key=A0aTFSxqdqslY-UYAcmeGA" alt=""><figcaption></figcaption></figure>

6. **Bloque "Log"** permite enviar mensajes y/o valores de variables al log durante la ejecución del escenario del robot. Para este bloque se especifica la propiedad "Valor". En las comillas se indica una constante de texto, y el nombre de la variable comienza con el símbolo $. Es decir, este bloque registra en el log del robot los embeddings obtenidos de la cadena del usuario, obtenidos en el bloque anterior.

<figure><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXcW3ZIV_cG-4s1HEp_ddsafzSDtp9yu0pz3paue9WTHCP_oMt872mj6maXyvQR8lOeTiEEqioQN8yk9MBVVZrRjOX88uoLz-ySkOmdxftXlwoxD5vhB2-3_qSBlPYqBdyeYBpw4fWZWAYAO7zu1ETVLgdFH?key=A0aTFSxqdqslY-UYAcmeGA" alt=""><figcaption></figcaption></figure>

7. **Bloque "Encontrar embeddings"** busca en la base de conocimientos, que representa una tabla de objetos y sus embeddings, las filas más similares al embedding de consulta y devuelve los índices de estas filas en forma de lista, ordenada por similitud decreciente. Los embeddings tanto para la consulta como para la tabla de embeddings, sobre la cual se realiza la búsqueda, pueden ser obtenidos mediante el bloque Obtener embeddings. En la primera utilización del bloque se construye la base de datos de vectores y esto puede llevar un tiempo prolongado. En llamadas posteriores al bloque con el mismo "ID de base", se utilizará la base de datos de vectores ya creada y la velocidad de operación del bloque aumenta considerablemente. Para este bloque se especifican las siguientes propiedades:

* Embedding de consulta (embedding para el cual se deben encontrar filas similares en la tabla);
* Base de conocimientos (tabla sobre la cual se realizará la búsqueda, una de cuyas columnas debe contener embeddings, otras columnas de la tabla pueden contener cualquier dato de usuario);
* Columna de embeddings (índice de la columna de la tabla (por defecto se establece el valor 1), indicada en la propiedad "Base de conocimientos", en la que se encuentran los embeddings.);
* Número de resultados (Número máximo de filas de resultados devueltas por el bloque desde la base de conocimientos (por defecto se establece el valor 5).

<figure><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXcevNZ4H30NPomOggFsGBuiUg2e_04IL4kGddp0qCF0m46BBrjkGCHjygNSRcmjF5aJnEAFxdWM-6nbhTFSu5GDOTMHSgu4Av9979I-k4ayiI8s4bL3ii24iSc4cyYf7XjIXYMgavNX122QAu_D115ptH0?key=A0aTFSxqdqslY-UYAcmeGA" alt=""><figcaption></figcaption></figure>

8. **Bloque "Asignar valor a la variable"** establece nuevos valores para una o varias variables. En este caso, en las propiedades se indican dos valores que deben asignarse a las variables: a la variable $AIQuery se le debe asignar el valor “Answer the question using only knowledge base listed below.\`nQuestion: {query}\`nKnowledge base: \`n{strresult}", y a la variable $strresult – un valor vacío (para la posterior escritura en la variable de respuesta a la consulta del usuario).

<figure><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXfXxOBQofWTwyfKjEC18VKqNd-oek3L1DHaZUzXQ6-1wbfa3CmpZeLIjREPfew81qGL3VHvUnO5YF7lItLoiTClu6efSHf75J7MW_rKHDt_Tp9fqhT9cxHOVcrZQB343hU7snLko0C2mOUUXVFHeNJh-n4?key=A0aTFSxqdqslY-UYAcmeGA" alt=""><figcaption></figcaption></figure>

9. **Bloque "Ciclo Para cada (Lista)"** itera sobre todos los elementos en la lista dada.

   <figure><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXffjgJ8I97j5hW5qOomYtV9-KYianFSSVIDb0F4FwuqYK0JBwJqf-mityizF-s_fzgO6XIDxoorF8zM-5yOzFf60sNvCGiruPqjjIhlv8CMei_L95sbMyeFB85A-Fo5GoWt5NTFYm_bRr_Zpytkk2txbLNc?key=A0aTFSxqdqslY-UYAcmeGA" alt=""><figcaption></figcaption></figure>
10. **Bloque “Asignar valor a la variable”** establece nuevos valores para una o varias variables. En este caso, en las propiedades se indica un valor que debe ser asignado a la variable.

<figure><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXfLSr8x5jK8yw9juNhCAmXryd4nEW7fxCRLNPUFwLg8ttu5ev3NlrxL022b_BN3OiF4sumSKias7cv-HrxbJ8rklQCsNeX-Fv08CNi5trrqyEWTLPge99U2HLWrPLNcm5ygoDFnVCHLbKQ9RJyf_-Yy7t6P?key=A0aTFSxqdqslY-UYAcmeGA" alt=""><figcaption></figcaption></figure>

11. **Bloque “Asignar valor a la variable”** establece nuevos valores para una o varias variables. En este caso, en las propiedades se indican dos valores que deben ser asignados a las variables especificadas.

<figure><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXcbyxvYz6RkogsSrXe1nLvzCISGNe44_6VUeE20hTDI0wXneaalG6Dt3V3jrHUsdhG0RaotAxn2jXcoKuPcZWJmL5SNjzSp8kQQOn9ayMdR7B0YUt2ExMZ-cvKg4FVI7QVISWScHf6pTVx_ytFvvgcBdEQ?key=A0aTFSxqdqslY-UYAcmeGA" alt=""><figcaption></figcaption></figure>

12. **Bloque “Log”** permite registrar mensajes arbitrarios y/o valores de variables en el registro durante la ejecución del script del robot. Para este bloque se ha especificado la propiedad “Valor”. En comillas se indica una constante de texto, y el nombre de la variable comienza con el símbolo $. Es decir, este bloque registra en el log del robot el valor de la variable $AIQuery (la consulta resultante a GPT). A su vez, la variable $AIQuery incluye el texto del usuario y la Base de Conocimientos.

<figure><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXcg8zqQWeIurBNRqRZsN8jZe7yMtoO-zGoL-gAfLvTDQg3g1GzNsDpCdCJfzucsvaAoe0WDwUqae2IGRA4-ZRjGr2XJa78g6IsNZZ-opiUAENNXpevMY5u8eA4nJhbMvQUokQS5GTpjCeJzZDuGh7IKWTS2?key=A0aTFSxqdqslY-UYAcmeGA" alt=""><figcaption></figcaption></figure>

13. **Bloque “Solicitud a modelo GPT”** permite enviar solicitudes a los modelos generativos clásicos de Open AI antes de ChatGPT y recibir respuestas. Para este bloque se han especificado las siguientes propiedades:

* Solicitud (solicitud en lenguaje natural);
* Modelo (modelo para generación de texto);
* Temperatura (número decimal entre 0 y 1 que indica el grado de "aleatoriedad" o "creatividad" del resultado, donde 0 es el resultado menos creativo y 1 es el más aleatorio);
* Tiempo de espera (máximo tiempo de espera para una respuesta en segundos).

<figure><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXfs87PUP3qoXJNCjZ4rfCckgFus6xiKcwmJlm4dPY6vshzvLrgkbcJydslUeEv-fkT8yHeBIPLpTqaTsSBbyrvt4v7hpUGP0NHupy-PiDtK1gRW_8OqMYYmeSOB1D0I5yDSpmetBpyi7iM7yZIdhWdOe1it?key=A0aTFSxqdqslY-UYAcmeGA" alt=""><figcaption></figcaption></figure>

14. **Bloque “Ventana de mensaje”** muestra al usuario una ventana modal de diálogo, con un título, texto y un conjunto de botones especificados. Para este bloque se han especificado las siguientes propiedades:

* Título (texto que se mostrará en el encabezado de la ventana de diálogo);
* Mensaje (variable que se mostrará dentro de la ventana de diálogo, en este caso, es la variable $Response, que es la respuesta del modelo generativo a la solicitud);
* Botones (botones que estarán disponibles para que el usuario haga clic).

<figure><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXfRqA6XSOIeQlGxO9tXCfdLQeo4-OSoiWcUAAee4IgxpJuGI1ower4_FOaTHcic1BybgajOVQxWBLw00y-LgdUolwcwadPSvXENbDCUAZq_Eiy3qmRf2oy2GZsmBPsU4vAjAA1dSNPHzUrdcZ6ECAagF_Ma?key=A0aTFSxqdqslY-UYAcmeGA" alt=""><figcaption></figcaption></figure>

\
15\. **Bloque “Fin”** (este bloque finaliza la ejecución del script o devuelve el diagrama del subproceso al proceso principal).


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.sherparpa.ru/es/sherpa-rpa/sherpa-designer/primery-robotov/ai-chat-with-own-document/search-embeddings.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
