Construa a pesquisa de IA conversacional com o Amazon OpenEarch Service


A geração aumentada de recuperação (RAG) é uma abordagem bem conhecida para criar AI generativa Aplicações. O RAG combina grandes modelos de linguagem (LLMS) com recuperação de conhecimento mundial externa e é cada vez mais standard para adicionar precisão e personalização à IA. Ele recupera informações relevantes de fontes externas, aumenta a entrada com esses dados e gera respostas com base em ambos. Essa abordagem reduz as alucinações, melhora a precisão dos fatos e permite sistemas de IA atualizados, eficientes e explicáveis. A capacidade do RAG de romper as limitações do modelo de linguagem clássica tornou aplicável a amplos casos de uso de IA.

Amazon OpenSearch Service é uma ferramenta versátil de pesquisa e análise. É capaz de executar análises de segurança, pesquisar dados, analisar logs e muitas outras tarefas. Ele também pode funcionar com dados vetoriais com um plug-in Ok-NN (Ok-NN), o que torna útil para estratégias de pesquisa mais complexas. Devido a esse recurso, o Serviço de Opensearch pode servir como uma base de conhecimento para aplicativos generativos de IA que integram a geração de idiomas aos resultados da pesquisa.

Ao preservar o contexto sobre várias trocas, aprimorar as respostas e proporcionar uma experiência mais perfeita para o usuário, a pesquisa de conversação aprimora o RAG. Ajuda com necessidades complexas de informações, resolve ambiguidades e gerencia o raciocínio de várias turnos. A pesquisa de conversação fornece uma interação mais pure e personalizada, produzindo resultados mais precisos e pertinentes, embora o RAG padrão tenha um bom desempenho para consultas únicas.

Nesta postagem, exploramos a pesquisa de conversação, sua arquitetura e várias maneiras de implementá -la.

Visão geral da solução

Vamos percorrer a solução para criar pesquisas de conversação. O diagrama a seguir ilustra a arquitetura da solução.

Construa a pesquisa de IA conversacional com o Amazon OpenEarch Service

O novo recurso de opensearch conhecido como agentes e ferramentas é usado para criar pesquisa de conversação. Para desenvolver aplicativos sofisticados de IA, os agentes coordenam uma variedade de tarefas de aprendizado de máquina (ML). Todo agente possui várias ferramentas; cada um destinado a uma função específica. Para usar agentes e ferramentas, você precisa do OpenSearch versão 2.13 ou posterior.

Pré -requisitos

Para implementar esta solução, você precisa de uma conta da AWS. Se você não tem um, você pode criar uma conta. Você também precisa de um domínio do serviço de opensearch com o OpenEarch versão 2.13 ou posterior. Você pode usar um domínio existente ou Crie um novo domínio.

Para usar os modelos Amazon Titan Textual content Incoredding e Antropic Claude V1 no Amazon Bedrock, você precisa permitir o acesso a esses modelos de fundação (FMS). Para instruções, consulte Adicione ou remova o acesso aos modelos da Amazon Bedrock Basis.

Configure as permissões do IAM

Full as seguintes etapas para configurar um AWS Identification and Entry Administration (IAM) função e usuário com permissões apropriadas:

  1. Crie uma função de IAM com a seguinte política que permitirá que o domínio do serviço de opensearch invocar a API da Amazon Bedrock:
    {
        "Model": "2012-10-17",
        "Assertion": (
            {
                "Sid": "Statement1",
                "Impact": "Permit",
                "Motion": (
                    "bedrock:InvokeAgent",
                    "bedrock:InvokeModel"
                ),
                "Useful resource": (
                    "arn:aws:bedrock:${Area}::foundation-model/amazon.titan-embed-text-v1",
                    "arn:aws:bedrock: ${Area}::foundation-model/anthropic.claude-instant-v1"
                )
            }
        )
    }
    

