← Todos os Posts

Pipeline de Pontuação de Sinais: Triagem Determinística de Conhecimento

A maior parte da gestão de conhecimento é baseada em intuição. Você salva uma nota porque ela “parece importante”. Seis meses depois, você tem 7.000 notas e nenhuma ideia de quais delas importam. Eu construí um pipeline de pontuação determinística que me diz.

O sistema tem 733 linhas de Python. Ele pontua cada sinal recebido em quatro dimensões ponderadas, calcula uma pontuação composta e roteia o sinal para uma de 12 pastas de domínio, uma caixa de entrada para revisão manual ou o vazio. Sem categorização manual. Sem “revisar depois” que nunca acontece. O algoritmo decide.

TL;DR

Uma pontuação composta ponderada (relevância 35%, acionabilidade 30%, profundidade 20%, autoridade 15%) produz uma classificação de 0,0 a 1,0 para cada sinal. O roteamento usa três limiares: >= 0,55 grava automaticamente em uma pasta de domínio, >= 0,30 enfileira para revisão manual, < 0,30 descarta silenciosamente. Mais de 7.700 notas processadas ao longo de 14 meses, com Desenvolvimento (2.837) e Design (1.709) dominando a distribuição. Falha mais interessante: a dimensão de profundidade mede riqueza de metadados, não qualidade de conteúdo — então um tweet bem tagueado sobre uma foto de flor pontua 0,85.


O Problema da Intuição

Eu uso o Obsidian como base de conhecimento. Sinais chegam de feeds RSS, favoritos do Twitter, estrelas do GitHub, newsletters e captura manual. Antes do pipeline, todo sinal ia para uma única pasta de caixa de entrada. Uma caixa de entrada com mais de 400 notas não processadas se acumulou em dois meses.

O conselho padrão (“revise semanalmente, categorize conforme avança, use um sistema de pastas”) assume que a revisão aconteça. Ela não acontece. Caixas de entrada se tornam somente-escrita: itens entram, mas nunca saem. Conhecimento que você capturou é funcionalmente idêntico a conhecimento que você nunca capturou. Clay Shirky enquadrou o problema com precisão: “Não é sobrecarga de informação. É falha de filtragem.”8

Eu precisava de um sistema capaz de avaliar mais de 7.700 notas mais rápido do que eu consigo lê-las, usando critérios que defino uma vez e aplico uniformemente. Não um motor de recomendação. Um algoritmo de pontuação.


A Pontuação Composta

A fórmula de pontuação é uma combinação linear ponderada de quatro dimensões, uma abordagem padrão em análise de decisão multicritério (MCDA):9

composite = (
    relevance     * 0.35 +
    actionability * 0.30 +
    depth         * 0.20 +
    authority     * 0.15
)

Cada dimensão produz um float entre 0,0 e 1,0. A fórmula arredonda a pontuação composta para três casas decimais. Os pesos refletem uma ordem de prioridade deliberada: o que importa para mim (relevância) supera o que eu posso usar (acionabilidade), que supera quão ricos são os metadados (profundidade), que supera quão confiável é a fonte (autoridade).1


As Quatro Dimensões

Relevância (35%): Correspondência de Interesses

A relevância usa um dicionário de palavras-chave curado manualmente com mais de 40 entradas, cada uma pontuada de 0,15 (nft) a 1,0 (claude code, swiftui). A pontuação combina a melhor correspondência com a média de todas as correspondências:

# 60% best match, 40% average of all matches
return min(1.0, best_score * 0.6 + avg_score * 0.4)

Itens sem correspondência recebem uma linha de base de 0,25, não 0,0. O sistema penaliza um tópico desconhecido de forma menos severa do que um irrelevante. A linha de base é o parâmetro mais frequentemente ajustado: alto demais e conteúdo irrelevante inunda a caixa de entrada, baixo demais e interesses genuinamente novos são filtrados antes que eu os veja.2

Acionabilidade (30%): Potencial de Aprendizado

A acionabilidade faz correspondência contra 22 palavras-chave orientadas a ação: tutorial, guide, how-to, build, github.com. URLs recebem tratamento especial:

if "github.com" in url:
    hits += 2  # Repositories are inherently actionable
if "/docs" in url or "/tutorial" in url:
    hits += 1

