Skip to main content
Glama

trigsight

ИИ-ассистент, который не может сделать заявление о моей работе, которое не может доказать.

Каждое фактическое утверждение, которое он выдаёт, привязано на этапе сборки к точному предложению, которое его подтверждает. Клик по цитате прокручивает страницу источника к этому предложению и выделяет его. Если цитируемый отрывок не существует в исходном документе, сборка завершается ошибкой — непроверяемое утверждение не может быть выпущено.

Зачем это существует

Портфолио-чатботы делают заявления о компетентности своего автора. У читателя нет способа их проверить, и есть веские причины не пытаться: измеренные показатели ошибок цитирования для общего ИИ-поиска превышают 60%, и только 51,5% сгенерированных предложений полностью подтверждаются цитируемыми источниками. Поэтому заявления обесцениваются, и функция становится украшением.

Обычное решение — ограничить модель корпусом и надеяться. Это помогает с галлюцинациями, но не с проверкой — читатель всё равно получает ссылку на целую страницу и должен искать предложение, подтверждающее конкретное утверждение.

Это переворачивает модель доверия. Модель никогда не пишет ссылку. Она называет отрывок; сборка сопоставляет его с индексом того, что документы на самом деле говорят, или отказывается выпускать.

Related MCP server: footnote

Измеренные результаты

Сопоставимое портфолио

trigsight

Производительность Lighthouse (мобильная)

62

100

Доступность · Лучшие практики · SEO

100 · 100 · 100

100 · 100 · 100

Крупнейшая отрисовка контента

3.9 s

1.9 s

Общее время блокировки

1,540 ms

~20 ms

Начальный JavaScript (brotli)

380.9 KB

133.9 KB

Сцена WebGL

нет

в производстве

Цитаты проверены по источнику

—

34 / 34

2.8× меньше JavaScript с работающей 3D-сценой. Обе цифры — реальная передача brotli по сети с развёрнутых сайтов, измеренная одним и тем же харнессом (bench/baseline/measure-payload.sh), по три запуска каждый — см. docs/05-results.md о том, почему измерение двух сторон разными способами завышало это до 3.4×.

Поиск, 30 вручную написанных золотых запросов при k=5:

Конфигурация

recall@5

MRR

Только лексический (BM25)

0.933

0.729

Гибрид (BM25 + локальная замена, RRF k=60)

0.967

0.831

Гибрид (BM25 + реальные эмбеддинги)

0.967

0.889

Реальные эмбеддинги — это text-embedding-3-small с 1536 измерениями, косинусная мера, через Upstash Vector. Три идентичных запуска. Обратите внимание, что изменилось: полнота не улучшилась, ранжирование улучшилось. При таком размере корпуса реальные эмбеддинги не находят более релевантные фрагменты, они ранжируют найденные выше — а это метрика, которая имеет значение, поскольку до модели доходят только первые шесть.

Как работает гарантия

flowchart TB
  subgraph build["BUILD"]
    MDX["content/*.mdx"] --> N["normalise: collapse whitespace, casefold"]
    N --> IDX["passage index"]
    IDX --> VER{"every cited passage present exactly once?"}
    VER -->|no| FAIL["EXIT 1 — build fails"]
    VER -->|yes| OK["allowlist.json"]
  end
  subgraph run["REQUEST"]
    Q["question"] --> R["hybrid retrieve: BM25 + vector, RRF"]
    R --> M["model"]
    M -->|emits a cite token| RES{"in allowlist?"}
    OK --> RES
    RES -->|yes| CHIP["chip with text-fragment deep link"]
    RES -->|no| DROP["dropped"]
  end

У модели нет механизма для создания URL, поэтому она не может создать неправильный. Инструкции в промпте — это просьба; отсутствующая возможность — это инвариант.

Часть, которая оказалась сложнее, чем кажется

Браузер, сопоставляющий #:~:text=, сравнивает с отрисованным текстом, и каждая часть директивы должна находиться внутри одного элемента. Два следствия, которые стоили реальной отладки:

  • Сравнение с исходным кодом не проходит для 3 из 7 отрывков, которые браузер сопоставляет нормально — отрывки, пересекающие новую строку, содержащие схлопнутые пробелы или отличающиеся регистром. Верификатор, который выдаёт ложные сбои, приучает вас отключать его.

  • Отрывок, охватывающий встроенную разметку, отображается как отдельные DOM-узлы и не может быть сопоставлен вообще, даже если уплощённый текст его содержит. Две из 34 цитат были в таком состоянии: сообщалось как привязанные, но на практике не сопоставимые. Обнаружено только при загрузке каждой собранной страницы и поиске её текста.

Оба теперь применяются, с регрессионными тестами. Верификатор также требует, чтобы каждый отрывок встречался ровно один раз, устраняя неоднозначность с помощью префикса, если это не так — иначе браузер молча прокручивает к неправильному вхождению, что является ошибкой корректности, которая выглядит как успех.

