Skip to content

mrlnlms/ia-interaction-analysis

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 

Repository files navigation

AI Interaction Analysis

Estudo longitudinal N=1 da interação humano-AI ao longo de cerca de três anos e meio (dez/2022 — abr/2026), cobrindo 8 plataformas (Claude.ai, ChatGPT, Gemini, Qwen, DeepSeek, Perplexity, NotebookLM, Claude Code + Codex + Gemini CLI). ~5 mil conversas, ~170 mil mensagens, ~80 mil tool events, capturadas via extractors proprietários, padronizadas num schema único e analisadas com Mixed Analysis, perfis P/Q/R-mode e análise sequencial.

Há uma característica estrutural que define o projeto: o mesmo tipo de sistema que está sendo estudado é também o instrumento de estudo. Os parsers e extractors foram em grande parte construídos com Claude Code; a categorização de tópicos foi assistida por Claude.ai; os 471 insights gerados pela própria Anthropic sobre minhas conversas viraram uma camada do dado. Isso não é contornado como viés — é assumido como objeto. O design epistemológico (apoiado em von Foerster, Latour, Knorr-Cetina e Péladeau) trata a coincidência entre pesquisador, instrumento e fenômeno como informação a interpretar, não a neutralizar.

O repositório expõe duas frentes paralelas: a infraestrutura de captura e padronização (que tem valor técnico próprio — captura incremental via APIs internas em sete plataformas, reconcilers com preservação de histórico, schema cross-source) e o trabalho analítico em andamento sobre o corpus resultante.


Por trás dos números

Plataforma Tipo Conversas Mensagens Período
Claude.ai web-chat 1.005 25.355 nov/2024 — abr/2026
ChatGPT web-chat 1.161 16.918 dez/2022 — abr/2026
Gemini web-chat 80 674 out/2024 — mar/2026
Qwen web-chat 108 1.426 fev/2025 — mar/2026
DeepSeek web-chat 78 516 jan/2025 — mar/2026
Perplexity web-chat 78 340 ago/2024 — mar/2026
NotebookLM web-RAG 149 114 jun/2024 — mar/2026
Claude Code CLI 2.241 121.489 fev — abr/2026
Codex CLI 104 2.407 fev — abr/2026
Gemini CLI CLI 11 182 mar/2026
Total 5.015 169.421

Mais 80.697 tool events (chamadas a Read/Edit/Bash/Grep/etc dentro das CLIs), 130 projetos linkados (82 Claude.ai + 48 ChatGPT) e 29 arquivos de manual saves resgatados do filesystem.


Captura — Extractors proprietários

Sete plataformas, captura via APIs internas (não scraping DOM). Cada extractor segue a mesma anatomia: auth + api_client + discovery + fetcher + asset_downloader + orchestrator, com saída em data/raw/<Source> Data <date>/. Todos com captura incremental por default — comparam update_time do servidor com o último raw local e fetcham só o que mudou (re-run em ~3 min vs ~30 min full).

Plataforma Método O que captura
ChatGPT /backend-api/conversations (REST) Convs, audio transcripts (voice mode), Canvas (29 textdocs + patches), Deep Research (54 reports), Files, DALL-E
Claude.ai /api/organizations/.../chat_conversations (REST) Convs, 1.117 artifacts extraídos como arquivos individuais (code, markdown, React, SVG), 83 projects, 546 project docs (23M chars)
Gemini batchexecute RPC (MaZiqc list + hNvQHb fetch) Convs, 226 imagens (uploads + geradas pelo modelo), Deep Research (35 reports) inline na árvore JSON, multi-conta via profiles
NotebookLM batchexecute RPC (9 rpcids mapeados) 9 tipos de outputs: audio overview, video overview, slide deck (PDF + PPTX), blog/report, flashcards, quiz, data table, infographic, mind map. Lite-fetch detecta unchanged em 3 RPCs/notebook antes de full fetch
Qwen API interna Convs
DeepSeek API interna Convs
Perplexity API interna Convs

