Utilizar ELSER, modelo de procesamiento del lenguaje natural de Elastic
Elastic aprendido difuso EncodeR(ELSER) es un modelo de proceso de lenguaje natural (NLP) entrenado por Elastic que le permite realizar la búsqueda semántica utilizando la representación de vector difuso. En lugar de coincidencia literal en términos de búsqueda, la búsqueda semántica recupera resultados basados en la intención y el significado contextual de una consulta de búsqueda.
En esta guía de aprendizaje suministrará una instancia de Databases for Elasticsearch Platinum y aplicará el modelo ELSER a un cuerpo de texto y verá cómo mejora la calidad de los resultados de la búsqueda.
Esta es la segunda de las tres guías de aprendizaje que exploran las prestaciones de Elasticsearch en torno al aprendizaje automático. Machine Learning es una rama de la inteligencia artificial (IA) y la informática que se centra en el uso de datos y algoritmos para imitar la forma en que los humanos aprenden, mejorando gradualmente su precisión. Mediante el uso de métodos estadísticos, los algoritmos se entrenan para realizar clasificaciones o predicciones, y para descubrir información clave en proyectos de minería de datos.
Consulte las otras guías de aprendizaje en esta serie de aprendizaje automático Elasticsearch:
- Utilizar prestaciones de búsqueda vectorial de Elasticsearch
- Utilizar modelos de aprendizaje automático con Elasticsearch para etiquetar el contenido
Databases for Elasticsearch es un servicio de pago, por lo que si sigue esta guía de aprendizaje incurrirá en cargos.
Antes de empezar
Para iniciar el proceso de suministro, instale algunas herramientas necesarias:
- Cuenta IBM Cloud
- Terraform: para codificar y suministrar infraestructura.
- Python
- jq-Para procesar archivos de configuración.
Obtener una clave de API para desplegar la infraestructura en su cuenta
Cree una IBM Cloud que permita a Terraform suministrar infraestructura a su cuenta. Puede crear hasta 20 claves de API.
Por motivos de seguridad, la clave de API sólo está disponible para copiarse o descargarse en el momento de la creación. Si se pierde la clave de API, deberá crear una nueva clave de API.
Clonar el proyecto
Clone el proyecto desde el repositorio GitHub.
git clone https://github.com/IBM/elasticsearch-ml-elser-tutorial.git
Instale el clúster de Elasticsearch
-
Vaya a la carpeta terraform del proyecto clonado.
cd elasticsearch-ml-elser-tutorial/terraform
-
En la máquina, cree un documento denominado
terraform.tfvars
, con los campos siguientes:ibmcloud_api_key = "<your_api_key_from_step_1>" region = "<your_region>" elastic_password = "<make-up-a-password>"
El documento
terraform.tfvars
contiene variables que quizá quieras mantener en secreto, por lo que está excluido del repositorio público de Github. -
Instale la infraestructura con el siguiente comando:
terraform init terraform apply --auto-approve
Por último, exporte la URL acceso a la base de datos a su entorno de terminal (será necesaria para los pasos siguientes)
terraform output --json
export ES="<the url value obtained from the output>"
cd ..
Instalar el modelo ELSER
Es necesario instalar e iniciar el modelo ELSER para poder utilizarlo. Instálelo con un mandato como:
curl -kX PUT "$ES/_ml/trained_models/.elser_model_1?pretty" -H 'Content-Type: application/json' -d'
{
"input": {
"field_names": ["text_field"]
}
}
'
A continuación, inícielo escribiendo:
curl -kX POST "$ES/_ml/trained_models/.elser_model_1/deployment/_start?deployment_id=for_search&pretty"
Es posible que tenga que esperar unos minutos para que el modelo termine de instalar antes de que se pueda ejecutar el mandato de inicio.
Crear un índice y correlaciones para los datos
Debe estar en la raíz de la carpeta del proyecto. En el terminal, utilice un mandato como:
curl -kXPUT -H"Content-Type: application/json" -d@mapping.json $ES/test_data
Esto crea un índice denominado test_data
en la instancia de ES. También creará algunas correlaciones explícitas. Esta es la forma en que
Elastic tiene que definir cómo se almacena e indexa un documento y los campos que contiene. La definición de correlación se almacena en el archivo mapping.json
. Define un campo denominado ml.tokens
que se utilizará
para almacenar todos los datos adicionales (señales) que se crearán en mi algoritmo de aprendizaje automático cuando analice los datos que cargue. Estos datos estarán contenidos en un campo denominado text
, que también se define
explícitamente en el documento de correlación.
Crear un conducto de ingesta para analizar los datos
El modelo ELSER viene preinstalado en todos los despliegues Platinum de Databases for Elasticsearch. Todo lo que tiene que hacer es crear una interconexión que la utilice para analizar los datos entrantes.
curl -kX PUT -H"Content-Type: application/json" -d@pipeline.json $ES/_ingest/pipeline/elser-v1-test
El documento pipeline.json
tiene la definición de interconexión. Describe qué proceso sucederá con los documentos cuando se carguen. En este caso, define el uso del modelo ELSER e indica a ES que coloque los datos resultantes en
el campo ml.tokens
del índice.
Se trata de una interconexión muy sencilla. Por ejemplo, no se ocupa de ningún error de ingesta, sólo los descarta. Pero es suficiente para los propósitos de esta demo.
Cargar los datos
El documento import.json
contiene datos del conjunto de datos msmarco-passagetest2019-top1000
, que es un subconjunto del conjunto de datos de Clasificación de pasajes de MS MARCO.
Consta de 200 consultas, cada una acompañada de una lista de pasajes de texto relevantes. Todos los pasajes exclusivos, junto con sus ID, se han extraído de ese conjunto de datos y se han preparado para la carga masiva en Elasticsearch.
En este paso, cargue los datos en Elasticsearch y páselos a través del analizador ELSER a medida que se cargue.
El análisis de procesamiento del lenguaje natural es intensivo en cálculo, por lo que este proceso tardará varias horas (hasta 12 horas). Realizaremos la carga masiva en lotes de 100 entradas para garantizar que el almacenamiento intermedio de conducto no se desborde.
Por lo tanto, en primer lugar, divida el documento import.json
en documentos más pequeños de 100 entradas cada uno (cada entrada tiene dos líneas en el documento):
split -l 200 -a 4 import.json
Esto crea varios cientos de documentos pequeños. Impórtelos ejecutando el script upload.sh
:
./upload.sh
Para cada documento cargado, el modelo ELSER intenta inferir de qué se trata el texto y generará un grupo de palabras que considera relevantes, junto con una puntuación de relevancia. A continuación se muestra un ejemplo de un documento ingerido:
{
"_index": "test_data",
"_id": "1",
"_version": 3,
"_seq_no": 1310,
"_primary_term": 1,
"found": true,
"_source": {
"text": "This is the definition of RNA along with examples of types of RNA molecules. This is the definition of RNA along with examples of types of RNA molecules. RNA Definition",
"ml": {
"tokens": {
"molecules": 0.9468944,
"cell": 0.31727117,
"type": 0.1881346,
"lab": 0.14050934,
"example": 0.27423903,
"strand": 0.11950072,
"dna": 0.82435495,
"protein": 0.25066674,
"term": 0.5622088,
"definition": 0.21340553,
"nuclear": 0.03731725,
"different": 0.026590228,
"element": 0.42168307,
"genetic": 0.36145726,
"types": 0.7244048,
"characteristics": 0.24549837,
"adam": 0.15298073,
"rna": 1.949169,
"organism": 0.27345642,
"gene": 0.57350045,
"substance": 0.006454099,
"mrna": 1.002312,
"bond": 0.096653655,
"structure": 0.1670035,
"genome": 0.24130683,
"sequence": 0.21949387,
"q": 0.028950738,
"unit": 0.1926791,
"examples": 1.0590855,
"material": 0.034060754,
"chemical": 0.454947,
"science": 0.20523745,
"biological": 0.47201967,
"molecule": 0.92732555,
"atom": 0.021480415,
"word": 0.2971402
},
"model_id": ".elser_model_1"
}
}
}
Puede ver que ha creado relaciones más allá de las palabras reales en el texto. Por ejemplo, ha deducido que este fragmento de código es acerca de science
, genes
y dna
.
Siéntate y relájate. La importación tardará un poco de tiempo.
Buscar el conjunto de datos y comparar resultados
Una vez cargado el conjunto de datos, estará listo para probarlo, en particular la diferencia que el procesador NLP de ELSER puede hacer en la calidad de los resultados de la búsqueda. La siguiente consulta de búsqueda utilizará las señales generadas para devolver los resultados que parezcan más relevantes:
curl -k -H"Content-Type: application/json" -d@elserquery.json $ES/test_data/_search | jq .
Compárelo con una consulta que NO utilice las señales y que simplemente busque el texto original:
curl -k -H"Content-Type: application/json" -d@query.json $ES/test_data/_search | jq .
Puede intentar otras consultas cambiando el texto en los archivos query.json
y elserquery.json
. Pruebe cosas como:
what is the best exercise for stiff limbs?
o
explain how the US president is elected
En todos estos casos, los resultados mejorados por ELSER son mucho más relevantes.
Por supuesto, eso no se aplica a todas las búsquedas. Una búsqueda de taylor swift
, por ejemplo, producirá resultados similares en ambos. Por lo tanto, todo depende del tipo de búsqueda y de los datos del índice. Pero puede ver
que muchas búsquedas podrían mejorarse significativamente aplicando el modelo ELSER ML.
Derribar la infraestructura
Su Databases for Elasticsearch incurre en cargos. Después de finalizar esta guía de aprendizaje, puede eliminar toda la infraestructura yendo al directorio terraform
del proyecto y utilizando el mandato:
terraform destroy
¿Está preparado para más?
ELSER es sólo un modelo ML. Hay muchos otros y con el plan Platinum de Databases for Elasticsearch puede desplegar fácilmente otros y analizar los datos utilizándolos en su lugar. Hemos elaborado una guía de aprendizaje que le muestra cómo hacer precisamente eso