Dependendo da região e do modelo da AWS que você usa, especifique os da seção de recursos.

  1. Adicionar opensearchservice.amazonaws.com como uma entidade confiável.
  2. Anote o nome do IAM ROUM Amazon Nome (ARN).
  3. Atribua a política anterior ao usuário do IAM que criará um conector.
  4. Crie a passRole Política e atribua -o ao usuário do IAM que criará o conector usando o Python:
    {
        "Model": "2012-10-17",
        "Assertion": (
            {
                "Impact": "Permit",
                "Motion": "iam:PassRole",
                "Useful resource": "arn:aws:iam::${AccountId}:position/OpenSearchBedrock"
            }
        )
    }
  5. Mapeie a função do IAM que você criou para a função de domínio do serviço de opensearch usando as seguintes etapas:
    • Faça login no painel do OpenSearch e abra a página de segurança no menu de navegação.
    • Escolha funções e selecione ml_all_access.
    • Escolha usuários mapeados e gerencie o mapeamento.
    • Sob usuários, adicione o ARN do usuário do IAM que você criou.

Estabeleça uma conexão com o modelo Amazon Bedrock usando o plug -in MLCommons

Para identificar padrões e relacionamentos, um modelo de incorporação transforma dados de entrada – como palavras ou imagens – em vetores numéricos em um espaço contínuo. Objetos semelhantes são agrupados para facilitar para os sistemas de IA compreender e responder a perguntas intrincadas do usuário.

Pesquisa semântica concentra -se no objetivo e no significado de uma consulta. O OpenEarch armazena dados em um índice vetorial para recuperação e o transforma em vetores densos (listas de números) usando modelos de incorporação de texto. Estamos usando o Amazon.titan-embebed-text-v1 hospedado no Amazon Bedrock, mas você precisará avaliar e escolher o modelo certo para o seu caso de uso. O modelo Amazon.Titan-Enced-Textual content-V1 mapeia frases e parágrafos para um espaço vetorial denso de 1.536 dimensões e é otimizado para a tarefa de pesquisa semântica.