O que se ganha indo direto na API e não pelo export oficial:

  • Granularidade — artifacts do Claude.ai, audio transcripts do ChatGPT, mind maps do NotebookLM. Coisas que o ZIP oficial não dá.
  • Incrementalidade real — diff por timestamp do servidor, não rebuild a cada captura.
  • Histórico preservado — conversas deletadas no servidor ficam marcadas como preserved_missing no merge local em vez de sumirem do dataset.
  • Independência do calendário do fornecedor — o ChatGPT, por exemplo, levou 11 meses entre dois exports oficiais; com a API, qualquer dia.

Padronização — Schema unificado cross-source

Quatro entidades, expressas como dataclasses em src/schema/models.py:

Conversation        →  conversation_id, source, title, created_at, updated_at,
                       message_count, model, account, mode, project, url,
                       interaction_type (human_ai | ai_ai), parent_session_id

Message             →  message_id, conversation_id, sequence, role, content,
                       model, created_at, token_count, word_count,
                       attachment_names, content_types, thinking, tool_results

ToolEvent           →  event_id, conversation_id, message_id, source,
                       event_type, tool_name, file_path, command,
                       duration_ms, success, metadata_json

ConversationProject →  conversation_id, project_tag, tagged_by, confidence

Treze parsers (sete web + três CLI + três manual saves) herdam de BaseParser e produzem parquets uniformes em data/processed/. O merge.py consolida em data/unified/ (fonte de verdade pra DuckDB e notebooks).

Timestamps em BRT naive (America/Sao_Paulo) — todos os parsers normalizam via BaseParser._ts, suportando ISO com/sem TZ e epoch. Subagents do Claude Code recebem interaction_type=ai_ai e parent_session_id apontando pro parent (filtrável em análises de conteúdo).


Reconciliação — preservação de histórico

Para cada plataforma com captura recorrente existe um reconciler em src/reconcilers/. A função: dado o raw novo + o merged anterior, decidir conversa por conversa qual o estado preservado.

build_plan(raw_new, merged_prev) →
  add               (conv nova no servidor)
  update            (timestamp ou hash mudou)
  copy_unchanged    (idêntico ao anterior, copia direto)
  preserved_missing (sumiu do servidor, mantém no histórico)

Idempotente por desenho (1ª run adiciona, 2ª run só copia). Suporta --full, --refetch-features <feat>, --previous-merged <path>. NotebookLM usa _eq_lenient (compara conteúdo ignorando timestamps voláteis, porque o update_time do servidor mente). FEATURES_VERSION força refetch quando rpcid novo é adicionado.


Camada curada — anotações humanas

data/curated/ é a camada que nunca é sobrescrita pelo pipeline. Lá vivem categorizações, hierarquias temáticas e classificações qualitativas que demandaram leitura humana.

Parquet Conteúdo
enriched_projects.parquet 2.011 conversas → 39 project groups (rodada 1, algorítmica + curada)
topics_vocabulary.parquet Vocabulário controlado de 152 topics em 16 tipos
conversation_topics.parquet 3.535 atribuições primárias e secundárias
entity_hierarchy.parquet Hierarquia de 4 níveis (PG → entity → sub → sub_sub), 3.292 rows, multi-membership preservado
entity_hierarchy_consolidated.parquet Versão single-PG (1 row por conversa), pra contagens matemáticas honestas
chatgpt_voice_candidates.parquet Classificação de 4 níveis (full_voice / mostly_voice / mixed / occasional) com transcrições manuais para casos onde o parser perdeu o áudio

A coexistência das duas versões da hierarquia (com e sem multi-membership) é deliberada: leitura etnográfica precisa de transversalidade; correlação numérica precisa de exclusividade. O dado não foi forçado num formato só — foi expandido em duas camadas complementares.


Análise — Série canônica

notebooks/main/ reúne a narrativa principal em cinco notebooks construídos em primeira pessoa, que documentam a gênese conceitual e metodológica do projeto à medida que a análise é executada:

# Notebook Conteúdo
00 gênese Faísca conceitual, viabilidade da coleta, plataforma por plataforma
01 padronização 7 blocos cronológicos de evolução do schema (incluindo a virada de 1/abr)
02 categorização 3 rodadas: project_group → topic/secondary → granularidade assimétrica
03 metodologia Fundamentação teórica + costura conceitual com Mixed Analysis
04 análise Aplicação empírica do framework (Cattell × técnicas × espelho/janela)

