No cenário atual de rápida evolução tecnológica, a implementação eficaz de soluções de IA em cenários reais de negócio representa um desafio significativo para profissionais de tecnologia. Este artigo detalha um estudo de caso real de classificação de produtos em plataforma de e-commerce, demonstrando como um único desenvolvedor, sem suporte de servidores poderosos, conseguiu realizar a classificação inteligente de 300 mil produtos utilizando modelos de embedding.
Contexto e Desafios
Recentemente, um cliente do setor de e-commerce enfrentou o desafio de organizar sua vasta base de produtos. A plataforma abrigacentenas de milhares de itens distribuídos emmilhares de categorias de produtos. Os dados de categorização provinham de múltiplas fontes, resultando em descrições inconsistentes e classificações frequentemente imprecisas.
A tarefa de reorganização manual seria extremamente demorada e dispendiosa. A solução desejada envolvia utilizar capacidades de IA para automatizar o processo de classificação, tanto para produtos existentes quanto para novos itens adicionados ao sistema.
Restrições do Projeto
O projeto apresentava várias limitações importantes:
- Os nomes dos produtos estavam principalmente em chinês
- A solução precisava funcionar em ambiente de rede interna (sem acesso à internet)
- Indisponibilidade de servidores com alto desempenho (sem GPUs dedicadas)
Abordagem de Solução
Da LLM aos Modelos de Embedding
A abordagem inicial considerava o ajuste fino de um modelo de linguagem quantizado em 4 bits (como ChatGLM3) para classificar produtos em categorias primárias e secundárias. No entanto, os testes revelaram limitações significativas nesse modelo quantizado, com precisão e consistência insatisfatórias na saída, exigindo múltiplas tentativas de ajuste sem garantia de resultados adequados.
Essa limitação levou a uma mudança de perspectiva. Como o problema central era a correspondência semântica e não compreensão linguística complexa, percebeu-se que os modelos de embedding, amplamente utilizados em sistemas de问答 de base de conhecimento, poderiam ser suficientes para a tarefa. Para a classificação de produtos, que não requer raciocínio lógico complexo, modelos de embedding seriam mais adequados que modelos de linguagem completos.
O que são Modelos de Embedding?
Modelos de embedding são amplamente utilizados em áreas como processamento de linguagem natural (PLN) e visão computacional. Eles convertem dados de alta dimensão em espaços de incorporação de baixa dimensão, preservando características e informações semânticas dos dados originais.
Em termos simples, modelos de embedding transformam palavras ou frases em vetores multidimensionais, onde a distância entre vetores representa o grau de proximidade semântica. Quanto menor a distância entre vetores, mais próximos semanticamente eles são.
Por exemplo:
- "Batata" → [0,1,2]
- "Batata inglesa" → [0,1,1]
- "Cão pastor" → [1,0,0]
A distância entre [0,1,2] e [0,1,1] é menor do que entre [0,1,2] e [1,0,0], indicando que "Batata" e "Batata inglesa" semanticamente mais próximos.
Enquanto este exemplo usa vetores tridimensionais, os modelos de embedding reais operam com dimensões muito maiores. Por exemplo, a interface de embeddings da OpenAI suporta 1536 dimensões, enquanto o modelo de código aberto em chinês m3e-base suporta 768 dimensões.
Seleção de Tecnologias
Com base na análise, foram selecionados os seguintes componentes:
- Modelo de embedding: m3e-base
- Banco de vetores local: Milvus
- Banco de dados relacional: MySQL
Modelo m3e-base
O m3e-base (Moka Massive Mixed Embedding) possui as seguintes características:
Características Principais
- Moka: Treinado pela MokaAI, código aberto e avaliado, com script de treinamento usando uniem e benchmark de avaliação usando MTEB-zh
- Massivo: Treinado em um conjunto de dados de pares de frases em chinês demilhões (22 milhões+)
- Misturado: Suporta cálculo de similaridade de texto homogêneo e heterogêneo em chinês e inglês, com futuro suporte a recuperação de código
- Embedding: Modelo de incorporação de texto que converte linguagem natural em vetores densos
Comparação de Modelos
| Modelo | Parâmetros | Dimensões | Chinês | Inglês | s2s Acc | s2p ndcg@10 |
|---|---|---|---|---|---|---|
| m3e-small | 24M | 512 | Sim | Sim | 0.5834 | 0.7262 |
| m3e-base | 110M | 768 | Sim | Sim | 0.6157 | 0.8004 |
| text2vec | 110M | 768 | Sim | Sim | 0.5755 | 0.6346 |
| openai-ada-002 | Desconhecido | 1536 | Sim | Sim | 0.5956 | 0.7786 |
Nota:
- s2s (sentence to sentence): Representa a capacidade de incorporação entre textos homogêneos, adequado para tarefas como similaridade de texto, detecção de perguntas duplicadas, classificação de texto
- s2p (sentence to passage): Representa a capacidade de incorporação entre textos heterogêneos, adequado para tarefas como recuperação de texto, módulo de memória GPT
Os resultados de avaliação mostram que o m3e-base supera o openai-ada-002 em tarefas de classificação e recuperação de texto em chinês, tornando-o ideal para aplicações em cenário chinês.
Fluxo de Implementação
O fluxo técnico do sistema pode ser resumido nos seguintes passos:
- Armazenamento de conteúdo (ex: "batata", "cão pastor")
- Conversão de texto para vetor attravés do módulo m3e-base
- Armazenamento de vetores no banco de dados Milvus
- Consulta para obter o vetor mais próximo
- Recuperação do conteúdo correspondente no banco de dados MySQL
Implementação Detalhada
1. Preparação das Categorias Padrão de Produtos
Os metadados de categorias de produtos podem ser extraídos das categorias existentes ou gerados com auxílio de IA. Devido às limitações de inferência e restrições de token dos modelos de IA, evite gerar todas as categorias de uma vez. Adote uma abordagem passo a passo para obter melhores resultados:
- Primeiro, gere os diretórios de nível superior
- Depois, gere os diretórios de nível secundário individualmente
- Finalmente, gere os diretórios de nível terciário correspondentes
Este processo iterativo, quando documentado, pode gerar um conjunto completamente novo de metadados de categorias de produtos, abrangente e bem estruturado.
# Primeiro passo: gerar diretórios de nível secundário
def gerar_categorias_nivel_segundo(nivel_primario_categoria):
prompt = f"Diretório de nível superior: {nivel_primario_categoria};"
resposta = chamar_api_openai(prompt)
categorias_nivel_segundo = resposta.split(",")
return categorias_nivel_segundo
# Segundo passo: gerar diretórios de nível terciário
def gerar_categorias_nivel_terceiro(nivel_primario_categoria, nivel_segundo_categoria):
prompt = f"Diretório de nível superior: {nivel_primario_categoria}; Diretório de nível secundário: {nivel_segundo_categoria};"
resposta = chamar_api_openai(prompt)
categorias_nivel_terceiro = resposta.split(",")
return categorias_nivel_terceiro
2. Armazenamento das Categorias de Produtos no Banco de Vetores
Utilize o modelo m3e-base para realizar embeddings em chinês, convertendo nomes de categorias de produtos em níveis terciários em vetores. Escolha o Milvus como banco de vetores para armazenar os vetores convertidos. Além disso, armazene o índice do vetor e os nomes correspondentes das categorias terciárias em um banco de dados MySQL.
2.1 Instalação e uso do m3e-base
pip install -U sentence-transformers
A primeira execução fará o download do modelo da internet, o que pode levar tempo significativo. Se necessário, prepare um pacote offline.
Prepare o método text_to_vector:
from sentence_transformers import SentenceTransformer
# Inicializar o modelo
modelo = SentenceTransformer('moka-ai/m3e-base')
def texto_para_vetor(texto):
embedding = modelo.encode([texto])
return embedding[0]
2.2 Instalação e uso do Milvus
A forma mais conveniente de iniciar o serviço Milvus é usando o Docker:
wget https://github.com/milvus-io/milvus/releases/download/v2.3.3/milvus-standalone-docker-compose.yml -O docker-compose.yml
sudo docker-compose up -d
Instale as bibliotecas Python necessárias:
pip install pyarrow pymysql pymilvus milvus
Após o banco de dados vetorial Milvus estar pronto, pode-se armazenar os vetores convertidos por text_to_vector, criar um índice e lembrar de armazenar o texto correspondente ao índice no MySQL.
3. Consulta ao Banco de Dados
O processo de consulta funciona da seguinte forma: o texto primeiro é convertido em vetor através de text_to_vector, depois consulta-se os valores mais próximos no Milvus, recupera-se o índice e, finalmente, consulta-se o texto correspondente no MySQL usando esse índice.
Aqui está o método de consulta:
def buscar_textos_similares(texto_consulta):
conexoes, db = estabelecer_conexoes()
try:
vetor_consulta = texto_para_vetor(texto_consulta)
colecao = Collection("busca_texto_colecao")
colecao.load()
parametros_busca = {"metric_type": "L2", "params": {"nprobe": 16}}
resultados = colecao.search([vetor_consulta], "embedding", parametros_busca, limit=1)
ids = [str(resultado.id) for resultado in resultados[0]]
distancias = [str(resultado.distance) for resultado in resultados[0]]
cursor = db.cursor()
consulta = f"SELECT texto FROM tabela_texto WHERE id_texto IN ({','.join(['%s'] * len(ids))})"
cursor.execute(consulta, tuple(ids))
textos_similares = [texto for texto, in cursor.fetchall()]
return textos_similares, ids, distancias
finally:
fechar_conexoes(conexoes, db)
Os valores de distancias representam a distância calculada pelo banco de vetores entre dois vetores. Quanto menor a distância, mais próxima é a semântica. Podemos retornar os valores de distancias como condição de filtragem para revisão humana. Por exemplo, valores de distancias acima de determinado limite podem exigir revisão manual.
Teste de Consulta
termos_busca = ["uva", "passas", "glicose", "cristal de uva"]
for termo_busca in termos_busca:
print(f"{termo_busca} pertence à categoria: ", buscar_textos_similares(termo_busca))
Resultado:
uva pertence à categoria: (['Frutas'], ['445652651623587475'], ['156.342529296875'])
passas pertence à categoria: (['Frutas secas'], ['445652651623587474'], ['91.40153503417969'])
glicose pertence à categoria: (['Lanches'], ['445652651623587478'], ['176.91494750976562'])
cristal de uva pertence à categoria: (['Gemas'], ['445652651623587476'], ['123.83802032470703'])
É possível observar que, mesmo para nomes de produtos que compartilham a mesma palavra-chave, o sistema consegue classificá-los corretamente em categorias diferentes.
Refinamento da Engenharia
Com o ambiente instalado e depuração por etapas concluídas, o próximo passo é a integração completa. Elementos que podem precisar de melhoria incluem:
- Atualização de metadados de classificação de produtos
- API de consulta para categorias adjacentes
- Etapa de revisão humana (opcional)
- Integração com sistemas existentes
Conclusões e Reflexões
Para problemas em cenários específicos, não é necessário necessariamente usar o melhor modelo de linguagem disponível. Modelos de embedding podem ser suficientes para resolver o problema. O ponto-chave na implementação de aplicações de IA está na implementação prática. Desde que a solução resolva o problema, ela deve ser o mais simples e econômica possível.
Este artigo registra o método de implementação de consulta de classificação de produtos usando modelos de embedding de linguagem e banco de dados vetorial. Comparado aos sistemas de问答 de base de conhecimento, que utilizam modelos de linguagem grandes (LLM), esta abordagem dispensa o uso de LLM, mas para o cenário específico de classificação de produtos, o resultado é mais eficaz e com custo menor.
Principais Pontos
- Seleção adequada de ferramentas: Nem todos os problemas exigem LLM; modelos de embedding são mais eficientes em cenários de correspondência semântica
- Estratégia passo a passo: Para processamento de dados em grande escala, uma abordagem iterativa é mais confiável
- Pensamento de engenharia: Após a validação teórica, é necessário considerar a implementação prática e integração de sistemas
- Controle de custos: Mesmo em ambeintes internos sem GPU, ainda é possível implementar aplicações de IA eficientes