Ao utilizar o pipeline criado na etapa anterior, o próximo passo é a criação de um índice. Os dados de população que foram preparados previamente podem ser usados como a base para esse índice, que passará a referenciar o pipeline. Para indexar vetores, é necessário configurar o índice com a definição index.knn: true, o tipo knn_vector e a dimensão do vetor que depende do modelo de embedding utilizado. A escolha do motor de busca e o tipo de espaço, juntamente com os parâmetros adequados, devem ser especificados para garantir que o processo de busca seja eficaz e otimizado. A adição de dados nesse passo envolve uma lista de falhas previamente descrita.
Ao construir um pipeline RAG (Retrieval-Augmented Generation), é essencial dividir corretamente os documentos do vetor em pedaços menores, ajustando o tamanho dos "chunks" de conteúdo específico e escolhendo os modelos de linguagem (LLMs) adequados, levando em consideração o comprimento do contexto necessário. Em algumas situações, pode ser necessário utilizar uma cadeia complexa de múltiplos LLMs, principalmente quando o conteúdo a ser processado ultrapassa a capacidade de contexto de um único modelo. O tamanho do "chunk" é um fator crítico para o desempenho do RAG, pois a geração de respostas durante a fase de busca depende em grande parte da capacidade de localizar o contexto adequado. Na fase de busca, é comum examinar apenas um pequeno pedaço do texto original, em vez de analisar o documento inteiro. Como consequência, o tamanho total do prompt deve ser compatível com o painel de contexto do LLM, sem ultrapassá-lo. Evitar tamanhos de "chunk" muito grandes e equilibrá-los com o tamanho esperado da consulta é essencial para a performance. Tamanhos típicos de "chunk" podem variar entre 100 e 600 tokens, dependendo do modelo de LLM utilizado.
Após a configuração do índice, como ilustrado no exemplo de criação de dados de população de várias áreas metropolitanas, a configuração de um modelo LLM torna-se necessária para realizar buscas semânticas. Para isso, é recomendado configurar um conector para o serviço LLM ou usar uma alternativa de terceiros. A partir da versão 2.9 do OpenSearch, o conector LLM simplifica o processo de conversão de consultas de busca em embeddings vetoriais, eliminando grande parte da complexidade de vetorização e busca. A utilização de um conector LLM integrado permite a conversão automática das consultas em embeddings e facilita a execução de buscas semânticas.
Para utilizar um modelo LLM externo, como o OpenAI, deve-se criar um conector para integrá-lo ao sistema. O conector deve ser configurado com o endpoint apropriado, como o serviço público da OpenAI, e o modelo desejado, como o GPT-3.5. O conector é responsável por gerenciar a autenticação, usando uma chave de API para autorizar as requisições, e enviar as mensagens de consulta adequadas ao modelo de LLM.
A criação do conector também reduz a necessidade de implementar lógica adicional para embutir e buscar dados no backend. Com o OpenSearch, os dados podem ser automaticamente embutidos e a busca semântica pode ser realizada de maneira mais eficiente. Quando o conector é criado, ele hospeda o modelo e permite que o OpenSearch utilize os resultados das inferências para realizar as consultas.
Ao utilizar o conector, a configuração do modelo deve ser feita de forma cuidadosa para garantir que o modelo de LLM esteja registrado e implantado corretamente. A implantação de um modelo LLM no OpenSearch envolve o registro do modelo, seguido pela sua implantação no sistema. Para isso, o OpenSearch proporciona uma interface simples, que permite registrar o modelo e associá-lo a um grupo de modelos, além de permitir a criação de um ID exclusivo para cada modelo registrado.
Uma vez que os modelos e os conectores estão configurados, pode-se criar uma aplicação RAG interativa, onde um agente gerencia o fluxo de execução dos modelos. Esse agente pode combinar várias ferramentas, como o VectorDBTool e o MLModelTool, para buscar informações no índice e gerar respostas. O VectorDBTool é usado para buscar documentos no OpenSearch que estejam relacionados à consulta do usuário. Ele coleta as informações e as converte em embeddings vetoriais, que são armazenados no índice. O MLModelTool, por sua vez, é responsável por receber a consulta do usuário, construir uma consulta a partir dessa entrada, executar a busca vetorial no índice OpenSearch e gerar uma resposta.
Ao construir esse tipo de aplicação, a integração entre os diferentes componentes e a correta configuração de cada etapa são fundamentais para garantir a precisão e a eficiência da busca semântica. O sucesso do processo depende da escolha adequada do tamanho dos "chunks", da configuração do modelo de LLM, da criação e integração dos conectores, e da implementação correta da cadeia de agentes.
Além disso, é crucial que o sistema tenha flexibilidade para lidar com consultas complexas, utilizando múltiplos modelos ou ajustando o tamanho dos "chunks" conforme necessário. A interação entre as diferentes ferramentas e modelos deve ser otimizada para garantir que o sistema consiga fornecer respostas rápidas e relevantes aos usuários, mesmo quando o conjunto de dados é grande e complexo. O uso de RAG pode revolucionar a maneira como informações são recuperadas e geradas, mas para isso, cada etapa do pipeline deve ser configurada e gerida com precisão e atenção aos detalhes técnicos.
Como Diagnosticar e Corrigir Falhas em Traces na Observabilidade de Sistemas
A observabilidade começa com os traces de ponta a ponta (E2E), uma ferramenta essencial para compreender com precisão a latência e os erros que ocorrem em cada seção de um sistema. Com um trace, é possível identificar rapidamente onde um problema pode ter ocorrido, permitindo uma análise mais rápida e precisa. No entanto, é importante entender como os traces funcionam e como solucioná-los quando falham, ou quando a instrumentação não está funcionando corretamente. Embora soluções comerciais de observabilidade ofereçam automação e serviços de consultoria que tornam a operação mais conveniente, isso pode dificultar a adoção de soluções open source no futuro. Além disso, muitas organizações enfrentam desafios ao implementar observabilidade devido a questões como preferências técnicas de SRE, orientação organizacional e orçamento.
Uma das dificuldades mais comuns na implementação de observabilidade é que as organizações frequentemente utilizam várias soluções, combinando ferramentas comerciais e open source de forma não intencional, o que pode resultar em uma gestão fragmentada. As soluções comerciais, embora ofereçam muitos recursos úteis e convenientes, podem ser caras, limitando a capacidade de aproveitar todo o seu potencial. Para adotar uma solução open source eficaz, é necessário ter as habilidades técnicas dentro da própria equipe, o que pode ser difícil de internalizar rapidamente e demanda tempo para ser incorporado à cultura e aos processos da organização.
Mesmo quando se utiliza uma solução comercial de observabilidade, a configuração de traces de ponta a ponta continua sendo um desafio. Mesmo as melhores soluções de tracing, reconhecidas por organizações como o Gartner, enfrentam problemas de falhas em traces. Esses problemas podem surgir por diversas razões, como configuração inadequada dos traces ou erros na instrumentação. Quando ocorre uma falha, torna-se difícil identificar a causa e validá-la. Se os traces são configurados com instrumentação automática, um engenheiro de confiabilidade de site (SRE) pode não ter conhecimento suficiente do negócio para saber se um span foi interrompido ou desconectado durante o processo, ou se isso é um comportamento esperado. A falta de compreensão sobre observabilidade por parte dos desenvolvedores e a falta de conhecimento técnico por parte dos SREs tornam difícil a correção de falhas, mesmo quando os spans estão anormais.
Em organizações grandes, como bancos e telecomunicações, onde existem múltiplos tipos de transações, pode-se configurar um trace para entender aproximadamente quantos spans são gerados por um processo de negócios específico. Isso pode ajudar a identificar se algum serviço está interrompendo ou gerando spans incorretamente. No entanto, quando a instrumentação falha, o diagnóstico e a correção tornam-se extremamente difíceis. Muitas vezes, o problema é causado pelo agente de instrumentação que pode estar utilizando métodos errados ou injetando bytecodes incorretos. Por isso, é importante identificar quais métodos o agente tentou instrumentar. O uso de perfis e depuração pode ajudar a solucionar bugs e problemas inesperados de instrumentação.
Uma ferramenta como o OpenTelemetry pode ser extremamente útil para depurar internamente a instrumentação do agente. Por ser open source, permite analisar o código e identificar rapidamente se a instrumentação foi realizada de forma correta. Em contrapartida, agentes de observabilidade comerciais não expõem seus detalhes internos, o que dificulta o diagnóstico e a depuração. Quando isso ocorre, é necessário olhar para a árvore de chamadas e o stack trace do perfil, para garantir que os métodos corretos estão sendo instrumentados. Em casos como o Java, onde as dependências são complexas, a árvore de chamadas ajuda a entender a interdependência entre os processos, enquanto o stack trace fornece informações detalhadas sobre threads e timestamps.
Para garantir que a observabilidade seja eficaz, é crucial que haja um padrão claro de nomenclatura e convenções de processo. Antes de corrigir qualquer problema técnico, é fundamental entender os objetivos de desenvolvimento seguidos pelos times. Caso diferentes equipes de desenvolvimento adotem diferentes padrões para a observabilidade, o SRE pode acabar com múltiplos sistemas de observabilidade desconexos. No entanto, se houver um padrão bem definido e compreendido por todos os desenvolvedores, será possível construir uma observabilidade sólida em toda a organização.
Ao implementar a observabilidade, a governança também desempenha um papel essencial. Embora possa ser desafiadora, a governança de observabilidade deve ser projetada com processos e procedimentos claros que ajudem a gerenciar e aprimorar a complexidade do sistema. Definir uma estrutura e convenções de nomenclatura para sinais de observabilidade é fundamental. Antes de começar a configurar a instrumentação, é importante ter uma compreensão clara dos sinais existentes no sistema e trabalhar para melhorar qualquer problema que possa existir neles.
Os traces, embora cruciais para a compreensão do comportamento do sistema, não são completos por si só. Muitas vezes, um trace errado não consegue validar completamente o problema sem a comparação com outros sinais, como logs e métricas. Quando um sinal apresenta inconsistência, ou quando a correlação entre sinais é difícil de construir, é necessário investigar como melhorar a integridade dos dados. Por exemplo, ao usar um ID de transação que percorre todo o ciclo de vida do E2E, é possível consultar o log para entender o número de requisições e respostas associadas a esse ID. Comparando isso com os spans registrados no trace, você pode identificar se houve falhas na instrumentação ou se algum span foi perdido.
A comparação entre logs e traces é uma técnica poderosa para diagnóstico, mas para que ela seja eficaz, é crucial que as convenções de nomenclatura e os atributos sejam bem definidos. A falta de padronização pode tornar impossível a comparação precisa entre logs e traces. Além disso, as convenções de nomenclatura precisam ser claras e consistentes para que a correlação entre diferentes sinais seja válida e útil.
Por fim, a correlação entre RUM (Real User Monitoring) e traces também é vital. Quando a sessão do RUM contém múltiplos IDs de trace, se a contagem de spans esperada for menor do que a prevista, isso pode indicar um problema na instrumentação do trace. Isso é particularmente importante em sistemas distribuídos, onde as transações podem ser geradas no backend sem passar pelo frontend. Neste caso, ao analisar os traces distribuídos e comparar com os logs, você consegue identificar mais facilmente onde ocorre a falha de instrumentação e agir de forma proativa.
Como a Instrumentação de Traces E2E no Servidor de API Impacta a Visibilidade de Sistemas Complexos
A instrumentação de traces end-to-end (E2E) tornou-se essencial em sistemas modernos, principalmente no contexto de servidores de API e suas interações com outras aplicações como servidores EAI, Kafka e microserviços. A observabilidade de um sistema distribuído não se resume apenas à monitoração das requisições, mas à capacidade de entender o comportamento de cada componente envolvido no processamento das informações, através da coleta de spans que permitem reconstruir o fluxo completo dos dados, desde o momento em que uma requisição é recebida até a sua resposta final.
Em um cenário típico de microserviços ou arquitetura de sistemas distribuídos, um único processo pode gerar múltiplos spans, que representam cada etapa do ciclo de vida de uma transação. Quando um servidor de API faz uma requisição a outro sistema, como um servidor EAI ou Kafka, cada serviço ou componente do fluxo gera um span. Por exemplo, no caso de um servidor API e de um servidor EAI, o primeiro pode gerar apenas um ou dois spans, enquanto o servidor EAI pode gerar até dez, dependendo de sua configuração e da complexidade do processo. O resultado disso é uma trace única, composta por diversos spans, que oferece uma visão detalhada de como as requisições são tratadas e como as respostas são geradas. Isso facilita a identificação de gargalos e problemas de performance, permitindo um diagnóstico mais preciso e eficaz.
No entanto, a instrumentação de servidores EAI com ferramentas como OpenTelemetry não é uma tarefa simples. Embora ferramentas como TIBCO EAI tenham começado a oferecer suporte à instrumentação via OpenTelemetry, ainda existem limitações, especialmente quando se lida com processamento de eventos complexos entre aplicações. Nessas situações, o suporte da ferramenta pode ser insuficiente, e é necessário um maior grau de customização ou até mesmo uma abordagem manual para garantir que todas as etapas do processo sejam devidamente rastreadas.
A complexidade aumenta quando envolvemos sistemas adicionais como Kafka. O Kafka, amplamente utilizado para comunicação assíncrona entre microserviços, requer instrumentação tanto no lado do publisher quanto no subscriber, já que esses componentes são responsáveis por enviar e consumir mensagens entre os diferentes serviços. A instrumentação do Kafka pode ser feita facilmente através de bibliotecas como opentelemetry-instrumentation-kafka-python, permitindo que as mensagens enviadas ou recebidas por meio do Kafka sejam devidamente rastreadas e associadas aos spans existentes.
A instrumentação de microserviços com frameworks como Flask também oferece desafios específicos. Para um servidor Flask, por exemplo, é possível realizar uma instrumentação automática utilizando bibliotecas como opentelemetry-distro, que facilita a integração com a OpenTelemetry. Isso permite que a aplicação envie os dados de trace diretamente para um coletor, sem a necessidade de inserção manual de código de instrumentação. O Flask, por ser uma estrutura minimalista, pode ser facilmente integrado à OpenTelemetry, garantindo que cada requisição HTTP recebida seja monitorada e rastreada, o que é essencial para sistemas que dependem de múltiplos microserviços para sua operação.
Além disso, a utilização de protocolos como gRPC em vez de HTTP/REST pode alterar significativamente o comportamento do fluxo de dados. O gRPC, por ser um protocolo mais eficiente e adequado para comunicações entre microserviços, pode ser instrumentado de maneira similar à instrumentação de servidores HTTP. A integração da instrumentação gRPC, como mostrado no exemplo do código Python, permite que as requisições realizadas por clientes gRPC sejam rastreadas e associadas a spans, garantindo que o fluxo de dados entre as diferentes camadas de um sistema distribuído seja plenamente compreendido.
É importante destacar que a escolha da ferramenta de instrumentação adequada e a verificação de seu suporte às versões legadas do sistema são fundamentais para garantir que o processo de coleta de traces seja realizado de maneira eficiente. OpenTelemetry, por exemplo, oferece suporte para diferentes linguagens como Java e Python, permitindo que o sistema de instrumentação seja configurado conforme a necessidade da aplicação. No entanto, como qualquer ferramenta de observabilidade, é necessário entender suas limitações e escolher o melhor caminho dependendo da complexidade da arquitetura envolvida.
Além da instrumentação de processos e sistemas, é crucial configurar adequadamente o coletor de dados e garantir que ele seja capaz de processar grandes volumes de dados de trace sem causar sobrecarga no sistema. Ferramentas como Docker, quando usadas para executar coletores de OpenTelemetry, podem facilitar a configuração e a gestão do pipeline de dados, mas é preciso estar atento a problemas de rede, como conflitos de porta, que podem impedir o envio correto dos dados para os destinos apropriados.
Além disso, os sistemas de observabilidade precisam ser capazes de lidar com diferentes tipos de dados, como traces, métricas e logs. A combinação desses três tipos de informações é o que permite a verdadeira compreensão do comportamento do sistema, já que cada um deles fornece uma visão complementar dos processos em execução. O uso do OpenTelemetry como uma solução integrada para a coleta desses dados pode proporcionar uma visão única e consolidada do ambiente, facilitando a análise e a resolução de problemas.
Por fim, a configuração de um pipeline de monitoramento adequado, utilizando os exportadores de dados e a configuração detalhada do coletor, é um passo essencial para garantir a precisão e a confiabilidade dos dados coletados. Uma configuração incorreta pode resultar em dados imprecisos ou faltantes, comprometendo a qualidade da observabilidade do sistema. Portanto, um acompanhamento constante da configuração e da performance do sistema de coleta é fundamental para manter a integridade da observabilidade ao longo do tempo.
Como a Falha Ventricular Direita (FVD) Se Manifesta Após a Implantação de um Dispositivo de Assistência Ventricular Esquerda (LVAD): Desafios e Abordagens Clínicas
A Influência de Atacantes Solitários: O Legado de Breivik e a Radicalização no Mundo Contemporâneo

Deutsch
Francais
Nederlands
Svenska
Norsk
Dansk
Suomi
Espanol
Italiano
Portugues
Magyar
Polski
Cestina
Русский