Os cinco notebooks foram validados frase a frase. A coda do 02 admite explicitamente o que ainda não está conceitualmente redondo. Drafts gerados por AI durante o processo foram preservados em _backup-* mas explicitamente não tratados como autoridade — vocabulário e enquadramentos vieram dos dados, não dos drafts.


Análise — Frameworks

A análise empírica é organizada pelo data box de Cattell (1952), cruzado com técnicas de análise sequencial e o par espelho/janela (autoetnografia digital):

Modo Pergunta Técnica
P-mode Como uma plataforma evolui em função do tempo? Séries temporais por fonte
Q-mode Quais conversas se agrupam por similaridade de uso? Clustering temático
R-mode Quais variáveis (modelo, modo, hora, projeto) co-ocorrem? Correlação cross-feature
Sequential R-mode Que sequências de uso revelam genealogia? Análise de transição

Cinco notebooks executores em notebooks/analysis/main-04/ materializam cada modo. Achado metodológico relevante: coocorrência não captura genealogiatopics tendem a ser quase-exclusivos por chat, então a evolução conceitual entre conversas só aparece no Sequential R-mode.

A categorização adota granularidade assimétrica (3 modos: atômico, atômico+fases, balde) com 8 mecanismos de override documentados, em vez de forçar uma taxonomia simétrica em fenômenos de naturezas diferentes.


Galeria de outputs

  • Streamgraph 10 fontes (notebooks/eda/14-overview-streamgraph.qmd) — volume mensal por plataforma, separando interações human_ai de ai_ai
  • Sankeys de hierarquia (notebooks/enrichment/12*.qmd) — fluxo PG → entity → sub → sub_sub, com versões snap (multi-membership) e consolidated (exclusiva)
  • Grafo genealógico (notebooks/qualitizing/11-grafo-genealogico.qmd) — evolução de conceitos cruzando plataformas e tempo
  • Arqueologia temática (notebooks/qualitizing/10-arqueologia-tematica.qmd) — 14 temas intelectuais, genealogia 24/mai-3/jun como caso instrumental
  • Comparative prompting — 863 pares detectados via fuzzy match (rapidfuzz ≥ 70%), o mesmo prompt encaminhado a múltiplos modelos no mesmo dia
  • 18 notebooks data-profile padronizados (notebooks/data-profile/), 1 por fonte + agregadores cross-source

Pipeline

                       ┌────────────────────────────────────┐
                       │  Captura  (src/extractors/)        │
                       │  7 APIs internas + CLI live        │
                       └──────────────┬─────────────────────┘
                                      │
                                      ▼
                       ┌────────────────────────────────────┐
                       │  Reconcile  (src/reconcilers/)     │
                       │  add | update | copy | preserved   │
                       └──────────────┬─────────────────────┘
                                      │
                                      ▼
                       ┌────────────────────────────────────┐
                       │  Parse  (src/parsers/)             │
                       │  13 parsers → schema unificado     │
                       └──────────────┬─────────────────────┘
                                      │
                                      ▼
                       ┌────────────────────────────────────┐
                       │  Merge  (src/merge.py)             │
                       │  data/unified/ (fonte de verdade)  │
                       └──────────────┬─────────────────────┘
                                      │
                                      ▼
                       ┌────────────────────────────────────┐
                       │  Curated  (data/curated/)          │
                       │  anotações humanas, nunca tocadas  │
                       └──────────────┬─────────────────────┘
                                      │
                                      ▼
                       ┌────────────────────────────────────┐
                       │  DuckDB + Quarto notebooks         │
                       └────────────────────────────────────┘

Backup e versionamento via DVC + Google Drive (docs/dvc-runbook.md): data/processed/, data/unified/ e data/curated/ versionados; data/raw/ ainda pendente. Push/pull automáticos chamados pelos scripts de ingestão.


Stack

  • Python 3.12+ — ETL, parsers, extractors
  • DuckDB — consultas SQL sobre parquets, registro automático de views via DuckDBManager
  • pandas — transformações
  • httpx + asyncio — extractors (substituindo Playwright em todas as plataformas via APIs internas)
  • Quarto (.qmd) — notebooks de análise, renderização HTML/PDF
  • Positron — IDE para .qmd
  • DVC + Google Drive — backup e versionamento de artefatos

