/ Модель

Характеристики

Контекст
262 144 токена
Параметры
1,9 млрд
Размер весов
65,8 ГБ
Лицензия
Своя лицензия
Архитектура
nemotron_h · dense
Библиотека
transformers
Опубликована
31 авг 2026

IdeaLens

Генерация текстаТекст → текст

IdeaLens оценивает по структурированному плану документа, являются ли лежащие в его основе идеи человеческими или созданными ИИ.

393скачиваний за 30 дней0лайковвеса обновлены6 окт 2026

Бенчмарки

Как модель справилась с задачами пользователей ailist и что о ней публикуют открытые лидерборды

Тесты пользователейпока нет

Никто ещё не опубликовал тест этой модели. Соберите бенчмарк из своих задач — результат появится здесь.

  1. Добавьте модель в бенчмарк

    Вместе с другими моделями категории «Текст» — сравнение идёт внутри одной категории.

  2. Опишите свои задачи

    Напишите запросы, при необходимости приложите файлы и эталонные ответы.

  3. Запустите и опубликуйте

    Модели ответят на каждую задачу, судья оценит ответы. Опубликованный результат появится на этой странице.

Публичные оценки

Из открытых лидербордов. Сравнивайте результаты одного теста при одинаковых условиях — отсутствие оценки не значит, что модель хуже.

В подключённых источниках результатов для этой модели пока нет.

Что умеет модель

Описание составлено по карточке модели и метаданным Hugging Face

IdeaLens — языковая модель, разработанная Rishanth Rajendhran и соавторами для выявления происхождения идей в длинных текстах. Она получает упорядоченный план документа: пункты с содержанием идей и их дискурсивными ролями — и оценивает вероятность того, что идеи принадлежат человеку. Для оценки сравниваются вероятности следующих токенов «human» и «ai». Модель дообучена с помощью LoRA rank 64 на базе NVIDIA Nemotron 3.5 Lightning на планах миллиона англоязычных веб-документов из WildOutlines; планы перефразировали, чтобы отделить идеи от исходной формулировки текста.

Модель рассчитана на исследование авторства идей, в том числе случаев, когда человек пишет по плану, созданному ИИ. Для работы с произвольными документами пакет idealens сначала извлекает их план с помощью отдельной языковой модели, а IdeaLens оценивает уже этот план. Репозиторий предоставляет объединённые веса и адаптер; полный вариант требует около 59 ГиБ видеопамяти. Лицензия указана как other, поэтому условия следует сверить с карточкой репозитория перед использованием.

Сценарии применения

  • оценка происхождения идей в длинном тексте
  • проверка, написал ли человек текст по плану, созданному ИИ
  • анализ влияния человеческого плана на текст, сгенерированный моделью
  • исследовательская оценка детекторов ИИ-контента по структурированным планам

Ограничения

Модель оценивает структурированный план, а не исходный текст напрямую; для извлечения плана из документа требуется отдельный компонент. Полные веса требуют около 59 ГиБ видеопамяти, а лицензия обозначена как other.

Карточка модели

README от автора на Hugging Face, как он его опубликовал

Открыть на Hugging Face

IdeaLens

IdeaLens detects who came up with the ideas in a document, rather than who wrote its words. It reads a role-labelled outline of the document (an ordered list of items, each giving one idea and the discourse role it plays, such as Central Development or Open Question) and returns P(human), the probability that the ideas are human.

IdeaLens is nvidia/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-BF16 fine-tuned with LoRA (rank 64) on the outlines of 1M English web documents (WildOutlines). The training outlines were paraphrased to remove the documents' wording, so the model has to fit its labels through the ideas.

Try it in your browser: the IdeaLens & ProseLens demo scores your own text with both detectors, no installation or keys needed.

Results

From the paper:

  • IdeaLens is accurate both when a document's ideas and words come from the same source (95.3%) and when they come from different sources (81.3%). ProseLens, trained identically on the raw text, reaches 99.1% and 25.4%; Pangram 4 reaches 98.5% and 25.9%.
  • As models write from increasingly detailed human plans, IdeaLens's AI flag rate falls from 95% to 7%, while Pangram 4 still flags 92%. From AI-derived plans, IdeaLens stays above 96%.
  • On TwiceTold, 50 stories that human authors wrote from AI-generated plans, IdeaLens flags 68% as AI, against 8% for Pangram 4.
  • On 19 existing detection benchmarks, IdeaLens keeps strong detection rates at low false-positive rates across domains, formats and languages.

Usage

Scoring a document takes two steps:

  1. Extract an outline. An LLM writes the outline from the document, its format's role vocabulary and six worked examples (the paper uses Gemini 3.7 Flash). The idealens package ships the prompts, role vocabularies and worked examples, and runs this step. Score the outline as extracted; the paraphrasing step is only for training data.
  2. Score the outline with this model, as below.

Quick start: everything with the idealens package

idealens (PyPI) classifies each document's format, extracts its outline with the prompt, role vocabulary and worked examples IdeaLens was trained with, scores the outline on vLLM and applies the thresholds in this repo:

pip install "idealens[vllm]"
export GEMINI_API_KEY=...   # or --provider vertex | openai | anthropic | openrouter | compatible
idealens run docs.jsonl -o scores.jsonl --model IdeaLens --dry-run   # price the LLM calls first
idealens run docs.jsonl -o scores.jsonl --model IdeaLens

Input is JSONL with a text field per document. The same steps in Python:

import idealens as il

texts = [open("document.txt").read()]
formats = il.classify(texts)                  # one of the eight formats per document
outlines = il.extract(texts, formats)         # role-labelled outlines
with il.Detector("IdeaLens") as det:          # vLLM, with this repo's thresholds
    records = det.score_outlines(outlines, format=formats)

r = records[0]
print(r["p_human"], r["verdict"]["ai"], r["verdict"]["cut"])   # P(human); flagged at the 1% global cut?
print(outlines[0].render())                   # the outline that was scored

classify and extract call Gemini 3.7 Flash, the extractor the thresholds were fitted with; pass provider=idealens.providers.make("openai", "gpt-6-sol") (or Vertex, Anthropic, OpenRouter, a local server) to use another. Each record also carries verdicts at every calibrated false-positive rate under the global, per-format and per-topic schemes. The package README covers batch jobs, scoring outlines you already have and calibrating on your own data.

Without a GPU: Tinker

IdeaLens is also published on Tinker, which runs it on its own servers, so any laptop works. Sign up at auth.thinkingmachines.ai/sign-up, create an API key in the Tinker console, and run:

pip install "idealens[tinker]"
export TINKER_API_KEY=...
export GEMINI_API_KEY=...   # for outline extraction
idealens run docs.jsonl -o scores.jsonl --model IdeaLens --backend tinker

Tinker bills your account per token: about $0.50 per 1,000 documents for scoring at list price (--dry-run gives an estimate). The checkpoint is tinker://9f500a21-df39-5716-89e5-e65f9390fb14:train:0/sampler_weights/nemo_full_v1m_r64_ep1_final; on our checks its scores agree with the weights in this repo to about 0.002 in P(human).

Mix and match: extract with the package, score with your own code

import idealens as il

text = open("document.txt").read()
outline = il.extract([text], il.classify([text]))[0].render()   # one "[Role] content" line per item
print(p_human(outline))   # p_human (transformers) or p_human_batch (vLLM), defined below

The rest of this section runs the model directly.

Load the merged model (66 GB download)

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer

tok = AutoTokenizer.from_pretrained("rishanthrajendhran/IdeaLens")
model = AutoModelForCausalLM.from_pretrained("rishanthrajendhran/IdeaLens", dtype=torch.bfloat16, device_map="auto").eval()

The weights take 59 GiB of GPU memory, and each input adds more; see Hardware requirements.

Or apply the adapter to the base model (3 GB download)

adapter/ holds the LoRA adapter as trained, in the layout of the Tinker training service. If you already have the base model, load_adapter.py merges the adapter into it in memory. The resulting weights are bit-identical to the merged model's:

import importlib.util
from huggingface_hub import hf_hub_download

path = hf_hub_download("rishanthrajendhran/IdeaLens", "load_adapter.py")
spec = importlib.util.spec_from_file_location("load_adapter", path)
la = importlib.util.module_from_spec(spec); spec.loader.exec_module(la)
model, tok = la.load_model()   # base model + adapter/, then la.p_human(model, tok, outline)

Do not load adapter/ with peft.PeftModel. In transformers, Nemotron fuses the Mamba gate and x projections into one in_proj and stores each layer's 128 routed experts as a single 3D tensor, so PEFT has nowhere to attach most of the adapter and skips it without a warning; the model then scores close to the base model. tinker-cookbook's weights.build_hf_model can also merge the adapter into full weights.

Score an outline

Write the outline one item per line, as [Role] content, or take it from il.extract as above. IdeaLens compares the next-token probabilities of human and ai:

SYSTEM = "Given a role-labelled outline of a document, answer with one word: human if the source document was human-written, ai if it was AI-generated."
SUFFIX = "<|im_end|>\n<|im_start|>assistant\n<think>\n\n</think>\n\n"
HUMAN, AI = 50755, 2464   # token ids of "human" and "ai"

@torch.no_grad()
def p_human(outline):
    ids = tok.encode(f"<|im_start|>system\n{SYSTEM}<|im_end|>\n<|im_start|>user\n{outline}{SUFFIX}",
                     add_special_tokens=False)
    logits = model(torch.tensor([ids], device=model.device)).logits[0, -1].float()
    return torch.softmax(logits[[HUMAN, AI]], -1)[0].item()

outline = ("[Central Development] A town's water supply fails after a drought, and residents organise to share wells.\n"
           "[Background Context] The reservoir has been shrinking for three summers.\n"
           "[Open Question] Whether the council will fund a new pipeline remains undecided.")
print(p_human(outline))

Build the prompt string exactly as above rather than through the chat template.

Score with vLLM

For many inputs, vLLM is about 15 times faster than the code above and fits much longer inputs on one 80 GB GPU. With vLLM 0.21 (install xgrammar==0.2.1; later releases require transformers < 5), reusing SYSTEM, SUFFIX, HUMAN and AI from above:

import math, os
os.environ.setdefault("VLLM_USE_FLASHINFER_SAMPLER", "0")   # FlashInfer kernels compile CUDA code and need nvcc
os.environ.setdefault("VLLM_USE_FLASHINFER_MOE_FP16", "0")
os.environ.setdefault("VLLM_USE_DEEP_GEMM", "0")            # H100 warmup crashes when DeepGEMM is not installed
from transformers import AutoTokenizer
from vllm import LLM, SamplingParams

tok = AutoTokenizer.from_pretrained("rishanthrajendhran/IdeaLens")
llm = LLM(model="rishanthrajendhran/IdeaLens", dtype="bfloat16", max_num_seqs=256, enable_prefix_caching=False,
          max_logprobs=20, enable_flashinfer_autotune=False, seed=0)
sp = SamplingParams(max_tokens=1, temperature=0.0, logprobs=20)

def p_human_batch(outlines):
    prompts = [{"prompt_token_ids": tok.encode(f"<|im_start|>system\n{SYSTEM}<|im_end|>\n<|im_start|>user\n{x}{SUFFIX}",
                                               add_special_tokens=False)} for x in outlines]
    out = []
    for r in llm.generate(prompts, sp, use_tqdm=False):
        lp = r.outputs[0].logprobs[0]           # the top 20 next-token log-probabilities
        out.append(1 / (1 + math.exp(lp[AI].logprob - lp[HUMAN].logprob)))
    return out

# when done: without this, vLLM 0.21 keeps a script running after its last line
llm.llm_engine.engine_core.shutdown()

max_num_seqs=256 keeps every running sequence's Mamba state in memory; vLLM's H100 default (1,024) does not fit beside the weights. If human or ai is missing from the top 20 (rare), score the prompt followed by each label token with SamplingParams(max_tokens=1, prompt_logprobs=0) and read the last prompt log-probability of each. Scores agree with the training-time scores to about 0.001 in P(human) on average; A100 and H100 GPUs differ by as much.

Thresholds

IdeaLens flags a document as having AI ideas when P(human) is below a cut. Each cut is set so that a given share of human documents is flagged (the false-positive rate, FPR), measured on the 80,000 human documents in WildOutlines's calibration split (10,000 per format). The paper's operating point is the global cut at 1% FPR.

FPR0.1%0.5%1%2%5%10%20%
Global cut0.016910.072790.137120.340470.727130.897980.97156

Per-format cuts give each format its own operating point. They need the document's format, which the paper assigns with WebOrganizer's annotation prompt run on Gemini 3.7 Flash; the calibration documents use the formats recorded in WildOutlines. Each is the format's own quantile, shrunk toward the global cut with weight n / (n + 2500); at 0.1% FPR 10,000 documents per format are too few, so there is no per-format cut. A document outside these eight formats has no per-format cut; do not fall back to the global cut for it.

Format0.5%1%2%5%10%20%
Nonfiction Writing0.053580.089890.170220.540600.867240.96940
Knowledge Article0.069440.107000.208190.611700.885680.97190
Personal Blog0.094600.252140.505990.785960.909890.97157
News Article0.049700.091700.236100.575160.812880.94887
Academic Writing0.160450.371090.630820.872850.953100.98617
User Reviews0.089560.247480.466540.797740.930540.97995
Personal About Page0.082800.178240.398230.715190.875890.95970
Creative Writing0.208310.353150.549430.790250.907770.96932

