Está a ter dificuldades com a IA ou com o desenvolvimento full-stack? Os nossos especialistas estão aqui para o orientar: aconselhamento personalizado, integração técnica e muito mais. Entre em contacto com [email protected].

Criação de um modelo de pesquisa semântica com transformadores de frases para uma aplicação RAG

A implementação de um pipeline RAG (Retrieval Augmented Generation) através do aperfeiçoamento do seu próprio modelo de pesquisa semântica é uma abordagem poderosa para aumentar a precisão e a relevância dos sistemas de resposta a perguntas.

Esta técnica combina os pontos fortes da pesquisa semântica e da IA generativa, permitindo que o sistema compreenda melhor as perguntas dos utilizadores e gere respostas mais precisas e contextualmente relevantes. Ao afinar um modelo de pesquisa semântica utilizando Transformadores de frases, os programadores podem adaptar o modelo ao seu domínio específico, melhorando o desempenho geral do pipeline RAG.

Pesquisa semântica

O que é a pesquisa semântica?

A pesquisa semântica é uma técnica de pesquisa de dados que ultrapassa os métodos tradicionais de pesquisa baseados em palavras-chave. Utiliza algoritmos de processamento de linguagem natural e de aprendizagem automática para melhorar a precisão dos resultados da pesquisa, tendo em conta a intenção do pesquisador e o significado contextual dos termos utilizados na sua consulta. Esta abordagem tem por objetivo compreender o significado subjacente à consulta de pesquisa e ao conteúdo das páginas Web, em vez de se limitar a fazer corresponder palavras-chave. Ao fazê-lo, a pesquisa semântica pode fornecer resultados mais relevantes, mesmo que não contenham as palavras exactas utilizadas na consulta original.

Para o conseguir, a pesquisa semântica utiliza várias técnicas, como a desambiguação do sentido das palavras, a extração de conceitos e a expansão da consulta. Também utiliza a pesquisa vetorial e a aprendizagem automática para devolver resultados que visam corresponder à intenção e ao contexto do utilizador. A pesquisa semântica é amplamente utilizada nos motores de pesquisa da Web, como o Google, e é alimentada por tecnologias como o Knowledge Graph, que armazena dados estruturados sobre entidades e as suas relações. Isto permite aos motores de busca compreender o significado subjacente às consultas de pesquisa e fornecer resultados mais precisos e significativos.

A pesquisa semântica é muito útil para as empresas que pretendem responder a perguntas sobre o seu próprio conhecimento de domínio, como a sua documentação técnica, contratos, descrições de produtos...

O que é a Geração Aumentada de Recuperação (RAG)?

Pesquisa semântica

A Geração Aumentada por Recuperação (RAG) é uma técnica que aumenta a precisão e a fiabilidade dos modelos generativos de IA, como os Modelos de Linguagem Ampla (LLM), incorporando fontes de dados externas para fornecer informações contextualmente mais precisas e actualizadas. Integra uma componente de recuperação com um modelo generativo, permitindo que o sistema pesquise e obtenha informações relevantes de uma base de dados ou de uma base de conhecimentos para complementar os seus conhecimentos internos ao gerar respostas.

Esta abordagem garante que o modelo de IA pode dar respostas baseadas nos factos mais actuais e fiáveis e permite que os utilizadores verifiquem as fontes de informação utilizadas nas respostas do modelo. As RAG ajudam a fundamentar o modelo de IA em fontes externas de conhecimento, melhorando a qualidade dos seus resultados e proporcionando uma forma de atualizar o modelo sem necessidade de uma reciclagem extensiva.

O RAG é uma óptima estratégia para atenuar as potenciais alucinações dos modelos de IA generativa. O RAG ajuda a construir um sistema de resposta a perguntas que tem o melhor dos dois mundos: exatidão factual e respostas humanas geradas em linguagem natural.

O que é a biblioteca de transformadores de frases?

Transformadores de frases

A biblioteca Sentence Transformers é uma poderosa estrutura Python concebida para a incorporação de texto de última geração. É construída com base em redes neurais transformadoras como BERT, RoBERTa, XLM-R e outras, alcançando o melhor desempenho em várias tarefas, incluindo pesquisa semântica, mineração de paráfrases, comparação de similaridade semântica, agrupamento e muito mais. Esta biblioteca permite um ajuste fino fácil dos métodos de incorporação de frases, permitindo a criação de incorporação de frases específicas para tarefas adaptadas a necessidades específicas. Saiba mais no sítio Web dos Transformadores de frases