Fundamentação teórica

  • Design — estudo longitudinal + transversal (mixed-design), N=1, autoetnografia
  • Conversation Analysis — Sacks, Schegloff & Jefferson (1974)
  • Human-AI Interaction — Morris (Google DeepMind), Liao (U. Michigan)
  • Autoetnografia digital aplicada a AI — Wang (2025), Panke (2025)
  • Mixed Analysis — von Foerster (cibernética de 2ª ordem), Latour (traçar associações), Knorr-Cetina (culturas epistêmicas), Péladeau (qualitização)
  • Data Box — Cattell (1952), seis modos canônicos

Detalhes em docs/research/fundamentacao-teorica.md, docs/research/framework-analitico.md e docs/research/serie-canonica-como-dado.md.


Estrutura do repositório

data/raw/                 → exports originais (gitignored)
data/processed/           → parquets por fonte no schema unificado
data/unified/             → parquets consolidados
data/curated/             → anotações humanas (nunca sobrescrito)
data/merged/              → outputs dos reconcilers, por data

src/extractors/           → 7 plataformas, captura via API
src/reconcilers/          → 7 reconcilers com preserved_missing
src/parsers/              → 13 parsers (BaseParser)
src/schema/models.py      → dataclasses do schema
src/db.py                 → DuckDBManager
src/merge.py              → consolidação de parquets

scripts/                  → pipeline, ingestão incremental, captura por fonte
tests/                    → 172 testes em 19 arquivos

notebooks/main/           → série canônica (00-04)
notebooks/data-profile/   → 18 notebooks padronizados
notebooks/eda/            → análise exploratória
notebooks/qualitizing/    → análise qualitativa/interpretativa
notebooks/enrichment/     → categorização e hierarquias
notebooks/analysis/       → P/Q/R-mode + Sequential

docs/research/            → fundamentação teórica, inventário de fontes
docs/backlog.md           → mapa de ataque, lacunas conhecidas

Reprodutibilidade

Este é um estudo N=1 — os dados são pessoais e não estão no repositório público. O código, o schema e os notebooks estão aqui para inspeção, reuso (em particular o schema cross-source e os extractors) e referência metodológica.

Para outra máquina minha, o setup completo:

python3 -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"
dvc pull                              # restaura processed/unified/curated do Drive
pytest                                # 172 testes

python scripts/ingest_cli.py          # ingestão incremental CLI (uso diário)
python scripts/run_pipeline.py        # rebuild completo (após fix de parser)

Captura por plataforma:

PYTHONPATH=. python scripts/{source}-export.py        # captura incremental
PYTHONPATH=. python scripts/{source}-reconcile.py     # merge histórico
PYTHONPATH=. python scripts/{source}-download-assets.py

Status

Entregue:

  • 13 parsers cobrindo 8 plataformas + manual saves
  • 7 extractors proprietários com captura incremental
  • 7 reconcilers com preservação de histórico
  • Pipeline orquestrado (parse + merge + DuckDB)
  • 172 testes (19 arquivos)
  • 5 notebooks da série canônica validados
  • 18 notebooks data-profile padronizados
  • Camada curada com hierarquia de 4 níveis (3.292 rows, 16 entities, 123 subs, 187 sub_subs)
  • Análise empírica P/Q/R-mode + Sequential
  • DVC backup operacional
  • Fundamentação teórica costurada com Mixed Analysis

Em andamento:

  • Integração do extractor proprietário do Claude.ai com o parser principal
  • Reconciliação semântica para parsers de manual saves
  • Aprofundamentos analíticos (notebook 05)
  • Cruzamento temporal com Archaeologist (392 projetos, 21 anos de histórico técnico)

Lista completa em docs/backlog.md.


Sobre

Marlon Lemes — Senior UX/CX Researcher e cientista de dados, São Paulo. Contato: hello.marlonlemes@gmail.com · GitHub: @mrlnlms

Este projeto é parte de uma trajetória mais longa de arqueologia digital pessoal (Archaeologist, Qualia Coding, Mirror Notes) e dialoga com pesquisa em métodos mistos, grounded theory e estudo etnográfico de interfaces.


"Turtles all the way down." Estudar AI usando AI que estuda como uso AI: a regressão é o método, não o problema.

About

Estudo longitudinal N=1 da interacao humano-AI (dez/2022 - abr/2026), 8 plataformas, ~5k conversas, ~170k mensagens

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors