Цифровые двойники

Создавайте цифровые копии людей из переписок и общайтесь с ними

Создать персону

Загрузите экспорт из Telegram, текстовые файлы или аудиозаписи

📋

Мои персоны

Редактируйте, загружайте данные, запускайте синтез и проверку

💬

Чат

Общайтесь с двойниками — они говорят, думают и молчат как настоящие

{{ (p.name || '?')[0].toUpperCase() }}
{{ p.name }}
{{ statusLabel(p.status) }}
Полнота {{ p.completeness }}%
🎭

У вас ещё нет персон

{{ (currentPersona.name || '?')[0].toUpperCase() }}

{{ currentPersona.name }}

{{ statusLabel(currentPersona.status) }} Полнота: {{ currentPersona.completeness }}% 👤 {{ currentPersona.ownerName }}
📋 Обзор персоны
Полнота
{{ currentPersona.completeness }}%
Статус
{{ statusLabel(currentPersona.status) }}
Точность тестов
{{ analysisData.last_test_accuracy }}%
Чанков
{{ chunksData.stats.total }}

⚡ Быстрые действия

Главные операции с персоной.

📥 Данные и материалы

📤 Загрузка данных

Чем больше данных, тем точнее двойник. Загружайте экспорты из Telegram, тексты, аудио.

📁

Перетащите файлы или нажмите для выбора

Telegram JSON, TXT, MD, MP3, OGG, WAV, JPG, PNG

Файл отправлен. Обработка идёт в фоне...
{{ r.name }} {{ r.completenessAfter || 0 }}%
Полнота: {{ r.completenessBefore }}% → {{ r.completenessAfter }}% (+{{ r.completenessAfter - r.completenessBefore }}%)
{{ layer.label }} +{{ layer.added }} {{ layer.completeness }}%
Фрагментов: {{ r.stats.results || 0 }}, экстракций: {{ r.stats.extractions || 0 }}

📂 Файлы персоны

{{ showFiles ? '▲' : '▼' }}
{{ dir }} ({{ personaFiles[dir] ? personaFiles[dir].length : 0 }})
{{ f.name }} {{ f.sizeHuman }}
{{ f._open ? '▲' : '▼' }}
Загрузка...
{{ f._content }}
Пустой файл
Нет файлов в этой папке
🧠 Слои персоны

⚙️ Настройки персоны

{{ showSettings ? '▲' : '▼' }}
{{ lbl }}
✓ Сохранено

📊 Грани личности

{{ layer.label }} {{ layer.completeness }}%

Фактов: {{ layer.data ? Object.keys(layer.data).length : 0 }} Пробелов: {{ layer.gaps.length }}
{{ factKey.replace(/_/g, ' ') }}: {{ typeof val === 'object' ? (Array.isArray(val) ? val.join(', ').substring(0,100) : JSON.stringify(val).substring(0,100)) : String(val).substring(0,100) }}{{ (typeof val === 'string' && val.length > 100) || (typeof val === 'object' && JSON.stringify(val).length > 100) ? '…' : '' }}
Все факты ({{ Object.keys(layer.data).length }}) →
Нет данных

🔍 Ревизия данных

Поиск дубликатов, противоречий, мусорных записей и неправильно размещённых данных.

Объединения: {{ reviewResult.stats.merge || 0 }} Исправления: {{ reviewResult.stats.fix || 0 }} Переносы: {{ reviewResult.stats.move || 0 }} Удаления: {{ reviewResult.stats.delete || 0 }}
✓ Данные чистые — проблем не найдено
{{ {merge:'Объединить', fix:'Исправить', move:'Перенести', delete:'Удалить', rename:'Переименовать'}[p.type] || p.type }} {{ p.priority }}
{{ p.reason }}
Сейчас: {{ typeof p.current_value === 'object' ? JSON.stringify(p.current_value).substring(0,200) : String(p.current_value).substring(0,200) }}
Исправить на: {{ typeof p.proposed_value === 'object' ? JSON.stringify(p.proposed_value).substring(0,200) : String(p.proposed_value).substring(0,200) }}
Итого: {{ typeof p.target_value === 'object' ? JSON.stringify(p.target_value).substring(0,200) : String(p.target_value).substring(0,200) }}
Новый ключ: {{ p.target_key }}
{{ k }}: {{ personaLayers[p.layer] && personaLayers[p.layer].data && personaLayers[p.layer].data[k] ? (typeof personaLayers[p.layer].data[k] === 'object' ? JSON.stringify(personaLayers[p.layer].data[k]).substring(0,120) : String(personaLayers[p.layer].data[k]).substring(0,120)) : '—' }}
Новая структура:
{{ key }}: {{ typeof val === 'object' ? JSON.stringify(val).substring(0,200) : String(val).substring(0,200) }}
✓ Применено