A biblioteca oferece uma vasta seleção de modelos pré-treinados de Transformadores de frases para mais de 50 idiomas, disponíveis na plataforma Hugging Face. Os utilizadores também podem treinar ou afinar os seus próprios modelos utilizando a biblioteca, proporcionando a flexibilidade para criar modelos personalizados para casos de utilização únicos. A equipa do Sentence Transformers lançou recentemente uma nova versão principal (v3) que melhora consideravelmente as capacidades desta biblioteca, especialmente as suas capacidades de afinação.

A biblioteca Sentence Transformers é rápida, abrangente e bem mantida, e é por isso que a estamos a utilizar neste tutorial.

Criar o seu próprio modelo de pesquisa semântica

Criar o seu próprio modelo de pesquisa semântica é uma óptima forma de obter resultados precisos, garantindo uma latência muito baixa. Isto é ainda mais verdadeiro se implementar o seu próprio modelo de pesquisa semântica numa GPU.

Primeiro, vamos criar um pequeno conjunto de dados com os nossos dados. Crie um ficheiro CSV de 1 coluna (denominado "dataset.csv") que contenha a seguinte documentação técnica sobre impressoras HP (num cenário da vida real, vai querer incluir muitos mais exemplos, claro):

"HP® LaserJets have unmatched printing speed, performance and reliability that you can trust. Enjoy Low Prices and Free Shipping when you buy now online."
"Every HP LaserJet comes with a one-year HP commercial warranty (or HP Limited Warranty)."
"HP LaserJet ; Lowest cost per page on mono laser printing. · $319.99 ; Wireless options available. · $109.00 ; Essential management features. · $209.00."

Cada linha pode conter até 512 tokens (aproximadamente equivalente a 400 palavras) e, para maximizar a precisão, recomenda-se que não ultrapasse os 128 tokens (aproximadamente equivalente a 100 palavras). Agora que temos as nossas 3 peças de documentação no nosso conjunto de dados, podemos codificar os dados utilizando o nosso modelo com Transformadores de frases. Crie um script Python com o seguinte (certifique-se de que o PyTorch e o Sentence Transformers estão instalados).

from sentence_transformers import SentenceTransformer
import csv
import torch

model_name = 'paraphrase-multilingual-mpnet-base-v2'
encoded_model_path = 'semantic_search_model.pt'
dataset_path = 'dataset.csv'

bi_encoder = SentenceTransformer(model_name)

passages = []
with open(dataset_path) as csv_file:
    csv_reader = csv.reader(csv_file)
    for row in csv_reader:
        passages.append(row[0])
        
corpus_embeddings = bi_encoder.encode(
    passages, batch_size=32, convert_to_tensor=True, show_progress_bar=True)

torch.save(corpus_embeddings, encoded_model_path)

Este script descarrega e utiliza o paraphrase-multilingual-mpnet-base-v2 como modelo de base e utiliza-o para codificar os nossos dados. Pode escolher entre muitos modelos pré-treinados disponíveis, dependendo dos seus requisitos (tamanho do modelo, caso de utilização, línguas suportadas, ...). Dependendo do seu hardware, poderá querer adaptar o parâmetro "batch_size" para acelerar o processo de codificação.

Uma vez criado, pode utilizar o seu modelo para inferência com o seguinte script Python:

import csv
from sentence_transformers import SentenceTransformer, util
import torch

bi_encoder = SentenceTransformer('paraphrase-multilingual-mpnet-base-v2')
semantic_search_model = torch.load('semantic_search_model.pt')

passages = []
with open('app/custom_model/dataset.csv') as csv_file:
    csv_reader = csv.reader(csv_file)
    for row in csv_reader:
        passages.append(row[0])

question_embedding = bi_encoder.encode(
    "How long is the warranty on the HP Color LaserJet Pro?", convert_to_tensor=True)
hits = util.semantic_search(
    question_embedding, semantic_search_model, top_k=3)
hits = hits[0]

result = {"search_results": [
    {"score": hit['score'], "text": passages[hit['corpus_id']]} for hit in hits]}

O script de inferência acima retorna os seguintes resultados:

{
"search_results": [
    {
        "score": 0.99,
        "text": "Every HP LaserJet comes with a one-year HP commercial warranty (or HP Limited Warranty)."
    },
    {
        "score": 0.74,
        "text": "All consumer PCs and printers come with a standard one-year warranty. Care packs provide an enhanced level of support and/or an extended period of coverage for your HP hardware. All commercial PCs and printers come with either a one-year or three-year warranty."
    },
    {
        "score": 0.68,
        "text": "In-warranty plan · Available in 2-, 3-, or 4-year extension plans · Includes remote problem diagnosis support and Next Business Day Exchange Service."
    },
    ]
}

No nosso script de inferência, o parâmetro "top_k" determina o número de resultados que queremos devolver. No resultado, mostramos o texto correspondente do conjunto de dados com uma pontuação de confiança. Esta pontuação é importante porque nos ajuda a decidir se queremos aceitar a resposta ou não.

Gerar uma resposta em linguagem natural com IA generativa

Como se pode ver, a principal limitação da pesquisa semântica é que o modelo devolve o texto em bruto do conjunto de dados sem responder diretamente à pergunta. Por isso, agora queremos dar isto a um modelo de IA generativo como um contexto para responder à pergunta inicial em linguagem natural.

Podemos conseguir isto facilmente utilizando um LLM avançado como o GPT-4 no OpenAI ou o LLaMA 3 e o ChatDolphin no NLP Cloud. Pode decidir manter o melhor resultado do modelo de pesquisa semântica e passá-lo como um contexto para o LLM, ou manter vários resultados. Aqui está um exemplo de prompt usando apenas o melhor resultado:

Context: Every HP LaserJet comes with a one-year HP commercial warranty (or HP Limited Warranty).
Based on the above context, answer the following question: How long is the warranty on the HP Color LaserJet Pro?

Este pedido devolve algo do género:

The warranty on the HP Color LasertJet Pro lasts at least 1 year.

Modelo de pesquisa semântica com dados codificados VS Armazenamento de dados incorporados numa base de dados vetorial

Num sistema RAG (Retrieval-Augmented Generation), a criação de um modelo de pesquisa semântica com dados codificados localmente ou a utilização de uma base de dados vetorial são duas opções interessantes.

Ao codificar os nossos próprios dados, convertemos os dados em tensores e, em seguida, temos a oportunidade de carregar os dados numa GPU. Por outro lado, uma base de dados vetorial é uma base de dados especializada concebida para armazenar, indexar e consultar estes vectores de elevada dimensão de forma eficiente.

Para as empresas que pretendem obter latências muito baixas, recomenda-se que codifiquem os seus próprios dados e os carreguem numa GPU para melhorar o tempo de cálculo. No entanto, isto é feito à custa da flexibilidade, uma vez que os dados têm de ser codificados novamente sempre que o conjunto de dados muda. Se os seus dados subjacentes mudarem com muita frequência, poderá ser mais simples extrair os embeddings e armazená-los de forma incremental numa base de dados vetorial (como o PG Vetor, por exemplo).

Conclusão

A Retrieval Augmented Generation é crucial para as empresas que pretendem responder a perguntas sobre dados específicos, como documentação técnica, contratos, etc., uma vez que aumenta consideravelmente a precisão dos resultados. A RAG é um componente essencial de um chatbot de apoio, por exemplo.

Sentence Transformers é uma excelente biblioteca que pode ser utilizada para criar o seu próprio modelo de pesquisa semântica com base nos seus próprios dados. Quando implementado numa GPU e associado a um modelo avançado de IA generativa, esse modelo revela-se extremamente poderoso.

Se não estiver interessado em criar e implementar o seu próprio modelo de pesquisa semântica com base em Transformadores de frases, pode fazê-lo facilmente com um clique no NLP Cloud. Experimente já a pesquisa semântica no NLP Cloud!

Se tiver dúvidas sobre o RAG, a pesquisa semântica e os Transformadores de frases, não hesite em perguntar-nos, é sempre um prazer aconselhá-lo!

Julien
CTO na NLP Cloud