thresholds.json holds every cut at full precision, plus per-topic cuts for the WebOrganizer topics with enough calibration documents.

These rates hold for English web documents like the training data. For another domain, fit the cut on human documents from that domain.

Hardware requirements

Measured with transformers 5.15 in bf16 on NVIDIA H100 80GB GPUs (our other runs used A100 80GB), with transformers' PyTorch implementation of the Mamba layers (no fused Mamba kernels installed). We have not tried CPU-only inference.

Merged modelAdapter route (load_adapter.py)
Download65.8 GB65.8 GB base model + 3.1 GB adapter
Peak CPU RAM while loading60 GiB60 GiB
GPU memory once loaded58.8 GiB58.8 GiB (66 GiB during the ~10 s it takes to apply the adapter)

GPU memory then grows with the length of the input, by about 4.2 MiB per token at typical lengths, scoring one input at a time:

Input tokens5001,0002,0004,0008,000
Peak GPU memory, one 80 GB GPU61.0 GiB63.1 GiB67.3 GiB75.7 GiBdoes not fit
Peak memory per GPU, two 80 GB GPUs (device_map="auto")47.4 GiB63.7 GiB
Seconds per input, H1000.180.340.661.322.70

Inputs of 6,000 tokens do not fit on one 80 GB GPU and 12,000 do not fit on two; lowering the Mamba chunk size from 128 to 64 did not change either limit.

IdeaLens reads outlines, which are short. The outlines in WildOutlines's calibration split average about 640 tokens with the prompt, and the longest is under 3,800, so one 80 GB GPU (A100 80GB or H100 80GB) is enough. Outline extraction runs through an LLM API and needs no local GPU.

Intended use and limitations

  • IdeaLens estimates the provenance of a document's ideas. It should not be the sole basis for decisions about a person's work.
  • It was trained on English web documents of at least 500 words in eight long-form formats (Nonfiction Writing, Knowledge Article, Personal Blog, News Article, Academic Writing, User Reviews, Personal About Page, Creative Writing).
  • Its training labels come from the Pangram prose detector, applied to whole documents. They record who wrote the prose; the model learns idea provenance from them only through outlines.
  • Errors in outline extraction carry into the score.

Related models

ModelBackboneReads
IdeaLens (this model)Nemotron-3.5-Lightning-30B-A3B, LoRAoutline
ProseLensNemotron-3.5-Lightning-30B-A3B, LoRAdocument text
IdeaLens-NoParaphraseNemotron-3.5-Lightning-30B-A3B, LoRAoutline, trained without paraphrasing
IdeaLens-Qwen3.5-9BQwen3.5-9B, classification headoutline
IdeaLens-ModernBERT-LModernBERT-largeoutline
ProseLens-ModernBERT-LModernBERT-largedocument text
IdeaLens-LogisticClassifierlogistic regression over text-embedding-3-largeoutline
IdeaLens-ModernBERT-L-NoParaphraseModernBERT-largeoutline, trained without paraphrasing
IdeaLens-ModernBERT-L-RolesOnlyModernBERT-largerole labels only
IdeaLens-Qwen3.5-9B-PerItemQwen3.5-9B, classification headsingle outline items, pooled
IdeaLens-ModernBERT-L-PerItemModernBERT-largesingle outline items, pooled
IdeaLens-LogisticClassifier-PerItemlogistic regression over text-embedding-3-largesingle outline items, pooled

Training data: WildOutlines.

All IdeaLens models and datasets are in the IdeaLens collection.

License

OpenMDW-1.1, the license of the base model (see LICENSE).

Citation

@article{idealens2026,
  title         = {IdeaLens: Detecting AI Ideas in Long-form Writing},
  author        = {Rajendhran, Rishanth and Choi, Minjoon and Russell, Jenna and Namuduri, Ramya and B{\"o}l{\"o}ni-Turgut, Deniz and Karpinska, Marzena and Wieting, John and Iyyer, Mohit},
  journal       = {arXiv preprint arXiv:2610.06778},
  year          = {2026},
  eprint        = {2610.06778},
  archivePrefix = {arXiv},
  primaryClass  = {cs.CL},
  url           = {https://arxiv.org/abs/2610.06778}
}

Как запустить

На своей GPU в ailist. Цена — по текущим предложениям провайдеров

GPU в ailist

Универсальный рантайм · transformers

Можно запустить

Подбираем GPU…

Класс архитектуры
NemotronHForCausalLM
Ревизия весов
df00167

0 моделей