La vivientes aumentada de recuperación (RAG) es un enfoque correctamente conocido para crear IA generativa aplicaciones. RAG combina modelos de idiomas grandes (LLM) con recuperación de conocimiento mundial forastero y es cada vez más popular para asociar precisión y personalización a la IA. Recupera información relevante de fuentes externas, aumenta la entrada con estos datos y genera respuestas basadas en los dos. Este enfoque reduce las alucinaciones, restablecimiento la precisión de los hechos y permite sistemas de IA actualizados, eficientes y explicables. La capacidad de RAG para romper las limitaciones del maniquí de idioma clásico lo ha hecho aplicable a los amplios casos de uso de IA.
Servicio de Amazon OpenSearch es una útil de búsqueda y exploración versátil. Es capaz de realizar exploración de seguridad, despabilarse datos, analizar registros y muchas otras tareas. Todavía puede funcionar con datos vectoriales con un complemento de vecinos K-Nears más (K-NN), lo que lo hace útil para estrategias de búsqueda más complejas. Conveniente a esta característica, el servicio de OpenSearch puede servir como una saco de conocimiento para aplicaciones de IA generativas que integran la vivientes de idiomas con los resultados de búsqueda.
Al preservar el contexto en varios intercambios, perfeccionar las respuestas y proporcionar una experiencia de afortunado más perfecta, la búsqueda conversacional restablecimiento el trapo. Ayuda con las evacuación de información complejas, resuelve ambigüedades y gestiona el razonamiento múltiple. La búsqueda conversacional proporciona una interacción más natural y personalizada, que produce resultados más precisos y pertinentes, a pesar de que el trapo en serie funciona correctamente para consultas únicas.
En esta publicación, exploramos la búsqueda conversacional, su edificio y varias formas de implementarla.
Descripción común de la posibilidad
Caminemos por la posibilidad para construir búsqueda de conversación. El sucesivo diagrama ilustra la edificio de la posibilidad.
La nueva función de OpenSearch conocida como Agentes y herramientas se usa para crear búsqueda de conversación. Para desarrollar aplicaciones de IA sofisticadas, los agentes coordinan una variedad de tareas de formación inevitable (ML). Cada agente tiene una serie de herramientas; cada uno destinado a una función particular. Para usar agentes y herramientas, necesita OpenSearch lectura 2.13 o posterior.
Requisitos previos
Para implementar esta posibilidad, necesita una cuenta de AWS. Si no tienes uno, puedes crear una cuenta. Todavía necesita un dominio de servicio OpenSearch con OpenSearch lectura 2.13 o posterior. Puede usar un dominio existente o crear un nuevo dominio.
Para usar la incrustación de texto de Amazon Titan y los modelos antrópicos Claude V1 en el madre de roca de Amazon, debe habilitar el camino a estos modelos de saco (FMS). Para obtener instrucciones, consulte Agregue o retire el camino a los modelos de Amazon Bedrock Foundation.
Configurar permisos de IAM
Complete los siguientes pasos para configurar un AWS Identity and Access Management (IAM) rol y afortunado con permisos apropiados:
- Cree un rol de IAM con la sucesivo política que permitirá que el dominio del servicio OpenSearch invoque la API de Bedrock de Amazon:
{ "Version": "2012-10-17", "Statement": ( { "Sid": "Statement1", "Effect": "Allow", "Action": ( "bedrock:InvokeAgent", "bedrock:InvokeModel" ), "Resource": ( "arn:aws:bedrock:${Region}::foundation-model/amazon.titan-embed-text-v1", "arn:aws:bedrock: ${Region}::foundation-model/anthropic.claude-instant-v1" ) } ) }
Dependiendo de la región y el maniquí de AWS que use, especifique los de la sección de medios.
- Pegar
opensearchservice.amazonaws.com
como una entidad de confianza. - Tome nota del nombre de medios de Amazon (ARN) de IAM rol.
- Asigne la política precedente al afortunado de IAM que creará un conector.
- Crear un
passRole
Política y asignarlo al afortunado de IAM que creará el conector usando Python:{ "Version": "2012-10-17", "Statement": ( { "Effect": "Allow", "Action": "iam:PassRole", "Resource": "arn:aws:iam::${AccountId}:role/OpenSearchBedrock" } ) }
- Mapee el papel IAM que creó en el rol de dominio del servicio OpenSearch utilizando los siguientes pasos:
Establezca una conexión con el maniquí de roca origen de Amazon utilizando el complemento MLCommons
Para identificar patrones y relaciones, un maniquí de incrustación transforma los datos de entrada, como palabras o imágenes, en vectores numéricos en un espacio continuo. Los objetos similares se agrupan para entregar que los sistemas de IA comprendan y respondan a las complejas consultas de los usuarios.
Búsqueda semántica se concentra en el propósito y el significado de una consulta. OpenSearch almacena datos en un índice de vectores para la recuperación y los transforma en vectores densos (listas de números) utilizando modelos de incrustación de texto. Estamos utilizando Amazon.Titan-Embed-Text-V1 alojado en Amazon Bedrock, pero deberá evaluar y designar el maniquí adecuado para su caso de uso. El maniquí Amazon.Titan-Embed-V1 mapea las oraciones y los párrafos a un espacio vectorial denso de 1.536 dimensiones y está optimizado para la tarea de búsqueda semántica.
Complete los siguientes pasos para establecer una conexión con el maniquí de roca origen de Amazon utilizando el complemento MLCommons:
- Establezca una conexión utilizando el cliente Python con el Blueprint de conexión.
- Modifique los títulos de los parámetros de host y región en el bando de código proporcionado. Para este ejemplo, estamos ejecutando el software en Visual Studio Code con Python lectura 3.9.6, pero las versiones más nuevas además deberían funcionar.
- Para el rol ARN, use el ARN que creó anteriormente y ejecute el sucesivo script utilizando las credenciales del afortunado de IAM que creó:
import boto3 import requests from requests_aws4auth import AWS4Auth host="https://search-test.us-east-1.es.amazonaws.com/" region = 'us-east-1' service="es" credentials = boto3.Session().get_credentials() awsauth = AWS4Auth(credentials.access_key, credentials.secret_key, region, service, session_token=credentials.token) path="_plugins/_ml/connectors/_create" url = host + path payload = { "name": "Amazon Bedrock Connector: embedding", "description": "The connector to bedrock Titan embedding model", "version": 1, "protocol": "aws_sigv4", "parameters": { "region": "us-east-1", "service_name": "bedrock", "model": "amazon.titan-embed-text-v1" }, "credential": { "roleArn": "arn:aws:iam::
:role/opensearch_bedrock_external" }, "actions": ( { "action_type": "predict", "method": "POST", "url": "https://bedrock-runtime.${parameters.region}.amazonaws.com/model/${parameters.model}/invoke", "headers": { "content-type": "application/json", "x-amz-content-sha256": "required" }, "request_body": "{ "inputText": "${parameters.inputText}" }", "pre_process_function": "connector.pre_process.bedrock.embedding", "post_process_function": "connector.post_process.bedrock.embedding" } ) } headers = {"Content-Type": "application/json"} r = requests.post(url, auth=awsauth, json=payload, headers=headers, timeout=15) print(r.status_code) print(r.text) - Ejecute el software Python. Esto volverá
connector_id
.python3 connect_bedrocktitanembedding.py 200 {"connector_id":"nbBe65EByVCe3QrFhrQ2"}
- Cree un camarilla de maniquí contra el cual este maniquí se registrará en el dominio del servicio OpenSearch:
POST /_plugins/_ml/model_groups/_register { "name": "embedding_model_group", "description": "A model group for bedrock embedding models" }
Obtiene la sucesivo salida:
{ "model_group_id": "1rBv65EByVCe3QrFXL6O", "status": "CREATED" }
- Registre un maniquí usando
connector_id
ymodel_group_id
:POST /_plugins/_ml/models/_register { "name": "titan_text_embedding_bedrock", "function_name": "remote", "model_group_id": "1rBv65EByVCe3QrFXL6O", "description": "test model", "connector_id": "nbBe65EByVCe3QrFhrQ2", "interface": {} }
Obtiene la sucesivo salida:
{
"task_id": "2LB265EByVCe3QrFAb6R",
"status": "CREATED",
"model_id": "2bB265EByVCe3QrFAb60"
}
- Implementar un maniquí utilizando la ID del maniquí:
Obtiene la sucesivo salida:
{
"task_id": "bLB665EByVCe3QrF-slA",
"task_type": "DEPLOY_MODEL",
"status": "COMPLETED"
}
Ahora el maniquí está implementado, y verá que en los paneles de OpenSearch en la página de complementos de OpenSearch.
Crear una tubería de ingestión para la indexación de datos
Use el sucesivo código para crear una tubería de ingestión para la indexación de datos. La tubería establecerá una conexión con el maniquí de incrustación, recuperará la incrustación y luego la almacenará en el índice.
PUT /_ingest/pipeline/cricket_data_pipeline {
"description": "batting score summary embedding pipeline",
"processors": (
{
"text_embedding": {
"model_id": "GQOsUJEByVCe3QrFfUNq",
"field_map": {
"cricket_score": "cricket_score_embedding"
}
}
}
)
}
Crear un índice para juntar datos
Cree un índice para juntar datos (para este ejemplo, los logros de cricket de los bateadores). Este índice almacena texto bruto e incrustaciones del texto de prontuario con 1,536 dimensiones y utiliza la tubería de ingesta que creamos en el paso precedente.
PUT cricket_data {
"mappings": {
"properties": {
"cricket_score": {
"type": "text"
},
"cricket_score_embedding": {
"type": "knn_vector",
"dimension": 1536,
"space_type": "l2",
"method": {
"name": "hnsw",
"engine": "faiss"
}
}
}
},
"settings": {
"index": {
"knn": "true"
}
}
}
Ingerir datos de muestra
Use el sucesivo código para ingerir los datos de muestra para cuatro bateadores:
POST _bulk?pipeline=cricket_data_pipeline
{"index": {"_index": "cricket_data"}}
{"cricket_score": "Sachin Tendulkar, often hailed as the 'God of Cricket,' amassed an extraordinary batting record throughout his 24-year international career. In Test cricket, he played 200 matches, scoring a staggering 15,921 runs at an media of 53.78, including 51 centuries and 68 half-centuries, with a highest score of 248 not out. His One Day International (ODI) career was equally impressive, spanning 463 matches where he scored 18,426 runs at an media of 44.83, notching up 49 centuries and 96 half-centuries, with a top score of 200 not out – the first double century in ODI history. Although he played just one T20 International, scoring 10 runs, his overall batting statistics across formats solidified his status as one of cricket's all-time greats, setting numerous records that stand to this day."}
{"index": {"_index": "cricket_data"}}
{"cricket_score": "Virat Kohli, widely regarded as one of the finest batsmen of his generation, has amassed impressive statistics across all formats of international cricket. As of April 2024, in Test cricket, he has scored over 8,000 runs with an media exceeding 50, including numerous centuries. His One Day International (ODI) record is particularly stellar, with more than 12,000 runs at an media well above 50, featuring over 40 centuries. In T20 Internationals, Kohli has maintained a high media and scored over 3,000 runs. Known for his exceptional ability to chase down targets in limited-overs cricket, Kohli has consistently ranked among the top batsmen in ICC rankings and has broken several batting records throughout his career, cementing his status as a modern cricket legend."}
{"index": {"_index": "cricket_data"}}
{"cricket_score": "Adam Gilchrist, the legendary Australian wicketkeeper-batsman, had an exceptional batting record across formats during his international career from 1996 to 2008. In Test cricket, Gilchrist scored 5,570 runs in 96 matches at an impressive media of 47.60, including 17 centuries and 26 half-centuries, with a highest score of 204 not out. His One Day International (ODI) record was equally remarkable, amassing 9,619 runs in 287 matches at an media of 35.89, with 16 centuries and 55 half-centuries, and a top score of 172. Gilchrist's aggressive batting style and ability to change the course of a game quickly made him one of the most feared batsmen of his era. Although his T20 International career was brief, his overall batting statistics, combined with his wicketkeeping skills, established him as one of cricket's greatest wicketkeeper-batsmen."}
{"index": {"_index": "cricket_data"}}
{"cricket_score": "Brian Lara, the legendary West Indian batsman, had an extraordinary batting record in international cricket during his career from 1990 to 2007. In Test cricket, Lara amassed 11,953 runs in 131 matches at an impressive media of 52.88, including 34 centuries and 48 half-centuries. He holds the record for the highest individual score in a Test innings with 400 not out, as well as the highest first-class score of 501 not out. In One Day Internationals (ODIs), Lara scored 10,405 runs in 299 matches at an media of 40.48, with 19 centuries and 63 half-centuries. His highest ODI score was 169. Known for his elegant batting style and ability to play long innings, Lara's exceptional performances, particularly in Test cricket, cemented his status as one of the greatest batsmen in the history of the game."}
Implementar la LLM para la vivientes de respuesta
Use el sucesivo código para implementar el LLM para la vivientes de respuesta. Modifique los títulos de host, región y rolearn en el bando de código proporcionado.
- Cree un conector ejecutando el sucesivo software Python. Ejecute el script utilizando las credenciales del afortunado IAM creado anteriormente.
import boto3 import requests from requests_aws4auth import AWS4Auth host="https://search-test.us-east-1.es.amazonaws.com/" region = 'us-east-1' service="es" credentials = boto3.Session().get_credentials() awsauth = AWS4Auth(credentials.access_key, credentials.secret_key, region, service, session_token=credentials.token) path="_plugins/_ml/connectors/_create" url = host + path payload = { "name": "BedRock Claude instant-v1 Connector ", "description": "The connector to BedRock service for claude model", "version": 1, "protocol": "aws_sigv4", "parameters": { "region": "us-east-1", "service_name": "bedrock", "anthropic_version": "bedrock-2023-05-31", "max_tokens_to_sample": 8000, "temperature": 0.0001, "response_filter": "$.completion" }, "credential": { "roleArn": "arn:aws:iam::accountId:role/opensearch_bedrock_external" }, "actions": ( { "action_type": "predict", "method": "POST", "url": "https://bedrock-runtime.${parameters.region}.amazonaws.com/model/anthropic.claude-instant-v1/invoke", "headers": { "content-type": "application/json", "x-amz-content-sha256": "required" }, "request_body": "{"prompt":"${parameters.prompt}", "max_tokens_to_sample":${parameters.max_tokens_to_sample}, "temperature":${parameters.temperature}, "anthropic_version":"${parameters.anthropic_version}" }" } ) } headers = {"Content-Type": "application/json"} r = requests.post(url, auth=awsauth, json=payload, headers=headers, timeout=15) print(r.status_code) print(r.text)
Si se ejecutara con éxito, volvería connector_id
y un código de 200 respuesta:
200
{"connector_id":"LhLSZ5MBLD0avmh1El6Q"}
- Cree un camarilla de modelos para este maniquí:
POST /_plugins/_ml/model_groups/_register { "name": "claude_model_group", "description": "This is an example description" }
Esto devolverá model_group_id; Tomar nota de ello:
{
"model_group_id": "LxLTZ5MBLD0avmh1wV4L",
"status": "CREATED"
}
- Registre un maniquí usando
connection_id
ymodel_group_id
:POST /_plugins/_ml/models/_register { "name": "anthropic.claude-v1", "function_name": "remote", "model_group_id": "LxLTZ5MBLD0avmh1wV4L", "description": "LLM model", "connector_id": "LhLSZ5MBLD0avmh1El6Q", "interface": {} }
Volverá model_id
y task_id
:
{
"task_id": "YvbVZ5MBtVAPFbeA7ou7",
"status": "CREATED",
"model_id": "Y_bVZ5MBtVAPFbeA7ovb"
}
- Finalmente, implementa el maniquí usando una API:
El estado se mostrará como COMPLETED
. Eso significa que el maniquí se implementa con éxito.
{
"task_id": "efbvZ5MBtVAPFbeA7otB",
"task_type": "DEPLOY_MODEL",
"status": "COMPLETED"
}
Crear un agente en el servicio OpenSearch
Un agente fanfarria y ejecuta modelos y herramientas ML. Una útil realiza un conjunto de tareas específicas. Para esta publicación, utilizamos las siguientes herramientas:
VectorDBTool
– El agente usa esta útil para recuperar documentos de OpenSearch relevantes para la pregunta del afortunadoMLModelTool
– Esta útil genera respuestas del afortunado basadas en documentos de indicación y opción
Use la incrustación model_id
en VectorDBTool
y llm model_id
en MLModelTool
:
POST /_plugins/_ml/agents/_register {
"name": "cricket score data analysis agent",
"type": "conversational_flow",
"description": "This is a demo agent for cricket data analysis",
"app_type": "rag",
"memory": {
"type": "conversation_index"
},
"tools": (
{
"type": "VectorDBTool",
"name": "cricket_knowledge_base",
"parameters": {
"model_id": "2bB265EByVCe3QrFAb60",
"index": "cricket_data",
"embedding_field": "cricket_score_embedding",
"source_field": (
"cricket_score"
),
"input": "${parameters.question}"
}
},
{
"type": "MLModelTool",
"name": "bedrock_claude_model",
"description": "A común tool to answer any question",
"parameters": {
"model_id": "gbcfIpEByVCe3QrFClUp",
"prompt": "nnHuman:You are a professional data analysist. You will always answer question based on the given context first. If the answer is not directly shown in the context, you will analyze the data and find the answer. If you don't know the answer, just say don't know. nnContext:n${parameters.cricket_knowledge_base.output:-}nn${parameters.chat_history:-}nnHuman:${parameters.question}nnAssistant:"
}
}
)
}
Esto devuelve una ID de agente; Tome nota de la ID del agente, que se utilizará en API posteriores.
Consulta el índice
Tenemos puntajes de bautizo de cuatro bateadores en el índice. Para la primera consulta, especifiquemos el nombre del componente:
POST /_plugins/_ml/agents//_execute {
"parameters": {
"question": "What is batting score of Sachin Tendulkar ?"
}
}
Según el contexto y la información arreglado, devuelve el puntaje de bautizo de Sachin Tendulkar. Tenga en cuenta el Memory_ID de la respuesta; Lo necesitará para preguntas posteriores en los próximos pasos.
Podemos hacer una pregunta de seguimiento. Esta vez, no especificamos el nombre del componente y esperamos que responda en función de la pregunta precedente:
POST /_plugins/_ml/agents//_execute {
"parameters": {
"question": " How many T20 international match did he play?",
"next_action": "then compare with Virat Kohlis score",
"memory_id": "so-vAJMByVCe3QrFYO7j",
"message_history_limit": 5,
"prompt": "nnHuman:You are a professional data analysist. You will always answer question based on the given context first. If the answer is not directly shown in the context, you will analyze the data and find the answer. If you don't know the answer, just say don't know. nnContext:n${parameters.population_knowledge_base.output:-}nn${parameters.chat_history:-}nnHuman:always learn useful information from chat historynHuman:${parameters.question}, ${parameters.next_action}nnAssistant:"
}
}
En la API precedente, utilizamos los siguientes parámetros:
Question
yNext_action
– Todavía pasamos la próxima actividad para comparar el puntaje de Sachin con la puntuación de Virat.Memory_id
– Esta es la memoria asignada a esta conversación. Usa lo mismomemory_id
para preguntas posteriores.Prompt
– Este es el aviso que le das al LLM. Incluye la pregunta del afortunado y la próxima actividad. El LLM debe reponer solo utilizando los datos indexados en OpenSearch y no debe inventar ninguna información. De esta guisa, evitas la sueño.
Referirse a Aparejo de maniquí ML Para obtener más detalles sobre la configuración de estos parámetros y el Repositorio de Github para planos para inferencias remotas.
La útil almacena el historial de conversación de las preguntas y respuestas en el índice de OpenSearch, que se utiliza para refinar las respuestas haciendo preguntas de seguimiento.
En escenarios del mundo auténtico, puedes mapear memory_id
contra el perfil del afortunado para preservar el contexto y aislar el historial de conversación del afortunado.
Hemos demostrado cómo crear una aplicación de búsqueda conversacional utilizando las características incorporadas del servicio OpenSearch.
Hurtar
Para evitar incurrir en cargos futuros, elimine los medios creados mientras construye esta posibilidad:
Conclusión
En esta publicación, demostramos cómo usar agentes y herramientas de OpenSearch para crear una tubería RAG con búsqueda de conversación. Al integrarse con los modelos ML, las preguntas de vectorización e interactuar con LLM para mejorar las indicaciones, esta configuración supervisa todo el proceso. Este método le permite desarrollar rápidamente asistentes de IA que estén listos para la producción sin tener que comenzar desde cero.
Si está construyendo una tubería de trapo con un historial de conversación para permitir que los usuarios hagan preguntas de seguimiento para respuestas más refinadas, ¡intente compartir sus comentarios o preguntas en los comentarios!
Sobre el autor
Bharav Patel es un arquitecto de soluciones especializado, Analytics en Amazon Web Services. Principalmente trabaja en el servicio Amazon OpenSearch y ayuda a los clientes con conceptos secreto y principios de diseño de la ejecución de cargas de trabajo de OpenSearch en la cirro. A Bharav le gusta explorar nuevos lugares y probar diferentes cocinas.