A pontuação é baseada em função degrau, não linear: 0 correspondências → 0,10, 1 correspondência → 0,40, 2 correspondências → 0,60, 3+ correspondências → min(1.0, 0.70 + hits * 0.05). A função degrau recompensa a presença de sinais de acionabilidade mais do que sua quantidade. Um link de tutorial vale mais do que a diferença entre três e quatro palavras-chave.3

Profundidade (20%): Riqueza de Metadados

A profundidade é puramente estrutural. Ela mede a presença e comprimento dos campos, não a qualidade do conteúdo:

Sinal Pontuação
Tem título +0,20
Tem descrição +0,20
Descrição > 50 caracteres +0,15
Descrição > 150 caracteres +0,15
Tem alguma tag +0,15
Tem 3+ tags +0,10
Tem URL +0,05
Máximo 1,00

Profundidade é a dimensão em que eu menos confio. Um tweet sobre uma foto de flor com descrição completa e quatro tags pontua profundidade 0,85. Metadados ricos, conteúdo irrelevante. A profundidade funciona como proxy para “a fonte forneceu dados estruturados”, o que se correlaciona com, mas não garante, qualidade.4

Autoridade (15%): Credibilidade da Fonte

A autoridade começa com uma linha de base de 0,40 e se ajusta por tipo de fonte:

if source in ("twitter", "x"):        score = 0.50
elif source in ("blog", "newsletter"): score = 0.60
elif source in ("github", "docs"):     score = 0.70

Uma lista de domínios permitidos sobrescreve para cima (nunca para baixo): github.com, anthropic.com, apple.com, arxiv.org, docs.python.org e outros definem a autoridade em pelo menos 0,75. A lista codifica um julgamento de que essas fontes merecem maior confiança por padrão.


Roteamento por Limiares

Três faixas de roteamento determinam o que acontece com cada sinal pontuado:

THRESHOLD_AUTO_WRITE = 0.55   # → domain folder
THRESHOLD_INBOX      = 0.30   # → 00-Inbox (manual review)
# Below 0.30 → silently skipped

O pipeline grava sinais com pontuação >= 0,55 diretamente em uma das 12 pastas de domínio, inferidas a partir de correspondência de tags e títulos. Sinais na faixa intermediária (0,30-0,55) vão para uma caixa de entrada para revisão manual. Qualquer coisa abaixo de 0,30 nunca chega ao vault.

A faixa 0,30-0,55 é a “zona ambígua” onde o sistema tem menos confiança. Uma flag opcional --llm-triage envia esses sinais para o Claude para avaliação, que pode ajustar a pontuação composta em até ±0,20, potencialmente movendo um sinal para além do limiar de gravação automática. O Claude vê apenas sinais ambíguos, nunca os de pontuação alta ou baixa. Gastar tokens de API em sinais que o classificador determinístico já resolveu seria desperdício.5

A inferência de domínio usa um sistema de votação. Cada tag mapeia para um domínio, cada palavra-chave no título adiciona um voto. O domínio com mais votos vence. Empates são resolvidos pela ordenação do dicionário (efetivamente arbitrário). Fallback padrão: “Inspiration.”


Os Resultados

Após mais de 7.700 notas processadas ao longo de 14 meses:

Domínio Notas % do Total
Development 2.837 36,8%
Design 1.709 22,2%
Inspiration 565 7,3%
Claude-Code 414 5,4%
AI-Tools 414 5,4%
Productivity 346 4,5%
Ideas 296 3,8%
Science 231 3,0%
Health-Life 191 2,5%
Architecture 142 1,8%
Startups 26 0,3%
Tools 22 0,3%
Inbox 420 5,5%

A distribuição reflete a realidade. Eu consumo mais conteúdo de desenvolvimento e design do que qualquer outra coisa. Itens da caixa de entrada (420) representam a zona ambígua — sinais que o algoritmo não conseguiu rotear automaticamente com confiança.6


O Que o Algoritmo Errou

A Armadilha da Profundidade

Um tweet sobre uma foto de nemophila pontuou composite 0.36, relevance 0.25, actionability 0.10, depth 0.85, authority 0.50. Foi roteado para a caixa de entrada porque profundidade (0,85) e autoridade (0,50) compensaram relevância e acionabilidade quase nulas. Metadados ricos, conteúdo irrelevante: uma foto bonita de flores.