🎤 Интервью

Ответьте на вопросы ИИ-интервьюера, чтобы заполнить пробелы в данных персоны.

Вопрос #{{ interviewQuestionCount }} · Полнота: {{ currentPersona.completeness }}%
{{ m.text }}
✓ Извлечено: {{ interviewLastExtracted.join('; ') }}
📦 Чанки корпуса

Разбивка исходных материалов персоны на смысловые чанки с автоматической атрибуцией (кто говорит) и оценкой содержательности. Основа для Этапа 3 архитектуры.

Всего
{{ chunksData.stats.total }}
85+ (отлично)
{{ chunksData.stats.by_score.excellent }}
70-84 (хорошо)
{{ chunksData.stats.by_score.good }}
<70 (слабо)
{{ chunksData.stats.by_score.weak }}
Ср. score
{{ chunksData.stats.avg_score }}
{{ chunkAttributionLabel(attr) }}: {{ count }}
Атрибуция:
Score:
{{ chunkFilterMinScore }}–{{ chunkFilterMaxScore }}
Чанки ещё не созданы. Нажмите «Запустить чанкинг».
{{ c.chunkId }} {{ chunkAttributionLabel(c.attribution) }} {{ c.score }} {{ c.charCount }} симв {{ c.source.file }}
{{ c.text }}
⚠ {{ f }}
{{ ['qa','tests'].includes(analysisTab) ? '🧪' : '🔬' }} {{ ['qa','tests'].includes(analysisTab) ? 'Тестирование' : 'Анализ корпуса' }}

Извлечение контринтуитивных позиций, речевого стиля, anti-markers и эталонных вопросов. Тестирование двойника с LLM-вердиктами и автоматическими рекомендациями.

📌 Позиции ({{ analysisData.positions ? analysisData.positions.length : 0 }})
⚡ Контринтуитивные ({{ analysisData.contrarians ? analysisData.contrarians.length : 0 }})
📖 Глоссарий ({{ analysisData.glossary ? analysisData.glossary.length : 0 }})
🎤 Стиль + anti-markers
❓ Reference QA ({{ analysisData.reference_qa && analysisData.reference_qa.qa ? analysisData.reference_qa.qa.length : 0 }})
🧪 Результаты тестов {{ analysisData.last_test_accuracy }}%
Данные анализа ещё не получены. Нажмите «Запустить анализ».
Ядро позиций ещё не извлечено. Запустите анализ.
#{{ pi + 1 }} {{ p.confidence }} ×{{ p.frequency }} {{ p.topic }} {{ p.layer }}
{{ p.position }}
Цитата: «{{ p.source_quote }}»
Контринтуитивные позиции не найдены. Запустите анализ.
{{ contrarianStrengthLabel(c.strength) }} {{ c.confidence }} {{ contrarianCategoryLabel(c.category) }} {{ c.layer }}
Моя позиция: {{ c.expert_position }}
Большинство считает: {{ c.mainstream_view }}
Почему контринтуитивно: {{ c.reasoning }}
Цитата из корпуса: «{{ c.source_quote }}»
Стилевой профиль ещё не извлечён. Запустите анализ.
Характерные обороты:
{{ p.text }} — {{ p.description }}
Как рассуждает:
{{ analysisData.style_profile.argumentation }}
Регистр:
{{ analysisData.style_profile.register }}
🚫 Запрещённые паттерны:
  • {{ f }}
