Automação de Padrões com LLMs Especializados
Expressões regulares (regex) são ferramentas indispensáveis para manipulação de strings, mas sua sintaxe densa frequentemente resulta em erros e perda de produtividade. Para desenvolvedores que lidam com análise de logs ou limpeza de dados, criar padrões robustos manualmente pode ser um desafio. O Qwen2.5-Coder-1.5B, um modelo compacto otimizado para tarefas de programação, surge como uma solução eficiente para gerar padrões complxeos de forma automatizada e precisa.
Configuração do Ambiente
Para utilizar o modelo localmente, é necessário preparar o ambiente Python com as bibliotecas transformers e torch. Abaixo, definimos uma estrutura básica para carregar o modelo e realizar inferências focadas em regex.
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
def inicializar_engine_regex(modelo_id="Qwen/Qwen2.5-Coder-1.5B-Instruct"):
tokenizador = AutoTokenizer.from_pretrained(modelo_id)
modelo = AutoModelForCausalLM.from_pretrained(
modelo_id,
torch_dtype="auto",
device_map="auto"
)
return modelo, tokenizador
def criar_regex(instrucao, modelo, tokenizador):
conversa = [
{"role": "system", "content": "Você é um especialista em Regex. Gere padrões eficientes e seguros."},
{"role": "user", "content": instrucao}
]
input_text = tokenizador.apply_chat_template(
conversa,
tokenize=False,
add_generation_prompt=True
)
inputs = tokenizador([input_text], return_tensors="pt").to(modelo.device)
output_tokens = modelo.generate(
**inputs,
max_new_tokens=150,
temperature=0.05
)
resposta = tokenizador.decode(output_tokens[0], skip_special_tokens=True)
return resposta.split("assistant\n")[-1].strip()
# Exemplo rápido
# engine, tk = inicializar_engine_regex()
# print(criar_regex("Crie um regex para validar CPFs brasileiros", engine, tk))
Casos de Uso Práticos
Aálise de Logs de Servidor
Imagine a necessidade de extrair dados de um log de microsserviço estruturado. O modelo pode interpretar o formato e gerar o padrão de captura correspondente.
exemplo_log = '[2024-05-20 10:00:05] INFO 172.16.254.1 - "POST /v1/login" 201 128'
prompt_log = f"""
Baseado na linha de log abaixo, crie um regex que capture:
1. Data e hora (dentro dos colchetes)
2. Nível do log (INFO, ERROR, etc.)
3. Endereço IP
4. Método HTTP e Path
5. Status code
6. Tamanho do payload
Log: {exemplo_log}
Forneça o código Python usando o módulo 're'.
"""
# Resultado esperado: r'\[(.*?)\] (\w+) ([\d\.]+) - "(GET|POST|PUT|DELETE) (.*?)" (\d+) (\d+)'
Extração de Contatos e Identificadores
A limpeza de dados brutos muitas vezes exige a identificação de múltiplos formatos de um mesmo dado, como números de telefone com ou sem código de país.
texto_sujo = "Contato: (11) 98765-4321 ou +55 21 3344-5566. Falar com suporte."
prompt_tel = f"""
Crie um regex capaz de identificar números de telefone brasileiros no texto:
- Suporte a prefixos com +55
- Suporte a DDD com e sem parênteses
- Suporte a hifens e espaços
Texto: {texto_sujo}
"""
Parsing de Arquivos de Configuração
Para interpretar arquivos .ini ou .env sem bibliotecas externas, o regex é a solução ideal. O modelo pode lidar com a lógica de ignorar comentários e capturar chaves e valores.
config_data = """
# Configuração de Banco
DB_HOST=127.0.0.1
DB_PORT=5432 ; Porta padrão
"""
prompt_config = "Gere um regex para extrair pares CHAVE=VALOR, ignorando comentários iniciados por # ou ;"
Estratégias para Melhores Resultados
Ajuste Fino via Prompt (Few-Shot)
Para padrões extremamente específicos, forneça exemplos de entrada e a saída desejada. Isso reduz a ambiguidade na geração do padrão.
prompt_refinado = """
Tarefa: Extrair IDs de transação.
Exemplo Entrada: "ID: TXN-1002, Status: OK" -> Saída: "TXN-1002"
Exemplo Entrada: "Ref: TXN-9981, Valor: 50" -> Saída: "TXN-9981"
Crie o regex para o padrão TXN seguido de 4 dígitos.
"""
Abrodagem Modular
Para padrões muito extensos, como validadores de URLs complexas, solicite ao modelo a criação de partes menores e depois peça a combinação delas. Isso evita que o modelo se perca em níveis de aninhamento excessivos.
Tratamento de Performance
Ao lidar com grandes volumes de dados, a eficiência do regex é crítica. Você pode instruir o modelo a evitar o backtracking excessivo ou usar grupos de não-captura (?:...) para otimizar a engine de execução do Python.
prompt_otimizacao = "Otimize este regex para evitar backtracking lento em textos grandes: (a+)+b"
Considerações Técnicas
Embora o Qwen2.5-Coder-1.5B demonstre alta competência, é fundamental validar os padrões gerados em ferramentas de teste (como o Regex101) antes da implementação em produção. O uso de temperature=0.05 ou valores próximos de zero é recomendado para garantir que a saída seja determinística e técnica, evitando alucinações criativas que invalidariam a sintaxe do padrão.