"""Cegueira dupla: anonimização de respostas e atribuição de rótulos opacos.""" from __future__ import annotations import hashlib import re PRODUTOS = [ "openai", "chatgpt", "gpt-5", "gpt-4", "gpt5", "anthropic", "claude", "gemini", "deepmind", "google bard", "llama", "meta ai", "grok", "xai", "copilot", "microsoft ai", "mai-", "nova", "bedrock", "cohere", "command", "mistral", "jamba", "ai21", "deepseek", "qwen", "tongyi", "kimi", "moonshot", "glm", "zhipu", "z.ai", "doubao", "seedance", "bytedance", ] AUTOID = [ r"(?i)\bcomo (um|uma|o|a) (modelo|assistente|ia|sistema) (de|da|do) \w+", r"(?i)\bi am (a|an) ?(ai|language model|assistant) (by|from|developed by) [\w\s\.]{0,40}", r"(?i)\bmy (training|knowledge cutoff|developer|creator) is\b", r"(?i)\b(sou|sou um|sou uma) (modelo|assistente|ia) (da|de|do) [\w\s\.]{0,40}", r"(?i)\b我是(由|一个)?[\w\s]{0,20}(开发|训练)(的)?(模型|助手)?", r"(?i)\bas an ai (model|assistant)\b", ] def anonimizar(texto: str) -> str: """Remove autoidentificação e nomes de produto/provedor.""" t = texto or "" for padrao in AUTOID: t = re.sub(padrao, "[remoção-cego]", t) for produto in PRODUTOS: t = re.sub(re.escape(produto), "[remoção-cego]", t, flags=re.IGNORECASE) # metadados que porventura vazem na resposta t = re.sub(r"(?i)\b(temperatura|temperature|max[_-]?tokens|model[_-]?id)\s*[:=]\s*\S+", "[remoção-cego]", t) return t.strip() def atribuir_rotulos(nomes: list[str], seed: int) -> dict[str, str]: """Mapeia participante -> SISTEMA-XX de forma determinística e não ordenada.""" base = int(hashlib.sha256(str(seed).encode()).hexdigest()[:16], 16) indices = list(range(len(nomes))) estado = base for i in range(len(indices) - 1, 0, -1): estado = (estado * 6364136223846793005 + 1442695040888963407) % (1 << 64) j = estado % (i + 1) indices[i], indices[j] = indices[j], indices[i] return {nome: f"SISTEMA-{idx + 1:02d}" for nome, idx in zip(sorted(nomes), indices)} def ordem_apresentacao(itens: list[dict], seed: int) -> list[dict]: """Ordem aleatória reproduzível dos itens apresentados.""" n = len(itens) estado = int(hashlib.sha256(f"ordem|{seed}|{n}".encode()).hexdigest()[:16], 16) idx = list(range(n)) for i in range(n - 1, 0, -1): estado = (estado * 6364136223846793005 + 1442695040888963407) % (1 << 64) j = estado % (i + 1) idx[i], idx[j] = idx[j], idx[i] return [itens[i] for i in idx]