Быстрый старт

npm ci
npm run dev          # http://localhost:3000

Учётные данные не нужны. Без AI_GATEWAY_API_KEY конечная точка чата возвращает извлечённый контекст вместо ответа, поэтому поиск можно инспектировать отдельно.

Проверьте утверждения самостоятельно

npm run verify:citations                 # the gate: exits 1 on any unbound claim
npx tsx bench/citations/verify.ts --demo # watch it reject a fabricated passage
npm run eval:retrieval                   # recall@5 and MRR over the golden set
./bench/payload/measure.sh 3990 150      # initial JS against the budget
npm test                                 # 91 tests

Каждое число выше взято из одного из них. bench/ закоммичен и никогда не игнорируется — незакоммиченный харнесс превращает реальный результат в непроверяемое утверждение.

MCP-сервер

POST /api/mcp — stateless Streamable HTTP, спецификация 2026-07-28. Четыре инструмента проверки только для чтения, а не инструменты описания:

Инструмент

Ответы

list_work

Что задокументировано, с метриками, помеченными как проверенные или нет

find_evidence

Какие отрывки подтверждают утверждение — или прямо, что никакие

check_stack

Обсуждается ли технология в прозе или просто перечислена в стеке

read_work

Полный текст одного кейса

find_evidence изначально подтверждал "исследования квантовой криптографии на ионных ловушках". Векторная часть — это поиск ближайших соседей: она всегда возвращает ближайшие фрагменты, какими бы несвязанными они ни были. Агент, потребляющий это, повторил бы сфабрикованное удостоверение. Теперь требуется реальное лексическое совпадение, откалиброванное на 8/10 истинно положительных и 0/6 ложных положительных результатов на наборах утверждений, написанных вручную.

Ограничения

Сказано прямо, потому что раздел ограничений, который читается как маркетинг, бесполезен.

  • Запас над лексическим подходом — один запрос. При 34 фрагментах и 30 золотых запросах один запрос стоит 0,033 полноты — так что разрыв в полноте 0,034 между лексическим и гибридным — это один запрос. Не читайте таблицу как доказательство того, что гибрид в целом лучше. Она показывает, что гибрид не хуже и ранжирует лучше на этом корпусе.

  • Мой прогноз оказался неверным, и причина поучительна. Я предсказал, что реальные эмбеддинги исправят единственный пропущенный запрос. Они не исправили. Проверка векторной части в изоляции показала, что правильный фрагмент никогда не попадает в её топ-5 — потому что этот фрагмент состоит из 1 340 символов, охватывающих пять тем, а ответ — одно предложение из 871 символа. Его единственный вектор — это среднее пяти идей. Это проблема чанкинга, а не эмбеддингов, и никакая модель её не исправит. Зафиксировано, а не исправлено, потому что изменение чанкера сейчас аннулировало бы сравнение, ради которого существует таблица. См. bench/retrieval/results/real-embeddings-2026-08-21.md.

  • Без учётных данных векторная часть деградирует до детерминированной замены, которая не является семантической моделью. Поиск всё ещё отвечает через BM25, но качество действительно ниже — харнесс называет бэкенд при каждом запуске, чтобы число никогда не цитировалось без него.

  • Текстовые фрагменты хрупки по своей природе. Переформулировка цитируемого предложения ломает его ссылку. В этом суть шлюза сборки — вы не можете выпустить поломку — но это означает, что редактирование прозы иногда требует обновления цитаты.

  • Цитаты должны находиться внутри одного блочного элемента. Утверждение, которое лучше всего подтверждается текстом, охватывающим строку таблицы и абзац, не может быть процитировано как единый отрывок.

  • Корпус мал (6 документов, 34 фрагмента). Числа поиска здесь не следует читать как прогнозы для большого корпуса.

  • Нет потокового разрешения цитат. Чипы отображаются после завершения сообщения, а не в середине потока.

Стек

Next.js 16.3.1 · React 19.2.8 (закреплено — R3F 9 требует >=19 <19.3) · TypeScript · Tailwind v4.3.3 · Velite + Zod · three 0.185.1 + R3F 9.7.0 (закреплено) · Vercel AI Gateway

Лицензия

MIT — см. LICENSE.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables per-claim citation verification for AI-generated text by fetching cited sources and judging whether they support the claim, with verdicts and evidence quotes.
    52 npm
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables agents to verify their own output mid-task by checking every claim against provided sources, returning supported, partial, unsupported, or contradicted verdicts with exact citations.
    MIT
  • A
    license
    B
    quality
    C
    maintenance
    Enables revision-bound source audits with exact article fingerprinting, claim-to-source mapping, quotation verification, and immutable JSON evidence reports for prepublication review.
    9
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables AI agents to create verifiable, replayable citations, search private knowledge bases, and publish Markdown with verified citation markers.
    MIT