Full as etapas a seguir para estabelecer uma conexão com o modelo Amazon Bedrock usando o plug -in MLCommons:

  1. Estabeleça uma conexão usando o cliente Python com o plano de conexão.
  2. Modifique os valores dos parâmetros do host e região no bloco de código fornecido. Neste exemplo, estamos executando o programa no Código do Visible Studio com o Python versão 3.9.6, mas as versões mais recentes também devem funcionar.
  3. Para a função ARN, use o ARN que você criou anteriormente e execute o script a seguir usando as credenciais do usuário do IAM que você criou:
    import boto3
    import requests 
    from requests_aws4auth import AWS4Auth
    
    host="https://search-test.us-east-1.es.amazonaws.com/"
    area = 'us-east-1'
    service="es"
    credentials = boto3.Session().get_credentials()
    awsauth = AWS4Auth(credentials.access_key, credentials.secret_key, area, service, session_token=credentials.token)
    
    path="_plugins/_ml/connectors/_create"
    url = host + path
    
    payload = {
      "identify": "Amazon Bedrock Connector: embedding",
      "description": "The connector to bedrock Titan embedding mannequin",
      "model": 1,
      "protocol": "aws_sigv4",
      "parameters": {
        "area": "us-east-1",
        "service_name": "bedrock",
        "mannequin": "amazon.titan-embed-text-v1"
      },
      "credential": {
        "roleArn": "arn:aws:iam:::position/opensearch_bedrock_external"
      },
      "actions": (
        {
          "action_type": "predict",
          "methodology": "POST",
          "url": "https://bedrock-runtime.${parameters.area}.amazonaws.com/mannequin/${parameters.mannequin}/invoke",
          "headers": {
            "content-type": "software/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 material-Kind": "software/json"}
    
    r = requests.publish(url, auth=awsauth, json=payload, headers=headers, timeout=15)
    print(r.status_code)
    print(r.textual content)
    
  4. Execute o programa Python. Isso retornará connector_id.
    python3 connect_bedrocktitanembedding.py
    200
    {"connector_id":"nbBe65EByVCe3QrFhrQ2"}
  5. Crie um grupo modelo contra o qual esse modelo será registrado no domínio do serviço de opensearch:
    POST /_plugins/_ml/model_groups/_register
    {
      "identify": "embedding_model_group",
      "description": "A mannequin group for bedrock embedding fashions"
    }

    Você obtém a seguinte saída:

    {
      "model_group_id": "1rBv65EByVCe3QrFXL6O",
      "standing": "CREATED"
    }
  6. Registrar um modelo usando connector_id e model_group_id:
    POST /_plugins/_ml/fashions/_register
    {
        "identify": "titan_text_embedding_bedrock",
        "function_name": "distant",
        "model_group_id": "1rBv65EByVCe3QrFXL6O",
        "description": "check mannequin",
        "connector_id": "nbBe65EByVCe3QrFhrQ2",
       "interface": {}
    }

Você obtém a seguinte saída:

{
  "task_id": "2LB265EByVCe3QrFAb6R",
  "standing": "CREATED",
  "model_id": "2bB265EByVCe3QrFAb60"
}
  1. Implante um modelo usando o ID do modelo:
POST /_plugins/_ml/fashions/2bB265EByVCe3QrFAb60/_deploy

Você obtém a seguinte saída:

{
  "task_id": "bLB665EByVCe3QrF-slA",
  "task_type": "DEPLOY_MODEL",
  "standing": "COMPLETED"
}

Agora, o modelo está implantado e você verá isso na página OpenSearch na página OpenEarch Plugins.

Crie um pipeline de ingestão para indexação de dados

Use o código a seguir para criar um pipeline de ingestão para indexação de dados. O pipeline estabelecerá uma conexão com o modelo de incorporação, recuperará a incorporação e o armazenará no índice.

PUT /_ingest/pipeline/cricket_data_pipeline {
    "description": "batting rating abstract embedding pipeline",
    "processors": (
        {
            "text_embedding": {
                "model_id": "GQOsUJEByVCe3QrFfUNq",
                "field_map": {
                    "cricket_score": "cricket_score_embedding"
                }
            }
        }
    )
}

Crie um índice para armazenar dados

Crie um índice para armazenar dados (para este exemplo, as realizações de críquete de batedores). Este índice armazena texto bruto e incorporação do texto sumário com 1.536 dimensões e usa o pipeline ingestão que criamos na etapa anterior.

PUT cricket_data {
    "mappings": {
        "properties": {
            "cricket_score": {
                "sort": "textual content"
            },
            "cricket_score_embedding": {
                "sort": "knn_vector",
                "dimension": 1536,
                "space_type": "l2",
                "methodology": {
                    "identify": "hnsw",
                    "engine": "faiss"
                }
            }
        }
    },
    "settings": {
        "index": {
            "knn": "true"
        }
    }
}

Ingestão de dados de amostra

Use o código a seguir para ingerir os dados da amostra de quatro batedores:

POST _bulk?pipeline=cricket_data_pipeline
{"index": {"_index": "cricket_data"}}
{"cricket_score": "Sachin Tendulkar, usually hailed because the 'God of Cricket,' amassed a unprecedented batting file all through his 24-year worldwide profession. In Take a look at cricket, he performed 200 matches, scoring a staggering 15,921 runs at a median of 53.78, together with 51 centuries and 68 half-centuries, with a highest rating of 248 not out. His One Day Worldwide (ODI) profession was equally spectacular, spanning 463 matches the place he scored 18,426 runs at a median of 44.83, notching up 49 centuries and 96 half-centuries, with a high rating of 200 not out – the primary double century in ODI historical past. Though he performed only one T20 Worldwide, scoring 10 runs, his general batting statistics throughout codecs solidified his standing as one in all cricket's all-time greats, setting quite a few data that stand to today."}
{"index": {"_index": "cricket_data"}}
{"cricket_score": "Virat Kohli, extensively thought to be one of many most interesting batsmen of his era, has amassed spectacular statistics throughout all codecs of worldwide cricket. As of April 2024, in Take a look at cricket, he has scored over 8,000 runs with a median exceeding 50, together with quite a few centuries. His One Day Worldwide (ODI) file is especially stellar, with greater than 12,000 runs at a median nicely above 50, that includes over 40 centuries. In T20 Internationals, Kohli has maintained a excessive common and scored over 3,000 runs. Recognized for his distinctive means to chase down targets in limited-overs cricket, Kohli has constantly ranked among the many high batsmen in ICC rankings and has damaged a number of batting data all through his profession, cementing his standing as a contemporary cricket legend."}
{"index": {"_index": "cricket_data"}}
{"cricket_score": "Adam Gilchrist, the legendary Australian wicketkeeper-batsman, had an distinctive batting file throughout codecs throughout his worldwide profession from 1996 to 2008. In Take a look at cricket, Gilchrist scored 5,570 runs in 96 matches at a powerful common of 47.60, together with 17 centuries and 26 half-centuries, with a highest rating of 204 not out. His One Day Worldwide (ODI) file was equally exceptional, amassing 9,619 runs in 287 matches at a median of 35.89, with 16 centuries and 55 half-centuries, and a high rating of 172. Gilchrist's aggressive batting model and talent to vary the course of a recreation rapidly made him some of the feared batsmen of his period. Though his T20 Worldwide profession was transient, his general batting statistics, mixed along with his wicketkeeping expertise, established him as one in all cricket's biggest wicketkeeper-batsmen."}
{"index": {"_index": "cricket_data"}}
{"cricket_score": "Brian Lara, the legendary West Indian batsman, had a unprecedented batting file in worldwide cricket throughout his profession from 1990 to 2007. In Take a look at cricket, Lara amassed 11,953 runs in 131 matches at a powerful common of 52.88, together with 34 centuries and 48 half-centuries. He holds the file for the very best particular person rating in a Take a look at innings with 400 not out, in addition to the very best first-class rating of 501 not out. In One Day Internationals (ODIs), Lara scored 10,405 runs in 299 matches at a median of 40.48, with 19 centuries and 63 half-centuries. His highest ODI rating was 169. Recognized for his elegant batting model and talent to play lengthy innings, Lara's distinctive performances, significantly in Take a look at cricket, cemented his standing as one of many biggest batsmen within the historical past of the sport."}

Implantar o LLM para geração de resposta

Use o código a seguir para implantar o LLM para geração de respostas. Modifique os valores do host, região e rolearn no bloco de código fornecido.

  1. Crie um conector executando o seguinte programa Python. Execute o script usando as credenciais do usuário do IAM criado anteriormente.
    import boto3
    import requests 
    from requests_aws4auth import AWS4Auth
    
    host="https://search-test.us-east-1.es.amazonaws.com/"
    area = 'us-east-1'
    service="es"
    credentials = boto3.Session().get_credentials()
    awsauth = AWS4Auth(credentials.access_key, credentials.secret_key, area, service, session_token=credentials.token)
    
    path="_plugins/_ml/connectors/_create"
    url = host + path
    
    payload = {
      "identify": "BedRock Claude instant-v1 Connector ",
      "description": "The connector to BedRock service for claude mannequin",
      "model": 1,
      "protocol": "aws_sigv4",
      "parameters": {
        "area": "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:position/opensearch_bedrock_external"
        },
      "actions": (
        {
          "action_type": "predict",
          "methodology": "POST",
          "url": "https://bedrock-runtime.${parameters.area}.amazonaws.com/mannequin/anthropic.claude-instant-v1/invoke",
          "headers": {
            "content-type": "software/json",
            "x-amz-content-sha256": "required"
          },
          "request_body": "{"immediate":"${parameters.immediate}", "max_tokens_to_sample":${parameters.max_tokens_to_sample}, "temperature":${parameters.temperature},  "anthropic_version":"${parameters.anthropic_version}" }"
        }
      )
     }
        
    
    headers = {"Content material-Kind": "software/json"}
    
    r = requests.publish(url, auth=awsauth, json=payload, headers=headers, timeout=15)
    print(r.status_code)
    print(r.textual content)

Se funcionasse com sucesso, retornaria connector_id e um código de 200-resposta:

200
{"connector_id":"LhLSZ5MBLD0avmh1El6Q"}
  1. Crie um grupo modelo para este modelo:
    POST /_plugins/_ml/model_groups/_register
    {
        "identify": "claude_model_group",
        "description": "That is an instance description"
    }

Isso retornará model_group_id; anote:

{
  "model_group_id": "LxLTZ5MBLD0avmh1wV4L",
  "standing": "CREATED"
}
  1. Registrar um modelo usando connection_id e model_group_id:
    POST /_plugins/_ml/fashions/_register
    {
        "identify": "anthropic.claude-v1",
        "function_name": "distant",
        "model_group_id": "LxLTZ5MBLD0avmh1wV4L",
        "description": "LLM mannequin",
        "connector_id": "LhLSZ5MBLD0avmh1El6Q",
        "interface": {}
    }
    

Vai retornar model_id e task_id:

{
  "task_id": "YvbVZ5MBtVAPFbeA7ou7",
  "standing": "CREATED",
  "model_id": "Y_bVZ5MBtVAPFbeA7ovb"
}
  1. Finalmente, implante o modelo usando uma API:
POST /_plugins/_ml/fashions/Y_bVZ5MBtVAPFbeA7ovb/_deploy

O standing mostrará como COMPLETED. Isso significa que o modelo é implantado com sucesso.

{
  "task_id": "efbvZ5MBtVAPFbeA7otB",
  "task_type": "DEPLOY_MODEL",
  "standing": "COMPLETED"
}

Crie um agente no Serviço de Pesquisa Open

Um agente orquestra e executa modelos e ferramentas ML. Uma ferramenta executa um conjunto de tarefas específicas. Para esta postagem, usamos as seguintes ferramentas:

  • VectorDBTool – O agente usa esta ferramenta para recuperar documentos OpenSearch relevantes para a questão do usuário
  • MLModelTool – Esta ferramenta gera respostas do usuário com base em prompts e documentos do OpenSearch

Use a incorporação model_id em VectorDBTool e llm model_id em MLModelTool:

POST /_plugins/_ml/brokers/_register {
    "identify": "cricket rating knowledge evaluation agent",
    "sort": "conversational_flow",
    "description": "It is a demo agent for cricket knowledge evaluation",
    "app_type": "rag",
    "reminiscence": {
        "sort": "conversation_index"
    },
    "instruments": (
        {
            "sort": "VectorDBTool",
            "identify": "cricket_knowledge_base",
            "parameters": {
                "model_id": "2bB265EByVCe3QrFAb60",
                "index": "cricket_data",
                "embedding_field": "cricket_score_embedding",
                "source_field": (
                    "cricket_score"
                ),
                "enter": "${parameters.query}"
            }
        },
        {
            "sort": "MLModelTool",
            "identify": "bedrock_claude_model",
            "description": "A basic device to reply any query",
            "parameters": {
                "model_id": "gbcfIpEByVCe3QrFClUp",
                "immediate": "nnHuman:You're a skilled knowledge analysist. You'll all the time reply query based mostly on the given context first. If the reply shouldn't be straight proven within the context, you'll analyze the information and discover the reply. If you do not know the reply, simply say do not know. nnContext:n${parameters.cricket_knowledge_base.output:-}nn${parameters.chat_history:-}nnHuman:${parameters.query}nnAssistant:"
            }
        }
    )
}

Isso retorna um ID do agente; Tome nota do ID do agente, que será usado nas APIs subsequentes.

Consulte o índice

Temos pontuações de rebatidas de quatro batedores no índice. Para a primeira consulta, vamos especificar o nome do jogador:

POST /_plugins/_ml/brokers//_execute {
    "parameters": {
        "query": "What's batting rating of Sachin Tendulkar ?"
    }
}

Com base no contexto e nas informações disponíveis, ele retorna a pontuação de rebatidas de Sachin Tendulkar. Observe o memória_id da resposta; Você precisará disso para perguntas subsequentes nas próximas etapas.

Podemos fazer uma pergunta de acompanhamento. Desta vez, não especificamos o nome do jogador e esperamos que ele responda com base na pergunta anterior:

POST /_plugins/_ml/brokers//_execute {
    "parameters": {
        "query": " What number of T20 worldwide match did he play?",
        "next_action": "then examine with Virat Kohlis rating",
        "memory_id": "so-vAJMByVCe3QrFYO7j",
        "message_history_limit": 5,
        "immediate": "nnHuman:You're a skilled knowledge analysist. You'll all the time reply query based mostly on the given context first. If the reply shouldn't be straight proven within the context, you'll analyze the information and discover the reply. If you do not know the reply, simply say do not know. nnContext:n${parameters.population_knowledge_base.output:-}nn${parameters.chat_history:-}nnHuman:all the time be taught helpful info from chat historynHuman:${parameters.query}, ${parameters.next_action}nnAssistant:"
    }
}

Na API anterior, usamos os seguintes parâmetros:

  • Query e Next_action – Também passamos a próxima ação para comparar a pontuação de Sachin com a pontuação de Virat.
  • Memory_id – Esta é a memória atribuída a esta conversa. Use o mesmo memory_id Para perguntas subsequentes.
  • Immediate – Este é o immediate que você dá ao LLM. Inclui a pergunta do usuário e a próxima ação. O LLM deve responder apenas usando os dados indexados no OpenEarch e não deve inventar nenhuma informação. Dessa forma, você evita a alucinação.

Consulte Ferramenta de modelo ML Para mais detalhes sobre a criação desses parâmetros e o Repo Github Para plantas para inferências remotas.

A ferramenta armazena o histórico de conversas das perguntas e respostas no Índice OpenEarch, que é usado para refinar as respostas fazendo perguntas de acompanhamento.

Em cenários do mundo actual, você pode mapear memory_id Contra o perfil do usuário para preservar o contexto e isolar o histórico de conversas do usuário.

Demonstramos como criar um aplicativo de pesquisa de conversação usando os recursos internos do OpenEarch Service.

Limpar

Para evitar incorrer em cobranças futuras, exclua os recursos criados ao criar esta solução:

  1. Exclua o domínio do serviço OpenEarch.
  2. Exclua o conector.
  3. Exclua o índice.

Conclusão

Nesta postagem, demonstramos como usar agentes e ferramentas do OpenEarch para criar um pipeline RAG com a pesquisa de conversação. Ao integrar os modelos ML, vetorizar perguntas e interagir com o LLMS para melhorar os avisos, essa configuração supervisiona todo o processo. Este método permite que você desenvolva rapidamente assistentes de IA que estão prontos para produção sem ter que começar do zero.

Se você estiver construindo um oleoduto RAG com histórico de conversação para permitir que os usuários façam perguntas de acompanhamento para obter respostas mais refinadas, experimente e compartilhe seus comentários ou perguntas nos comentários!


Sobre o autor

Bharav Patel é um arquiteto de solução especializado, Analytics na Amazon Net Companies. Ele trabalha principalmente no Amazon OpenEarch Service e ajuda os clientes com conceitos -chave e princípios de design da execução de cargas de trabalho do OpenEarch na nuvem. Bharav gosta de explorar novos lugares e experimentar cozinhas diferentes.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *