Resumo: Ajustar finamente um modelo de embedding em dados do domínio específico pode melhorar significativamente a busca vetorial e a precisão da geração aumentada por recuperação (RAG). Com o Databricks, é fácil ajustar finamente, implantar e avaliar modelos de embedding para otimizar a recuperação para seu caso de uso específico — aproveitando dados sintéticos sem rotulagem manual.
Por que é Importante: Se seu sistema de busca vetorial ou RAG não está recuperando os melhores resultados, ajustar finamente um modelo de embedding é uma maneira simples, porém poderosa, de aumentar o desempenho. Seja lidando com documentos financeiros, bases de conhecimento ou documentação de código interna, o ajuste fino pode fornecer resultados de busca mais relevantes e melhores respostas de LLM subsequentes.
O que Descobrimos: Ajustamos finamente e testamos dois modelos de embedding em três conjuntos de dados corporativos e vimos melhorias significativas nas métricas de recuperação (Recall@10) e no desempenho de RAG subsequente. Isso significa que o ajuste fino pode ser um divisor de águas para a precisão, sem a necessidade de rotulagem manual, utilizando apenas seus dados existentes.
Quer experimentar o ajuste fino de embeddings? Fornecemos uma solução de referência para ajudar você a começar. O Databricks torna a busca vetorial, RAG, reclassificação e ajuste fino de embeddings fáceis. Entre em contato com seu Gerente de Contas Databricks ou Arquiteto de Soluções para mais informações.
Modelos de embedding potencializam os sistemas modernos de busca vetorial e RAG. Um modelo de embedding transforma texto em vetores, permitindo encontrar conteúdo relevante com base no significado, em vez de apenas em palavras-chave. No entanto, modelos prontos para uso nem sempre são otimizados para seu domínio específico — é aí que entra o ajuste fino.
Ajustar finamente um modelo de embedding em dados específicos do domínio ajuda de várias maneiras:
Neste post, demonstramos que ajustar finamente um modelo de embedding é uma maneira eficaz de melhorar o desempenho de recuperação e RAG para casos de uso corporativos específicos de tarefas.
Ajustamos finamente dois modelos de embedding (gte-large-en-v1.5 e e5-mistral-7b-instruct) em dados sintéticos e os avaliamos em três conjuntos de dados de nossa Suite de Benchmarking de Inteligência de Domínio (DIBS) (FinanceBench, ManufactQA e Databricks DocsQA). Em seguida, comparamos-os com o text-embedding-3-large da OpenAI.
Principais Conclusões:
Após comparar em três conjuntos de dados, descobrimos que o ajuste fino de embeddings melhora a precisão em dois desses conjuntos. A Figura 1 mostra que, para FinanceBench e ManufactQA, os embeddings ajustados finamente superaram suas versões base, às vezes superando até mesmo o modelo de API da OpenAI (cinza claro). Para o Databricks DocsQA, no entanto, a precisão do text-embedding-3-large da OpenAI supera todos os modelos ajustados finamente. É possível que isso ocorra porque o modelo foi treinado na documentação pública do Databricks. Isso mostra que, embora o ajuste fino possa ser eficaz, ele depende fortemente do conjunto de dados de treinamento e da tarefa de avaliação.
Em seguida, comparamos os resultados acima com a reclassificação baseada em API usando voyageai/rerank-1 (Figura 2). Um reclassificador normalmente pega os k melhores resultados recuperados por um modelo de embedding, reclassifica esses resultados por relevância para a consulta de busca e, em seguida, retorna os k melhores reclassificados (em nosso caso, k=30 seguido por k=10). Isso funciona porque os reclassificadores geralmente são modelos maiores e mais poderosos do que os modelos de embedding, e também modelam a interação entre a consulta e o documento de uma forma mais expressiva.
O que descobrimos foi:
Reclassificadores geralmente incorrem em latência e custo de inferência adicionais por consulta em relação aos modelos de embedding. No entanto, eles podem ser usados com bancos de dados vetoriais existentes e, em alguns casos, podem ser mais econômicos do que re-embedding dados com um modelo de embedding mais recente. A escolha de usar um reclassificador depende do seu domínio e dos seus requisitos de latência/custo.
Para o FinanceBench, uma melhor recuperação se traduziu diretamente em melhor precisão de RAG quando combinada com o GPT-4o (ver Apêndice). No entanto, em domínios onde a recuperação já era forte, como no Databricks DocsQA, o ajuste fino não agregou muito — destacando que o ajuste fino funciona melhor quando a recuperação é um gargalo claro.
Aqui estão alguns dos detalhes mais técnicos de nossa geração de dados sintéticos, ajuste fino e avaliação.
Ajustamos finamente dois modelos de embedding de código aberto:
Em seguida, comparamos com o text-embedding-3-large da OpenAI.
Avaliamos todos os modelos nos seguintes conjuntos de dados de nossa Suite de Benchmarking de Inteligência de Domínio (DIBS): FinanceBench, ManufactQA e Databricks DocsQA.
| Conjunto de Dados | Descrição | # Consultas | # Corpus |
|---|---|---|---|
| FinanceBench | Perguntas sobre documentos SEC 10-K geradas por especialistas humanos. A recuperação é feita em páginas individuais de um superconjunto de 360 arquivamentos SEC 10-K. | 150 | 53.399 |
| ManufactQA | Perguntas e respostas amostradas de fóruns públicos de um fabricante de dispositivos eletrônicos. | 6.787 | 6.787 |
| Databricks DocsQA | Perguntas baseadas na documentação publicamente disponível da Databricks, geradas por especialistas da Databricks. | 139 | 7.561 |
Relatamos recall@10 como nossa principal métrica de recuperação; isso mede se o documento correto está entre os 10 principais documentos recuperados.
O padrão ouro para a qualidade do modelo de embedding é o benchmark MTEB, que incorpora tarefas de recuperação como BEIR, bem como muitas outras tarefas não de recuperação. Embora modelos como gte-large-en-v1.5 e e5-mistral-7b-instruct tenham um bom desempenho no MTEB, ficamos curiosos para ver como eles se saíram em nossas tarefas corporativas internas.
Treinamos modelos separados com dados sintéticos adaptados para cada um dos benchmarks acima:
| Conjunto de Treinamento | Descrição | # Amostras Únicas |
|---|---|---|
| Synthetic FinanceBench | Consultas geradas a partir de 2.400 documentos SEC 10-K | ~6.000 |
| Synthetic Databricks Docs QA | Consultas geradas a partir da documentação pública da Databricks. | 8.727 |
| ManufactQA | Consultas geradas a partir de PDFs de fabricação de eletrônicos | 14.220 |
Para gerar o conjunto de treinamento para cada domínio, pegamos documentos existentes e geramos consultas de amostra baseadas no conteúdo de cada documento usando LLMs como Llama 3 405B. As consultas sintéticas foram então filtradas por qualidade por um LLM-as-a-judge (GPT4o). As consultas filtradas e seus documentos associados foram então usados como pares contrastivos para finetuning. Usamos negativos in-batch para treinamento contrastivo, mas adicionar negativos difíceis poderia melhorar ainda mais o desempenho (ver Apêndice).
Executamos varreduras em:
Todo o finetuning foi feito usando as bibliotecas de código aberto mosaicml/composer, mosaicml/llm-foundry e mosaicml/streaming na plataforma Databricks.
O finetuning é apenas uma abordagem para melhorar o desempenho da busca vetorial e RAG; listamos algumas abordagens adicionais abaixo.
O finetuning de embeddings pode ser uma vitória fácil para melhorar a recuperação e o RAG em seus sistemas de IA. No Databricks, você pode:
Pronto para experimentar? Criamos uma solução de referência para facilitar o finetuning — entre em contato com seu Gerente de Contas Databricks ou Arquiteto de Soluções para obter acesso.
Tamanho | FinanceBench Recall@10 | ManufactQA Recall@10 | DocsQA Recall@10 | ||||
Baseline | Finetuned | Baseline | Finetuned | Baseline | Ajustado | ||
gte-large-en-v1.5 | 0.4B | 0.293 | 0.552 | 0.821 | 0.873 | 0.849 | 0.884 |
e5-mistral-7b-instruct | 7B | 0.479 | 0.670 | 0.836 | 0.913 | 0.899 | 0.899 |
text-embedding-3-large | Desconhecido | 0.44 | NA | 0.895 | NA | 0.95 | NA |
Tabela 1: Comparação de gte-large-en-v1.5, e5-mistral-7b-instruct e text-embedding-3-large. Mesmos dados da Figura 1.
Geração de Dados Sintéticos para Treinamento
Para todos os conjuntos de dados, as consultas no conjunto de treinamento não foram as mesmas que as consultas no conjunto de teste. No entanto, no caso do Databricks DocsQA (mas não do FinanceBench ou ManufactQA), os documentos usados para gerar consultas sintéticas foram os mesmos documentos usados no conjunto de avaliação. O foco do nosso estudo é melhorar a recuperação em tarefas e domínios específicos (em oposição a um modelo de embedding generalizável de zero-shot); portanto, vemos isso como uma abordagem válida para certos casos de uso de produção. Para FinanceBench e ManufactQA, os documentos usados para gerar dados sintéticos não tiveram sobreposição com o corpus usado para avaliação.
Existem várias maneiras de selecionar passagens negativas para treinamento contrastivo. Elas podem ser selecionadas aleatoriamente ou podem ser pré-definidas. No primeiro caso, as passagens negativas são selecionadas dentro do lote de treinamento; elas são frequentemente referidas como "in-batch negatives" ou “soft negatives”. No segundo caso, o usuário pré-seleciona exemplos de texto que são semanticamente difíceis, ou seja, potencialmente relacionados à consulta, mas ligeiramente incorretos ou irrelevantes. Este segundo caso é às vezes chamado de "hard negatives". Neste trabalho, usamos simplesmente in-batch negatives; a literatura indica que o uso de hard negatives provavelmente levaria a resultados ainda melhores.
Detalhes de Finetuning
Para todos os experimentos de finetuning, o comprimento máximo da sequência é definido como 2048. Em seguida, avaliamos todos os checkpoints. Para toda a criação de benchmarks, os documentos do corpus foram truncados para 2048 tokens (não divididos em blocos), o que foi uma restrição razoável para nossos conjuntos de dados específicos. Escolhemos os baselines mais fortes em cada benchmark após varrer prompts de consulta e estratégia de pooling.
Melhorando o Desempenho do RAG
Um sistema RAG consiste em um recuperador e um modelo generativo. O recuperador seleciona um conjunto de documentos relevantes para uma consulta específica e, em seguida, os alimenta para o modelo generativo. Selecionamos os melhores modelos gte-large-en-v1.5 com finetuning e os usamos para o primeiro estágio de recuperação de um sistema RAG simples (seguindo a abordagem geral descrita em Long Context RAG Performance of LLMs e The Long Context RAG Capabilities of OpenAI o1 and Google Gemini). Em particular, recuperamos k=10 documentos, cada um com um comprimento máximo de 512 tokens, e usamos GPT4o como o LLM generativo. A precisão final foi avaliada usando um LLM-as-a-judge (GPT4o).
No FinanceBench, a Figura 3 mostra que o uso de um modelo de embedding com finetuning leva a uma melhoria na precisão do RAG downstream. Além disso, é competitivo com o text-embedding-3-large. Isso é esperado, pois o finetuning do gte levou a uma grande melhoria no Recall@10 em relação ao gte baseline (Figura 1). Este exemplo destaca a eficácia do finetuning do modelo de embedding em domínios e conjuntos de dados específicos.
No conjunto de dados Databricks DocsQA, não encontramos melhorias ao usar o modelo gte com finetuning acima do gte baseline. Isso é um tanto esperado, pois as margens entre os modelos baseline e com finetuning nas Figuras 1 e 2 são pequenas. Curiosamente, mesmo que o text-embedding-3-large tenha um Recall@10 (ligeiramente) maior do que qualquer um dos modelos gte, ele não leva a uma precisão de RAG downstream maior. Como mostrado na Figura 1, todos os modelos de embedding tiveram um Recall@10 relativamente alto no conjunto de dados Databricks DocsQA; isso indica que a recuperação provavelmente não é o gargalo para o RAG, e que o finetuning de um modelo de embedding neste conjunto de dados não é necessariamente a abordagem mais frutífera.
Gostaríamos de agradecer a Quinn Leng e Matei Zaharia pelo feedback neste post do blog.
(Esta publicação no blog foi traduzida utilizando ferramentas baseadas em inteligência artificial) Publicação original