O exemplo ilustra a limitação fundamental da pontuação por proxy de metadados. A profundidade mede “a fonte forneceu dados estruturados”, não “o conteúdo é valioso”. O Twitter fornece descrições completas e tags para cada tweet. Um tweet bem tagueado sobre café da manhã pontua profundidade 0,85. Pesquisas em recuperação de informação chamam a tensão subjacente de trade-off precisão/revocação: otimizar para revocação (capturar tudo que é relevante) inevitavelmente admite falsos positivos.10

A correção que considerei e rejeitei: Reduzir o peso da profundidade de 0,20 para 0,10 reduziria falsos positivos de conteúdo irrelevante bem tagueado, mas também penalizaria conteúdo genuinamente profundo de fontes com metadados escassos. O peso atual é um compromisso.

O Problema da Linha de Base de Relevância

Uma linha de base de 0,25 para relevância sem correspondência significa que qualquer sinal bem estruturado de uma fonte razoável pontua pelo menos 0,30 e cai na caixa de entrada. A linha de base cria um piso de falsos positivos: a caixa de entrada acumula sinais que são bem tagueados e de fontes razoáveis, mas não têm nada a ver com meus interesses.

A correção real: A revisão periódica da caixa de entrada continua sendo necessária. O pipeline reduz a superfície de revisão de 7.700 itens para 420 (uma redução de ~95%), mas não consegue eliminar a revisão manual para a zona ambígua.


Notas de Implementação

O pipeline roda como uma ferramenta CLI. A entrada é um array JSON de sinais (de RSS, API do Twitter ou entrada manual). A saída são arquivos markdown compatíveis com Obsidian gravados em pastas de domínio.

python triage.py --input signals.json --vault ~/obsidian-signals/
python triage.py --input signals.json --vault ~/obsidian-signals/ --llm-triage
python triage.py --input signals.json --min-score 0.60  # Stricter routing

A pré-filtragem roda antes da pontuação: deduplicação de URL contra notas existentes no vault, filtragem de conteúdo vazio e uma lista de bloqueio de fontes ruidosas. Notas duplicadas e fontes de spam nunca chegam à etapa de pontuação.

As funções de pontuação são puras: sem efeitos colaterais, sem chamadas de API, sem acesso ao sistema de arquivos. Cada função recebe um dicionário de sinal e retorna um dicionário de pontuações. A abordagem pura as torna testáveis isoladamente e combináveis com o estágio de triagem por LLM, que roda apenas no subconjunto ambíguo.7


Principais Conclusões

Para engenheiros construindo sistemas de triagem:

  • Pontuação determinística supera curadoria manual em escala. 7.700 notas em 14 meses. A triagem manual teria exigido mais de 50 horas de revisão. O pipeline as processou em minutos com uma taxa de roteamento de ~95% (apenas 5,5% exigiu revisão manual).

  • Proxies de metadados têm modos de falha conhecidos. Profundidade mede estrutura, não qualidade. Autoridade mede fonte, não precisão. Ambos os proxies funcionam em escala agregada, mas produzem falsos positivos previsíveis no nível do sinal individual. Reconhecer os modos de falha é mais honesto do que afirmar que o algoritmo “funciona”.

Para praticantes de gestão de conhecimento:

  • Pontuações compostas ponderadas expõem suas prioridades reais. Pesos de 35/30/20/15 não são arbitrários. Eles codificam um julgamento específico: relevância importa mais que acionabilidade, que importa mais que riqueza de metadados, que importa mais que credibilidade da fonte. Tornar os pesos explícitos e ajustáveis é a diferença entre um sistema e um hábito.

  • A zona ambígua é irredutível. Sinais entre 0,30 e 0,55 são genuinamente ambíguos: o classificador determinístico não consegue resolvê-los. A triagem por LLM ajuda, mas não elimina a zona. A revisão manual do subconjunto ambíguo continua sendo necessária.


