Na primeira parte desta série de duas partes, veremos como modelos de incorporação abaixo do ideal, estratégias de agrupamento ineficientes e falta de filtragem de metadados podem dificultar a obtenção de respostas relevantes do seu LLM. Veja como superar esses desafios.
Construindo aplicativos generativos de IA que usam
Dividiremos esse processo em duas partes principais. O primeiro, que abordaremos neste primeiro artigo da série, é o pipeline de incorporação, que preenche o
Aqui, consideraremos três áreas principais que podem levar a resultados insatisfatórios: modelos de incorporação abaixo do ideal, estratégias de agrupamento ineficientes e falta de filtragem de metadados. (No próximo artigo, veremos a interação real com o LLM e examinaremos alguns problemas comuns que surgem lá e podem levar a resultados ruins.)
A escolha de um modelo de incorporação terá um impacto significativo na relevância geral e na usabilidade do seu aplicativo RAG. Como tal, requer uma compreensão diferenciada das capacidades de cada modelo e uma análise de como essas capacidades se alinham com os requisitos da sua aplicação.
Se você é relativamente novo no RAG e embeddings em geral, um dos melhores recursos que você deve conhecer é o
O placar pode ajudá-lo a identificar os modelos com melhor desempenho para seu caso de uso específico.
Um dos motivos mais comuns para o baixo desempenho do RAG é que os desenvolvedores novos neste espaço fazem uma pesquisa no Google para encontrar exemplos de geração de incorporação. Eles frequentemente encontram amostras que usam modelos de incorporação, como Word2Vec, sBERT e RoBERTa, que são escolhas ruins para casos de uso de recuperação.
Se você encontrou este artigo porque está depurando resultados de baixa relevância e usou algo como sBERT para gerar seus embeddings, provavelmente identificamos a causa de seus problemas de relevância.
Nesse caso, a próxima pergunta que você provavelmente terá é quais modelos de incorporação você pode usar para melhorar seus resultados de pesquisa por similaridade. Sem conhecer os detalhes do seu caso de uso, os três que recomendamos são:
Com um comprimento máximo de sequência de entrada de até 8.192 tokens, ele também permite criar embeddings para trechos de texto muito mais longos do que modelos alternativos. Isso é tanto benção quanto maldição.
Ter um tamanho de sequência grande simplifica o processo de criação de incorporações para mais conteúdo de texto e permite que o modelo de incorporação identifique relações entre palavras e frases em um corpo de texto maior.
No entanto, isso também resulta em pesquisas por similaridade que podem se tornar mais confusas ao comparar a similaridade de dois documentos longos quando o que você procura são pedaços relevantes de contexto para facilitar o processo de geração.
Existem duas grandes desvantagens do Ada v2. A primeira é que não pode ser executado localmente. Você deve usar a API do OpenAI para criar a incorporação. Isso pode não apenas introduzir gargalos nos casos em que você deseja criar embeddings para muitos conteúdos, mas também adiciona um custo de US$ 0,0001 por 1.000 tokens.
A segunda é que os embeddings criados a partir do modelo Open AI têm 1.536 dimensões cada. Se você estiver usando um banco de dados vetorial em nuvem, isso poderá aumentar consideravelmente seus custos de armazenamento vetorial.
Quando escolher: você deseja uma solução simples que requer apenas uma chamada de API, potencialmente precisa vetorizar documentos grandes e o custo não é um problema.
Jina v2 é um novo modelo de incorporação de código aberto que oferece o mesmo suporte a 8.000 sequências de entrada do Ada v2 e, na verdade, tem uma pontuação um pouco melhor em casos de uso de recuperação.
Jina v2 fornece um antídoto para os problemas do Ada v2. É de código aberto sob a licença Apache 2.0 e pode ser executado localmente, o que, claro, também é uma desvantagem se você não deseja executar seu próprio código para fazer isso. Também produz um vetor de incorporação com metade das dimensões do Ada v2.
Portanto, você não apenas obtém um desempenho de recuperação um pouco melhor em casos de uso de benchmark, mas também obtém resultados aprimorados com menos requisitos de armazenamento e computação de uma perspectiva de banco de dados vetorial.
Quando escolher: você deseja usar uma solução de código aberto e potencialmente precisa vetorizar documentos grandes e se sente confortável executando pipelines de incorporação localmente. Você deseja reduzir os custos do banco de dados vetorial com incorporações de dimensões mais baixas.
bge-large-en-v1.5 é de código aberto sob a licença do MIT e é atualmente o modelo de incorporação com melhor classificação na tabela de classificação do MTEB para casos de uso de recuperação. Com uma sequência de entrada menor, será necessário que você pense mais em sua estratégia de agrupamento, mas, em última análise, fornece o melhor desempenho geral para casos de uso de recuperação.
Quando escolher: você deseja usar uma solução de código aberto e está disposto a gastar mais tempo em estratégias de agrupamento para permanecer dentro das limitações de tamanho de entrada. Você se sente confortável executando a incorporação de pipelines localmente. Você deseja o modelo de incorporação de melhor desempenho para casos de uso de recuperação.
Embora esteja fora do escopo deste artigo, você pode querer se aprofundar nos 15 benchmarks da tabela de classificação do MTEB para identificar aquele que mais se assemelha à sua situação específica.
Embora existam definitivamente padrões em termos de desempenho de vários modelos de incorporação nos diferentes benchmarks, muitas vezes há modelos específicos que se destacam em cada um. Se você precisar refinar ainda mais sua seleção de incorporação, esta é uma possível área de investigação adicional.
A segmentação ou “fragmentação” do texto de entrada é um fator fundamental que influencia significativamente a relevância e a precisão do resultado gerado. Várias estratégias de chunking oferecem vantagens exclusivas e são adequadas para tipos específicos de tarefas. Aqui, nos aprofundamos nessas metodologias e fornecemos diretrizes para sua aplicação, incorporando algumas considerações importantes:
Quando usar - A menos que seu conteúdo em si seja altamente estruturado e de comprimento fixo, você geralmente deseja contar com uma estratégia de agrupamento mais útil como as que se seguem.
Consideração técnica - Embora seja muito simples de implementar, essa estratégia de agrupamento geralmente levará a resultados insatisfatórios em aplicações RAG.
Informações adicionais Se você estiver usando uma estratégia de comprimento fixo com seu aplicativo RAG e tiver problemas para recuperar o contexto relevante, considere mudar para uma abordagem de agrupamento diferente.
Quando usar – Esta estratégia é eficaz quando cada frase do texto de entrada é rica em significado e contexto. Permite que o modelo se concentre nos meandros de cada frase, gerando assim respostas mais coerentes e contextualmente relevantes. Você raramente confiará na fragmentação em nível de frase para casos de uso de RAG.
Consideração técnica - A fragmentação em nível de frase geralmente envolve tokenização com base nos limites das frases, o que pode ser alcançado usando bibliotecas de processamento de linguagem natural (PNL).
Informações adicionais - A fragmentação em nível de frase pode ser particularmente útil quando você procura declarações específicas, como na transcrição de uma reunião em que você está tentando encontrar declarações semanticamente semelhantes a um determinado trecho de texto.
Quando usar - Empregue esta estratégia quando o texto de entrada estiver organizado em seções ou parágrafos distintos, cada um encapsulando uma ideia ou tópico separado. Isso permite que o modelo se concentre nas informações relevantes de cada parágrafo.
Consideração técnica - A identificação dos limites do parágrafo geralmente envolve a detecção de caracteres de nova linha ou outros delimitadores que significam o final de um parágrafo.
Informações adicionais – A fragmentação em nível de parágrafo pode ser útil quando você tem documentos que cobrem muitos aspectos diferentes do mesmo tópico. Por exemplo, uma página de documentação do produto pode apresentar um recurso do produto, explicar quando usá-lo, falar sobre como configurá-lo e dar exemplos de diferentes configurações.
Usar a fragmentação em nível de parágrafo pode ajudá-lo a identificar a parte mais relevante do documento a ser fornecida ao LLM como contexto.
Quando usar - Opte por esta estratégia quando a relevância de seções específicas do texto for fundamental. Por exemplo, em documentos jurídicos, segmentar o texto com base em cláusulas ou secções pode produzir respostas mais específicas ao contexto.
Consideração técnica - Esta abordagem pode exigir técnicas avançadas de PNL para compreender os limites semânticos dentro do texto.
Informações adicionais – O chunking com reconhecimento de conteúdo é especialmente útil ao lidar com dados estruturados ou semiestruturados, pois pedaços específicos podem ser combinados com filtragem de metadados para uma recuperação mais precisa.
Por exemplo, em um documento legal, você pode querer extrair todas as cláusulas de garantia ou indenização e, ao armazenar embeddings para pedaços em um banco de dados vetorial, você pode usar metadados para facilitar a pesquisa de conteúdo de um determinado tipo ao construir um Caso de uso RAG.
Quando usar – A fragmentação recursiva divide os dados em pedaços cada vez menores, usando uma abordagem hierárquica. Por exemplo, ao dividir um documento de texto, você pode dividir o texto primeiro em parágrafos, depois em frases e, por fim, em palavras.
Depois que os dados forem divididos no primeiro conjunto de partes, você poderá aplicar recursivamente o processo de fragmentação a cada uma das partes menores, repetindo até atingir o menor tamanho de parte de seu interesse.
Consideração técnica - A implementação da fragmentação recursiva pode envolver uma estratégia de análise multinível, na qual as partes são divididas em subpartes com base em critérios adicionais. Se você estiver usando
Informações adicionais – Esta abordagem permite que o modelo compreenda o contexto em vários níveis, desde temas de alto nível até nuances detalhadas, tornando-o particularmente útil para documentos complexos, como trabalhos acadêmicos, manuais técnicos ou contratos jurídicos. Isto traz benefícios de flexibilidade, uma vez que pesquisas por similaridade podem identificar textos semelhantes para consultas mais amplas e mais curtas.
No entanto, isso também significa que existe a possibilidade de que partes semelhantes do mesmo documento de origem acabem sendo super-representadas em pesquisas de similaridade, especialmente se você optar por uma sobreposição mais longa entre partes na configuração do divisor de texto.
Como abordagem geral, antes de tentar agrupar um grande corpus e vetorizá-lo, considere fazer algumas experiências ad hoc com seus dados.
Inspecione manualmente os documentos que você gostaria de recuperar para uma determinada consulta, identifique os pedaços que representam o contexto ideal que você gostaria de fornecer ao LLM e, em seguida, experimente estratégias de agrupamento para ver qual delas fornece os pedaços que você acha que seriam mais relevantes para o LLM ter.
A janela de contexto disponível de um LLM é um fator importante na seleção de uma estratégia de chunking. Se a janela de contexto for pequena, você precisará ser mais seletivo nos blocos inseridos no modelo para garantir que as informações mais relevantes sejam incluídas.
Por outro lado, uma janela de contexto maior permite mais flexibilidade, permitindo a inclusão de contexto adicional que pode melhorar a saída do modelo, mesmo que nem tudo seja estritamente necessário.
Ao experimentar estas estratégias de agrupamento e tendo em conta estas considerações, é possível avaliar o seu impacto na relevância dos resultados gerados. A chave é alinhar a estratégia escolhida com os requisitos específicos da sua aplicação RAG, preservar a integridade semântica da entrada e oferecer uma compreensão abrangente do contexto.
Isso permitirá que você encontre o processo de agrupamento correto para um desempenho ideal.
À medida que o número de incorporações em seu índice de pesquisa aumenta, os vizinhos mais próximos aproximados (ANN) tornam-se menos úteis ao procurar contexto relevante para incluir em seus prompts. Digamos que você indexou embeddings de 200 artigos em sua base de conhecimento.
Se você conseguir identificar o vizinho mais próximo com uma precisão de 1%, provavelmente encontrará resultados bastante relevantes porque 1% representa os dois principais artigos desses 200, e você obterá um desses dois.
Agora, considere um índice de pesquisa contendo todos os artigos da Wikipedia. Isso equivaleria a aproximadamente 6,7 milhões de artigos. Se o seu vizinho mais próximo estiver entre 1% dos artigos mais semelhantes, isso significa que você está recebendo um dos 67.000 artigos mais semelhantes.
Com um corpus como a Wikipédia, isso significa que você ainda pode estar muito errado.
A filtragem de metadados oferece uma maneira de restringir as partes do conteúdo, primeiro filtrando os documentos e depois aplicando o algoritmo do vizinho mais próximo. Nos casos em que você está lidando com um grande número de correspondências possíveis, essa pré-filtragem inicial pode ajudá-lo a restringir as opções possíveis antes de recuperar os vizinhos mais próximos.
A seguir, mergulharemos na interação com o LLM e examinaremos alguns problemas comuns que podem levar a resultados insatisfatórios.
Tentar
Por Chris Latimer, DataStax
Também publicado aqui