⛔ Anti-markers (никогда не произносить):
«{{ a }}»
Глоссарий ещё не извлечён. Запустите анализ.
{{ glossaryCategoryLabel(cat) }}
{{ g.term }} ×{{ g.frequency }}
{{ g.definition }}
«{{ g.usage_example }}»
Эталонные Q/A ещё не сгенерированы. Запустите анализ.
Всего: {{ analysisData.reference_qa.counts.total || 0 }} Core: {{ analysisData.reference_qa.counts.core_position || 0 }} Contrarian: {{ analysisData.reference_qa.counts.contrarian || 0 }} Boundary: {{ analysisData.reference_qa.counts.boundary || 0 }}
{{ qi + 1 }}. {{ q.question }} {{ q.category }}
{{ q.expected_answer }}
Keywords: {{ q.expected_keywords.join(', ') }}
Тестовые прогоны ещё не выполнялись. Нажмите «Прогнать тесты».
Точность
{{ analysisData.last_test.metrics.accuracy_pct }}%
GOOD
{{ analysisData.last_test.metrics.good }}
PARTIAL
{{ analysisData.last_test.metrics.partial }}
POOR
{{ analysisData.last_test.metrics.poor }}
META LEAKS
{{ analysisData.last_test.metrics.meta_leaks }}
📋 Диагноз:
{{ analysisData.last_test.recommendations.diagnosis }}
🔥 Приоритетные правки:
  • {{ p }}
💡 Рекомендации:
  • {{ r }}
✓ Сильные стороны:
  • {{ s }}
Детали по вопросам ({{ analysisData.last_test.results.length }})
{{ ri + 1 }}. {{ r.question }} {{ r.verdict }}
⚠ META LEAK: «{{ r.meta_leak.phrase }}»
Ожидалось: {{ r.expected_answer }}
Ответ двойника: {{ r.twin_answer }}
{{ r.reason }}
🔮 Синтез и промпт

🧬 Синтез и проверка

Синтез создаёт цифрового двойника на основе собранных данных. Проверка ищет противоречия.

✓ Синтез завершён
📝 Системный промпт — создан
📋 Метаданные — созданы
📚 База знаний — построена
Персона готова — можно начать чат!

📝 Системный промпт

✓ Сохранено

Редактируйте системный промпт вручную — добавляйте детали, стиль речи, особые инструкции.

Этот текст используется как системный промпт при общении с цифровым двойником. Изменения сохраняются в vexpert.md.
{{ promptContent ? promptContent.length + ' символов' : '' }}
✏️ Новый чат
{{ (c.personaName || '?')[0] }}
{{ c.personaName || c.title }}
{{ c.lastMessage || 'Нет сообщений' }}
{{ formatTime(c.updatedAt) }}

{{ chats.length ? 'Ничего не найдено' : 'Нет чатов' }}

{{ (currentChatData.chat.personaName || '?')[0] }}

{{ currentChatData.chat.personaName }}

печатает...
{{ currentChatData.chat.title }}
Модель
Reasoning
Тема
↩ {{ replyToMsg.role === 'user' ? 'Вы' : currentChatData.chat.personaName }}: {{ replyToMsg.content.substring(0, 80) }}
💬

Выберите чат или создайте новый

Пользователи
Все персоны
Все чаты
ЛогинИмяРольСозданПоследний вход
{{ u.username }} {{ u.displayName }} {{ u.role }} {{ u.createdAt ? new Date(u.createdAt * 1000).toLocaleDateString('ru') : '—' }} {{ u.lastLogin ? new Date(u.lastLogin * 1000).toLocaleDateString('ru') : 'Никогда' }}
ПерсонаВладелецСтатусПолнотаСоздана
{{ p.name }} {{ p.ownerName }} Удалена {{ statusLabel(p.status) }} {{ p.completeness }}% {{ p.createdAt ? new Date(p.createdAt * 1000).toLocaleDateString('ru') : '—' }}
ЧатВладелецПерсонаСообщенийСтатусОбновлён
{{ c.title || '—' }} {{ c.ownerName }} {{ c.personaName }} {{ c.messages }} Удалён Активен {{ c.updatedAt ? new Date(c.updatedAt * 1000).toLocaleDateString('ru') : '—' }}

Нет чатов