Eu enquadrei este artigo como um problema de engenharia, não como uma dica de produtividade. Pontuação composta se aplica a qualquer domínio onde itens precisam de roteamento determinístico: tickets de suporte, moderação de conteúdo, qualificação de leads, detecção de anomalias. Meus pesos e limiares específicos codificam prioridades pessoais, mas a arquitetura é genérica. Para mais sobre como conhecimento acumulado cria valor não linear, veja Juros Compostos Mentais. Loop OODA para Engenharia de Prompts explora um padrão relacionado: observação estruturada como alternativa à intuição. Cada componente do pipeline (pontuação, roteamento, triagem) é independentemente útil e se compõe com os outros, seguindo o padrão de engenharia composta.



  1. Eu não derivei a distribuição de pesos matematicamente. Ajustei-a ao longo de seis meses de uso. Os pesos iniciais eram iguais (25/25/25/25). A relevância aumentou para 35% após observar que sinais de alta profundidade e baixa relevância (conteúdo irrelevante bem tagueado) inundavam a caixa de entrada. A acionabilidade aumentou para 30% após observar que conteúdo teórico com alta relevância mas sem aplicação prática se acumulava sem uso. 

  2. A linha de base de 0,25 para relevância sem correspondência é uma escolha de design deliberada. Defini-la como 0,0 significaria que qualquer sinal fora da lista curada de palavras-chave pontuaria no máximo 0,65 (0 + ação + profundidade + autoridade sem contribuição de relevância), tornando quase impossível para tópicos genuinamente novos alcançarem o limiar de gravação automática. 

  3. Escolhi a pontuação por função degrau para acionabilidade em vez de pontuação linear porque a acionabilidade se aproxima mais de um booleano do que de uma variável contínua. Um tutorial é acionável. Uma notícia sobre um tutorial não é. A função degrau captura essa natureza binária melhor do que um gradiente. 

  4. Originalmente nomeei a dimensão de profundidade como “qualidade” e pretendia que medisse a riqueza do conteúdo. Após observar que ela media riqueza de metadados em vez disso, renomeei para “profundidade” para refletir seu comportamento real. A mudança de nome é uma honestidade deliberada sobre o que a métrica captura. 

  5. A triagem por LLM usa Claude Code CLI (claude --print --model opus) com um prompt estruturado que pede um ajuste de pontuação (-0,20 a +0,20) e uma classificação de domínio. Estimativa de custo do autor: aproximadamente $0,02-0,04 por sinal. Executar a triagem por LLM em todos os 7.700 sinais custaria $150-300. Executá-la apenas nos 420 sinais ambíguos custa $8-17. 

  6. Dados de distribuição de domínio do autor até fevereiro de 2026. As contagens refletem roteamento cumulativo desde dezembro de 2024. A distribuição tem sido estável desde o terceiro mês, com Development e Design consistentemente representando 55-60% dos sinais roteados. 

  7. Escolhi funções de pontuação puras como uma decisão arquitetural deliberada. A alternativa (funções de pontuação que verificam o sistema de arquivos para duplicatas ou chamam APIs para enriquecimento) teria sido mais precisa, mas impossível de testar sem mocking. A abordagem pura sacrifica alguma precisão em troca de testabilidade e combinabilidade. 

  8. Clay Shirky, “It’s Not Information Overload. It’s Filter Failure,” palestra no Web 2.0 Expo, 2008. youtube.com/watch?v=LabqeJEOQyI. O enquadramento de Shirky se aplica diretamente: uma caixa de entrada com mais de 400 notas não processadas não é uma sobrecarga de informação, mas uma ausência de filtragem. Veja também Alvin Toffler, Future Shock, Random House, 1970, que cunhou “sobrecarga de informação” como a dificuldade de tomar decisões quando exposto a informação demais. 

  9. Combinações lineares ponderadas são uma técnica padrão em análise de decisão multicritério (MCDA). A abordagem aqui é um Modelo de Soma Ponderada (WSM) simplificado, um dos métodos MCDA mais antigos. Para o tratamento canônico da derivação de pesos para pontuação composta, veja Saaty, T.L., The Analytic Hierarchy Process, McGraw-Hill, 1980. Para o modelo aditivo mais simples usado aqui, veja Fishburn, P.C., “Additive Utilities with Incomplete Product Set,” Journal of Mathematical Psychology, 4(1), pp. 104-110, 1967. 

  10. O trade-off precisão/revocação é um conceito fundamental em recuperação de informação. Aumentar a revocação (capturar mais itens relevantes) necessariamente admite mais itens irrelevantes, reduzindo a precisão. A dimensão de profundidade otimiza para revocação ao recompensar qualquer sinal bem estruturado, razão pela qual conteúdo irrelevante mas bem tagueado ultrapassa o limiar. Veja Manning, C.D., Raghavan, P., & Schütze, H., Introduction to Information Retrieval, Cambridge University Press, 2008, Capítulo 8. nlp.stanford.edu/IR-book/