commit 9575eaf8eeba310860f36b657b4ee7f70fbe4c9c Author: Shuvalov Evgeny Date: Sun Feb 1 17:01:21 2026 +0300 init diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..a7c5d6d Binary files /dev/null and b/.DS_Store differ diff --git a/1_анализ_главы/README.md b/1_анализ_главы/README.md new file mode 100644 index 0000000..873c6fb --- /dev/null +++ b/1_анализ_главы/README.md @@ -0,0 +1,41 @@ +# Анализ главы по блокам + +Анализ выполняется последовательно по четырём блокам. Каждый следующий шаг получает **весь накопленный JSON** (уже извлечённые блоки) для согласованности. После каждого блока — валидация (см. `2_валидация_анализа_по_блокам/`), затем склейка. + +## Входные данные (JSON) + +Вход этапа 1 — один JSON-файл на главу. Поля используются в подстановках промптов и передаются по пайплайну до шага 7 (payload в Qdrant). + +| Поле | Тип | Обязательно | Описание | +|------|-----|-------------|----------| +| `book_id` | string (UUID) | да | ID книги | +| `chapter_id` | string (UUID) | да | ID главы (на шаге 7 — id точки в Qdrant) | +| `chapter_number` | integer | да | Номер главы | +| `chapter_title` | string | да | Название главы → `{chapter_title}` | +| `book_title` | string | да | Название книги → `{book_title}` | +| `chapter_text` | string | да | Текст главы → `{chapter_text}` | +| `author` | string | нет | Автор книги (для payload на шаге 7) | + +**Файлы:** `вход_главы.spec.json` — описание формата (JSON Schema); `вход_главы.example.json` — пример. Имя входного файла на главу — на усмотрение пайплайна (например `input.json` или `{book_id}_{chapter_id}.json`). + +## Порядок генерации + +| Шаг | Промпт | Вход | Выход | +|-----|--------|------|-------| +| 1 | extract_framework.txt | текст главы | `framework` | +| 2 | extract_insights.txt | текст главы + framework | `insights` | +| 3 | extract_application.txt | текст главы + framework + insights | `application` | +| 4 | extract_limitations.txt | текст главы + framework + insights + application | `limitations` | + +## Подстановки в промптах + +- **Во всех:** `{book_title}`, `{chapter_title}`, `{chapter_text}` +- **Только в шагах 2–4:** `{previous_blocks_json}` — весь накопленный JSON (все уже завалидированные предыдущие блоки). Пример: для extract_insights подставляем только `framework`; для extract_application — объект с ключами `framework` и `insights`; для extract_limitations — объект с `framework`, `insights`, `application`. + +## Склейка + +Четыре ответа (по одному JSON-объекту с ключом framework / insights / application / limitations) объединяются в один анализ: слияние ключей верхнего уровня без вызова LLM. + +## Монолитный промпт + +`chapter_analysis_qwen3_prompt.txt` — исходный промпт «всё в одном»; оставлен для сравнения и отката. diff --git a/1_анализ_главы/extract_application_v2.txt b/1_анализ_главы/extract_application_v2.txt new file mode 100644 index 0000000..d3d758b --- /dev/null +++ b/1_анализ_главы/extract_application_v2.txt @@ -0,0 +1,67 @@ +Ты — эксперт по анализу нон-фикшн. +Извлеки из главы только блок «применение» (application): +конкретные техники и практические шаги. + +Контекст: +- Книга: "{book_title}" +- Глава: "{chapter_title}" +- Текст главы: {chapter_text} +- Уже извлечённые блоки framework и insights (для согласованности): {previous_blocks_json} + +--- + +## ЗАДАЧА + +Извлеки техники и упражнения: название, цель, пошаговые шаги (steps), пример контекста, фразу для клиента, измеримые критерии успеха. Техники должны опираться на принципы (framework) и инсайты; не придумывай то, чего нет в тексте. +- Объединяй по сути одну и ту же технику: не дублируй её под разными названиями; если в главе несколько вариантов одной идеи — одна техника с уточнёнными шагами. +- Краевые случаи: если в главе описана одна техника — верни один элемент в techniques. Если явных техник или упражнений в главе нет — верни пустой массив: "techniques": []. Не придумывай техники ради заполнения. + +## СТРОГИЕ ПРАВИЛА + +1. Не пересказывай текст и не цитируй большие фрагменты; работай на уровне обобщений и смысловых единиц. +2. Язык простой, разговорно-профессиональный. При первом использовании в goal, steps или client_phrase слов «триггер», «стимул», «паттерн» и т.п. добавь в скобках пояснение в 3–7 слов, например: стимул (то, что в окружении запускает действие). +3. Каждая техника должна быть: + - понятна без дополнительного объяснения; + - приземлена к реальному поведению и к повседневной ситуации (работа, дом, отношения); + - у каждой техники обязательно заполни context_example: один бытовой пример ситуации, где техника применима. +4. steps — только из текста главы; без выдуманных шагов. При необходимости добавь шаг про отслеживание результата (что записать или отметить). +5. success_criteria — как можно более измеримо: укажи, что именно должно измениться (частота, длительность, количество эпизодов) и за какой промежуток времени (например: «количество эпизодов X снижается с N до M в течение T дней»). +6. Избегай чрезмерной абстракции и канцелярита; формулировки живые, но точные. +7. Не используй вводные фразы, обращение к читателю и объяснения формата. + +--- + +## КРИТИЧНО ДЛЯ ФОРМАТА + +- steps — только из текста главы; не выдумывай шаги. +- У каждой техники — context_example с одним бытовым примером ситуации (работа, дом, отношения). +- success_criteria — измеримый критерий: что меняется (частота/длительность/количество), за какой срок; без размытых формулировок. +- Если в главе нет описанных техник или упражнений — верни "techniques": []. +- Не дублируй по сути одну технику под разными названиями. + +--- + +## ФОРМАТ ОТВЕТА + +Строго один JSON-объект с единственным ключом верхнего уровня "application", без комментариев и markdown: + +{ + "application": { + "techniques": [ + { + "name": "Название техники или упражнения", + "goal": "Какую конкретную привычку, навык или поведение это помогает изменить", + "context_example": "Короткий пример жизненной ситуации, где техника применима (например: вечер после работы, когда тянет залипнуть в телефон)", + "steps": [ + "Шаг 1: ... (при необходимости — мини-рефлексия или запись наблюдений)", + "Шаг 2: ...", + "Шаг 3: ... (при необходимости — шаг про отслеживание результата: что записать или отметить)" + ], + "client_phrase": "Как это просто объяснить или сформулировать для клиента", + "success_criteria": "Измеримый критерий: что именно меняется (частота, длительность, количество эпизодов) и за какой срок (например: количество эпизодов X снижается с N до M в течение T дней)" + } + ] + } +} + +Верни только этот объект — ничего до и после. diff --git a/1_анализ_главы/extract_application_v2_filled.txt b/1_анализ_главы/extract_application_v2_filled.txt new file mode 100644 index 0000000..8834044 --- /dev/null +++ b/1_анализ_главы/extract_application_v2_filled.txt @@ -0,0 +1,194 @@ +Ты — эксперт по анализу нон-фикшн. +Извлеки из главы только блок «применение» (application): +конкретные техники и практические шаги. + +Контекст: +- Книга: "{book_title}" +- Глава: "{chapter_title}" +- Текст главы: В 1971 году, когда шел шестнадцатый год войны во Вьетнаме, два американских конгрессмена, Роберт Стил из Коннектикута и Морган Мерфи из Иллинойса, сделали открытие, которое потрясло американское общество. Во время посещения воинских частей они выяснили, что более 15% американских солдат во Вьетнаме имели зависимость от героина. Более поздние исследования показали, что 35% американского контингента во Вьетнаме когда-либо пробовало героин и почти 20% страдало наркотической зависимостью – то есть проблема оказалась еще серьезнее, чем им показалось вначале.Это открытие вызвало бурную активность в Вашингтоне, включая создание по распоряжению президента Ричарда Никсона Специального комитета по предупреждению злоупотреблений наркотиками, целью деятельности которого была профилактика наркомании, а также реабилитация и отслеживание судеб наркозависимых солдат после возвращения на родину.Ли Робинс был одним из исследователей комитета. В ходе исследования, результаты которого перевернули все имевшиеся представления о наркологии, он обнаружил, что только 5% наркозависимых солдат снова начинали принимать героин в течение первого года после возвращения из реабилитационного центра и всего 12% делали это в течение трех лет. Иными словами, девять солдат из десяти избавлялись от наркотической зависимости после того, как покидали Вьетнам.Это открытие полностью противоречило всем представлениям наркологов того времени, согласно которым героиновая зависимость считалась постоянной и необратимом болезнью. Однако в противоположность этим представлениям Робинс обнаружил, что эта зависимость может спонтанно исчезнуть в случае полной смены окружения. Во Вьетнаме солдаты проводили все свое время в окружении стимулов, провоцировавших употребление героина: его было просто достать, а сами они находились под воздействием постоянного стресса войны; они строили дружеские отношения с сослуживцами, которые уже принимали героин, и находились в тысяче миль от дома. Но как только солдат возвращался в США, он оказывался в среде, лишенной этих стимулов. Как только менялся контекст, менялась и привычка.Сравните эту ситуацию с ситуацией типичного наркомана. Он становится наркозависимым дома или в компании друзей, затем попадает в клинику, где проходит реабилитацию и «очищается»– при этом находясь в среде, лишенной стимулов, которые сформировали его привычку, а затем возвращается в прежнее окружение со всеми стимулами, которые уже спровоцировали наркозависимость в первый раз. Поэтому неудивительно, что обычно наблюдается огромное количество примеров, прямо противоположных тем, что мы только что видели в рамках Вьетнамской кампании. Как правило, 90% героиновых наркоманов снова становятся зависимыми после возвращения с реабилитации.Вьетнамские исследования противоречат многим нашим культурным убеждениям относительно дурных привычек, поскольку ставят под сомнение шаблонную ассоциацию нездорового поведения с моральной слабостью. Если у вас избыточный вес, вы курите или страдаете наркозависимостью, вам всю жизнь говорят, что причиной этого является недостаток самоконтроля – а иногда даже говорят, что вы плохой человек. Идея о том, что немного дисциплины способно решить все проблемы, глубоко укоренилась в нашей культуре.Однако недавние исследования свидетельствуют о прямо противоположных фактах. Когда ученые анализируют поведение людей, которые, казалось бы, обладают выдающимся самоконтролем, выясняется, что эти люди ничем не отличаются от тех, кто постоянно борется с вредными привычками. «Дисциплинированные» люди лучше справляются со структурированием своей жизни способами, которые не требуют героической силы воли и самоконтроля. Иначе говоря, они тратят меньше времени, чтобы справиться с теми или иными ситуациями.Люди с развитым самоконтролем, как правило, меньше всех нуждаются в его применении. Проще практиковать выдержку и самоконтроль, когда не приходится использовать их слишком часто. Таким образом, действительно, упорство, твердость характера и сила воли очень важны для достижения успеха, но способ развить эти качества заключается не в том, чтобы стать более дисциплинированным человеком, а в том, чтобы создать более дисциплинированную среду вокруг себя.Эта парадоксальная идея становится еще более логичной, когда вы начинаете понимать, что происходит в процессе формирования привычки в мозгу. Привычка, которая уже закодирована в нем, «готова к использованию» влюбой момент, как только наступит соответствующая ситуация. Когда Пэтти Олвэлл, врач из Остина, Техас, начала курить, она часто закуривала во время верховой прогулки со своим другом. В конце концов она перестала курить и не курила много лет. Она также перестала ездить верхом. Спустя десятилетия она снова села на лошадь и вскоре заметила, что впервые за много лет ей очень хочется курить. Стимулы все еще были актуальны, они просто не проявлялись в течение долгого времени.Если привычка укоренилась в мозгу, призыв к действию появляется каждый раз, когда возникают соответствующие стимулы во внешней среде. Это одна из причин, по которой техники по изменению поведения могут вызвать негативные последствия. Если вы будете смущать людей с избыточным весом, постоянно демонстрируя им презентации по снижению веса, то они могут ощутить стресс, и в результате большая часть из них вернется к своей излюбленной стратегии преодоления стресса – перееданию. Когда вы показываете курильщикам легкие с затемнениями, это приводит к повышению уровня тревожности, в результате чего многие люди хватаются за сигарету. Таким образом, если вы невнимательно относитесь к стимулам, то можете спровоцировать именно то поведение, которого хотите избежать.Можно сказать, что дурные привычки являются аутокаталитическими: процесс подпитывает сам себя. Они усиливают чувства, которые человек пытается подавить. Например, вы чувствуете себя плохо, и поэтому начинаете есть фастфуд. От того, что вы его едите, вы начинаете чувствовать себя плохо. Просмотр телевизора вызывает сонливость, поэтому вы смотрите его еще больше, так как вам не хватает энергии на что-то другое. Беспокойство о своем здоровье заставляет вас испытывать тревогу, которая в свою очередь вызывает желание покурить, чтобы успокоиться, но это способствует ухудшению здоровья, из-за чего ваше беспокойство в ближайшее время только усилится. Это своего рода нисходящая спираль, потерявший управление «поезд дурных привычек».Ученые называют этот феномен «желание, вызванное стимулом»: внешний триггер вызывает навязчивое стремление повторить дурную привычку. Как только вы замечаете что-то, вы начинаете хотеть этого. Это процесс происходит постоянно – часто мы даже не замечаем его. Ученые установили, что если всего на тридцать три миллисекунды показать изображение кокаина наркозависимым, это стимулирует в мозгу стремление к подкреплению и вызывает страстное желание принять наркотик. Это очень непродолжительное время, за которое мозг не успевает сознательно зарегистрировать увиденное – наркозависимые даже не смогут рассказать вам, что они видели,– и тем не менее все они одинаково захотят получить наркотик.Именно в этом заключается ключевой момент: вы можете избавиться от привычки, но не способны забыть ее. Если мыслительные паттерны, характерные для привычки, были зафиксированы в мозгу, их практически невозможно удалить полностью – даже если они не используются в течение продолжительного времени. А это значит, что простое противостояние искушению будет неэффективной стратегией. Очень сложно сохранить созерцательное и философское отношение к жизни, полной сложностей и противоречий. Это требует слишком много энергии. Поэтому в краткосрочной перспективе мы можем выбрать стратегию противостояния искушению. Однако в долгосрочной перспективе мы неизбежно становимся продуктом той среды, в которой живем. Откровенно говоря, мне ни разу не приходилось увидеть человека, последовательно приверженного хорошим привычкам в негативном окружении.Более надежным подходом будет искоренение плохих привычек в их исходной точке. Один из наиболее практичных способов устранить плохую привычку – это снизить воздействие на себя стимула, который провоцирует ее.•Если вы никак не можете закончить работу, оставьте телефон в другой комнате на несколько часов. Если вы постоянно ощущаете, что вам чего-то не хватает, прекратите просматривать профили других людей в социальных сетях – это вызывает ревность и зависть.•Если вы тратите слишком много времени на просмотр телевизора, уберите телевизор из спальни.•Если вы тратите слишком много денег на гаджеты, перестаньте читать обзоры последних технических новинок.•Если вы слишком много играете в видеоигры, после каждого использования отключайте приставку и убирайте ее в шкаф.Эта практика – не что иное, как обратная трактовка первого закона изменения поведения. Вместо того чтобы делать что-то очевидным, вы можете сделать это неочевидным. Я часто удивляюсь тому, насколько эффективными могут быть такие незначительные изменения. Уберите один-единственный стимул, и вся привычка уйдет вместе с ним.Самоконтроль – краткосрочная, а не долгосрочная стратегия. Вы можете противостоять искушению один или два раза, но не сможете каждый раз собирать волю в кулак, чтобы побеждать желания. Вместо этого лучше потратьте энергию на организацию своего окружения. В этом и заключается секрет самоконтроля. Сделайте стимулы хороших привычек очевидными, а стимулы плохих привычек – незаметными. РЕЗЮМЕ•Обратная трактовка первого закона изменения поведения звучит так: «Сделайте это неочевидным».•Когда привычка сформирована, ее практически невозможно забыть.•Люди с высокой степенью самоконтроля, как правило, тратят меньше времени, чтобы справляться со сложными ситуациями. Проще избежать искушения, чем противостоять ему.•Одним из наиболее практичных способов избавиться от плохой привычки является сокращение проявлений стимула, который вызывает ее.•Самоконтроль – это краткосрочная, а не долгосрочная стратегия. + +- Уже извлечённые блоки framework и insights (для согласованности): +{ + "framework": { + "terms": { + "стимул": "что в окружающей среде заставляет человека действовать", + "привычка": "повторяющееся действие, которое становится автоматическим", + "подкрепление": "воздействие, усиливающее вероятность повторения действия", + "среда": "окружение, влияющее на поведение через стимулы и ограничения", + "желание, вызванное стимулом": "непроизвольная тяга к действию, спровоцированному внешним триггером", + "аутокаталитический процесс": "процесс, усиливающий себя сам" + }, + "principles": [ + { + "title": "Среда формирует поведение", + "description": "Человек не управляет привычками напрямую, а воздействует на окружение, чтобы оно вело его к нужным действиям", + "example": "Убрать телефон с рабочего стола, чтобы не отвлекаться на соцсети", + "chains": [ + { + "cause": "Человек находится в среде с доступными стимулами для нежелательной привычки", + "mechanism": "Стимул активирует уже сформированную привычку, которая запускает автоматическое действие", + "result": "Человек повторяет вредную привычку, не осознавая этого" + }, + { + "cause": "Изменяется среда, удаляются стимулы, провоцирующие нежелательную привычку", + "mechanism": "Отсутствие триггеров снижает вероятность срабатывания привычки", + "result": "Человек реже проявляет нежелательное поведение" + } + ] + }, + { + "title": "Привычки не исчезают, они только временно подавлены", + "description": "Даже если человек перестаёт делать что-то, привычка остаётся в мозге и может вернуться при подходящих условиях", + "example": "Человек перестаёт курить, но снова начинает после посещения места, где раньше курил", + "chains": [ + { + "cause": "Человек прекращает проявлять вредную привычку", + "mechanism": "Мозг сохраняет нейронные связи, связанные с этой привычкой", + "result": "Привычка может вернуться, если появятся подходящие стимулы" + }, + { + "cause": "Окружение меняется, и в нем появляются триггеры, связанные с прошлой привычкой", + "mechanism": "Стимулы запускают автоматические паттерны поведения", + "result": "Человек снова начинает делать то, что уже перестал" + } + ] + }, + { + "title": "Самоконтроль — это краткосрочный, а не долгосрочный инструмент", + "description": "Противостояние искушению неэффективно на длительном сроке, нужно менять контекст", + "example": "Человек отказывается от сладкого, но возвращается к нему после стрессового дня", + "chains": [ + { + "cause": "Человек пытается контролировать себя в момент искушения", + "mechanism": "Это требует энергии и усилий, которые невозможно поддерживать всегда", + "result": "Человек устаёт от борьбы и возвращается к нежелательной привычке" + }, + { + "cause": "Человек изменяет окружение, чтобы искушения стали менее доступными", + "mechanism": "Стимулы для плохого поведения становятся незаметными или невозможными", + "result": "Человек реже сталкивается с искушением" + } + ] + }, + { + "title": "Дисциплина — это настройка среды, а не внутреннее усилие", + "description": "Сильные люди не просто дисциплинированы, а живут в среде, которая поддерживает их цели", + "example": "Человек встаёт раньше, потому что спальня тёмная и не имеет гаджетов", + "chains": [ + { + "cause": "Человек пытается быть дисциплинированным только силой воли", + "mechanism": "Это требует большого количества энергии и часто неудачно", + "result": "Человек теряет мотивацию и возвращается к нежелательному поведению" + }, + { + "cause": "Человек настраивает окружение так, чтобы хорошее поведение было лёгким", + "mechanism": "Стимулы для правильных действий становятся более доступными", + "result": "Человек чаще выбирает здоровые привычки" + } + ] + }, + { + "title": "Негативные эмоции усиливают негативное поведение", + "description": "Стресс, тревога и другие негативные чувства провоцируют возвращение к вредным привычкам", + "example": "Человек садится на диван и ест шоколад, когда ему плохо", + "chains": [ + { + "cause": "Человек испытывает стресс или негативные эмоции", + "mechanism": "Это активирует привычку, которая помогает снизить дискомфорт", + "result": "Человек снова начинает делать то, что раньше снимало напряжение" + }, + { + "cause": "Человек пытается избавиться от вредной привычки, но не меняет среду", + "mechanism": "Стресс и негативные эмоции остаются, усиливая желание к действию", + "result": "Человек возвращается к нежелательной привычке" + } + ] + } + ] + }, + "insights": [ + { + "title": "Среда влияет на привычки больше, чем сила воли", + "description": "Чтобы изменить привычку, нужно изменить окружение, а не надеяться только на самоконтроль", + "example": "Убрать телефон с рабочего стола, чтобы не отвлекаться на соцсети" + }, + { + "title": "Привычки не исчезают, только временно подавляются", + "description": "Даже если человек перестаёт курить или есть сладкое, эти привычки остаются в мозге и могут вернуться при подходящих условиях", + "example": "После посещения бара человек снова начинает пить, не осознавая этого" + }, + { + "title": "Негативные эмоции усиливают вредное поведение", + "description": "Стресс, тревога и другие негативные чувства могут спровоцировать возвращение к старым привычкам", + "example": "После ссоры человек снова начинает есть вредную пищу, чтобы успокоиться" + }, + { + "title": "Сокращение стимулов уменьшает повторение нежелательного поведения", + "description": "Удаление триггеров, связанных с вредной привычкой, снижает вероятность её возобновления", + "example": "Убрать сигареты из дома, чтобы уменьшить вероятность их употребления" + }, + { + "title": "Самоконтроль — это временная стратегия, а не долгосрочное решение", + "description": "Постоянно бороться с искушением утомительно и непрочное; нужно настраивать среду так, чтобы искушений не было совсем", + "example": "Поставить телефон в другую комнату, чтобы не проверять соцсети во время работы" + } + ] +} + +--- + +## ЗАДАЧА + +Извлеки техники и упражнения: название, цель, пошаговые шаги (steps), пример контекста, фразу для клиента, измеримые критерии успеха. Техники должны опираться на принципы (framework) и инсайты; не придумывай то, чего нет в тексте. +- Объединяй по сути одну и ту же технику: не дублируй её под разными названиями; если в главе несколько вариантов одной идеи — одна техника с уточнёнными шагами. +- Краевые случаи: если в главе описана одна техника — верни один элемент в techniques. Если явных техник или упражнений в главе нет — верни пустой массив: "techniques": []. Не придумывай техники ради заполнения. + +## СТРОГИЕ ПРАВИЛА + +1. Не пересказывай текст и не цитируй большие фрагменты; работай на уровне обобщений и смысловых единиц. +2. Язык простой, разговорно-профессиональный. При первом использовании в goal, steps или client_phrase слов «триггер», «стимул», «паттерн» и т.п. добавь в скобках пояснение в 3–7 слов, например: стимул (то, что в окружении запускает действие). +3. Каждая техника должна быть: + - понятна без дополнительного объяснения; + - приземлена к реальному поведению и к повседневной ситуации (работа, дом, отношения); + - у каждой техники обязательно заполни context_example: один бытовой пример ситуации, где техника применима. +4. steps — только из текста главы; без выдуманных шагов. При необходимости добавь шаг про отслеживание результата (что записать или отметить). +5. success_criteria — как можно более измеримо: укажи, что именно должно измениться (частота, длительность, количество эпизодов) и за какой промежуток времени (например: «количество эпизодов X снижается с N до M в течение T дней»). +6. Избегай чрезмерной абстракции и канцелярита; формулировки живые, но точные. +7. Не используй вводные фразы, обращение к читателю и объяснения формата. + +--- + +## КРИТИЧНО ДЛЯ ФОРМАТА + +- steps — только из текста главы; не выдумывай шаги. +- У каждой техники — context_example с одним бытовым примером ситуации (работа, дом, отношения). +- success_criteria — измеримый критерий: что меняется (частота/длительность/количество), за какой срок; без размытых формулировок. +- Если в главе нет описанных техник или упражнений — верни "techniques": []. +- Не дублируй по сути одну технику под разными названиями. + +--- + +## ФОРМАТ ОТВЕТА + +Строго один JSON-объект с единственным ключом верхнего уровня "application", без комментариев и markdown: + +{ + "application": { + "techniques": [ + { + "name": "Название техники или упражнения", + "goal": "Какую конкретную привычку, навык или поведение это помогает изменить", + "context_example": "Короткий пример жизненной ситуации, где техника применима (например: вечер после работы, когда тянет залипнуть в телефон)", + "steps": [ + "Шаг 1: ... (при необходимости — мини-рефлексия или запись наблюдений)", + "Шаг 2: ...", + "Шаг 3: ... (при необходимости — шаг про отслеживание результата: что записать или отметить)" + ], + "client_phrase": "Как это просто объяснить или сформулировать для клиента", + "success_criteria": "Измеримый критерий: что именно меняется (частота, длительность, количество эпизодов) и за какой срок (например: количество эпизодов X снижается с N до M в течение T дней)" + } + ] + } +} + +Верни только этот объект — ничего до и после. diff --git a/1_анализ_главы/extract_framework_v2.txt b/1_анализ_главы/extract_framework_v2.txt new file mode 100644 index 0000000..0a5e336 --- /dev/null +++ b/1_анализ_главы/extract_framework_v2.txt @@ -0,0 +1,64 @@ +Ты — эксперт по анализу нон-фикшн. Извлеки из главы только блок «каркас» (framework): принципы и цепочки причина–механизм–результат. + +Контекст: +- Книга: "{book_title}" +- Глава: "{chapter_title}" +- Текст главы: {chapter_text} + +--- + +## ЗАДАЧА + +Извлеки фундаментальные принципы и опорные идеи автора. Для каждого принципа — цепочки cause → mechanism → result (что запускает, как работает, к чему приводит). +- Если у одной идеи в главе несколько разных сценариев (разные причины или результаты) — приведи для неё несколько цепочек (2–3), а не одну. +- Объединяй перекрывающиеся идеи: один принцип = одна опорная мысль. Не дублируй одну и ту же мысль под разными названиями. + +## СТРОГИЕ ПРАВИЛА + +1. Не пересказывай текст и не цитируй большие фрагменты; работай на уровне обобщений и смысловых единиц. +2. Язык простой, разговорно-профессиональный. Все специальные термины из главы (паттерны, триггеры, автоматизация, подкрепление и т.п.) обязательно внеси в блок "terms" и дай к каждому пояснение в 3–7 слов: что это значит для обычного человека в поведении. +3. Каждый принцип и каждая цепочка должны быть: + - понятны без дополнительного объяснения; + - приземлены к реальному поведению (что человек делает иначе); + - у каждого принципа обязательно заполни поле "example": один бытовой пример в одну фразу (работа, дом, отношения). +4. Избегай чрезмерной абстракции и канцелярита. Живая, но точная формулировка (например: не «Парадокс воли: повышение дисциплины требует…», а «Чтобы не собирать волю в кулак каждый раз, среду нужно настроить так, чтобы правильное действие было самым лёгким по умолчанию»). +5. Не используй вводные фразы, обращение к читателю и объяснения формата. + +--- + +## КРИТИЧНО ДЛЯ ФОРМАТА + +- Блок "terms" должен быть заполнен: все термины из твоего ответа с короткими пояснениями. +- У каждого принципа — массив "chains" с минимум одной цепочкой; при нескольких сценариях — несколько цепочек. +- У каждого принципа — поле "example" с одним бытовым примером в одну фразу. + +--- + +## ФОРМАТ ОТВЕТА + +Строго один JSON-объект с единственным ключом верхнего уровня "framework", без комментариев и markdown: + +{ + "framework": { + "terms": { + "термин1": "пояснение в 3–7 слов для обычного человека", + "термин2": "пояснение в 3–7 слов" + }, + "principles": [ + { + "title": "Краткое название принципа", + "description": "Живая формулировка с пояснением, как проявляется в жизни", + "example": "Один бытовой пример в одну фразу: работа, дом или отношения", + "chains": [ + { + "cause": "Причина или ситуация, с которой всё начинается", + "mechanism": "Что происходит / какой процесс запускается", + "result": "К какому результату это приводит для человека" + } + ] + } + ] + } +} + +Верни только этот объект — ничего до и после. diff --git a/1_анализ_главы/extract_framework_v2_filled.txt b/1_анализ_главы/extract_framework_v2_filled.txt new file mode 100644 index 0000000..dbf2ea6 --- /dev/null +++ b/1_анализ_главы/extract_framework_v2_filled.txt @@ -0,0 +1,64 @@ +Ты — эксперт по анализу нон-фикшн. Извлеки из главы только блок «каркас» (framework): принципы и цепочки причина–механизм–результат. + +Контекст: +- Книга: "{book_title}" +- Глава: "{chapter_title}" +- Текст главы: В 1971 году, когда шел шестнадцатый год войны во Вьетнаме, два американских конгрессмена, Роберт Стил из Коннектикута и Морган Мерфи из Иллинойса, сделали открытие, которое потрясло американское общество. Во время посещения воинских частей они выяснили, что более 15% американских солдат во Вьетнаме имели зависимость от героина. Более поздние исследования показали, что 35% американского контингента во Вьетнаме когда-либо пробовало героин и почти 20% страдало наркотической зависимостью – то есть проблема оказалась еще серьезнее, чем им показалось вначале.Это открытие вызвало бурную активность в Вашингтоне, включая создание по распоряжению президента Ричарда Никсона Специального комитета по предупреждению злоупотреблений наркотиками, целью деятельности которого была профилактика наркомании, а также реабилитация и отслеживание судеб наркозависимых солдат после возвращения на родину.Ли Робинс был одним из исследователей комитета. В ходе исследования, результаты которого перевернули все имевшиеся представления о наркологии, он обнаружил, что только 5% наркозависимых солдат снова начинали принимать героин в течение первого года после возвращения из реабилитационного центра и всего 12% делали это в течение трех лет. Иными словами, девять солдат из десяти избавлялись от наркотической зависимости после того, как покидали Вьетнам.Это открытие полностью противоречило всем представлениям наркологов того времени, согласно которым героиновая зависимость считалась постоянной и необратимом болезнью. Однако в противоположность этим представлениям Робинс обнаружил, что эта зависимость может спонтанно исчезнуть в случае полной смены окружения. Во Вьетнаме солдаты проводили все свое время в окружении стимулов, провоцировавших употребление героина: его было просто достать, а сами они находились под воздействием постоянного стресса войны; они строили дружеские отношения с сослуживцами, которые уже принимали героин, и находились в тысяче миль от дома. Но как только солдат возвращался в США, он оказывался в среде, лишенной этих стимулов. Как только менялся контекст, менялась и привычка.Сравните эту ситуацию с ситуацией типичного наркомана. Он становится наркозависимым дома или в компании друзей, затем попадает в клинику, где проходит реабилитацию и «очищается»– при этом находясь в среде, лишенной стимулов, которые сформировали его привычку, а затем возвращается в прежнее окружение со всеми стимулами, которые уже спровоцировали наркозависимость в первый раз. Поэтому неудивительно, что обычно наблюдается огромное количество примеров, прямо противоположных тем, что мы только что видели в рамках Вьетнамской кампании. Как правило, 90% героиновых наркоманов снова становятся зависимыми после возвращения с реабилитации.Вьетнамские исследования противоречат многим нашим культурным убеждениям относительно дурных привычек, поскольку ставят под сомнение шаблонную ассоциацию нездорового поведения с моральной слабостью. Если у вас избыточный вес, вы курите или страдаете наркозависимостью, вам всю жизнь говорят, что причиной этого является недостаток самоконтроля – а иногда даже говорят, что вы плохой человек. Идея о том, что немного дисциплины способно решить все проблемы, глубоко укоренилась в нашей культуре.Однако недавние исследования свидетельствуют о прямо противоположных фактах. Когда ученые анализируют поведение людей, которые, казалось бы, обладают выдающимся самоконтролем, выясняется, что эти люди ничем не отличаются от тех, кто постоянно борется с вредными привычками. «Дисциплинированные» люди лучше справляются со структурированием своей жизни способами, которые не требуют героической силы воли и самоконтроля. Иначе говоря, они тратят меньше времени, чтобы справиться с теми или иными ситуациями.Люди с развитым самоконтролем, как правило, меньше всех нуждаются в его применении. Проще практиковать выдержку и самоконтроль, когда не приходится использовать их слишком часто. Таким образом, действительно, упорство, твердость характера и сила воли очень важны для достижения успеха, но способ развить эти качества заключается не в том, чтобы стать более дисциплинированным человеком, а в том, чтобы создать более дисциплинированную среду вокруг себя.Эта парадоксальная идея становится еще более логичной, когда вы начинаете понимать, что происходит в процессе формирования привычки в мозгу. Привычка, которая уже закодирована в нем, «готова к использованию» влюбой момент, как только наступит соответствующая ситуация. Когда Пэтти Олвэлл, врач из Остина, Техас, начала курить, она часто закуривала во время верховой прогулки со своим другом. В конце концов она перестала курить и не курила много лет. Она также перестала ездить верхом. Спустя десятилетия она снова села на лошадь и вскоре заметила, что впервые за много лет ей очень хочется курить. Стимулы все еще были актуальны, они просто не проявлялись в течение долгого времени.Если привычка укоренилась в мозгу, призыв к действию появляется каждый раз, когда возникают соответствующие стимулы во внешней среде. Это одна из причин, по которой техники по изменению поведения могут вызвать негативные последствия. Если вы будете смущать людей с избыточным весом, постоянно демонстрируя им презентации по снижению веса, то они могут ощутить стресс, и в результате большая часть из них вернется к своей излюбленной стратегии преодоления стресса – перееданию. Когда вы показываете курильщикам легкие с затемнениями, это приводит к повышению уровня тревожности, в результате чего многие люди хватаются за сигарету. Таким образом, если вы невнимательно относитесь к стимулам, то можете спровоцировать именно то поведение, которого хотите избежать.Можно сказать, что дурные привычки являются аутокаталитическими: процесс подпитывает сам себя. Они усиливают чувства, которые человек пытается подавить. Например, вы чувствуете себя плохо, и поэтому начинаете есть фастфуд. От того, что вы его едите, вы начинаете чувствовать себя плохо. Просмотр телевизора вызывает сонливость, поэтому вы смотрите его еще больше, так как вам не хватает энергии на что-то другое. Беспокойство о своем здоровье заставляет вас испытывать тревогу, которая в свою очередь вызывает желание покурить, чтобы успокоиться, но это способствует ухудшению здоровья, из-за чего ваше беспокойство в ближайшее время только усилится. Это своего рода нисходящая спираль, потерявший управление «поезд дурных привычек».Ученые называют этот феномен «желание, вызванное стимулом»: внешний триггер вызывает навязчивое стремление повторить дурную привычку. Как только вы замечаете что-то, вы начинаете хотеть этого. Это процесс происходит постоянно – часто мы даже не замечаем его. Ученые установили, что если всего на тридцать три миллисекунды показать изображение кокаина наркозависимым, это стимулирует в мозгу стремление к подкреплению и вызывает страстное желание принять наркотик. Это очень непродолжительное время, за которое мозг не успевает сознательно зарегистрировать увиденное – наркозависимые даже не смогут рассказать вам, что они видели,– и тем не менее все они одинаково захотят получить наркотик.Именно в этом заключается ключевой момент: вы можете избавиться от привычки, но не способны забыть ее. Если мыслительные паттерны, характерные для привычки, были зафиксированы в мозгу, их практически невозможно удалить полностью – даже если они не используются в течение продолжительного времени. А это значит, что простое противостояние искушению будет неэффективной стратегией. Очень сложно сохранить созерцательное и философское отношение к жизни, полной сложностей и противоречий. Это требует слишком много энергии. Поэтому в краткосрочной перспективе мы можем выбрать стратегию противостояния искушению. Однако в долгосрочной перспективе мы неизбежно становимся продуктом той среды, в которой живем. Откровенно говоря, мне ни разу не приходилось увидеть человека, последовательно приверженного хорошим привычкам в негативном окружении.Более надежным подходом будет искоренение плохих привычек в их исходной точке. Один из наиболее практичных способов устранить плохую привычку – это снизить воздействие на себя стимула, который провоцирует ее.•Если вы никак не можете закончить работу, оставьте телефон в другой комнате на несколько часов. Если вы постоянно ощущаете, что вам чего-то не хватает, прекратите просматривать профили других людей в социальных сетях – это вызывает ревность и зависть.•Если вы тратите слишком много времени на просмотр телевизора, уберите телевизор из спальни.•Если вы тратите слишком много денег на гаджеты, перестаньте читать обзоры последних технических новинок.•Если вы слишком много играете в видеоигры, после каждого использования отключайте приставку и убирайте ее в шкаф.Эта практика – не что иное, как обратная трактовка первого закона изменения поведения. Вместо того чтобы делать что-то очевидным, вы можете сделать это неочевидным. Я часто удивляюсь тому, насколько эффективными могут быть такие незначительные изменения. Уберите один-единственный стимул, и вся привычка уйдет вместе с ним.Самоконтроль – краткосрочная, а не долгосрочная стратегия. Вы можете противостоять искушению один или два раза, но не сможете каждый раз собирать волю в кулак, чтобы побеждать желания. Вместо этого лучше потратьте энергию на организацию своего окружения. В этом и заключается секрет самоконтроля. Сделайте стимулы хороших привычек очевидными, а стимулы плохих привычек – незаметными. РЕЗЮМЕ•Обратная трактовка первого закона изменения поведения звучит так: «Сделайте это неочевидным».•Когда привычка сформирована, ее практически невозможно забыть.•Люди с высокой степенью самоконтроля, как правило, тратят меньше времени, чтобы справляться со сложными ситуациями. Проще избежать искушения, чем противостоять ему.•Одним из наиболее практичных способов избавиться от плохой привычки является сокращение проявлений стимула, который вызывает ее.•Самоконтроль – это краткосрочная, а не долгосрочная стратегия. + +--- + +## ЗАДАЧА + +Извлеки фундаментальные принципы и опорные идеи автора. Для каждого принципа — цепочки cause → mechanism → result (что запускает, как работает, к чему приводит). +- Если у одной идеи в главе несколько разных сценариев (разные причины или результаты) — приведи для неё несколько цепочек (2–3), а не одну. +- Объединяй перекрывающиеся идеи: один принцип = одна опорная мысль. Не дублируй одну и ту же мысль под разными названиями. + +## СТРОГИЕ ПРАВИЛА + +1. Не пересказывай текст и не цитируй большие фрагменты; работай на уровне обобщений и смысловых единиц. +2. Язык простой, разговорно-профессиональный. Все специальные термины из главы (паттерны, триггеры, автоматизация, подкрепление и т.п.) обязательно внеси в блок "terms" и дай к каждому пояснение в 3–7 слов: что это значит для обычного человека в поведении. +3. Каждый принцип и каждая цепочка должны быть: + - понятны без дополнительного объяснения; + - приземлены к реальному поведению (что человек делает иначе); + - у каждого принципа обязательно заполни поле "example": один бытовой пример в одну фразу (работа, дом, отношения). +4. Избегай чрезмерной абстракции и канцелярита. Живая, но точная формулировка (например: не «Парадокс воли: повышение дисциплины требует…», а «Чтобы не собирать волю в кулак каждый раз, среду нужно настроить так, чтобы правильное действие было самым лёгким по умолчанию»). +5. Не используй вводные фразы, обращение к читателю и объяснения формата. + +--- + +## КРИТИЧНО ДЛЯ ФОРМАТА + +- Блок "terms" должен быть заполнен: все термины из твоего ответа с короткими пояснениями. +- У каждого принципа — массив "chains" с минимум одной цепочкой; при нескольких сценариях — несколько цепочек. +- У каждого принципа — поле "example" с одним бытовым примером в одну фразу. + +--- + +## ФОРМАТ ОТВЕТА + +Строго один JSON-объект с единственным ключом верхнего уровня "framework", без комментариев и markdown: + +{ + "framework": { + "terms": { + "термин1": "пояснение в 3–7 слов для обычного человека", + "термин2": "пояснение в 3–7 слов" + }, + "principles": [ + { + "title": "Краткое название принципа", + "description": "Живая формулировка с пояснением, как проявляется в жизни", + "example": "Один бытовой пример в одну фразу: работа, дом или отношения", + "chains": [ + { + "cause": "Причина или ситуация, с которой всё начинается", + "mechanism": "Что происходит / какой процесс запускается", + "result": "К какому результату это приводит для человека" + } + ] + } + ] + } +} + +Верни только этот объект — ничего до и после. diff --git a/1_анализ_главы/extract_insights_v3.txt b/1_анализ_главы/extract_insights_v3.txt new file mode 100644 index 0000000..b21719f --- /dev/null +++ b/1_анализ_главы/extract_insights_v3.txt @@ -0,0 +1,54 @@ +Ты — эксперт по анализу нон-фикшн. Извлеки из главы только блок «инсайты» (insights): практически значимые понимания. + +Контекст: +- Книга: "{book_title}" +- Глава: "{chapter_title}" +- Текст главы: {chapter_text} +- Уже извлечённый блок framework (для согласованности): {previous_blocks_json} + +--- + +## ЗАДАЧА + +Извлеки инсайты — то, что человек по-новому понимает о себе/людях/среде и как это меняет поведение в конкретных ситуациях. +- Инсайты должны согласовываться с уже извлечённым framework; не противоречь принципам. +- Объединяй перекрывающиеся инсайты: один инсайт = одно понимание. Не дублируй одну мысль под разными названиями. +- Инсайт — это вывод или новое понимание, которое меняет поведение. Не включай в список определения терминов (что такое стимул, триггер и т.п.); определения остаются в framework. Если формулировка отвечает на вопрос «что это такое?», а не «что из этого следует для человека?» — это не инсайт. + +## СТРОГИЕ ПРАВИЛА + +1. Не пересказывай текст и не цитируй большие фрагменты; работай на уровне обобщений и смысловых единиц. +2. Язык простой, разговорно-профессиональный. При первом использовании в description слов «триггер», «стимул», «паттерн», «подкрепление» и т.п. добавь в скобках пояснение в 3–7 слов, например: триггер (то, что запускает действие почти автоматически). +3. Каждый инсайт должен быть: + - понятен без дополнительного объяснения; + - приземлён к реальному поведению (что человек делает иначе); + - у каждого инсайта обязательно заполни поле "example": один бытовой пример в одну фразу (работа, дом, отношения). +4. Избегай чрезмерной абстракции и канцелярита; используй живую, но точную формулировку. +5. Не используй вводные фразы, обращение к читателю и объяснения формата. + +--- + +## КРИТИЧНО ДЛЯ ФОРМАТА + +- Инсайты не противоречат принципам из переданного framework. +- У каждого инсайта — поле "example" с одним бытовым примером в одну фразу. +- Не дублируй перекрывающиеся инсайты: перед добавлением проверь — не выражает ли новый инсайт ту же опорную мысль, что уже есть в списке? Одна мысль («среда важнее силы воли», «привычка не забывается» и т.д.) = один инсайт. Ориентир: 4–7 инсайтов без смысловых дублей. +- Не включай определения терминов как отдельные инсайты; только выводы и понимания. + +--- + +## ФОРМАТ ОТВЕТА + +Строго один JSON-объект с единственным ключом верхнего уровня "insights", без комментариев и markdown: + +{ + "insights": [ + { + "title": "Краткое название инсайта", + "description": "Что человек по-новому понимает и как это меняет поведение в конкретных ситуациях", + "example": "Один бытовой пример в одну фразу: работа, дом или отношения" + } + ] +} + +Верни только этот объект — ничего до и после. diff --git a/1_анализ_главы/extract_insights_v3_filled.txt b/1_анализ_главы/extract_insights_v3_filled.txt new file mode 100644 index 0000000..8faeddb --- /dev/null +++ b/1_анализ_главы/extract_insights_v3_filled.txt @@ -0,0 +1,154 @@ +Ты — эксперт по анализу нон-фикшн. Извлеки из главы только блок «инсайты» (insights): практически значимые понимания. + +Контекст: +- Книга: "{book_title}" +- Глава: "{chapter_title}" +- Текст главы: В 1971 году, когда шел шестнадцатый год войны во Вьетнаме, два американских конгрессмена, Роберт Стил из Коннектикута и Морган Мерфи из Иллинойса, сделали открытие, которое потрясло американское общество. Во время посещения воинских частей они выяснили, что более 15% американских солдат во Вьетнаме имели зависимость от героина. Более поздние исследования показали, что 35% американского контингента во Вьетнаме когда-либо пробовало героин и почти 20% страдало наркотической зависимостью – то есть проблема оказалась еще серьезнее, чем им показалось вначале.Это открытие вызвало бурную активность в Вашингтоне, включая создание по распоряжению президента Ричарда Никсона Специального комитета по предупреждению злоупотреблений наркотиками, целью деятельности которого была профилактика наркомании, а также реабилитация и отслеживание судеб наркозависимых солдат после возвращения на родину.Ли Робинс был одним из исследователей комитета. В ходе исследования, результаты которого перевернули все имевшиеся представления о наркологии, он обнаружил, что только 5% наркозависимых солдат снова начинали принимать героин в течение первого года после возвращения из реабилитационного центра и всего 12% делали это в течение трех лет. Иными словами, девять солдат из десяти избавлялись от наркотической зависимости после того, как покидали Вьетнам.Это открытие полностью противоречило всем представлениям наркологов того времени, согласно которым героиновая зависимость считалась постоянной и необратимом болезнью. Однако в противоположность этим представлениям Робинс обнаружил, что эта зависимость может спонтанно исчезнуть в случае полной смены окружения. Во Вьетнаме солдаты проводили все свое время в окружении стимулов, провоцировавших употребление героина: его было просто достать, а сами они находились под воздействием постоянного стресса войны; они строили дружеские отношения с сослуживцами, которые уже принимали героин, и находились в тысяче миль от дома. Но как только солдат возвращался в США, он оказывался в среде, лишенной этих стимулов. Как только менялся контекст, менялась и привычка.Сравните эту ситуацию с ситуацией типичного наркомана. Он становится наркозависимым дома или в компании друзей, затем попадает в клинику, где проходит реабилитацию и «очищается»– при этом находясь в среде, лишенной стимулов, которые сформировали его привычку, а затем возвращается в прежнее окружение со всеми стимулами, которые уже спровоцировали наркозависимость в первый раз. Поэтому неудивительно, что обычно наблюдается огромное количество примеров, прямо противоположных тем, что мы только что видели в рамках Вьетнамской кампании. Как правило, 90% героиновых наркоманов снова становятся зависимыми после возвращения с реабилитации.Вьетнамские исследования противоречат многим нашим культурным убеждениям относительно дурных привычек, поскольку ставят под сомнение шаблонную ассоциацию нездорового поведения с моральной слабостью. Если у вас избыточный вес, вы курите или страдаете наркозависимостью, вам всю жизнь говорят, что причиной этого является недостаток самоконтроля – а иногда даже говорят, что вы плохой человек. Идея о том, что немного дисциплины способно решить все проблемы, глубоко укоренилась в нашей культуре.Однако недавние исследования свидетельствуют о прямо противоположных фактах. Когда ученые анализируют поведение людей, которые, казалось бы, обладают выдающимся самоконтролем, выясняется, что эти люди ничем не отличаются от тех, кто постоянно борется с вредными привычками. «Дисциплинированные» люди лучше справляются со структурированием своей жизни способами, которые не требуют героической силы воли и самоконтроля. Иначе говоря, они тратят меньше времени, чтобы справиться с теми или иными ситуациями.Люди с развитым самоконтролем, как правило, меньше всех нуждаются в его применении. Проще практиковать выдержку и самоконтроль, когда не приходится использовать их слишком часто. Таким образом, действительно, упорство, твердость характера и сила воли очень важны для достижения успеха, но способ развить эти качества заключается не в том, чтобы стать более дисциплинированным человеком, а в том, чтобы создать более дисциплинированную среду вокруг себя.Эта парадоксальная идея становится еще более логичной, когда вы начинаете понимать, что происходит в процессе формирования привычки в мозгу. Привычка, которая уже закодирована в нем, «готова к использованию» влюбой момент, как только наступит соответствующая ситуация. Когда Пэтти Олвэлл, врач из Остина, Техас, начала курить, она часто закуривала во время верховой прогулки со своим другом. В конце концов она перестала курить и не курила много лет. Она также перестала ездить верхом. Спустя десятилетия она снова села на лошадь и вскоре заметила, что впервые за много лет ей очень хочется курить. Стимулы все еще были актуальны, они просто не проявлялись в течение долгого времени.Если привычка укоренилась в мозгу, призыв к действию появляется каждый раз, когда возникают соответствующие стимулы во внешней среде. Это одна из причин, по которой техники по изменению поведения могут вызвать негативные последствия. Если вы будете смущать людей с избыточным весом, постоянно демонстрируя им презентации по снижению веса, то они могут ощутить стресс, и в результате большая часть из них вернется к своей излюбленной стратегии преодоления стресса – перееданию. Когда вы показываете курильщикам легкие с затемнениями, это приводит к повышению уровня тревожности, в результате чего многие люди хватаются за сигарету. Таким образом, если вы невнимательно относитесь к стимулам, то можете спровоцировать именно то поведение, которого хотите избежать.Можно сказать, что дурные привычки являются аутокаталитическими: процесс подпитывает сам себя. Они усиливают чувства, которые человек пытается подавить. Например, вы чувствуете себя плохо, и поэтому начинаете есть фастфуд. От того, что вы его едите, вы начинаете чувствовать себя плохо. Просмотр телевизора вызывает сонливость, поэтому вы смотрите его еще больше, так как вам не хватает энергии на что-то другое. Беспокойство о своем здоровье заставляет вас испытывать тревогу, которая в свою очередь вызывает желание покурить, чтобы успокоиться, но это способствует ухудшению здоровья, из-за чего ваше беспокойство в ближайшее время только усилится. Это своего рода нисходящая спираль, потерявший управление «поезд дурных привычек».Ученые называют этот феномен «желание, вызванное стимулом»: внешний триггер вызывает навязчивое стремление повторить дурную привычку. Как только вы замечаете что-то, вы начинаете хотеть этого. Это процесс происходит постоянно – часто мы даже не замечаем его. Ученые установили, что если всего на тридцать три миллисекунды показать изображение кокаина наркозависимым, это стимулирует в мозгу стремление к подкреплению и вызывает страстное желание принять наркотик. Это очень непродолжительное время, за которое мозг не успевает сознательно зарегистрировать увиденное – наркозависимые даже не смогут рассказать вам, что они видели,– и тем не менее все они одинаково захотят получить наркотик.Именно в этом заключается ключевой момент: вы можете избавиться от привычки, но не способны забыть ее. Если мыслительные паттерны, характерные для привычки, были зафиксированы в мозгу, их практически невозможно удалить полностью – даже если они не используются в течение продолжительного времени. А это значит, что простое противостояние искушению будет неэффективной стратегией. Очень сложно сохранить созерцательное и философское отношение к жизни, полной сложностей и противоречий. Это требует слишком много энергии. Поэтому в краткосрочной перспективе мы можем выбрать стратегию противостояния искушению. Однако в долгосрочной перспективе мы неизбежно становимся продуктом той среды, в которой живем. Откровенно говоря, мне ни разу не приходилось увидеть человека, последовательно приверженного хорошим привычкам в негативном окружении.Более надежным подходом будет искоренение плохих привычек в их исходной точке. Один из наиболее практичных способов устранить плохую привычку – это снизить воздействие на себя стимула, который провоцирует ее.•Если вы никак не можете закончить работу, оставьте телефон в другой комнате на несколько часов. Если вы постоянно ощущаете, что вам чего-то не хватает, прекратите просматривать профили других людей в социальных сетях – это вызывает ревность и зависть.•Если вы тратите слишком много времени на просмотр телевизора, уберите телевизор из спальни.•Если вы тратите слишком много денег на гаджеты, перестаньте читать обзоры последних технических новинок.•Если вы слишком много играете в видеоигры, после каждого использования отключайте приставку и убирайте ее в шкаф.Эта практика – не что иное, как обратная трактовка первого закона изменения поведения. Вместо того чтобы делать что-то очевидным, вы можете сделать это неочевидным. Я часто удивляюсь тому, насколько эффективными могут быть такие незначительные изменения. Уберите один-единственный стимул, и вся привычка уйдет вместе с ним.Самоконтроль – краткосрочная, а не долгосрочная стратегия. Вы можете противостоять искушению один или два раза, но не сможете каждый раз собирать волю в кулак, чтобы побеждать желания. Вместо этого лучше потратьте энергию на организацию своего окружения. В этом и заключается секрет самоконтроля. Сделайте стимулы хороших привычек очевидными, а стимулы плохих привычек – незаметными. РЕЗЮМЕ•Обратная трактовка первого закона изменения поведения звучит так: «Сделайте это неочевидным».•Когда привычка сформирована, ее практически невозможно забыть.•Люди с высокой степенью самоконтроля, как правило, тратят меньше времени, чтобы справляться со сложными ситуациями. Проще избежать искушения, чем противостоять ему.•Одним из наиболее практичных способов избавиться от плохой привычки является сокращение проявлений стимула, который вызывает ее.•Самоконтроль – это краткосрочная, а не долгосрочная стратегия. + +- Уже извлечённый блок framework (для согласованности): +{ + "framework": { + "terms": { + "стимул": "что в окружающей среде заставляет человека действовать", + "привычка": "повторяющееся действие, которое становится автоматическим", + "подкрепление": "воздействие, усиливающее вероятность повторения действия", + "среда": "окружение, влияющее на поведение через стимулы и ограничения", + "желание, вызванное стимулом": "непроизвольная тяга к действию, спровоцированному внешним триггером", + "аутокаталитический процесс": "процесс, усиливающий себя сам" + }, + "principles": [ + { + "title": "Среда формирует поведение", + "description": "Человек не управляет привычками напрямую, а воздействует на окружение, чтобы оно вело его к нужным действиям", + "example": "Убрать телефон с рабочего стола, чтобы не отвлекаться на соцсети", + "chains": [ + { + "cause": "Человек находится в среде с доступными стимулами для нежелательной привычки", + "mechanism": "Стимул активирует уже сформированную привычку, которая запускает автоматическое действие", + "result": "Человек повторяет вредную привычку, не осознавая этого" + }, + { + "cause": "Изменяется среда, удаляются стимулы, провоцирующие нежелательную привычку", + "mechanism": "Отсутствие триггеров снижает вероятность срабатывания привычки", + "result": "Человек реже проявляет нежелательное поведение" + } + ] + }, + { + "title": "Привычки не исчезают, они только временно подавлены", + "description": "Даже если человек перестаёт делать что-то, привычка остаётся в мозге и может вернуться при подходящих условиях", + "example": "Человек перестаёт курить, но снова начинает после посещения места, где раньше курил", + "chains": [ + { + "cause": "Человек прекращает проявлять вредную привычку", + "mechanism": "Мозг сохраняет нейронные связи, связанные с этой привычкой", + "result": "Привычка может вернуться, если появятся подходящие стимулы" + }, + { + "cause": "Окружение меняется, и в нем появляются триггеры, связанные с прошлой привычкой", + "mechanism": "Стимулы запускают автоматические паттерны поведения", + "result": "Человек снова начинает делать то, что уже перестал" + } + ] + }, + { + "title": "Самоконтроль — это краткосрочный, а не долгосрочный инструмент", + "description": "Противостояние искушению неэффективно на длительном сроке, нужно менять контекст", + "example": "Человек отказывается от сладкого, но возвращается к нему после стрессового дня", + "chains": [ + { + "cause": "Человек пытается контролировать себя в момент искушения", + "mechanism": "Это требует энергии и усилий, которые невозможно поддерживать всегда", + "result": "Человек устаёт от борьбы и возвращается к нежелательной привычке" + }, + { + "cause": "Человек изменяет окружение, чтобы искушения стали менее доступными", + "mechanism": "Стимулы для плохого поведения становятся незаметными или невозможными", + "result": "Человек реже сталкивается с искушением" + } + ] + }, + { + "title": "Дисциплина — это настройка среды, а не внутреннее усилие", + "description": "Сильные люди не просто дисциплинированы, а живут в среде, которая поддерживает их цели", + "example": "Человек встаёт раньше, потому что спальня тёмная и не имеет гаджетов", + "chains": [ + { + "cause": "Человек пытается быть дисциплинированным только силой воли", + "mechanism": "Это требует большого количества энергии и часто неудачно", + "result": "Человек теряет мотивацию и возвращается к нежелательному поведению" + }, + { + "cause": "Человек настраивает окружение так, чтобы хорошее поведение было лёгким", + "mechanism": "Стимулы для правильных действий становятся более доступными", + "result": "Человек чаще выбирает здоровые привычки" + } + ] + }, + { + "title": "Негативные эмоции усиливают негативное поведение", + "description": "Стресс, тревога и другие негативные чувства провоцируют возвращение к вредным привычкам", + "example": "Человек садится на диван и ест шоколад, когда ему плохо", + "chains": [ + { + "cause": "Человек испытывает стресс или негативные эмоции", + "mechanism": "Это активирует привычку, которая помогает снизить дискомфорт", + "result": "Человек снова начинает делать то, что раньше снимало напряжение" + }, + { + "cause": "Человек пытается избавиться от вредной привычки, но не меняет среду", + "mechanism": "Стресс и негативные эмоции остаются, усиливая желание к действию", + "result": "Человек возвращается к нежелательной привычке" + } + ] + } + ] + } + } + +--- + +## ЗАДАЧА + +Извлеки инсайты — то, что человек по-новому понимает о себе/людях/среде и как это меняет поведение в конкретных ситуациях. +- Инсайты должны согласовываться с уже извлечённым framework; не противоречь принципам. +- Объединяй перекрывающиеся инсайты: один инсайт = одно понимание. Не дублируй одну мысль под разными названиями. +- Инсайт — это вывод или новое понимание, которое меняет поведение. Не включай в список определения терминов (что такое стимул, триггер и т.п.); определения остаются в framework. Если формулировка отвечает на вопрос «что это такое?», а не «что из этого следует для человека?» — это не инсайт. + +## СТРОГИЕ ПРАВИЛА + +1. Не пересказывай текст и не цитируй большие фрагменты; работай на уровне обобщений и смысловых единиц. +2. Язык простой, разговорно-профессиональный. При первом использовании в description слов «триггер», «стимул», «паттерн», «подкрепление» и т.п. добавь в скобках пояснение в 3–7 слов, например: триггер (то, что запускает действие почти автоматически). +3. Каждый инсайт должен быть: + - понятен без дополнительного объяснения; + - приземлён к реальному поведению (что человек делает иначе); + - у каждого инсайта обязательно заполни поле "example": один бытовой пример в одну фразу (работа, дом, отношения). +4. Избегай чрезмерной абстракции и канцелярита; используй живую, но точную формулировку. +5. Не используй вводные фразы, обращение к читателю и объяснения формата. + +--- + +## КРИТИЧНО ДЛЯ ФОРМАТА + +- Инсайты не противоречат принципам из переданного framework. +- У каждого инсайта — поле "example" с одним бытовым примером в одну фразу. +- Не дублируй перекрывающиеся инсайты: перед добавлением проверь — не выражает ли новый инсайт ту же опорную мысль, что уже есть в списке? Одна мысль («среда важнее силы воли», «привычка не забывается» и т.д.) = один инсайт. Ориентир: 4–7 инсайтов без смысловых дублей. +- Не включай определения терминов как отдельные инсайты; только выводы и понимания. + +--- + +## ФОРМАТ ОТВЕТА + +Строго один JSON-объект с единственным ключом верхнего уровня "insights", без комментариев и markdown: + +{ + "insights": [ + { + "title": "Краткое название инсайта", + "description": "Что человек по-новому понимает и как это меняет поведение в конкретных ситуациях", + "example": "Один бытовой пример в одну фразу: работа, дом или отношения" + } + ] +} + +Верни только этот объект — ничего до и после. diff --git a/1_анализ_главы/extract_limitations_v3.txt b/1_анализ_главы/extract_limitations_v3.txt new file mode 100644 index 0000000..b1800b2 --- /dev/null +++ b/1_анализ_главы/extract_limitations_v3.txt @@ -0,0 +1,58 @@ +Ты — эксперт по анализу нон-фикшн. Извлеки из главы только блок «ограничения» (limitations): риски и узкие места применения идей. + +Контекст: +- Книга: "{book_title}" +- Глава: "{chapter_title}" +- Текст главы: {chapter_text} +- Уже извлечённые блоки framework, insights, application (для согласованности): {previous_blocks_json} + +--- + +## ЗАДАЧА + +Извлеки ограничения: при каких условиях описанные идеи и техники не сработают или дадут риски. Ограничения должны относиться к уже извлечённым принципам и техникам; не противоречь им. +- Объединяй перекрывающиеся ограничения: одно ограничение = один тип риска или условия. Не дублируй одну мысль под разными формулировками. Один тип риска = один пункт (например: «внутренние эмоции» и «привычка на уровне нейронов/внутренних триггеров» — один тип риска «причина внутри, а не в среде»; не оформляй двумя разными пунктами). +- Ограничение — это конкретное условие или ситуация, при которых идеи/техники не сработают или дадут риски. Не включай общие truisms («всё индивидуально», «зависит от человека»); только ограничения с опорой в тексте или следующие из переданных принципов и техник. +- Краевой случай: если в главе нет явных ограничений, рисков или узких мест — верни пустой массив: "limitations": []. Не придумывай ограничения ради заполнения. +- Ориентир: 2–5 ограничений без смысловых дублей. + +## СТРОГИЕ ПРАВИЛА + +1. Не пересказывай текст и не цитируй большие фрагменты; работай на уровне обобщений и смысловых единиц. +2. Язык простой, разговорно-профессиональный. При первом использовании по порядку в списке ограничений слов «триггер», «стимул», «паттерн» и т.п. обязательно добавь в скобках пояснение в 3–7 слов, например: триггер (то, что в окружении запускает действие). В следующих пунктах тот же термин можно использовать без повторного пояснения. +3. Каждое ограничение должно быть: + - понятно без дополнительного объяснения; + - приземлено к реальным ситуациям (работа, дом, отношения); + - у каждого ограничения обязательно заполни поле "example": один бытовой пример ситуации, когда это ограничение проявляется (в одну фразу). +4. when_relevant — в каких ситуациях, контекстах или для каких людей это ограничение особенно важно учитывать. +5. Избегай чрезмерной абстракции и канцелярита; формулировки живые, но точные. +6. Не используй вводные фразы, обращение к читателю и объяснения формата. + +--- + +## КРИТИЧНО ДЛЯ ФОРМАТА + +- Ограничения не противоречат принципам и техникам из переданных блоков; они указывают, когда идеи не сработают или дадут риски. +- У каждого ограничения — поле "example" с одним бытовым примером ситуации в одну фразу (работа, дом, отношения). +- Не дублируй перекрывающиеся ограничения: перед добавлением проверь — не описывает ли новый пункт тот же тип риска, что уже есть? Если два пункта по смыслу про одно (например, «когда причина привычки внутренняя»), объедини в один. +- В первом по порядку ограничении, где встречается «триггер» или «стимул», дай пояснение в скобках (3–7 слов). +- Если в главе нет описанных ограничений или рисков — верни "limitations": []. +- Не включай общие truisms; только конкретные ограничения с опорой в тексте или в переданных блоках. + +--- + +## ФОРМАТ ОТВЕТА + +Строго один JSON-объект с единственным ключом верхнего уровня "limitations", без комментариев и markdown: + +{ + "limitations": [ + { + "description": "Риск или узкое место при применении идей на практике", + "when_relevant": "В каких ситуациях или для каких людей это важно учитывать", + "example": "Один бытовой пример ситуации, когда это ограничение проявляется (работа, дом или отношения)" + } + ] +} + +Верни только этот объект — ничего до и после. diff --git a/1_анализ_главы/extract_limitations_v3_filled.txt b/1_анализ_главы/extract_limitations_v3_filled.txt new file mode 100644 index 0000000..1fcfcdc --- /dev/null +++ b/1_анализ_главы/extract_limitations_v3_filled.txt @@ -0,0 +1,90 @@ +Ты — эксперт по анализу нон-фикшн. Извлеки из главы только блок «ограничения» (limitations): риски и узкие места применения идей. + +Контекст: +- Книга: "{book_title}" +- Глава: "{chapter_title}" +- Текст главы: В 1971 году, когда шел шестнадцатый год войны во Вьетнаме, два американских конгрессмена, Роберт Стил из Коннектикута и Морган Мерфи из Иллинойса, сделали открытие, которое потрясло американское общество. Во время посещения воинских частей они выяснили, что более 15% американских солдат во Вьетнаме имели зависимость от героина. Более поздние исследования показали, что 35% американского контингента во Вьетнаме когда-либо пробовало героин и почти 20% страдало наркотической зависимостью – то есть проблема оказалась еще серьезнее, чем им показалось вначале.Это открытие вызвало бурную активность в Вашингтоне, включая создание по распоряжению президента Ричарда Никсона Специального комитета по предупреждению злоупотреблений наркотиками, целью деятельности которого была профилактика наркомании, а также реабилитация и отслеживание судеб наркозависимых солдат после возвращения на родину.Ли Робинс был одним из исследователей комитета. В ходе исследования, результаты которого перевернули все имевшиеся представления о наркологии, он обнаружил, что только 5% наркозависимых солдат снова начинали принимать героин в течение первого года после возвращения из реабилитационного центра и всего 12% делали это в течение трех лет. Иными словами, девять солдат из десяти избавлялись от наркотической зависимости после того, как покидали Вьетнам.Это открытие полностью противоречило всем представлениям наркологов того времени, согласно которым героиновая зависимость считалась постоянной и необратимом болезнью. Однако в противоположность этим представлениям Робинс обнаружил, что эта зависимость может спонтанно исчезнуть в случае полной смены окружения. Во Вьетнаме солдаты проводили все свое время в окружении стимулов, провоцировавших употребление героина: его было просто достать, а сами они находились под воздействием постоянного стресса войны; они строили дружеские отношения с сослуживцами, которые уже принимали героин, и находились в тысяче миль от дома. Но как только солдат возвращался в США, он оказывался в среде, лишенной этих стимулов. Как только менялся контекст, менялась и привычка.Сравните эту ситуацию с ситуацией типичного наркомана. Он становится наркозависимым дома или в компании друзей, затем попадает в клинику, где проходит реабилитацию и «очищается»– при этом находясь в среде, лишенной стимулов, которые сформировали его привычку, а затем возвращается в прежнее окружение со всеми стимулами, которые уже спровоцировали наркозависимость в первый раз. Поэтому неудивительно, что обычно наблюдается огромное количество примеров, прямо противоположных тем, что мы только что видели в рамках Вьетнамской кампании. Как правило, 90% героиновых наркоманов снова становятся зависимыми после возвращения с реабилитации.Вьетнамские исследования противоречат многим нашим культурным убеждениям относительно дурных привычек, поскольку ставят под сомнение шаблонную ассоциацию нездорового поведения с моральной слабостью. Если у вас избыточный вес, вы курите или страдаете наркозависимостью, вам всю жизнь говорят, что причиной этого является недостаток самоконтроля – а иногда даже говорят, что вы плохой человек. Идея о том, что немного дисциплины способно решить все проблемы, глубоко укоренилась в нашей культуре.Однако недавние исследования свидетельствуют о прямо противоположных фактах. Когда ученые анализируют поведение людей, которые, казалось бы, обладают выдающимся самоконтролем, выясняется, что эти люди ничем не отличаются от тех, кто постоянно борется с вредными привычками. «Дисциплинированные» люди лучше справляются со структурированием своей жизни способами, которые не требуют героической силы воли и самоконтроля. Иначе говоря, они тратят меньше времени, чтобы справиться с теми или иными ситуациями.Люди с развитым самоконтролем, как правило, меньше всех нуждаются в его применении. Проще практиковать выдержку и самоконтроль, когда не приходится использовать их слишком часто. Таким образом, действительно, упорство, твердость характера и сила воли очень важны для достижения успеха, но способ развить эти качества заключается не в том, чтобы стать более дисциплинированным человеком, а в том, чтобы создать более дисциплинированную среду вокруг себя.Эта парадоксальная идея становится еще более логичной, когда вы начинаете понимать, что происходит в процессе формирования привычки в мозгу. Привычка, которая уже закодирована в нем, «готова к использованию» влюбой момент, как только наступит соответствующая ситуация. Когда Пэтти Олвэлл, врач из Остина, Техас, начала курить, она часто закуривала во время верховой прогулки со своим другом. В конце концов она перестала курить и не курила много лет. Она также перестала ездить верхом. Спустя десятилетия она снова села на лошадь и вскоре заметила, что впервые за много лет ей очень хочется курить. Стимулы все еще были актуальны, они просто не проявлялись в течение долгого времени.Если привычка укоренилась в мозгу, призыв к действию появляется каждый раз, когда возникают соответствующие стимулы во внешней среде. Это одна из причин, по которой техники по изменению поведения могут вызвать негативные последствия. Если вы будете смущать людей с избыточным весом, постоянно демонстрируя им презентации по снижению веса, то они могут ощутить стресс, и в результате большая часть из них вернется к своей излюбленной стратегии преодоления стресса – перееданию. Когда вы показываете курильщикам легкие с затемнениями, это приводит к повышению уровня тревожности, в результате чего многие люди хватаются за сигарету. Таким образом, если вы невнимательно относитесь к стимулам, то можете спровоцировать именно то поведение, которого хотите избежать.Можно сказать, что дурные привычки являются аутокаталитическими: процесс подпитывает сам себя. Они усиливают чувства, которые человек пытается подавить. Например, вы чувствуете себя плохо, и поэтому начинаете есть фастфуд. От того, что вы его едите, вы начинаете чувствовать себя плохо. Просмотр телевизора вызывает сонливость, поэтому вы смотрите его еще больше, так как вам не хватает энергии на что-то другое. Беспокойство о своем здоровье заставляет вас испытывать тревогу, которая в свою очередь вызывает желание покурить, чтобы успокоиться, но это способствует ухудшению здоровья, из-за чего ваше беспокойство в ближайшее время только усилится. Это своего рода нисходящая спираль, потерявший управление «поезд дурных привычек».Ученые называют этот феномен «желание, вызванное стимулом»: внешний триггер вызывает навязчивое стремление повторить дурную привычку. Как только вы замечаете что-то, вы начинаете хотеть этого. Это процесс происходит постоянно – часто мы даже не замечаем его. Ученые установили, что если всего на тридцать три миллисекунды показать изображение кокаина наркозависимым, это стимулирует в мозгу стремление к подкреплению и вызывает страстное желание принять наркотик. Это очень непродолжительное время, за которое мозг не успевает сознательно зарегистрировать увиденное – наркозависимые даже не смогут рассказать вам, что они видели,– и тем не менее все они одинаково захотят получить наркотик.Именно в этом заключается ключевой момент: вы можете избавиться от привычки, но не способны забыть ее. Если мыслительные паттерны, характерные для привычки, были зафиксированы в мозгу, их практически невозможно удалить полностью – даже если они не используются в течение продолжительного времени. А это значит, что простое противостояние искушению будет неэффективной стратегией. Очень сложно сохранить созерцательное и философское отношение к жизни, полной сложностей и противоречий. Это требует слишком много энергии. Поэтому в краткосрочной перспективе мы можем выбрать стратегию противостояния искушению. Однако в долгосрочной перспективе мы неизбежно становимся продуктом той среды, в которой живем. Откровенно говоря, мне ни разу не приходилось увидеть человека, последовательно приверженного хорошим привычкам в негативном окружении.Более надежным подходом будет искоренение плохих привычек в их исходной точке. Один из наиболее практичных способов устранить плохую привычку – это снизить воздействие на себя стимула, который провоцирует ее.•Если вы никак не можете закончить работу, оставьте телефон в другой комнате на несколько часов. Если вы постоянно ощущаете, что вам чего-то не хватает, прекратите просматривать профили других людей в социальных сетях – это вызывает ревность и зависть.•Если вы тратите слишком много времени на просмотр телевизора, уберите телевизор из спальни.•Если вы тратите слишком много денег на гаджеты, перестаньте читать обзоры последних технических новинок.•Если вы слишком много играете в видеоигры, после каждого использования отключайте приставку и убирайте ее в шкаф.Эта практика – не что иное, как обратная трактовка первого закона изменения поведения. Вместо того чтобы делать что-то очевидным, вы можете сделать это неочевидным. Я часто удивляюсь тому, насколько эффективными могут быть такие незначительные изменения. Уберите один-единственный стимул, и вся привычка уйдет вместе с ним.Самоконтроль – краткосрочная, а не долгосрочная стратегия. Вы можете противостоять искушению один или два раза, но не сможете каждый раз собирать волю в кулак, чтобы побеждать желания. Вместо этого лучше потратьте энергию на организацию своего окружения. В этом и заключается секрет самоконтроля. Сделайте стимулы хороших привычек очевидными, а стимулы плохих привычек – незаметными. РЕЗЮМЕ•Обратная трактовка первого закона изменения поведения звучит так: «Сделайте это неочевидным».•Когда привычка сформирована, ее практически невозможно забыть.•Люди с высокой степенью самоконтроля, как правило, тратят меньше времени, чтобы справляться со сложными ситуациями. Проще избежать искушения, чем противостоять ему.•Одним из наиболее практичных способов избавиться от плохой привычки является сокращение проявлений стимула, который вызывает ее.•Самоконтроль – это краткосрочная, а не долгосрочная стратегия. + +- Уже извлечённые блоки framework, insights, application (для согласованности): +{ + "framework": { + "terms": { + "стимул": "что в окружающей среде заставляет человека действовать", + "привычка": "повторяющееся действие, которое становится автоматическим", + "подкрепление": "воздействие, усиливающее вероятность повторения действия", + "среда": "окружение, влияющее на поведение через стимулы и ограничения", + "желание, вызванное стимулом": "непроизвольная тяга к действию, спровоцированному внешним триггером", + "аутокаталитический процесс": "процесс, усиливающий себя сам" + }, + "principles": [ + {"title": "Среда формирует поведение", "description": "Человек не управляет привычками напрямую, а воздействует на окружение, чтобы оно вело его к нужным действиям", "example": "Убрать телефон с рабочего стола, чтобы не отвлекаться на соцсети", "chains": [{"cause": "Человек находится в среде с доступными стимулами для нежелательной привычки", "mechanism": "Стимул активирует уже сформированную привычку, которая запускает автоматическое действие", "result": "Человек повторяет вредную привычку, не осознавая этого"}, {"cause": "Изменяется среда, удаляются стимулы, провоцирующие нежелательную привычку", "mechanism": "Отсутствие триггеров снижает вероятность срабатывания привычки", "result": "Человек реже проявляет нежелательное поведение"}]}, + {"title": "Привычки не исчезают, они только временно подавлены", "description": "Даже если человек перестаёт делать что-то, привычка остаётся в мозге и может вернуться при подходящих условиях", "example": "Человек перестаёт курить, но снова начинает после посещения места, где раньше курил", "chains": [{"cause": "Человек прекращает проявлять вредную привычку", "mechanism": "Мозг сохраняет нейронные связи, связанные с этой привычкой", "result": "Привычка может вернуться, если появятся подходящие стимулы"}, {"cause": "Окружение меняется, и в нем появляются триггеры, связанные с прошлой привычкой", "mechanism": "Стимулы запускают автоматические паттерны поведения", "result": "Человек снова начинает делать то, что уже перестал"}]}, + {"title": "Самоконтроль — это краткосрочный, а не долгосрочный инструмент", "description": "Противостояние искушению неэффективно на длительном сроке, нужно менять контекст", "example": "Человек отказывается от сладкого, но возвращается к нему после стрессового дня", "chains": [{"cause": "Человек пытается контролировать себя в момент искушения", "mechanism": "Это требует энергии и усилий, которые невозможно поддерживать всегда", "result": "Человек устаёт от борьбы и возвращается к нежелательной привычке"}, {"cause": "Человек изменяет окружение, чтобы искушения стали менее доступными", "mechanism": "Стимулы для плохого поведения становятся незаметными или невозможными", "result": "Человек реже сталкивается с искушением"}]}, + {"title": "Дисциплина — это настройка среды, а не внутреннее усилие", "description": "Сильные люди не просто дисциплинированы, а живут в среде, которая поддерживает их цели", "example": "Человек встаёт раньше, потому что спальня тёмная и не имеет гаджетов", "chains": [{"cause": "Человек пытается быть дисциплинированным только силой воли", "mechanism": "Это требует большого количества энергии и часто неудачно", "result": "Человек теряет мотивацию и возвращается к нежелательному поведению"}, {"cause": "Человек настраивает окружение так, чтобы хорошее поведение было лёгким", "mechanism": "Стимулы для правильных действий становятся более доступными", "result": "Человек чаще выбирает здоровые привычки"}]}, + {"title": "Негативные эмоции усиливают негативное поведение", "description": "Стресс, тревога и другие негативные чувства провоцируют возвращение к вредным привычкам", "example": "Человек садится на диван и ест шоколад, когда ему плохо", "chains": [{"cause": "Человек испытывает стресс или негативные эмоции", "mechanism": "Это активирует привычку, которая помогает снизить дискомфорт", "result": "Человек снова начинает делать то, что раньше снимало напряжение"}, {"cause": "Человек пытается избавиться от вредной привычки, но не меняет среду", "mechanism": "Стресс и негативные эмоции остаются, усиливая желание к действию", "result": "Человек возвращается к нежелательной привычке"}]} + ] + }, + "insights": [ + {"title": "Среда влияет на привычки больше, чем сила воли", "description": "Чтобы изменить привычку, нужно изменить окружение, а не надеяться только на самоконтроль", "example": "Убрать телефон с рабочего стола, чтобы не отвлекаться на соцсети"}, + {"title": "Привычки не исчезают, только временно подавляются", "description": "Даже если человек перестаёт курить или есть сладкое, эти привычки остаются в мозге и могут вернуться при подходящих условиях", "example": "После посещения бара человек снова начинает пить, не осознавая этого"}, + {"title": "Негативные эмоции усиливают вредное поведение", "description": "Стресс, тревога и другие негативные чувства могут спровоцировать возвращение к старым привычкам", "example": "После ссоры человек снова начинает есть вредную пищу, чтобы успокоиться"}, + {"title": "Сокращение стимулов уменьшает повторение нежелательного поведения", "description": "Удаление триггеров, связанных с вредной привычкой, снижает вероятность её возобновления", "example": "Убрать сигареты из дома, чтобы уменьшить вероятность их употребления"}, + {"title": "Самоконтроль — это временная стратегия, а не долгосрочное решение", "description": "Постоянно бороться с искушением утомительно и непрочное; нужно настраивать среду так, чтобы искушений не было совсем", "example": "Поставить телефон в другую комнату, чтобы не проверять соцсети во время работы"} + ], + "application": { + "techniques": [ + {"name": "Снижение доступности стимула", "goal": "Уменьшение вероятности повторения нежелательной привычки за счёт удаления её триггеров", "context_example": "Вечер после работы, когда тянет залипнуть в телефон и проверять соцсети", "steps": ["Определите конкретный стимул (например, наличие телефона на столе)", "Уберите объект из зоны видимости или досягаемости (например, оставьте телефон в другой комнате)", "Запишите дату и время изменения (для отслеживания эффективности)"], "client_phrase": "Уберите источник искушения из вашей среды — действие станет менее вероятным", "success_criteria": "Частота использования телефона в моменты, когда это не нужно, снижается с 5 раз/день до 1–2 раз/день за 2 недели"} + ] + } +} + +--- + +## ЗАДАЧА + +Извлеки ограничения: при каких условиях описанные идеи и техники не сработают или дадут риски. Ограничения должны относиться к уже извлечённым принципам и техникам; не противоречь им. +- Объединяй перекрывающиеся ограничения: одно ограничение = один тип риска или условия. Не дублируй одну мысль под разными формулировками. Один тип риска = один пункт (например: «внутренние эмоции» и «привычка на уровне нейронов/внутренних триггеров» — один тип риска «причина внутри, а не в среде»; не оформляй двумя разными пунктами). +- Ограничение — это конкретное условие или ситуация, при которых идеи/техники не сработают или дадут риски. Не включай общие truisms («всё индивидуально», «зависит от человека»); только ограничения с опорой в тексте или следующие из переданных принципов и техник. +- Краевой случай: если в главе нет явных ограничений, рисков или узких мест — верни пустой массив: "limitations": []. Не придумывай ограничения ради заполнения. +- Ориентир: 2–5 ограничений без смысловых дублей. + +## СТРОГИЕ ПРАВИЛА + +1. Не пересказывай текст и не цитируй большие фрагменты; работай на уровне обобщений и смысловых единиц. +2. Язык простой, разговорно-профессиональный. При первом использовании по порядку в списке ограничений слов «триггер», «стимул», «паттерн» и т.п. обязательно добавь в скобках пояснение в 3–7 слов, например: триггер (то, что в окружении запускает действие). В следующих пунктах тот же термин можно использовать без повторного пояснения. +3. Каждое ограничение должно быть: + - понятно без дополнительного объяснения; + - приземлено к реальным ситуациям (работа, дом, отношения); + - у каждого ограничения обязательно заполни поле "example": один бытовой пример ситуации, когда это ограничение проявляется (в одну фразу). +4. when_relevant — в каких ситуациях, контекстах или для каких людей это ограничение особенно важно учитывать. +5. Избегай чрезмерной абстракции и канцелярита; формулировки живые, но точные. +6. Не используй вводные фразы, обращение к читателю и объяснения формата. + +--- + +## КРИТИЧНО ДЛЯ ФОРМАТА + +- Ограничения не противоречат принципам и техникам из переданных блоков; они указывают, когда идеи не сработают или дадут риски. +- У каждого ограничения — поле "example" с одним бытовым примером ситуации в одну фразу (работа, дом, отношения). +- Не дублируй перекрывающиеся ограничения: перед добавлением проверь — не описывает ли новый пункт тот же тип риска, что уже есть? Если два пункта по смыслу про одно (например, «когда причина привычки внутренняя»), объедини в один. +- В первом по порядку ограничении, где встречается «триггер» или «стимул», дай пояснение в скобках (3–7 слов). +- Если в главе нет описанных ограничений или рисков — верни "limitations": []. +- Не включай общие truisms; только конкретные ограничения с опорой в тексте или в переданных блоках. + +--- + +## ФОРМАТ ОТВЕТА + +Строго один JSON-объект с единственным ключом верхнего уровня "limitations", без комментариев и markdown: + +{ + "limitations": [ + { + "description": "Риск или узкое место при применении идей на практике", + "when_relevant": "В каких ситуациях или для каких людей это важно учитывать", + "example": "Один бытовой пример ситуации, когда это ограничение проявляется (работа, дом или отношения)" + } + ] +} + +Верни только этот объект — ничего до и после. diff --git a/1_анализ_главы/merge.json b/1_анализ_главы/merge.json new file mode 100644 index 0000000..e130b5e --- /dev/null +++ b/1_анализ_главы/merge.json @@ -0,0 +1,159 @@ +{ + "framework": { + "terms": { + "стимул": "что в окружающей среде заставляет человека действовать", + "привычка": "повторяющееся действие, которое становится автоматическим", + "подкрепление": "воздействие, усиливающее вероятность повторения действия", + "среда": "окружение, влияющее на поведение через стимулы и ограничения", + "желание, вызванное стимулом": "непроизвольная тяга к действию, спровоцированному внешним триггером", + "аутокаталитический процесс": "процесс, усиливающий себя сам" + }, + "principles": [ + { + "title": "Среда формирует поведение", + "description": "Человек не управляет привычками напрямую, а воздействует на окружение, чтобы оно вело его к нужным действиям", + "example": "Убрать телефон с рабочего стола, чтобы не отвлекаться на соцсети", + "chains": [ + { + "cause": "Человек находится в среде с доступными стимулами для нежелательной привычки", + "mechanism": "Стимул активирует уже сформированную привычку, которая запускает автоматическое действие", + "result": "Человек повторяет вредную привычку, не осознавая этого" + }, + { + "cause": "Изменяется среда, удаляются стимулы, провоцирующие нежелательную привычку", + "mechanism": "Отсутствие триггеров снижает вероятность срабатывания привычки", + "result": "Человек реже проявляет нежелательное поведение" + } + ] + }, + { + "title": "Привычки не исчезают, они только временно подавлены", + "description": "Даже если человек перестаёт делать что-то, привычка остаётся в мозге и может вернуться при подходящих условиях", + "example": "Человек перестаёт курить, но снова начинает после посещения места, где раньше курил", + "chains": [ + { + "cause": "Человек прекращает проявлять вредную привычку", + "mechanism": "Мозг сохраняет нейронные связи, связанные с этой привычкой", + "result": "Привычка может вернуться, если появятся подходящие стимулы" + }, + { + "cause": "Окружение меняется, и в нем появляются триггеры, связанные с прошлой привычкой", + "mechanism": "Стимулы запускают автоматические паттерны поведения", + "result": "Человек снова начинает делать то, что уже перестал" + } + ] + }, + { + "title": "Самоконтроль — это краткосрочный, а не долгосрочный инструмент", + "description": "Противостояние искушению неэффективно на длительном сроке, нужно менять контекст", + "example": "Человек отказывается от сладкого, но возвращается к нему после стрессового дня", + "chains": [ + { + "cause": "Человек пытается контролировать себя в момент искушения", + "mechanism": "Это требует энергии и усилий, которые невозможно поддерживать всегда", + "result": "Человек устаёт от борьбы и возвращается к нежелательной привычке" + }, + { + "cause": "Человек изменяет окружение, чтобы искушения стали менее доступными", + "mechanism": "Стимулы для плохого поведения становятся незаметными или невозможными", + "result": "Человек реже сталкивается с искушением" + } + ] + }, + { + "title": "Дисциплина — это настройка среды, а не внутреннее усилие", + "description": "Сильные люди не просто дисциплинированы, а живут в среде, которая поддерживает их цели", + "example": "Человек встаёт раньше, потому что спальня тёмная и не имеет гаджетов", + "chains": [ + { + "cause": "Человек пытается быть дисциплинированным только силой воли", + "mechanism": "Это требует большого количества энергии и часто неудачно", + "result": "Человек теряет мотивацию и возвращается к нежелательному поведению" + }, + { + "cause": "Человек настраивает окружение так, чтобы хорошее поведение было лёгким", + "mechanism": "Стимулы для правильных действий становятся более доступными", + "result": "Человек чаще выбирает здоровые привычки" + } + ] + }, + { + "title": "Негативные эмоции усиливают негативное поведение", + "description": "Стресс, тревога и другие негативные чувства провоцируют возвращение к вредным привычкам", + "example": "Человек садится на диван и ест шоколад, когда ему плохо", + "chains": [ + { + "cause": "Человек испытывает стресс или негативные эмоции", + "mechanism": "Это активирует привычку, которая помогает снизить дискомфорт", + "result": "Человек снова начинает делать то, что раньше снимало напряжение" + }, + { + "cause": "Человек пытается избавиться от вредной привычки, но не меняет среду", + "mechanism": "Стресс и негативные эмоции остаются, усиливая желание к действию", + "result": "Человек возвращается к нежелательной привычке" + } + ] + } + ] + }, + "insights": [ + { + "title": "Среда влияет на привычки больше, чем сила воли", + "description": "Чтобы изменить привычку, нужно изменить окружение, а не надеяться только на самоконтроль", + "example": "Убрать телефон с рабочего стола, чтобы не отвлекаться на соцсети" + }, + { + "title": "Привычки не исчезают, только временно подавляются", + "description": "Даже если человек перестаёт курить или есть сладкое, эти привычки остаются в мозге и могут вернуться при подходящих условиях", + "example": "После посещения бара человек снова начинает пить, не осознавая этого" + }, + { + "title": "Негативные эмоции усиливают вредное поведение", + "description": "Стресс, тревога и другие негативные чувства могут спровоцировать возвращение к старым привычкам", + "example": "После ссоры человек снова начинает есть вредную пищу, чтобы успокоиться" + }, + { + "title": "Сокращение стимулов уменьшает повторение нежелательного поведения", + "description": "Удаление триггеров, связанных с вредной привычкой, снижает вероятность её возобновления", + "example": "Убрать сигареты из дома, чтобы уменьшить вероятность их употребления" + }, + { + "title": "Самоконтроль — это временная стратегия, а не долгосрочное решение", + "description": "Постоянно бороться с искушением утомительно и непрочное; нужно настраивать среду так, чтобы искушений не было совсем", + "example": "Поставить телефон в другую комнату, чтобы не проверять соцсети во время работы" + } + ], + "application": { + "techniques": [ + { + "name": "Снижение доступности стимула", + "goal": "Уменьшение вероятности повторения нежелательной привычки за счёт удаления её триггеров", + "context_example": "Вечер после работы, когда тянет залипнуть в телефон и проверять соцсети", + "steps": [ + "Определите конкретный стимул (например, наличие телефона на столе)", + "Уберите объект из зоны видимости или досягаемости (например, оставьте телефон в другой комнате)", + "Запишите дату и время изменения (для отслеживания эффективности)" + ], + "client_phrase": "Уберите источник искушения из вашей среды — действие станет менее вероятным", + "success_criteria": "Частота использования телефона в моменты, когда это не нужно, снижается с 5 раз/день до 1–2 раз/день за 2 недели" + } + ] + }, + "limitations": [ + { + "description": "Идеи не работают, если триггер (то, что в окружении запускает действие) не устранён или остаётся доступным, так как привычка может вернуться при появлении стимула", + "when_relevant": "Когда человек не полностью убирает триггер из своей среды или сталкивается с ним в новой обстановке", + "example": "Человек удалил сигареты из дома, но снова начинает курить на работе среди коллег-курильщиков" + }, + { + "description": "Техники могут не сработать, если негативные эмоции (стресс, тревога) остаются необратленными и усиливают нежелательное поведение", + "when_relevant": "Когда человек продолжает испытывать сильный стресс или эмоциональные трудности, не решая их на уровне среды", + "example": "Человек убрал телефон из комнаты, но всё равно переедает перед сном из-за хронической тревоги" + }, + { + "description": "Изменения среды могут быть недостаточны, если привычка закреплена на уровне автоматических нейронных паттернов и не сопровождается новыми, здоровыми привычками", + "when_relevant": "Когда человек устраняет триггер, но не вводит альтернативное поведение для подкрепления", + "example": "Человек убрал телевизор из спальни, но не нашёл замену в виде чтения или медитации и проводит время впустую" + } + ] +} \ No newline at end of file diff --git a/1_анализ_главы/merge_jsons.py b/1_анализ_главы/merge_jsons.py new file mode 100644 index 0000000..9e054cc --- /dev/null +++ b/1_анализ_главы/merge_jsons.py @@ -0,0 +1,99 @@ +#!/usr/bin/env python3 +""" +Скрипт объединения нескольких JSON-файлов в один. + +Файлы должны лежать в том же каталоге, что и скрипт. Каждый файл — один JSON-объект; +результат — один объект, собранный из верхнеуровневых ключей всех файлов. +При совпадении ключей побеждает значение из файла, идущего позже в списке. +""" + +import argparse +import json +from pathlib import Path + + +def get_script_dir() -> Path: + """Возвращает каталог, в котором расположен скрипт.""" + return Path(__file__).resolve().parent + + +def merge_json_files( + filenames: list[str], + base_dir: Path, + output_path: Path, + indent: int | None = 2, +) -> None: + """ + Читает перечисленные JSON-файлы из base_dir и записывает объединённый объект в output_path. + + Args: + filenames: Список имён файлов (без пути). + base_dir: Каталог с входными файлами. + output_path: Полный путь к результирующему JSON-файлу. + indent: Отступ для форматирования JSON (по умолчанию 2). + + Raises: + FileNotFoundError: Если какой-либо входной файл не найден. + json.JSONDecodeError: Если содержимое файла не является валидным JSON. + """ + result: dict = {} + + for name in filenames: + path = base_dir / name + if not path.is_file(): + raise FileNotFoundError(f"Файл не найден: {path}") + + with open(path, "r", encoding="utf-8") as f: + data = json.load(f) + + if not isinstance(data, dict): + raise TypeError( + f"Файл {name} должен содержать JSON-объект (dict), получен: {type(data).__name__}" + ) + result.update(data) + + with open(output_path, "w", encoding="utf-8") as f: + json.dump(result, f, ensure_ascii=False, indent=indent) + + +def main() -> None: + """Точка входа: разбор аргументов и вызов объединения.""" + script_dir = get_script_dir() + + parser = argparse.ArgumentParser( + description="Объединить несколько JSON-файлов из каталога скрипта в один файл." + ) + parser.add_argument( + "files", + nargs="+", + metavar="FILE", + help="Имена JSON-файлов (в каталоге скрипта)", + ) + parser.add_argument( + "-o", + "--output", + default="merged.json", + metavar="OUTPUT", + help="Имя результирующего файла (по умолчанию: merged.json)", + ) + parser.add_argument( + "--no-indent", + action="store_true", + help="Не форматировать вывод (компактный JSON)", + ) + args = parser.parse_args() + + output_path = script_dir / args.output + indent = None if args.no_indent else 2 + + merge_json_files( + filenames=args.files, + base_dir=script_dir, + output_path=output_path, + indent=indent, + ) + print(f"Записано: {output_path}") + + +if __name__ == "__main__": + main() diff --git a/1_анализ_главы/run_framework_ollama.py b/1_анализ_главы/run_framework_ollama.py new file mode 100644 index 0000000..a6b982c --- /dev/null +++ b/1_анализ_главы/run_framework_ollama.py @@ -0,0 +1,119 @@ +#!/usr/bin/env python3 +""" +Один запуск блока framework через Ollama (qwen3:14b) для сравнения с эталоном выход_frame.json. +Вход: вход_главы.json, промпт extract_framework_v2.txt. +Выход: выход_frame_ollama.json и краткое сравнение с выход_frame.json. +""" + +import json +import re +import sys +import time +import urllib.request +from pathlib import Path + +OLLAMA_URL = "http://localhost:11434" +MODEL = "qwen3:14b" +DIR = Path(__file__).resolve().parent + + +def load_input() -> dict: + with open(DIR / "вход_главы.json", encoding="utf-8") as f: + return json.load(f) + + +def load_prompt() -> str: + with open(DIR / "extract_framework_v2.txt", encoding="utf-8") as f: + return f.read() + + +def substitute_prompt(prompt: str, data: dict) -> str: + return prompt.replace("{book_title}", data.get("book_title", "")).replace( + "{chapter_title}", data.get("chapter_title", "") + ).replace("{chapter_text}", data.get("chapter_text", "")) + + +def extract_json_from_response(text: str) -> dict: + """Достаёт JSON из ответа модели (может быть обёрнут в ```json ... ```).""" + text = text.strip() + match = re.search(r"```(?:json)?\s*([\s\S]*?)\s*```", text) + if match: + text = match.group(1).strip() + return json.loads(text) + + +def call_ollama(prompt: str) -> str: + body = json.dumps( + { + "model": MODEL, + "messages": [{"role": "user", "content": prompt}], + "stream": False, + "format": "json", + }, + ensure_ascii=False, + ).encode("utf-8") + req = urllib.request.Request( + f"{OLLAMA_URL}/api/chat", + data=body, + headers={"Content-Type": "application/json"}, + method="POST", + ) + try: + # Таймаут отключён — ждём завершения генерации (может быть 10+ минут на CPU) + with urllib.request.urlopen(req, timeout=None) as resp: + data = json.load(resp) + return data.get("message", {}).get("content", "") + except urllib.error.HTTPError as e: + body = "" + if e.fp: + try: + body = e.fp.read().decode("utf-8", errors="replace")[:1000] + except Exception: + pass + raise RuntimeError(f"Ollama HTTP {e.code}: {e.reason}. Body: {body}") from e + + +def main() -> int: + print("Загрузка вход_главы.json и промпта...") + inp = load_input() + prompt_tpl = load_prompt() + prompt = substitute_prompt(prompt_tpl, inp) + print(f"Вызов Ollama {MODEL} (таймаут отключён, ждём завершения)...") + t0 = time.monotonic() + try: + raw = call_ollama(prompt) + except Exception as e: + print(f"Ошибка вызова Ollama: {e}", file=sys.stderr) + return 1 + elapsed = time.monotonic() - t0 + print(f"Ответ получен за {elapsed:.1f} сек ({elapsed / 60:.1f} мин)") + try: + result = extract_json_from_response(raw) + except json.JSONDecodeError as e: + print(f"Не удалось распарсить JSON из ответа: {e}", file=sys.stderr) + print("Первые 500 символов ответа:", raw[:500], file=sys.stderr) + return 1 + out_path = DIR / "выход_frame_ollama.json" + with open(out_path, "w", encoding="utf-8") as f: + json.dump(result, f, ensure_ascii=False, indent=2) + print(f"Результат сохранён: {out_path}") + + # Сравнение с эталоном + ref_path = DIR / "выход_frame.json" + if ref_path.exists(): + with open(ref_path, encoding="utf-8") as f: + ref = json.load(f) + fw_ollama = result.get("framework", {}) + fw_ref = ref.get("framework", {}) + terms_o = len(fw_ollama.get("terms", {})) + terms_r = len(fw_ref.get("terms", {})) + principles_o = len(fw_ollama.get("principles", [])) + principles_r = len(fw_ref.get("principles", [])) + print("\n--- Сравнение с эталоном выход_frame.json ---") + print(f" principles: эталон {principles_r}, Ollama {principles_o}") + print(f" terms: эталон {terms_r}, Ollama {terms_o}") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/1_анализ_главы/Вход.txt b/1_анализ_главы/Вход.txt new file mode 100644 index 0000000..a81bf8c --- /dev/null +++ b/1_анализ_главы/Вход.txt @@ -0,0 +1 @@ +В 1971 году, когда шел шестнадцатый год войны во Вьетнаме, два американских конгрессмена, Роберт Стил из Коннектикута и Морган Мерфи из Иллинойса, сделали открытие, которое потрясло американское общество. Во время посещения воинских частей они выяснили, что более 15% американских солдат во Вьетнаме имели зависимость от героина. Более поздние исследования показали, что 35% американского контингента во Вьетнаме когда-либо пробовало героин и почти 20% страдало наркотической зависимостью – то есть проблема оказалась еще серьезнее, чем им показалось вначале.Это открытие вызвало бурную активность в Вашингтоне, включая создание по распоряжению президента Ричарда Никсона Специального комитета по предупреждению злоупотреблений наркотиками, целью деятельности которого была профилактика наркомании, а также реабилитация и отслеживание судеб наркозависимых солдат после возвращения на родину.Ли Робинс был одним из исследователей комитета. В ходе исследования, результаты которого перевернули все имевшиеся представления о наркологии, он обнаружил, что только 5% наркозависимых солдат снова начинали принимать героин в течение первого года после возвращения из реабилитационного центра и всего 12% делали это в течение трех лет. Иными словами, девять солдат из десяти избавлялись от наркотической зависимости после того, как покидали Вьетнам.Это открытие полностью противоречило всем представлениям наркологов того времени, согласно которым героиновая зависимость считалась постоянной и необратимом болезнью. Однако в противоположность этим представлениям Робинс обнаружил, что эта зависимость может спонтанно исчезнуть в случае полной смены окружения. Во Вьетнаме солдаты проводили все свое время в окружении стимулов, провоцировавших употребление героина: его было просто достать, а сами они находились под воздействием постоянного стресса войны; они строили дружеские отношения с сослуживцами, которые уже принимали героин, и находились в тысяче миль от дома. Но как только солдат возвращался в США, он оказывался в среде, лишенной этих стимулов. Как только менялся контекст, менялась и привычка.Сравните эту ситуацию с ситуацией типичного наркомана. Он становится наркозависимым дома или в компании друзей, затем попадает в клинику, где проходит реабилитацию и «очищается»– при этом находясь в среде, лишенной стимулов, которые сформировали его привычку, а затем возвращается в прежнее окружение со всеми стимулами, которые уже спровоцировали наркозависимость в первый раз. Поэтому неудивительно, что обычно наблюдается огромное количество примеров, прямо противоположных тем, что мы только что видели в рамках Вьетнамской кампании. Как правило, 90% героиновых наркоманов снова становятся зависимыми после возвращения с реабилитации.Вьетнамские исследования противоречат многим нашим культурным убеждениям относительно дурных привычек, поскольку ставят под сомнение шаблонную ассоциацию нездорового поведения с моральной слабостью. Если у вас избыточный вес, вы курите или страдаете наркозависимостью, вам всю жизнь говорят, что причиной этого является недостаток самоконтроля – а иногда даже говорят, что вы плохой человек. Идея о том, что немного дисциплины способно решить все проблемы, глубоко укоренилась в нашей культуре.Однако недавние исследования свидетельствуют о прямо противоположных фактах. Когда ученые анализируют поведение людей, которые, казалось бы, обладают выдающимся самоконтролем, выясняется, что эти люди ничем не отличаются от тех, кто постоянно борется с вредными привычками. «Дисциплинированные» люди лучше справляются со структурированием своей жизни способами, которые не требуют героической силы воли и самоконтроля. Иначе говоря, они тратят меньше времени, чтобы справиться с теми или иными ситуациями.Люди с развитым самоконтролем, как правило, меньше всех нуждаются в его применении. Проще практиковать выдержку и самоконтроль, когда не приходится использовать их слишком часто. Таким образом, действительно, упорство, твердость характера и сила воли очень важны для достижения успеха, но способ развить эти качества заключается не в том, чтобы стать более дисциплинированным человеком, а в том, чтобы создать более дисциплинированную среду вокруг себя.Эта парадоксальная идея становится еще более логичной, когда вы начинаете понимать, что происходит в процессе формирования привычки в мозгу. Привычка, которая уже закодирована в нем, «готова к использованию» влюбой момент, как только наступит соответствующая ситуация. Когда Пэтти Олвэлл, врач из Остина, Техас, начала курить, она часто закуривала во время верховой прогулки со своим другом. В конце концов она перестала курить и не курила много лет. Она также перестала ездить верхом. Спустя десятилетия она снова села на лошадь и вскоре заметила, что впервые за много лет ей очень хочется курить. Стимулы все еще были актуальны, они просто не проявлялись в течение долгого времени.Если привычка укоренилась в мозгу, призыв к действию появляется каждый раз, когда возникают соответствующие стимулы во внешней среде. Это одна из причин, по которой техники по изменению поведения могут вызвать негативные последствия. Если вы будете смущать людей с избыточным весом, постоянно демонстрируя им презентации по снижению веса, то они могут ощутить стресс, и в результате большая часть из них вернется к своей излюбленной стратегии преодоления стресса – перееданию. Когда вы показываете курильщикам легкие с затемнениями, это приводит к повышению уровня тревожности, в результате чего многие люди хватаются за сигарету. Таким образом, если вы невнимательно относитесь к стимулам, то можете спровоцировать именно то поведение, которого хотите избежать.Можно сказать, что дурные привычки являются аутокаталитическими: процесс подпитывает сам себя. Они усиливают чувства, которые человек пытается подавить. Например, вы чувствуете себя плохо, и поэтому начинаете есть фастфуд. От того, что вы его едите, вы начинаете чувствовать себя плохо. Просмотр телевизора вызывает сонливость, поэтому вы смотрите его еще больше, так как вам не хватает энергии на что-то другое. Беспокойство о своем здоровье заставляет вас испытывать тревогу, которая в свою очередь вызывает желание покурить, чтобы успокоиться, но это способствует ухудшению здоровья, из-за чего ваше беспокойство в ближайшее время только усилится. Это своего рода нисходящая спираль, потерявший управление «поезд дурных привычек».Ученые называют этот феномен «желание, вызванное стимулом»: внешний триггер вызывает навязчивое стремление повторить дурную привычку. Как только вы замечаете что-то, вы начинаете хотеть этого. Это процесс происходит постоянно – часто мы даже не замечаем его. Ученые установили, что если всего на тридцать три миллисекунды показать изображение кокаина наркозависимым, это стимулирует в мозгу стремление к подкреплению и вызывает страстное желание принять наркотик. Это очень непродолжительное время, за которое мозг не успевает сознательно зарегистрировать увиденное – наркозависимые даже не смогут рассказать вам, что они видели,– и тем не менее все они одинаково захотят получить наркотик.Именно в этом заключается ключевой момент: вы можете избавиться от привычки, но не способны забыть ее. Если мыслительные паттерны, характерные для привычки, были зафиксированы в мозгу, их практически невозможно удалить полностью – даже если они не используются в течение продолжительного времени. А это значит, что простое противостояние искушению будет неэффективной стратегией. Очень сложно сохранить созерцательное и философское отношение к жизни, полной сложностей и противоречий. Это требует слишком много энергии. Поэтому в краткосрочной перспективе мы можем выбрать стратегию противостояния искушению. Однако в долгосрочной перспективе мы неизбежно становимся продуктом той среды, в которой живем. Откровенно говоря, мне ни разу не приходилось увидеть человека, последовательно приверженного хорошим привычкам в негативном окружении.Более надежным подходом будет искоренение плохих привычек в их исходной точке. Один из наиболее практичных способов устранить плохую привычку – это снизить воздействие на себя стимула, который провоцирует ее.•Если вы никак не можете закончить работу, оставьте телефон в другой комнате на несколько часов. Если вы постоянно ощущаете, что вам чего-то не хватает, прекратите просматривать профили других людей в социальных сетях – это вызывает ревность и зависть.•Если вы тратите слишком много времени на просмотр телевизора, уберите телевизор из спальни.•Если вы тратите слишком много денег на гаджеты, перестаньте читать обзоры последних технических новинок.•Если вы слишком много играете в видеоигры, после каждого использования отключайте приставку и убирайте ее в шкаф.Эта практика – не что иное, как обратная трактовка первого закона изменения поведения. Вместо того чтобы делать что-то очевидным, вы можете сделать это неочевидным. Я часто удивляюсь тому, насколько эффективными могут быть такие незначительные изменения. Уберите один-единственный стимул, и вся привычка уйдет вместе с ним.Самоконтроль – краткосрочная, а не долгосрочная стратегия. Вы можете противостоять искушению один или два раза, но не сможете каждый раз собирать волю в кулак, чтобы побеждать желания. Вместо этого лучше потратьте энергию на организацию своего окружения. В этом и заключается секрет самоконтроля. Сделайте стимулы хороших привычек очевидными, а стимулы плохих привычек – незаметными. РЕЗЮМЕ•Обратная трактовка первого закона изменения поведения звучит так: «Сделайте это неочевидным».•Когда привычка сформирована, ее практически невозможно забыть.•Люди с высокой степенью самоконтроля, как правило, тратят меньше времени, чтобы справляться со сложными ситуациями. Проще избежать искушения, чем противостоять ему.•Одним из наиболее практичных способов избавиться от плохой привычки является сокращение проявлений стимула, который вызывает ее.•Самоконтроль – это краткосрочная, а не долгосрочная стратегия. \ No newline at end of file diff --git a/1_анализ_главы/вход_главы.example.json b/1_анализ_главы/вход_главы.example.json new file mode 100644 index 0000000..663594a --- /dev/null +++ b/1_анализ_главы/вход_главы.example.json @@ -0,0 +1,9 @@ +{ + "book_id": "00000000-0000-0000-0000-000000000001", + "chapter_id": "00000000-0000-0000-0000-000000000002", + "chapter_number": 7, + "chapter_title": "Секрет самоконтроля", + "book_title": "Атомные привычки", + "chapter_text": "В 1971 году, когда шел шестнадцатый год войны во Вьетнаме...", + "author": "Джеймс Клир" +} diff --git a/1_анализ_главы/вход_главы.json b/1_анализ_главы/вход_главы.json new file mode 100644 index 0000000..f12dae3 --- /dev/null +++ b/1_анализ_главы/вход_главы.json @@ -0,0 +1,9 @@ +{ + "book_id": "00000000-0000-0000-0000-000000000001", + "chapter_id": "00000000-0000-0000-0000-000000000007", + "chapter_number": 7, + "chapter_title": "Секрет самоконтроля", + "book_title": "Атомные привычки", + "chapter_text": "В 1971 году, когда шел шестнадцатый год войны во Вьетнаме, два американских конгрессмена, Роберт Стил из Коннектикута и Морган Мерфи из Иллинойса, сделали открытие, которое потрясло американское общество. Во время посещения воинских частей они выяснили, что более 15% американских солдат во Вьетнаме имели зависимость от героина. Более поздние исследования показали, что 35% американского контингента во Вьетнаме когда-либо пробовало героин и почти 20% страдало наркотической зависимостью – то есть проблема оказалась еще серьезнее, чем им показалось вначале.Это открытие вызвало бурную активность в Вашингтоне, включая создание по распоряжению президента Ричарда Никсона Специального комитета по предупреждению злоупотреблений наркотиками, целью деятельности которого была профилактика наркомании, а также реабилитация и отслеживание судеб наркозависимых солдат после возвращения на родину.Ли Робинс был одним из исследователей комитета. В ходе исследования, результаты которого перевернули все имевшиеся представления о наркологии, он обнаружил, что только 5% наркозависимых солдат снова начинали принимать героин в течение первого года после возвращения из реабилитационного центра и всего 12% делали это в течение трех лет. Иными словами, девять солдат из десяти избавлялись от наркотической зависимости после того, как покидали Вьетнам.Это открытие полностью противоречило всем представлениям наркологов того времени, согласно которым героиновая зависимость считалась постоянной и необратимом болезнью. Однако в противоположность этим представлениям Робинс обнаружил, что эта зависимость может спонтанно исчезнуть в случае полной смены окружения. Во Вьетнаме солдаты проводили все свое время в окружении стимулов, провоцировавших употребление героина: его было просто достать, а сами они находились под воздействием постоянного стресса войны; они строили дружеские отношения с сослуживцами, которые уже принимали героин, и находились в тысяче миль от дома. Но как только солдат возвращался в США, он оказывался в среде, лишенной этих стимулов. Как только менялся контекст, менялась и привычка.Сравните эту ситуацию с ситуацией типичного наркомана. Он становится наркозависимым дома или в компании друзей, затем попадает в клинику, где проходит реабилитацию и «очищается»– при этом находясь в среде, лишенной стимулов, которые сформировали его привычку, а затем возвращается в прежнее окружение со всеми стимулами, которые уже спровоцировали наркозависимость в первый раз. Поэтому неудивительно, что обычно наблюдается огромное количество примеров, прямо противоположных тем, что мы только что видели в рамках Вьетнамской кампании. Как правило, 90% героиновых наркоманов снова становятся зависимыми после возвращения с реабилитации.Вьетнамские исследования противоречат многим нашим культурным убеждениям относительно дурных привычек, поскольку ставят под сомнение шаблонную ассоциацию нездорового поведения с моральной слабостью. Если у вас избыточный вес, вы курите или страдаете наркозависимостью, вам всю жизнь говорят, что причиной этого является недостаток самоконтроля – а иногда даже говорят, что вы плохой человек. Идея о том, что немного дисциплины способно решить все проблемы, глубоко укоренилась в нашей культуре.Однако недавние исследования свидетельствуют о прямо противоположных фактах. Когда ученые анализируют поведение людей, которые, казалось бы, обладают выдающимся самоконтролем, выясняется, что эти люди ничем не отличаются от тех, кто постоянно борется с вредными привычками. «Дисциплинированные» люди лучше справляются со структурированием своей жизни способами, которые не требуют героической силы воли и самоконтроля. Иначе говоря, они тратят меньше времени, чтобы справиться с теми или иными ситуациями.Люди с развитым самоконтролем, как правило, меньше всех нуждаются в его применении. Проще практиковать выдержку и самоконтроль, когда не приходится использовать их слишком часто. Таким образом, действительно, упорство, твердость характера и сила воли очень важны для достижения успеха, но способ развить эти качества заключается не в том, чтобы стать более дисциплинированным человеком, а в том, чтобы создать более дисциплинированную среду вокруг себя.Эта парадоксальная идея становится еще более логичной, когда вы начинаете понимать, что происходит в процессе формирования привычки в мозгу. Привычка, которая уже закодирована в нем, «готова к использованию» влюбой момент, как только наступит соответствующая ситуация. Когда Пэтти Олвэлл, врач из Остина, Техас, начала курить, она часто закуривала во время верховой прогулки со своим другом. В конце концов она перестала курить и не курила много лет. Она также перестала ездить верхом. Спустя десятилетия она снова села на лошадь и вскоре заметила, что впервые за много лет ей очень хочется курить. Стимулы все еще были актуальны, они просто не проявлялись в течение долгого времени.Если привычка укоренилась в мозгу, призыв к действию появляется каждый раз, когда возникают соответствующие стимулы во внешней среде. Это одна из причин, по которой техники по изменению поведения могут вызвать негативные последствия. Если вы будете смущать людей с избыточным весом, постоянно демонстрируя им презентации по снижению веса, то они могут ощутить стресс, и в результате большая часть из них вернется к своей излюбленной стратегии преодоления стресса – перееданию. Когда вы показываете курильщикам легкие с затемнениями, это приводит к повышению уровня тревожности, в результате чего многие люди хватаются за сигарету. Таким образом, если вы невнимательно относитесь к стимулам, то можете спровоцировать именно то поведение, которого хотите избежать.Можно сказать, что дурные привычки являются аутокаталитическими: процесс подпитывает сам себя. Они усиливают чувства, которые человек пытается подавить. Например, вы чувствуете себя плохо, и поэтому начинаете есть фастфуд. От того, что вы его едите, вы начинаете чувствовать себя плохо. Просмотр телевизора вызывает сонливость, поэтому вы смотрите его еще больше, так как вам не хватает энергии на что-то другое. Беспокойство о своем здоровье заставляет вас испытывать тревогу, которая в свою очередь вызывает желание покурить, чтобы успокоиться, но это способствует ухудшению здоровья, из-за чего ваше беспокойство в ближайшее время только усилится. Это своего рода нисходящая спираль, потерявший управление «поезд дурных привычек».Ученые называют этот феномен «желание, вызванное стимулом»: внешний триггер вызывает навязчивое стремление повторить дурную привычку. Как только вы замечаете что-то, вы начинаете хотеть этого. Это процесс происходит постоянно – часто мы даже не замечаем его. Ученые установили, что если всего на тридцать три миллисекунды показать изображение кокаина наркозависимым, это стимулирует в мозгу стремление к подкреплению и вызывает страстное желание принять наркотик. Это очень непродолжительное время, за которое мозг не успевает сознательно зарегистрировать увиденное – наркозависимые даже не смогут рассказать вам, что они видели,– и тем не менее все они одинаково захотят получить наркотик.Именно в этом заключается ключевой момент: вы можете избавиться от привычки, но не способны забыть ее. Если мыслительные паттерны, характерные для привычки, были зафиксированы в мозгу, их практически невозможно удалить полностью – даже если они не используются в течение продолжительного времени. А это значит, что простое противостояние искушению будет неэффективной стратегией. Очень сложно сохранить созерцательное и философское отношение к жизни, полной сложностей и противоречий. Это требует слишком много энергии. Поэтому в краткосрочной перспективе мы можем выбрать стратегию противостояния искушению. Однако в долгосрочной перспективе мы неизбежно становимся продуктом той среды, в которой живем. Откровенно говоря, мне ни разу не приходилось увидеть человека, последовательно приверженного хорошим привычкам в негативном окружении.Более надежным подходом будет искоренение плохих привычек в их исходной точке. Один из наиболее практичных способов устранить плохую привычку – это снизить воздействие на себя стимула, который провоцирует ее.•Если вы никак не можете закончить работу, оставьте телефон в другой комнате на несколько часов. Если вы постоянно ощущаете, что вам чего-то не хватает, прекратите просматривать профили других людей в социальных сетях – это вызывает ревность и зависть.•Если вы тратите слишком много времени на просмотр телевизора, уберите телевизор из спальни.•Если вы тратите слишком много денег на гаджеты, перестаньте читать обзоры последних технических новинок.•Если вы слишком много играете в видеоигры, после каждого использования отключайте приставку и убирайте ее в шкаф.Эта практика – не что иное, как обратная трактовка первого закона изменения поведения. Вместо того чтобы делать что-то очевидным, вы можете сделать это неочевидным. Я часто удивляюсь тому, насколько эффективными могут быть такие незначительные изменения. Уберите один-единственный стимул, и вся привычка уйдет вместе с ним.Самоконтроль – краткосрочная, а не долгосрочная стратегия. Вы можете противостоять искушению один или два раза, но не сможете каждый раз собирать волю в кулак, чтобы побеждать желания. Вместо этого лучше потратьте энергию на организацию своего окружения. В этом и заключается секрет самоконтроля. Сделайте стимулы хороших привычек очевидными, а стимулы плохих привычек – незаметными. РЕЗЮМЕ•Обратная трактовка первого закона изменения поведения звучит так: «Сделайте это неочевидным».•Когда привычка сформирована, ее практически невозможно забыть.•Люди с высокой степенью самоконтроля, как правило, тратят меньше времени, чтобы справляться со сложными ситуациями. Проще избежать искушения, чем противостоять ему.•Одним из наиболее практичных способов избавиться от плохой привычки является сокращение проявлений стимула, который вызывает ее.•Самоконтроль – это краткосрочная, а не долгосрочная стратегия.", + "author": "Джеймс Клир" +} diff --git a/1_анализ_главы/вход_главы.spec.json b/1_анализ_главы/вход_главы.spec.json new file mode 100644 index 0000000..70e1ccd --- /dev/null +++ b/1_анализ_главы/вход_главы.spec.json @@ -0,0 +1,37 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Вход шага 1 — анализ главы", + "description": "Единый входной JSON для этапа 1 (анализ по блокам). Метаданные используются в подстановках промптов и передаются по пайплайну до шага 7 (Qdrant payload).", + "type": "object", + "required": ["book_id", "chapter_id", "chapter_number", "chapter_title", "book_title", "chapter_text"], + "properties": { + "book_id": { + "type": "string", + "description": "UUID книги" + }, + "chapter_id": { + "type": "string", + "description": "UUID главы (используется как id точки в Qdrant на шаге 7)" + }, + "chapter_number": { + "type": "integer", + "description": "Номер главы в книге" + }, + "chapter_title": { + "type": "string", + "description": "Название главы (подстановка {chapter_title} в промптах)" + }, + "book_title": { + "type": "string", + "description": "Название книги (подстановка {book_title} в промптах)" + }, + "chapter_text": { + "type": "string", + "description": "Текст главы (подстановка {chapter_text} в промптах)" + }, + "author": { + "type": "string", + "description": "Автор книги (опционально; для payload на шаге 7)" + } + } +} diff --git a/1_анализ_главы/выход_aplic.json b/1_анализ_главы/выход_aplic.json new file mode 100644 index 0000000..436c51d --- /dev/null +++ b/1_анализ_главы/выход_aplic.json @@ -0,0 +1,18 @@ +{ + "application": { + "techniques": [ + { + "name": "Снижение доступности стимула", + "goal": "Уменьшение вероятности повторения нежелательной привычки за счёт удаления её триггеров", + "context_example": "Вечер после работы, когда тянет залипнуть в телефон и проверять соцсети", + "steps": [ + "Определите конкретный стимул (например, наличие телефона на столе)", + "Уберите объект из зоны видимости или досягаемости (например, оставьте телефон в другой комнате)", + "Запишите дату и время изменения (для отслеживания эффективности)" + ], + "client_phrase": "Уберите источник искушения из вашей среды — действие станет менее вероятным", + "success_criteria": "Частота использования телефона в моменты, когда это не нужно, снижается с 5 раз/день до 1–2 раз/день за 2 недели" + } + ] + } + } \ No newline at end of file diff --git a/1_анализ_главы/выход_frame.json b/1_анализ_главы/выход_frame.json new file mode 100644 index 0000000..d7db820 --- /dev/null +++ b/1_анализ_главы/выход_frame.json @@ -0,0 +1,99 @@ +{ + "framework": { + "terms": { + "стимул": "что в окружающей среде заставляет человека действовать", + "привычка": "повторяющееся действие, которое становится автоматическим", + "подкрепление": "воздействие, усиливающее вероятность повторения действия", + "среда": "окружение, влияющее на поведение через стимулы и ограничения", + "желание, вызванное стимулом": "непроизвольная тяга к действию, спровоцированному внешним триггером", + "аутокаталитический процесс": "процесс, усиливающий себя сам" + }, + "principles": [ + { + "title": "Среда формирует поведение", + "description": "Человек не управляет привычками напрямую, а воздействует на окружение, чтобы оно вело его к нужным действиям", + "example": "Убрать телефон с рабочего стола, чтобы не отвлекаться на соцсети", + "chains": [ + { + "cause": "Человек находится в среде с доступными стимулами для нежелательной привычки", + "mechanism": "Стимул активирует уже сформированную привычку, которая запускает автоматическое действие", + "result": "Человек повторяет вредную привычку, не осознавая этого" + }, + { + "cause": "Изменяется среда, удаляются стимулы, провоцирующие нежелательную привычку", + "mechanism": "Отсутствие триггеров снижает вероятность срабатывания привычки", + "result": "Человек реже проявляет нежелательное поведение" + } + ] + }, + { + "title": "Привычки не исчезают, они только временно подавлены", + "description": "Даже если человек перестаёт делать что-то, привычка остаётся в мозге и может вернуться при подходящих условиях", + "example": "Человек перестаёт курить, но снова начинает после посещения места, где раньше курил", + "chains": [ + { + "cause": "Человек прекращает проявлять вредную привычку", + "mechanism": "Мозг сохраняет нейронные связи, связанные с этой привычкой", + "result": "Привычка может вернуться, если появятся подходящие стимулы" + }, + { + "cause": "Окружение меняется, и в нем появляются триггеры, связанные с прошлой привычкой", + "mechanism": "Стимулы запускают автоматические паттерны поведения", + "result": "Человек снова начинает делать то, что уже перестал" + } + ] + }, + { + "title": "Самоконтроль — это краткосрочный, а не долгосрочный инструмент", + "description": "Противостояние искушению неэффективно на длительном сроке, нужно менять контекст", + "example": "Человек отказывается от сладкого, но возвращается к нему после стрессового дня", + "chains": [ + { + "cause": "Человек пытается контролировать себя в момент искушения", + "mechanism": "Это требует энергии и усилий, которые невозможно поддерживать всегда", + "result": "Человек устаёт от борьбы и возвращается к нежелательной привычке" + }, + { + "cause": "Человек изменяет окружение, чтобы искушения стали менее доступными", + "mechanism": "Стимулы для плохого поведения становятся незаметными или невозможными", + "result": "Человек реже сталкивается с искушением" + } + ] + }, + { + "title": "Дисциплина — это настройка среды, а не внутреннее усилие", + "description": "Сильные люди не просто дисциплинированы, а живут в среде, которая поддерживает их цели", + "example": "Человек встаёт раньше, потому что спальня тёмная и не имеет гаджетов", + "chains": [ + { + "cause": "Человек пытается быть дисциплинированным только силой воли", + "mechanism": "Это требует большого количества энергии и часто неудачно", + "result": "Человек теряет мотивацию и возвращается к нежелательному поведению" + }, + { + "cause": "Человек настраивает окружение так, чтобы хорошее поведение было лёгким", + "mechanism": "Стимулы для правильных действий становятся более доступными", + "result": "Человек чаще выбирает здоровые привычки" + } + ] + }, + { + "title": "Негативные эмоции усиливают негативное поведение", + "description": "Стресс, тревога и другие негативные чувства провоцируют возвращение к вредным привычкам", + "example": "Человек садится на диван и ест шоколад, когда ему плохо", + "chains": [ + { + "cause": "Человек испытывает стресс или негативные эмоции", + "mechanism": "Это активирует привычку, которая помогает снизить дискомфорт", + "result": "Человек снова начинает делать то, что раньше снимало напряжение" + }, + { + "cause": "Человек пытается избавиться от вредной привычки, но не меняет среду", + "mechanism": "Стресс и негативные эмоции остаются, усиливая желание к действию", + "result": "Человек возвращается к нежелательной привычке" + } + ] + } + ] + } + } \ No newline at end of file diff --git a/1_анализ_главы/выход_insig.json b/1_анализ_главы/выход_insig.json new file mode 100644 index 0000000..823bafe --- /dev/null +++ b/1_анализ_главы/выход_insig.json @@ -0,0 +1,29 @@ +{ + "insights": [ + { + "title": "Среда влияет на привычки больше, чем сила воли", + "description": "Чтобы изменить привычку, нужно изменить окружение, а не надеяться только на самоконтроль", + "example": "Убрать телефон с рабочего стола, чтобы не отвлекаться на соцсети" + }, + { + "title": "Привычки не исчезают, только временно подавляются", + "description": "Даже если человек перестаёт курить или есть сладкое, эти привычки остаются в мозге и могут вернуться при подходящих условиях", + "example": "После посещения бара человек снова начинает пить, не осознавая этого" + }, + { + "title": "Негативные эмоции усиливают вредное поведение", + "description": "Стресс, тревога и другие негативные чувства могут спровоцировать возвращение к старым привычкам", + "example": "После ссоры человек снова начинает есть вредную пищу, чтобы успокоиться" + }, + { + "title": "Сокращение стимулов уменьшает повторение нежелательного поведения", + "description": "Удаление триггеров, связанных с вредной привычкой, снижает вероятность её возобновления", + "example": "Убрать сигареты из дома, чтобы уменьшить вероятность их употребления" + }, + { + "title": "Самоконтроль — это временная стратегия, а не долгосрочное решение", + "description": "Постоянно бороться с искушением утомительно и непрочное; нужно настраивать среду так, чтобы искушений не было совсем", + "example": "Поставить телефон в другую комнату, чтобы не проверять соцсети во время работы" + } + ] + } \ No newline at end of file diff --git a/1_анализ_главы/выход_limit.json b/1_анализ_главы/выход_limit.json new file mode 100644 index 0000000..31c42b4 --- /dev/null +++ b/1_анализ_главы/выход_limit.json @@ -0,0 +1,19 @@ +{ + "limitations": [ + { + "description": "Идеи не работают, если триггер (то, что в окружении запускает действие) не устранён или остаётся доступным, так как привычка может вернуться при появлении стимула", + "when_relevant": "Когда человек не полностью убирает триггер из своей среды или сталкивается с ним в новой обстановке", + "example": "Человек удалил сигареты из дома, но снова начинает курить на работе среди коллег-курильщиков" + }, + { + "description": "Техники могут не сработать, если негативные эмоции (стресс, тревога) остаются необратленными и усиливают нежелательное поведение", + "when_relevant": "Когда человек продолжает испытывать сильный стресс или эмоциональные трудности, не решая их на уровне среды", + "example": "Человек убрал телефон из комнаты, но всё равно переедает перед сном из-за хронической тревоги" + }, + { + "description": "Изменения среды могут быть недостаточны, если привычка закреплена на уровне автоматических нейронных паттернов и не сопровождается новыми, здоровыми привычками", + "when_relevant": "Когда человек устраняет триггер, но не вводит альтернативное поведение для подкрепления", + "example": "Человек убрал телевизор из спальни, но не нашёл замену в виде чтения или медитации и проводит время впустую" + } + ] +} \ No newline at end of file diff --git a/2_валидация_анализа_по_блокам/README.md b/2_валидация_анализа_по_блокам/README.md new file mode 100644 index 0000000..1f2a89a --- /dev/null +++ b/2_валидация_анализа_по_блокам/README.md @@ -0,0 +1,24 @@ +# Валидация анализа по блокам + +Отдельный промпт на каждый блок анализа главы. Цель — повысить качество проверки за счёт узкого фокуса. + +## Блоки и промпты + +| Блок | Файл промпта | Что проверяем | +|-------------|------------------------|----------------------------------------| +| framework | validate_framework.txt | Принципы, цепочки cause–mechanism–result | +| insights | validate_insights.txt | Инсайты (title, description) | +| application | validate_application.txt | Техники (name, goal, steps) | +| limitations | validate_limitations.txt | Ограничения, оговорки | + +## Подстановки в промптах + +- `{book_title}` — название книги +- `{chapter_title}` — название главы +- `{chapter_text}` — текст главы +- `{framework_json}` — JSON блока `framework` +- `{insights_json}` — JSON блока `insights` +- `{application_json}` — JSON блока `application` +- `{limitations_json}` — JSON блока `limitations` + +Промпты рассчитаны на тестирование по одному; доработка — по результатам прогонов. diff --git a/2_валидация_анализа_по_блокам/validate_application.txt b/2_валидация_анализа_по_блокам/validate_application.txt new file mode 100644 index 0000000..8c77925 --- /dev/null +++ b/2_валидация_анализа_по_блокам/validate_application.txt @@ -0,0 +1,43 @@ +Ты валидатор блока application (техники). Проверь ТОЛЬКО этот блок. + +Данные: +- Книга: "{book_title}" +- Глава: "{chapter_title}" +- Текст главы: {chapter_text} +- Блок application (JSON): {application_json} + +--- + +## ЗАДАЧА + +Проверь соответствие блока application тексту главы: +1. Каждая техника (name, goal, steps) должна иметь опору в тексте (описание метода, примеры, рекомендации). +2. Утверждения или шаги без опоры в тексте — галлюцинации. +3. Описанные в тексте техники/методы, которых нет в блоке — пропуски. + +Проверяй идеи и шаги, а не формулировки. steps особенно важны — они должны быть из текста, а не придуманы. + +--- + +## ФОРМАТ ОТВЕТА + +СТРОГО JSON без комментариев: + +{ + "verdict": "ok" | "needs_review" | "bad", + "score": 0.0, + "hallucinations": [ + { + "location": "application/techniques[0]/steps", + "summary": "В анализе шаг '[цитата]', в тексте такого нет" + } + ], + "missing_key_points": [ + { + "summary": "В тексте описана техника X, в application её нет", + "evidence": "краткая отсылка к тексту" + } + ] +} + +VERDICT: ok — проблем нет; needs_review — 1–2 замечания; bad — галлюцинации в steps или много пропусков. diff --git a/2_валидация_анализа_по_блокам/validate_application_filled.txt b/2_валидация_анализа_по_блокам/validate_application_filled.txt new file mode 100644 index 0000000..ee7538f --- /dev/null +++ b/2_валидация_анализа_по_блокам/validate_application_filled.txt @@ -0,0 +1,62 @@ +Ты валидатор блока application (техники). Проверь ТОЛЬКО этот блок. + +Данные: +- Книга: "{book_title}" +- Глава: "{chapter_title}" +- Текст главы: В 1971 году, когда шел шестнадцатый год войны во Вьетнаме, два американских конгрессмена, Роберт Стил из Коннектикута и Морган Мерфи из Иллинойса, сделали открытие, которое потрясло американское общество. Во время посещения воинских частей они выяснили, что более 15% американских солдат во Вьетнаме имели зависимость от героина. Более поздние исследования показали, что 35% американского контингента во Вьетнаме когда-либо пробовало героин и почти 20% страдало наркотической зависимостью – то есть проблема оказалась еще серьезнее, чем им показалось вначале.Это открытие вызвало бурную активность в Вашингтоне, включая создание по распоряжению президента Ричарда Никсона Специального комитета по предупреждению злоупотреблений наркотиками, целью деятельности которого была профилактика наркомании, а также реабилитация и отслеживание судеб наркозависимых солдат после возвращения на родину.Ли Робинс был одним из исследователей комитета. В ходе исследования, результаты которого перевернули все имевшиеся представления о наркологии, он обнаружил, что только 5% наркозависимых солдат снова начинали принимать героин в течение первого года после возвращения из реабилитационного центра и всего 12% делали это в течение трех лет. Иными словами, девять солдат из десяти избавлялись от наркотической зависимости после того, как покидали Вьетнам.Это открытие полностью противоречило всем представлениям наркологов того времени, согласно которым героиновая зависимость считалась постоянной и необратимом болезнью. Однако в противоположность этим представлениям Робинс обнаружил, что эта зависимость может спонтанно исчезнуть в случае полной смены окружения. Во Вьетнаме солдаты проводили все свое время в окружении стимулов, провоцировавших употребление героина: его было просто достать, а сами они находились под воздействием постоянного стресса войны; они строили дружеские отношения с сослуживцами, которые уже принимали героин, и находились в тысяче миль от дома. Но как только солдат возвращался в США, он оказывался в среде, лишенной этих стимулов. Как только менялся контекст, менялась и привычка.Сравните эту ситуацию с ситуацией типичного наркомана. Он становится наркозависимым дома или в компании друзей, затем попадает в клинику, где проходит реабилитацию и «очищается»– при этом находясь в среде, лишенной стимулов, которые сформировали его привычку, а затем возвращается в прежнее окружение со всеми стимулами, которые уже спровоцировали наркозависимость в первый раз. Поэтому неудивительно, что обычно наблюдается огромное количество примеров, прямо противоположных тем, что мы только что видели в рамках Вьетнамской кампании. Как правило, 90% героиновых наркоманов снова становятся зависимыми после возвращения с реабилитации.Вьетнамские исследования противоречат многим нашим культурным убеждениям относительно дурных привычек, поскольку ставят под сомнение шаблонную ассоциацию нездорового поведения с моральной слабостью. Если у вас избыточный вес, вы курите или страдаете наркозависимостью, вам всю жизнь говорят, что причиной этого является недостаток самоконтроля – а иногда даже говорят, что вы плохой человек. Идея о том, что немного дисциплины способно решить все проблемы, глубоко укоренилась в нашей культуре.Однако недавние исследования свидетельствуют о прямо противоположных фактах. Когда ученые анализируют поведение людей, которые, казалось бы, обладают выдающимся самоконтролем, выясняется, что эти люди ничем не отличаются от тех, кто постоянно борется с вредными привычками. «Дисциплинированные» люди лучше справляются со структурированием своей жизни способами, которые не требуют героической силы воли и самоконтроля. Иначе говоря, они тратят меньше времени, чтобы справиться с теми или иными ситуациями.Люди с развитым самоконтролем, как правило, меньше всех нуждаются в его применении. Проще практиковать выдержку и самоконтроль, когда не приходится использовать их слишком часто. Таким образом, действительно, упорство, твердость характера и сила воли очень важны для достижения успеха, но способ развить эти качества заключается не в том, чтобы стать более дисциплинированным человеком, а в том, чтобы создать более дисциплинированную среду вокруг себя.Эта парадоксальная идея становится еще более логичной, когда вы начинаете понимать, что происходит в процессе формирования привычки в мозгу. Привычка, которая уже закодирована в нем, «готова к использованию» влюбой момент, как только наступит соответствующая ситуация. Когда Пэтти Олвэлл, врач из Остина, Техас, начала курить, она часто закуривала во время верховой прогулки со своим другом. В конце концов она перестала курить и не курила много лет. Она также перестала ездить верхом. Спустя десятилетия она снова села на лошадь и вскоре заметила, что впервые за много лет ей очень хочется курить. Стимулы все еще были актуальны, они просто не проявлялись в течение долгого времени.Если привычка укоренилась в мозгу, призыв к действию появляется каждый раз, когда возникают соответствующие стимулы во внешней среде. Это одна из причин, по которой техники по изменению поведения могут вызвать негативные последствия. Если вы будете смущать людей с избыточным весом, постоянно демонстрируя им презентации по снижению веса, то они могут ощутить стресс, и в результате большая часть из них вернется к своей излюбленной стратегии преодоления стресса – перееданию. Когда вы показываете курильщикам легкие с затемнениями, это приводит к повышению уровня тревожности, в результате чего многие люди хватаются за сигарету. Таким образом, если вы невнимательно относитесь к стимулам, то можете спровоцировать именно то поведение, которого хотите избежать.Можно сказать, что дурные привычки являются аутокаталитическими: процесс подпитывает сам себя. Они усиливают чувства, которые человек пытается подавить. Например, вы чувствуете себя плохо, и поэтому начинаете есть фастфуд. От того, что вы его едите, вы начинаете чувствовать себя плохо. Просмотр телевизора вызывает сонливость, поэтому вы смотрите его еще больше, так как вам не хватает энергии на что-то другое. Беспокойство о своем здоровье заставляет вас испытывать тревогу, которая в свою очередь вызывает желание покурить, чтобы успокоиться, но это способствует ухудшению здоровья, из-за чего ваше беспокойство в ближайшее время только усилится. Это своего рода нисходящая спираль, потерявший управление «поезд дурных привычек».Ученые называют этот феномен «желание, вызванное стимулом»: внешний триггер вызывает навязчивое стремление повторить дурную привычку. Как только вы замечаете что-то, вы начинаете хотеть этого. Это процесс происходит постоянно – часто мы даже не замечаем его. Ученые установили, что если всего на тридцать три миллисекунды показать изображение кокаина наркозависимым, это стимулирует в мозгу стремление к подкреплению и вызывает страстное желание принять наркотик. Это очень непродолжительное время, за которое мозг не успевает сознательно зарегистрировать увиденное – наркозависимые даже не смогут рассказать вам, что они видели,– и тем не менее все они одинаково захотят получить наркотик.Именно в этом заключается ключевой момент: вы можете избавиться от привычки, но не способны забыть ее. Если мыслительные паттерны, характерные для привычки, были зафиксированы в мозгу, их практически невозможно удалить полностью – даже если они не используются в течение продолжительного времени. А это значит, что простое противостояние искушению будет неэффективной стратегией. Очень сложно сохранить созерцательное и философское отношение к жизни, полной сложностей и противоречий. Это требует слишком много энергии. Поэтому в краткосрочной перспективе мы можем выбрать стратегию противостояния искушению. Однако в долгосрочной перспективе мы неизбежно становимся продуктом той среды, в которой живем. Откровенно говоря, мне ни разу не приходилось увидеть человека, последовательно приверженного хорошим привычкам в негативном окружении.Более надежным подходом будет искоренение плохих привычек в их исходной точке. Один из наиболее практичных способов устранить плохую привычку – это снизить воздействие на себя стимула, который провоцирует ее.•Если вы никак не можете закончить работу, оставьте телефон в другой комнате на несколько часов. Если вы постоянно ощущаете, что вам чего-то не хватает, прекратите просматривать профили других людей в социальных сетях – это вызывает ревность и зависть.•Если вы тратите слишком много времени на просмотр телевизора, уберите телевизор из спальни.•Если вы тратите слишком много денег на гаджеты, перестаньте читать обзоры последних технических новинок.•Если вы слишком много играете в видеоигры, после каждого использования отключайте приставку и убирайте ее в шкаф.Эта практика – не что иное, как обратная трактовка первого закона изменения поведения. Вместо того чтобы делать что-то очевидным, вы можете сделать это неочевидным. Я часто удивляюсь тому, насколько эффективными могут быть такие незначительные изменения. Уберите один-единственный стимул, и вся привычка уйдет вместе с ним.Самоконтроль – краткосрочная, а не долгосрочная стратегия. Вы можете противостоять искушению один или два раза, но не сможете каждый раз собирать волю в кулак, чтобы побеждать желания. Вместо этого лучше потратьте энергию на организацию своего окружения. В этом и заключается секрет самоконтроля. Сделайте стимулы хороших привычек очевидными, а стимулы плохих привычек – незаметными. РЕЗЮМЕ•Обратная трактовка первого закона изменения поведения звучит так: «Сделайте это неочевидным».•Когда привычка сформирована, ее практически невозможно забыть.•Люди с высокой степенью самоконтроля, как правило, тратят меньше времени, чтобы справляться со сложными ситуациями. Проще избежать искушения, чем противостоять ему.•Одним из наиболее практичных способов избавиться от плохой привычки является сокращение проявлений стимула, который вызывает ее.•Самоконтроль – это краткосрочная, а не долгосрочная стратегия. + +- Блок application (JSON): +{ + "application": { + "techniques": [ + { + "name": "Снижение доступности стимула", + "goal": "Уменьшение вероятности повторения нежелательной привычки за счёт удаления её триггеров", + "context_example": "Вечер после работы, когда тянет залипнуть в телефон и проверять соцсети", + "steps": [ + "Определите конкретный стимул (например, наличие телефона на столе)", + "Уберите объект из зоны видимости или досягаемости (например, оставьте телефон в другой комнате)", + "Запишите дату и время изменения (для отслеживания эффективности)" + ], + "client_phrase": "Уберите источник искушения из вашей среды — действие станет менее вероятным", + "success_criteria": "Частота использования телефона в моменты, когда это не нужно, снижается с 5 раз/день до 1–2 раз/день за 2 недели" + } + ] + } + } + +--- + +## ЗАДАЧА + +Проверь соответствие блока application тексту главы: +1. Каждая техника (name, goal, steps) должна иметь опору в тексте (описание метода, примеры, рекомендации). +2. Утверждения или шаги без опоры в тексте — галлюцинации. +3. Описанные в тексте техники/методы, которых нет в блоке — пропуски. + +Проверяй идеи и шаги, а не формулировки. steps особенно важны — они должны быть из текста, а не придуманы. + +--- + +## ФОРМАТ ОТВЕТА + +СТРОГО JSON без комментариев: + +{ + "verdict": "ok" | "needs_review" | "bad", + "score": 0.0, + "hallucinations": [ + { + "location": "application/techniques[0]/steps", + "summary": "В анализе шаг '[цитата]', в тексте такого нет" + } + ], + "missing_key_points": [ + { + "summary": "В тексте описана техника X, в application её нет", + "evidence": "краткая отсылка к тексту" + } + ] +} + +VERDICT: ok — проблем нет; needs_review — 1–2 замечания; bad — галлюцинации в steps или много пропусков. diff --git a/2_валидация_анализа_по_блокам/validate_framework.txt b/2_валидация_анализа_по_блокам/validate_framework.txt new file mode 100644 index 0000000..bfe124a --- /dev/null +++ b/2_валидация_анализа_по_блокам/validate_framework.txt @@ -0,0 +1,43 @@ +Ты валидатор блока framework (принципы и цепочки причина–механизм–результат). Проверь ТОЛЬКО этот блок. + +Данные: +- Книга: "{book_title}" +- Глава: "{chapter_title}" +- Текст главы: {chapter_text} +- Блок framework (JSON): {framework_json} + +--- + +## ЗАДАЧА + +Проверь соответствие блока framework тексту главы: +1. Каждое утверждение в principles/description и chains (cause, mechanism, result) должно иметь опору в тексте. +2. Утверждения без опоры в тексте — галлюцинации. +3. Ключевые принципы/цепочки из текста, которых нет в блоке — пропуски. + +Проверяй идеи, а не формулировки. Одна и та же мысль другими словами — не ошибка. + +--- + +## ФОРМАТ ОТВЕТА + +СТРОГО JSON без комментариев: + +{ + "verdict": "ok" | "needs_review" | "bad", + "score": 0.0, + "hallucinations": [ + { + "location": "framework/principles[0]/chains[0]/mechanism", + "summary": "В анализе: '[цитата]', в тексте такого нет" + } + ], + "missing_key_points": [ + { + "summary": "В тексте описан принцип X, в framework его нет", + "evidence": "краткая отсылка к тексту" + } + ] +} + +VERDICT: ok — проблем нет; needs_review — есть 1–2 замечания; bad — много галлюцинаций или пропусков. diff --git a/2_валидация_анализа_по_блокам/validate_framework_filled.txt b/2_валидация_анализа_по_блокам/validate_framework_filled.txt new file mode 100644 index 0000000..f868881 --- /dev/null +++ b/2_валидация_анализа_по_блокам/validate_framework_filled.txt @@ -0,0 +1,143 @@ +Ты валидатор блока framework (принципы и цепочки причина–механизм–результат). Проверь ТОЛЬКО этот блок. + +Данные: +- Книга: "{book_title}" +- Глава: "{chapter_title}" +- Текст главы: В 1971 году, когда шел шестнадцатый год войны во Вьетнаме, два американских конгрессмена, Роберт Стил из Коннектикута и Морган Мерфи из Иллинойса, сделали открытие, которое потрясло американское общество. Во время посещения воинских частей они выяснили, что более 15% американских солдат во Вьетнаме имели зависимость от героина. Более поздние исследования показали, что 35% американского контингента во Вьетнаме когда-либо пробовало героин и почти 20% страдало наркотической зависимостью – то есть проблема оказалась еще серьезнее, чем им показалось вначале.Это открытие вызвало бурную активность в Вашингтоне, включая создание по распоряжению президента Ричарда Никсона Специального комитета по предупреждению злоупотреблений наркотиками, целью деятельности которого была профилактика наркомании, а также реабилитация и отслеживание судеб наркозависимых солдат после возвращения на родину.Ли Робинс был одним из исследователей комитета. В ходе исследования, результаты которого перевернули все имевшиеся представления о наркологии, он обнаружил, что только 5% наркозависимых солдат снова начинали принимать героин в течение первого года после возвращения из реабилитационного центра и всего 12% делали это в течение трех лет. Иными словами, девять солдат из десяти избавлялись от наркотической зависимости после того, как покидали Вьетнам.Это открытие полностью противоречило всем представлениям наркологов того времени, согласно которым героиновая зависимость считалась постоянной и необратимом болезнью. Однако в противоположность этим представлениям Робинс обнаружил, что эта зависимость может спонтанно исчезнуть в случае полной смены окружения. Во Вьетнаме солдаты проводили все свое время в окружении стимулов, провоцировавших употребление героина: его было просто достать, а сами они находились под воздействием постоянного стресса войны; они строили дружеские отношения с сослуживцами, которые уже принимали героин, и находились в тысяче миль от дома. Но как только солдат возвращался в США, он оказывался в среде, лишенной этих стимулов. Как только менялся контекст, менялась и привычка.Сравните эту ситуацию с ситуацией типичного наркомана. Он становится наркозависимым дома или в компании друзей, затем попадает в клинику, где проходит реабилитацию и «очищается»– при этом находясь в среде, лишенной стимулов, которые сформировали его привычку, а затем возвращается в прежнее окружение со всеми стимулами, которые уже спровоцировали наркозависимость в первый раз. Поэтому неудивительно, что обычно наблюдается огромное количество примеров, прямо противоположных тем, что мы только что видели в рамках Вьетнамской кампании. Как правило, 90% героиновых наркоманов снова становятся зависимыми после возвращения с реабилитации.Вьетнамские исследования противоречат многим нашим культурным убеждениям относительно дурных привычек, поскольку ставят под сомнение шаблонную ассоциацию нездорового поведения с моральной слабостью. Если у вас избыточный вес, вы курите или страдаете наркозависимостью, вам всю жизнь говорят, что причиной этого является недостаток самоконтроля – а иногда даже говорят, что вы плохой человек. Идея о том, что немного дисциплины способно решить все проблемы, глубоко укоренилась в нашей культуре.Однако недавние исследования свидетельствуют о прямо противоположных фактах. Когда ученые анализируют поведение людей, которые, казалось бы, обладают выдающимся самоконтролем, выясняется, что эти люди ничем не отличаются от тех, кто постоянно борется с вредными привычками. «Дисциплинированные» люди лучше справляются со структурированием своей жизни способами, которые не требуют героической силы воли и самоконтроля. Иначе говоря, они тратят меньше времени, чтобы справиться с теми или иными ситуациями.Люди с развитым самоконтролем, как правило, меньше всех нуждаются в его применении. Проще практиковать выдержку и самоконтроль, когда не приходится использовать их слишком часто. Таким образом, действительно, упорство, твердость характера и сила воли очень важны для достижения успеха, но способ развить эти качества заключается не в том, чтобы стать более дисциплинированным человеком, а в том, чтобы создать более дисциплинированную среду вокруг себя.Эта парадоксальная идея становится еще более логичной, когда вы начинаете понимать, что происходит в процессе формирования привычки в мозгу. Привычка, которая уже закодирована в нем, «готова к использованию» влюбой момент, как только наступит соответствующая ситуация. Когда Пэтти Олвэлл, врач из Остина, Техас, начала курить, она часто закуривала во время верховой прогулки со своим другом. В конце концов она перестала курить и не курила много лет. Она также перестала ездить верхом. Спустя десятилетия она снова села на лошадь и вскоре заметила, что впервые за много лет ей очень хочется курить. Стимулы все еще были актуальны, они просто не проявлялись в течение долгого времени.Если привычка укоренилась в мозгу, призыв к действию появляется каждый раз, когда возникают соответствующие стимулы во внешней среде. Это одна из причин, по которой техники по изменению поведения могут вызвать негативные последствия. Если вы будете смущать людей с избыточным весом, постоянно демонстрируя им презентации по снижению веса, то они могут ощутить стресс, и в результате большая часть из них вернется к своей излюбленной стратегии преодоления стресса – перееданию. Когда вы показываете курильщикам легкие с затемнениями, это приводит к повышению уровня тревожности, в результате чего многие люди хватаются за сигарету. Таким образом, если вы невнимательно относитесь к стимулам, то можете спровоцировать именно то поведение, которого хотите избежать.Можно сказать, что дурные привычки являются аутокаталитическими: процесс подпитывает сам себя. Они усиливают чувства, которые человек пытается подавить. Например, вы чувствуете себя плохо, и поэтому начинаете есть фастфуд. От того, что вы его едите, вы начинаете чувствовать себя плохо. Просмотр телевизора вызывает сонливость, поэтому вы смотрите его еще больше, так как вам не хватает энергии на что-то другое. Беспокойство о своем здоровье заставляет вас испытывать тревогу, которая в свою очередь вызывает желание покурить, чтобы успокоиться, но это способствует ухудшению здоровья, из-за чего ваше беспокойство в ближайшее время только усилится. Это своего рода нисходящая спираль, потерявший управление «поезд дурных привычек».Ученые называют этот феномен «желание, вызванное стимулом»: внешний триггер вызывает навязчивое стремление повторить дурную привычку. Как только вы замечаете что-то, вы начинаете хотеть этого. Это процесс происходит постоянно – часто мы даже не замечаем его. Ученые установили, что если всего на тридцать три миллисекунды показать изображение кокаина наркозависимым, это стимулирует в мозгу стремление к подкреплению и вызывает страстное желание принять наркотик. Это очень непродолжительное время, за которое мозг не успевает сознательно зарегистрировать увиденное – наркозависимые даже не смогут рассказать вам, что они видели,– и тем не менее все они одинаково захотят получить наркотик.Именно в этом заключается ключевой момент: вы можете избавиться от привычки, но не способны забыть ее. Если мыслительные паттерны, характерные для привычки, были зафиксированы в мозгу, их практически невозможно удалить полностью – даже если они не используются в течение продолжительного времени. А это значит, что простое противостояние искушению будет неэффективной стратегией. Очень сложно сохранить созерцательное и философское отношение к жизни, полной сложностей и противоречий. Это требует слишком много энергии. Поэтому в краткосрочной перспективе мы можем выбрать стратегию противостояния искушению. Однако в долгосрочной перспективе мы неизбежно становимся продуктом той среды, в которой живем. Откровенно говоря, мне ни разу не приходилось увидеть человека, последовательно приверженного хорошим привычкам в негативном окружении.Более надежным подходом будет искоренение плохих привычек в их исходной точке. Один из наиболее практичных способов устранить плохую привычку – это снизить воздействие на себя стимула, который провоцирует ее.•Если вы никак не можете закончить работу, оставьте телефон в другой комнате на несколько часов. Если вы постоянно ощущаете, что вам чего-то не хватает, прекратите просматривать профили других людей в социальных сетях – это вызывает ревность и зависть.•Если вы тратите слишком много времени на просмотр телевизора, уберите телевизор из спальни.•Если вы тратите слишком много денег на гаджеты, перестаньте читать обзоры последних технических новинок.•Если вы слишком много играете в видеоигры, после каждого использования отключайте приставку и убирайте ее в шкаф.Эта практика – не что иное, как обратная трактовка первого закона изменения поведения. Вместо того чтобы делать что-то очевидным, вы можете сделать это неочевидным. Я часто удивляюсь тому, насколько эффективными могут быть такие незначительные изменения. Уберите один-единственный стимул, и вся привычка уйдет вместе с ним.Самоконтроль – краткосрочная, а не долгосрочная стратегия. Вы можете противостоять искушению один или два раза, но не сможете каждый раз собирать волю в кулак, чтобы побеждать желания. Вместо этого лучше потратьте энергию на организацию своего окружения. В этом и заключается секрет самоконтроля. Сделайте стимулы хороших привычек очевидными, а стимулы плохих привычек – незаметными. РЕЗЮМЕ•Обратная трактовка первого закона изменения поведения звучит так: «Сделайте это неочевидным».•Когда привычка сформирована, ее практически невозможно забыть.•Люди с высокой степенью самоконтроля, как правило, тратят меньше времени, чтобы справляться со сложными ситуациями. Проще избежать искушения, чем противостоять ему.•Одним из наиболее практичных способов избавиться от плохой привычки является сокращение проявлений стимула, который вызывает ее.•Самоконтроль – это краткосрочная, а не долгосрочная стратегия. + +- Блок framework (JSON): +{ + "framework": { + "terms": { + "стимул": "что в окружающей среде заставляет человека действовать", + "привычка": "повторяющееся действие, которое становится автоматическим", + "подкрепление": "воздействие, усиливающее вероятность повторения действия", + "среда": "окружение, влияющее на поведение через стимулы и ограничения", + "желание, вызванное стимулом": "непроизвольная тяга к действию, спровоцированному внешним триггером", + "аутокаталитический процесс": "процесс, усиливающий себя сам" + }, + "principles": [ + { + "title": "Среда формирует поведение", + "description": "Человек не управляет привычками напрямую, а воздействует на окружение, чтобы оно вело его к нужным действиям", + "example": "Убрать телефон с рабочего стола, чтобы не отвлекаться на соцсети", + "chains": [ + { + "cause": "Человек находится в среде с доступными стимулами для нежелательной привычки", + "mechanism": "Стимул активирует уже сформированную привычку, которая запускает автоматическое действие", + "result": "Человек повторяет вредную привычку, не осознавая этого" + }, + { + "cause": "Изменяется среда, удаляются стимулы, провоцирующие нежелательную привычку", + "mechanism": "Отсутствие триггеров снижает вероятность срабатывания привычки", + "result": "Человек реже проявляет нежелательное поведение" + } + ] + }, + { + "title": "Привычки не исчезают, они только временно подавлены", + "description": "Даже если человек перестаёт делать что-то, привычка остаётся в мозге и может вернуться при подходящих условиях", + "example": "Человек перестаёт курить, но снова начинает после посещения места, где раньше курил", + "chains": [ + { + "cause": "Человек прекращает проявлять вредную привычку", + "mechanism": "Мозг сохраняет нейронные связи, связанные с этой привычкой", + "result": "Привычка может вернуться, если появятся подходящие стимулы" + }, + { + "cause": "Окружение меняется, и в нем появляются триггеры, связанные с прошлой привычкой", + "mechanism": "Стимулы запускают автоматические паттерны поведения", + "result": "Человек снова начинает делать то, что уже перестал" + } + ] + }, + { + "title": "Самоконтроль — это краткосрочный, а не долгосрочный инструмент", + "description": "Противостояние искушению неэффективно на длительном сроке, нужно менять контекст", + "example": "Человек отказывается от сладкого, но возвращается к нему после стрессового дня", + "chains": [ + { + "cause": "Человек пытается контролировать себя в момент искушения", + "mechanism": "Это требует энергии и усилий, которые невозможно поддерживать всегда", + "result": "Человек устаёт от борьбы и возвращается к нежелательной привычке" + }, + { + "cause": "Человек изменяет окружение, чтобы искушения стали менее доступными", + "mechanism": "Стимулы для плохого поведения становятся незаметными или невозможными", + "result": "Человек реже сталкивается с искушением" + } + ] + }, + { + "title": "Дисциплина — это настройка среды, а не внутреннее усилие", + "description": "Сильные люди не просто дисциплинированы, а живут в среде, которая поддерживает их цели", + "example": "Человек встаёт раньше, потому что спальня тёмная и не имеет гаджетов", + "chains": [ + { + "cause": "Человек пытается быть дисциплинированным только силой воли", + "mechanism": "Это требует большого количества энергии и часто неудачно", + "result": "Человек теряет мотивацию и возвращается к нежелательному поведению" + }, + { + "cause": "Человек настраивает окружение так, чтобы хорошее поведение было лёгким", + "mechanism": "Стимулы для правильных действий становятся более доступными", + "result": "Человек чаще выбирает здоровые привычки" + } + ] + }, + { + "title": "Негативные эмоции усиливают негативное поведение", + "description": "Стресс, тревога и другие негативные чувства провоцируют возвращение к вредным привычкам", + "example": "Человек садится на диван и ест шоколад, когда ему плохо", + "chains": [ + { + "cause": "Человек испытывает стресс или негативные эмоции", + "mechanism": "Это активирует привычку, которая помогает снизить дискомфорт", + "result": "Человек снова начинает делать то, что раньше снимало напряжение" + }, + { + "cause": "Человек пытается избавиться от вредной привычки, но не меняет среду", + "mechanism": "Стресс и негативные эмоции остаются, усиливая желание к действию", + "result": "Человек возвращается к нежелательной привычке" + } + ] + } + ] + } + } + +--- + +## ЗАДАЧА + +Проверь соответствие блока framework тексту главы: +1. Каждое утверждение в principles/description и chains (cause, mechanism, result) должно иметь опору в тексте. +2. Утверждения без опоры в тексте — галлюцинации. +3. Ключевые принципы/цепочки из текста, которых нет в блоке — пропуски. + +Проверяй идеи, а не формулировки. Одна и та же мысль другими словами — не ошибка. + +--- + +## ФОРМАТ ОТВЕТА + +СТРОГО JSON без комментариев: + +{ + "verdict": "ok" | "needs_review" | "bad", + "score": 0.0, + "hallucinations": [ + { + "location": "framework/principles[0]/chains[0]/mechanism", + "summary": "В анализе: '[цитата]', в тексте такого нет" + } + ], + "missing_key_points": [ + { + "summary": "В тексте описан принцип X, в framework его нет", + "evidence": "краткая отсылка к тексту" + } + ] +} + +VERDICT: ok — проблем нет; needs_review — есть 1–2 замечания; bad — много галлюцинаций или пропусков. diff --git a/2_валидация_анализа_по_блокам/validate_insights.txt b/2_валидация_анализа_по_блокам/validate_insights.txt new file mode 100644 index 0000000..ec54c27 --- /dev/null +++ b/2_валидация_анализа_по_блокам/validate_insights.txt @@ -0,0 +1,43 @@ +Ты валидатор блока insights (инсайты). Проверь ТОЛЬКО этот блок. + +Данные: +- Книга: "{book_title}" +- Глава: "{chapter_title}" +- Текст главы: {chapter_text} +- Блок insights (JSON): {insights_json} + +--- + +## ЗАДАЧА + +Проверь соответствие блока insights тексту главы: +1. Каждый инсайт (title, description) должен иметь опору в тексте. +2. Утверждения без опоры — галлюцинации. +3. Важные инсайты из текста, которых нет в блоке — пропуски. + +Проверяй идеи, а не формулировки. + +--- + +## ФОРМАТ ОТВЕТА + +СТРОГО JSON без комментариев: + +{ + "verdict": "ok" | "needs_review" | "bad", + "score": 0.0, + "hallucinations": [ + { + "location": "insights[0]/description", + "summary": "В анализе: '[цитата]', в тексте такого нет" + } + ], + "missing_key_points": [ + { + "summary": "В тексте явный инсайт X, в insights его нет", + "evidence": "краткая отсылка к тексту" + } + ] +} + +VERDICT: ok — проблем нет; needs_review — 1–2 замечания; bad — много галлюцинаций или пропусков. diff --git a/2_валидация_анализа_по_блокам/validate_insights_filled.txt b/2_валидация_анализа_по_блокам/validate_insights_filled.txt new file mode 100644 index 0000000..94800bc --- /dev/null +++ b/2_валидация_анализа_по_блокам/validate_insights_filled.txt @@ -0,0 +1,73 @@ +Ты валидатор блока insights (инсайты). Проверь ТОЛЬКО этот блок. + +Данные: +- Книга: "{book_title}" +- Глава: "{chapter_title}" +- Текст главы: В 1971 году, когда шел шестнадцатый год войны во Вьетнаме, два американских конгрессмена, Роберт Стил из Коннектикута и Морган Мерфи из Иллинойса, сделали открытие, которое потрясло американское общество. Во время посещения воинских частей они выяснили, что более 15% американских солдат во Вьетнаме имели зависимость от героина. Более поздние исследования показали, что 35% американского контингента во Вьетнаме когда-либо пробовало героин и почти 20% страдало наркотической зависимостью – то есть проблема оказалась еще серьезнее, чем им показалось вначале.Это открытие вызвало бурную активность в Вашингтоне, включая создание по распоряжению президента Ричарда Никсона Специального комитета по предупреждению злоупотреблений наркотиками, целью деятельности которого была профилактика наркомании, а также реабилитация и отслеживание судеб наркозависимых солдат после возвращения на родину.Ли Робинс был одним из исследователей комитета. В ходе исследования, результаты которого перевернули все имевшиеся представления о наркологии, он обнаружил, что только 5% наркозависимых солдат снова начинали принимать героин в течение первого года после возвращения из реабилитационного центра и всего 12% делали это в течение трех лет. Иными словами, девять солдат из десяти избавлялись от наркотической зависимости после того, как покидали Вьетнам.Это открытие полностью противоречило всем представлениям наркологов того времени, согласно которым героиновая зависимость считалась постоянной и необратимом болезнью. Однако в противоположность этим представлениям Робинс обнаружил, что эта зависимость может спонтанно исчезнуть в случае полной смены окружения. Во Вьетнаме солдаты проводили все свое время в окружении стимулов, провоцировавших употребление героина: его было просто достать, а сами они находились под воздействием постоянного стресса войны; они строили дружеские отношения с сослуживцами, которые уже принимали героин, и находились в тысяче миль от дома. Но как только солдат возвращался в США, он оказывался в среде, лишенной этих стимулов. Как только менялся контекст, менялась и привычка.Сравните эту ситуацию с ситуацией типичного наркомана. Он становится наркозависимым дома или в компании друзей, затем попадает в клинику, где проходит реабилитацию и «очищается»– при этом находясь в среде, лишенной стимулов, которые сформировали его привычку, а затем возвращается в прежнее окружение со всеми стимулами, которые уже спровоцировали наркозависимость в первый раз. Поэтому неудивительно, что обычно наблюдается огромное количество примеров, прямо противоположных тем, что мы только что видели в рамках Вьетнамской кампании. Как правило, 90% героиновых наркоманов снова становятся зависимыми после возвращения с реабилитации.Вьетнамские исследования противоречат многим нашим культурным убеждениям относительно дурных привычек, поскольку ставят под сомнение шаблонную ассоциацию нездорового поведения с моральной слабостью. Если у вас избыточный вес, вы курите или страдаете наркозависимостью, вам всю жизнь говорят, что причиной этого является недостаток самоконтроля – а иногда даже говорят, что вы плохой человек. Идея о том, что немного дисциплины способно решить все проблемы, глубоко укоренилась в нашей культуре.Однако недавние исследования свидетельствуют о прямо противоположных фактах. Когда ученые анализируют поведение людей, которые, казалось бы, обладают выдающимся самоконтролем, выясняется, что эти люди ничем не отличаются от тех, кто постоянно борется с вредными привычками. «Дисциплинированные» люди лучше справляются со структурированием своей жизни способами, которые не требуют героической силы воли и самоконтроля. Иначе говоря, они тратят меньше времени, чтобы справиться с теми или иными ситуациями.Люди с развитым самоконтролем, как правило, меньше всех нуждаются в его применении. Проще практиковать выдержку и самоконтроль, когда не приходится использовать их слишком часто. Таким образом, действительно, упорство, твердость характера и сила воли очень важны для достижения успеха, но способ развить эти качества заключается не в том, чтобы стать более дисциплинированным человеком, а в том, чтобы создать более дисциплинированную среду вокруг себя.Эта парадоксальная идея становится еще более логичной, когда вы начинаете понимать, что происходит в процессе формирования привычки в мозгу. Привычка, которая уже закодирована в нем, «готова к использованию» влюбой момент, как только наступит соответствующая ситуация. Когда Пэтти Олвэлл, врач из Остина, Техас, начала курить, она часто закуривала во время верховой прогулки со своим другом. В конце концов она перестала курить и не курила много лет. Она также перестала ездить верхом. Спустя десятилетия она снова села на лошадь и вскоре заметила, что впервые за много лет ей очень хочется курить. Стимулы все еще были актуальны, они просто не проявлялись в течение долгого времени.Если привычка укоренилась в мозгу, призыв к действию появляется каждый раз, когда возникают соответствующие стимулы во внешней среде. Это одна из причин, по которой техники по изменению поведения могут вызвать негативные последствия. Если вы будете смущать людей с избыточным весом, постоянно демонстрируя им презентации по снижению веса, то они могут ощутить стресс, и в результате большая часть из них вернется к своей излюбленной стратегии преодоления стресса – перееданию. Когда вы показываете курильщикам легкие с затемнениями, это приводит к повышению уровня тревожности, в результате чего многие люди хватаются за сигарету. Таким образом, если вы невнимательно относитесь к стимулам, то можете спровоцировать именно то поведение, которого хотите избежать.Можно сказать, что дурные привычки являются аутокаталитическими: процесс подпитывает сам себя. Они усиливают чувства, которые человек пытается подавить. Например, вы чувствуете себя плохо, и поэтому начинаете есть фастфуд. От того, что вы его едите, вы начинаете чувствовать себя плохо. Просмотр телевизора вызывает сонливость, поэтому вы смотрите его еще больше, так как вам не хватает энергии на что-то другое. Беспокойство о своем здоровье заставляет вас испытывать тревогу, которая в свою очередь вызывает желание покурить, чтобы успокоиться, но это способствует ухудшению здоровья, из-за чего ваше беспокойство в ближайшее время только усилится. Это своего рода нисходящая спираль, потерявший управление «поезд дурных привычек».Ученые называют этот феномен «желание, вызванное стимулом»: внешний триггер вызывает навязчивое стремление повторить дурную привычку. Как только вы замечаете что-то, вы начинаете хотеть этого. Это процесс происходит постоянно – часто мы даже не замечаем его. Ученые установили, что если всего на тридцать три миллисекунды показать изображение кокаина наркозависимым, это стимулирует в мозгу стремление к подкреплению и вызывает страстное желание принять наркотик. Это очень непродолжительное время, за которое мозг не успевает сознательно зарегистрировать увиденное – наркозависимые даже не смогут рассказать вам, что они видели,– и тем не менее все они одинаково захотят получить наркотик.Именно в этом заключается ключевой момент: вы можете избавиться от привычки, но не способны забыть ее. Если мыслительные паттерны, характерные для привычки, были зафиксированы в мозгу, их практически невозможно удалить полностью – даже если они не используются в течение продолжительного времени. А это значит, что простое противостояние искушению будет неэффективной стратегией. Очень сложно сохранить созерцательное и философское отношение к жизни, полной сложностей и противоречий. Это требует слишком много энергии. Поэтому в краткосрочной перспективе мы можем выбрать стратегию противостояния искушению. Однако в долгосрочной перспективе мы неизбежно становимся продуктом той среды, в которой живем. Откровенно говоря, мне ни разу не приходилось увидеть человека, последовательно приверженного хорошим привычкам в негативном окружении.Более надежным подходом будет искоренение плохих привычек в их исходной точке. Один из наиболее практичных способов устранить плохую привычку – это снизить воздействие на себя стимула, который провоцирует ее.•Если вы никак не можете закончить работу, оставьте телефон в другой комнате на несколько часов. Если вы постоянно ощущаете, что вам чего-то не хватает, прекратите просматривать профили других людей в социальных сетях – это вызывает ревность и зависть.•Если вы тратите слишком много времени на просмотр телевизора, уберите телевизор из спальни.•Если вы тратите слишком много денег на гаджеты, перестаньте читать обзоры последних технических новинок.•Если вы слишком много играете в видеоигры, после каждого использования отключайте приставку и убирайте ее в шкаф.Эта практика – не что иное, как обратная трактовка первого закона изменения поведения. Вместо того чтобы делать что-то очевидным, вы можете сделать это неочевидным. Я часто удивляюсь тому, насколько эффективными могут быть такие незначительные изменения. Уберите один-единственный стимул, и вся привычка уйдет вместе с ним.Самоконтроль – краткосрочная, а не долгосрочная стратегия. Вы можете противостоять искушению один или два раза, но не сможете каждый раз собирать волю в кулак, чтобы побеждать желания. Вместо этого лучше потратьте энергию на организацию своего окружения. В этом и заключается секрет самоконтроля. Сделайте стимулы хороших привычек очевидными, а стимулы плохих привычек – незаметными. РЕЗЮМЕ•Обратная трактовка первого закона изменения поведения звучит так: «Сделайте это неочевидным».•Когда привычка сформирована, ее практически невозможно забыть.•Люди с высокой степенью самоконтроля, как правило, тратят меньше времени, чтобы справляться со сложными ситуациями. Проще избежать искушения, чем противостоять ему.•Одним из наиболее практичных способов избавиться от плохой привычки является сокращение проявлений стимула, который вызывает ее.•Самоконтроль – это краткосрочная, а не долгосрочная стратегия. + +- Блок insights (JSON): +{ + "insights": [ + { + "title": "Среда влияет на привычки больше, чем сила воли", + "description": "Чтобы изменить привычку, нужно изменить окружение, а не надеяться только на самоконтроль", + "example": "Убрать телефон с рабочего стола, чтобы не отвлекаться на соцсети" + }, + { + "title": "Привычки не исчезают, только временно подавляются", + "description": "Даже если человек перестаёт курить или есть сладкое, эти привычки остаются в мозге и могут вернуться при подходящих условиях", + "example": "После посещения бара человек снова начинает пить, не осознавая этого" + }, + { + "title": "Негативные эмоции усиливают вредное поведение", + "description": "Стресс, тревога и другие негативные чувства могут спровоцировать возвращение к старым привычкам", + "example": "После ссоры человек снова начинает есть вредную пищу, чтобы успокоиться" + }, + { + "title": "Сокращение стимулов уменьшает повторение нежелательного поведения", + "description": "Удаление триггеров, связанных с вредной привычкой, снижает вероятность её возобновления", + "example": "Убрать сигареты из дома, чтобы уменьшить вероятность их употребления" + }, + { + "title": "Самоконтроль — это временная стратегия, а не долгосрочное решение", + "description": "Постоянно бороться с искушением утомительно и непрочное; нужно настраивать среду так, чтобы искушений не было совсем", + "example": "Поставить телефон в другую комнату, чтобы не проверять соцсети во время работы" + } + ] + } + +--- + +## ЗАДАЧА + +Проверь соответствие блока insights тексту главы: +1. Каждый инсайт (title, description) должен иметь опору в тексте. +2. Утверждения без опоры — галлюцинации. +3. Важные инсайты из текста, которых нет в блоке — пропуски. + +Проверяй идеи, а не формулировки. + +--- + +## ФОРМАТ ОТВЕТА + +СТРОГО JSON без комментариев: + +{ + "verdict": "ok" | "needs_review" | "bad", + "score": 0.0, + "hallucinations": [ + { + "location": "insights[0]/description", + "summary": "В анализе: '[цитата]', в тексте такого нет" + } + ], + "missing_key_points": [ + { + "summary": "В тексте явный инсайт X, в insights его нет", + "evidence": "краткая отсылка к тексту" + } + ] +} + +VERDICT: ok — проблем нет; needs_review — 1–2 замечания; bad — много галлюцинаций или пропусков. diff --git a/2_валидация_анализа_по_блокам/validate_limitations.txt b/2_валидация_анализа_по_блокам/validate_limitations.txt new file mode 100644 index 0000000..99a7ea4 --- /dev/null +++ b/2_валидация_анализа_по_блокам/validate_limitations.txt @@ -0,0 +1,43 @@ +Ты валидатор блока limitations (ограничения, оговорки). Проверь ТОЛЬКО этот блок. + +Данные: +- Книга: "{book_title}" +- Глава: "{chapter_title}" +- Текст главы: {chapter_text} +- Блок limitations (JSON): {limitations_json} + +--- + +## ЗАДАЧА + +Проверь соответствие блока limitations тексту главы: +1. Каждое ограничение (description, при необходимости when_relevant) должно иметь опору в тексте или логично следовать из содержания главы. +2. Ограничения, которых нет в тексте и которые не вытекают из него — галлюцинации. +3. Важные оговорки/ограничения из текста, которых нет в блоке — пропуски. + +Проверяй идеи. Допустимы разумные выводы из текста (например, «метод не мгновенный» при описании постепенных изменений). + +--- + +## ФОРМАТ ОТВЕТА + +СТРОГО JSON без комментариев: + +{ + "verdict": "ok" | "needs_review" | "bad", + "score": 0.0, + "hallucinations": [ + { + "location": "limitations[0]/description", + "summary": "В анализе: '[цитата]', в тексте такого нет и не следует из него" + } + ], + "missing_key_points": [ + { + "summary": "В тексте есть оговорка X, в limitations её нет", + "evidence": "краткая отсылка к тексту" + } + ] +} + +VERDICT: ok — проблем нет; needs_review — 1–2 замечания; bad — выдуманные ограничения или существенные пропуски. diff --git a/2_валидация_анализа_по_блокам/validate_limitations_filled.txt b/2_валидация_анализа_по_блокам/validate_limitations_filled.txt new file mode 100644 index 0000000..16f878d --- /dev/null +++ b/2_валидация_анализа_по_блокам/validate_limitations_filled.txt @@ -0,0 +1,63 @@ +Ты валидатор блока limitations (ограничения, оговорки). Проверь ТОЛЬКО этот блок. + +Данные: +- Книга: "{book_title}" +- Глава: "{chapter_title}" +- Текст главы: В 1971 году, когда шел шестнадцатый год войны во Вьетнаме, два американских конгрессмена, Роберт Стил из Коннектикута и Морган Мерфи из Иллинойса, сделали открытие, которое потрясло американское общество. Во время посещения воинских частей они выяснили, что более 15% американских солдат во Вьетнаме имели зависимость от героина. Более поздние исследования показали, что 35% американского контингента во Вьетнаме когда-либо пробовало героин и почти 20% страдало наркотической зависимостью – то есть проблема оказалась еще серьезнее, чем им показалось вначале.Это открытие вызвало бурную активность в Вашингтоне, включая создание по распоряжению президента Ричарда Никсона Специального комитета по предупреждению злоупотреблений наркотиками, целью деятельности которого была профилактика наркомании, а также реабилитация и отслеживание судеб наркозависимых солдат после возвращения на родину.Ли Робинс был одним из исследователей комитета. В ходе исследования, результаты которого перевернули все имевшиеся представления о наркологии, он обнаружил, что только 5% наркозависимых солдат снова начинали принимать героин в течение первого года после возвращения из реабилитационного центра и всего 12% делали это в течение трех лет. Иными словами, девять солдат из десяти избавлялись от наркотической зависимости после того, как покидали Вьетнам.Это открытие полностью противоречило всем представлениям наркологов того времени, согласно которым героиновая зависимость считалась постоянной и необратимом болезнью. Однако в противоположность этим представлениям Робинс обнаружил, что эта зависимость может спонтанно исчезнуть в случае полной смены окружения. Во Вьетнаме солдаты проводили все свое время в окружении стимулов, провоцировавших употребление героина: его было просто достать, а сами они находились под воздействием постоянного стресса войны; они строили дружеские отношения с сослуживцами, которые уже принимали героин, и находились в тысяче миль от дома. Но как только солдат возвращался в США, он оказывался в среде, лишенной этих стимулов. Как только менялся контекст, менялась и привычка.Сравните эту ситуацию с ситуацией типичного наркомана. Он становится наркозависимым дома или в компании друзей, затем попадает в клинику, где проходит реабилитацию и «очищается»– при этом находясь в среде, лишенной стимулов, которые сформировали его привычку, а затем возвращается в прежнее окружение со всеми стимулами, которые уже спровоцировали наркозависимость в первый раз. Поэтому неудивительно, что обычно наблюдается огромное количество примеров, прямо противоположных тем, что мы только что видели в рамках Вьетнамской кампании. Как правило, 90% героиновых наркоманов снова становятся зависимыми после возвращения с реабилитации.Вьетнамские исследования противоречат многим нашим культурным убеждениям относительно дурных привычек, поскольку ставят под сомнение шаблонную ассоциацию нездорового поведения с моральной слабостью. Если у вас избыточный вес, вы курите или страдаете наркозависимостью, вам всю жизнь говорят, что причиной этого является недостаток самоконтроля – а иногда даже говорят, что вы плохой человек. Идея о том, что немного дисциплины способно решить все проблемы, глубоко укоренилась в нашей культуре.Однако недавние исследования свидетельствуют о прямо противоположных фактах. Когда ученые анализируют поведение людей, которые, казалось бы, обладают выдающимся самоконтролем, выясняется, что эти люди ничем не отличаются от тех, кто постоянно борется с вредными привычками. «Дисциплинированные» люди лучше справляются со структурированием своей жизни способами, которые не требуют героической силы воли и самоконтроля. Иначе говоря, они тратят меньше времени, чтобы справиться с теми или иными ситуациями.Люди с развитым самоконтролем, как правило, меньше всех нуждаются в его применении. Проще практиковать выдержку и самоконтроль, когда не приходится использовать их слишком часто. Таким образом, действительно, упорство, твердость характера и сила воли очень важны для достижения успеха, но способ развить эти качества заключается не в том, чтобы стать более дисциплинированным человеком, а в том, чтобы создать более дисциплинированную среду вокруг себя.Эта парадоксальная идея становится еще более логичной, когда вы начинаете понимать, что происходит в процессе формирования привычки в мозгу. Привычка, которая уже закодирована в нем, «готова к использованию» влюбой момент, как только наступит соответствующая ситуация. Когда Пэтти Олвэлл, врач из Остина, Техас, начала курить, она часто закуривала во время верховой прогулки со своим другом. В конце концов она перестала курить и не курила много лет. Она также перестала ездить верхом. Спустя десятилетия она снова села на лошадь и вскоре заметила, что впервые за много лет ей очень хочется курить. Стимулы все еще были актуальны, они просто не проявлялись в течение долгого времени.Если привычка укоренилась в мозгу, призыв к действию появляется каждый раз, когда возникают соответствующие стимулы во внешней среде. Это одна из причин, по которой техники по изменению поведения могут вызвать негативные последствия. Если вы будете смущать людей с избыточным весом, постоянно демонстрируя им презентации по снижению веса, то они могут ощутить стресс, и в результате большая часть из них вернется к своей излюбленной стратегии преодоления стресса – перееданию. Когда вы показываете курильщикам легкие с затемнениями, это приводит к повышению уровня тревожности, в результате чего многие люди хватаются за сигарету. Таким образом, если вы невнимательно относитесь к стимулам, то можете спровоцировать именно то поведение, которого хотите избежать.Можно сказать, что дурные привычки являются аутокаталитическими: процесс подпитывает сам себя. Они усиливают чувства, которые человек пытается подавить. Например, вы чувствуете себя плохо, и поэтому начинаете есть фастфуд. От того, что вы его едите, вы начинаете чувствовать себя плохо. Просмотр телевизора вызывает сонливость, поэтому вы смотрите его еще больше, так как вам не хватает энергии на что-то другое. Беспокойство о своем здоровье заставляет вас испытывать тревогу, которая в свою очередь вызывает желание покурить, чтобы успокоиться, но это способствует ухудшению здоровья, из-за чего ваше беспокойство в ближайшее время только усилится. Это своего рода нисходящая спираль, потерявший управление «поезд дурных привычек».Ученые называют этот феномен «желание, вызванное стимулом»: внешний триггер вызывает навязчивое стремление повторить дурную привычку. Как только вы замечаете что-то, вы начинаете хотеть этого. Это процесс происходит постоянно – часто мы даже не замечаем его. Ученые установили, что если всего на тридцать три миллисекунды показать изображение кокаина наркозависимым, это стимулирует в мозгу стремление к подкреплению и вызывает страстное желание принять наркотик. Это очень непродолжительное время, за которое мозг не успевает сознательно зарегистрировать увиденное – наркозависимые даже не смогут рассказать вам, что они видели,– и тем не менее все они одинаково захотят получить наркотик.Именно в этом заключается ключевой момент: вы можете избавиться от привычки, но не способны забыть ее. Если мыслительные паттерны, характерные для привычки, были зафиксированы в мозгу, их практически невозможно удалить полностью – даже если они не используются в течение продолжительного времени. А это значит, что простое противостояние искушению будет неэффективной стратегией. Очень сложно сохранить созерцательное и философское отношение к жизни, полной сложностей и противоречий. Это требует слишком много энергии. Поэтому в краткосрочной перспективе мы можем выбрать стратегию противостояния искушению. Однако в долгосрочной перспективе мы неизбежно становимся продуктом той среды, в которой живем. Откровенно говоря, мне ни разу не приходилось увидеть человека, последовательно приверженного хорошим привычкам в негативном окружении.Более надежным подходом будет искоренение плохих привычек в их исходной точке. Один из наиболее практичных способов устранить плохую привычку – это снизить воздействие на себя стимула, который провоцирует ее.•Если вы никак не можете закончить работу, оставьте телефон в другой комнате на несколько часов. Если вы постоянно ощущаете, что вам чего-то не хватает, прекратите просматривать профили других людей в социальных сетях – это вызывает ревность и зависть.•Если вы тратите слишком много времени на просмотр телевизора, уберите телевизор из спальни.•Если вы тратите слишком много денег на гаджеты, перестаньте читать обзоры последних технических новинок.•Если вы слишком много играете в видеоигры, после каждого использования отключайте приставку и убирайте ее в шкаф.Эта практика – не что иное, как обратная трактовка первого закона изменения поведения. Вместо того чтобы делать что-то очевидным, вы можете сделать это неочевидным. Я часто удивляюсь тому, насколько эффективными могут быть такие незначительные изменения. Уберите один-единственный стимул, и вся привычка уйдет вместе с ним.Самоконтроль – краткосрочная, а не долгосрочная стратегия. Вы можете противостоять искушению один или два раза, но не сможете каждый раз собирать волю в кулак, чтобы побеждать желания. Вместо этого лучше потратьте энергию на организацию своего окружения. В этом и заключается секрет самоконтроля. Сделайте стимулы хороших привычек очевидными, а стимулы плохих привычек – незаметными. РЕЗЮМЕ•Обратная трактовка первого закона изменения поведения звучит так: «Сделайте это неочевидным».•Когда привычка сформирована, ее практически невозможно забыть.•Люди с высокой степенью самоконтроля, как правило, тратят меньше времени, чтобы справляться со сложными ситуациями. Проще избежать искушения, чем противостоять ему.•Одним из наиболее практичных способов избавиться от плохой привычки является сокращение проявлений стимула, который вызывает ее.•Самоконтроль – это краткосрочная, а не долгосрочная стратегия. + +- Блок limitations (JSON): +{ + "limitations": [ + { + "description": "Идеи не работают, если триггер (то, что в окружении запускает действие) не устранён или остаётся доступным, так как привычка может вернуться при появлении стимула", + "when_relevant": "Когда человек не полностью убирает триггер из своей среды или сталкивается с ним в новой обстановке", + "example": "Человек удалил сигареты из дома, но снова начинает курить на работе среди коллег-курильщиков" + }, + { + "description": "Техники могут не сработать, если негативные эмоции (стресс, тревога) остаются необратленными и усиливают нежелательное поведение", + "when_relevant": "Когда человек продолжает испытывать сильный стресс или эмоциональные трудности, не решая их на уровне среды", + "example": "Человек убрал телефон из комнаты, но всё равно переедает перед сном из-за хронической тревоги" + }, + { + "description": "Изменения среды могут быть недостаточны, если привычка закреплена на уровне автоматических нейронных паттернов и не сопровождается новыми, здоровыми привычками", + "when_relevant": "Когда человек устраняет триггер, но не вводит альтернативное поведение для подкрепления", + "example": "Человек убрал телевизор из спальни, но не нашёл замену в виде чтения или медитации и проводит время впустую" + } + ] +} + +--- + +## ЗАДАЧА + +Проверь соответствие блока limitations тексту главы: +1. Каждое ограничение (description, при необходимости when_relevant) должно иметь опору в тексте или логично следовать из содержания главы. +2. Ограничения, которых нет в тексте и которые не вытекают из него — галлюцинации. +3. Важные оговорки/ограничения из текста, которых нет в блоке — пропуски. + +Проверяй идеи. Допустимы разумные выводы из текста (например, «метод не мгновенный» при описании постепенных изменений). + +--- + +## ФОРМАТ ОТВЕТА + +СТРОГО JSON без комментариев: + +{ + "verdict": "ok" | "needs_review" | "bad", + "score": 0.0, + "hallucinations": [ + { + "location": "limitations[0]/description", + "summary": "В анализе: '[цитата]', в тексте такого нет и не следует из него" + } + ], + "missing_key_points": [ + { + "summary": "В тексте есть оговорка X, в limitations её нет", + "evidence": "краткая отсылка к тексту" + } + ] +} + +VERDICT: ok — проблем нет; needs_review — 1–2 замечания; bad — выдуманные ограничения или существенные пропуски. diff --git a/2b_финальная_валидация_согласованности/README.md b/2b_финальная_валидация_согласованности/README.md new file mode 100644 index 0000000..ba1a337 --- /dev/null +++ b/2b_финальная_валидация_согласованности/README.md @@ -0,0 +1,21 @@ +# Финальная валидация согласованности (шаг 2b) + +Проверка связей между блоками полного анализа главы после склейки. Соответствие тексту главы не проверяется — оно уже обеспечено валидацией по блокам (каталог `2_валидация_анализа_по_блокам/`). + +## Промпт + +| Файл | Назначение | +|--------------------------|-------------------------------------------------| +| validate_consistency.txt | Проверка согласованности framework, insights, application, limitations | + +## Подстановки + +- `{book_title}` — название книги +- `{chapter_title}` — название главы +- `{full_analysis_json}` — полный JSON анализа (склейка блоков framework + insights + application + limitations) + +## Использование + +Вызывается после шага 2a (склейка блоков). При вердикте bad или needs_review — флаг `needs_review` по главе; опционально — «примиряющий» промпт для минимальных правок. + +Выход 2b (merge.json) вместе с выходом шага 4 (валидация тегов) подаётся в **шаг 5 — мерж анализа и тегов** (`5_мерж_анализа_и_тегов/`). Результат мержа — вход для шага 6 (генерация эмбеддингов). diff --git a/2b_финальная_валидация_согласованности/merge.json b/2b_финальная_валидация_согласованности/merge.json new file mode 100644 index 0000000..e130b5e --- /dev/null +++ b/2b_финальная_валидация_согласованности/merge.json @@ -0,0 +1,159 @@ +{ + "framework": { + "terms": { + "стимул": "что в окружающей среде заставляет человека действовать", + "привычка": "повторяющееся действие, которое становится автоматическим", + "подкрепление": "воздействие, усиливающее вероятность повторения действия", + "среда": "окружение, влияющее на поведение через стимулы и ограничения", + "желание, вызванное стимулом": "непроизвольная тяга к действию, спровоцированному внешним триггером", + "аутокаталитический процесс": "процесс, усиливающий себя сам" + }, + "principles": [ + { + "title": "Среда формирует поведение", + "description": "Человек не управляет привычками напрямую, а воздействует на окружение, чтобы оно вело его к нужным действиям", + "example": "Убрать телефон с рабочего стола, чтобы не отвлекаться на соцсети", + "chains": [ + { + "cause": "Человек находится в среде с доступными стимулами для нежелательной привычки", + "mechanism": "Стимул активирует уже сформированную привычку, которая запускает автоматическое действие", + "result": "Человек повторяет вредную привычку, не осознавая этого" + }, + { + "cause": "Изменяется среда, удаляются стимулы, провоцирующие нежелательную привычку", + "mechanism": "Отсутствие триггеров снижает вероятность срабатывания привычки", + "result": "Человек реже проявляет нежелательное поведение" + } + ] + }, + { + "title": "Привычки не исчезают, они только временно подавлены", + "description": "Даже если человек перестаёт делать что-то, привычка остаётся в мозге и может вернуться при подходящих условиях", + "example": "Человек перестаёт курить, но снова начинает после посещения места, где раньше курил", + "chains": [ + { + "cause": "Человек прекращает проявлять вредную привычку", + "mechanism": "Мозг сохраняет нейронные связи, связанные с этой привычкой", + "result": "Привычка может вернуться, если появятся подходящие стимулы" + }, + { + "cause": "Окружение меняется, и в нем появляются триггеры, связанные с прошлой привычкой", + "mechanism": "Стимулы запускают автоматические паттерны поведения", + "result": "Человек снова начинает делать то, что уже перестал" + } + ] + }, + { + "title": "Самоконтроль — это краткосрочный, а не долгосрочный инструмент", + "description": "Противостояние искушению неэффективно на длительном сроке, нужно менять контекст", + "example": "Человек отказывается от сладкого, но возвращается к нему после стрессового дня", + "chains": [ + { + "cause": "Человек пытается контролировать себя в момент искушения", + "mechanism": "Это требует энергии и усилий, которые невозможно поддерживать всегда", + "result": "Человек устаёт от борьбы и возвращается к нежелательной привычке" + }, + { + "cause": "Человек изменяет окружение, чтобы искушения стали менее доступными", + "mechanism": "Стимулы для плохого поведения становятся незаметными или невозможными", + "result": "Человек реже сталкивается с искушением" + } + ] + }, + { + "title": "Дисциплина — это настройка среды, а не внутреннее усилие", + "description": "Сильные люди не просто дисциплинированы, а живут в среде, которая поддерживает их цели", + "example": "Человек встаёт раньше, потому что спальня тёмная и не имеет гаджетов", + "chains": [ + { + "cause": "Человек пытается быть дисциплинированным только силой воли", + "mechanism": "Это требует большого количества энергии и часто неудачно", + "result": "Человек теряет мотивацию и возвращается к нежелательному поведению" + }, + { + "cause": "Человек настраивает окружение так, чтобы хорошее поведение было лёгким", + "mechanism": "Стимулы для правильных действий становятся более доступными", + "result": "Человек чаще выбирает здоровые привычки" + } + ] + }, + { + "title": "Негативные эмоции усиливают негативное поведение", + "description": "Стресс, тревога и другие негативные чувства провоцируют возвращение к вредным привычкам", + "example": "Человек садится на диван и ест шоколад, когда ему плохо", + "chains": [ + { + "cause": "Человек испытывает стресс или негативные эмоции", + "mechanism": "Это активирует привычку, которая помогает снизить дискомфорт", + "result": "Человек снова начинает делать то, что раньше снимало напряжение" + }, + { + "cause": "Человек пытается избавиться от вредной привычки, но не меняет среду", + "mechanism": "Стресс и негативные эмоции остаются, усиливая желание к действию", + "result": "Человек возвращается к нежелательной привычке" + } + ] + } + ] + }, + "insights": [ + { + "title": "Среда влияет на привычки больше, чем сила воли", + "description": "Чтобы изменить привычку, нужно изменить окружение, а не надеяться только на самоконтроль", + "example": "Убрать телефон с рабочего стола, чтобы не отвлекаться на соцсети" + }, + { + "title": "Привычки не исчезают, только временно подавляются", + "description": "Даже если человек перестаёт курить или есть сладкое, эти привычки остаются в мозге и могут вернуться при подходящих условиях", + "example": "После посещения бара человек снова начинает пить, не осознавая этого" + }, + { + "title": "Негативные эмоции усиливают вредное поведение", + "description": "Стресс, тревога и другие негативные чувства могут спровоцировать возвращение к старым привычкам", + "example": "После ссоры человек снова начинает есть вредную пищу, чтобы успокоиться" + }, + { + "title": "Сокращение стимулов уменьшает повторение нежелательного поведения", + "description": "Удаление триггеров, связанных с вредной привычкой, снижает вероятность её возобновления", + "example": "Убрать сигареты из дома, чтобы уменьшить вероятность их употребления" + }, + { + "title": "Самоконтроль — это временная стратегия, а не долгосрочное решение", + "description": "Постоянно бороться с искушением утомительно и непрочное; нужно настраивать среду так, чтобы искушений не было совсем", + "example": "Поставить телефон в другую комнату, чтобы не проверять соцсети во время работы" + } + ], + "application": { + "techniques": [ + { + "name": "Снижение доступности стимула", + "goal": "Уменьшение вероятности повторения нежелательной привычки за счёт удаления её триггеров", + "context_example": "Вечер после работы, когда тянет залипнуть в телефон и проверять соцсети", + "steps": [ + "Определите конкретный стимул (например, наличие телефона на столе)", + "Уберите объект из зоны видимости или досягаемости (например, оставьте телефон в другой комнате)", + "Запишите дату и время изменения (для отслеживания эффективности)" + ], + "client_phrase": "Уберите источник искушения из вашей среды — действие станет менее вероятным", + "success_criteria": "Частота использования телефона в моменты, когда это не нужно, снижается с 5 раз/день до 1–2 раз/день за 2 недели" + } + ] + }, + "limitations": [ + { + "description": "Идеи не работают, если триггер (то, что в окружении запускает действие) не устранён или остаётся доступным, так как привычка может вернуться при появлении стимула", + "when_relevant": "Когда человек не полностью убирает триггер из своей среды или сталкивается с ним в новой обстановке", + "example": "Человек удалил сигареты из дома, но снова начинает курить на работе среди коллег-курильщиков" + }, + { + "description": "Техники могут не сработать, если негативные эмоции (стресс, тревога) остаются необратленными и усиливают нежелательное поведение", + "when_relevant": "Когда человек продолжает испытывать сильный стресс или эмоциональные трудности, не решая их на уровне среды", + "example": "Человек убрал телефон из комнаты, но всё равно переедает перед сном из-за хронической тревоги" + }, + { + "description": "Изменения среды могут быть недостаточны, если привычка закреплена на уровне автоматических нейронных паттернов и не сопровождается новыми, здоровыми привычками", + "when_relevant": "Когда человек устраняет триггер, но не вводит альтернативное поведение для подкрепления", + "example": "Человек убрал телевизор из спальни, но не нашёл замену в виде чтения или медитации и проводит время впустую" + } + ] +} \ No newline at end of file diff --git a/2b_финальная_валидация_согласованности/merged_with_tags.json b/2b_финальная_валидация_согласованности/merged_with_tags.json new file mode 100644 index 0000000..4cff75d --- /dev/null +++ b/2b_финальная_валидация_согласованности/merged_with_tags.json @@ -0,0 +1,248 @@ +{ + "framework": { + "terms": { + "стимул": "что в окружающей среде заставляет человека действовать", + "привычка": "повторяющееся действие, которое становится автоматическим", + "подкрепление": "воздействие, усиливающее вероятность повторения действия", + "среда": "окружение, влияющее на поведение через стимулы и ограничения", + "желание, вызванное стимулом": "непроизвольная тяга к действию, спровоцированному внешним триггером", + "аутокаталитический процесс": "процесс, усиливающий себя сам" + }, + "principles": [ + { + "title": "Среда формирует поведение", + "description": "Человек не управляет привычками напрямую, а воздействует на окружение, чтобы оно вело его к нужным действиям", + "example": "Убрать телефон с рабочего стола, чтобы не отвлекаться на соцсети", + "chains": [ + { + "cause": "Человек находится в среде с доступными стимулами для нежелательной привычки", + "mechanism": "Стимул активирует уже сформированную привычку, которая запускает автоматическое действие", + "result": "Человек повторяет вредную привычку, не осознавая этого" + }, + { + "cause": "Изменяется среда, удаляются стимулы, провоцирующие нежелательную привычку", + "mechanism": "Отсутствие триггеров снижает вероятность срабатывания привычки", + "result": "Человек реже проявляет нежелательное поведение" + } + ] + }, + { + "title": "Привычки не исчезают, они только временно подавлены", + "description": "Даже если человек перестаёт делать что-то, привычка остаётся в мозге и может вернуться при подходящих условиях", + "example": "Человек перестаёт курить, но снова начинает после посещения места, где раньше курил", + "chains": [ + { + "cause": "Человек прекращает проявлять вредную привычку", + "mechanism": "Мозг сохраняет нейронные связи, связанные с этой привычкой", + "result": "Привычка может вернуться, если появятся подходящие стимулы" + }, + { + "cause": "Окружение меняется, и в нем появляются триггеры, связанные с прошлой привычкой", + "mechanism": "Стимулы запускают автоматические паттерны поведения", + "result": "Человек снова начинает делать то, что уже перестал" + } + ] + }, + { + "title": "Самоконтроль — это краткосрочный, а не долгосрочный инструмент", + "description": "Противостояние искушению неэффективно на длительном сроке, нужно менять контекст", + "example": "Человек отказывается от сладкого, но возвращается к нему после стрессового дня", + "chains": [ + { + "cause": "Человек пытается контролировать себя в момент искушения", + "mechanism": "Это требует энергии и усилий, которые невозможно поддерживать всегда", + "result": "Человек устаёт от борьбы и возвращается к нежелательной привычке" + }, + { + "cause": "Человек изменяет окружение, чтобы искушения стали менее доступными", + "mechanism": "Стимулы для плохого поведения становятся незаметными или невозможными", + "result": "Человек реже сталкивается с искушением" + } + ] + }, + { + "title": "Дисциплина — это настройка среды, а не внутреннее усилие", + "description": "Сильные люди не просто дисциплинированы, а живут в среде, которая поддерживает их цели", + "example": "Человек встаёт раньше, потому что спальня тёмная и не имеет гаджетов", + "chains": [ + { + "cause": "Человек пытается быть дисциплинированным только силой воли", + "mechanism": "Это требует большого количества энергии и часто неудачно", + "result": "Человек теряет мотивацию и возвращается к нежелательному поведению" + }, + { + "cause": "Человек настраивает окружение так, чтобы хорошее поведение было лёгким", + "mechanism": "Стимулы для правильных действий становятся более доступными", + "result": "Человек чаще выбирает здоровые привычки" + } + ] + }, + { + "title": "Негативные эмоции усиливают негативное поведение", + "description": "Стресс, тревога и другие негативные чувства провоцируют возвращение к вредным привычкам", + "example": "Человек садится на диван и ест шоколад, когда ему плохо", + "chains": [ + { + "cause": "Человек испытывает стресс или негативные эмоции", + "mechanism": "Это активирует привычку, которая помогает снизить дискомфорт", + "result": "Человек снова начинает делать то, что раньше снимало напряжение" + }, + { + "cause": "Человек пытается избавиться от вредной привычки, но не меняет среду", + "mechanism": "Стресс и негативные эмоции остаются, усиливая желание к действию", + "result": "Человек возвращается к нежелательной привычке" + } + ] + } + ] + }, + "insights": [ + { + "title": "Среда влияет на привычки больше, чем сила воли", + "description": "Чтобы изменить привычку, нужно изменить окружение, а не надеяться только на самоконтроль", + "example": "Убрать телефон с рабочего стола, чтобы не отвлекаться на соцсети" + }, + { + "title": "Привычки не исчезают, только временно подавляются", + "description": "Даже если человек перестаёт курить или есть сладкое, эти привычки остаются в мозге и могут вернуться при подходящих условиях", + "example": "После посещения бара человек снова начинает пить, не осознавая этого" + }, + { + "title": "Негативные эмоции усиливают вредное поведение", + "description": "Стресс, тревога и другие негативные чувства могут спровоцировать возвращение к старым привычкам", + "example": "После ссоры человек снова начинает есть вредную пищу, чтобы успокоиться" + }, + { + "title": "Сокращение стимулов уменьшает повторение нежелательного поведения", + "description": "Удаление триггеров, связанных с вредной привычкой, снижает вероятность её возобновления", + "example": "Убрать сигареты из дома, чтобы уменьшить вероятность их употребления" + }, + { + "title": "Самоконтроль — это временная стратегия, а не долгосрочное решение", + "description": "Постоянно бороться с искушением утомительно и непрочное; нужно настраивать среду так, чтобы искушений не было совсем", + "example": "Поставить телефон в другую комнату, чтобы не проверять соцсети во время работы" + } + ], + "application": { + "techniques": [ + { + "name": "Снижение доступности стимула", + "goal": "Уменьшение вероятности повторения нежелательной привычки за счёт удаления её триггеров", + "context_example": "Вечер после работы, когда тянет залипнуть в телефон и проверять соцсети", + "steps": [ + "Определите конкретный стимул (например, наличие телефона на столе)", + "Уберите объект из зоны видимости или досягаемости (например, оставьте телефон в другой комнате)", + "Запишите дату и время изменения (для отслеживания эффективности)" + ], + "client_phrase": "Уберите источник искушения из вашей среды — действие станет менее вероятным", + "success_criteria": "Частота использования телефона в моменты, когда это не нужно, снижается с 5 раз/день до 1–2 раз/день за 2 недели" + } + ] + }, + "limitations": [ + { + "description": "Идеи не работают, если триггер (то, что в окружении запускает действие) не устранён или остаётся доступным, так как привычка может вернуться при появлении стимула", + "when_relevant": "Когда человек не полностью убирает триггер из своей среды или сталкивается с ним в новой обстановке", + "example": "Человек удалил сигареты из дома, но снова начинает курить на работе среди коллег-курильщиков" + }, + { + "description": "Техники могут не сработать, если негативные эмоции (стресс, тревога) остаются необратленными и усиливают нежелательное поведение", + "when_relevant": "Когда человек продолжает испытывать сильный стресс или эмоциональные трудности, не решая их на уровне среды", + "example": "Человек убрал телефон из комнаты, но всё равно переедает перед сном из-за хронической тревоги" + }, + { + "description": "Изменения среды могут быть недостаточны, если привычка закреплена на уровне автоматических нейронных паттернов и не сопровождается новыми, здоровыми привычками", + "when_relevant": "Когда человек устраняет триггер, но не вводит альтернативное поведение для подкрепления", + "example": "Человек убрал телевизор из спальни, но не нашёл замену в виде чтения или медитации и проводит время впустую" + } + ], + "tags": { + "principle": [ + { + "tag": "среда формирует поведение", + "confidence": 0.95 + }, + { + "tag": "привычки не исчезают", + "confidence": 0.92 + }, + { + "tag": "самоконтроль краткосрочен", + "confidence": 0.9 + }, + { + "tag": "дисциплина через среду", + "confidence": 0.9 + }, + { + "tag": "негативные эмоции усиливают поведение", + "confidence": 0.85 + } + ], + "psychology": [ + { + "tag": "стимул", + "confidence": 0.95 + }, + { + "tag": "привычка", + "confidence": 0.95 + }, + { + "tag": "желание вызванное стимулом", + "confidence": 0.9 + }, + { + "tag": "аутокаталитический процесс", + "confidence": 0.85 + }, + { + "tag": "подкрепление", + "confidence": 0.8 + } + ], + "method": [ + { + "tag": "снижение доступности стимула", + "confidence": 0.95 + }, + { + "tag": "настройка среды", + "confidence": 0.92 + }, + { + "tag": "устранение триггеров", + "confidence": 0.9 + } + ], + "result": [ + { + "tag": "уменьшение вредных привычек", + "confidence": 0.95 + }, + { + "tag": "устойчивое поведение", + "confidence": 0.9 + }, + { + "tag": "снижение искушений", + "confidence": 0.85 + } + ], + "context": [ + { + "tag": "поведенческая психология", + "confidence": 0.95 + }, + { + "tag": "привычки", + "confidence": 0.92 + }, + { + "tag": "атомные привычки", + "confidence": 0.9 + } + ] + }, + "removed": [] +} \ No newline at end of file diff --git a/2b_финальная_валидация_согласованности/validate_consistency.txt b/2b_финальная_валидация_согласованности/validate_consistency.txt new file mode 100644 index 0000000..b19bd31 --- /dev/null +++ b/2b_финальная_валидация_согласованности/validate_consistency.txt @@ -0,0 +1,40 @@ +Ты валидатор согласованности полного анализа главы. Проверяй ТОЛЬКО связи между блоками. Соответствие тексту главы уже проверено по блокам — не перепроверяй. + +Данные: +- Книга: "{book_title}" +- Глава: "{chapter_title}" +- Полный анализ (склейка блоков, JSON): {full_analysis_json} + +--- + +## ЗАДАЧА + +Проверь согласованность блоков между собой: + +1. **application (техники) и framework (принципы):** каждая техника должна опираться на хотя бы один принцип или идею из framework; техники не должны противоречить принципам. Если техника «висит» без связи с framework или противоречит ему — рассогласованность. + +2. **insights и framework:** инсайты не должны противоречить принципам и цепочкам cause–mechanism–result из framework. Один и тот же смысл разными словами — не ошибка; прямое противоречие — рассогласованность. + +3. **limitations и остальное:** ограничения/оговорки должны относиться к тому, что реально описано в framework, insights или application (ограничение применимости техники, границы принципа и т.п.). Ограничения «ни о чём» или про несуществующие в анализе вещи — рассогласованность. + +Проверяй только эти три типа связей. Не оценивай полноту или стиль — только внутреннюю согласованность. + +--- + +## ФОРМАТ ОТВЕТА + +СТРОГО JSON без комментариев: + +{ + "verdict": "ok" | "needs_review" | "bad", + "score": 0.0, + "inconsistencies": [ + { + "type": "application_vs_framework" | "insights_vs_framework" | "limitations_vs_rest", + "location": "краткое указание (например: application/techniques[1], framework/principles[0])", + "summary": "суть рассогласованности в 1–2 предложениях" + } + ] +} + +VERDICT: ok — рассогласованностей нет; needs_review — 1–2 несущественных; bad — явные противоречия или несколько рассогласованностей. diff --git a/2b_финальная_валидация_согласованности/validate_consistency_filled.txt b/2b_финальная_валидация_согласованности/validate_consistency_filled.txt new file mode 100644 index 0000000..c07b8df --- /dev/null +++ b/2b_финальная_валидация_согласованности/validate_consistency_filled.txt @@ -0,0 +1,200 @@ +Ты валидатор согласованности полного анализа главы. Проверяй ТОЛЬКО связи между блоками. Соответствие тексту главы уже проверено по блокам — не перепроверяй. + +Данные: +- Книга: "[указать название книги]" +- Глава: "[указать название главы]" +- Полный анализ (склейка блоков, JSON): + +{ + "framework": { + "terms": { + "стимул": "что в окружающей среде заставляет человека действовать", + "привычка": "повторяющееся действие, которое становится автоматическим", + "подкрепление": "воздействие, усиливающее вероятность повторения действия", + "среда": "окружение, влияющее на поведение через стимулы и ограничения", + "желание, вызванное стимулом": "непроизвольная тяга к действию, спровоцированному внешним триггером", + "аутокаталитический процесс": "процесс, усиливающий себя сам" + }, + "principles": [ + { + "title": "Среда формирует поведение", + "description": "Человек не управляет привычками напрямую, а воздействует на окружение, чтобы оно вело его к нужным действиям", + "example": "Убрать телефон с рабочего стола, чтобы не отвлекаться на соцсети", + "chains": [ + { + "cause": "Человек находится в среде с доступными стимулами для нежелательной привычки", + "mechanism": "Стимул активирует уже сформированную привычку, которая запускает автоматическое действие", + "result": "Человек повторяет вредную привычку, не осознавая этого" + }, + { + "cause": "Изменяется среда, удаляются стимулы, провоцирующие нежелательную привычку", + "mechanism": "Отсутствие триггеров снижает вероятность срабатывания привычки", + "result": "Человек реже проявляет нежелательное поведение" + } + ] + }, + { + "title": "Привычки не исчезают, они только временно подавлены", + "description": "Даже если человек перестаёт делать что-то, привычка остаётся в мозге и может вернуться при подходящих условиях", + "example": "Человек перестаёт курить, но снова начинает после посещения места, где раньше курил", + "chains": [ + { + "cause": "Человек прекращает проявлять вредную привычку", + "mechanism": "Мозг сохраняет нейронные связи, связанные с этой привычкой", + "result": "Привычка может вернуться, если появятся подходящие стимулы" + }, + { + "cause": "Окружение меняется, и в нем появляются триггеры, связанные с прошлой привычкой", + "mechanism": "Стимулы запускают автоматические паттерны поведения", + "result": "Человек снова начинает делать то, что уже перестал" + } + ] + }, + { + "title": "Самоконтроль — это краткосрочный, а не долгосрочный инструмент", + "description": "Противостояние искушению неэффективно на длительном сроке, нужно менять контекст", + "example": "Человек отказывается от сладкого, но возвращается к нему после стрессового дня", + "chains": [ + { + "cause": "Человек пытается контролировать себя в момент искушения", + "mechanism": "Это требует энергии и усилий, которые невозможно поддерживать всегда", + "result": "Человек устаёт от борьбы и возвращается к нежелательной привычке" + }, + { + "cause": "Человек изменяет окружение, чтобы искушения стали менее доступными", + "mechanism": "Стимулы для плохого поведения становятся незаметными или невозможными", + "result": "Человек реже сталкивается с искушением" + } + ] + }, + { + "title": "Дисциплина — это настройка среды, а не внутреннее усилие", + "description": "Сильные люди не просто дисциплинированы, а живут в среде, которая поддерживает их цели", + "example": "Человек встаёт раньше, потому что спальня тёмная и не имеет гаджетов", + "chains": [ + { + "cause": "Человек пытается быть дисциплинированным только силой воли", + "mechanism": "Это требует большого количества энергии и часто неудачно", + "result": "Человек теряет мотивацию и возвращается к нежелательному поведению" + }, + { + "cause": "Человек настраивает окружение так, чтобы хорошее поведение было лёгким", + "mechanism": "Стимулы для правильных действий становятся более доступными", + "result": "Человек чаще выбирает здоровые привычки" + } + ] + }, + { + "title": "Негативные эмоции усиливают негативное поведение", + "description": "Стресс, тревога и другие негативные чувства провоцируют возвращение к вредным привычкам", + "example": "Человек садится на диван и ест шоколад, когда ему плохо", + "chains": [ + { + "cause": "Человек испытывает стресс или негативные эмоции", + "mechanism": "Это активирует привычку, которая помогает снизить дискомфорт", + "result": "Человек снова начинает делать то, что раньше снимало напряжение" + }, + { + "cause": "Человек пытается избавиться от вредной привычки, но не меняет среду", + "mechanism": "Стресс и негативные эмоции остаются, усиливая желание к действию", + "result": "Человек возвращается к нежелательной привычке" + } + ] + } + ] + }, + "insights": [ + { + "title": "Среда влияет на привычки больше, чем сила воли", + "description": "Чтобы изменить привычку, нужно изменить окружение, а не надеяться только на самоконтроль", + "example": "Убрать телефон с рабочего стола, чтобы не отвлекаться на соцсети" + }, + { + "title": "Привычки не исчезают, только временно подавляются", + "description": "Даже если человек перестаёт курить или есть сладкое, эти привычки остаются в мозге и могут вернуться при подходящих условиях", + "example": "После посещения бара человек снова начинает пить, не осознавая этого" + }, + { + "title": "Негативные эмоции усиливают вредное поведение", + "description": "Стресс, тревога и другие негативные чувства могут спровоцировать возвращение к старым привычкам", + "example": "После ссоры человек снова начинает есть вредную пищу, чтобы успокоиться" + }, + { + "title": "Сокращение стимулов уменьшает повторение нежелательного поведения", + "description": "Удаление триггеров, связанных с вредной привычкой, снижает вероятность её возобновления", + "example": "Убрать сигареты из дома, чтобы уменьшить вероятность их употребления" + }, + { + "title": "Самоконтроль — это временная стратегия, а не долгосрочное решение", + "description": "Постоянно бороться с искушением утомительно и непрочное; нужно настраивать среду так, чтобы искушений не было совсем", + "example": "Поставить телефон в другую комнату, чтобы не проверять соцсети во время работы" + } + ], + "application": { + "techniques": [ + { + "name": "Снижение доступности стимула", + "goal": "Уменьшение вероятности повторения нежелательной привычки за счёт удаления её триггеров", + "context_example": "Вечер после работы, когда тянет залипнуть в телефон и проверять соцсети", + "steps": [ + "Определите конкретный стимул (например, наличие телефона на столе)", + "Уберите объект из зоны видимости или досягаемости (например, оставьте телефон в другой комнате)", + "Запишите дату и время изменения (для отслеживания эффективности)" + ], + "client_phrase": "Уберите источник искушения из вашей среды — действие станет менее вероятным", + "success_criteria": "Частота использования телефона в моменты, когда это не нужно, снижается с 5 раз/день до 1–2 раз/день за 2 недели" + } + ] + }, + "limitations": [ + { + "description": "Идеи не работают, если триггер (то, что в окружении запускает действие) не устранён или остаётся доступным, так как привычка может вернуться при появлении стимула", + "when_relevant": "Когда человек не полностью убирает триггер из своей среды или сталкивается с ним в новой обстановке", + "example": "Человек удалил сигареты из дома, но снова начинает курить на работе среди коллег-курильщиков" + }, + { + "description": "Техники могут не сработать, если негативные эмоции (стресс, тревога) остаются необратленными и усиливают нежелательное поведение", + "when_relevant": "Когда человек продолжает испытывать сильный стресс или эмоциональные трудности, не решая их на уровне среды", + "example": "Человек убрал телефон из комнаты, но всё равно переедает перед сном из-за хронической тревоги" + }, + { + "description": "Изменения среды могут быть недостаточны, если привычка закреплена на уровне автоматических нейронных паттернов и не сопровождается новыми, здоровыми привычками", + "when_relevant": "Когда человек устраняет триггер, но не вводит альтернативное поведение для подкрепления", + "example": "Человек убрал телевизор из спальни, но не нашёл замену в виде чтения или медитации и проводит время впустую" + } + ] +} + +--- + +## ЗАДАЧА + +Проверь согласованность блоков между собой: + +1. **application (техники) и framework (принципы):** каждая техника должна опираться на хотя бы один принцип или идею из framework; техники не должны противоречить принципам. Если техника «висит» без связи с framework или противоречит ему — рассогласованность. + +2. **insights и framework:** инсайты не должны противоречить принципам и цепочкам cause–mechanism–result из framework. Один и тот же смысл разными словами — не ошибка; прямое противоречие — рассогласованность. + +3. **limitations и остальное:** ограничения/оговорки должны относиться к тому, что реально описано в framework, insights или application (ограничение применимости техники, границы принципа и т.п.). Ограничения «ни о чём» или про несуществующие в анализе вещи — рассогласованность. + +Проверяй только эти три типа связей. Не оценивай полноту или стиль — только внутреннюю согласованность. + +--- + +## ФОРМАТ ОТВЕТА + +СТРОГО JSON без комментариев: + +{ + "verdict": "ok" | "needs_review" | "bad", + "score": 0.0, + "inconsistencies": [ + { + "type": "application_vs_framework" | "insights_vs_framework" | "limitations_vs_rest", + "location": "краткое указание (например: application/techniques[1], framework/principles[0])", + "summary": "суть рассогласованности в 1–2 предложениях" + } + ] +} + +VERDICT: ok — рассогласованностей нет; needs_review — 1–2 несущественных; bad — явные противоречия или несколько рассогласованностей. diff --git a/3_извлечение_тегов/README.md b/3_извлечение_тегов/README.md new file mode 100644 index 0000000..d092f11 --- /dev/null +++ b/3_извлечение_тегов/README.md @@ -0,0 +1,32 @@ +# Извлечение тегов (шаг 3) + +Отдельный шаг пайплайна после финальной валидации согласованности (2b). ИИ использует уже структурированный анализ главы (каркас, инсайты, применение) и оригинальный текст для извлечения тегов по категориям. + +## Промпт + +| Файл | Назначение | +|------------------|-------------------------------------------------| +| extract_tags.txt | Извлечение тегов по категориям из валидированного анализа | + +## Подстановки + +- `{book_title}` — название книги +- `{chapter_title}` — название главы +- `{framework}` — JSON блока framework +- `{insights}` — JSON блока insights +- `{application}` — JSON блока application +- `{limitations}` — JSON блока limitations (опционально) +- `{chapter_text}` — оригинальный текст главы (можно обрезать по лимиту токенов) +- `{allowed_tags_json}` — актуальный список допустимых тегов по категориям (из БД `tags`) + +## Вход + +Валидированный анализ главы (все блоки) + оригинальный текст главы + словарь допустимых тегов. + +## Выход + +JSON с тегами по категориям (ключи на английском: `principle`, `psychology`, `method`, `result`, `context`) и confidence score для каждого тега; при необходимости — кандидаты в `proposed` с полем `category` из того же набора. Маппинг категорий: ARCHITECTURE_SUMMARY.md → раздел «Хранение данных» → таблица `tags`. + +## Использование + +Вызывается после шага 2b (финальная валидация). Модель: qwen3-14b:8bit (или аналог). Перед вызовом в промпт подставляется актуальный список тегов из БД. diff --git a/3_извлечение_тегов/extract_tags.txt b/3_извлечение_тегов/extract_tags.txt new file mode 100644 index 0000000..061149e --- /dev/null +++ b/3_извлечение_тегов/extract_tags.txt @@ -0,0 +1,79 @@ +Ты — эксперт по тегированию нон-фикшн. На основе валидированного анализа главы извлеки теги по категориям. Теги нужны для фильтрации и кросс-книжного поиска. + +Контекст: +- Книга: "{book_title}" +- Глава: "{chapter_title}" + +Данные анализа (JSON-блоки, сериализованные в строку): +- Каркас (принципы, цепочки, термины): {framework} +- Инсайты: {insights} +- Применение (техники, методики): {application} +- Ограничения: {limitations} + +Оригинальный текст главы (выдержка для контекста): {chapter_text} + +Допустимые теги по категориям — JSON (выбирай ТОЛЬКО из этого списка): {allowed_tags_json} + +**Опора при выборе тегов:** в первую очередь блоки анализа (framework, insights, application); текст главы — для проверки релевантности и калибровки confidence. + +--- + +## ЗАДАЧА + +Извлеки теги по следующим категориям. Ключи категорий в ответе — на английском (соответствуют полю `category` в БД): + +1. **principle** — по сути правила/принципа: название правила/принципа, ключевые концепции, связанные принципы. +2. **psychology** — по психологическому механизму: психологические концепции, проблемы, механизмы работы. Включай термин из списка, если он **существенно используется** в главе (объяснён, в цепочке причина–механизм–результат или в примере), а не только упомянут вскользь. +3. **method** — по методу/технике: конкретные методики, подходы, процессы. +4. **result** — по результату/цели: достигаемые результаты, цели применения. +5. **context** — по контексту книги: связь с общей концепцией книги, автор и подход, общая тематика. + +Теги должны отражать **суть** главы, а не просто упоминания. Каждый тег — релевантен содержанию. Избегай слишком общих тегов. Приоритет: качество над количеством. **Не более 5 тегов на категорию;** при равной релевантности оставляй самые важные для поиска. + +--- + +## СТРОГИЕ ПРАВИЛА + +1. Выбирай теги **только** из переданного списка (`allowed_tags_json`). В поле `tag` копируй строку **точно как в списке** — без изменения формулировки, регистра и пунктуации. +2. Если для главы нужен смысл, которого нет в списке — верни его в блоке `proposed`: объект с полями `tag`, `category` (principle | psychology | method | result | context), `reason`. Не добавляй такой тег в основные категории. +3. Один и тот же смысл — один тег; не дублируй синонимами из списка. +4. **Confidence** (0.0–1.0) калибруй так: **0.9–1.0** — тема в ядре главы (принципы, главные идеи); **0.7–0.89** — есть в главе, но второстепенно или через примеры; **0.5–0.69** — только упомянуто, без разбора. Не завышай: различай «главное» и «по касательной». +5. Не используй вводные фразы и пояснения в ответе — только JSON. + +--- + +## ФОРМАТ ОТВЕТА + +Строго один JSON-объект без комментариев и markdown: + +{ + "tags": { + "principle": [ + { "tag": "название тега из списка", "confidence": 0.95 } + ], + "psychology": [ + { "tag": "...", "confidence": 0.9 } + ], + "method": [ + { "tag": "...", "confidence": 0.85 } + ], + "result": [ + { "tag": "...", "confidence": 0.9 } + ], + "context": [ + { "tag": "...", "confidence": 0.88 } + ] + }, + "proposed": [ + { + "tag": "формулировка предлагаемого тега", + "category": "principle | psychology | method | result | context", + "reason": "краткое обоснование в 1–2 предложениях" + } + ] +} + +- Ключи в `tags` — английские, соответствуют полю `tags.category` в БД. Пустые категории — пустой массив `[]`. В каждом `tag` — строка в точности как в `allowed_tags_json`. +- Блок `proposed` — только если ни один существующий тег не подходит по смыслу; иначе пустой массив `[]`. + +Верни только этот объект — ничего до и после. diff --git a/3_извлечение_тегов/extract_tags_filled.txt b/3_извлечение_тегов/extract_tags_filled.txt new file mode 100644 index 0000000..65fc915 --- /dev/null +++ b/3_извлечение_тегов/extract_tags_filled.txt @@ -0,0 +1,79 @@ +Ты — эксперт по тегированию нон-фикшн. На основе валидированного анализа главы извлеки теги по категориям. Теги нужны для фильтрации и кросс-книжного поиска. + +Контекст: +- Книга: "Атомные привычки" +- Глава: "Глава 1. Среда и привычки" + +Данные анализа (JSON-блоки, сериализованные в строку): +- Каркас (принципы, цепочки, термины): {"framework":{"terms":{"стимул":"что в окружающей среде заставляет человека действовать","привычка":"повторяющееся действие, которое становится автоматическим","подкрепление":"воздействие, усиливающее вероятность повторения действия","среда":"окружение, влияющее на поведение через стимулы и ограничения","желание, вызванное стимулом":"непроизвольная тяга к действию, спровоцированному внешним триггером","аутокаталитический процесс":"процесс, усиливающий себя сам"},"principles":[{"title":"Среда формирует поведение","description":"Человек не управляет привычками напрямую, а воздействует на окружение, чтобы оно вело его к нужным действиям","example":"Убрать телефон с рабочего стола, чтобы не отвлекаться на соцсети","chains":[{"cause":"Человек находится в среде с доступными стимулами для нежелательной привычки","mechanism":"Стимул активирует уже сформированную привычку, которая запускает автоматическое действие","result":"Человек повторяет вредную привычку, не осознавая этого"},{"cause":"Изменяется среда, удаляются стимулы, провоцирующие нежелательную привычку","mechanism":"Отсутствие триггеров снижает вероятность срабатывания привычки","result":"Человек реже проявляет нежелательное поведение"}]},{"title":"Привычки не исчезают, они только временно подавлены","description":"Даже если человек перестаёт делать что-то, привычка остаётся в мозге и может вернуться при подходящих условиях","example":"Человек перестаёт курить, но снова начинает после посещения места, где раньше курил","chains":[{"cause":"Человек прекращает проявлять вредную привычку","mechanism":"Мозг сохраняет нейронные связи, связанные с этой привычкой","result":"Привычка может вернуться, если появятся подходящие стимулы"},{"cause":"Окружение меняется, и в нем появляются триггеры, связанные с прошлой привычкой","mechanism":"Стимулы запускают автоматические паттерны поведения","result":"Человек снова начинает делать то, что уже перестал"}]},{"title":"Самоконтроль — это краткосрочный, а не долгосрочный инструмент","description":"Противостояние искушению неэффективно на длительном сроке, нужно менять контекст","example":"Человек отказывается от сладкого, но возвращается к нему после стрессового дня","chains":[{"cause":"Человек пытается контролировать себя в момент искушения","mechanism":"Это требует энергии и усилий, которые невозможно поддерживать всегда","result":"Человек устаёт от борьбы и возвращается к нежелательной привычке"},{"cause":"Человек изменяет окружение, чтобы искушения стали менее доступными","mechanism":"Стимулы для плохого поведения становятся незаметными или невозможными","result":"Человек реже сталкивается с искушением"}]},{"title":"Дисциплина — это настройка среды, а не внутреннее усилие","description":"Сильные люди не просто дисциплинированы, а живут в среде, которая поддерживает их цели","example":"Человек встаёт раньше, потому что спальня тёмная и не имеет гаджетов","chains":[{"cause":"Человек пытается быть дисциплинированным только силой воли","mechanism":"Это требует большого количества энергии и часто неудачно","result":"Человек теряет мотивацию и возвращается к нежелательному поведению"},{"cause":"Человек настраивает окружение так, чтобы хорошее поведение было лёгким","mechanism":"Стимулы для правильных действий становятся более доступными","result":"Человек чаще выбирает здоровые привычки"}]},{"title":"Негативные эмоции усиливают негативное поведение","description":"Стресс, тревога и другие негативные чувства провоцируют возвращение к вредным привычкам","example":"Человек садится на диван и ест шоколад, когда ему плохо","chains":[{"cause":"Человек испытывает стресс или негативные эмоции","mechanism":"Это активирует привычку, которая помогает снизить дискомфорт","result":"Человек снова начинает делать то, что раньше снимало напряжение"},{"cause":"Человек пытается избавиться от вредной привычки, но не меняет среду","mechanism":"Стресс и негативные эмоции остаются, усиливая желание к действию","result":"Человек возвращается к нежелательной привычке"}]}]}} +- Инсайты: {"insights":[{"title":"Среда влияет на привычки больше, чем сила воли","description":"Чтобы изменить привычку, нужно изменить окружение, а не надеяться только на самоконтроль","example":"Убрать телефон с рабочего стола, чтобы не отвлекаться на соцсети"},{"title":"Привычки не исчезают, только временно подавляются","description":"Даже если человек перестаёт курить или есть сладкое, эти привычки остаются в мозге и могут вернуться при подходящих условиях","example":"После посещения бара человек снова начинает пить, не осознавая этого"},{"title":"Негативные эмоции усиливают вредное поведение","description":"Стресс, тревога и другие негативные чувства могут спровоцировать возвращение к старым привычкам","example":"После ссоры человек снова начинает есть вредную пищу, чтобы успокоиться"},{"title":"Сокращение стимулов уменьшает повторение нежелательного поведения","description":"Удаление триггеров, связанных с вредной привычкой, снижает вероятность её возобновления","example":"Убрать сигареты из дома, чтобы уменьшить вероятность их употребления"},{"title":"Самоконтроль — это временная стратегия, а не долгосрочное решение","description":"Постоянно бороться с искушением утомительно и непрочное; нужно настраивать среду так, чтобы искушений не было совсем","example":"Поставить телефон в другую комнату, чтобы не проверять соцсети во время работы"}]}} +- Применение (техники, методики): {"application":{"techniques":[{"name":"Снижение доступности стимула","goal":"Уменьшение вероятности повторения нежелательной привычки за счёт удаления её триггеров","context_example":"Вечер после работы, когда тянет залипнуть в телефон и проверять соцсети","steps":["Определите конкретный стимул (например, наличие телефона на столе)","Уберите объект из зоны видимости или досягаемости (например, оставьте телефон в другой комнате)","Запишите дату и время изменения (для отслеживания эффективности)"],"client_phrase":"Уберите источник искушения из вашей среды — действие станет менее вероятным","success_criteria":"Частота использования телефона в моменты, когда это не нужно, снижается с 5 раз/день до 1–2 раз/день за 2 недели"}]}} +- Ограничения: {"limitations":[{"description":"Идеи не работают, если триггер не устранён или остаётся доступным, так как привычка может вернуться при появлении стимула","when_relevant":"Когда человек не полностью убирает триггер из своей среды или сталкивается с ним в новой обстановке","example":"Человек удалил сигареты из дома, но снова начинает курить на работе среди коллег-курильщиков"},{"description":"Техники могут не сработать, если негативные эмоции остаются необратленными и усиливают нежелательное поведение","when_relevant":"Когда человек продолжает испытывать сильный стресс или эмоциональные трудности","example":"Человек убрал телефон из комнаты, но всё равно переедает перед сном из-за хронической тревоги"},{"description":"Изменения среды могут быть недостаточны, если привычка закреплена и не сопровождается новыми, здоровыми привычками","when_relevant":"Когда человек устраняет триггер, но не вводит альтернативное поведение","example":"Человек убрал телевизор из спальни, но не нашёл замену в виде чтения или медитации"}]}} + +Оригинальный текст главы (выдержка для контекста): В 1971 году, когда шел шестнадцатый год войны во Вьетнаме, два американских конгрессмена, Роберт Стил из Коннектикута и Морган Мерфи из Иллинойса, сделали открытие, которое потрясло американское общество. Во время посещения воинских частей они выяснили, что более 15% американских солдат во Вьетнаме имели зависимость от героина. Более поздние исследования показали, что 35% американского контингента во Вьетнаме когда-либо пробовало героин и почти 20% страдало наркотической зависимостью – то есть проблема оказалась еще серьезнее, чем им показалось вначале. Это открытие вызвало бурную активность в Вашингтоне, включая создание по распоряжению президента Ричарда Никсона Специального комитета по предупреждению злоупотреблений наркотиками. Ли Робинс был одним из исследователей комитета. Он обнаружил, что только 5% наркозависимых солдат снова начинали принимать героин в течение первого года после возвращения из реабилитационного центра и всего 12% делали это в течение трех лет. Девять солдат из десяти избавлялись от наркотической зависимости после того, как покидали Вьетнам. Это открытие противоречило представлениям наркологов того времени: героиновая зависимость считалась постоянной и необратимой болезнью. Робинс обнаружил, что зависимость может спонтанно исчезнуть в случае полной смены окружения. Во Вьетнаме солдаты находились в окружении стимулов, провоцировавших употребление героина; как только солдат возвращался в США, он оказывался в среде без этих стимулов. Как только менялся контекст, менялась и привычка. Вьетнамские исследования противоречат культурным убеждениям о дурных привычках: нездоровое поведение часто связывают с моральной слабостью. Однако исследования показывают, что «дисциплинированные» люди лучше структурируют жизнь так, чтобы не требовать героической силы воли. Люди с развитым самоконтролем, как правило, меньше всех нуждаются в его применении. Способ развить эти качества — не стать более дисциплинированным человеком, а создать более дисциплинированную среду. Привычка, закодированная в мозгу, «готова к использованию» в любой момент при соответствующей ситуации. Ученые называют это «желание, вызванное стимулом»: внешний триггер вызывает навязчивое стремление повторить привычку. Вы можете избавиться от привычки, но не способны забыть ее. Противостояние искушению — неэффективная долгосрочная стратегия. Более надежный подход — искоренение плохих привычек в их исходной точке: снизить воздействие стимула, который провоцирует привычку. Если не можете закончить работу — оставьте телефон в другой комнате. Если тянет в соцсети — прекратите просматривать профили. Уберите телевизор из спальни. Эта практика — обратная трактовка первого закона изменения поведения: сделать неочевидным то, что мешает. Самоконтроль — краткосрочная, а не долгосрочная стратегия. Секрет самоконтроля: сделать стимулы хороших привычек очевидными, а стимулы плохих привычек — незаметными. + +Допустимые теги по категориям — JSON (выбирай ТОЛЬКО из этого списка): {"principle":["среда формирует поведение","привычки не исчезают","самоконтроль краткосрочен","дисциплина через среду","негативные эмоции усиливают поведение"],"psychology":["стимул","привычка","подкрепление","желание вызванное стимулом","аутокаталитический процесс"],"method":["снижение доступности стимула","настройка среды","устранение триггеров"],"result":["уменьшение вредных привычек","устойчивое поведение","снижение искушений"],"context":["поведенческая психология","привычки","атомные привычки"]} + +**Опора при выборе тегов:** в первую очередь блоки анализа (framework, insights, application); текст главы — для проверки релевантности и калибровки confidence. + +--- + +## ЗАДАЧА + +Извлеки теги по следующим категориям. Ключи категорий в ответе — на английском (соответствуют полю `category` в БД): + +1. **principle** — по сути правила/принципа: название правила/принципа, ключевые концепции, связанные принципы. +2. **psychology** — по психологическому механизму: психологические концепции, проблемы, механизмы работы. Включай термин из списка, если он **существенно используется** в главе (объяснён, в цепочке причина–механизм–результат или в примере), а не только упомянут вскользь. +3. **method** — по методу/технике: конкретные методики, подходы, процессы. +4. **result** — по результату/цели: достигаемые результаты, цели применения. +5. **context** — по контексту книги: связь с общей концепцией книги, автор и подход, общая тематика. + +Теги должны отражать **суть** главы, а не просто упоминания. Каждый тег — релевантен содержанию. Избегай слишком общих тегов. Приоритет: качество над количеством. **Не более 5 тегов на категорию;** при равной релевантности оставляй самые важные для поиска. + +--- + +## СТРОГИЕ ПРАВИЛА + +1. Выбирай теги **только** из переданного списка (`allowed_tags_json`). В поле `tag` копируй строку **точно как в списке** — без изменения формулировки, регистра и пунктуации. +2. Если для главы нужен смысл, которого нет в списке — верни его в блоке `proposed`: объект с полями `tag`, `category` (principle | psychology | method | result | context), `reason`. Не добавляй такой тег в основные категории. +3. Один и тот же смысл — один тег; не дублируй синонимами из списка. +4. **Confidence** (0.0–1.0) калибруй так: **0.9–1.0** — тема в ядре главы (принципы, главные идеи); **0.7–0.89** — есть в главе, но второстепенно или через примеры; **0.5–0.69** — только упомянуто, без разбора. Не завышай: различай «главное» и «по касательной». +5. Не используй вводные фразы и пояснения в ответе — только JSON. + +--- + +## ФОРМАТ ОТВЕТА + +Строго один JSON-объект без комментариев и markdown: + +{ + "tags": { + "principle": [ + { "tag": "название тега из списка", "confidence": 0.95 } + ], + "psychology": [ + { "tag": "...", "confidence": 0.9 } + ], + "method": [ + { "tag": "...", "confidence": 0.85 } + ], + "result": [ + { "tag": "...", "confidence": 0.9 } + ], + "context": [ + { "tag": "...", "confidence": 0.88 } + ] + }, + "proposed": [ + { + "tag": "формулировка предлагаемого тега", + "category": "principle | psychology | method | result | context", + "reason": "краткое обоснование в 1–2 предложениях" + } + ] +} + +- Ключи в `tags` — английские, соответствуют полю `tags.category` в БД. Пустые категории — пустой массив `[]`. В каждом `tag` — строка в точности как в `allowed_tags_json`. +- Блок `proposed` — только если ни один существующий тег не подходит по смыслу; иначе пустой массив `[]`. + +Верни только этот объект — ничего до и после. diff --git a/3_извлечение_тегов/выход_tag.json b/3_извлечение_тегов/выход_tag.json new file mode 100644 index 0000000..24c4c60 --- /dev/null +++ b/3_извлечение_тегов/выход_tag.json @@ -0,0 +1,34 @@ +{ + "tags": { + "principle": [ + { "tag": "среда формирует поведение", "confidence": 0.95 }, + { "tag": "привычки не исчезают", "confidence": 0.92 }, + { "tag": "самоконтроль краткосрочен", "confidence": 0.9 }, + { "tag": "дисциплина через среду", "confidence": 0.9 }, + { "tag": "негативные эмоции усиливают поведение", "confidence": 0.85 } + ], + "psychology": [ + { "tag": "стимул", "confidence": 0.95 }, + { "tag": "привычка", "confidence": 0.95 }, + { "tag": "желание вызванное стимулом", "confidence": 0.9 }, + { "tag": "аутокаталитический процесс", "confidence": 0.85 }, + { "tag": "подкрепление", "confidence": 0.8 } + ], + "method": [ + { "tag": "снижение доступности стимула", "confidence": 0.95 }, + { "tag": "настройка среды", "confidence": 0.92 }, + { "tag": "устранение триггеров", "confidence": 0.9 } + ], + "result": [ + { "tag": "уменьшение вредных привычек", "confidence": 0.95 }, + { "tag": "устойчивое поведение", "confidence": 0.9 }, + { "tag": "снижение искушений", "confidence": 0.85 } + ], + "context": [ + { "tag": "поведенческая психология", "confidence": 0.95 }, + { "tag": "привычки", "confidence": 0.92 }, + { "tag": "атомные привычки", "confidence": 0.9 } + ] + }, + "proposed": [] + } \ No newline at end of file diff --git a/4_валидация_тегов/README.md b/4_валидация_тегов/README.md new file mode 100644 index 0000000..3cc6321 --- /dev/null +++ b/4_валидация_тегов/README.md @@ -0,0 +1,31 @@ +# Валидация тегов (шаг 4) + +Отдельный шаг пайплайна после извлечения тегов (шаг 3). Проверка релевантности каждого тега содержанию главы, соответствие каркасу/инсайтам/применению, фильтрация нерелевантных и слишком общих тегов, обновление confidence scores. + +## Промпт + +| Файл | Назначение | +|------------------|-------------------------------------------------| +| validate_tags.txt | Валидация извлечённых тегов по анализу и тексту главы | + +## Подстановки + +- `{book_title}` — название книги +- `{chapter_title}` — название главы +- `{extracted_tags_json}` — JSON из шага 3 (tags по категориям + proposed) +- `{framework}` — JSON блока framework +- `{insights}` — JSON блока insights +- `{application}` — JSON блока application +- `{chapter_text}` — выдержка текста главы (для проверки релевантности) + +## Вход + +Извлечённые теги (шаг 3) + валидированный анализ главы (framework, insights, application) + оригинальный текст главы. + +## Выход + +JSON: проверенные теги по категориям с обновлёнными confidence; теги, снятые при валидации, — в блоке `removed` (tag, category, reason). Формат `tags` совпадает с выходом шага 3 для передачи в эмбеддинг и сохранение в БД. + +## Использование + +Вызывается после шага 3 (извлечение тегов). Модель: qwen3-14b:8bit (или аналог). Время: ~20–30 сек на главу. diff --git a/4_валидация_тегов/validate_tags.txt b/4_валидация_тегов/validate_tags.txt new file mode 100644 index 0000000..579467d --- /dev/null +++ b/4_валидация_тегов/validate_tags.txt @@ -0,0 +1,67 @@ +Ты валидатор тегов главы. Цель: снять только теги без опоры в главе или анализе; теги с опорой — оставлять, при необходимости понижая confidence. Не повышай confidence — только понижай или оставляй без изменений (калибровка уже сделана на шаге 3). + +Контекст: +- Книга: "{book_title}" +- Глава: "{chapter_title}" + +Извлечённые теги (JSON из шага 3): {extracted_tags_json} + +Данные анализа (JSON-блоки): +- Каркас: {framework} +- Инсайты: {insights} +- Применение: {application} + +Оригинальный текст главы (выдержка): {chapter_text} + +--- + +## ЗАДАЧА + +Проверь каждый тег. В `removed` попадают **только** теги без опоры в главе и в анализе или противоречащие смыслу главы. + +1. **Опора в анализе:** если тег есть в анализе (framework.terms, названия принципов/инсайтов/техник, цепочки cause–mechanism–result) — **не снимать**; при необходимости только **понизить** confidence. Снимать только при отсутствии связи с главой/анализом или при противоречии. + +2. **«Слишком общий» — не повод снимать:** тег, входящий в framework (terms, principles) или в описание техник/инсайтов, не снимать как «общий»; только понизить confidence при необходимости. Снимать — только если тег реально не связан с главой или противоречит анализу. + +3. **При сомнении — оставлять:** если не уверен, снимать тег или нет — **оставлять** тег и при необходимости понизить confidence. В `removed` — только явно нерелевантные теги. + +**Confidence:** только **понижать** или оставлять без изменений; **не повышать**. Шкала для понижения: 0.7–0.89 — второстепенно; 0.5–0.69 — только упомянуто. + +--- + +## СТРОГИЕ ПРАВИЛА + +1. Не добавляй новых тегов и не меняй формулировки тегов — только оставляй/снимай и обновляй confidence. Confidence не повышай — только понижай или оставляй как во входе. +2. Снятые теги перечисляй в блоке `removed`: поля `tag`, `category` (principle | psychology | method | result | context), `reason` (кратко, почему снят). В `removed` — только теги без опоры в главе и анализе или противоречащие смыслу. +3. В `tags` сохраняй ту же структуру по категориям (ключи на английском); пустые категории — пустой массив `[]`. +4. Ответ — только JSON, без вводных фраз и пояснений. + +--- + +## ФОРМАТ ОТВЕТА + +СТРОГО один JSON-объект без комментариев и markdown: + +{ + "tags": { + "principle": [ + { "tag": "строка тега без изменений", "confidence": 0.95 } + ], + "psychology": [], + "method": [], + "result": [], + "context": [] + }, + "removed": [ + { + "tag": "формулировка снятого тега", + "category": "principle | psychology | method | result | context", + "reason": "краткая причина снятия в 1 предложении" + } + ] +} + +- Ключи в `tags` — английские (principle, psychology, method, result, context). В каждом элементе `tag` — строка в точности как во входе. +- Блок `removed` — все теги, снятые при валидации; если ничего не снято — пустой массив `[]`. + +Верни только этот объект — ничего до и после. diff --git a/4_валидация_тегов/validate_tags_filled.txt b/4_валидация_тегов/validate_tags_filled.txt new file mode 100644 index 0000000..75e935a --- /dev/null +++ b/4_валидация_тегов/validate_tags_filled.txt @@ -0,0 +1,67 @@ +Ты валидатор тегов главы. Цель: снять только теги без опоры в главе или анализе; теги с опорой — оставлять, при необходимости понижая confidence. Не повышай confidence — только понижай или оставляй без изменений (калибровка уже сделана на шаге 3). + +Контекст: +- Книга: "Атомные привычки" +- Глава: "Глава 1. Среда и привычки" + +Извлечённые теги (JSON из шага 3): {"tags":{"principle":[{"tag":"среда формирует поведение","confidence":0.95},{"tag":"привычки не исчезают","confidence":0.92},{"tag":"самоконтроль краткосрочен","confidence":0.9},{"tag":"дисциплина через среду","confidence":0.9},{"tag":"негативные эмоции усиливают поведение","confidence":0.85}],"psychology":[{"tag":"стимул","confidence":0.95},{"tag":"привычка","confidence":0.95},{"tag":"желание вызванное стимулом","confidence":0.9},{"tag":"аутокаталитический процесс","confidence":0.85},{"tag":"подкрепление","confidence":0.8}],"method":[{"tag":"снижение доступности стимула","confidence":0.95},{"tag":"настройка среды","confidence":0.92},{"tag":"устранение триггеров","confidence":0.9}],"result":[{"tag":"уменьшение вредных привычек","confidence":0.95},{"tag":"устойчивое поведение","confidence":0.9},{"tag":"снижение искушений","confidence":0.85}],"context":[{"tag":"поведенческая психология","confidence":0.95},{"tag":"привычки","confidence":0.92},{"tag":"атомные привычки","confidence":0.9}]},"proposed":[]} + +Данные анализа (JSON-блоки): +- Каркас: {"framework":{"terms":{"стимул":"что в окружающей среде заставляет человека действовать","привычка":"повторяющееся действие, которое становится автоматическим","подкрепление":"воздействие, усиливающее вероятность повторения действия","среда":"окружение, влияющее на поведение через стимулы и ограничения","желание, вызванное стимулом":"непроизвольная тяга к действию, спровоцированному внешним триггером","аутокаталитический процесс":"процесс, усиливающий себя сам"},"principles":[{"title":"Среда формирует поведение","description":"Человек не управляет привычками напрямую, а воздействует на окружение","example":"Убрать телефон с рабочего стола","chains":[{"cause":"Среда с доступными стимулами для нежелательной привычки","mechanism":"Стимул активирует привычку","result":"Человек повторяет вредную привычку"},{"cause":"Изменяется среда, удаляются стимулы","mechanism":"Отсутствие триггеров","result":"Человек реже проявляет нежелательное поведение"}]},{"title":"Привычки не исчезают, они только временно подавлены","description":"Привычка остаётся в мозге и может вернуться при подходящих условиях","example":"Перестаёт курить, но снова начинает после посещения места","chains":[{"cause":"Человек прекращает проявлять вредную привычку","mechanism":"Мозг сохраняет нейронные связи","result":"Привычка может вернуться при подходящих стимулах"}]},{"title":"Самоконтроль — краткосрочный инструмент","description":"Противостояние искушению неэффективно на длительном сроке","chains":[{"cause":"Контроль себя в момент искушения","mechanism":"Требует энергии","result":"Устаёт и возвращается к привычке"},{"cause":"Изменяет окружение","mechanism":"Стимулы для плохого становятся незаметными","result":"Реже сталкивается с искушением"}]},{"title":"Дисциплина — настройка среды","description":"Сильные люди живут в среде, которая поддерживает цели","chains":[{"cause":"Дисциплина только силой воли","mechanism":"Много энергии, часто неудачно","result":"Теряет мотивацию"},{"cause":"Настраивает окружение","mechanism":"Стимулы для правильных действий доступнее","result":"Чаще выбирает здоровые привычки"}]},{"title":"Негативные эмоции усиливают негативное поведение","description":"Стресс, тревога провоцируют возвращение к вредным привычкам","chains":[{"cause":"Стресс или негативные эмоции","mechanism":"Активирует привычку для снижения дискомфорта","result":"Снова делает то, что снимало напряжение"}]}]}} +- Инсайты: {"insights":[{"title":"Среда влияет на привычки больше, чем сила воли","description":"Изменить окружение, а не надеяться на самоконтроль","example":"Убрать телефон с рабочего стола"},{"title":"Привычки не исчезают, только временно подавляются","description":"Привычки остаются в мозге, могут вернуться","example":"После посещения бара снова начинает пить"},{"title":"Негативные эмоции усиливают вредное поведение","description":"Стресс может спровоцировать возвращение к старым привычкам"},{"title":"Сокращение стимулов уменьшает нежелательное поведение","description":"Удаление триггеров снижает вероятность возобновления"},{"title":"Самоконтроль — временная стратегия","description":"Нужно настраивать среду так, чтобы искушений не было"}]}} +- Применение: {"application":{"techniques":[{"name":"Снижение доступности стимула","goal":"Уменьшение вероятности повторения нежелательной привычки за счёт удаления триггеров","context_example":"Вечер, когда тянет залипнуть в телефон","steps":["Определите стимул","Уберите объект из зоны видимости","Запишите дату изменения"],"client_phrase":"Уберите источник искушения из среды"}]}} + +Оригинальный текст главы (выдержка): В 1971 году два американских конгрессмена выяснили, что более 15% солдат во Вьетнаме имели зависимость от героина. Ли Робинс обнаружил, что только 5% наркозависимых солдат снова начинали принимать героин в течение первого года после возвращения — девять из десяти избавлялись от зависимости после смены окружения. Зависимость может спонтанно исчезнуть при полной смене окружения: во Вьетнаме солдаты были в окружении стимулов, провоцировавших героин; в США — в среде без этих стимулов. Как только менялся контекст, менялась и привычка. Исследования показывают: «дисциплинированные» люди лучше структурируют жизнь так, чтобы не требовать героической силы воли. Люди с развитым самоконтролем меньше нуждаются в его применении. Способ развить качества — создать дисциплинированную среду. Привычка, закодированная в мозгу, «готова к использованию» при соответствующей ситуации. Ученые называют это «желание, вызванное стимулом»: внешний триггер вызывает навязчивое стремление повторить привычку. Вы можете избавиться от привычки, но не забыть ее. Противостояние искушению — неэффективная долгосрочная стратегия. Надёжный подход — искоренение плохих привычек в исходной точке: снизить воздействие стимула. Оставьте телефон в другой комнате; уберите телевизор из спальни. Обратная трактовка первого закона: сделать неочевидным то, что мешает. Самоконтроль — краткосрочная стратегия. Секрет самоконтроля: стимулы хороших привычек — очевидными, плохих — незаметными. Дурные привычки аутокаталитичны: процесс подпитывает сам себя. Подкрепление усиливает вероятность повторения действия. + +--- + +## ЗАДАЧА + +Проверь каждый тег. В `removed` попадают **только** теги без опоры в главе и в анализе или противоречащие смыслу главы. + +1. **Опора в анализе:** если тег есть в анализе (framework.terms, названия принципов/инсайтов/техник, цепочки cause–mechanism–result) — **не снимать**; при необходимости только **понизить** confidence. Снимать только при отсутствии связи с главой/анализом или при противоречии. + +2. **«Слишком общий» — не повод снимать:** тег, входящий в framework (terms, principles) или в описание техник/инсайтов, не снимать как «общий»; только понизить confidence при необходимости. Снимать — только если тег реально не связан с главой или противоречит анализу. + +3. **При сомнении — оставлять:** если не уверен, снимать тег или нет — **оставлять** тег и при необходимости понизить confidence. В `removed` — только явно нерелевантные теги. + +**Confidence:** только **понижать** или оставлять без изменений; **не повышать**. Шкала для понижения: 0.7–0.89 — второстепенно; 0.5–0.69 — только упомянуто. + +--- + +## СТРОГИЕ ПРАВИЛА + +1. Не добавляй новых тегов и не меняй формулировки тегов — только оставляй/снимай и обновляй confidence. Confidence не повышай — только понижай или оставляй как во входе. +2. Снятые теги перечисляй в блоке `removed`: поля `tag`, `category` (principle | psychology | method | result | context), `reason` (кратко, почему снят). В `removed` — только теги без опоры в главе и анализе или противоречащие смыслу. +3. В `tags` сохраняй ту же структуру по категориям (ключи на английском); пустые категории — пустой массив `[]`. +4. Ответ — только JSON, без вводных фраз и пояснений. + +--- + +## ФОРМАТ ОТВЕТА + +СТРОГО один JSON-объект без комментариев и markdown: + +{ + "tags": { + "principle": [ + { "tag": "строка тега без изменений", "confidence": 0.95 } + ], + "psychology": [], + "method": [], + "result": [], + "context": [] + }, + "removed": [ + { + "tag": "формулировка снятого тега", + "category": "principle | psychology | method | result | context", + "reason": "краткая причина снятия в 1 предложении" + } + ] +} + +- Ключи в `tags` — английские (principle, psychology, method, result, context). В каждом элементе `tag` — строка в точности как во входе. +- Блок `removed` — все теги, снятые при валидации; если ничего не снято — пустой массив `[]`. + +Верни только этот объект — ничего до и после. diff --git a/4_валидация_тегов/выход_valid_tag.json b/4_валидация_тегов/выход_valid_tag.json new file mode 100644 index 0000000..1a68eb4 --- /dev/null +++ b/4_валидация_тегов/выход_valid_tag.json @@ -0,0 +1,34 @@ +{ + "tags": { + "principle": [ + { "tag": "среда формирует поведение", "confidence": 0.95 }, + { "tag": "привычки не исчезают", "confidence": 0.92 }, + { "tag": "самоконтроль краткосрочен", "confidence": 0.9 }, + { "tag": "дисциплина через среду", "confidence": 0.9 }, + { "tag": "негативные эмоции усиливают поведение", "confidence": 0.85 } + ], + "psychology": [ + { "tag": "стимул", "confidence": 0.95 }, + { "tag": "привычка", "confidence": 0.95 }, + { "tag": "желание вызванное стимулом", "confidence": 0.9 }, + { "tag": "аутокаталитический процесс", "confidence": 0.85 }, + { "tag": "подкрепление", "confidence": 0.8 } + ], + "method": [ + { "tag": "снижение доступности стимула", "confidence": 0.95 }, + { "tag": "настройка среды", "confidence": 0.92 }, + { "tag": "устранение триггеров", "confidence": 0.9 } + ], + "result": [ + { "tag": "уменьшение вредных привычек", "confidence": 0.95 }, + { "tag": "устойчивое поведение", "confidence": 0.9 }, + { "tag": "снижение искушений", "confidence": 0.85 } + ], + "context": [ + { "tag": "поведенческая психология", "confidence": 0.95 }, + { "tag": "привычки", "confidence": 0.92 }, + { "tag": "атомные привычки", "confidence": 0.9 } + ] + }, + "removed": [] + } \ No newline at end of file diff --git a/5_мерж_анализа_и_тегов/README.md b/5_мерж_анализа_и_тегов/README.md new file mode 100644 index 0000000..353fd88 --- /dev/null +++ b/5_мерж_анализа_и_тегов/README.md @@ -0,0 +1,29 @@ +# Мерж анализа и тегов (шаг 5) + +Объединение выхода 2b (финальная валидация согласованности) и выхода 4 (валидация тегов) в один JSON. Этапы 2b и 4 разнесены по времени; шаг 5 выполняется после того, как оба результата готовы. + +## Вход + +| Источник | Файл | Содержимое | +|----------|------|------------| +| 2b | merge.json | framework, insights, application, limitations | +| 4 | выход_valid_tag.json | tags по категориям, removed | +| 1 (опционально) | вход_главы.json | book_id, chapter_id, chapter_number, chapter_title, book_title, author — для шага 7 | + +## Выход + +Один JSON: все поля анализа + `tags`, `removed`. Если задан `--input-chapter`, в выход добавляются метаданные главы/книги (book_id, chapter_id, chapter_number, chapter_title, book_title, author). Этот документ передаётся в шаг 6 (генерация эмбеддингов) и в шаг 7 (payload Qdrant). + +## Использование + +```bash +python3 merge_analysis_tags.py <выход_valid_tag.json> [--input-chapter вход_главы.json] [-o выход.json] +``` + +Пример (с метаданными для шага 7): + +```bash +python3 merge_analysis_tags.py ../2b_финальная_валидация_согласованности/merge.json ../4_валидация_тегов/выход_valid_tag.json --input-chapter ../1_анализ_главы/вход_главы.example.json -o merged_with_tags.json +``` + +Без `-o` результат выводится в stdout. diff --git a/5_мерж_анализа_и_тегов/merge_analysis_tags.py b/5_мерж_анализа_и_тегов/merge_analysis_tags.py new file mode 100644 index 0000000..d304518 --- /dev/null +++ b/5_мерж_анализа_и_тегов/merge_analysis_tags.py @@ -0,0 +1,127 @@ +#!/usr/bin/env python3 +""" +Этап 5: мерж валидированного анализа главы (2b) и валидированных тегов (4). + +Вход: + - merge.json (2b): framework, insights, application, limitations + - выход_valid_tag.json (4): tags по категориям, removed + +Выход: один JSON с анализом и тегами для передачи в шаг 6 (генерация эмбеддингов). +""" + +import argparse +import json +import sys +from pathlib import Path +from typing import Any + + +def load_json(path: Path) -> Any: + """Загружает JSON из файла.""" + with open(path, encoding="utf-8") as f: + return json.load(f) + + +CHAPTER_META_KEYS = ("book_id", "chapter_id", "chapter_number", "chapter_title", "book_title", "author", "chapter_text") + + +def merge_analysis_and_tags( + analysis: dict[str, Any], + tags_doc: dict[str, Any], + input_chapter: dict[str, Any] | None = None, +) -> dict[str, Any]: + """ + Объединяет анализ главы и валидированные теги в один документ. + + Args: + analysis: Результат 2b (framework, insights, application, limitations). + tags_doc: Результат 4 (tags по категориям, removed). + input_chapter: Опционально — вход этапа 1 (book_id, chapter_id, chapter_number, chapter_title, book_title, author). + + Returns: + Документ с полями анализа, tags, removed и при наличии — метаданными главы/книги. + """ + result = dict(analysis) + result["tags"] = tags_doc.get("tags", {}) + result["removed"] = tags_doc.get("removed", []) + if input_chapter: + for key in CHAPTER_META_KEYS: + if key in input_chapter and input_chapter[key] is not None: + result[key] = input_chapter[key] + return result + + +def main() -> int: + """Точка входа CLI.""" + parser = argparse.ArgumentParser( + description="Мерж валидированного анализа (2b) и валидированных тегов (4) в один JSON (этап 5).", + ) + parser.add_argument( + "analysis", + type=Path, + help="Путь к merge.json (выход 2b).", + ) + parser.add_argument( + "tags", + type=Path, + help="Путь к выход_valid_tag.json (выход 4).", + ) + parser.add_argument( + "--input-chapter", + type=Path, + default=None, + help="Путь к входному JSON этапа 1 (вход_главы) — book_id, chapter_id, chapter_number, chapter_title, book_title, author, chapter_text. Если задан, эти поля попадают в выход для шагов 7 и 8.", + ) + parser.add_argument( + "-o", + "--output", + type=Path, + default=None, + help="Путь к выходному JSON. По умолчанию — stdout.", + ) + parser.add_argument( + "--indent", + type=int, + default=2, + help="Отступ для форматирования JSON (по умолчанию 2).", + ) + args = parser.parse_args() + + if not args.analysis.exists(): + print(f"Ошибка: файл не найден: {args.analysis}", file=sys.stderr) + return 1 + if not args.tags.exists(): + print(f"Ошибка: файл не найден: {args.tags}", file=sys.stderr) + return 1 + + try: + analysis = load_json(args.analysis) + tags_doc = load_json(args.tags) + except json.JSONDecodeError as e: + print(f"Ошибка разбора JSON: {e}", file=sys.stderr) + return 1 + + input_chapter = None + if args.input_chapter is not None: + if not args.input_chapter.exists(): + print(f"Ошибка: файл не найден: {args.input_chapter}", file=sys.stderr) + return 1 + try: + input_chapter = load_json(args.input_chapter) + except json.JSONDecodeError as e: + print(f"Ошибка разбора input-chapter JSON: {e}", file=sys.stderr) + return 1 + + merged = merge_analysis_and_tags(analysis, tags_doc, input_chapter) + payload = json.dumps(merged, ensure_ascii=False, indent=args.indent) + + if args.output is None: + print(payload) + else: + args.output.parent.mkdir(parents=True, exist_ok=True) + args.output.write_text(payload, encoding="utf-8") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/5_мерж_анализа_и_тегов/merged_with_tags.json b/5_мерж_анализа_и_тегов/merged_with_tags.json new file mode 100644 index 0000000..a916ed5 --- /dev/null +++ b/5_мерж_анализа_и_тегов/merged_with_tags.json @@ -0,0 +1,255 @@ +{ + "framework": { + "terms": { + "стимул": "что в окружающей среде заставляет человека действовать", + "привычка": "повторяющееся действие, которое становится автоматическим", + "подкрепление": "воздействие, усиливающее вероятность повторения действия", + "среда": "окружение, влияющее на поведение через стимулы и ограничения", + "желание, вызванное стимулом": "непроизвольная тяга к действию, спровоцированному внешним триггером", + "аутокаталитический процесс": "процесс, усиливающий себя сам" + }, + "principles": [ + { + "title": "Среда формирует поведение", + "description": "Человек не управляет привычками напрямую, а воздействует на окружение, чтобы оно вело его к нужным действиям", + "example": "Убрать телефон с рабочего стола, чтобы не отвлекаться на соцсети", + "chains": [ + { + "cause": "Человек находится в среде с доступными стимулами для нежелательной привычки", + "mechanism": "Стимул активирует уже сформированную привычку, которая запускает автоматическое действие", + "result": "Человек повторяет вредную привычку, не осознавая этого" + }, + { + "cause": "Изменяется среда, удаляются стимулы, провоцирующие нежелательную привычку", + "mechanism": "Отсутствие триггеров снижает вероятность срабатывания привычки", + "result": "Человек реже проявляет нежелательное поведение" + } + ] + }, + { + "title": "Привычки не исчезают, они только временно подавлены", + "description": "Даже если человек перестаёт делать что-то, привычка остаётся в мозге и может вернуться при подходящих условиях", + "example": "Человек перестаёт курить, но снова начинает после посещения места, где раньше курил", + "chains": [ + { + "cause": "Человек прекращает проявлять вредную привычку", + "mechanism": "Мозг сохраняет нейронные связи, связанные с этой привычкой", + "result": "Привычка может вернуться, если появятся подходящие стимулы" + }, + { + "cause": "Окружение меняется, и в нем появляются триггеры, связанные с прошлой привычкой", + "mechanism": "Стимулы запускают автоматические паттерны поведения", + "result": "Человек снова начинает делать то, что уже перестал" + } + ] + }, + { + "title": "Самоконтроль — это краткосрочный, а не долгосрочный инструмент", + "description": "Противостояние искушению неэффективно на длительном сроке, нужно менять контекст", + "example": "Человек отказывается от сладкого, но возвращается к нему после стрессового дня", + "chains": [ + { + "cause": "Человек пытается контролировать себя в момент искушения", + "mechanism": "Это требует энергии и усилий, которые невозможно поддерживать всегда", + "result": "Человек устаёт от борьбы и возвращается к нежелательной привычке" + }, + { + "cause": "Человек изменяет окружение, чтобы искушения стали менее доступными", + "mechanism": "Стимулы для плохого поведения становятся незаметными или невозможными", + "result": "Человек реже сталкивается с искушением" + } + ] + }, + { + "title": "Дисциплина — это настройка среды, а не внутреннее усилие", + "description": "Сильные люди не просто дисциплинированы, а живут в среде, которая поддерживает их цели", + "example": "Человек встаёт раньше, потому что спальня тёмная и не имеет гаджетов", + "chains": [ + { + "cause": "Человек пытается быть дисциплинированным только силой воли", + "mechanism": "Это требует большого количества энергии и часто неудачно", + "result": "Человек теряет мотивацию и возвращается к нежелательному поведению" + }, + { + "cause": "Человек настраивает окружение так, чтобы хорошее поведение было лёгким", + "mechanism": "Стимулы для правильных действий становятся более доступными", + "result": "Человек чаще выбирает здоровые привычки" + } + ] + }, + { + "title": "Негативные эмоции усиливают негативное поведение", + "description": "Стресс, тревога и другие негативные чувства провоцируют возвращение к вредным привычкам", + "example": "Человек садится на диван и ест шоколад, когда ему плохо", + "chains": [ + { + "cause": "Человек испытывает стресс или негативные эмоции", + "mechanism": "Это активирует привычку, которая помогает снизить дискомфорт", + "result": "Человек снова начинает делать то, что раньше снимало напряжение" + }, + { + "cause": "Человек пытается избавиться от вредной привычки, но не меняет среду", + "mechanism": "Стресс и негативные эмоции остаются, усиливая желание к действию", + "result": "Человек возвращается к нежелательной привычке" + } + ] + } + ] + }, + "insights": [ + { + "title": "Среда влияет на привычки больше, чем сила воли", + "description": "Чтобы изменить привычку, нужно изменить окружение, а не надеяться только на самоконтроль", + "example": "Убрать телефон с рабочего стола, чтобы не отвлекаться на соцсети" + }, + { + "title": "Привычки не исчезают, только временно подавляются", + "description": "Даже если человек перестаёт курить или есть сладкое, эти привычки остаются в мозге и могут вернуться при подходящих условиях", + "example": "После посещения бара человек снова начинает пить, не осознавая этого" + }, + { + "title": "Негативные эмоции усиливают вредное поведение", + "description": "Стресс, тревога и другие негативные чувства могут спровоцировать возвращение к старым привычкам", + "example": "После ссоры человек снова начинает есть вредную пищу, чтобы успокоиться" + }, + { + "title": "Сокращение стимулов уменьшает повторение нежелательного поведения", + "description": "Удаление триггеров, связанных с вредной привычкой, снижает вероятность её возобновления", + "example": "Убрать сигареты из дома, чтобы уменьшить вероятность их употребления" + }, + { + "title": "Самоконтроль — это временная стратегия, а не долгосрочное решение", + "description": "Постоянно бороться с искушением утомительно и непрочное; нужно настраивать среду так, чтобы искушений не было совсем", + "example": "Поставить телефон в другую комнату, чтобы не проверять соцсети во время работы" + } + ], + "application": { + "techniques": [ + { + "name": "Снижение доступности стимула", + "goal": "Уменьшение вероятности повторения нежелательной привычки за счёт удаления её триггеров", + "context_example": "Вечер после работы, когда тянет залипнуть в телефон и проверять соцсети", + "steps": [ + "Определите конкретный стимул (например, наличие телефона на столе)", + "Уберите объект из зоны видимости или досягаемости (например, оставьте телефон в другой комнате)", + "Запишите дату и время изменения (для отслеживания эффективности)" + ], + "client_phrase": "Уберите источник искушения из вашей среды — действие станет менее вероятным", + "success_criteria": "Частота использования телефона в моменты, когда это не нужно, снижается с 5 раз/день до 1–2 раз/день за 2 недели" + } + ] + }, + "limitations": [ + { + "description": "Идеи не работают, если триггер (то, что в окружении запускает действие) не устранён или остаётся доступным, так как привычка может вернуться при появлении стимула", + "when_relevant": "Когда человек не полностью убирает триггер из своей среды или сталкивается с ним в новой обстановке", + "example": "Человек удалил сигареты из дома, но снова начинает курить на работе среди коллег-курильщиков" + }, + { + "description": "Техники могут не сработать, если негативные эмоции (стресс, тревога) остаются необратленными и усиливают нежелательное поведение", + "when_relevant": "Когда человек продолжает испытывать сильный стресс или эмоциональные трудности, не решая их на уровне среды", + "example": "Человек убрал телефон из комнаты, но всё равно переедает перед сном из-за хронической тревоги" + }, + { + "description": "Изменения среды могут быть недостаточны, если привычка закреплена на уровне автоматических нейронных паттернов и не сопровождается новыми, здоровыми привычками", + "when_relevant": "Когда человек устраняет триггер, но не вводит альтернативное поведение для подкрепления", + "example": "Человек убрал телевизор из спальни, но не нашёл замену в виде чтения или медитации и проводит время впустую" + } + ], + "tags": { + "principle": [ + { + "tag": "среда формирует поведение", + "confidence": 0.95 + }, + { + "tag": "привычки не исчезают", + "confidence": 0.92 + }, + { + "tag": "самоконтроль краткосрочен", + "confidence": 0.9 + }, + { + "tag": "дисциплина через среду", + "confidence": 0.9 + }, + { + "tag": "негативные эмоции усиливают поведение", + "confidence": 0.85 + } + ], + "psychology": [ + { + "tag": "стимул", + "confidence": 0.95 + }, + { + "tag": "привычка", + "confidence": 0.95 + }, + { + "tag": "желание вызванное стимулом", + "confidence": 0.9 + }, + { + "tag": "аутокаталитический процесс", + "confidence": 0.85 + }, + { + "tag": "подкрепление", + "confidence": 0.8 + } + ], + "method": [ + { + "tag": "снижение доступности стимула", + "confidence": 0.95 + }, + { + "tag": "настройка среды", + "confidence": 0.92 + }, + { + "tag": "устранение триггеров", + "confidence": 0.9 + } + ], + "result": [ + { + "tag": "уменьшение вредных привычек", + "confidence": 0.95 + }, + { + "tag": "устойчивое поведение", + "confidence": 0.9 + }, + { + "tag": "снижение искушений", + "confidence": 0.85 + } + ], + "context": [ + { + "tag": "поведенческая психология", + "confidence": 0.95 + }, + { + "tag": "привычки", + "confidence": 0.92 + }, + { + "tag": "атомные привычки", + "confidence": 0.9 + } + ] + }, + "removed": [], + "book_id": "00000000-0000-0000-0000-000000000001", + "chapter_id": "00000000-0000-0000-0000-000000000007", + "chapter_number": 7, + "chapter_title": "Секрет самоконтроля", + "book_title": "Атомные привычки", + "author": "Джеймс Клир", + "chapter_text": "В 1971 году, когда шел шестнадцатый год войны во Вьетнаме, два американских конгрессмена, Роберт Стил из Коннектикута и Морган Мерфи из Иллинойса, сделали открытие, которое потрясло американское общество. Во время посещения воинских частей они выяснили, что более 15% американских солдат во Вьетнаме имели зависимость от героина. Более поздние исследования показали, что 35% американского контингента во Вьетнаме когда-либо пробовало героин и почти 20% страдало наркотической зависимостью – то есть проблема оказалась еще серьезнее, чем им показалось вначале.Это открытие вызвало бурную активность в Вашингтоне, включая создание по распоряжению президента Ричарда Никсона Специального комитета по предупреждению злоупотреблений наркотиками, целью деятельности которого была профилактика наркомании, а также реабилитация и отслеживание судеб наркозависимых солдат после возвращения на родину.Ли Робинс был одним из исследователей комитета. В ходе исследования, результаты которого перевернули все имевшиеся представления о наркологии, он обнаружил, что только 5% наркозависимых солдат снова начинали принимать героин в течение первого года после возвращения из реабилитационного центра и всего 12% делали это в течение трех лет. Иными словами, девять солдат из десяти избавлялись от наркотической зависимости после того, как покидали Вьетнам.Это открытие полностью противоречило всем представлениям наркологов того времени, согласно которым героиновая зависимость считалась постоянной и необратимом болезнью. Однако в противоположность этим представлениям Робинс обнаружил, что эта зависимость может спонтанно исчезнуть в случае полной смены окружения. Во Вьетнаме солдаты проводили все свое время в окружении стимулов, провоцировавших употребление героина: его было просто достать, а сами они находились под воздействием постоянного стресса войны; они строили дружеские отношения с сослуживцами, которые уже принимали героин, и находились в тысяче миль от дома. Но как только солдат возвращался в США, он оказывался в среде, лишенной этих стимулов. Как только менялся контекст, менялась и привычка.Сравните эту ситуацию с ситуацией типичного наркомана. Он становится наркозависимым дома или в компании друзей, затем попадает в клинику, где проходит реабилитацию и «очищается»– при этом находясь в среде, лишенной стимулов, которые сформировали его привычку, а затем возвращается в прежнее окружение со всеми стимулами, которые уже спровоцировали наркозависимость в первый раз. Поэтому неудивительно, что обычно наблюдается огромное количество примеров, прямо противоположных тем, что мы только что видели в рамках Вьетнамской кампании. Как правило, 90% героиновых наркоманов снова становятся зависимыми после возвращения с реабилитации.Вьетнамские исследования противоречат многим нашим культурным убеждениям относительно дурных привычек, поскольку ставят под сомнение шаблонную ассоциацию нездорового поведения с моральной слабостью. Если у вас избыточный вес, вы курите или страдаете наркозависимостью, вам всю жизнь говорят, что причиной этого является недостаток самоконтроля – а иногда даже говорят, что вы плохой человек. Идея о том, что немного дисциплины способно решить все проблемы, глубоко укоренилась в нашей культуре.Однако недавние исследования свидетельствуют о прямо противоположных фактах. Когда ученые анализируют поведение людей, которые, казалось бы, обладают выдающимся самоконтролем, выясняется, что эти люди ничем не отличаются от тех, кто постоянно борется с вредными привычками. «Дисциплинированные» люди лучше справляются со структурированием своей жизни способами, которые не требуют героической силы воли и самоконтроля. Иначе говоря, они тратят меньше времени, чтобы справиться с теми или иными ситуациями.Люди с развитым самоконтролем, как правило, меньше всех нуждаются в его применении. Проще практиковать выдержку и самоконтроль, когда не приходится использовать их слишком часто. Таким образом, действительно, упорство, твердость характера и сила воли очень важны для достижения успеха, но способ развить эти качества заключается не в том, чтобы стать более дисциплинированным человеком, а в том, чтобы создать более дисциплинированную среду вокруг себя.Эта парадоксальная идея становится еще более логичной, когда вы начинаете понимать, что происходит в процессе формирования привычки в мозгу. Привычка, которая уже закодирована в нем, «готова к использованию» влюбой момент, как только наступит соответствующая ситуация. Когда Пэтти Олвэлл, врач из Остина, Техас, начала курить, она часто закуривала во время верховой прогулки со своим другом. В конце концов она перестала курить и не курила много лет. Она также перестала ездить верхом. Спустя десятилетия она снова села на лошадь и вскоре заметила, что впервые за много лет ей очень хочется курить. Стимулы все еще были актуальны, они просто не проявлялись в течение долгого времени.Если привычка укоренилась в мозгу, призыв к действию появляется каждый раз, когда возникают соответствующие стимулы во внешней среде. Это одна из причин, по которой техники по изменению поведения могут вызвать негативные последствия. Если вы будете смущать людей с избыточным весом, постоянно демонстрируя им презентации по снижению веса, то они могут ощутить стресс, и в результате большая часть из них вернется к своей излюбленной стратегии преодоления стресса – перееданию. Когда вы показываете курильщикам легкие с затемнениями, это приводит к повышению уровня тревожности, в результате чего многие люди хватаются за сигарету. Таким образом, если вы невнимательно относитесь к стимулам, то можете спровоцировать именно то поведение, которого хотите избежать.Можно сказать, что дурные привычки являются аутокаталитическими: процесс подпитывает сам себя. Они усиливают чувства, которые человек пытается подавить. Например, вы чувствуете себя плохо, и поэтому начинаете есть фастфуд. От того, что вы его едите, вы начинаете чувствовать себя плохо. Просмотр телевизора вызывает сонливость, поэтому вы смотрите его еще больше, так как вам не хватает энергии на что-то другое. Беспокойство о своем здоровье заставляет вас испытывать тревогу, которая в свою очередь вызывает желание покурить, чтобы успокоиться, но это способствует ухудшению здоровья, из-за чего ваше беспокойство в ближайшее время только усилится. Это своего рода нисходящая спираль, потерявший управление «поезд дурных привычек».Ученые называют этот феномен «желание, вызванное стимулом»: внешний триггер вызывает навязчивое стремление повторить дурную привычку. Как только вы замечаете что-то, вы начинаете хотеть этого. Это процесс происходит постоянно – часто мы даже не замечаем его. Ученые установили, что если всего на тридцать три миллисекунды показать изображение кокаина наркозависимым, это стимулирует в мозгу стремление к подкреплению и вызывает страстное желание принять наркотик. Это очень непродолжительное время, за которое мозг не успевает сознательно зарегистрировать увиденное – наркозависимые даже не смогут рассказать вам, что они видели,– и тем не менее все они одинаково захотят получить наркотик.Именно в этом заключается ключевой момент: вы можете избавиться от привычки, но не способны забыть ее. Если мыслительные паттерны, характерные для привычки, были зафиксированы в мозгу, их практически невозможно удалить полностью – даже если они не используются в течение продолжительного времени. А это значит, что простое противостояние искушению будет неэффективной стратегией. Очень сложно сохранить созерцательное и философское отношение к жизни, полной сложностей и противоречий. Это требует слишком много энергии. Поэтому в краткосрочной перспективе мы можем выбрать стратегию противостояния искушению. Однако в долгосрочной перспективе мы неизбежно становимся продуктом той среды, в которой живем. Откровенно говоря, мне ни разу не приходилось увидеть человека, последовательно приверженного хорошим привычкам в негативном окружении.Более надежным подходом будет искоренение плохих привычек в их исходной точке. Один из наиболее практичных способов устранить плохую привычку – это снизить воздействие на себя стимула, который провоцирует ее.•Если вы никак не можете закончить работу, оставьте телефон в другой комнате на несколько часов. Если вы постоянно ощущаете, что вам чего-то не хватает, прекратите просматривать профили других людей в социальных сетях – это вызывает ревность и зависть.•Если вы тратите слишком много времени на просмотр телевизора, уберите телевизор из спальни.•Если вы тратите слишком много денег на гаджеты, перестаньте читать обзоры последних технических новинок.•Если вы слишком много играете в видеоигры, после каждого использования отключайте приставку и убирайте ее в шкаф.Эта практика – не что иное, как обратная трактовка первого закона изменения поведения. Вместо того чтобы делать что-то очевидным, вы можете сделать это неочевидным. Я часто удивляюсь тому, насколько эффективными могут быть такие незначительные изменения. Уберите один-единственный стимул, и вся привычка уйдет вместе с ним.Самоконтроль – краткосрочная, а не долгосрочная стратегия. Вы можете противостоять искушению один или два раза, но не сможете каждый раз собирать волю в кулак, чтобы побеждать желания. Вместо этого лучше потратьте энергию на организацию своего окружения. В этом и заключается секрет самоконтроля. Сделайте стимулы хороших привычек очевидными, а стимулы плохих привычек – незаметными. РЕЗЮМЕ•Обратная трактовка первого закона изменения поведения звучит так: «Сделайте это неочевидным».•Когда привычка сформирована, ее практически невозможно забыть.•Люди с высокой степенью самоконтроля, как правило, тратят меньше времени, чтобы справляться со сложными ситуациями. Проще избежать искушения, чем противостоять ему.•Одним из наиболее практичных способов избавиться от плохой привычки является сокращение проявлений стимула, который вызывает ее.•Самоконтроль – это краткосрочная, а не долгосрочная стратегия." +} \ No newline at end of file diff --git a/6_генерация_эмбеддингов/README.md b/6_генерация_эмбеддингов/README.md new file mode 100644 index 0000000..bd7b17d --- /dev/null +++ b/6_генерация_эмбеддингов/README.md @@ -0,0 +1,35 @@ +# Генерация эмбеддингов (шаг 6) + +Отдельный шаг пайплайна после мержа анализа и тегов (шаг 5). В вектор превращается **валидированный анализ главы** (каркас, инсайты, применение), а не сырой текст — поиск идёт по смыслу, а не по формулировкам. + +## Модель + +- **По умолчанию:** **BAAI/bge-m3** (bge-m3). Мультиязычная модель, хорошая поддержка русского; размерность вектора **1024**, лимит контекста **8192 токенов** — полный анализ главы обычно укладывается без обрезки. Размер ~1.2GB, ~5–15 сек на главу. +- **Лимит входа:** 8192 токенов (bge-m3). При превышении — стратегия из `embed_input_spec.txt` (truncation или chunk + агрегация). +- **Альтернативы:** nomic-embed-text, evilfreelancer/enbeddrus (для более лёгкого режима). Модель задаётся конфигом; при смене — пересоздание коллекций Qdrant (размерность 1024 для bge-m3). + +## Вход + +Выход шага 5 (мерж): валидированный анализ главы (framework, insights, application) — сериализуется в текст по спецификации `embed_input_spec.txt`. Теги в вектор не входят; они хранятся в payload Qdrant для фильтрации. + +## Выход + +Вектор эмбеддинга фиксированной размерности (**1024** для bge-m3). Сохраняется в Qdrant в коллекции `chapter_analyses` (коллекция создаётся с size=1024) вместе с payload (book_id, chapter_id, validation_score, tags и т.д.). + +## Спецификация входа + +| Файл | Назначение | +|-----------------------|----------------------------------------------------------------------------| +| embed_input_spec.txt | Рецепт построения текста для эмбеддинга: какие поля, порядок, приоритет при truncation | + +## Подстановки при построении текста + +- `{framework}` — сериализованный блок framework (принципы, terms, chains) +- `{insights}` — сериализованный блок insights +- `{application}` — сериализованный блок application + +Ограничения и limitations в эмбеддинг по умолчанию не включаются (опционально — в конфиге). Теги — только в payload, не в тексте для эмбеддинга. + +## Использование + +Вызывается после шага 5 (мерж анализа и тегов). Модель задаётся конфигом (env/конфиг); смена модели не меняет формат хранения в Qdrant, при смене — пересчёт эмбеддингов по необходимости. diff --git a/6_генерация_эмбеддингов/embed_cli.py b/6_генерация_эмбеддингов/embed_cli.py new file mode 100644 index 0000000..afb6ebc --- /dev/null +++ b/6_генерация_эмбеддингов/embed_cli.py @@ -0,0 +1,231 @@ +#!/usr/bin/env python3 +""" +CLI для получения эмбеддинга по JSON шага 5 (мерж анализа и тегов). + +На вход — путь к JSON-файлу, сформированному на этапе 5 (merged_with_tags.json), +и имя модели. Текст для эмбеддинга собирается из блоков framework, insights, application +по спецификации embed_input_spec.txt. На выход — вектор. +""" + +import argparse +import json +import re +import sys +import urllib.error +import urllib.request +from pathlib import Path +from typing import Any + + +def _serialize_framework(fw: dict[str, Any]) -> str: + """Собирает текст секции FRAMEWORK из JSON блока framework.""" + parts: list[str] = [] + principles = fw.get("principles") or [] + for p in principles: + line = f"Принцип: {p.get('title', '')}. Описание: {p.get('description', '')}." + if p.get("example"): + line += f" Пример: {p['example']}." + parts.append(line) + for chain in p.get("chains") or []: + c_line = "Причина: {} Механизм: {} Результат: {}.".format( + chain.get("cause", ""), + chain.get("mechanism", ""), + chain.get("result", ""), + ) + parts.append(c_line) + terms = fw.get("terms") or {} + if terms: + terms_str = " ".join(f"{k} — {v}" for k, v in terms.items()) + parts.append(f"Термины: {terms_str}.") + return "\n".join(parts) + + +def _serialize_insights(insights: list[Any]) -> str: + """Собирает текст секции INSIGHTS.""" + parts: list[str] = [] + for i in insights: + line = f"Инсайт: {i.get('title', '')}. {i.get('description', '')}." + if i.get("example"): + line += f" Пример: {i['example']}." + parts.append(line) + return "\n".join(parts) + + +def _serialize_application(app: dict[str, Any]) -> str: + """Собирает текст секции APPLICATION из блока application.""" + parts: list[str] = [] + techniques = app.get("techniques") or [] + for t in techniques: + line = f"Техника: {t.get('name', '')}. Цель: {t.get('goal', '')}." + if t.get("steps"): + steps = t["steps"] if isinstance(t["steps"], list) else [t["steps"]] + line += f" Шаги: {'; '.join(steps)}." + if t.get("context_example"): + line += f" Контекст: {t['context_example']}." + parts.append(line) + return "\n".join(parts) + + +def merged_json_to_embed_text(merged: dict[str, Any]) -> str: + """ + Собирает текст для эмбеддинга из JSON шага 5 по embed_input_spec.txt. + + Входят только блоки framework, insights, application. Порядок секций: + FRAMEWORK, INSIGHTS, APPLICATION. + Limitations и теги не включаются: теги хранятся в payload Qdrant для фильтрации, + вектор строится по смыслу (принципы, инсайты, техники), не по тегам. + + Args: + merged: Документ из шага 5 (merge.json + выход_valid_tag.json). + + Returns: + Нормализованная строка для подачи в модель эмбеддингов. + """ + fw = merged.get("framework") or {} + insights = merged.get("insights") or [] + app = merged.get("application") or {} + + framework_text = _serialize_framework(fw) + insights_text = _serialize_insights(insights) + application_text = _serialize_application(app) + + sections = [ + "FRAMEWORK", + framework_text, + "INSIGHTS", + insights_text, + "APPLICATION", + application_text, + ] + text = "\n\n".join(sections) + # Нормализация: схлопнуть множественные пробелы и переносы, обрезать по краям + text = re.sub(r"[ \t]+", " ", text) + text = re.sub(r"\n\s*\n", "\n\n", text) + return text.strip() + + +def get_embedding( + base_url: str, + model: str, + text: str, +) -> list[float]: + """ + Запрашивает эмбеддинг текста у OpenAI-совместимого API. + + Args: + base_url: Базовый URL API (например http://localhost:1234/v1). + model: Имя модели эмбеддингов. + text: Текст для эмбеддинга. + + Returns: + Вектор эмбеддинга (список float). + + Raises: + urllib.error.HTTPError: При ошибке HTTP. + ValueError: Если в ответе нет ожидаемой структуры. + """ + url = f"{base_url.rstrip('/')}/embeddings" + payload = { + "model": model, + "input": text, + } + body = json.dumps(payload).encode("utf-8") + req = urllib.request.Request( + url, + data=body, + headers={"Content-Type": "application/json"}, + method="POST", + ) + with urllib.request.urlopen(req, timeout=120) as resp: + data: dict[str, Any] = json.loads(resp.read().decode("utf-8")) + if "data" not in data or not data["data"]: + raise ValueError("В ответе API нет поля data с эмбеддингом") + embedding = data["data"][0].get("embedding") + if not embedding: + raise ValueError("В ответе API нет поля embedding") + return list(embedding) + + +def main() -> int: + """Точка входа CLI.""" + parser = argparse.ArgumentParser( + description="Эмбеддинг по JSON шага 5 (мерж анализа и тегов). На вход — JSON-файл, на выход — вектор.", + ) + parser.add_argument( + "input_json", + type=Path, + help="Путь к JSON-файлу шага 5 (merged_with_tags.json).", + ) + parser.add_argument( + "model", + help="Имя модели эмбеддингов (например text-embedding-bge-m3).", + ) + parser.add_argument( + "--base-url", + default="http://localhost:1234/v1", + help="Базовый URL API (по умолчанию LM Studio).", + ) + parser.add_argument( + "-o", + "--output", + type=Path, + default=None, + help="Путь к файлу для записи вектора (JSON). По умолчанию — stdout.", + ) + parser.add_argument( + "--format", + choices=("json", "compact"), + default="json", + help="Формат вывода: json — массив, compact — числа через пробел.", + ) + args = parser.parse_args() + + if not args.input_json.exists(): + print(f"Ошибка: файл не найден: {args.input_json}", file=sys.stderr) + return 1 + + try: + with open(args.input_json, encoding="utf-8") as f: + merged = json.load(f) + except json.JSONDecodeError as e: + print(f"Ошибка разбора JSON: {e}", file=sys.stderr) + return 1 + + text = merged_json_to_embed_text(merged) + if not text: + print("Ошибка: текст для эмбеддинга пуст (нет framework/insights/application).", file=sys.stderr) + return 1 + + try: + vector = get_embedding(args.base_url, args.model, text) + except urllib.error.HTTPError as e: + print(f"Ошибка HTTP {e.code}: {e.reason}", file=sys.stderr) + if e.fp: + try: + body = e.fp.read().decode("utf-8") + print(body[:500], file=sys.stderr) + except Exception: + pass + return 1 + except urllib.error.URLError as e: + print(f"Ошибка запроса: {e.reason}", file=sys.stderr) + return 1 + except ValueError as e: + print(f"Ошибка: {e}", file=sys.stderr) + return 1 + + if args.format == "json": + payload = json.dumps(vector, ensure_ascii=False) + else: + payload = " ".join(str(x) for x in vector) + + if args.output is None: + print(payload) + else: + args.output.parent.mkdir(parents=True, exist_ok=True) + args.output.write_text(payload, encoding="utf-8") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/6_генерация_эмбеддингов/embed_input_spec.txt b/6_генерация_эмбеддингов/embed_input_spec.txt new file mode 100644 index 0000000..8ff7e64 --- /dev/null +++ b/6_генерация_эмбеддингов/embed_input_spec.txt @@ -0,0 +1,103 @@ +# Спецификация входа для генерации эмбеддинга главы + +Текст, который передаётся в модель эмбеддингов (по умолчанию BAAI/bge-m3), строится из **валидированного анализа главы**. Источник полей — JSON анализа по схеме из ARCHITECTURE_SUMMARY.md (блоки framework, insights, application). Цель — сохранить смысл для семантического поиска: по вектору ищут главы по смыслу (принципы, инсайты, техники), а не по сырому тексту. + +--- + +## ЧТО ВКЛЮЧАТЬ + +В текст для эмбеддинга входят **только** блоки анализа: + +1. **Framework (каркас):** принципы (title, description, example), terms (термин → краткое пояснение), при необходимости — ключевые цепочки cause–mechanism–result (кратко). + +2. **Insights (инсайты):** title, description (и при необходимости example) по каждому инсайту. Без лишних метаполей. + +3. **Application (применение):** техники — name, goal, steps (кратко или полный список), при необходимости context_example. То, по чему будет искаться «как это применить». + +**Не включать:** +- Оригинальный текст главы. +- Limitations — по умолчанию не включать (опционально через конфиг). +- Теги — хранятся в payload Qdrant, в вектор не входят. + +--- + +## ПОРЯДОК И ФОРМАТ СЕРИАЛИЗАЦИИ + +**Язык текста:** тот же, что и язык главы (или основной язык книги). Для мультиязычных коллекций — зафиксировать в конфиге (например, всегда русский / всегда язык главы). + +**Порядок секций** (приоритет при truncation — сверху вниз): + +``` +FRAMEWORK +{framework} + +INSIGHTS +{insights} + +APPLICATION +{application} +``` + +**Разделители:** +- Между секциями: заголовок секции (FRAMEWORK, INSIGHTS, APPLICATION) + пустая строка. +- Внутри секции: элементы разделять переносом строки или маркером «—»; не склеивать в один абзац. Пример: каждый принцип — с новой строки; каждый инсайт — с новой строки; каждая техника — с новой строки. + +**Формат полей:** читаемый текст с подписями («Принцип: …», «Инсайт: …», «Техника: …») или компактный структурированный текст. Избегать сырого JSON без подписей; предпочитать человекочитаемую склейку. + +**Подстановки при сборке:** +- `{framework}` — строка из JSON блока framework (принципы, terms; chains при необходимости). +- `{insights}` — строка из JSON блока insights. +- `{application}` — строка из JSON блока application. + +**Пример сериализации (фрагмент):** + +``` +FRAMEWORK + +Принцип: Правило двух минут. Описание: Если действие занимает меньше двух минут — сделай его сразу. Пример: ответ на короткий email, вынести мусор. +Термины: атомная привычка — сверхмалое действие, повторяемое ежедневно. + +INSIGHTS + +Инсайт: Привычки формируют идентичность. Мы меняемся не через цели, а через системы и повторяющиеся действия. + +APPLICATION + +Техника: Снижение барьера входа. Цель: начать действие без откладывания. Шаги: сформулировать версию привычки «на 2 минуты»; выполнять её в одно и то же время; после закрепления — расширять. +``` + +**Нормализация перед подачей в модель:** схлопнуть множественные пробелы и переносы в один; обрезать пробелы по краям строк и в начале/конце итогового текста. Это уменьшает разброс из‑за форматирования. + +--- + +## ЛИМИТ МОДЕЛИ И СТРАТЕГИЯ ПРЕВЫШЕНИЯ + +- **Лимит (bge-m3):** 8192 токенов на вход. Полный анализ главы обычно укладывается. Для других моделей — лимит указывать в конфиге. + +- **Если текст укладывается в лимит:** передать один сконкатенированный текст (FRAMEWORK + INSIGHTS + APPLICATION) в один вызов модели. + +- **Если текст длиннее лимита** — выбрать одну из стратегий (зафиксировать в конфиге): + + 1. **truncate_priority:** обрезать текст до лимита. Сохранять в порядке приоритета: сначала APPLICATION (техники важны для поиска), затем INSIGHTS, затем FRAMEWORK. Отбрасывать с конца не поместившегося блока. + + 2. **truncate_per_section:** обрезать до лимита, сохраняя начало каждой секции. Сначала поместить начало FRAMEWORK, затем начало INSIGHTS, затем начало APPLICATION, пока не исчерпается лимит. + + 3. **chunk_aggregate:** разбить текст **последовательно** (с начала к концу) на чанки по лимиту; получить вектор для каждого чанка; усреднить векторы (или другой способ агрегации) и сохранить один итоговый вектор. Способ агрегации — в конфиге. + +--- + +## ВЫХОД + +- Один вектор фиксированной размерности. Для bge-m3 — **1024**. При смене модели размерность меняется; коллекции Qdrant создавать с соответствующим size. +- Вектор сохраняется в Qdrant в коллекции `chapter_analyses`. Payload — по схеме из ARCHITECTURE_SUMMARY.md: bookId, chapterId, chapterNumber, chapterTitle, validationScore, tags и др. Текст анализа в payload при необходимости хранить отдельно или не хранить (по политике системы). + +--- + +## КОНФИГУРАЦИЯ + +- Модель эмбеддингов: env/конфиг (по умолчанию EMBED_MODEL=bge-m3). +- Лимит токенов модели: конфиг (для bge-m3: EMBED_MAX_TOKENS=8192). +- Размерность вектора: для bge-m3 — 1024; при смене модели задавать в конфиге и пересоздавать коллекции Qdrant. +- Стратегия при превышении: конфиг (truncate_priority | truncate_per_section | chunk_aggregate). +- Включение limitations в текст: опционально, конфиг (по умолчанию false). +- Язык сериализации (при мультиязычности): опционально, конфиг (например, chapter_lang | book_lang | fixed:ru). diff --git a/7_сохранение_qdrant/README.md b/7_сохранение_qdrant/README.md new file mode 100644 index 0000000..42df66a --- /dev/null +++ b/7_сохранение_qdrant/README.md @@ -0,0 +1,33 @@ +# Сохранение в Qdrant (шаг 7) + +Сохранение вектора эмбеддинга (шаг 6) и метаданных в коллекцию `chapter_analyses`. Метаданные главы/книги (book_id, chapter_id, chapter_number, chapter_title, book_title, author) берутся из merged JSON — они попадают туда на шаге 5 при мерже с `--input-chapter` (входной JSON этапа 1). + +## Вход + +- **merged JSON** (шаг 5): теги, анализ и метаданные главы/книги (book_id, chapter_id, chapter_number, chapter_title, book_title, author). Должны быть подмешаны при мерже через `--input-chapter` (вход этапа 1). +- **Вектор** (шаг 6): файл с JSON-массивом чисел или stdin. +- Опционально: `--validation-score`. + +## Выход + +Одна точка в коллекции Qdrant: id = `chapter_id`, vector = эмбеддинг, payload = bookId, chapterId, chapterNumber, chapterTitle, validationScore, tags, title, author (по схеме ARCHITECTURE_SUMMARY). + +## Использование + +```bash +# Вектор из файла (merged должен содержать book_id, chapter_id, chapter_number, chapter_title из шага 5 с --input-chapter) +python3 save_to_qdrant.py merged_with_tags.json vector.json [--validation-score 0.95] + +# Вектор из stdin (пайплайн с шагом 6) +python3 6_генерация_эмбеддингов/embed_cli.py merged_with_tags.json model_name \ + | python3 7_сохранение_qdrant/save_to_qdrant.py merged_with_tags.json - +``` + +## Переменные окружения + +| Переменная | По умолчанию | Описание | +|------------|--------------|----------| +| `QDRANT_URL` | `http://localhost:6333` | URL Qdrant | +| `QDRANT_COLLECTION_CHAPTER_ANALYSES` | `chapter_analyses` | Имя коллекции | + +В Docker используйте `QDRANT_URL=http://qdrant:6333`. diff --git a/7_сохранение_qdrant/save_to_qdrant.py b/7_сохранение_qdrant/save_to_qdrant.py new file mode 100644 index 0000000..9a3c644 --- /dev/null +++ b/7_сохранение_qdrant/save_to_qdrant.py @@ -0,0 +1,204 @@ +#!/usr/bin/env python3 +""" +Шаг 7: сохранение вектора эмбеддинга и payload в коллекцию Qdrant chapter_analyses. + +Вход: + - merged JSON (шаг 5): теги, анализ и метаданные главы/книги (book_id, chapter_id, + chapter_number, chapter_title, book_title, author — из входного JSON этапа 1, + подмешанные при мерже через --input-chapter). + - вектор (файл или stdin): результат шага 6 (embed_cli.py). + +Выход: одна точка в коллекции chapter_analyses (upsert по chapter_id). +""" + +import argparse +import json +import os +import sys +import urllib.error +import urllib.request +from pathlib import Path +from typing import Any + + +def env(name: str, default: str) -> str: + """Читает переменную окружения или default.""" + return os.environ.get(name, default).strip() + + +def tags_from_merged(merged: dict[str, Any]) -> list[dict[str, Any]]: + """Преобразует теги из merged JSON в плоский список для payload (tag, category, confidence).""" + result: list[dict[str, Any]] = [] + tags_block = merged.get("tags") or {} + for category, items in tags_block.items(): + for item in items if isinstance(items, list) else []: + if isinstance(item, dict) and "tag" in item: + result.append({ + "tag": item["tag"], + "category": category, + "confidence": item.get("confidence"), + }) + return result + + +def payload_from_merged(merged: dict[str, Any], validation_score: float | None = None) -> dict[str, Any]: + """ + Собирает payload для Qdrant из merged JSON (шаг 5). + + Ожидает в merged поля из входного JSON этапа 1: book_id, chapter_id, + chapter_number, chapter_title, book_title; опционально author. + """ + required = ("book_id", "chapter_id", "chapter_number", "chapter_title") + missing = [k for k in required if not merged.get(k)] + if missing: + raise ValueError( + f"В merged JSON отсутствуют поля (должны быть из входного JSON этапа 1, мерж с --input-chapter): {missing}" + ) + payload: dict[str, Any] = { + "bookId": merged["book_id"], + "chapterId": merged["chapter_id"], + "chapterNumber": int(merged["chapter_number"]), + "chapterTitle": merged["chapter_title"], + "tags": tags_from_merged(merged), + } + if validation_score is not None: + payload["validationScore"] = validation_score + if merged.get("book_title") is not None: + payload["title"] = merged["book_title"] + if merged.get("author") is not None: + payload["author"] = merged["author"] + return payload + + +def load_vector(path: Path | None) -> list[float]: + """Загружает вектор из файла или stdin (JSON-массив).""" + if path is None or str(path) == "-": + data = json.load(sys.stdin) + else: + with open(path, encoding="utf-8") as f: + data = json.load(f) + if not isinstance(data, list): + raise ValueError("Вектор должен быть JSON-массивом чисел") + return [float(x) for x in data] + + +def upsert_point( + base_url: str, + collection: str, + point_id: str, + vector: list[float], + payload: dict[str, Any], +) -> dict[str, Any]: + """Добавляет или обновляет одну точку в коллекции Qdrant.""" + url = f"{base_url.rstrip('/')}/collections/{collection}/points?wait=true" + body = { + "points": [ + { + "id": point_id, + "vector": vector, + "payload": payload, + } + ] + } + req_body = json.dumps(body).encode("utf-8") + req = urllib.request.Request( + url, + data=req_body, + headers={"Content-Type": "application/json"}, + method="PUT", + ) + with urllib.request.urlopen(req, timeout=30) as resp: + return json.loads(resp.read().decode("utf-8")) + + +def main() -> int: + """Точка входа CLI.""" + parser = argparse.ArgumentParser( + description="Шаг 7: сохранить вектор и payload в Qdrant (коллекция chapter_analyses).", + ) + parser.add_argument( + "merged_json", + type=Path, + help="Путь к merged JSON (шаг 5) — для тегов и др.", + ) + parser.add_argument( + "vector", + nargs="?", + default=None, + help="Путь к файлу с вектором (JSON-массив) или '-' для stdin.", + ) + parser.add_argument( + "--validation-score", + type=float, + default=None, + help="Оценка валидации (опционально).", + ) + parser.add_argument( + "--qdrant-url", + default=env("QDRANT_URL", "http://localhost:6333"), + help="URL Qdrant (по умолчанию из QDRANT_URL или localhost:6333).", + ) + parser.add_argument( + "--collection", + default=env("QDRANT_COLLECTION_CHAPTER_ANALYSES", "chapter_analyses"), + help="Имя коллекции.", + ) + args = parser.parse_args() + + if not args.merged_json.exists(): + print(f"Ошибка: файл не найден: {args.merged_json}", file=sys.stderr) + return 1 + + try: + with open(args.merged_json, encoding="utf-8") as f: + merged = json.load(f) + except json.JSONDecodeError as e: + print(f"Ошибка разбора merged JSON: {e}", file=sys.stderr) + return 1 + + try: + vector = load_vector(args.vector) + except (ValueError, FileNotFoundError) as e: + print(f"Ошибка загрузки вектора: {e}", file=sys.stderr) + return 1 + + try: + payload = payload_from_merged(merged, validation_score=args.validation_score) + except ValueError as e: + print(f"Ошибка: {e}", file=sys.stderr) + return 1 + + chapter_id = merged["chapter_id"] + + try: + result = upsert_point( + args.qdrant_url, + args.collection, + point_id=chapter_id, + vector=vector, + payload=payload, + ) + except urllib.error.HTTPError as e: + print(f"Ошибка HTTP {e.code}: {e.reason}", file=sys.stderr) + if e.fp: + try: + print(e.fp.read().decode("utf-8")[:500], file=sys.stderr) + except Exception: + pass + return 1 + except urllib.error.URLError as e: + print(f"Ошибка запроса к Qdrant: {e.reason}", file=sys.stderr) + return 1 + except Exception as e: + print(f"Ошибка: {e}", file=sys.stderr) + return 1 + + if result.get("status") == "ok": + print(f"Точка {chapter_id} сохранена в коллекцию {args.collection}.", flush=True) + return 0 + print(f"Неожиданный ответ Qdrant: {result}", file=sys.stderr) + return 1 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/8_сохранение_postgres/README.md b/8_сохранение_postgres/README.md new file mode 100644 index 0000000..92b0459 --- /dev/null +++ b/8_сохранение_postgres/README.md @@ -0,0 +1,45 @@ +# Сохранение в Postgres (шаг 8) + +Сохранение анализа главы и тегов в реляционную БД: книга, глава, запись в `chapter_analyses`, теги в `tags`, связи в `chapter_tags`. Вход — merged JSON (шаг 5) с метаданными из этапа 1. + +## Схема + +Перед первым запуском применить схему: + +```bash +psql -h localhost -U n8n -d n8n -f schema.sql +# или через docker: docker exec -i postgres psql -U n8n -d n8n < 8_сохранение_postgres/schema.sql +``` + +Таблицы: `books`, `chapters`, `chapter_analyses`, `tags`, `chapter_tags` (см. ARCHITECTURE_SUMMARY.md). + +## Вход + +- **merged JSON** (шаг 5): book_id, chapter_id, chapter_number, chapter_title, book_title, author, framework, insights, application, limitations, tags. Метаданные должны быть подмешаны через `--input-chapter` на шаге 5. + +## Действия + +1. Upsert книги (books) по book_id. +2. Upsert главы (chapters) по chapter_id. +3. Insert/update анализа в chapter_analyses (analysis_result = framework + insights + application + limitations). +4. Get-or-create тегов в tags (name, category); связи в chapter_tags (chapter_id, tag_id, confidence, validated, source='ai_validation'). + +## Использование + +```bash +pip install -r requirements.txt # один раз +python3 save_to_postgres.py 5_мерж_анализа_и_тегов/merged_with_tags.json [--validation-score 0.95] +``` + +## Переменные окружения + +| Переменная | По умолчанию | Описание | +|------------|--------------|----------| +| `DATABASE_URL` | — | Полный URL (postgresql://user:pass@host:port/dbname). Если задан, остальные игнорируются. | +| `POSTGRES_HOST` | localhost | Хост Postgres | +| `POSTGRES_PORT` | 5432 | Порт | +| `POSTGRES_USER` | n8n | Пользователь | +| `POSTGRES_PASSWORD` | n8n_password | Пароль | +| `POSTGRES_DB` | n8n | Имя БД | + +В Docker используйте `POSTGRES_HOST=postgres` (имя сервиса). diff --git a/8_сохранение_postgres/requirements.txt b/8_сохранение_postgres/requirements.txt new file mode 100644 index 0000000..b184f50 --- /dev/null +++ b/8_сохранение_postgres/requirements.txt @@ -0,0 +1 @@ +psycopg2-binary>=2.9.9 diff --git a/8_сохранение_postgres/save_to_postgres.py b/8_сохранение_postgres/save_to_postgres.py new file mode 100644 index 0000000..8fee753 --- /dev/null +++ b/8_сохранение_postgres/save_to_postgres.py @@ -0,0 +1,252 @@ +#!/usr/bin/env python3 +""" +Шаг 8: сохранение анализа главы и тегов в Postgres. + +Вход: merged JSON (шаг 5) с полями book_id, chapter_id, chapter_number, chapter_title, +book_title, author, framework, insights, application, limitations, tags. + +Действия: upsert книги и главы, запись в chapter_analyses, get-or-create тегов в tags, +связи в chapter_tags. Ожидается, что схема уже применена (schema.sql). +""" + +import argparse +import json +import os +import sys +import uuid +from pathlib import Path +from typing import Any + +try: + import psycopg2 +except ImportError: + print("Ошибка: установите psycopg2-binary (pip install psycopg2-binary).", file=sys.stderr) + sys.exit(1) + + +def env(name: str, default: str) -> str: + """Читает переменную окружения или default.""" + return os.environ.get(name, default).strip() + + +def get_connection(database_url: str | None = None): + """Создаёт подключение к Postgres.""" + if database_url: + return psycopg2.connect(database_url) + host = env("POSTGRES_HOST", "localhost") + port = env("POSTGRES_PORT", "5432") + user = env("POSTGRES_USER", "n8n") + password = env("POSTGRES_PASSWORD", "n8n_password") + dbname = env("POSTGRES_DB", "n8n") + return psycopg2.connect( + host=host, + port=port, + user=user, + password=password, + dbname=dbname, + ) + + +def upsert_book(conn, book_id: str, title: str | None, author: str | None) -> None: + """Вставка или обновление книги.""" + with conn.cursor() as cur: + cur.execute( + """ + INSERT INTO books (id, title, author, updated_at) + VALUES (%s, %s, %s, NOW()) + ON CONFLICT (id) DO UPDATE SET + title = COALESCE(EXCLUDED.title, books.title), + author = COALESCE(EXCLUDED.author, books.author), + updated_at = NOW() + """, + (book_id, title or "", author or ""), + ) + + +def upsert_chapter( + conn, + chapter_id: str, + book_id: str, + chapter_number: int, + chapter_title: str | None, + content: str | None = None, +) -> None: + """Вставка или обновление главы.""" + with conn.cursor() as cur: + cur.execute( + """ + INSERT INTO chapters (id, book_id, chapter_number, chapter_title, content) + VALUES (%s, %s, %s, %s, %s) + ON CONFLICT (id) DO UPDATE SET + book_id = EXCLUDED.book_id, + chapter_number = EXCLUDED.chapter_number, + chapter_title = COALESCE(EXCLUDED.chapter_title, chapters.chapter_title), + content = COALESCE(EXCLUDED.content, chapters.content) + """, + (chapter_id, book_id, chapter_number, chapter_title or "", content), + ) + + +def upsert_chapter_analysis( + conn, + chapter_id: str, + analysis_result: dict[str, Any], + validation_score: float | None = None, +) -> None: + """Вставка или обновление анализа главы.""" + with conn.cursor() as cur: + cur.execute( + """ + INSERT INTO chapter_analyses (chapter_id, analysis_result, validation_score, validated_at) + VALUES (%s, %s, %s, NOW()) + ON CONFLICT (chapter_id) DO UPDATE SET + analysis_result = EXCLUDED.analysis_result, + validation_score = COALESCE(EXCLUDED.validation_score, chapter_analyses.validation_score), + validated_at = NOW() + """, + (chapter_id, json.dumps(analysis_result, ensure_ascii=False), validation_score), + ) + + +def get_or_create_tag(conn, name: str, category: str) -> str: + """Возвращает id тега по имени; создаёт тег при отсутствии.""" + with conn.cursor() as cur: + cur.execute("SELECT id FROM tags WHERE name = %s", (name,)) + row = cur.fetchone() + if row: + return str(row[0]) + tag_id = str(uuid.uuid4()) + cur.execute( + "INSERT INTO tags (id, name, category) VALUES (%s, %s, %s)", + (tag_id, name, category), + ) + return tag_id + + +def upsert_chapter_tags( + conn, + chapter_id: str, + tags_flat: list[tuple[str, str, float | None]], +) -> None: + """Связывает главу с тегами (get-or-create тегов, вставка в chapter_tags).""" + with conn.cursor() as cur: + for name, category, confidence in tags_flat: + tag_id = get_or_create_tag(conn, name, category) + cur.execute( + """ + INSERT INTO chapter_tags (chapter_id, tag_id, confidence, validated, source) + VALUES (%s, %s, %s, true, 'ai_validation') + ON CONFLICT (chapter_id, tag_id) DO UPDATE SET + confidence = EXCLUDED.confidence, + validated = true + """, + (chapter_id, tag_id, confidence), + ) + + +def tags_from_merged(merged: dict[str, Any]) -> list[tuple[str, str, float | None]]: + """(name, category, confidence) из merged JSON.""" + result: list[tuple[str, str, float | None]] = [] + for category, items in (merged.get("tags") or {}).items(): + for item in items if isinstance(items, list) else []: + if isinstance(item, dict) and "tag" in item: + result.append(( + item["tag"], + category, + item.get("confidence"), + )) + return result + + +def analysis_result_from_merged(merged: dict[str, Any]) -> dict[str, Any]: + """Блок для chapter_analyses.analysis_result (framework, insights, application, limitations).""" + return { + "framework": merged.get("framework"), + "insights": merged.get("insights"), + "application": merged.get("application"), + "limitations": merged.get("limitations"), + } + + +def main() -> int: + parser = argparse.ArgumentParser( + description="Шаг 8: сохранить анализ и теги в Postgres (merged JSON → books, chapters, chapter_analyses, tags, chapter_tags).", + ) + parser.add_argument( + "merged_json", + type=Path, + help="Путь к merged JSON (шаг 5).", + ) + parser.add_argument( + "--validation-score", + type=float, + default=None, + help="Оценка валидации (опционально).", + ) + parser.add_argument( + "--database-url", + default=env("DATABASE_URL", ""), + help="URL подключения к Postgres (или POSTGRES_HOST/USER/PASSWORD/DB).", + ) + args = parser.parse_args() + + if not args.merged_json.exists(): + print(f"Ошибка: файл не найден: {args.merged_json}", file=sys.stderr) + return 1 + + try: + with open(args.merged_json, encoding="utf-8") as f: + merged = json.load(f) + except json.JSONDecodeError as e: + print(f"Ошибка разбора JSON: {e}", file=sys.stderr) + return 1 + + required = ("book_id", "chapter_id", "chapter_number", "chapter_title") + missing = [k for k in required if not merged.get(k)] + if missing: + print(f"Ошибка: в merged нет полей (нужен мерж с --input-chapter): {missing}", file=sys.stderr) + return 1 + + database_url = args.database_url or None + try: + conn = get_connection(database_url) + except Exception as e: + print(f"Ошибка подключения к Postgres: {e}", file=sys.stderr) + return 1 + + try: + upsert_book( + conn, + merged["book_id"], + merged.get("book_title"), + merged.get("author"), + ) + upsert_chapter( + conn, + merged["chapter_id"], + merged["book_id"], + int(merged["chapter_number"]), + merged.get("chapter_title"), + merged.get("chapter_text"), # если подмешали в мерж + ) + upsert_chapter_analysis( + conn, + merged["chapter_id"], + analysis_result_from_merged(merged), + args.validation_score, + ) + upsert_chapter_tags(conn, merged["chapter_id"], tags_from_merged(merged)) + conn.commit() + except Exception as e: + conn.rollback() + print(f"Ошибка: {e}", file=sys.stderr) + return 1 + finally: + conn.close() + + print(f"Глава {merged['chapter_id']} сохранена в Postgres (books, chapters, chapter_analyses, tags, chapter_tags).", flush=True) + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/8_сохранение_postgres/schema.sql b/8_сохранение_postgres/schema.sql new file mode 100644 index 0000000..b820d3f --- /dev/null +++ b/8_сохранение_postgres/schema.sql @@ -0,0 +1,56 @@ +-- Минимальная схема для этапа 8: книги, главы, анализы глав, теги, связи глава–тег. +-- Запускать один раз (например: psql -f schema.sql или через скрипт инициализации). + +CREATE EXTENSION IF NOT EXISTS "pgcrypto"; + +CREATE TABLE IF NOT EXISTS books ( + id UUID PRIMARY KEY, + title VARCHAR(1024), + author VARCHAR(512), + metadata JSONB, + created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(), + updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() +); + +CREATE TABLE IF NOT EXISTS chapters ( + id UUID PRIMARY KEY, + book_id UUID NOT NULL REFERENCES books(id) ON DELETE CASCADE, + chapter_number INTEGER NOT NULL, + chapter_title VARCHAR(1024), + content TEXT, + created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() +); + +CREATE TABLE IF NOT EXISTS chapter_analyses ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + chapter_id UUID NOT NULL UNIQUE REFERENCES chapters(id) ON DELETE CASCADE, + analysis_result JSONB NOT NULL, + validation_score FLOAT, + validated_at TIMESTAMP WITH TIME ZONE, + created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() +); + +CREATE TABLE IF NOT EXISTS tags ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + name VARCHAR(512) NOT NULL UNIQUE, + category VARCHAR(64), + description TEXT, + created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() +); + +CREATE TABLE IF NOT EXISTS chapter_tags ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + chapter_id UUID NOT NULL REFERENCES chapters(id) ON DELETE CASCADE, + tag_id UUID NOT NULL REFERENCES tags(id) ON DELETE CASCADE, + confidence FLOAT, + validated BOOLEAN DEFAULT true, + source VARCHAR(64) DEFAULT 'ai_validation', + created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(), + UNIQUE (chapter_id, tag_id) +); + +CREATE INDEX IF NOT EXISTS idx_chapters_book_id ON chapters(book_id); +CREATE INDEX IF NOT EXISTS idx_chapter_analyses_chapter_id ON chapter_analyses(chapter_id); +CREATE INDEX IF NOT EXISTS idx_chapter_tags_chapter_id ON chapter_tags(chapter_id); +CREATE INDEX IF NOT EXISTS idx_chapter_tags_tag_id ON chapter_tags(tag_id); +CREATE INDEX IF NOT EXISTS idx_tags_category ON tags(category); diff --git a/ARCHITECTURE_SUMMARY.md b/ARCHITECTURE_SUMMARY.md new file mode 100644 index 0000000..3754bfd --- /dev/null +++ b/ARCHITECTURE_SUMMARY.md @@ -0,0 +1,1377 @@ +# Архитектура системы обработки книг через ИИ + +## Содержание + +1. [Введение и обзор](#введение-и-обзор) +2. [Архитектура системы](#архитектура-системы) +3. [Пайплайн обработки](#пайплайн-обработки) +4. [Модели ИИ и Ollama](#модели-ии-и-ollama) +5. [Хранение данных](#хранение-данных) +6. [Функциональность системы](#функциональность-системы) +7. [Операционные аспекты](#операционные-аспекты) +8. [Приложения](#приложения) +9. [Актуализация по каталогам этапов](#актуализация-по-каталогам-этапов) + +--- + +## Введение и обзор + +### Назначение системы + +Система обрабатывает EPUB файлы, переводит их в JSON с главами, анализирует каждую главу через ИИ, валидирует результаты, создает эмбеддинги и сохраняет в Qdrant. На основе анализа глав генерируются коуч-планы для освоения навыков из книг с детализацией техник и методик. **Цель** — не только извлечь информацию, но и научиться применять знания в жизни: техники выводятся из инсайтов при необходимости, при сборке плана дубли сводятся в уникальные практики, отдельно формируется план применения (когда/где/как применять). + +### Основной поток обработки + +``` +EPUB → JSON с главами → Анализ по блокам (framework → insights → application → limitations) + → Валидация каждого блока → Склейка → Финальная валидация согласованности → +→ Извлечение тегов → Валидация тегов → Мерж анализа и тегов (5) → Генерация эмбеддингов (6) → +→ Сохранение в Qdrant/Postgres → Генерация коуч-плана → Сохранение плана +``` + +--- + +## Архитектура системы + +### Компоненты системы + +1. **epub-parser** (FastAPI) - парсинг EPUB в JSON +2. **chapter-processor** (новый сервис) - обработка глав + - FastAPI - API слой (прием запросов, постановка задач в очередь) + - Celery/RQ Workers - пайплайн обработки (анализ, валидация, эмбеддинг) +3. **Redis** - очередь задач и кэширование +4. **Ollama** - LLM для анализа и валидации +5. **Qdrant** - векторная БД для эмбеддингов +6. **Postgres** - реляционная БД для структурированных данных (книги, главы, анализы, коуч-планы) + +### Разделение ответственности + +**FastAPI:** +- Принимает запросы на обработку книги +- Ставит задачи в очередь (Redis) +- Возвращает task_id и статус +- НЕ выполняет долгие операции + +**Воркеры (Celery/RQ):** +- Забирают задачи из очереди +- Выполняют весь пайплайн обработки +- Работают асинхронно, не блокируют API + +--- + +## Пайплайн обработки + +### Концепция: максимум пользы из книги + +**Цель системы** — не просто извлечь информацию, а научиться применять знания из книги в жизни. Многие главы (особенно в книгах вроде «Чёрный лебедь») содержат много инсайтов и мало явных техник. Поэтому: + +- **Техника** — повторяемое правило: «в ситуации X делай Y». **Инсайт** — понимание («вот в чём ловушка», «вот что мы переоцениваем»). Из инсайтов можно и нужно выводить техники: формулировать операциональные правила. +- **При извлечении (блок application):** извлекать все значимые техники; одну и ту же идею в разных формулировках считать одной техникой; для глав с преобладанием инсайтов — формулировать применимые техники из инсайтов (когда/в какой ситуации что делать). +- **При сборке плана по книге:** объединять повторяющиеся техники из разных глав в одну формулировку. Итог — короткий набор уникальных практик (если вся книга сводится к 1–2 техникам — это успех, а не провал). +- **План применения в жизни** — отдельный результат: в каких ситуациях какую технику применять, с какой периодичностью, как встроить в рутину. Генерируется на основе собранных техник и их применимости. + +**Применимость (смыслы):** для каждой техники полезно извлекать: в каких ситуациях полезна, для каких целей применима. Это может быть отдельный проход ИИ (по главе или по книге) или часть блока application / этапа генерации коуч-плана. + +### Этапы обработки (с lazy loading) + +**Подход: анализ и валидация по блокам** +Цель — качество и согласованность. Анализ главы разбит на 4 блока (framework, insights, application, limitations). Генерация блоков — последовательно; после каждого блока — валидация по блоку; затем склейка и финальная валидация согласованности всего анализа. + +#### 1. Анализ главы по блокам (qwen3-14b:8bit) + +- **Вход этапа 1:** один JSON на главу с полями `book_id`, `chapter_id`, `chapter_number`, `chapter_title`, `book_title`, `chapter_text`, опционально `author`. Спецификация и пример: `1_анализ_главы/вход_главы.spec.json`, `вход_главы.example.json`. Метаданные передаются по пайплайну до шага 7 (payload в Qdrant). +- **Порядок генерации:** framework → insights → application → limitations (последовательно). Подробнее: `1_анализ_главы/README.md`. +- **Вход каждого шага:** текст главы + **весь накопленный JSON** (все уже завалидированные предыдущие блоки), а не только последний блок. Подстановки в промптах: `{book_title}`, `{chapter_title}`, `{chapter_text}`; в шагах 2–4 дополнительно `{previous_blocks_json}` — накопленный JSON предыдущих блоков. +- **Промпты по блокам:** `extract_framework_v2.txt` → `extract_insights_v3.txt` → `extract_application_v2.txt` → `extract_limitations_v3.txt` (каталог `1_анализ_главы/`). +- **Блок framework (каркас):** извлекаются фундаментальные принципы и опорные идеи автора. Для каждого принципа — цепочки cause → mechanism → result; глоссарий специальных терминов главы (`terms`: термин → пояснение в 3–7 слов); у каждого принципа — поле `example` (один бытовой пример). Один принцип = одна опорная мысль, перекрывающиеся идеи объединяются. Выход — JSON с единственным ключом верхнего уровня `"framework"`. +- **Блок application (применение):** извлекать все значимые техники без раздувания списка: одну и ту же идею — одной техникой. Если в главе много инсайтов и мало явных «шагов» — выводить техники из инсайтов (операциональные правила: когда/что делать). Опционально для каждой техники: ситуации применения, цели (для чего полезна). +- **Отдельный промпт на каждый блок** — модель решает одну задачу за раз, меньше пропусков и галлюцинаций. +- **Выход шага:** JSON одного блока. После генерации блока — сразу валидация этого блока (см. п. 2). +- Модель: загрузить → N вызовов по цепочке → выгрузить (`keep_alive: 0`). +- Время: суммарно ~2–5+ минут на главу (4 блока последовательно). +- Память: ~20–21GB максимум (модель + контекст). + +#### 2. Валидация каждого блока (qwen3-14b:8bit) + +- **После генерации блока** — сразу валидация: соответствие тексту главы, галлюцинации, пропуски. Проверяется только этот блок: на вход валидатора подаётся **только JSON этого блока** + текст главы (не весь анализ). Подробнее: `2_валидация_анализа_по_блокам/README.md`. +- **Промпты:** `validate_framework.txt`, `validate_insights.txt`, `validate_application.txt`, `validate_limitations.txt` (каталог `2_валидация_анализа_по_блокам/`). Подстановки: `{book_title}`, `{chapter_title}`, `{chapter_text}` и соответствующий `{framework_json}` / `{insights_json}` / `{application_json}` / `{limitations_json}`. В блоке application проверяются техники (name, goal, steps). +- **При вердикте bad:** один retry того же блока с тем же контекстом. Если снова bad — флаг `needs_review` по главе, дальнейшая обработка по политике (останов или продолжение). +- **Выход:** завалидированный блок (или флаг `needs_review`). +- Время: ~30 секунд на блок. +- Память: ~3.5–4.5GB максимум (модель + контекст). + +#### 2a. Склейка блоков + +- Объединение четырёх JSON (framework, insights, application, limitations) в один анализ. **Без вызова LLM** — только слияние структур. + +#### 2b. Финальная валидация (согласованность всего анализа) + +- **Промпт:** `validate_consistency.txt` (каталог `2b_финальная_валидация_согласованности/`). Подстановки: `{book_title}`, `{chapter_title}`, `{full_analysis_json}`. Подробнее: `2b_финальная_валидация_согласованности/README.md`. +- **Назначение:** проверка **только связей между блоками** (техники опираются на принципы, инсайты не противоречат framework, ограничения относятся к описанному). Перепроверка «каждое слово по тексту» не выполняется — она уже сделана по блокам. +- **При рассогласованности:** флаг `needs_review` и сохранение как есть; опционально — «примиряющий» промпт (минимальные правки для согласованности), если таких кейсов много. +- Модель: qwen3-14b:8bit. Время: ~30–60 секунд. + +#### 3. Извлечение тегов (qwen3-14b:8bit) + +- **Промпт:** `extract_tags.txt` (каталог `3_извлечение_тегов/`). Подстановки: `{book_title}`, `{chapter_title}`, `{framework}`, `{insights}`, `{application}`, `{limitations}` (опционально), `{chapter_text}`, `{allowed_tags_json}` — актуальный список допустимых тегов из БД. Подробнее: `3_извлечение_тегов/README.md`. +- Вход: валидированный анализ главы (все блоки) + оригинальный текст главы + словарь допустимых тегов. +- Выход: JSON с тегами по категориям (`principle`, `psychology`, `method`, `result`, `context`) и confidence для каждого; при необходимости кандидаты в `proposed` с полем `category`. +- Время: ~1–2 минуты на главу. Память: ~20–21GB максимум (модель + контекст). +- **Преимущество отдельного шага:** ИИ использует уже структурированные данные (каркас, инсайты, применение) для более точного понимания сути. + +#### 4. Валидация тегов (qwen3-14b:8bit) + +- **Промпт:** `validate_tags.txt` (каталог `4_валидация_тегов/`). Подстановки: `{book_title}`, `{chapter_title}`, `{extracted_tags_json}`, `{framework}`, `{insights}`, `{application}`, `{chapter_text}`. Подробнее: `4_валидация_тегов/README.md`. +- Вход: извлечённые теги (шаг 3) + валидированный анализ главы + оригинальный текст главы. +- Выход: JSON — проверенные теги по категориям с обновлёнными confidence; теги, снятые при валидации, — в блоке `removed` (tag, category, reason). Формат `tags` совпадает с выходом шага 3 для передачи в мерж (шаг 5) и далее в эмбеддинг/БД. +- Время: ~20–30 секунд. Память: ~3.5–4.5GB максимум (модель + контекст). + +#### 5. Мерж анализа и тегов (без LLM) + +- **Назначение:** объединение выхода 2b (финальная валидация согласованности) и выхода 4 (валидация тегов) в один JSON. Этапы 2b и 4 разнесены по времени; шаг 5 выполняется после того, как оба результата готовы. +- **Вход:** merge.json (2b): framework, insights, application, limitations; выход_valid_tag.json (4): tags по категориям, removed. +- **Выход:** один JSON с полями анализа и тегами для передачи в шаг 6 (генерация эмбеддингов). Подробнее: `5_мерж_анализа_и_тегов/README.md`. +- Без вызова LLM — только слияние структур (скрипт merge_analysis_tags.py). + +#### 6. Генерация эмбеддингов (BAAI/bge-m3) + +- **Спецификация входа:** `6_генерация_эмбеддингов/embed_input_spec.txt`. В текст для эмбеддинга входят только блоки framework, insights, application (сериализованные); limitations и теги — опционально/в payload. Подробнее: `6_генерация_эмбеддингов/README.md`. +- **Что эмбеддим:** валидированный анализ главы (каркас, инсайты, применение), а не сырой текст. Теги в вектор не входят; хранятся в payload Qdrant для фильтрации. Поиск идёт по смыслу, а не по формулировкам — это целевой выбор архитектуры. +- **Модель по умолчанию:** **BAAI/bge-m3** (bge-m3). Мультиязычная модель, хорошая поддержка русского; размерность вектора **1024**, лимит контекста **8192 токенов** — полный анализ главы обычно укладывается без обрезки. Размер модели ~1.2GB, время ~5–15 сек на главу. +- **Альтернативы:** при необходимости более лёгкой модели — nomic-embed-text (~0.5GB, 512 токенов), evilfreelancer/enbeddrus (337MB, 512 токенов, заточена под en/ru). Выбор модели — конфигурация (env/конфиг). +- **Длина входа:** у bge-m3 лимит 8192 токенов. Если текст для эмбеддинга длиннее — явное правило: truncation до лимита (приоритет полей — см. embed_input_spec.txt) или разбиение на чанки с агрегацией векторов. Лимит и стратегию задавать в конфиге. +- **Смена модели:** архитектура допускает замену модели эмбеддингов без смены формата входа; размерность вектора и коллекции Qdrant зависят от модели (bge-m3 → 1024). При смене модели — пересоздание коллекций/пересчёт эмбеддингов. +- Выход: вектор размерности 1024. Память: ~1.2GB (bge-m3). + +#### 7. Сохранение в Qdrant +- **Скрипт:** `7_сохранение_qdrant/save_to_qdrant.py`. Вход: merged JSON (шаг 5), вектор (шаг 6), метаданные главы/книги (book_id, chapter_id, chapter_number, chapter_title и др.). Upsert точки в коллекцию `chapter_analyses` (id = chapter_id). +- Связь с главой через `chapter_id` (id точки в Qdrant). +- Payload: `bookId`, `chapterId`, `chapterNumber`, `chapterTitle`, `validationScore`, `tags`, `title`, `author`. Теги из merged JSON — в payload для фильтрации. + +#### 8. Сохранение в Postgres +- **Скрипт:** `8_сохранение_postgres/save_to_postgres.py`. Вход: merged JSON (шаг 5) с метаданными из этапа 1. Схема: `8_сохранение_postgres/schema.sql` (books, chapters, chapter_analyses, tags, chapter_tags). +- Upsert книги (books) и главы (chapters), запись в `chapter_analyses` (analysis_result = framework + insights + application + limitations), get-or-create тегов в `tags`, связи в `chapter_tags` (confidence, validated, source='ai_validation'). +- Подключение: DATABASE_URL или POSTGRES_HOST/USER/PASSWORD/DB. Подробнее: `8_сохранение_postgres/README.md`. + +#### 9. Генерация коуч-плана (после обработки всех глав книги) + +- Анализ всех глав → выделение навыков → группировка → пункты плана → поиск техник по книге (семантический поиск) → связи с главами → агрегация концепций → сведение техник → применимость → план применения в жизни (см. раздел «Генерация коуч-планов»). +- **Ограничение контекста:** для длинных книг (30+ глав) не передавать в один вызов LLM все анализы целиком — не влезет в контекст или синтез будет поверхностным. Использовать: сжатые выжимки по главам (каркас + ключевые инсайты + список техник), или поэтапную агрегацию (сначала синтез по частям книги, затем финальный проход по агрегатам), или явный лимит (например, топ-N глав по релевантности). Стратегию зафиксировать в конфиге/документации. +- **Качество плана = качество анализов глав.** Если в блоках application по главам мало техник или они слабо выведены из инсайтов, план будет бедным. Перед генерацией плана опционально проверять «плотность» применения по книге; при необходимости — дообогащать application (повторный проход по слабым главам). + +### Оптимизация памяти + +**Lazy loading моделей:** +- Не держать все модели в памяти одновременно +- Загружать модель перед использованием +- Выгружать через `keep_alive: 0` после обработки +- Экономия: одна модель (qwen3-14b:8bit) загружается только на время этапа, затем выгружается + +**Оптимизация промптов:** +- Минимальные системные промпты (~200-300 токенов вместо 1000-2000) +- Экономия контекста: ~1500-1700 токенов +- Больше места для текста главы при том же `OLLAMA_NUM_CTX` + +**Последовательная обработка:** +- Одна глава за раз +- Одна модель за раз в памяти +- Максимальное использование памяти: ~20-21GB (влезет в 30GB) + +### Обработка ошибок + +- **Retry логика**: экспоненциальный backoff при ошибках +- **Dead letter queue**: для проблемных глав +- **Circuit breaker**: для LLM вызовов +- **Graceful degradation**: при падении валидатора - сохранять с флагом `needs_review` + +--- + +## Модели ИИ и Ollama + +### Конфигурация моделей + +- **qwen3-14b:8bit** → анализ глав по блокам (шаг 1), валидация блоков (шаг 2), финальная валидация согласованности (шаг 2b), извлечение тегов (шаг 3), валидация тегов (шаг 4). Одна модель для всего пайплайна LLM; загружается по требованию, выгружается через `keep_alive: 0` после этапа. +- **bge-m3** (BAAI/bge-m3) → генерация эмбеддингов (шаг 6, по умолчанию). Мультиязычная модель, хорошая поддержка русского; размерность 1024, контекст 8192 токенов. Модель задаётся конфигом; при смене — пересоздание коллекций Qdrant и пересчёт эмбеддингов по необходимости. + +### Использование памяти + +- `qwen3-14b:8bit`: ~20–21GB максимум (модель + контекст при анализе); ~3.5–4.5GB при валидации (меньший контекст). +- `bge-m3`: ~1.2GB +- **Итого при одновременной загрузке**: ~24–32GB (если бы все модели были в памяти) +- **С lazy loading**: ~20–21GB максимум (одна модель за раз: анализ или валидация) + +### API эндпоинты Ollama + +- `POST http://ollama:11434/api/chat` - для анализа (рекомендуется) +- `POST http://ollama:11434/api/generate` - для простой генерации +- `GET http://ollama:11434/api/tags` - проверка доступных моделей + +### Структура запроса + +```json +{ + "model": "qwen3-14b:8bit", + "messages": [ + {"role": "system", "content": "Промпт для анализа"}, + {"role": "user", "content": "Текст главы..."} + ], + "stream": false, + "format": "json" +} +``` + +### Особенности работы с Ollama + +- **Таймауты**: длинные запросы могут занимать минуты (устанавливать 5-10 минут) +- **Streaming**: для длинных ответов использовать `stream: true` +- **JSON формат**: использовать `format: "json"` для структурированных ответов +- **Контекст**: настраивается через `OLLAMA_NUM_CTX` +- **Выгрузка моделей**: через параметр `keep_alive: 0` в запросах + - `keep_alive: 0` - выгрузить сразу после запроса + - `keep_alive: "5m"` - держать 5 минут (по умолчанию) + - Автоматическая выгрузка через 5 минут неактивности + +### Настройки Ollama + +#### Рекомендуемые параметры (для 30GB RAM) + +```yaml +ollama: + environment: + - OLLAMA_NUM_CTX=12000-13000 # Оптимальный компромисс + - OLLAMA_NUM_THREAD=8 # По количеству ядер CPU + - OLLAMA_NUM_PARALLEL=1 # Последовательная обработка (экономия памяти) +``` + +#### Ограничения контекста + +**При 30GB RAM с lazy loading:** +- `qwen3-14b:8bit`: оптимально 12000–13000 токенов (даёт ~10000–11000 для текста главы) +- **Эмбеддинги:** bge-m3 — 8192 токенов на вход, размерность 1024. Текст для эмбеддинга — сериализованный анализ главы; при превышении лимита — truncation или стратегия из embed_input_spec.txt (см. этап 6 пайплайна). + +**Анализ книг:** +- Самая большая глава: 11,119 токенов ("Атомные привычки", глава 5) +- Все главы влезают в контекст 12000-13000 токенов +- С оптимизированными промптами (~200-300 токенов) остается достаточно места + +**Для 20000 токенов контекста:** +- Требуется минимум 48-64GB RAM +- GPU не решает проблему памяти, только ускоряет обработку +- Приоритет: увеличить RAM, GPU опционально для ускорения + +### Управление моделями в Ollama + +**Выгрузка модели:** +```bash +# Через /api/generate +curl http://localhost:11434/api/generate -d '{ + "model": "qwen3-14b:8bit", + "prompt": "", + "keep_alive": 0 +}' + +# Через /api/chat +curl http://localhost:11434/api/chat -d '{ + "model": "qwen3-14b:8bit", + "messages": [], + "keep_alive": 0 +}' +``` + +**Проверка загруженных моделей:** +```bash +ollama ps +``` + +--- + +## Хранение данных + +### Распределение данных по БД + +**Postgres (структурированные данные):** +- Книги, главы, анализы, коуч-планы, связи +- Полный оригинальный текст глав +- JSONB для гибких структур данных + +**Qdrant (векторный поиск):** +- Эмбеддинги валидированного анализа глав +- Эмбеддинги пунктов плана и техник +- Минимум метаданных в payload для фильтрации + +**Redis (кэш и очереди):** +- Кэш результатов анализа +- Кэш текста глав +- Очереди задач обработки + +### Схема базы данных Postgres + +#### Таблицы книг и глав + +**`books`** +- `id` (UUID, PK) +- `title` (VARCHAR) +- `author` (VARCHAR) +- `metadata` (JSONB) - дополнительные метаданные +- `created_at` (TIMESTAMP) +- `updated_at` (TIMESTAMP) + +**`chapters`** +- `id` (UUID, PK) +- `book_id` (UUID, FK → books.id) +- `chapter_number` (INTEGER) +- `chapter_title` (VARCHAR) +- `content` (TEXT) - полный оригинальный текст главы +- `file_path` (VARCHAR) - путь к исходному файлу +- `tokens` (INTEGER) - количество токенов +- `characters` (INTEGER) - количество символов +- `footnotes_count` (INTEGER) +- `essential_for_core_skill` (BOOLEAN) - критична ли глава для главного навыка +- `relevance_to_core_skill` (FLOAT) - релевантность главному навыку (0.0-1.0) +- `core_skill_contribution` (TEXT) - описание вклада главы в главный навык +- `created_at` (TIMESTAMP) + +**`book_statistics`** +- `id` (UUID, PK) +- `book_id` (UUID, FK → books.id, UNIQUE) +- `total_chapters` (INTEGER) +- `total_tokens` (INTEGER) +- `total_characters` (INTEGER) +- `max_chapter_tokens` (INTEGER) +- `created_at` (TIMESTAMP) + +#### Таблицы анализов + +**`chapter_analyses`** +- `id` (UUID, PK) +- `chapter_id` (UUID, FK → chapters.id, UNIQUE) +- `analysis_result` (JSONB) - структурированный анализ. Блок framework (реализован, промпт протестирован): + ```json + { + "framework": { + "terms": { + "термин1": "пояснение в 3–7 слов для обычного человека", + "термин2": "пояснение в 3–7 слов" + }, + "principles": [ + { + "title": "Краткое название принципа", + "description": "Живая формулировка с пояснением, как проявляется в жизни", + "example": "Один бытовой пример в одну фразу: работа, дом или отношения", + "chains": [ + { + "cause": "Причина или ситуация, с которой всё начинается", + "mechanism": "Что происходит / какой процесс запускается", + "result": "К какому результату это приводит для человека" + } + ] + } + ] + }, + "инсайты": ["инсайт1", "инсайт2", ...], + "применение": ["шаг1", "шаг2", ...], + "применимость": [{"техника": "...", "ситуации": [...], "цели": [...]}] + } + ``` + Опционально в «применение» или отдельно: для каждой техники — ситуации применения, цели (смыслы). Валидатор блока framework должен проверять структуру (terms, principles с chains и example) и соответствие тексту главы. +- `validation_score` (FLOAT) - оценка качества (0.0-1.0) +- `validated_at` (TIMESTAMP) +- `created_at` (TIMESTAMP) + +**`chapter_relations`** +- `id` (UUID, PK) +- `from_chapter_id` (UUID, FK → chapters.id) +- `to_chapter_id` (UUID, FK → chapters.id) +- `relation_type` (VARCHAR) - 'sequence', 'concept', 'dependency' +- `relevance_score` (FLOAT) +- `created_at` (TIMESTAMP) + +**`book_concepts`** +- `id` (UUID, PK) +- `book_id` (UUID, FK → books.id) +- `concept_type` (VARCHAR) - 'framework', 'insights_summary', 'application_plan', 'core_skill' +- `content` (JSONB) - агрегированные концепции +- `core_skill` (TEXT) - главный навык книги (для concept_type='core_skill') +- `core_skill_description` (TEXT) - описание главного навыка +- `essential_chapters_count` (INTEGER) - количество критичных глав для главного навыка +- `created_at` (TIMESTAMP) + +#### Таблицы тегов + +**`tags`** +- `id` (UUID, PK) +- `name` (VARCHAR, UNIQUE) - название тега +- `category` (VARCHAR) - категория тега: `principle` | `psychology` | `method` | `result` | `context` (см. маппинг ниже) +- `description` (TEXT) - описание тега +- `parent_tag_id` (UUID, FK → tags.id) - для иерархии тегов +- `created_at` (TIMESTAMP) +- Словарь тегов: только утверждённые теги; в промпт ИИ передаётся актуальный список. + +**Маппинг категорий тегов (ключ в JSON/БД ↔ описание):** + +| Ключ (JSON, БД) | Описание категории | +|-----------------|---------------------| +| `principle` | По сути правила/принципа: название правила/принципа, ключевые концепции, связанные принципы | +| `psychology` | По психологическому механизму: психологические концепции, проблемы, механизмы работы | +| `method` | По методу/технике: конкретные методики, подходы, процессы | +| `result` | По результату/цели: достигаемые результаты, цели применения | +| `context` | По контексту книги: связь с концепцией книги, автор и подход, общая тематика | + +Выход шага «Извлечение тегов» (промпт `3_извлечение_тегов/extract_tags.txt`): JSON с ключами `tags.principle`, `tags.psychology`, `tags.method`, `tags.result`, `tags.context` — массивы объектов `{ "tag", "confidence" }`. Поле `proposed[].category` использует те же ключи. + +**`tag_candidates`** (кандидаты в теги от ИИ, до ревью) +- `id` (UUID, PK) +- `chapter_id` (UUID, FK → chapters.id) - глава, для которой предложен тег +- `name` (VARCHAR) - предложенное название тега +- `category` (VARCHAR) - категория +- `confidence` (FLOAT) - уверенность ИИ +- `status` (VARCHAR) - 'pending', 'approved', 'rejected' +- `created_at` (TIMESTAMP) +- После одобрения: создаётся запись в `tags`, связи в `chapter_tags`; кандидат помечается approved или удаляется. + +**`chapter_tags`** +- `id` (UUID, PK) +- `chapter_id` (UUID, FK → chapters.id) +- `tag_id` (UUID, FK → tags.id) +- `confidence` (FLOAT) - уверенность ИИ в релевантности тега (0.0-1.0) +- `validated` (BOOLEAN) - проверен ли тег валидатором +- `source` (VARCHAR) - источник тега ('ai_extraction', 'ai_validation', 'manual') +- `created_at` (TIMESTAMP) + +#### Таблицы коуч-планов + +**`coach_plans`** +- `id` (UUID, PK) +- `book_id` (UUID, FK → books.id) +- `version` (INTEGER) - версия плана +- `title` (VARCHAR) +- `description` (TEXT) +- `plan_type` (VARCHAR) - 'essential', 'full', 'thematic' +- `core_skill` (TEXT) - главный навык плана (для essential планов) +- `application_plan` (JSONB) - план применения в жизни: когда/как часто/в каких ситуациях какую технику применять, как встроить в рутину (опционально) +- `created_at` (TIMESTAMP) +- `updated_at` (TIMESTAMP) + +**`plan_items`** +- `id` (UUID, PK) +- `plan_id` (UUID, FK → coach_plans.id) +- `order` (INTEGER) - порядок в плане +- `title` (VARCHAR) - название навыка/компетенции +- `description` (TEXT) - описание навыка +- `skill_name` (VARCHAR) - название навыка +- `created_at` (TIMESTAMP) + +**`plan_item_details`** +- `id` (UUID, PK) +- `item_id` (UUID, FK → plan_items.id) +- `type` (VARCHAR) - 'technique', 'method', 'exercise' +- `title` (VARCHAR) +- `content` (TEXT) - описание техники/методики +- `source_chapter_id` (UUID, FK → chapters.id) - ссылка на главу +- `source_text_position` (JSONB) - позиция в тексте: `{start: int, end: int}` +- `situations` (JSONB) - ситуации, в которых техника полезна (опционально) +- `goals` (JSONB) - цели, для которых применима (опционально) +- `created_at` (TIMESTAMP) + +**`item_chapter_links`** +- `id` (UUID, PK) +- `item_id` (UUID, FK → plan_items.id) +- `chapter_id` (UUID, FK → chapters.id) +- `relevance_score` (FLOAT) - релевантность навыка главе +- `link_type` (VARCHAR) - 'primary', 'secondary', 'reference' +- `created_at` (TIMESTAMP) + +**`text_excerpts`** +- `id` (UUID, PK) +- `chapter_id` (UUID, FK → chapters.id) +- `start_pos` (INTEGER) - начало фрагмента в тексте +- `end_pos` (INTEGER) - конец фрагмента +- `excerpt_text` (TEXT) - выделенный фрагмент +- `linked_to_item_id` (UUID, FK → plan_items.id) - связанный навык +- `created_at` (TIMESTAMP) + +#### Индексы + +- `books.id`, `books.title`, `books.author` +- `chapters.book_id`, `chapters.chapter_number`, `chapters.id` +- `chapter_analyses.chapter_id` +- `coach_plans.book_id` +- `plan_items.plan_id`, `plan_items.order` +- `plan_item_details.item_id`, `plan_item_details.source_chapter_id` +- `item_chapter_links.item_id`, `item_chapter_links.chapter_id` +- `tags.name`, `tags.category` +- `tag_candidates.status`, `tag_candidates.chapter_id` +- `chapter_tags.chapter_id`, `chapter_tags.tag_id` +- JSONB индексы на `analysis_result`, `content` для быстрого поиска + +### Структура данных в Qdrant + +#### Коллекция: `chapter_analyses` +- **Вектор**: эмбеддинг валидированного анализа главы +- **Payload**: + ```json + { + "bookId": "uuid", + "chapterId": "uuid", + "chapterNumber": 1, + "chapterTitle": "string", + "title": "string", + "author": "string", + "validationScore": 0.95, + "tags": [] + } + ``` + Теги добавляются в payload для фильтрации (из шага 4 пайплайна). + +#### Коллекция: `plan_items` +- **Вектор**: эмбеддинг пункта плана (навыка) +- **Payload**: + ```json + { + "planId": "uuid", + "itemId": "uuid", + "bookId": "uuid", + "skillName": "string", + "order": 1 + } + ``` + +#### Коллекция: `techniques` +- **Вектор**: эмбеддинг техники/методики +- **Payload**: + ```json + { + "itemId": "uuid", + "detailId": "uuid", + "type": "technique|method|exercise", + "chapterId": "uuid", + "bookId": "uuid" + } + ``` + +#### Коллекция: `skills_techniques` (для кросс-книжного поиска) +- **Вектор**: эмбеддинг навыка/техники +- **Payload**: + ```json + { + "bookId": "uuid", + "bookTitle": "string", + "author": "string", + "chapterId": "uuid", + "chapterNumber": 1, + "chapterTitle": "string", + "skillName": "string", + "techniqueType": "skill|technique|method|exercise", + "itemId": "uuid", + "detailId": "uuid" + } + ``` + +### Связь данных + +- Один `chapter_id` → множество `qdrant_point_ids[]` (если разбиваешь на чанки) +- Отдельная таблица/коллекция для связи (опционально) + +### Навигация и связи + +**Двусторонняя навигация:** +- Навык → глава → полный текст главы +- Техника → фрагмент текста → расширенный контекст +- Глава → связанные навыки и техники + +**API endpoints:** +- `GET /api/books/{book_id}/chapters/{chapter_id}` - полный текст главы +- `GET /api/books/{book_id}/chapters/{chapter_id}/excerpts` - выделенные фрагменты +- `GET /api/plan-items/{item_id}/source` - исходный текст с контекстом +- `GET /api/chapters/{chapter_id}/related-skills` - связанные навыки + +**Кэширование в Redis:** +- Кэш текста главы: `chapter:{chapter_id}:content` (TTL: 1 час) +- Кэш связанных навыков: `chapter:{chapter_id}:skills` (TTL: 1 час) +- Кэш результатов анализа: `analysis:{chapter_id}` (TTL: 24 часа) +- Кэш эмбеддингов популярных запросов: `ask:{hash_of_query}` (TTL: 1 час) + +--- + +## Функциональность системы + +### Генерация коуч-планов + +#### Процесс генерации коуч-плана + +1. **Анализ всех глав** → структурированный JSON (каркас, инсайты, применение) +2. **Выделение навыков** из применений всех глав +3. **Группировка навыков** → пункты плана (plan_items) +4. **Для каждого пункта**: поиск техник/методик по всей книге через семантический поиск +5. **Связывание с исходными главами**: создание ссылок (item_chapter_links) и выделение фрагментов (text_excerpts) +6. **Агрегация концепций**: создание общих концепций книги (book_concepts) +7. **Определение главного навыка**: выделение основного навыка книги +8. **Выделение критических глав**: определение минимального набора глав для освоения главного навыка +9. **Генерация плана**: создание коуч-плана с упорядоченными пунктами + - Эссенциальный план (только критичные главы) + - Полный план (все главы) +10. **Сведение техник**: объединение повторяющихся техник из разных глав в одну формулировку; итог — короткий набор уникальных практик (дедупликация по смыслу). +11. **Применимость (смыслы)**: для каждой техники — ситуации, в которых полезна, и цели, для которых применима (отдельный проход ИИ по собранным техникам или при генерации плана). +12. **План применения в жизни**: на основе техник и **вывода шага применимости (11)** — когда, как часто, в каких триггерах/ситуациях что делать; как встроить в рутину. Строится **после** шага применимости и использует ситуации/цели по техникам; иначе риск получить общие фразы. Сохраняется как часть коуч-плана или отдельный артефакт. + +#### Ограничения контекста, дедупликация техник и качество плана + +**Объём контекста при генерации плана:** +- Для книг с большим числом глав (30+) один вызов LLM на «все анализы» нецелесообразен: лимит контекста и/или поверхностный синтез. Варианты: + - **Сжатые выжимки:** по каждой главе передавать в промпт только каркас + ключевые инсайты + список техник (без полного текста применения). + - **Поэтапная агрегация:** сначала синтез по частям книги (например, по 5–10 глав), затем финальный проход по агрегатам — выделение навыков, главного навыка, сведение техник. + - **Лимит на вход:** передавать в финальный синтез только топ-N глав по релевантности или по числу техник. +- Стратегию выбирать в конфиге; документировать в архитектуре, что именно попадает в промпт генерации плана. + +**Дедупликация техник (шаг 10):** +- Способ объединения «повторяющихся» техник из разных глав нужно формализовать, иначе реализация размыта. Варианты: + - **По эмбеддингам:** техники уже в Qdrant; кластеризация или порог косинусной близости — техники ближе порога считаются одной, оставляем каноническую формулировку (например, из самой релевантной главы). + - **Отдельный вызов LLM:** пары или группы техник на вход — модель отвечает «одна техника или разные?»; объединять по её вердикту. + - **Эвристики:** совпадение ключевых слов, нормализация названий и т.п. +- В архитектуре зафиксировать выбранный способ (или комбинацию) и пороги (если по эмбеддингам). + +**Качество плана:** +- План не лучше анализов глав: если в блоках application мало техник или они слабо выведены из инсайтов, план будет бедным. Опционально перед генерацией плана проверять «плотность» применения по книге (например, доля глав с непустым application); при необходимости — повторный проход по слабым главам или дообогащение application. + +#### Эссенциальный план - минимальный путь к навыку + +**Концепция:** +Не все главы книги необходимы для освоения главного навыка. Система определяет минимальный набор критических глав, достаточный для получения значимого результата. + +**Пример:** +- Книга: "Атомные привычки" +- Главный навык: "Системное формирование привычек через сверхмалые шаги" +- Эссенциальный план: 5-7 критичных глав вместо всех 32 +- Результат: быстрый путь к освоению навыка без лишней информации + +**Процесс определения главного навыка:** + +1. **Анализ всех глав книги:** + - ИИ анализирует все главы и их анализы (каркас, инсайты, применение) + - Выделяет общие темы и навыки + - Определяет центральный навык, который объединяет книгу + +2. **Формулировка главного навыка:** + - ИИ формулирует главный навык на основе анализа + - Пример: "Системное формирование привычек через сверхмалые шаги" + - Сохраняется в `book_concepts.core_skill` + +3. **Оценка релевантности глав:** + - Для каждой главы ИИ оценивает релевантность главному навыку + - Критерии: + - Глава содержит ключевые принципы навыка + - Глава описывает основные техники + - Глава необходима для понимания системы + - Глава критична для практического применения + - Оценка: `relevance_to_core_skill` (0.0-1.0) + +4. **Выделение критических глав:** + - Ранжирование глав по релевантности + - Выбор критических глав (например, топ-5-7 с релевантностью >0.8) + - Проверка логической последовательности + - Убедиться, что критичные главы покрывают все аспекты навыка + +**Типы планов:** + +**1. Эссенциальный план:** +- Только критичные главы для освоения главного навыка +- Минимальный путь к результату +- Быстрое освоение навыка +- Пример: 5-7 глав вместо 32 + +**2. Полный план:** +- Все главы книги +- Глубокое понимание темы +- Расширенный контекст и примеры +- Для тех, кто хочет изучить книгу полностью + +**3. Тематический план:** +- План по конкретной теме из разных книг +- Кросс-книжный подход + +**Пример структуры эссенциального плана:** + +``` +Книга: "Атомные привычки" +Главный навык: "Системное формирование привычек через сверхмалые шаги" + +Эссенциальный план (5 глав): + 1. Глава 5: "Удивительная сила атомных привычек" + Релевантность: 0.95 + Вклад: Основа концепции атомных привычек + + 2. Глава 6: "Как привычки формируют идентичность" + Релевантность: 0.90 + Вклад: Ключевой принцип - связь привычек и идентичности + + 3. Глава 7: "Четыре простых шага для формирования лучших привычек" + Релевантность: 0.95 + Вклад: Методология - основа системы + + 4. Глава 19: "Правило двух минут" + Релевантность: 0.85 + Вклад: Ключевая техника сверхмалых шагов + + 5. Глава 22: "Главное правило изменения поведения" + Релевантность: 0.90 + Вклад: Применение системы на практике + +Расширенный план (32 главы): + [все главы для глубокого понимания и контекста] +``` + +**API endpoints:** + +- `POST /api/plans/essential/{book_id}` - создание эссенциального плана +- `GET /api/books/{book_id}/core-skill` - получение главного навыка книги +- `GET /api/books/{book_id}/chapters/essential` - список критичных глав + +**Преимущества эссенциального плана:** + +- **Быстрый результат**: минимальный путь к освоению навыка +- **Фокус**: только необходимое, без лишнего +- **Эффективность**: экономия времени +- **Гибкость**: можно выбрать эссенциальный или полный план +- **Персонализация**: адаптация под уровень пользователя + +### Тегирование глав + +#### Концепция + +Многоуровневое тегирование глав для улучшения поиска, категоризации и связывания контента. Теги отражают суть главы по разным аспектам: принципы, психологические механизмы, методы, результаты, контекст. + +#### Категории тегов + +**1. По сути правила/принципа:** +- Название правила/принципа (например, "Правило двух минут") +- Ключевые концепции (например, "Атомные привычки", "Начало привычки") +- Связанные принципы (например, "Снижение барьера входа", "Порог входа") + +**2. По психологическому механизму:** +- Психологические концепции (например, "Поведенческая психология") +- Проблемы, которые решает (например, "Прокрастинация", "Мотивация") +- Механизмы работы (например, "Инерция", "Эффект запуска") + +**3. По методу/технике:** +- Конкретные методики (например, "Метод Кайдзен", "Микро-привычки") +- Подходы (например, "Системы vs цели") +- Процессы (например, "Формирование привычек", "Цепочка привычек") + +**4. По результату/цели:** +- Достигаемые результаты (например, "Продуктивность", "Самодисциплина") +- Цели применения (например, "Преодоление прокрастинации", "Построение рутины") + +**5. По контексту книги:** +- Связь с общей концепцией книги (например, "Законы изменения поведения") +- Автор и его подход (например, "Джеймс Клир") +- Общая тематика (например, "Самосовершенствование") + +#### Процесс извлечения и валидации тегов + +**Отдельный этап в пайплайне:** +- Тегирование выполняется **после** анализа и валидации анализа +- ИИ использует уже структурированные данные (каркас, инсайты, применение) +- Это позволяет лучше понять суть главы на основе полного контекста + +**1. Извлечение тегов (qwen3-14b:8bit) — шаг 3 пайплайна:** +- Вход: валидированный анализ + оригинальный текст главы + словарь допустимых тегов (`allowed_tags_json`) +- Промпт: `3_извлечение_тегов/extract_tags.txt`. Извлечение тегов по категориям (principle, psychology, method, result, context) на основе полного понимания главы +- Результат: JSON с тегами по категориям и confidence; кандидаты в `proposed` при необходимости + +**2. Валидация тегов (qwen3-14b:8bit) — шаг 4 пайплайна:** +- Вход: извлечённые теги + валидированный анализ + оригинальный текст главы +- Промпт: `4_валидация_тегов/validate_tags.txt`. Проверка релевантности каждого тега содержанию главы, соответствие каркасу/инсайтам/применению +- Фильтрация нерелевантных и слишком общих тегов; обновление confidence +- Выход: проверенные теги; снятые при валидации — в блоке `removed` (tag, category, reason) +- Время: ~20–30 секунд на главу + +**3. Онтология/таксономия и правила работы ИИ с тегами:** + +- **Фиксированный словарь:** ИИ навешивает теги из предопределённого набора (по категориям). Словарь хранится в БД (`tags`), в промпт передаётся актуальный список допустимых тегов. +- **Правило добавления новых тегов:** новый тег предлагать **только если ни один существующий не подходит по смыслу**. Сначала — выбор из текущего набора; если глава требует концепта, которого нет в словаре — ИИ возвращает кандидата в новом теге с пометкой «предложен к добавлению». +- **Ревью новых тегов:** предложенные ИИ теги не попадают в общий словарь автоматически. Они сохраняются в отдельной очереди/таблице (кандидаты); добавление в `tags` — после ручного подтверждения или отдельного прохода валидатора. Так таксономия остаётся под контролем при росте числа книг. +- **Периодическая очистка:** объединять синонимы (один канонический тег, остальные — алиасы или миграция связей); удалять или архивировать редко используемые теги. Это предотвращает раздувание словаря при масштабировании на множество книг. +- **Итог:** ИИ + фиксированный набор + строгое правило на новые + ревью + очистка = стабильные теги как фильтр при кросс-книжном поиске, без хаоса формулировок. + +**4. Многоуровневая проверка:** +- Проверка 1: теги соответствуют содержанию главы? +- Проверка 2: теги логично связаны с другими главами? +- Проверка 3: теги отражают суть, а не поверхностные упоминания? +- Финальная проверка: сравнение с похожими главами + +#### Структурированный промпт для извлечения тегов + +**Важно:** Промпт использует уже проанализированные данные для более точного понимания сути. Категории в ответе — на английском (ключи `principle`, `psychology`, `method`, `result`, `context`), соответствуют полю `tags.category` в БД. Маппинг см. в разделе «Хранение данных» → таблица `tags`. + +``` +На основе анализа главы "{chapter_title}" из книги "{book_title}" извлеки теги. + +У тебя есть следующие данные: +- Каркас главы (фундаментальные принципы): {framework} +- Инсайты: {insights} +- Применение: {application} +- Оригинальный текст главы: {chapter_text} + +Извлеки теги по следующим категориям: + +1. ПО СУТИ ПРАВИЛА/ПРИНЦИПА: + - Название правила/принципа + - Ключевые концепции + - Связанные принципы + +2. ПО ПСИХОЛОГИЧЕСКОМУ МЕХАНИЗМУ: + - Психологические концепции + - Проблемы, которые решает + - Механизмы работы + +3. ПО МЕТОДУ/ТЕХНИКЕ: + - Конкретные методики + - Подходы + - Процессы + +4. ПО РЕЗУЛЬТАТУ/ЦЕЛИ: + - Достигаемые результаты + - Цели применения + +5. ПО КОНТЕКСТУ КНИГИ: + - Связь с общей концепцией книги + - Автор и его подход + - Общая тематика + +ВАЖНО: +- Теги должны отражать СУТЬ главы, а не просто упоминания +- Каждый тег должен быть релевантен содержанию +- Избегай слишком общих тегов +- Приоритет: качество над количеством + +ПРАВИЛО ДЛЯ ТЕГОВ: +- Выбирай теги ТОЛЬКО из переданного списка допустимых тегов (по категориям) +- Если для главы нужен смысл, которого нет в списке — верни его как кандидат в новом теге с флагом "предложен_к_добавлению"; не придумывай теги «в обход» словаря +- Один и тот же смысл — один тег; не дублируй синонимами из списка + +Верни JSON с тегами по категориям и confidence score для каждого тега. +``` + +#### Использование тегов + +**Поиск и фильтрация:** +- Фильтрация глав по тегам: "найти все главы с тегом 'прокрастинация'" +- Комбинированные фильтры: теги + семантический поиск +- Поиск по категориям: "все главы о методах продуктивности" + +**Рекомендации:** +- Похожие главы по общим тегам +- Рекомендации на основе тегов пользователя +- Кросс-книжные связи через общие теги + +**Кластеризация:** +- Группировка глав по тегам +- Выявление общих тем между книгами +- Создание тематических коллекций + +**Аналитика:** +- Популярные теги по библиотеке +- Распределение тегов по категориям +- Связи между тегами (граф знаний) + +**Гибридный поиск:** +- Семантический поиск (Qdrant) + фильтрация по тегам (Postgres) +- Взвешенное ранжирование: релевантность + теги +- Улучшение точности поиска + +### Семантический поиск + +#### Кросс-книжный поиск + +**Концепция:** +Создание комплексных коуч-планов, объединяющих навыки и техники из нескольких книг. Один навык может быть представлен в разных книгах с разными подходами и техниками. + +**Архитектура поиска:** +- Единое пространство эмбеддингов в Qdrant +- Все навыки/техники из всех книг в одной коллекции `skills_techniques` +- Эмбеддинги создаются на основе анализа глав (каркас, инсайты, применение) +- Payload содержит метаданные для фильтрации и группировки + +**Процесс кросс-книжного поиска:** + +1. **Семантический поиск по навыку:** + - Пользователь ищет "управление временем" + - Qdrant находит все похожие навыки/техники из всех книг + - Результаты ранжируются по релевантности (косинусное расстояние) + +2. **Фильтрация и группировка:** + - Фильтр по книгам: `bookId IN [book1, book2, ...]` + - Группировка похожих навыков из разных книг + - Выделение общих принципов и уникальных техник + +3. **Агрегация результатов:** + - Объединение техник из разных источников + - Приоритизация: навыки, встречающиеся в нескольких книгах + - Выявление комплементарных техник (дополняют друг друга) + +4. **Построение комплексного плана:** + - Выбор навыка → поиск всех техник из всех книг + - Сортировка по релевантности и качеству валидации + - Объединение в единый план с указанием источников + +**Пример структуры кросс-книжного плана:** + +``` +Комплексный коуч-план: "Управление временем" + ├─ Навык: "Приоритизация задач" + │ ├─ Техника 1: "Матрица Эйзенхауэра" (книга А, глава 5) + │ ├─ Техника 2: "Метод ABC" (книга Б, глава 12) + │ └─ Техника 3: "Правило 2 минут" (книга В, глава 8) + │ + ├─ Навык: "Фокус и концентрация" + │ ├─ Техника 1: "Помодоро" (книга А, глава 7) + │ └─ Техника 2: "Глубокое погружение" (книга Б, глава 15) + │ + └─ Навык: "Планирование дня" + ├─ Техника 1: "Блокировка времени" (книга В, глава 3) + └─ Техника 2: "Ежедневный обзор" (книга А, глава 10) +``` + +**API для кросс-книжного поиска:** + +- `POST /api/search/skills` - поиск навыков по запросу + - Параметры: `query`, `bookIds[]`, `limit`, `threshold` + - Возвращает: список навыков с релевантностью и источниками + +- `POST /api/plans/complex` - создание плана из нескольких книг + - Параметры: `skillNames[]`, `bookIds[]`, `preferences` + - Возвращает: комплексный план с техниками из разных книг + +- `GET /api/skills/cluster?skillName=X` - похожие навыки из разных книг +- `GET /api/skills/complementary?skillId=Y` - комплементарные навыки + +**Дополнительные возможности:** + +- **Кластеризация похожих навыков**: автоматическое группирование похожих навыков из разных книг +- **Выявление противоречий**: поиск противоречащих техник из разных книг +- **Рекомендации**: "Если изучаешь X из книги А, посмотри Y из книги Б" + +#### RAG-поиск через Qdrant (ИИ-ассистент) + +**Концепция:** +Пользователь задает вопрос на естественном языке (например, "что почитать на тему достигаторства?"), система находит релевантные главы через семантический поиск в Qdrant и ИИ формирует персонализированные рекомендации с объяснениями. + +**Архитектура RAG pipeline:** + +1. **Обработка запроса пользователя:** + - Пользователь: "Что почитать на тему достигаторства?" + - Создание эмбеддинга запроса через модель эмбеддингов (по умолчанию bge-m3) + - Семантический поиск в Qdrant по коллекциям: + - `chapter_analyses` - анализ глав + - `skills_techniques` - навыки и техники + - Получение top-k релевантных результатов (например, top-10) + +2. **Формирование контекста для ИИ:** + - Извлечение метаданных найденных глав из Qdrant payload + - Получение полной информации о главах из Postgres + - Формирование структурированного контекста для промпта + +3. **Генерация ответа через ИИ:** + - Использование LLM (по умолчанию qwen3-14b:8bit или конфигурируемая модель) для генерации ответа + - Промпт включает: + - Вопрос пользователя + - Список релевантных глав с метаданными + - Инструкции по форматированию ответа + +4. **Структурированный ответ:** + - Список рекомендованных глав с рейтингом релевантности + - Краткое объяснение, почему каждая глава подходит + - Ссылки на полный текст глав + - Предложения связанных навыков и техник + +**Структура промпта для ИИ:** + +``` +Ты помощник по библиотеке развивающих книг. +Пользователь задал вопрос: "{user_query}" + +На основе семантического поиска найдены следующие релевантные главы: + +1. Книга: "{book_title}", Автор: "{author}" + Глава {chapter_number}: "{chapter_title}" + Релевантность: {score} + Краткое описание: {analysis_summary} + +2. [повторяется для каждой найденной главы] + +Сформируй персонализированный ответ с рекомендациями: +- Укажи конкретные главы и книги +- Объясни, почему каждая глава подходит для вопроса +- Предложи порядок чтения (если уместно) +- Упомяни связанные навыки и техники + +Формат ответа: структурированный список с объяснениями. +``` + +**API endpoint:** + +**`POST /api/ask` - ИИ-ассистент для поиска книг/глав** + +**Запрос:** +```json +{ + "query": "Что почитать на тему достигаторства?", + "limit": 10, + "bookIds": ["uuid1", "uuid2"], // опционально: фильтр по книгам + "includeRelated": true // включить связанные навыки +} +``` + +**Ответ:** +```json +{ + "answer": "На основе вашего запроса рекомендую следующие главы...", + "recommendations": [ + { + "bookId": "uuid", + "bookTitle": "string", + "author": "string", + "chapterId": "uuid", + "chapterNumber": 1, + "chapterTitle": "string", + "relevanceScore": 0.95, + "explanation": "Эта глава подходит, потому что...", + "relatedSkills": ["skill1", "skill2"] + } + ], + "relatedSkills": [ + { + "skillName": "string", + "sources": ["book1", "book2"] + } + ] +} +``` + +**Процесс обработки запроса:** + +1. Эмбеддинг запроса (модель эмбеддингов, по умолчанию bge-m3) → вектор запроса +2. Семантический поиск в Qdrant → top-k релевантных глав +3. Получение метаданных из Postgres для найденных глав +4. Формирование контекста для промпта ИИ +5. Генерация ответа через LLM (qwen3-14b:8bit или конфиг) +6. Структурирование ответа с ссылками и объяснениями +7. Кэширование результата в Redis (TTL: 1 час) + +**Оптимизация:** + +- **Кэширование**: кэш эмбеддингов популярных запросов в Redis +- **Фильтрация**: опциональная фильтрация по книгам, авторам, тематикам +- **Гибридный поиск**: комбинация семантического поиска (Qdrant) и полнотекстового (Postgres) + +**Дополнительные возможности:** + +- **Уточняющие вопросы**: ИИ может задать уточняющие вопросы для более точного поиска +- **История диалога**: сохранение контекста предыдущих вопросов +- **Обратная связь**: пользователь может оценить полезность рекомендаций + +### Тематические коуч-планы на основе тегов + +#### Концепция + +Пользователь хочет прокачать конкретный навык или тему (например, "внимательность"). Система находит все релевантные главы из разных книг по тегам, использует семантический поиск для дополнительных результатов и ИИ составляет комплексный коуч-план, объединяя техники из разных источников. + +#### Процесс создания тематического плана + +**1. Поиск по тегам:** +- Пользователь: "Хочу прокачать внимательность" +- Система ищет теги: прямое совпадение ("внимательность") + семантически похожие ("фокус", "концентрация", "осознанность", "mindfulness") +- Находятся все главы с релевантными тегами из разных книг +- Результаты ранжируются по релевантности тегов + +**2. Комбинированный поиск:** +- **Теги (Postgres)**: точная фильтрация по релевантным тегам +- **Семантический поиск (Qdrant)**: поиск похожих концепций через эмбеддинги +- **Объединение результатов**: дедупликация и ранжирование +- **Приоритизация**: главы с несколькими релевантными тегами выше + +**3. Генерация плана через ИИ:** +- ИИ получает найденные главы с их тегами, анализами и метаданными +- Формирует структурированный тематический план: + - Группировка по подтемам (на основе тегов и анализа) + - Последовательность изучения (логический порядок) + - Техники из разных книг с объяснениями + - Объяснение, почему каждая техника подходит для темы + +**4. Структура тематического плана:** + +``` +Тема: "Внимательность" + ├─ Подтема 1: "Фокус и концентрация" + │ ├─ Техника: "Метод помодоро" (книга А, глава 5) + │ │ Теги: [фокус, концентрация, продуктивность] + │ └─ Техника: "Глубокое погружение" (книга Б, глава 12) + │ Теги: [концентрация, фокус, работа] + │ + ├─ Подтема 2: "Осознанность и mindfulness" + │ ├─ Техника: "Медитация осознанности" (книга В, глава 8) + │ │ Теги: [осознанность, медитация, mindfulness] + │ └─ Техника: "Практика присутствия" (книга А, глава 15) + │ Теги: [осознанность, присутствие, практика] + │ + └─ Подтема 3: "Управление отвлечениями" + ├─ Техника: "Цифровой детокс" (книга Б, глава 20) + │ Теги: [отвлечения, цифровая гигиена, фокус] + └─ Техника: "Создание среды для фокуса" (книга В, глава 3) + Теги: [окружение, фокус, продуктивность] +``` + +**API endpoint:** + +**`POST /api/plans/thematic` - создание тематического коуч-плана** + +**Запрос:** +```json +{ + "theme": "внимательность", + "tags": ["фокус", "концентрация", "осознанность"], // опционально: конкретные теги + "bookIds": ["uuid1", "uuid2"], // опционально: фильтр по книгам + "excludeBookIds": ["uuid3"], // опционально: исключить книги + "maxChapters": 20, // максимум глав для анализа + "preferences": { + "focusOnTechniques": true, + "includeTheory": false + } +} +``` + +**Ответ:** +```json +{ + "planId": "uuid", + "theme": "внимательность", + "title": "Коуч-план: Развитие внимательности", + "description": "Комплексный план из 5 книг...", + "subthemes": [ + { + "name": "Фокус и концентрация", + "order": 1, + "items": [ + { + "itemId": "uuid", + "title": "Метод помодоро", + "techniques": [ + { + "techniqueId": "uuid", + "title": "Техника помодоро", + "description": "...", + "bookId": "uuid", + "bookTitle": "string", + "chapterId": "uuid", + "chapterNumber": 5, + "chapterTitle": "string", + "tags": ["фокус", "концентрация"], + "relevanceScore": 0.95, + "explanation": "Эта техника подходит, потому что..." + } + ] + } + ] + } + ], + "statistics": { + "totalBooks": 5, + "totalChapters": 12, + "totalTechniques": 18 + } +} +``` + +**Процесс обработки:** + +1. **Поиск тегов** (Postgres): прямой поиск + семантический поиск похожих тегов +2. **Семантический поиск** (Qdrant): создание эмбеддинга темы запроса +3. **Объединение и ранжирование**: дедупликация, взвешенное ранжирование +4. **Получение данных** (Postgres): полная информация о найденных главах +5. **Генерация плана** (LLM, по умолчанию qwen3-14b:8bit): формирование структурированного плана +6. **Сохранение плана**: создание записи в БД + +**Дополнительные возможности:** + +- **Рекомендации связанных тем**: "Если изучаешь внимательность, посмотри про продуктивность" +- **Прогресс по темам**: отслеживание освоения навыков +- **Адаптация плана**: обновление при добавлении новых книг +- **Аналитика**: популярные темы, эффективность планов + +### UX навигации + +- В карточке навыка: кнопка "Читать главу полностью" +- В тексте главы: маркеры связанных навыков (подсветка) +- Быстрый переход: навык ↔ глава +- Контекстное меню: "Показать связанные навыки" в главе +- Навигация по иерархии: план → пункт → техника → исходный текст + +--- + +## Операционные аспекты + +### Масштабирование + +#### Горизонтальное масштабирование + +- **Воркеры**: запускать несколько контейнеров с воркерами +- **FastAPI**: несколько инстансов за балансировщиком (stateless) +- **Ollama**: один контейнер = один запрос за раз (если не настроен параллелизм) + +#### Ограничения + +- **Ollama**: основной узкое место +- **Решение**: несколько инстансов Ollama или настройка `OLLAMA_NUM_PARALLEL` +- **CPU обработка**: медленно, но стабильно (без GPU) + +#### Рекомендации по масштабированию + +- Начать с 1-2 воркеров (последовательная обработка) +- Мониторить длину очереди в Redis +- Масштабировать воркеры по потребности +- При высокой нагрузке - несколько инстансов Ollama + +### Мониторинг + +#### Метрики + +- Время обработки каждой главы +- Успешность валидации +- Качество анализа +- Длина очереди в Redis +- Использование памяти Ollama +- Загрузка CPU + +#### Логирование + +- Все этапы обработки +- Ошибки с контекстом +- Время выполнения каждого этапа + +### Рекомендации по конфигурации + +#### Для 30GB RAM (оптимальная конфигурация) + +1. **Lazy loading моделей** - загружать по требованию, выгружать через `keep_alive: 0` +2. **Оптимизировать промпты** - минимум токенов (~200-300 вместо 1000-2000) +3. **OLLAMA_NUM_CTX=12000-13000** - компромисс между памятью и возможностями +4. **Обработка строго последовательно** - одна глава, одна модель за раз +5. **Мониторить память** - следить за использованием RAM + +**Итого памяти: ~18-22GB максимум (влезет в 30GB с запасом)** + +#### Для масштабирования + +1. Увеличить количество воркеров (при наличии памяти) +2. Настроить несколько инстансов Ollama +3. Использовать приоритетные очереди +4. Кэшировать эмбеддинги + +#### Для большого контекста (20000 токенов) + +1. Увеличить RAM до 48-64GB минимум +2. GPU опционально для ускорения +3. **НЕ разбивать главы на чанки** - качество анализа упадет + +### Альтернативы n8n + +**Проблемы n8n:** +- Таймауты выполнения +- Ограничения памяти +- Сложная отладка +- Плохая параллелизация + +**Решение:** +- Нативный Python сервис с очередями (Celery/RQ) +- n8n оставить для триггеров и оркестрации между сервисами + +--- + +## Приложения + +### A. Примеры промптов + +#### Анализ главы по блокам + +Анализ выполняется **отдельным промптом на каждый блок** (framework → insights → application → limitations). Пример первого блока: + +**Блок framework** — промпт `1_анализ_главы/extract_framework_v2.txt`: +- Вход: `book_title`, `chapter_title`, `chapter_text`. +- Задача: извлечь только блок «каркас» — принципы и цепочки причина–механизм–результат; глоссарий терминов (`terms`); у каждого принципа — `example` (бытовой пример в одну фразу). +- Правила: не пересказывать текст, язык простой и приземлённый к поведению, один принцип = одна опорная мысль. +- Выход: строго один JSON с ключом верхнего уровня `"framework"` и вложенной структурой `terms` + `principles` (каждый с `title`, `description`, `example`, `chains` с полями `cause`, `mechanism`, `result`). + +Остальные блоки: `extract_insights_v3.txt`, `extract_application_v2.txt`, `extract_limitations_v3.txt` (каталог `1_анализ_главы/`). После каждого блока — валидация по блоку (каталог `2_валидация_анализа_по_блокам/`), затем склейка и финальная валидация согласованности (`2b_финальная_валидация_согласованности/validate_consistency.txt`). + +#### Промпт для валидации анализа + +``` +Проверь качество анализа главы "{chapter_title}". + +Оригинальный текст главы: +{chapter_text} + +Результат анализа: +{analysis_result} + +Проверь: +1. Соответствие анализа содержанию главы +2. Отсутствие галлюцинаций +3. Полноту покрытия темы +4. Качество структурирования + +Верни оценку качества (0.0-1.0) и комментарии. +``` + +### B. Схема взаимодействия компонентов + +``` +┌─────────────┐ +│ Client │ +└──────┬──────┘ + │ + ▼ +┌─────────────────┐ +│ FastAPI (API) │ +└──────┬──────────┘ + │ + ▼ +┌─────────────┐ +│ Redis │◄──┐ +│ (Queue) │ │ +└──────┬──────┘ │ + │ │ + ▼ │ +┌─────────────┐ │ +│ Workers │───┘ +│ (Celery) │ +└──────┬──────┘ + │ + ├──► Ollama (LLM) + ├──► Postgres (DB) + ├──► Qdrant (Vector DB) + └──► Redis (Cache) +``` + +--- + +## Актуализация по каталогам этапов + +Документ синхронизирован с README этапов пайплайна: + +| Этап | Каталог | Ключевые файлы | +|------|---------|----------------| +| 1. Анализ главы по блокам | `1_анализ_главы/` | extract_framework_v2.txt, extract_insights_v3.txt, extract_application_v2.txt, extract_limitations_v3.txt | +| 2. Валидация блоков | `2_валидация_анализа_по_блокам/` | validate_framework.txt, validate_insights.txt, validate_application.txt, validate_limitations.txt | +| 2a. Склейка | — | Без LLM, слияние JSON | +| 2b. Финальная валидация | `2b_финальная_валидация_согласованности/` | validate_consistency.txt | +| 3. Извлечение тегов | `3_извлечение_тегов/` | extract_tags.txt | +| 4. Валидация тегов | `4_валидация_тегов/` | validate_tags.txt | +| 5. Мерж анализа и тегов | `5_мерж_анализа_и_тегов/` | merge_analysis_tags.py | +| 6. Генерация эмбеддингов | `6_генерация_эмбеддингов/` | embed_input_spec.txt | +| 7. Сохранение в Qdrant | `7_сохранение_qdrant/` | save_to_qdrant.py | +| 8. Сохранение в Postgres | `8_сохранение_postgres/` | save_to_postgres.py, schema.sql | + +Модель LLM для шагов 1–4: **qwen3-14b:8bit**. Модель эмбеддингов (шаг 6): **BAAI/bge-m3**. + +*Документ обновлен: 2026-01-31* diff --git a/EPUB Parser Pipeline.json b/EPUB Parser Pipeline.json new file mode 100644 index 0000000..a26f003 --- /dev/null +++ b/EPUB Parser Pipeline.json @@ -0,0 +1,101 @@ +{ + "name": "EPUB Parser Pipeline", + "nodes": [ + { + "parameters": { + "httpMethod": "POST", + "path": "epub-upload", + "responseMode": "responseNode", + "options": { + "rawBody": true + } + }, + "id": "acc0fb8b-e1a9-41e8-a12b-a898a0b49f54", + "name": "Webhook", + "type": "n8n-nodes-base.webhook", + "typeVersion": 1.1, + "position": [ + 752, + 32 + ], + "webhookId": "epub-upload-webhook" + }, + { + "parameters": { + "method": "POST", + "url": "http://epub-parser:5000/parse", + "sendBody": true, + "contentType": "multipart-form-data", + "bodyParameters": { + "parameters": [ + { + "parameterType": "formBinaryData", + "name": "data", + "inputDataFieldName": "data" + } + ] + }, + "options": {} + }, + "id": "255ac328-6456-4ca1-89ea-6d3bb32af971", + "name": "FastAPI Request", + "type": "n8n-nodes-base.httpRequest", + "typeVersion": 4.2, + "position": [ + 1040, + 0 + ] + }, + { + "parameters": { + "respondWith": "json", + "responseBody": "={{ $json }}", + "options": {} + }, + "id": "2886fd4e-ebee-41ee-bc11-ca0e716b104f", + "name": "Respond to Webhook", + "type": "n8n-nodes-base.respondToWebhook", + "typeVersion": 1.1, + "position": [ + 1296, + 32 + ] + } + ], + "pinData": {}, + "connections": { + "Webhook": { + "main": [ + [ + { + "node": "FastAPI Request", + "type": "main", + "index": 0 + } + ] + ] + }, + "FastAPI Request": { + "main": [ + [ + { + "node": "Respond to Webhook", + "type": "main", + "index": 0 + } + ] + ] + } + }, + "active": false, + "settings": { + "executionOrder": "v1", + "availableInMCP": false + }, + "versionId": "e04355ab-d49d-4cfc-82b7-e40b90d72160", + "meta": { + "instanceId": "0627756eca94c4f84a889829afba19028b408eb6c4a023b2f7efeaae0c40f490" + }, + "id": "JOTxekOa0aQppw5ckd9bC", + "tags": [] +} \ No newline at end of file diff --git a/books/.DS_Store b/books/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/books/.DS_Store differ diff --git a/books/5e41a8b020384.epub b/books/5e41a8b020384.epub new file mode 100644 index 0000000..1740c2f Binary files /dev/null and b/books/5e41a8b020384.epub differ diff --git a/books/Godin_S_Fioletovaya_Korova_Sdelay.epub b/books/Godin_S_Fioletovaya_Korova_Sdelay.epub new file mode 100644 index 0000000..1d135fd Binary files /dev/null and b/books/Godin_S_Fioletovaya_Korova_Sdelay.epub differ diff --git a/books/Molchanov_Strategiya-vverh-tormashkami (2).epub b/books/Molchanov_Strategiya-vverh-tormashkami (2).epub new file mode 100644 index 0000000..3ef9021 Binary files /dev/null and b/books/Molchanov_Strategiya-vverh-tormashkami (2).epub differ diff --git a/books/Molchanov_Strategiya-vverh-tormashkami.epub b/books/Molchanov_Strategiya-vverh-tormashkami.epub new file mode 100644 index 0000000..3ef9021 Binary files /dev/null and b/books/Molchanov_Strategiya-vverh-tormashkami.epub differ diff --git a/books/Terehov_A_Yetomoyibizne_Istina_V_Cene_Vse_O_Prakt.epub b/books/Terehov_A_Yetomoyibizne_Istina_V_Cene_Vse_O_Prakt.epub new file mode 100644 index 0000000..f07c4fb Binary files /dev/null and b/books/Terehov_A_Yetomoyibizne_Istina_V_Cene_Vse_O_Prakt.epub differ diff --git a/books/overcoming-the-five-dysfunctions-of-a-team.epub b/books/overcoming-the-five-dysfunctions-of-a-team.epub new file mode 100644 index 0000000..0377f23 Binary files /dev/null and b/books/overcoming-the-five-dysfunctions-of-a-team.epub differ diff --git a/books/raskryvaya-gibkost-biznesa.epub b/books/raskryvaya-gibkost-biznesa.epub new file mode 100644 index 0000000..8cf02a5 Binary files /dev/null and b/books/raskryvaya-gibkost-biznesa.epub differ diff --git a/books/statistics/Agile-трансформация. Раскрывая гибкость бизнеса_statistics.json b/books/statistics/Agile-трансформация. Раскрывая гибкость бизнеса_statistics.json new file mode 100644 index 0000000..6375456 --- /dev/null +++ b/books/statistics/Agile-трансформация. Раскрывая гибкость бизнеса_statistics.json @@ -0,0 +1,291 @@ +{ + "book": { + "title": "Agile-трансформация. Раскрывая гибкость бизнеса", + "author": "Йорген Хессельберг", + "totalChapters": 35, + "totalCharacters": 727705, + "totalTokens": 302267 + }, + "chapters": [ + { + "chapterNumber": 1, + "chapterTitle": "An Insider’s Guide to Agile Enterprise Transformation", + "characters": 14, + "tokens": 41, + "footnotesCount": 0, + "filePath": "t1.xhtml" + }, + { + "chapterNumber": 2, + "chapterTitle": "Раскрывая гибкость бизнеса", + "characters": 33, + "tokens": 37, + "footnotesCount": 0, + "filePath": "t2.xhtml" + }, + { + "chapterNumber": 3, + "chapterTitle": "ИНФОРМАЦИЯОТ ИЗДАТЕЛЬСТВА", + "characters": 2007, + "tokens": 828, + "footnotesCount": 0, + "filePath": "info.xhtml" + }, + { + "chapterNumber": 4, + "chapterTitle": "Posv", + "characters": 110, + "tokens": 61, + "footnotesCount": 0, + "filePath": "posv.xhtml" + }, + { + "chapterNumber": 5, + "chapterTitle": "ПРЕДИСЛОВИЕ БЬЯРТЕ БОГСНЕСА", + "characters": 2715, + "tokens": 1112, + "footnotesCount": 0, + "filePath": "pre1.xhtml" + }, + { + "chapterNumber": 6, + "chapterTitle": "ПРЕДИСЛОВИЕ РИЧАРДА ШЕРИДАНА", + "characters": 6254, + "tokens": 2529, + "footnotesCount": 1, + "filePath": "pre2.xhtml" + }, + { + "chapterNumber": 7, + "chapterTitle": "КОМУ СТОИТ ПРОЧИТАТЬ ЭТУ КНИГУ?", + "characters": 10176, + "tokens": 4096, + "footnotesCount": 0, + "filePath": "vv.xhtml" + }, + { + "chapterNumber": 8, + "chapterTitle": "АРГУМЕНТЫ В ПОЛЬЗУ ГИБКОСТИ", + "characters": 297, + "tokens": 143, + "footnotesCount": 0, + "filePath": "ch1.xhtml" + }, + { + "chapterNumber": 9, + "chapterTitle": "ПРОИСХОЖДЕНИЕ СОВРЕМЕННОГО МЕНЕДЖМЕНТА", + "characters": 57449, + "tokens": 23012, + "footnotesCount": 36, + "filePath": "G1.xhtml" + }, + { + "chapterNumber": 10, + "chapterTitle": "РАЗРАБОТКА ГИБКОСТИ БИЗНЕСА: БАЛАНС ТРЕХ ВАЖНЫХ РЫЧАГОВ", + "characters": 65946, + "tokens": 26417, + "footnotesCount": 22, + "filePath": "G2.xhtml" + }, + { + "chapterNumber": 11, + "chapterTitle": "ПЯТЬ ИЗМЕРЕНИЙ ГИБКОСТИ", + "characters": 230, + "tokens": 116, + "footnotesCount": 0, + "filePath": "ch2.xhtml" + }, + { + "chapterNumber": 12, + "chapterTitle": "СОЗДАНИЕ ПРАВИЛЬНОГО ПРОДУКТА: ПРОДУКТЫ, КОТОРЫЕ ПОЛЮБЯТ ПОТРЕБИТЕЛИ", + "characters": 74330, + "tokens": 29780, + "footnotesCount": 32, + "filePath": "G3.xhtml" + }, + { + "chapterNumber": 13, + "chapterTitle": "ФИЗИЧЕСКИЙ ДИЗАЙН РАБОЧЕГО МЕСТА", + "characters": 61729, + "tokens": 24719, + "footnotesCount": 14, + "filePath": "G4.xhtml" + }, + { + "chapterNumber": 14, + "chapterTitle": "НЕЛЬЗЯ НЕДООЦЕНИВАТЬ ВАЖНОСТЬ ЛЮДЕЙ", + "characters": 51401, + "tokens": 20589, + "footnotesCount": 20, + "filePath": "G5.xhtml" + }, + { + "chapterNumber": 15, + "chapterTitle": "РУКОВОДСТВО ПЯТОГО УРОВНЯ = ГИБКОЕ ЛИДЕРСТВО?", + "characters": 52810, + "tokens": 21156, + "footnotesCount": 18, + "filePath": "G6.xhtml" + }, + { + "chapterNumber": 16, + "chapterTitle": "ВЗАИМОДЕЙСТВИЕ — «МЫ ПРЕУСПЕЛИ, РАБОТАЯ ВМЕСТЕ»", + "characters": 78382, + "tokens": 31385, + "footnotesCount": 37, + "filePath": "G7.xhtml" + }, + { + "chapterNumber": 17, + "chapterTitle": "AGILE-ТРАНСФОРМАЦИЯ", + "characters": 329, + "tokens": 153, + "footnotesCount": 0, + "filePath": "ch3.xhtml" + }, + { + "chapterNumber": 18, + "chapterTitle": "СОЗДАНИЕ РАБОЧЕЙ AGILE-ГРУППЫ В ОРГАНИЗАЦИИ", + "characters": 44146, + "tokens": 17691, + "footnotesCount": 10, + "filePath": "G8.xhtml" + }, + { + "chapterNumber": 19, + "chapterTitle": "ОПЕРАЦИОННАЯ МОДЕЛЬ ГИБКОГО БИЗНЕСА", + "characters": 94436, + "tokens": 37803, + "footnotesCount": 23, + "filePath": "G9.xhtml" + }, + { + "chapterNumber": 20, + "chapterTitle": "AGILE-ТРАНСФОРМАЦИЯ: СТРАТЕГИЧЕСКАЯ ДОРОЖНАЯ КАРТА", + "characters": 94378, + "tokens": 37787, + "footnotesCount": 16, + "filePath": "G10.xhtml" + }, + { + "chapterNumber": 21, + "chapterTitle": "БЛАГОДАРНОСТИ", + "characters": 2967, + "tokens": 1209, + "footnotesCount": 0, + "filePath": "thanks.xhtml" + }, + { + "chapterNumber": 22, + "chapterTitle": "ОБ АВТОРЕ", + "characters": 1179, + "tokens": 491, + "footnotesCount": 0, + "filePath": "about.xhtml" + }, + { + "chapterNumber": 23, + "chapterTitle": "ПРИМЕЧАНИЯ", + "characters": 2872, + "tokens": 2312, + "footnotesCount": 64, + "filePath": "note1.xhtml" + }, + { + "chapterNumber": 24, + "chapterTitle": "Глава 2", + "characters": 1880, + "tokens": 1516, + "footnotesCount": 38, + "filePath": "note2.xhtml" + }, + { + "chapterNumber": 25, + "chapterTitle": "Глава 3", + "characters": 2626, + "tokens": 2116, + "footnotesCount": 50, + "filePath": "note3.xhtml" + }, + { + "chapterNumber": 26, + "chapterTitle": "Глава 4", + "characters": 1578, + "tokens": 1275, + "footnotesCount": 24, + "filePath": "note4.xhtml" + }, + { + "chapterNumber": 27, + "chapterTitle": "Глава 5", + "characters": 2306, + "tokens": 1859, + "footnotesCount": 38, + "filePath": "note5.xhtml" + }, + { + "chapterNumber": 28, + "chapterTitle": "Глава 6", + "characters": 1817, + "tokens": 1467, + "footnotesCount": 36, + "filePath": "note6.xhtml" + }, + { + "chapterNumber": 29, + "chapterTitle": "Глава 7", + "characters": 3692, + "tokens": 2970, + "footnotesCount": 72, + "filePath": "note7.xhtml" + }, + { + "chapterNumber": 30, + "chapterTitle": "Глава 8", + "characters": 630, + "tokens": 515, + "footnotesCount": 16, + "filePath": "note8.xhtml" + }, + { + "chapterNumber": 31, + "chapterTitle": "Глава 9", + "characters": 2347, + "tokens": 1892, + "footnotesCount": 44, + "filePath": "note9.xhtml" + }, + { + "chapterNumber": 32, + "chapterTitle": "Глава 10", + "characters": 1801, + "tokens": 1456, + "footnotesCount": 30, + "filePath": "note10.xhtml" + }, + { + "chapterNumber": 33, + "chapterTitle": "ПРИМЕЧАНИЯ РЕДАКЦИИ", + "characters": 4320, + "tokens": 3484, + "footnotesCount": 50, + "filePath": "links.xhtml" + }, + { + "chapterNumber": 34, + "chapterTitle": "МИФ Бизнес", + "characters": 161, + "tokens": 86, + "footnotesCount": 0, + "filePath": "business.html" + }, + { + "chapterNumber": 35, + "chapterTitle": "НАД КНИГОЙ РАБОТАЛИ", + "characters": 357, + "tokens": 164, + "footnotesCount": 0, + "filePath": "end.xhtml" + } + ] +} \ No newline at end of file diff --git a/books/statistics/Атомные привычки. Как приобрести хорошие привычки и избавиться от плохих_statistics.json b/books/statistics/Атомные привычки. Как приобрести хорошие привычки и избавиться от плохих_statistics.json new file mode 100644 index 0000000..0d72784 --- /dev/null +++ b/books/statistics/Атомные привычки. Как приобрести хорошие привычки и избавиться от плохих_statistics.json @@ -0,0 +1,267 @@ +{ + "book": { + "title": "Атомные привычки. Как приобрести хорошие привычки и избавиться от плохих", + "author": "Джеймс Клир", + "totalChapters": 32, + "totalCharacters": 387746, + "totalTokens": 155999 + }, + "chapters": [ + { + "chapterNumber": 1, + "chapterTitle": "Джеймс Клир Атомные привычки Как приобрести хорошие привычки и избавиться о плохих", + "characters": 82, + "tokens": 76, + "footnotesCount": 0, + "filePath": "ch1.xhtml" + }, + { + "chapterNumber": 2, + "chapterTitle": "* * *", + "characters": 1038, + "tokens": 431, + "footnotesCount": 0, + "filePath": "ch1-1.xhtml" + }, + { + "chapterNumber": 3, + "chapterTitle": "Введение Моя история", + "characters": 19573, + "tokens": 7851, + "footnotesCount": 0, + "filePath": "ch1-2.xhtml" + }, + { + "chapterNumber": 4, + "chapterTitle": "Основные принципы Почему небольшие изменения приводят к грандиозным результатам", + "characters": 79, + "tokens": 76, + "footnotesCount": 0, + "filePath": "ch1-3.xhtml" + }, + { + "chapterNumber": 5, + "chapterTitle": "Удивительная сила атомных привычек", + "characters": 27731, + "tokens": 11119, + "footnotesCount": 0, + "filePath": "ch1-4.xhtml" + }, + { + "chapterNumber": 6, + "chapterTitle": "Как привычки формируют идентичность (и наоборот)", + "characters": 23868, + "tokens": 9580, + "footnotesCount": 0, + "filePath": "ch1-5.xhtml" + }, + { + "chapterNumber": 7, + "chapterTitle": "Четыре простых шага для формирования лучших привычек", + "characters": 19798, + "tokens": 7953, + "footnotesCount": 0, + "filePath": "ch1-6.xhtml" + }, + { + "chapterNumber": 8, + "chapterTitle": "Первый закон Придайте очевидности", + "characters": 33, + "tokens": 40, + "footnotesCount": 0, + "filePath": "ch1-7.xhtml" + }, + { + "chapterNumber": 9, + "chapterTitle": "Человек, который плохо выглядел", + "characters": 14776, + "tokens": 5936, + "footnotesCount": 0, + "filePath": "ch1-8.xhtml" + }, + { + "chapterNumber": 10, + "chapterTitle": "Лучший способ сформировать новую привычку", + "characters": 17468, + "tokens": 7017, + "footnotesCount": 0, + "filePath": "ch1-9.xhtml" + }, + { + "chapterNumber": 11, + "chapterTitle": "Значение мотивации преувеличено: важность окружения", + "characters": 18232, + "tokens": 7326, + "footnotesCount": 0, + "filePath": "ch1-10.xhtml" + }, + { + "chapterNumber": 12, + "chapterTitle": "Секрет самоконтроля", + "characters": 10117, + "tokens": 4067, + "footnotesCount": 0, + "filePath": "ch1-11.xhtml" + }, + { + "chapterNumber": 13, + "chapterTitle": "Второй закон Добавьте привлекательности", + "characters": 39, + "tokens": 44, + "footnotesCount": 0, + "filePath": "ch1-12.xhtml" + }, + { + "chapterNumber": 14, + "chapterTitle": "Как сделать привычку привлекательной", + "characters": 19890, + "tokens": 7984, + "footnotesCount": 0, + "filePath": "ch1-13.xhtml" + }, + { + "chapterNumber": 15, + "chapterTitle": "Роль семьи и друзей в формировании привычек", + "characters": 17527, + "tokens": 7041, + "footnotesCount": 0, + "filePath": "ch1-14.xhtml" + }, + { + "chapterNumber": 16, + "chapterTitle": "Как найти и устранить причины вредных привычек", + "characters": 15973, + "tokens": 6421, + "footnotesCount": 0, + "filePath": "ch1-15.xhtml" + }, + { + "chapterNumber": 17, + "chapterTitle": "Третий закон Упростите", + "characters": 9908, + "tokens": 3985, + "footnotesCount": 0, + "filePath": "ch1-16.xhtml" + }, + { + "chapterNumber": 18, + "chapterTitle": "Закон наименьшего усилия", + "characters": 17359, + "tokens": 6966, + "footnotesCount": 0, + "filePath": "ch1-17.xhtml" + }, + { + "chapterNumber": 19, + "chapterTitle": "Правило двух минут", + "characters": 11986, + "tokens": 4815, + "footnotesCount": 0, + "filePath": "ch1-18.xhtml" + }, + { + "chapterNumber": 20, + "chapterTitle": "Как сделать хорошие привычки неизбежными, а плохие – невозможными", + "characters": 12059, + "tokens": 4863, + "footnotesCount": 0, + "filePath": "ch1-19.xhtml" + }, + { + "chapterNumber": 21, + "chapterTitle": "Четвертый закон Привнесите удовольствие", + "characters": 39, + "tokens": 44, + "footnotesCount": 0, + "filePath": "ch1-20.xhtml" + }, + { + "chapterNumber": 22, + "chapterTitle": "Главное правило изменения поведения", + "characters": 20125, + "tokens": 8078, + "footnotesCount": 0, + "filePath": "ch1-21.xhtml" + }, + { + "chapterNumber": 23, + "chapterTitle": "Хорошие привычки каждый день", + "characters": 18060, + "tokens": 7249, + "footnotesCount": 0, + "filePath": "ch1-22.xhtml" + }, + { + "chapterNumber": 24, + "chapterTitle": "Как друзья могут помочь в овладении привычками", + "characters": 11540, + "tokens": 4648, + "footnotesCount": 0, + "filePath": "ch1-23.xhtml" + }, + { + "chapterNumber": 25, + "chapterTitle": "Правда о таланте (когда гены важны, а когда нет)", + "characters": 20896, + "tokens": 8391, + "footnotesCount": 0, + "filePath": "ch1-24.xhtml" + }, + { + "chapterNumber": 26, + "chapterTitle": "Правило Златовласки: как оставаться мотивированным в жизни и на работе", + "characters": 12960, + "tokens": 5226, + "footnotesCount": 0, + "filePath": "ch1-25.xhtml" + }, + { + "chapterNumber": 27, + "chapterTitle": "Обратная сторона хороших привычек", + "characters": 16591, + "tokens": 6663, + "footnotesCount": 0, + "filePath": "ch1-26.xhtml" + }, + { + "chapterNumber": 28, + "chapterTitle": "Заключение Секрет: как достичь долговременных результатов", + "characters": 4561, + "tokens": 1860, + "footnotesCount": 0, + "filePath": "ch1-27.xhtml" + }, + { + "chapterNumber": 29, + "chapterTitle": "Приложения", + "characters": 11535, + "tokens": 4632, + "footnotesCount": 0, + "filePath": "ch1-28.xhtml" + }, + { + "chapterNumber": 30, + "chapterTitle": "Благодарности", + "characters": 3878, + "tokens": 1570, + "footnotesCount": 0, + "filePath": "ch1-29.xhtml" + }, + { + "chapterNumber": 31, + "chapterTitle": "От издательства", + "characters": 385, + "tokens": 174, + "footnotesCount": 0, + "filePath": "ch1-30.xhtml" + }, + { + "chapterNumber": 32, + "chapterTitle": "Примечания", + "characters": 9640, + "tokens": 3873, + "footnotesCount": 0, + "filePath": "ch2.xhtml" + } + ] +} \ No newline at end of file diff --git a/books/statistics/Бизнес с нуля Метод Lean Startup для быстрого тестирования идей и выбора бизнес-модели_statistics.json b/books/statistics/Бизнес с нуля Метод Lean Startup для быстрого тестирования идей и выбора бизнес-модели_statistics.json new file mode 100644 index 0000000..666a20d --- /dev/null +++ b/books/statistics/Бизнес с нуля Метод Lean Startup для быстрого тестирования идей и выбора бизнес-модели_statistics.json @@ -0,0 +1,243 @@ +{ + "book": { + "title": "Бизнес с нуля: Метод Lean Startup для быстрого тестирования идей и выбора бизнес-модели", + "author": "Эрик Рис", + "totalChapters": 29, + "totalCharacters": 501340, + "totalTokens": 201309 + }, + "chapters": [ + { + "chapterNumber": 1, + "chapterTitle": "Content03", + "characters": 5588, + "tokens": 2257, + "footnotesCount": 0, + "filePath": "Text/content03.html" + }, + { + "chapterNumber": 2, + "chapterTitle": "Content04", + "characters": 16, + "tokens": 28, + "footnotesCount": 0, + "filePath": "Text/content04.html" + }, + { + "chapterNumber": 3, + "chapterTitle": "Content0", + "characters": 0, + "tokens": 21, + "footnotesCount": 0, + "filePath": "Text/content0.html" + }, + { + "chapterNumber": 4, + "chapterTitle": "Content01", + "characters": 0, + "tokens": 22, + "footnotesCount": 0, + "filePath": "Text/content01.html" + }, + { + "chapterNumber": 5, + "chapterTitle": "Content02", + "characters": 832, + "tokens": 354, + "footnotesCount": 0, + "filePath": "Text/content02.html" + }, + { + "chapterNumber": 6, + "chapterTitle": "Истоки системы «экономичный стартап»", + "characters": 20081, + "tokens": 8065, + "footnotesCount": 0, + "filePath": "Text/content05.html" + }, + { + "chapterNumber": 7, + "chapterTitle": "ВИДЕНИЕ", + "characters": 7, + "tokens": 23, + "footnotesCount": 0, + "filePath": "Text/content_1.html" + }, + { + "chapterNumber": 8, + "chapterTitle": "Как возникла система «экономичный стартап»", + "characters": 13962, + "tokens": 5618, + "footnotesCount": 0, + "filePath": "Text/content1.html" + }, + { + "chapterNumber": 9, + "chapterTitle": "Кого можно назвать предпринимателем?", + "characters": 21001, + "tokens": 8432, + "footnotesCount": 0, + "filePath": "Text/content2.html" + }, + { + "chapterNumber": 10, + "chapterTitle": "Кого можно назвать предпринимателем?", + "characters": 33221, + "tokens": 13320, + "footnotesCount": 0, + "filePath": "Text/content3.html" + }, + { + "chapterNumber": 11, + "chapterTitle": "Хотите долгосрочных изменений? Экспериментируйте!", + "characters": 30391, + "tokens": 12193, + "footnotesCount": 0, + "filePath": "Text/content4.html" + }, + { + "chapterNumber": 12, + "chapterTitle": "САДИМСЯ ЗА РУЛЬ", + "characters": 8, + "tokens": 28, + "footnotesCount": 0, + "filePath": "Text/content_2.html" + }, + { + "chapterNumber": 13, + "chapterTitle": "От видения к практике", + "characters": 5527, + "tokens": 2236, + "footnotesCount": 0, + "filePath": "Text/content5.html" + }, + { + "chapterNumber": 14, + "chapterTitle": "Стратегия основана на предположениях", + "characters": 21948, + "tokens": 8811, + "footnotesCount": 0, + "filePath": "Text/content6.html" + }, + { + "chapterNumber": 15, + "chapterTitle": "Тестирование", + "characters": 40666, + "tokens": 16288, + "footnotesCount": 0, + "filePath": "Text/content7.html" + }, + { + "chapterNumber": 16, + "chapterTitle": "Как работает учет инноваций: три обучающих этапа", + "characters": 59200, + "tokens": 23717, + "footnotesCount": 0, + "filePath": "Text/content8.html" + }, + { + "chapterNumber": 17, + "chapterTitle": "Учет инноваций ускоряет процесс", + "characters": 51652, + "tokens": 20690, + "footnotesCount": 0, + "filePath": "Text/content9.html" + }, + { + "chapterNumber": 18, + "chapterTitle": "НАБИРАЕМ СКОРОСТЬ", + "characters": 9, + "tokens": 28, + "footnotesCount": 0, + "filePath": "Text/content_3.html" + }, + { + "chapterNumber": 19, + "chapterTitle": "Как запустить механизм", + "characters": 5837, + "tokens": 2361, + "footnotesCount": 0, + "filePath": "Text/content10.html" + }, + { + "chapterNumber": 20, + "chapterTitle": "Подход небольших партий в сфере предпринимательства", + "characters": 37655, + "tokens": 15101, + "footnotesCount": 0, + "filePath": "Text/content11.html" + }, + { + "chapterNumber": 21, + "chapterTitle": "Как добиться роста?", + "characters": 29714, + "tokens": 11911, + "footnotesCount": 0, + "filePath": "Text/content12.html" + }, + { + "chapterNumber": 22, + "chapterTitle": "Построение адаптивной организации", + "characters": 48018, + "tokens": 19239, + "footnotesCount": 0, + "filePath": "Text/content13.html" + }, + { + "chapterNumber": 23, + "chapterTitle": "Создание инноваций", + "characters": 33465, + "tokens": 13412, + "footnotesCount": 0, + "filePath": "Text/content14.html" + }, + { + "chapterNumber": 24, + "chapterTitle": "Эпилог: никаких потерь", + "characters": 22522, + "tokens": 9035, + "footnotesCount": 0, + "filePath": "Text/content15.html" + }, + { + "chapterNumber": 25, + "chapterTitle": "Присоединяйтесь к движению", + "characters": 4440, + "tokens": 1805, + "footnotesCount": 0, + "filePath": "Text/content16.html" + }, + { + "chapterNumber": 26, + "chapterTitle": "Список литературы", + "characters": 2753, + "tokens": 1126, + "footnotesCount": 0, + "filePath": "Text/content17.html" + }, + { + "chapterNumber": 27, + "chapterTitle": "Благодарности", + "characters": 7794, + "tokens": 3141, + "footnotesCount": 0, + "filePath": "Text/content18.html" + }, + { + "chapterNumber": 28, + "chapterTitle": "Link2", + "characters": 70, + "tokens": 46, + "footnotesCount": 0, + "filePath": "Text/link2.html" + }, + { + "chapterNumber": 29, + "chapterTitle": "Link", + "characters": 4963, + "tokens": 2001, + "footnotesCount": 0, + "filePath": "Text/link.html" + } + ] +} \ No newline at end of file diff --git a/books/statistics/Вдохновленные_statistics.json b/books/statistics/Вдохновленные_statistics.json new file mode 100644 index 0000000..69566e6 --- /dev/null +++ b/books/statistics/Вдохновленные_statistics.json @@ -0,0 +1,843 @@ +{ + "book": { + "title": "Вдохновленные", + "author": "Марти Каган", + "totalChapters": 104, + "totalCharacters": 493083, + "totalTokens": 201021 + }, + "chapters": [ + { + "chapterNumber": 1, + "chapterTitle": "Эту книгу хорошо дополняют:", + "characters": 147, + "tokens": 82, + "footnotesCount": 0, + "filePath": "tb.xhtml" + }, + { + "chapterNumber": 2, + "chapterTitle": "HOW TO CREATE TECH PRODUCTS CUSTOMERS LOVE", + "characters": 20, + "tokens": 38, + "footnotesCount": 0, + "filePath": "t1.xhtml" + }, + { + "chapterNumber": 3, + "chapterTitle": "ВСЕ, ЧТО НУЖНО ЗНАТЬ ПРОДАКТ-МЕНЕДЖЕРУ", + "characters": 35, + "tokens": 43, + "footnotesCount": 0, + "filePath": "t2.xhtml" + }, + { + "chapterNumber": 4, + "chapterTitle": "Информация от издательства", + "characters": 1508, + "tokens": 629, + "footnotesCount": 0, + "filePath": "info.xhtml" + }, + { + "chapterNumber": 5, + "chapterTitle": "Res", + "characters": 9202, + "tokens": 3696, + "footnotesCount": 0, + "filePath": "res.xhtml" + }, + { + "chapterNumber": 6, + "chapterTitle": "Epi", + "characters": 681, + "tokens": 288, + "footnotesCount": 0, + "filePath": "epi.xhtml" + }, + { + "chapterNumber": 7, + "chapterTitle": "ПРЕДИСЛОВИЕ", + "characters": 4350, + "tokens": 1759, + "footnotesCount": 2, + "filePath": "pre.xhtml" + }, + { + "chapterNumber": 8, + "chapterTitle": "УРОКИ ЛУЧШИХ ТЕХНОЛОГИЧЕСКИХ КОМПАНИЙ", + "characters": 0, + "tokens": 29, + "footnotesCount": 0, + "filePath": "ch1.xhtml" + }, + { + "chapterNumber": 9, + "chapterTitle": "Ch1 0", + "characters": 5429, + "tokens": 2189, + "footnotesCount": 0, + "filePath": "ch1-0.xhtml" + }, + { + "chapterNumber": 10, + "chapterTitle": "КТО СТОИТ ЗА КАЖДЫМ ОТЛИЧНЫМ ПРОДУКТОМ", + "characters": 2367, + "tokens": 975, + "footnotesCount": 1, + "filePath": "g1.xhtml" + }, + { + "chapterNumber": 11, + "chapterTitle": "ВЫСОКОТЕХНОЛОГИЧНЫЕ ПРОДУКТЫ И СЕРВИСЫ", + "characters": 1535, + "tokens": 643, + "footnotesCount": 0, + "filePath": "g2.xhtml" + }, + { + "chapterNumber": 12, + "chapterTitle": "СТАРТАПЫ: КАК ДОСТИЧЬ СООТВЕТСТВИЯ «ПРОДУКТ — РЫНОК»", + "characters": 2288, + "tokens": 949, + "footnotesCount": 0, + "filePath": "g3.xhtml" + }, + { + "chapterNumber": 13, + "chapterTitle": "КОМПАНИИ НА СТАДИИ РОСТА: УСПЕШНОЕ МАСШТАБИРОВАНИЕ", + "characters": 2092, + "tokens": 870, + "footnotesCount": 0, + "filePath": "g4.xhtml" + }, + { + "chapterNumber": 14, + "chapterTitle": "КОРПОРАЦИИ: НЕПРЕРЫВНЫЕ ПРОДУКТОВЫЕ ИННОВАЦИИ", + "characters": 3080, + "tokens": 1264, + "footnotesCount": 0, + "filePath": "g5.xhtml" + }, + { + "chapterNumber": 15, + "chapterTitle": "ФУНДАМЕНТАЛЬНЫЕ ПРИЧИНЫ НЕУДАЧ В РАБОТЕ НАД ПРОДУКТОМ", + "characters": 13298, + "tokens": 5354, + "footnotesCount": 0, + "filePath": "g6.xhtml" + }, + { + "chapterNumber": 16, + "chapterTitle": "LEAN И AGILE И НЕ ТОЛЬКО", + "characters": 3944, + "tokens": 1600, + "footnotesCount": 0, + "filePath": "g7.xhtml" + }, + { + "chapterNumber": 17, + "chapterTitle": "НЕПРЕРЫВНОЕ ИССЛЕДОВАНИЕ И ВЫВЕДЕНИЕ ПРОДУКТА НА РЫНОК", + "characters": 9468, + "tokens": 3822, + "footnotesCount": 2, + "filePath": "g8.xhtml" + }, + { + "chapterNumber": 18, + "chapterTitle": "ПРАВИЛЬНЫЕ ЛЮДИ", + "characters": 0, + "tokens": 21, + "footnotesCount": 0, + "filePath": "ch2.xhtml" + }, + { + "chapterNumber": 19, + "chapterTitle": "Ch2 0", + "characters": 578, + "tokens": 250, + "footnotesCount": 0, + "filePath": "ch2-0.xhtml" + }, + { + "chapterNumber": 20, + "chapterTitle": "ПРОДУКТОВЫЕ КОМАНДЫ", + "characters": 293, + "tokens": 142, + "footnotesCount": 0, + "filePath": "ch2-01.xhtml" + }, + { + "chapterNumber": 21, + "chapterTitle": "ПРИНЦИПЫ СИЛЬНЫХ ПРОДУКТОВЫХ КОМАНД", + "characters": 13976, + "tokens": 5618, + "footnotesCount": 2, + "filePath": "g9.xhtml" + }, + { + "chapterNumber": 22, + "chapterTitle": "ДОСКОНАЛЬНОЕ ЗНАНИЕ ПОТРЕБИТЕЛЯ", + "characters": 22156, + "tokens": 8889, + "footnotesCount": 0, + "filePath": "g10.xhtml" + }, + { + "chapterNumber": 23, + "chapterTitle": "КОМПЛЕКСНЫЙ ОПЫТ ВЗАИМОДЕЙСТВИЯ", + "characters": 11519, + "tokens": 4634, + "footnotesCount": 0, + "filePath": "g11.xhtml" + }, + { + "chapterNumber": 24, + "chapterTitle": "ИНЖЕНЕРЫ-ПРОГРАММИСТЫ", + "characters": 6166, + "tokens": 2489, + "footnotesCount": 0, + "filePath": "g12.xhtml" + }, + { + "chapterNumber": 25, + "chapterTitle": "ПРОДУКТОВЫЙ МАРКЕТОЛОГ", + "characters": 4627, + "tokens": 1873, + "footnotesCount": 0, + "filePath": "g13.xhtml" + }, + { + "chapterNumber": 26, + "chapterTitle": "ВСПОМОГАТЕЛЬНЫЕ РОЛИ", + "characters": 4836, + "tokens": 1957, + "footnotesCount": 0, + "filePath": "g14.xhtml" + }, + { + "chapterNumber": 27, + "chapterTitle": "ЗНАКОМЬТЕСЬ: ДЖЕЙН МЭННИНГ ИЗ GOOGLE", + "characters": 3982, + "tokens": 1621, + "footnotesCount": 1, + "filePath": "g15.xhtml" + }, + { + "chapterNumber": 28, + "chapterTitle": "МАСШТАБИРОВАНИЕ: ПЕРСОНАЛ", + "characters": 807, + "tokens": 350, + "footnotesCount": 0, + "filePath": "ch2-02.xhtml" + }, + { + "chapterNumber": 29, + "chapterTitle": "ЛИДЕРСТВО В УПРАВЛЕНИИ ПРОДУКТОМ", + "characters": 6828, + "tokens": 2758, + "footnotesCount": 0, + "filePath": "g16.xhtml" + }, + { + "chapterNumber": 30, + "chapterTitle": "ДИРЕКТОР ПО ПРОДУКТУ", + "characters": 12891, + "tokens": 5179, + "footnotesCount": 0, + "filePath": "g17.xhtml" + }, + { + "chapterNumber": 31, + "chapterTitle": "ДИРЕКТОР ПО ТЕХНОЛОГИЯМ", + "characters": 5581, + "tokens": 2256, + "footnotesCount": 0, + "filePath": "g18.xhtml" + }, + { + "chapterNumber": 32, + "chapterTitle": "ОПЕРАЦИОННЫЙ МЕНЕДЖЕР С ТЕХНИЧЕСКИМИ НАВЫКАМИ", + "characters": 2045, + "tokens": 851, + "footnotesCount": 1, + "filePath": "g19.xhtml" + }, + { + "chapterNumber": 33, + "chapterTitle": "СТРУКТУРИРОВАНИЕ ПРОДУКТОВЫХ КОМАНД", + "characters": 18241, + "tokens": 7325, + "footnotesCount": 1, + "filePath": "g20.xhtml" + }, + { + "chapterNumber": 34, + "chapterTitle": "ЗНАКОМЬТЕСЬ: ЛИА ХИКМАН ИЗ ADOBE", + "characters": 7178, + "tokens": 2898, + "footnotesCount": 0, + "filePath": "g21.xhtml" + }, + { + "chapterNumber": 35, + "chapterTitle": "ПРАВИЛЬНЫЙ ПРОДУКТ", + "characters": 0, + "tokens": 22, + "footnotesCount": 0, + "filePath": "ch3.xhtml" + }, + { + "chapterNumber": 36, + "chapterTitle": "Ch3 0", + "characters": 220, + "tokens": 107, + "footnotesCount": 0, + "filePath": "ch3-0.xhtml" + }, + { + "chapterNumber": 37, + "chapterTitle": "ДОРОЖНЫЕ КАРТЫ ПРОДУКТА", + "characters": 2777, + "tokens": 1137, + "footnotesCount": 0, + "filePath": "ch3-01.xhtml" + }, + { + "chapterNumber": 38, + "chapterTitle": "ПРОБЛЕМЫ ДОРОЖНЫХ КАРТ ПРОДУКТА", + "characters": 4086, + "tokens": 1661, + "footnotesCount": 0, + "filePath": "g22.xhtml" + }, + { + "chapterNumber": 39, + "chapterTitle": "АЛЬТЕРНАТИВА ДОРОЖНЫМ КАРТАМ", + "characters": 10593, + "tokens": 4263, + "footnotesCount": 1, + "filePath": "g23.xhtml" + }, + { + "chapterNumber": 40, + "chapterTitle": "ВИДЕНИЕ ПРОДУКТА", + "characters": 157, + "tokens": 86, + "footnotesCount": 0, + "filePath": "ch3-02.xhtml" + }, + { + "chapterNumber": 41, + "chapterTitle": "ВИДЕНИЕ ПРОДУКТА И СТРАТЕГИЯ ЕГО РАЗВИТИЯ", + "characters": 8604, + "tokens": 3472, + "footnotesCount": 0, + "filePath": "g24.xhtml" + }, + { + "chapterNumber": 42, + "chapterTitle": "ПРИНЦИПЫ СОЗДАНИЯ ВИДЕНИЯ ПРОДУКТА", + "characters": 4099, + "tokens": 1667, + "footnotesCount": 1, + "filePath": "g25.xhtml" + }, + { + "chapterNumber": 43, + "chapterTitle": "ПРИНЦИПЫ СТРАТЕГИИ РАЗВИТИЯ ПРОДУКТА", + "characters": 2150, + "tokens": 889, + "footnotesCount": 0, + "filePath": "g26.xhtml" + }, + { + "chapterNumber": 44, + "chapterTitle": "ПРИНЦИПЫ ПРОДУКТА", + "characters": 1762, + "tokens": 725, + "footnotesCount": 0, + "filePath": "g27.xhtml" + }, + { + "chapterNumber": 45, + "chapterTitle": "ЦЕЛИ СОЗДАНИЯ ПРОДУКТА", + "characters": 2616, + "tokens": 1072, + "footnotesCount": 0, + "filePath": "ch3-03.xhtml" + }, + { + "chapterNumber": 46, + "chapterTitle": "ГЛАВА 28", + "characters": 3532, + "tokens": 1430, + "footnotesCount": 0, + "filePath": "g28.xhtml" + }, + { + "chapterNumber": 47, + "chapterTitle": "ЦЕЛИ ПРОДУКТОВОЙ КОМАНДЫ", + "characters": 5736, + "tokens": 2318, + "footnotesCount": 0, + "filePath": "g29.xhtml" + }, + { + "chapterNumber": 48, + "chapterTitle": "МАСШТАБИРОВАНИЕ: ПРОДУКТ", + "characters": 1140, + "tokens": 483, + "footnotesCount": 0, + "filePath": "ch3-04.xhtml" + }, + { + "chapterNumber": 49, + "chapterTitle": "ЦЕЛИ СОЗДАНИЯ ПРОДУКТА И МАСШТАБИРОВАНИЕ", + "characters": 4576, + "tokens": 1861, + "footnotesCount": 0, + "filePath": "g30.xhtml" + }, + { + "chapterNumber": 50, + "chapterTitle": "ПРОДВИЖЕНИЕ ПРОДУКТА", + "characters": 5145, + "tokens": 2081, + "footnotesCount": 0, + "filePath": "g31.xhtml" + }, + { + "chapterNumber": 51, + "chapterTitle": "ЗНАКОМЬТЕСЬ: АЛЕКС ПРЕССЛАНД ИЗ BBC", + "characters": 3534, + "tokens": 1442, + "footnotesCount": 0, + "filePath": "g32.xhtml" + }, + { + "chapterNumber": 52, + "chapterTitle": "ПРАВИЛЬНЫЙ ПРОЦЕСС", + "characters": 0, + "tokens": 22, + "footnotesCount": 0, + "filePath": "ch4.xhtml" + }, + { + "chapterNumber": 53, + "chapterTitle": "Ch4 0", + "characters": 1217, + "tokens": 505, + "footnotesCount": 0, + "filePath": "ch4-0.xhtml" + }, + { + "chapterNumber": 54, + "chapterTitle": "ИССЛЕДОВАНИЕ ПРОДУКТА", + "characters": 6046, + "tokens": 2444, + "footnotesCount": 0, + "filePath": "ch4-01.xhtml" + }, + { + "chapterNumber": 55, + "chapterTitle": "ПРИНЦИПЫ ИССЛЕДОВАНИЯ ПРОДУКТА", + "characters": 10219, + "tokens": 4114, + "footnotesCount": 0, + "filePath": "g33.xhtml" + }, + { + "chapterNumber": 56, + "chapterTitle": "МЕТОДИКИ ИССЛЕДОВАНИЯ ПРОДУКТА: ОБЗОР", + "characters": 5362, + "tokens": 2173, + "footnotesCount": 0, + "filePath": "g34.xhtml" + }, + { + "chapterNumber": 57, + "chapterTitle": "МЕТОДИКИ ДЛЯ ФОРМУЛИРОВАНИЯ ЗАДАЧ", + "characters": 6111, + "tokens": 2475, + "footnotesCount": 0, + "filePath": "ch4-02.xhtml" + }, + { + "chapterNumber": 58, + "chapterTitle": "МЕТОДИКИ ДЛЯ ОЦЕНКИ ВОЗМОЖНОСТЕЙ", + "characters": 3281, + "tokens": 1339, + "footnotesCount": 0, + "filePath": "g35.xhtml" + }, + { + "chapterNumber": 59, + "chapterTitle": "МЕТОДИКА «ПИСЬМО КЛИЕНТА»", + "characters": 4894, + "tokens": 1982, + "footnotesCount": 0, + "filePath": "g36.xhtml" + }, + { + "chapterNumber": 60, + "chapterTitle": "МЕТОДИКА «КОНЦЕПЦИЯ СТАРТАПА»", + "characters": 7759, + "tokens": 3129, + "footnotesCount": 0, + "filePath": "g37.xhtml" + }, + { + "chapterNumber": 61, + "chapterTitle": "МЕТОДИКИ ПЛАНИРОВАНИЯ", + "characters": 1009, + "tokens": 429, + "footnotesCount": 0, + "filePath": "ch4-03.xhtml" + }, + { + "chapterNumber": 62, + "chapterTitle": "«КАРТА ИСТОРИИ»", + "characters": 3221, + "tokens": 1309, + "footnotesCount": 1, + "filePath": "g38.xhtml" + }, + { + "chapterNumber": 63, + "chapterTitle": "ПРОГРАММА ПО ИССЛЕДОВАНИЮ ПОТРЕБИТЕЛЕЙ", + "characters": 20618, + "tokens": 8277, + "footnotesCount": 0, + "filePath": "g39.xhtml" + }, + { + "chapterNumber": 64, + "chapterTitle": "ЗНАКОМЬТЕСЬ: МАРТИНА ЛАУЧЕНГКО ИЗ MICROSOFT", + "characters": 5241, + "tokens": 2128, + "footnotesCount": 0, + "filePath": "g40.xhtml" + }, + { + "chapterNumber": 65, + "chapterTitle": "МЕТОДИКИ ДЛЯ ПОИСКА ИДЕЙ", + "characters": 1650, + "tokens": 687, + "footnotesCount": 0, + "filePath": "ch4-04.xhtml" + }, + { + "chapterNumber": 66, + "chapterTitle": "ИНТЕРВЬЮ С ПОЛЬЗОВАТЕЛЕМ", + "characters": 4885, + "tokens": 1978, + "footnotesCount": 0, + "filePath": "g41.xhtml" + }, + { + "chapterNumber": 67, + "chapterTitle": "КОНСЬЕРЖ-ТЕСТ", + "characters": 1802, + "tokens": 740, + "footnotesCount": 0, + "filePath": "g42.xhtml" + }, + { + "chapterNumber": 68, + "chapterTitle": "СИЛА «НЕПРАВИЛЬНОГО» ПОВЕДЕНИЯ ПОТРЕБИТЕЛЯ", + "characters": 4440, + "tokens": 1807, + "footnotesCount": 0, + "filePath": "g43.xhtml" + }, + { + "chapterNumber": 69, + "chapterTitle": "ГЛАВА 44", + "characters": 1795, + "tokens": 736, + "footnotesCount": 1, + "filePath": "g44.xhtml" + }, + { + "chapterNumber": 70, + "chapterTitle": "МЕТОДИКИ ДЛЯ ПРОТОТИПИРОВАНИЯ", + "characters": 4042, + "tokens": 1645, + "footnotesCount": 0, + "filePath": "ch4-05.xhtml" + }, + { + "chapterNumber": 71, + "chapterTitle": "ГЛАВА 45", + "characters": 2348, + "tokens": 957, + "footnotesCount": 0, + "filePath": "g45.xhtml" + }, + { + "chapterNumber": 72, + "chapterTitle": "ПРОТОТИПЫ ДЛЯ ТЕСТИРОВАНИЯ РЕАЛИЗУЕМОСТИ", + "characters": 3612, + "tokens": 1475, + "footnotesCount": 0, + "filePath": "g46.xhtml" + }, + { + "chapterNumber": 73, + "chapterTitle": "ПОЛЬЗОВАТЕЛЬСКИЕ ПРОТОТИПЫ", + "characters": 3587, + "tokens": 1459, + "footnotesCount": 0, + "filePath": "g47.xhtml" + }, + { + "chapterNumber": 74, + "chapterTitle": "ПРОТОТИПЫ НА РЕАЛЬНЫХ ДАННЫХ", + "characters": 3491, + "tokens": 1422, + "footnotesCount": 0, + "filePath": "g48.xhtml" + }, + { + "chapterNumber": 75, + "chapterTitle": "СМЕШАННЫЕ ПРОТОТИПЫ", + "characters": 2837, + "tokens": 1156, + "footnotesCount": 0, + "filePath": "g49.xhtml" + }, + { + "chapterNumber": 76, + "chapterTitle": "МЕТОДИКИ ДЛЯ ТЕСТИРОВАНИЯ НА ЭТАПЕ ИССЛЕДОВАНИЯ ПРОДУКТА", + "characters": 2420, + "tokens": 1008, + "footnotesCount": 0, + "filePath": "ch4-06.xhtml" + }, + { + "chapterNumber": 77, + "chapterTitle": "КАК ПОДОБРАТЬ ПОЛЬЗОВАТЕЛЕЙ ДЛЯ УЧАСТИЯ В ТЕСТИРОВАНИИ", + "characters": 14989, + "tokens": 6031, + "footnotesCount": 0, + "filePath": "g50.xhtml" + }, + { + "chapterNumber": 78, + "chapterTitle": "КАЧЕСТВЕННОЕ ТЕСТИРОВАНИЕ ЦЕННОСТИ", + "characters": 2751, + "tokens": 1128, + "footnotesCount": 0, + "filePath": "g51.xhtml" + }, + { + "chapterNumber": 79, + "chapterTitle": "МЕТОДИКИ ТЕСТИРОВАНИЯ СПРОСА", + "characters": 10509, + "tokens": 4229, + "footnotesCount": 0, + "filePath": "g52.xhtml" + }, + { + "chapterNumber": 80, + "chapterTitle": "КАЧЕСТВЕННЫЕ МЕТОДИКИ ТЕСТИРОВАНИЯ ЦЕННОСТИ", + "characters": 7978, + "tokens": 3223, + "footnotesCount": 0, + "filePath": "g53.xhtml" + }, + { + "chapterNumber": 81, + "chapterTitle": "КОЛИЧЕСТВЕННЫЕ МЕТОДИКИ ТЕСТИРОВАНИЯ ЦЕННОСТИ", + "characters": 16188, + "tokens": 6508, + "footnotesCount": 0, + "filePath": "g54.xhtml" + }, + { + "chapterNumber": 82, + "chapterTitle": "ТЕСТИРОВАНИЕ РЕАЛИЗУЕМОСТИ", + "characters": 5955, + "tokens": 2407, + "footnotesCount": 0, + "filePath": "g55.xhtml" + }, + { + "chapterNumber": 83, + "chapterTitle": "ТЕСТИРОВАНИЕ БИЗНЕС-ЖИЗНЕСПОСОБНОСТИ", + "characters": 10480, + "tokens": 4221, + "footnotesCount": 0, + "filePath": "g56.xhtml" + }, + { + "chapterNumber": 84, + "chapterTitle": "ЗНАКОМЬТЕСЬ: КЕЙТ АРНОЛЬД ИЗ NETFLIX", + "characters": 4855, + "tokens": 1971, + "footnotesCount": 0, + "filePath": "g57.xhtml" + }, + { + "chapterNumber": 85, + "chapterTitle": "МЕТОДИКИ ДЛЯ ПРЕОБРАЗОВАНИЙ", + "characters": 937, + "tokens": 402, + "footnotesCount": 0, + "filePath": "ch4-07.xhtml" + }, + { + "chapterNumber": 86, + "chapterTitle": "СПРИНТ НА ЭТАПЕ ИССЛЕДОВАНИЯ ПРОДУКТА", + "characters": 7790, + "tokens": 3145, + "footnotesCount": 1, + "filePath": "g58.xhtml" + }, + { + "chapterNumber": 87, + "chapterTitle": "ПИЛОТНЫЕ КОМАНДЫ", + "characters": 2454, + "tokens": 1002, + "footnotesCount": 0, + "filePath": "g59.xhtml" + }, + { + "chapterNumber": 88, + "chapterTitle": "ОТКАЗ ОТ ДОРОЖНЫХ КАРТ", + "characters": 2357, + "tokens": 965, + "footnotesCount": 0, + "filePath": "g60.xhtml" + }, + { + "chapterNumber": 89, + "chapterTitle": "МАСШТАБИРОВАНИЕ: ПРОЦЕСС", + "characters": 1875, + "tokens": 777, + "footnotesCount": 0, + "filePath": "ch4-08.xhtml" + }, + { + "chapterNumber": 90, + "chapterTitle": "КТО ТАКИЕ ЗАИНТЕРЕСОВАННЫЕ СТОРОНЫ", + "characters": 14251, + "tokens": 5728, + "footnotesCount": 1, + "filePath": "g61.xhtml" + }, + { + "chapterNumber": 91, + "chapterTitle": "РАСПРОСТРАНЕНИЕ НОВЫХ ЗНАНИЙ О ПРОДУКТЕ", + "characters": 2559, + "tokens": 1053, + "footnotesCount": 0, + "filePath": "g62.xhtml" + }, + { + "chapterNumber": 92, + "chapterTitle": "ЗНАКОМЬТЕСЬ: КАМИЛЛА ХЕРСТ ИЗ APPLE", + "characters": 3673, + "tokens": 1498, + "footnotesCount": 1, + "filePath": "g63.xhtml" + }, + { + "chapterNumber": 93, + "chapterTitle": "ЧАСТЬ V", + "characters": 0, + "tokens": 17, + "footnotesCount": 0, + "filePath": "ch5.xhtml" + }, + { + "chapterNumber": 94, + "chapterTitle": "Ch5 0", + "characters": 696, + "tokens": 297, + "footnotesCount": 0, + "filePath": "ch5-0.xhtml" + }, + { + "chapterNumber": 95, + "chapterTitle": "ХОРОШАЯ ИЛИ ПЛОХАЯ ПРОДУКТОВАЯ КОМАНДА", + "characters": 6159, + "tokens": 2493, + "footnotesCount": 0, + "filePath": "g64.xhtml" + }, + { + "chapterNumber": 96, + "chapterTitle": "ПРИЧИНЫ ПРОБЛЕМ С ИННОВАЦИЯМИ", + "characters": 4923, + "tokens": 1995, + "footnotesCount": 0, + "filePath": "g65.xhtml" + }, + { + "chapterNumber": 97, + "chapterTitle": "ПРИЧИНЫ ПРОБЛЕМ С ТЕМПАМИ РАЗРАБОТКИ", + "characters": 3592, + "tokens": 1465, + "footnotesCount": 0, + "filePath": "g66.xhtml" + }, + { + "chapterNumber": 98, + "chapterTitle": "СОЗДАНИЕ СИЛЬНОЙ ПРОДУКТОВОЙ КУЛЬТУРЫ", + "characters": 5137, + "tokens": 2083, + "footnotesCount": 0, + "filePath": "g67.xhtml" + }, + { + "chapterNumber": 99, + "chapterTitle": "БЛАГОДАРНОСТИ", + "characters": 2863, + "tokens": 1164, + "footnotesCount": 0, + "filePath": "th.xhtml" + }, + { + "chapterNumber": 100, + "chapterTitle": "ОБ АВТОРЕ", + "characters": 1885, + "tokens": 774, + "footnotesCount": 0, + "filePath": "about.xhtml" + }, + { + "chapterNumber": 101, + "chapterTitle": "УЗНАЙТЕ БОЛЬШЕ", + "characters": 1099, + "tokens": 460, + "footnotesCount": 0, + "filePath": "more.xhtml" + }, + { + "chapterNumber": 102, + "chapterTitle": "ПРИМЕЧАНИЯ", + "characters": 2813, + "tokens": 2266, + "footnotesCount": 34, + "filePath": "links.xhtml" + }, + { + "chapterNumber": 103, + "chapterTitle": "МИФ Бизнес", + "characters": 161, + "tokens": 87, + "footnotesCount": 0, + "filePath": "business.html" + }, + { + "chapterNumber": 104, + "chapterTitle": "НАД КНИГОЙ РАБОТАЛИ", + "characters": 392, + "tokens": 179, + "footnotesCount": 0, + "filePath": "end.xhtml" + } + ] +} \ No newline at end of file diff --git a/books/statistics/Великие по собственному выбору_statistics.json b/books/statistics/Великие по собственному выбору_statistics.json new file mode 100644 index 0000000..3e320d9 --- /dev/null +++ b/books/statistics/Великие по собственному выбору_statistics.json @@ -0,0 +1,291 @@ +{ + "book": { + "title": "Великие по собственному выбору", + "author": "Джим Коллинз & Мортен Хансен", + "totalChapters": 35, + "totalCharacters": 557715, + "totalTokens": 227225 + }, + "chapters": [ + { + "chapterNumber": 1, + "chapterTitle": "Информация от издательства", + "characters": 1175, + "tokens": 498, + "footnotesCount": 0, + "filePath": "Text/info.xhtml" + }, + { + "chapterNumber": 2, + "chapterTitle": "Epi", + "characters": 175, + "tokens": 88, + "footnotesCount": 0, + "filePath": "Text/epi.xhtml" + }, + { + "chapterNumber": 3, + "chapterTitle": "Величие посреди хаоса", + "characters": 20370, + "tokens": 8180, + "footnotesCount": 7, + "filePath": "Text/gl1.xhtml" + }, + { + "chapterNumber": 4, + "chapterTitle": "Вы Амундсен или Скотт?", + "characters": 50407, + "tokens": 20200, + "footnotesCount": 13, + "filePath": "Text/gl2.xhtml" + }, + { + "chapterNumber": 5, + "chapterTitle": "Двадцатимильный марш", + "characters": 0, + "tokens": 25, + "footnotesCount": 0, + "filePath": "Text/gl3.xhtml" + }, + { + "chapterNumber": 6, + "chapterTitle": "Двадцатимильный марш Джона Брауна", + "characters": 49679, + "tokens": 19903, + "footnotesCount": 1, + "filePath": "Text/gl3-1.xhtml" + }, + { + "chapterNumber": 7, + "chapterTitle": "Сначала пули, ядра потом", + "characters": 0, + "tokens": 26, + "footnotesCount": 0, + "filePath": "Text/gl4.xhtml" + }, + { + "chapterNumber": 8, + "chapterTitle": "Сюрприз, большой сюрприз", + "characters": 55550, + "tokens": 22249, + "footnotesCount": 2, + "filePath": "Text/gl4-1.xhtml" + }, + { + "chapterNumber": 9, + "chapterTitle": "Лидерство над линией смерти", + "characters": 0, + "tokens": 27, + "footnotesCount": 0, + "filePath": "Text/gl5.xhtml" + }, + { + "chapterNumber": 10, + "chapterTitle": "Не все моменты в жизни равноценны", + "characters": 45592, + "tokens": 18276, + "footnotesCount": 8, + "filePath": "Text/gl5-1.xhtml" + }, + { + "chapterNumber": 11, + "chapterTitle": "Глава 6", + "characters": 0, + "tokens": 19, + "footnotesCount": 0, + "filePath": "Text/gl6.xhtml" + }, + { + "chapterNumber": 12, + "chapterTitle": "С фанатичной дисциплиной придерживаться рецепта СМаК", + "characters": 45866, + "tokens": 18385, + "footnotesCount": 0, + "filePath": "Text/gl6-1.xhtml" + }, + { + "chapterNumber": 13, + "chapterTitle": "Удача или опыт?", + "characters": 60149, + "tokens": 24091, + "footnotesCount": 2, + "filePath": "Text/gl7.xhtml" + }, + { + "chapterNumber": 14, + "chapterTitle": "ЭПИЛОГ", + "characters": 4114, + "tokens": 1667, + "footnotesCount": 0, + "filePath": "Text/epilog.xhtml" + }, + { + "chapterNumber": 15, + "chapterTitle": "Часто задаваемые вопросы", + "characters": 24967, + "tokens": 10014, + "footnotesCount": 2, + "filePath": "Text/faq.xhtml" + }, + { + "chapterNumber": 16, + "chapterTitle": "ПРИНЦИПЫ ИССЛЕДОВАНИЯ", + "characters": 0, + "tokens": 28, + "footnotesCount": 0, + "filePath": "Text/princip.xhtml" + }, + { + "chapterNumber": 17, + "chapterTitle": "Методология", + "characters": 20109, + "tokens": 8073, + "footnotesCount": 2, + "filePath": "Text/methodology.xhtml" + }, + { + "chapterNumber": 18, + "chapterTitle": "Отбор компаний в группу 10×", + "characters": 7163, + "tokens": 2894, + "footnotesCount": 0, + "filePath": "Text/otbor.xhtml" + }, + { + "chapterNumber": 19, + "chapterTitle": "Отбор компаний для сравнения", + "characters": 5200, + "tokens": 2111, + "footnotesCount": 0, + "filePath": "Text/otbor2.xhtml" + }, + { + "chapterNumber": 20, + "chapterTitle": "Двадцатимильный марш", + "characters": 3175, + "tokens": 1299, + "footnotesCount": 0, + "filePath": "Text/20miles.xhtml" + }, + { + "chapterNumber": 21, + "chapterTitle": "Анализ инноваций", + "characters": 5059, + "tokens": 2053, + "footnotesCount": 0, + "filePath": "Text/analyse_inn.xhtml" + }, + { + "chapterNumber": 22, + "chapterTitle": "Сначала пули, ядра потом", + "characters": 4138, + "tokens": 1683, + "footnotesCount": 1, + "filePath": "Text/puli.xhtml" + }, + { + "chapterNumber": 23, + "chapterTitle": "Анализ рисков по ликвидности и балансу", + "characters": 3369, + "tokens": 1390, + "footnotesCount": 4, + "filePath": "Text/analyse_risk.xhtml" + }, + { + "chapterNumber": 24, + "chapterTitle": "Анализ категорий риска", + "characters": 4389, + "tokens": 1790, + "footnotesCount": 3, + "filePath": "Text/analyse_cat.xhtml" + }, + { + "chapterNumber": 25, + "chapterTitle": "Анализ скорости", + "characters": 6479, + "tokens": 2629, + "footnotesCount": 7, + "filePath": "Text/analyse-speed.xhtml" + }, + { + "chapterNumber": 26, + "chapterTitle": "Анализ рецепта СМаК", + "characters": 2841, + "tokens": 1169, + "footnotesCount": 2, + "filePath": "Text/analyse-smak.xhtml" + }, + { + "chapterNumber": 27, + "chapterTitle": "Анализ удачи", + "characters": 8063, + "tokens": 3259, + "footnotesCount": 5, + "filePath": "Text/analyse-lucky.xhtml" + }, + { + "chapterNumber": 28, + "chapterTitle": "Анализ Зала Славы хоккея", + "characters": 1859, + "tokens": 770, + "footnotesCount": 1, + "filePath": "Text/zal.xhtml" + }, + { + "chapterNumber": 29, + "chapterTitle": "ПРИМЕЧАНИЯ", + "characters": 101705, + "tokens": 40705, + "footnotesCount": 0, + "filePath": "Text/notes.xhtml" + }, + { + "chapterNumber": 30, + "chapterTitle": "БЛАГОДАРНОСТИ", + "characters": 7161, + "tokens": 2889, + "footnotesCount": 0, + "filePath": "Text/thanks.xhtml" + }, + { + "chapterNumber": 31, + "chapterTitle": "ОБ АВТОРЕ", + "characters": 568, + "tokens": 250, + "footnotesCount": 0, + "filePath": "Text/author.xhtml" + }, + { + "chapterNumber": 32, + "chapterTitle": "Links", + "characters": 7488, + "tokens": 6136, + "footnotesCount": 118, + "filePath": "Text/links.xhtml" + }, + { + "chapterNumber": 33, + "chapterTitle": "Над книгой работали", + "characters": 302, + "tokens": 144, + "footnotesCount": 0, + "filePath": "Text/end.xhtml" + }, + { + "chapterNumber": 34, + "chapterTitle": "Books", + "characters": 10270, + "tokens": 4129, + "footnotesCount": 0, + "filePath": "Text/books.xhtml" + }, + { + "chapterNumber": 35, + "chapterTitle": "Максимально полезные книги от издательства «Манн, Иванов и Фербер»", + "characters": 333, + "tokens": 176, + "footnotesCount": 0, + "filePath": "Text/max.xhtml" + } + ] +} \ No newline at end of file diff --git a/books/statistics/Всё о бизнесе за два часа Секреты юристов и бухгалтеров_statistics.json b/books/statistics/Всё о бизнесе за два часа Секреты юристов и бухгалтеров_statistics.json new file mode 100644 index 0000000..e9476d4 --- /dev/null +++ b/books/statistics/Всё о бизнесе за два часа Секреты юристов и бухгалтеров_statistics.json @@ -0,0 +1,155 @@ +{ + "book": { + "title": "Всё о бизнесе за два часа: Секреты юристов и бухгалтеров", + "author": "Елена Ёлгина, Елена Смолякова, Александр Мельников", + "totalChapters": 18, + "totalCharacters": 363207, + "totalTokens": 145842 + }, + "chapters": [ + { + "chapterNumber": 1, + "chapterTitle": "Content01", + "characters": 0, + "tokens": 24, + "footnotesCount": 0, + "filePath": "Text/content01.html" + }, + { + "chapterNumber": 2, + "chapterTitle": "Dsc", + "characters": 897, + "tokens": 375, + "footnotesCount": 0, + "filePath": "Text/dsc.html" + }, + { + "chapterNumber": 3, + "chapterTitle": "ИСПОЛЬЗОВАННЫЕ СОКРАЩЕНИЯ", + "characters": 1316, + "tokens": 557, + "footnotesCount": 0, + "filePath": "Text/content03.html" + }, + { + "chapterNumber": 4, + "chapterTitle": "ВВЕДЕНИЕ", + "characters": 2559, + "tokens": 1047, + "footnotesCount": 0, + "filePath": "Text/content04.html" + }, + { + "chapterNumber": 5, + "chapterTitle": "1. ИП или юридическое лицо? АО или ООО?", + "characters": 63381, + "tokens": 25387, + "footnotesCount": 0, + "filePath": "Text/content1.html" + }, + { + "chapterNumber": 6, + "chapterTitle": "УПРОЩЕННАЯ СИСТЕМА НАЛОГООБЛОЖЕНИЯ (УСН)", + "characters": 39504, + "tokens": 15837, + "footnotesCount": 0, + "filePath": "Text/content2.html" + }, + { + "chapterNumber": 7, + "chapterTitle": "ОБЩАЯ СИСТЕМА НАЛОГООБЛОЖЕНИЯ (ОСН)", + "characters": 66926, + "tokens": 26804, + "footnotesCount": 0, + "filePath": "Text/content3.html" + }, + { + "chapterNumber": 8, + "chapterTitle": "СТРАХОВЫЕ ВЗНОСЫ И НДФЛ: «ЗАРПЛАТНЫЕ НАЛОГИ»", + "characters": 26378, + "tokens": 10588, + "footnotesCount": 0, + "filePath": "Text/content4.html" + }, + { + "chapterNumber": 9, + "chapterTitle": "КАК ВЛИТЬ ДЕНЬГИ В БИЗНЕС?", + "characters": 7863, + "tokens": 3175, + "footnotesCount": 0, + "filePath": "Text/content5.html" + }, + { + "chapterNumber": 10, + "chapterTitle": "ДОХОДЫ ОТ БИЗНЕСА: КАК ИХ ПОЛУЧИТЬ В СВОЙ КАРМАН?", + "characters": 12079, + "tokens": 4870, + "footnotesCount": 0, + "filePath": "Text/content6.html" + }, + { + "chapterNumber": 11, + "chapterTitle": "3.1. Какие выгоды франшиза дает собственнику?", + "characters": 19093, + "tokens": 7675, + "footnotesCount": 0, + "filePath": "Text/content7.html" + }, + { + "chapterNumber": 12, + "chapterTitle": "1. Зачем нужен бухгалтерский учет?", + "characters": 18384, + "tokens": 7386, + "footnotesCount": 0, + "filePath": "Text/content8.html" + }, + { + "chapterNumber": 13, + "chapterTitle": "3. Кассового аппарата нет, а касса есть?", + "characters": 21867, + "tokens": 8782, + "footnotesCount": 0, + "filePath": "Text/content9.html" + }, + { + "chapterNumber": 14, + "chapterTitle": "2. Как выплачивать зарплату?", + "characters": 22452, + "tokens": 9012, + "footnotesCount": 0, + "filePath": "Text/content10.html" + }, + { + "chapterNumber": 15, + "chapterTitle": "БИЗНЕС-КЕЙС. НЕКОТОРЫЕ ПОДРОБНОСТИ И РАЗЪЯСНЕНИЯ", + "characters": 48842, + "tokens": 19576, + "footnotesCount": 0, + "filePath": "Text/content11.html" + }, + { + "chapterNumber": 16, + "chapterTitle": "ЗАКЛЮЧЕНИЕ", + "characters": 3013, + "tokens": 1230, + "footnotesCount": 0, + "filePath": "Text/content05.html" + }, + { + "chapterNumber": 17, + "chapterTitle": "Список нормативных документов", + "characters": 8163, + "tokens": 3297, + "footnotesCount": 0, + "filePath": "Text/content06.html" + }, + { + "chapterNumber": 18, + "chapterTitle": "Content02", + "characters": 490, + "tokens": 220, + "footnotesCount": 0, + "filePath": "Text/content02.html" + } + ] +} \ No newline at end of file diff --git a/books/statistics/Гроуинг 1.0. 22 маркетинговых действия для роста бизнеса_statistics.json b/books/statistics/Гроуинг 1.0. 22 маркетинговых действия для роста бизнеса_statistics.json new file mode 100644 index 0000000..8187d43 --- /dev/null +++ b/books/statistics/Гроуинг 1.0. 22 маркетинговых действия для роста бизнеса_statistics.json @@ -0,0 +1,347 @@ +{ + "book": { + "title": "Гроуинг 1.0. 22 маркетинговых действия для роста бизнеса", + "author": "ИГОРЬ МАНН", + "totalChapters": 42, + "totalCharacters": 119573, + "totalTokens": 49104 + }, + "chapters": [ + { + "chapterNumber": 1, + "chapterTitle": "Гроуинг Епаб", + "characters": 897, + "tokens": 385, + "footnotesCount": 0, + "filePath": "Гроуинг_-_ЕПАБ.xhtml" + }, + { + "chapterNumber": 2, + "chapterTitle": "Гроуинг Епаб 1", + "characters": 926, + "tokens": 399, + "footnotesCount": 0, + "filePath": "Гроуинг_-_ЕПАБ-1.xhtml" + }, + { + "chapterNumber": 3, + "chapterTitle": "Гроуинг Епаб 2", + "characters": 5116, + "tokens": 2118, + "footnotesCount": 2, + "filePath": "Гроуинг_-_ЕПАБ-2.xhtml" + }, + { + "chapterNumber": 4, + "chapterTitle": "Гроуинг Епаб 3", + "characters": 10562, + "tokens": 4253, + "footnotesCount": 0, + "filePath": "Гроуинг_-_ЕПАБ-3.xhtml" + }, + { + "chapterNumber": 5, + "chapterTitle": "Гроуинг Епаб 4", + "characters": 1378, + "tokens": 580, + "footnotesCount": 0, + "filePath": "Гроуинг_-_ЕПАБ-4.xhtml" + }, + { + "chapterNumber": 6, + "chapterTitle": "Гроуинг Епаб 5", + "characters": 4134, + "tokens": 1682, + "footnotesCount": 0, + "filePath": "Гроуинг_-_ЕПАБ-5.xhtml" + }, + { + "chapterNumber": 7, + "chapterTitle": "Гроуинг Епаб 6", + "characters": 4207, + "tokens": 1711, + "footnotesCount": 0, + "filePath": "Гроуинг_-_ЕПАБ-6.xhtml" + }, + { + "chapterNumber": 8, + "chapterTitle": "Гроуинг Епаб 7", + "characters": 28, + "tokens": 40, + "footnotesCount": 0, + "filePath": "Гроуинг_-_ЕПАБ-7.xhtml" + }, + { + "chapterNumber": 9, + "chapterTitle": "Гроуинг Епаб 8", + "characters": 1267, + "tokens": 535, + "footnotesCount": 0, + "filePath": "Гроуинг_-_ЕПАБ-8.xhtml" + }, + { + "chapterNumber": 10, + "chapterTitle": "Гроуинг Епаб 9", + "characters": 6558, + "tokens": 2653, + "footnotesCount": 0, + "filePath": "Гроуинг_-_ЕПАБ-9.xhtml" + }, + { + "chapterNumber": 11, + "chapterTitle": "Гроуинг Епаб 10", + "characters": 4569, + "tokens": 1857, + "footnotesCount": 0, + "filePath": "Гроуинг_-_ЕПАБ-10.xhtml" + }, + { + "chapterNumber": 12, + "chapterTitle": "Гроуинг Епаб 11", + "characters": 818, + "tokens": 357, + "footnotesCount": 0, + "filePath": "Гроуинг_-_ЕПАБ-11.xhtml" + }, + { + "chapterNumber": 13, + "chapterTitle": "Гроуинг Епаб 12", + "characters": 1764, + "tokens": 735, + "footnotesCount": 0, + "filePath": "Гроуинг_-_ЕПАБ-12.xhtml" + }, + { + "chapterNumber": 14, + "chapterTitle": "Гроуинг Епаб 13", + "characters": 2986, + "tokens": 1224, + "footnotesCount": 0, + "filePath": "Гроуинг_-_ЕПАБ-13.xhtml" + }, + { + "chapterNumber": 15, + "chapterTitle": "Гроуинг Епаб 14", + "characters": 558, + "tokens": 253, + "footnotesCount": 0, + "filePath": "Гроуинг_-_ЕПАБ-14.xhtml" + }, + { + "chapterNumber": 16, + "chapterTitle": "Гроуинг Епаб 15", + "characters": 1400, + "tokens": 590, + "footnotesCount": 0, + "filePath": "Гроуинг_-_ЕПАБ-15.xhtml" + }, + { + "chapterNumber": 17, + "chapterTitle": "Гроуинг Епаб 16", + "characters": 4366, + "tokens": 1776, + "footnotesCount": 0, + "filePath": "Гроуинг_-_ЕПАБ-16.xhtml" + }, + { + "chapterNumber": 18, + "chapterTitle": "Гроуинг Епаб 17", + "characters": 3167, + "tokens": 1296, + "footnotesCount": 0, + "filePath": "Гроуинг_-_ЕПАБ-17.xhtml" + }, + { + "chapterNumber": 19, + "chapterTitle": "Гроуинг Епаб 18", + "characters": 11225, + "tokens": 4520, + "footnotesCount": 0, + "filePath": "Гроуинг_-_ЕПАБ-18.xhtml" + }, + { + "chapterNumber": 20, + "chapterTitle": "Гроуинг Епаб 19", + "characters": 1338, + "tokens": 565, + "footnotesCount": 0, + "filePath": "Гроуинг_-_ЕПАБ-19.xhtml" + }, + { + "chapterNumber": 21, + "chapterTitle": "Гроуинг Епаб 20", + "characters": 1682, + "tokens": 702, + "footnotesCount": 0, + "filePath": "Гроуинг_-_ЕПАБ-20.xhtml" + }, + { + "chapterNumber": 22, + "chapterTitle": "Гроуинг Епаб 21", + "characters": 2305, + "tokens": 952, + "footnotesCount": 0, + "filePath": "Гроуинг_-_ЕПАБ-21.xhtml" + }, + { + "chapterNumber": 23, + "chapterTitle": "Гроуинг Епаб 22", + "characters": 548, + "tokens": 249, + "footnotesCount": 0, + "filePath": "Гроуинг_-_ЕПАБ-22.xhtml" + }, + { + "chapterNumber": 24, + "chapterTitle": "Гроуинг Епаб 23", + "characters": 1514, + "tokens": 635, + "footnotesCount": 0, + "filePath": "Гроуинг_-_ЕПАБ-23.xhtml" + }, + { + "chapterNumber": 25, + "chapterTitle": "Гроуинг Епаб 24", + "characters": 4573, + "tokens": 1859, + "footnotesCount": 0, + "filePath": "Гроуинг_-_ЕПАБ-24.xhtml" + }, + { + "chapterNumber": 26, + "chapterTitle": "Гроуинг Епаб 25", + "characters": 946, + "tokens": 408, + "footnotesCount": 0, + "filePath": "Гроуинг_-_ЕПАБ-25.xhtml" + }, + { + "chapterNumber": 27, + "chapterTitle": "Гроуинг Епаб 26", + "characters": 2235, + "tokens": 924, + "footnotesCount": 0, + "filePath": "Гроуинг_-_ЕПАБ-26.xhtml" + }, + { + "chapterNumber": 28, + "chapterTitle": "Гроуинг Епаб 27", + "characters": 3300, + "tokens": 1350, + "footnotesCount": 0, + "filePath": "Гроуинг_-_ЕПАБ-27.xhtml" + }, + { + "chapterNumber": 29, + "chapterTitle": "Гроуинг Епаб 28", + "characters": 692, + "tokens": 306, + "footnotesCount": 0, + "filePath": "Гроуинг_-_ЕПАБ-28.xhtml" + }, + { + "chapterNumber": 30, + "chapterTitle": "Гроуинг Епаб 29", + "characters": 7153, + "tokens": 2891, + "footnotesCount": 0, + "filePath": "Гроуинг_-_ЕПАБ-29.xhtml" + }, + { + "chapterNumber": 31, + "chapterTitle": "Гроуинг Епаб 30", + "characters": 2829, + "tokens": 1161, + "footnotesCount": 0, + "filePath": "Гроуинг_-_ЕПАБ-30.xhtml" + }, + { + "chapterNumber": 32, + "chapterTitle": "Гроуинг Епаб 31", + "characters": 2857, + "tokens": 1172, + "footnotesCount": 0, + "filePath": "Гроуинг_-_ЕПАБ-31.xhtml" + }, + { + "chapterNumber": 33, + "chapterTitle": "Гроуинг Епаб 32", + "characters": 4493, + "tokens": 1827, + "footnotesCount": 0, + "filePath": "Гроуинг_-_ЕПАБ-32.xhtml" + }, + { + "chapterNumber": 34, + "chapterTitle": "Гроуинг Епаб 33", + "characters": 2801, + "tokens": 1150, + "footnotesCount": 0, + "filePath": "Гроуинг_-_ЕПАБ-33.xhtml" + }, + { + "chapterNumber": 35, + "chapterTitle": "Гроуинг Епаб 34", + "characters": 1880, + "tokens": 782, + "footnotesCount": 0, + "filePath": "Гроуинг_-_ЕПАБ-34.xhtml" + }, + { + "chapterNumber": 36, + "chapterTitle": "Гроуинг Епаб 35", + "characters": 2314, + "tokens": 955, + "footnotesCount": 0, + "filePath": "Гроуинг_-_ЕПАБ-35.xhtml" + }, + { + "chapterNumber": 37, + "chapterTitle": "Гроуинг Епаб 36", + "characters": 1344, + "tokens": 567, + "footnotesCount": 0, + "filePath": "Гроуинг_-_ЕПАБ-36.xhtml" + }, + { + "chapterNumber": 38, + "chapterTitle": "Гроуинг Епаб 37", + "characters": 1831, + "tokens": 762, + "footnotesCount": 0, + "filePath": "Гроуинг_-_ЕПАБ-37.xhtml" + }, + { + "chapterNumber": 39, + "chapterTitle": "Гроуинг Епаб 38", + "characters": 3615, + "tokens": 1476, + "footnotesCount": 0, + "filePath": "Гроуинг_-_ЕПАБ-38.xhtml" + }, + { + "chapterNumber": 40, + "chapterTitle": "Гроуинг Епаб 39", + "characters": 2344, + "tokens": 967, + "footnotesCount": 0, + "filePath": "Гроуинг_-_ЕПАБ-39.xhtml" + }, + { + "chapterNumber": 41, + "chapterTitle": "Гроуинг Епаб 40", + "characters": 801, + "tokens": 350, + "footnotesCount": 0, + "filePath": "Гроуинг_-_ЕПАБ-40.xhtml" + }, + { + "chapterNumber": 42, + "chapterTitle": "Гроуинг Епаб 41", + "characters": 252, + "tokens": 130, + "footnotesCount": 0, + "filePath": "Гроуинг_-_ЕПАБ-41.xhtml" + } + ] +} \ No newline at end of file diff --git a/books/statistics/Думай как миллионер. 17 уроков состоятельности для тех, кто готов разбогатеть_statistics.json b/books/statistics/Думай как миллионер. 17 уроков состоятельности для тех, кто готов разбогатеть_statistics.json new file mode 100644 index 0000000..7d5ff9a --- /dev/null +++ b/books/statistics/Думай как миллионер. 17 уроков состоятельности для тех, кто готов разбогатеть_statistics.json @@ -0,0 +1,243 @@ +{ + "book": { + "title": "Думай как миллионер. 17 уроков состоятельности для тех, кто готов разбогатеть", + "author": "Т. Харс Экер", + "totalChapters": 29, + "totalCharacters": 309740, + "totalTokens": 124976 + }, + "chapters": [ + { + "chapterNumber": 1, + "chapterTitle": "Т. Харв Экер Думай как миллионер. 17 уроков состоятельности для тех, кто готов разбогатеть", + "characters": 16252, + "tokens": 6552, + "footnotesCount": 0, + "filePath": "content0.html" + }, + { + "chapterNumber": 2, + "chapterTitle": "Почему финансовая программа столь важна?", + "characters": 8822, + "tokens": 3560, + "footnotesCount": 0, + "filePath": "content1.html" + }, + { + "chapterNumber": 3, + "chapterTitle": "Что такое финансовая программа и как она формируется?", + "characters": 6775, + "tokens": 2747, + "footnotesCount": 0, + "filePath": "content2.html" + }, + { + "chapterNumber": 4, + "chapterTitle": "Воздействие первое: вербальное программирование", + "characters": 7645, + "tokens": 3092, + "footnotesCount": 0, + "filePath": "content3.html" + }, + { + "chapterNumber": 5, + "chapterTitle": "Шаг к переменам: вербальное программирование", + "characters": 15152, + "tokens": 6093, + "footnotesCount": 0, + "filePath": "content4.html" + }, + { + "chapterNumber": 6, + "chapterTitle": "Воздействие третье: личный опыт", + "characters": 7012, + "tokens": 2832, + "footnotesCount": 0, + "filePath": "content5.html" + }, + { + "chapterNumber": 7, + "chapterTitle": "На что же ориентирована ваша финансовая программа?", + "characters": 15708, + "tokens": 6319, + "footnotesCount": 0, + "filePath": "content6.html" + }, + { + "chapterNumber": 8, + "chapterTitle": "Семнадцать различий в мышлении и поступках богатых, бедных и представителей среднего класса", + "characters": 8056, + "tokens": 3274, + "footnotesCount": 0, + "filePath": "content7.html" + }, + { + "chapterNumber": 9, + "chapterTitle": "Первый признак жертвы: обвинения", + "characters": 6086, + "tokens": 2462, + "footnotesCount": 0, + "filePath": "content8.html" + }, + { + "chapterNumber": 10, + "chapterTitle": "Третий признак жертвы: жалобы", + "characters": 6040, + "tokens": 2443, + "footnotesCount": 0, + "filePath": "content9.html" + }, + { + "chapterNumber": 11, + "chapterTitle": "Практикум начинающего миллионера", + "characters": 5189, + "tokens": 2104, + "footnotesCount": 0, + "filePath": "content10.html" + }, + { + "chapterNumber": 12, + "chapterTitle": "Урок состоятельности № 3 Богатые становятся богатыми. Бедные хотят стать богатыми", + "characters": 11054, + "tokens": 4470, + "footnotesCount": 0, + "filePath": "content11.html" + }, + { + "chapterNumber": 13, + "chapterTitle": "Урок состоятельности № 4 Богатые мыслят глобально. Бедные мыслят мелко", + "characters": 8961, + "tokens": 3629, + "footnotesCount": 0, + "filePath": "content12.html" + }, + { + "chapterNumber": 14, + "chapterTitle": "Урок состоятельности № 5 Богатые рассматривают возможности. Бедные зациклены на препятствиях", + "characters": 12701, + "tokens": 5133, + "footnotesCount": 0, + "filePath": "content13.html" + }, + { + "chapterNumber": 15, + "chapterTitle": "Практикум начинающего миллионера", + "characters": 16013, + "tokens": 6434, + "footnotesCount": 0, + "filePath": "content14.html" + }, + { + "chapterNumber": 16, + "chapterTitle": "Практикум начинающего миллионера", + "characters": 11257, + "tokens": 4531, + "footnotesCount": 0, + "filePath": "content15.html" + }, + { + "chapterNumber": 17, + "chapterTitle": "Практикум начинающего миллионера", + "characters": 7211, + "tokens": 2913, + "footnotesCount": 0, + "filePath": "content16.html" + }, + { + "chapterNumber": 18, + "chapterTitle": "Урок состоятельности № 9 Богатые люди выше своих проблем. Бедные преувеличивают свои проблемы", + "characters": 7232, + "tokens": 2946, + "footnotesCount": 0, + "filePath": "content17.html" + }, + { + "chapterNumber": 19, + "chapterTitle": "Урок состоятельности № 10 Богатые умеют принимать подарки судьбы. Бедные не умеют", + "characters": 18680, + "tokens": 7521, + "footnotesCount": 0, + "filePath": "content18.html" + }, + { + "chapterNumber": 20, + "chapterTitle": "Практикум начинающего миллионера", + "characters": 12612, + "tokens": 5073, + "footnotesCount": 0, + "filePath": "content19.html" + }, + { + "chapterNumber": 21, + "chapterTitle": "Практикум начинающего миллионера", + "characters": 7933, + "tokens": 3202, + "footnotesCount": 0, + "filePath": "content20.html" + }, + { + "chapterNumber": 22, + "chapterTitle": "Можно не только купить пирожное, но и съесть его!", + "characters": 5607, + "tokens": 2278, + "footnotesCount": 0, + "filePath": "content21.html" + }, + { + "chapterNumber": 23, + "chapterTitle": "Урок состоятельности № 13 Богатых заботит собственный капитал. Бедных заботит сумма оклада", + "characters": 11487, + "tokens": 4647, + "footnotesCount": 0, + "filePath": "content22.html" + }, + { + "chapterNumber": 24, + "chapterTitle": "Практикум начинающего миллионера", + "characters": 15892, + "tokens": 6385, + "footnotesCount": 0, + "filePath": "content23.html" + }, + { + "chapterNumber": 25, + "chapterTitle": "Урок состоятельности № 15 На богатых работают их деньги. Бедные работают ради денег", + "characters": 21640, + "tokens": 8706, + "footnotesCount": 0, + "filePath": "content24.html" + }, + { + "chapterNumber": 26, + "chapterTitle": "Урок состоятельности № 16 Богатые действуют без опаски. Бедных останавливает страх", + "characters": 17571, + "tokens": 7077, + "footnotesCount": 0, + "filePath": "content25.html" + }, + { + "chapterNumber": 27, + "chapterTitle": "Практикум начинающего миллионера", + "characters": 16118, + "tokens": 6476, + "footnotesCount": 0, + "filePath": "content26.html" + }, + { + "chapterNumber": 28, + "chapterTitle": "Вместо заключения «Что же мне, черт возьми, теперь делать?»", + "characters": 4916, + "tokens": 2006, + "footnotesCount": 0, + "filePath": "content27.html" + }, + { + "chapterNumber": 29, + "chapterTitle": "Примечания", + "characters": 118, + "tokens": 71, + "footnotesCount": 0, + "filePath": "contentnotes0.html" + } + ] +} \ No newline at end of file diff --git a/books/statistics/Истина в цене. Все о практическом ценообразовании, прибыли, выручке и клиентах_statistics.json b/books/statistics/Истина в цене. Все о практическом ценообразовании, прибыли, выручке и клиентах_statistics.json new file mode 100644 index 0000000..880dab5 --- /dev/null +++ b/books/statistics/Истина в цене. Все о практическом ценообразовании, прибыли, выручке и клиентах_statistics.json @@ -0,0 +1,283 @@ +{ + "book": { + "title": "Истина в цене. Все о практическом ценообразовании, прибыли, выручке и клиентах", + "author": "Антон Терехов", + "totalChapters": 34, + "totalCharacters": 394362, + "totalTokens": 159061 + }, + "chapters": [ + { + "chapterNumber": 1, + "chapterTitle": "Антон Терехов Истина в цене. Все о практическом ценообразовании, прибыли, выручке и клиентах", + "characters": 8303, + "tokens": 3373, + "footnotesCount": 0, + "filePath": "content0.html" + }, + { + "chapterNumber": 2, + "chapterTitle": "Глава 1.1. Какова ваша цель – прибыль, доход или количество клиентов?", + "characters": 8197, + "tokens": 3321, + "footnotesCount": 0, + "filePath": "content1.html" + }, + { + "chapterNumber": 3, + "chapterTitle": "Глава 1.2. Психологический коридор цен. Несколько вопросов себе самому, своим клиентам и сотрудникам", + "characters": 7160, + "tokens": 2920, + "footnotesCount": 0, + "filePath": "content2.html" + }, + { + "chapterNumber": 4, + "chapterTitle": "Глава 1.3. Рассчитываем целевую цену", + "characters": 16826, + "tokens": 6760, + "footnotesCount": 0, + "filePath": "content3.html" + }, + { + "chapterNumber": 5, + "chapterTitle": "Глава 1.4. Единица измерения – основа ценообразования", + "characters": 14131, + "tokens": 5689, + "footnotesCount": 0, + "filePath": "content4.html" + }, + { + "chapterNumber": 6, + "chapterTitle": "Глава 1.5. Ментальная бухгалтерия", + "characters": 16163, + "tokens": 6494, + "footnotesCount": 0, + "filePath": "content5.html" + }, + { + "chapterNumber": 7, + "chapterTitle": "Глава 1.6. Премиальные и люксовые цены. Почему кажется, что высокая цена гарантирует высокое качество", + "characters": 14654, + "tokens": 5917, + "footnotesCount": 0, + "filePath": "content6.html" + }, + { + "chapterNumber": 8, + "chapterTitle": "Глава 1.7. Низкие и сверхнизкие цены. Применять с аккуратностью", + "characters": 20924, + "tokens": 8410, + "footnotesCount": 0, + "filePath": "content7.html" + }, + { + "chapterNumber": 9, + "chapterTitle": "Глава 1.8. Постоянные и переменные издержки, юнит-экономика и убийственная скидка", + "characters": 15350, + "tokens": 6188, + "footnotesCount": 0, + "filePath": "content8.html" + }, + { + "chapterNumber": 10, + "chapterTitle": "Глава 1.9. Унылый отель и неценовая зависимость спроса", + "characters": 10291, + "tokens": 4153, + "footnotesCount": 0, + "filePath": "content9.html" + }, + { + "chapterNumber": 11, + "chapterTitle": "Глава 1.10. Лучше бы ты бежал за такси", + "characters": 11091, + "tokens": 4468, + "footnotesCount": 0, + "filePath": "content10.html" + }, + { + "chapterNumber": 12, + "chapterTitle": "Глава 1.11. Почему не надо торговать на маркетплейсах", + "characters": 7088, + "tokens": 2873, + "footnotesCount": 0, + "filePath": "content11.html" + }, + { + "chapterNumber": 13, + "chapterTitle": "Глава 2.1. Основная задача скидок и фиктивный прайс-лист", + "characters": 10006, + "tokens": 4041, + "footnotesCount": 0, + "filePath": "content12.html" + }, + { + "chapterNumber": 14, + "chapterTitle": "Глава 2.2. Ценовые якоря и эффект золотой середины", + "characters": 10279, + "tokens": 4148, + "footnotesCount": 0, + "filePath": "content13.html" + }, + { + "chapterNumber": 15, + "chapterTitle": "Глава 2.3. Польза и потеря. Почему балльные программы лояльности лучше, чем дисконтные. Почему картой платить невыгодно Польза и потеря…", + "characters": 14909, + "tokens": 6034, + "footnotesCount": 0, + "filePath": "content14.html" + }, + { + "chapterNumber": 16, + "chapterTitle": "Глава 2.4. Как увеличить прибыль с помощью бандлирования", + "characters": 11483, + "tokens": 4632, + "footnotesCount": 0, + "filePath": "content15.html" + }, + { + "chapterNumber": 17, + "chapterTitle": "Глава 2.5. Составные продукты и кросс-сейл", + "characters": 13377, + "tokens": 5383, + "footnotesCount": 0, + "filePath": "content16.html" + }, + { + "chapterNumber": 18, + "chapterTitle": "Глава 2.6. Добро пожаловать в мышеловку! Ассортимент бесплатных сыров", + "characters": 9727, + "tokens": 3934, + "footnotesCount": 0, + "filePath": "content17.html" + }, + { + "chapterNumber": 19, + "chapterTitle": "Глава 2.7. Динамическое ценообразование. Продаем квотами", + "characters": 18235, + "tokens": 7333, + "footnotesCount": 0, + "filePath": "content18.html" + }, + { + "chapterNumber": 20, + "chapterTitle": "Заметка 1. Все, что вокруг цены", + "characters": 13882, + "tokens": 5581, + "footnotesCount": 0, + "filePath": "content19.html" + }, + { + "chapterNumber": 21, + "chapterTitle": "Часть 3 Цены и клиенты. Ценовая дискриминация", + "characters": 10807, + "tokens": 4357, + "footnotesCount": 0, + "filePath": "content20.html" + }, + { + "chapterNumber": 22, + "chapterTitle": "Глава 3.2. Три типа ценовой дискриминации и их инструменты", + "characters": 7873, + "tokens": 3189, + "footnotesCount": 0, + "filePath": "content21.html" + }, + { + "chapterNumber": 23, + "chapterTitle": "Глава 3.3. Юридические вопросы ценовой дискриминации", + "characters": 11769, + "tokens": 4744, + "footnotesCount": 0, + "filePath": "content22.html" + }, + { + "chapterNumber": 24, + "chapterTitle": "Глава 3.5. Клиенты сами сортируют себя по платежеспособности", + "characters": 11713, + "tokens": 4726, + "footnotesCount": 0, + "filePath": "content23.html" + }, + { + "chapterNumber": 25, + "chapterTitle": "Глава 3.7. Почему не надо отбирать скидки у хороших клиентов", + "characters": 9938, + "tokens": 4016, + "footnotesCount": 0, + "filePath": "content24.html" + }, + { + "chapterNumber": 26, + "chapterTitle": "Часть 4 Ценообразование в модели подписки", + "characters": 7979, + "tokens": 3224, + "footnotesCount": 0, + "filePath": "content25.html" + }, + { + "chapterNumber": 27, + "chapterTitle": "Глава 4.2. Понятие тарифа. Распутываем запутанное", + "characters": 5616, + "tokens": 2282, + "footnotesCount": 0, + "filePath": "content26.html" + }, + { + "chapterNumber": 28, + "chapterTitle": "Глава 4.3. Экономика подписки", + "characters": 9474, + "tokens": 3817, + "footnotesCount": 0, + "filePath": "content27.html" + }, + { + "chapterNumber": 29, + "chapterTitle": "Глава 4.4. Самая короткая глава о том, как продавать подписку", + "characters": 7061, + "tokens": 2865, + "footnotesCount": 0, + "filePath": "content28.html" + }, + { + "chapterNumber": 30, + "chapterTitle": "Глава 4.6. Постоянные и переменные издержки, квоты и успех модели подписки", + "characters": 9039, + "tokens": 3661, + "footnotesCount": 0, + "filePath": "content29.html" + }, + { + "chapterNumber": 31, + "chapterTitle": "Глава 4.7. Принципы ценообразования в экосистемах", + "characters": 10546, + "tokens": 4254, + "footnotesCount": 0, + "filePath": "content30.html" + }, + { + "chapterNumber": 32, + "chapterTitle": "Приложение. Особенности ценообразования в сфере технологичных B2B-услуг", + "characters": 37711, + "tokens": 15129, + "footnotesCount": 0, + "filePath": "content31.html" + }, + { + "chapterNumber": 33, + "chapterTitle": "Об авторе", + "characters": 804, + "tokens": 341, + "footnotesCount": 0, + "filePath": "content32.html" + }, + { + "chapterNumber": 34, + "chapterTitle": "Сноски", + "characters": 1956, + "tokens": 804, + "footnotesCount": 0, + "filePath": "contentnotes0.html" + } + ] +} \ No newline at end of file diff --git a/books/statistics/История настоящего предпринимателя_statistics.json b/books/statistics/История настоящего предпринимателя_statistics.json new file mode 100644 index 0000000..d4eb586 --- /dev/null +++ b/books/statistics/История настоящего предпринимателя_statistics.json @@ -0,0 +1,259 @@ +{ + "book": { + "title": "История настоящего предпринимателя", + "author": "Александр Долгов", + "totalChapters": 31, + "totalCharacters": 445204, + "totalTokens": 178922 + }, + "chapters": [ + { + "chapterNumber": 1, + "chapterTitle": "История настоящего предпринимателя Александр Долгов", + "characters": 23574, + "tokens": 9465, + "footnotesCount": 0, + "filePath": "content0.html" + }, + { + "chapterNumber": 2, + "chapterTitle": "Правила настоящего предпринимателя", + "characters": 35308, + "tokens": 14152, + "footnotesCount": 0, + "filePath": "content1.html" + }, + { + "chapterNumber": 3, + "chapterTitle": "Правила настоящего предпринимателя", + "characters": 21186, + "tokens": 8503, + "footnotesCount": 0, + "filePath": "content2.html" + }, + { + "chapterNumber": 4, + "chapterTitle": "Сильный оффер", + "characters": 9776, + "tokens": 3931, + "footnotesCount": 0, + "filePath": "content3.html" + }, + { + "chapterNumber": 5, + "chapterTitle": "Как проводить собеседования", + "characters": 7568, + "tokens": 3053, + "footnotesCount": 0, + "filePath": "content4.html" + }, + { + "chapterNumber": 6, + "chapterTitle": "Правила настоящего предпринимателя", + "characters": 30537, + "tokens": 12243, + "footnotesCount": 0, + "filePath": "content5.html" + }, + { + "chapterNumber": 7, + "chapterTitle": "Правила настоящего предпринимателя", + "characters": 26791, + "tokens": 10745, + "footnotesCount": 0, + "filePath": "content6.html" + }, + { + "chapterNumber": 8, + "chapterTitle": "Правила настоящего предпринимателя", + "characters": 26492, + "tokens": 10625, + "footnotesCount": 0, + "filePath": "content7.html" + }, + { + "chapterNumber": 9, + "chapterTitle": "Правила настоящего предпринимателя", + "characters": 15170, + "tokens": 6097, + "footnotesCount": 0, + "filePath": "content8.html" + }, + { + "chapterNumber": 10, + "chapterTitle": "Перелом", + "characters": 9864, + "tokens": 3963, + "footnotesCount": 0, + "filePath": "content9.html" + }, + { + "chapterNumber": 11, + "chapterTitle": "Правила настоящего предпринимателя", + "characters": 27570, + "tokens": 11058, + "footnotesCount": 0, + "filePath": "content10.html" + }, + { + "chapterNumber": 12, + "chapterTitle": "Глава 9. Франчайзинг – новый MBA", + "characters": 15118, + "tokens": 6076, + "footnotesCount": 0, + "filePath": "content11.html" + }, + { + "chapterNumber": 13, + "chapterTitle": "Правила настоящего предпринимателя", + "characters": 9696, + "tokens": 3908, + "footnotesCount": 0, + "filePath": "content12.html" + }, + { + "chapterNumber": 14, + "chapterTitle": "Сделка", + "characters": 9949, + "tokens": 3998, + "footnotesCount": 0, + "filePath": "content13.html" + }, + { + "chapterNumber": 15, + "chapterTitle": "Глава 11. Семейный бизнес", + "characters": 13077, + "tokens": 5257, + "footnotesCount": 0, + "filePath": "content14.html" + }, + { + "chapterNumber": 16, + "chapterTitle": "Глава 12. Правило «трех ногтей»", + "characters": 13401, + "tokens": 5389, + "footnotesCount": 0, + "filePath": "content15.html" + }, + { + "chapterNumber": 17, + "chapterTitle": "Правила настоящего предпринимателя", + "characters": 5387, + "tokens": 2184, + "footnotesCount": 0, + "filePath": "content16.html" + }, + { + "chapterNumber": 18, + "chapterTitle": "Глава 13. Налоги", + "characters": 8709, + "tokens": 3506, + "footnotesCount": 0, + "filePath": "content17.html" + }, + { + "chapterNumber": 19, + "chapterTitle": "Налогообложение для самых маленьких", + "characters": 9774, + "tokens": 3940, + "footnotesCount": 0, + "filePath": "content18.html" + }, + { + "chapterNumber": 20, + "chapterTitle": "Прибыль Налоги НДФЛ Прибыль", + "characters": 5451, + "tokens": 2207, + "footnotesCount": 0, + "filePath": "content19.html" + }, + { + "chapterNumber": 21, + "chapterTitle": "Правила настоящего предпринимателя", + "characters": 19927, + "tokens": 8000, + "footnotesCount": 0, + "filePath": "content20.html" + }, + { + "chapterNumber": 22, + "chapterTitle": "Правила настоящего предпринимателя", + "characters": 26057, + "tokens": 10452, + "footnotesCount": 0, + "filePath": "content21.html" + }, + { + "chapterNumber": 23, + "chapterTitle": "Правила настоящего предпринимателя, который хочет что-либо производить в России", + "characters": 8225, + "tokens": 3338, + "footnotesCount": 0, + "filePath": "content22.html" + }, + { + "chapterNumber": 24, + "chapterTitle": "Маркетплейсы", + "characters": 6727, + "tokens": 2711, + "footnotesCount": 0, + "filePath": "content23.html" + }, + { + "chapterNumber": 25, + "chapterTitle": "Социальные сети", + "characters": 6452, + "tokens": 2603, + "footnotesCount": 0, + "filePath": "content24.html" + }, + { + "chapterNumber": 26, + "chapterTitle": "Контентный маркетинг", + "characters": 7068, + "tokens": 2852, + "footnotesCount": 0, + "filePath": "content25.html" + }, + { + "chapterNumber": 27, + "chapterTitle": "Кейсы", + "characters": 5569, + "tokens": 2246, + "footnotesCount": 0, + "filePath": "content26.html" + }, + { + "chapterNumber": 28, + "chapterTitle": "Правила настоящего предпринимателя", + "characters": 9417, + "tokens": 3796, + "footnotesCount": 0, + "filePath": "content27.html" + }, + { + "chapterNumber": 29, + "chapterTitle": "Осознанные инвестиции", + "characters": 7937, + "tokens": 3199, + "footnotesCount": 0, + "filePath": "content28.html" + }, + { + "chapterNumber": 30, + "chapterTitle": "Репутация и инвестиции", + "characters": 8598, + "tokens": 3464, + "footnotesCount": 0, + "filePath": "content29.html" + }, + { + "chapterNumber": 31, + "chapterTitle": "Правила настоящего предпринимателя", + "characters": 14829, + "tokens": 5961, + "footnotesCount": 0, + "filePath": "content30.html" + } + ] +} \ No newline at end of file diff --git a/books/statistics/На уровень выше. 25 правил вежливых и успешных людей_statistics.json b/books/statistics/На уровень выше. 25 правил вежливых и успешных людей_statistics.json new file mode 100644 index 0000000..cd2ef5c --- /dev/null +++ b/books/statistics/На уровень выше. 25 правил вежливых и успешных людей_statistics.json @@ -0,0 +1,195 @@ +{ + "book": { + "title": "На уровень выше. 25 правил вежливых и успешных людей", + "author": "Ольга Владимировна Шевелева", + "totalChapters": 23, + "totalCharacters": 254019, + "totalTokens": 102181 + }, + "chapters": [ + { + "chapterNumber": 1, + "chapterTitle": "Ольга Шевелева На уровень выше. 25 правил вежливых и успешных людей", + "characters": 7964, + "tokens": 3227, + "footnotesCount": 0, + "filePath": "content0.html" + }, + { + "chapterNumber": 2, + "chapterTitle": "Приветствие и прощание", + "characters": 5979, + "tokens": 2415, + "footnotesCount": 0, + "filePath": "content1.html" + }, + { + "chapterNumber": 3, + "chapterTitle": "Представление", + "characters": 7098, + "tokens": 2860, + "footnotesCount": 0, + "filePath": "content2.html" + }, + { + "chapterNumber": 4, + "chapterTitle": "Формы обращения", + "characters": 8382, + "tokens": 3374, + "footnotesCount": 0, + "filePath": "content3.html" + }, + { + "chapterNumber": 5, + "chapterTitle": "Рукопожатие", + "characters": 6943, + "tokens": 2797, + "footnotesCount": 0, + "filePath": "content4.html" + }, + { + "chapterNumber": 6, + "chapterTitle": "Визитные карточки", + "characters": 11178, + "tokens": 4493, + "footnotesCount": 0, + "filePath": "content5.html" + }, + { + "chapterNumber": 7, + "chapterTitle": "Поведение у двери, в лифте, на лестнице, при рассадке в автомобиле", + "characters": 5621, + "tokens": 2290, + "footnotesCount": 0, + "filePath": "content6.html" + }, + { + "chapterNumber": 8, + "chapterTitle": "Общение по телефону", + "characters": 15738, + "tokens": 6318, + "footnotesCount": 0, + "filePath": "content7.html" + }, + { + "chapterNumber": 9, + "chapterTitle": "Время ответа на деловые письма", + "characters": 10915, + "tokens": 4394, + "footnotesCount": 0, + "filePath": "content8.html" + }, + { + "chapterNumber": 10, + "chapterTitle": "Благодарность", + "characters": 32757, + "tokens": 13123, + "footnotesCount": 0, + "filePath": "content9.html" + }, + { + "chapterNumber": 11, + "chapterTitle": "Аксессуары", + "characters": 24684, + "tokens": 9894, + "footnotesCount": 0, + "filePath": "content10.html" + }, + { + "chapterNumber": 12, + "chapterTitle": "Прическа", + "characters": 7454, + "tokens": 3001, + "footnotesCount": 0, + "filePath": "content11.html" + }, + { + "chapterNumber": 13, + "chapterTitle": "Макияж/Наличие или отсутствие бороды", + "characters": 12688, + "tokens": 5106, + "footnotesCount": 0, + "filePath": "content12.html" + }, + { + "chapterNumber": 14, + "chapterTitle": "Аромат парфюмерии", + "characters": 11202, + "tokens": 4503, + "footnotesCount": 0, + "filePath": "content13.html" + }, + { + "chapterNumber": 15, + "chapterTitle": "Верхняя одежда", + "characters": 6367, + "tokens": 2568, + "footnotesCount": 0, + "filePath": "content14.html" + }, + { + "chapterNumber": 16, + "chapterTitle": "Сменная обувь", + "characters": 5772, + "tokens": 2330, + "footnotesCount": 0, + "filePath": "content15.html" + }, + { + "chapterNumber": 17, + "chapterTitle": "Положение сумки или портфеля", + "characters": 18301, + "tokens": 7348, + "footnotesCount": 0, + "filePath": "content16.html" + }, + { + "chapterNumber": 18, + "chapterTitle": "Рассадка во время деловых встреч", + "characters": 6973, + "tokens": 2818, + "footnotesCount": 0, + "filePath": "content17.html" + }, + { + "chapterNumber": 19, + "chapterTitle": "Кофе-брейк и предложение напитков", + "characters": 11107, + "tokens": 4472, + "footnotesCount": 0, + "filePath": "content18.html" + }, + { + "chapterNumber": 20, + "chapterTitle": "Business meal", + "characters": 17000, + "tokens": 6822, + "footnotesCount": 0, + "filePath": "content19.html" + }, + { + "chapterNumber": 21, + "chapterTitle": "Поведение на приемах", + "characters": 14280, + "tokens": 5737, + "footnotesCount": 0, + "filePath": "content20.html" + }, + { + "chapterNumber": 22, + "chapterTitle": "Заключение", + "characters": 3965, + "tokens": 1607, + "footnotesCount": 0, + "filePath": "content21.html" + }, + { + "chapterNumber": 23, + "chapterTitle": "Примечания", + "characters": 1651, + "tokens": 684, + "footnotesCount": 0, + "filePath": "contentnotes0.html" + } + ] +} \ No newline at end of file diff --git a/books/statistics/Онлайн-бизнес юридическая упаковка и сопровождение интернет-проектов_statistics.json b/books/statistics/Онлайн-бизнес юридическая упаковка и сопровождение интернет-проектов_statistics.json new file mode 100644 index 0000000..eff1759 --- /dev/null +++ b/books/statistics/Онлайн-бизнес юридическая упаковка и сопровождение интернет-проектов_statistics.json @@ -0,0 +1,267 @@ +{ + "book": { + "title": "Онлайн-бизнес: юридическая упаковка и сопровождение интернет-проектов", + "author": "Елена Федорук", + "totalChapters": 32, + "totalCharacters": 325761, + "totalTokens": 131380 + }, + "chapters": [ + { + "chapterNumber": 1, + "chapterTitle": "Кто такой инфоюрист и что он может сделать для онлайн-проекта?", + "characters": 23536, + "tokens": 9454, + "footnotesCount": 0, + "filePath": "content0.html" + }, + { + "chapterNumber": 2, + "chapterTitle": "Онлайн-бизнес", + "characters": 5476, + "tokens": 2211, + "footnotesCount": 0, + "filePath": "content1.html" + }, + { + "chapterNumber": 3, + "chapterTitle": "Что нужно знать для юридического сопровождения онлайн-проекта", + "characters": 5230, + "tokens": 2132, + "footnotesCount": 0, + "filePath": "content2.html" + }, + { + "chapterNumber": 4, + "chapterTitle": "1. Как юридически закрепить отношения между продюсером и экспертом?", + "characters": 6814, + "tokens": 2767, + "footnotesCount": 0, + "filePath": "content3.html" + }, + { + "chapterNumber": 5, + "chapterTitle": "2. Партнерство с иностранным элементом", + "characters": 8043, + "tokens": 3248, + "footnotesCount": 0, + "filePath": "content4.html" + }, + { + "chapterNumber": 6, + "chapterTitle": "3. Пять вопросов про авторские права для составления договора", + "characters": 6557, + "tokens": 2662, + "footnotesCount": 0, + "filePath": "content5.html" + }, + { + "chapterNumber": 7, + "chapterTitle": "5. Чего нет в шаблонах договоров?", + "characters": 8225, + "tokens": 3319, + "footnotesCount": 0, + "filePath": "content6.html" + }, + { + "chapterNumber": 8, + "chapterTitle": "7. 6 самых распространенных ошибок в договоре продюсера и эксперта", + "characters": 8523, + "tokens": 3451, + "footnotesCount": 0, + "filePath": "content7.html" + }, + { + "chapterNumber": 9, + "chapterTitle": "9. Особенности юридического оформления онлайн-проектов с привлеченными инвестициями", + "characters": 17135, + "tokens": 6903, + "footnotesCount": 0, + "filePath": "content8.html" + }, + { + "chapterNumber": 10, + "chapterTitle": "Бизнес-старт в онлайне. Выбор организационно- правовой формы", + "characters": 7156, + "tokens": 2902, + "footnotesCount": 0, + "filePath": "content9.html" + }, + { + "chapterNumber": 11, + "chapterTitle": "3. Что мы знаем об ИП?", + "characters": 12241, + "tokens": 4921, + "footnotesCount": 0, + "filePath": "content10.html" + }, + { + "chapterNumber": 12, + "chapterTitle": "Выбор системы налогообложения", + "characters": 9199, + "tokens": 3707, + "footnotesCount": 0, + "filePath": "content11.html" + }, + { + "chapterNumber": 13, + "chapterTitle": "1. Налоговые каникулы", + "characters": 7469, + "tokens": 3012, + "footnotesCount": 0, + "filePath": "content12.html" + }, + { + "chapterNumber": 14, + "chapterTitle": "1. Какие договоры экономически выгодно заключать с контрагентами?", + "characters": 12906, + "tokens": 5205, + "footnotesCount": 0, + "filePath": "content13.html" + }, + { + "chapterNumber": 15, + "chapterTitle": "3. Юридическая сила электронной переписки", + "characters": 7654, + "tokens": 3094, + "footnotesCount": 0, + "filePath": "content14.html" + }, + { + "chapterNumber": 16, + "chapterTitle": "4. Аналоги собственноручной подписи", + "characters": 5504, + "tokens": 2232, + "footnotesCount": 0, + "filePath": "content15.html" + }, + { + "chapterNumber": 17, + "chapterTitle": "2. Необходимый минимум документов для сайта", + "characters": 20316, + "tokens": 8160, + "footnotesCount": 0, + "filePath": "content16.html" + }, + { + "chapterNumber": 18, + "chapterTitle": "4. Обработка персональных данных пользователей сайта", + "characters": 19762, + "tokens": 7941, + "footnotesCount": 0, + "filePath": "content17.html" + }, + { + "chapterNumber": 19, + "chapterTitle": "5. Как правильно размещать документы на сайте", + "characters": 7419, + "tokens": 3002, + "footnotesCount": 0, + "filePath": "content18.html" + }, + { + "chapterNumber": 20, + "chapterTitle": "1. Что именно признается рекламой?", + "characters": 5965, + "tokens": 2416, + "footnotesCount": 0, + "filePath": "content19.html" + }, + { + "chapterNumber": 21, + "chapterTitle": "5. Лайфхаки от рекламщиков, которые помогут похвалить себя и при этом действовать в рамках закона", + "characters": 10632, + "tokens": 4307, + "footnotesCount": 0, + "filePath": "content20.html" + }, + { + "chapterNumber": 22, + "chapterTitle": "Правовой аудит онлайн-проекта", + "characters": 7693, + "tokens": 3105, + "footnotesCount": 0, + "filePath": "content21.html" + }, + { + "chapterNumber": 23, + "chapterTitle": "Взаимодействие с клиентами. Возвраты", + "characters": 13912, + "tokens": 5595, + "footnotesCount": 0, + "filePath": "content22.html" + }, + { + "chapterNumber": 24, + "chapterTitle": "Защита интеллектуальной собственности и деловой репутации в интернете", + "characters": 7856, + "tokens": 3186, + "footnotesCount": 0, + "filePath": "content23.html" + }, + { + "chapterNumber": 25, + "chapterTitle": "3. Передача авторских прав в онлайн-бизнесе", + "characters": 9906, + "tokens": 3996, + "footnotesCount": 0, + "filePath": "content24.html" + }, + { + "chapterNumber": 26, + "chapterTitle": "4. Как защитить авторские права?", + "characters": 9342, + "tokens": 3765, + "footnotesCount": 0, + "filePath": "content25.html" + }, + { + "chapterNumber": 27, + "chapterTitle": "5. Как доказать собственное авторство?", + "characters": 5290, + "tokens": 2148, + "footnotesCount": 0, + "filePath": "content26.html" + }, + { + "chapterNumber": 28, + "chapterTitle": "8. Три мифа о защите авторского права", + "characters": 6493, + "tokens": 2628, + "footnotesCount": 0, + "filePath": "content27.html" + }, + { + "chapterNumber": 29, + "chapterTitle": "11. Авторское право на фотографии", + "characters": 15456, + "tokens": 6212, + "footnotesCount": 0, + "filePath": "content28.html" + }, + { + "chapterNumber": 30, + "chapterTitle": "О лицензировании образовательной деятельности", + "characters": 14076, + "tokens": 5665, + "footnotesCount": 0, + "filePath": "content29.html" + }, + { + "chapterNumber": 31, + "chapterTitle": "Заключение", + "characters": 16574, + "tokens": 6650, + "footnotesCount": 0, + "filePath": "content30.html" + }, + { + "chapterNumber": 32, + "chapterTitle": "Примечания", + "characters": 3401, + "tokens": 1384, + "footnotesCount": 0, + "filePath": "contentnotes0.html" + } + ] +} \ No newline at end of file diff --git a/books/statistics/Планируй. Как правильно планировать каждый год своей жиз-ни и сделать максимум запланированного_statistics.json b/books/statistics/Планируй. Как правильно планировать каждый год своей жиз-ни и сделать максимум запланированного_statistics.json new file mode 100644 index 0000000..1ed3b8c --- /dev/null +++ b/books/statistics/Планируй. Как правильно планировать каждый год своей жиз-ни и сделать максимум запланированного_statistics.json @@ -0,0 +1,371 @@ +{ + "book": { + "title": "Планируй. Как правильно планировать каждый год своей жиз-ни и сделать максимум запланированного", + "author": "Игорь Манн", + "totalChapters": 45, + "totalCharacters": 111982, + "totalTokens": 46375 + }, + "chapters": [ + { + "chapterNumber": 1, + "chapterTitle": "Гроуинг 1.1 Epub 1", + "characters": 402, + "tokens": 192, + "footnotesCount": 0, + "filePath": "Гроуинг_1.1_EPUB-1.xhtml" + }, + { + "chapterNumber": 2, + "chapterTitle": "Гроуинг 1.1 Epub 1 1", + "characters": 677, + "tokens": 304, + "footnotesCount": 0, + "filePath": "Гроуинг_1.1_EPUB-1-1.xhtml" + }, + { + "chapterNumber": 3, + "chapterTitle": "Гроуинг 1.1 Epub 1 2", + "characters": 4781, + "tokens": 1946, + "footnotesCount": 0, + "filePath": "Гроуинг_1.1_EPUB-1-2.xhtml" + }, + { + "chapterNumber": 4, + "chapterTitle": "Гроуинг 1.1 Epub 1 3", + "characters": 1630, + "tokens": 686, + "footnotesCount": 0, + "filePath": "Гроуинг_1.1_EPUB-1-3.xhtml" + }, + { + "chapterNumber": 5, + "chapterTitle": "Гроуинг 1.1 Epub 1 4", + "characters": 592, + "tokens": 270, + "footnotesCount": 0, + "filePath": "Гроуинг_1.1_EPUB-1-4.xhtml" + }, + { + "chapterNumber": 6, + "chapterTitle": "Гроуинг 1.1 Epub 1 5", + "characters": 0, + "tokens": 34, + "footnotesCount": 0, + "filePath": "Гроуинг_1.1_EPUB-1-5.xhtml" + }, + { + "chapterNumber": 7, + "chapterTitle": "Гроуинг 1.1 Epub 1 6", + "characters": 8924, + "tokens": 3603, + "footnotesCount": 0, + "filePath": "Гроуинг_1.1_EPUB-1-6.xhtml" + }, + { + "chapterNumber": 8, + "chapterTitle": "Гроуинг 1.1 Epub 1 7", + "characters": 10954, + "tokens": 4415, + "footnotesCount": 0, + "filePath": "Гроуинг_1.1_EPUB-1-7.xhtml" + }, + { + "chapterNumber": 9, + "chapterTitle": "Гроуинг 1.1 Epub 1 8", + "characters": 6465, + "tokens": 2620, + "footnotesCount": 0, + "filePath": "Гроуинг_1.1_EPUB-1-8.xhtml" + }, + { + "chapterNumber": 10, + "chapterTitle": "Гроуинг 1.1 Epub 1 9", + "characters": 8421, + "tokens": 3403, + "footnotesCount": 0, + "filePath": "Гроуинг_1.1_EPUB-1-9.xhtml" + }, + { + "chapterNumber": 11, + "chapterTitle": "Гроуинг 1.1 Epub 1 10", + "characters": 2828, + "tokens": 1167, + "footnotesCount": 0, + "filePath": "Гроуинг_1.1_EPUB-1-10.xhtml" + }, + { + "chapterNumber": 12, + "chapterTitle": "Гроуинг 1.1 Epub 1 11", + "characters": 1475, + "tokens": 626, + "footnotesCount": 0, + "filePath": "Гроуинг_1.1_EPUB-1-11.xhtml" + }, + { + "chapterNumber": 13, + "chapterTitle": "Гроуинг 1.1 Epub 1 12", + "characters": 0, + "tokens": 36, + "footnotesCount": 0, + "filePath": "Гроуинг_1.1_EPUB-1-12.xhtml" + }, + { + "chapterNumber": 14, + "chapterTitle": "Гроуинг 1.1 Epub 1 13", + "characters": 1995, + "tokens": 834, + "footnotesCount": 0, + "filePath": "Гроуинг_1.1_EPUB-1-13.xhtml" + }, + { + "chapterNumber": 15, + "chapterTitle": "Гроуинг 1.1 Epub 1 14", + "characters": 4648, + "tokens": 1895, + "footnotesCount": 0, + "filePath": "Гроуинг_1.1_EPUB-1-14.xhtml" + }, + { + "chapterNumber": 16, + "chapterTitle": "Гроуинг 1.1 Epub 1 15", + "characters": 6452, + "tokens": 2616, + "footnotesCount": 0, + "filePath": "Гроуинг_1.1_EPUB-1-15.xhtml" + }, + { + "chapterNumber": 17, + "chapterTitle": "Гроуинг 1.1 Epub 1 16", + "characters": 12181, + "tokens": 4908, + "footnotesCount": 0, + "filePath": "Гроуинг_1.1_EPUB-1-16.xhtml" + }, + { + "chapterNumber": 18, + "chapterTitle": "Гроуинг 1.1 Epub 1 17", + "characters": 8269, + "tokens": 3343, + "footnotesCount": 0, + "filePath": "Гроуинг_1.1_EPUB-1-17.xhtml" + }, + { + "chapterNumber": 19, + "chapterTitle": "Гроуинг 1.1 Epub 1 18", + "characters": 589, + "tokens": 271, + "footnotesCount": 0, + "filePath": "Гроуинг_1.1_EPUB-1-18.xhtml" + }, + { + "chapterNumber": 20, + "chapterTitle": "Гроуинг 1.1 Epub 1 19", + "characters": 539, + "tokens": 251, + "footnotesCount": 0, + "filePath": "Гроуинг_1.1_EPUB-1-19.xhtml" + }, + { + "chapterNumber": 21, + "chapterTitle": "Гроуинг 1.1 Epub 1 20", + "characters": 10, + "tokens": 40, + "footnotesCount": 0, + "filePath": "Гроуинг_1.1_EPUB-1-20.xhtml" + }, + { + "chapterNumber": 22, + "chapterTitle": "Гроуинг 1.1 Epub 1 21", + "characters": 554, + "tokens": 257, + "footnotesCount": 0, + "filePath": "Гроуинг_1.1_EPUB-1-21.xhtml" + }, + { + "chapterNumber": 23, + "chapterTitle": "Гроуинг 1.1 Epub 1 22", + "characters": 3056, + "tokens": 1258, + "footnotesCount": 0, + "filePath": "Гроуинг_1.1_EPUB-1-22.xhtml" + }, + { + "chapterNumber": 24, + "chapterTitle": "Гроуинг 1.1 Epub 1 23", + "characters": 0, + "tokens": 36, + "footnotesCount": 0, + "filePath": "Гроуинг_1.1_EPUB-1-23.xhtml" + }, + { + "chapterNumber": 25, + "chapterTitle": "Гроуинг 1.1 Epub 1 24", + "characters": 5769, + "tokens": 2343, + "footnotesCount": 0, + "filePath": "Гроуинг_1.1_EPUB-1-24.xhtml" + }, + { + "chapterNumber": 26, + "chapterTitle": "Гроуинг 1.1 Epub 1 25", + "characters": 0, + "tokens": 36, + "footnotesCount": 0, + "filePath": "Гроуинг_1.1_EPUB-1-25.xhtml" + }, + { + "chapterNumber": 27, + "chapterTitle": "Гроуинг 1.1 Epub 1 26", + "characters": 8049, + "tokens": 3255, + "footnotesCount": 0, + "filePath": "Гроуинг_1.1_EPUB-1-26.xhtml" + }, + { + "chapterNumber": 28, + "chapterTitle": "Гроуинг 1.1 Epub 1 27", + "characters": 0, + "tokens": 36, + "footnotesCount": 0, + "filePath": "Гроуинг_1.1_EPUB-1-27.xhtml" + }, + { + "chapterNumber": 29, + "chapterTitle": "Гроуинг 1.1 Epub 1 28", + "characters": 9549, + "tokens": 3855, + "footnotesCount": 0, + "filePath": "Гроуинг_1.1_EPUB-1-28.xhtml" + }, + { + "chapterNumber": 30, + "chapterTitle": "Гроуинг 1.1 Epub 1 29", + "characters": 1878, + "tokens": 787, + "footnotesCount": 0, + "filePath": "Гроуинг_1.1_EPUB-1-29.xhtml" + }, + { + "chapterNumber": 31, + "chapterTitle": "Гроуинг 1.1 Epub 1 30", + "characters": 0, + "tokens": 36, + "footnotesCount": 0, + "filePath": "Гроуинг_1.1_EPUB-1-30.xhtml" + }, + { + "chapterNumber": 32, + "chapterTitle": "Гроуинг 1.1 Epub 1 31", + "characters": 801, + "tokens": 356, + "footnotesCount": 0, + "filePath": "Гроуинг_1.1_EPUB-1-31.xhtml" + }, + { + "chapterNumber": 33, + "chapterTitle": "Гроуинг 1.1 Epub 1 32", + "characters": 0, + "tokens": 36, + "footnotesCount": 0, + "filePath": "Гроуинг_1.1_EPUB-1-32.xhtml" + }, + { + "chapterNumber": 34, + "chapterTitle": "Гроуинг 1.1 Epub 1 33", + "characters": 255, + "tokens": 138, + "footnotesCount": 0, + "filePath": "Гроуинг_1.1_EPUB-1-33.xhtml" + }, + { + "chapterNumber": 35, + "chapterTitle": "Гроуинг 1.1 Epub 1 34", + "characters": 20, + "tokens": 44, + "footnotesCount": 0, + "filePath": "Гроуинг_1.1_EPUB-1-34.xhtml" + }, + { + "chapterNumber": 36, + "chapterTitle": "Гроуинг 1.1 Epub 1 35", + "characters": 47, + "tokens": 54, + "footnotesCount": 0, + "filePath": "Гроуинг_1.1_EPUB-1-35.xhtml" + }, + { + "chapterNumber": 37, + "chapterTitle": "Гроуинг 1.1 Epub 1 36", + "characters": 12, + "tokens": 40, + "footnotesCount": 0, + "filePath": "Гроуинг_1.1_EPUB-1-36.xhtml" + }, + { + "chapterNumber": 38, + "chapterTitle": "Гроуинг 1.1 Epub 1 37", + "characters": 24, + "tokens": 45, + "footnotesCount": 0, + "filePath": "Гроуинг_1.1_EPUB-1-37.xhtml" + }, + { + "chapterNumber": 39, + "chapterTitle": "Гроуинг 1.1 Epub 1 38", + "characters": 17, + "tokens": 42, + "footnotesCount": 0, + "filePath": "Гроуинг_1.1_EPUB-1-38.xhtml" + }, + { + "chapterNumber": 40, + "chapterTitle": "Гроуинг 1.1 Epub 1 39", + "characters": 24, + "tokens": 45, + "footnotesCount": 0, + "filePath": "Гроуинг_1.1_EPUB-1-39.xhtml" + }, + { + "chapterNumber": 41, + "chapterTitle": "Гроуинг 1.1 Epub 1 40", + "characters": 28, + "tokens": 47, + "footnotesCount": 0, + "filePath": "Гроуинг_1.1_EPUB-1-40.xhtml" + }, + { + "chapterNumber": 42, + "chapterTitle": "Гроуинг 1.1 Epub 1 41", + "characters": 20, + "tokens": 44, + "footnotesCount": 0, + "filePath": "Гроуинг_1.1_EPUB-1-41.xhtml" + }, + { + "chapterNumber": 43, + "chapterTitle": "Гроуинг 1.1 Epub 1 42", + "characters": 19, + "tokens": 43, + "footnotesCount": 0, + "filePath": "Гроуинг_1.1_EPUB-1-42.xhtml" + }, + { + "chapterNumber": 44, + "chapterTitle": "Гроуинг 1.1 Epub 1 43", + "characters": 14, + "tokens": 41, + "footnotesCount": 0, + "filePath": "Гроуинг_1.1_EPUB-1-43.xhtml" + }, + { + "chapterNumber": 45, + "chapterTitle": "Гроуинг 1.1 Epub 1 44", + "characters": 14, + "tokens": 41, + "footnotesCount": 0, + "filePath": "Гроуинг_1.1_EPUB-1-44.xhtml" + } + ] +} \ No newline at end of file diff --git a/books/statistics/По собственному выбору от хорошего к великому_statistics.json b/books/statistics/По собственному выбору от хорошего к великому_statistics.json new file mode 100644 index 0000000..e9ed137 --- /dev/null +++ b/books/statistics/По собственному выбору от хорошего к великому_statistics.json @@ -0,0 +1,291 @@ +{ + "book": { + "title": "По собственному выбору: от хорошего к великому", + "author": "Джим Коллинз & Мортен Хансен", + "totalChapters": 35, + "totalCharacters": 549997, + "totalTokens": 224125 + }, + "chapters": [ + { + "chapterNumber": 1, + "chapterTitle": "Информация от издательства", + "characters": 1241, + "tokens": 524, + "footnotesCount": 0, + "filePath": "Text/info.xhtml" + }, + { + "chapterNumber": 2, + "chapterTitle": "Предисловие к русскому изданию", + "characters": 2646, + "tokens": 1089, + "footnotesCount": 0, + "filePath": "Text/predis.xhtml" + }, + { + "chapterNumber": 3, + "chapterTitle": "Epi", + "characters": 175, + "tokens": 88, + "footnotesCount": 0, + "filePath": "Text/epi.xhtml" + }, + { + "chapterNumber": 4, + "chapterTitle": "Величие посреди хаоса", + "characters": 20337, + "tokens": 8165, + "footnotesCount": 6, + "filePath": "Text/gl1.xhtml" + }, + { + "chapterNumber": 5, + "chapterTitle": "ВЫ АМУНДСЕН ИЛИ СКОТТ?", + "characters": 50406, + "tokens": 20201, + "footnotesCount": 14, + "filePath": "Text/gl2.xhtml" + }, + { + "chapterNumber": 6, + "chapterTitle": "Двадцатимильный марш", + "characters": 0, + "tokens": 25, + "footnotesCount": 0, + "filePath": "Text/gl3.xhtml" + }, + { + "chapterNumber": 7, + "chapterTitle": "ДВАДЦАТИМИЛЬНЫЙ МАРШ ДЖОНА БРАУНА", + "characters": 49679, + "tokens": 19903, + "footnotesCount": 1, + "filePath": "Text/gl3-1.xhtml" + }, + { + "chapterNumber": 8, + "chapterTitle": "Сначала пули, ядра потом", + "characters": 0, + "tokens": 26, + "footnotesCount": 0, + "filePath": "Text/gl4.xhtml" + }, + { + "chapterNumber": 9, + "chapterTitle": "СЮРПРИЗ, БОЛЬШОЙ СЮРПРИЗ", + "characters": 55550, + "tokens": 22249, + "footnotesCount": 2, + "filePath": "Text/gl4-1.xhtml" + }, + { + "chapterNumber": 10, + "chapterTitle": "Лидерство над линией смерти", + "characters": 0, + "tokens": 27, + "footnotesCount": 0, + "filePath": "Text/gl5.xhtml" + }, + { + "chapterNumber": 11, + "chapterTitle": "НЕ ВСЕ МОМЕНТЫ В ЖИЗНИ РАВНОЦЕННЫ", + "characters": 45565, + "tokens": 18266, + "footnotesCount": 8, + "filePath": "Text/gl5-1.xhtml" + }, + { + "chapterNumber": 12, + "chapterTitle": "Глава 6", + "characters": 0, + "tokens": 19, + "footnotesCount": 0, + "filePath": "Text/gl6.xhtml" + }, + { + "chapterNumber": 13, + "chapterTitle": "С ФАНАТИЧНОЙ ДИСЦИПЛИНОЙ ПРИДЕРЖИВАТЬСЯ РЕЦЕПТА СМАК", + "characters": 45857, + "tokens": 18381, + "footnotesCount": 0, + "filePath": "Text/gl6-1.xhtml" + }, + { + "chapterNumber": 14, + "chapterTitle": "УДАЧА ИЛИ ОПЫТ?", + "characters": 60131, + "tokens": 24084, + "footnotesCount": 2, + "filePath": "Text/gl7.xhtml" + }, + { + "chapterNumber": 15, + "chapterTitle": "ЭПИЛОГ", + "characters": 4114, + "tokens": 1667, + "footnotesCount": 0, + "filePath": "Text/epilog.xhtml" + }, + { + "chapterNumber": 16, + "chapterTitle": "ЧАСТО ЗАДАВАЕМЫЕ ВОПРОСЫ", + "characters": 24968, + "tokens": 10015, + "footnotesCount": 2, + "filePath": "Text/faq.xhtml" + }, + { + "chapterNumber": 17, + "chapterTitle": "ПРИНЦИПЫ ИССЛЕДОВАНИЯ", + "characters": 0, + "tokens": 28, + "footnotesCount": 0, + "filePath": "Text/princip.xhtml" + }, + { + "chapterNumber": 18, + "chapterTitle": "МЕТОДОЛОГИЯ", + "characters": 20090, + "tokens": 8066, + "footnotesCount": 2, + "filePath": "Text/methodology.xhtml" + }, + { + "chapterNumber": 19, + "chapterTitle": "ОТБОР КОМПАНИЙ В ГРУППУ 10×", + "characters": 7163, + "tokens": 2894, + "footnotesCount": 0, + "filePath": "Text/otbor.xhtml" + }, + { + "chapterNumber": 20, + "chapterTitle": "ОТБОР КОМПАНИЙ ДЛЯ СРАВНЕНИЯ", + "characters": 5200, + "tokens": 2111, + "footnotesCount": 0, + "filePath": "Text/otbor2.xhtml" + }, + { + "chapterNumber": 21, + "chapterTitle": "ДВАДЦАТИМИЛЬНЫЙ МАРШ", + "characters": 3164, + "tokens": 1294, + "footnotesCount": 0, + "filePath": "Text/20miles.xhtml" + }, + { + "chapterNumber": 22, + "chapterTitle": "АНАЛИЗ ИННОВАЦИЙ", + "characters": 5054, + "tokens": 2051, + "footnotesCount": 0, + "filePath": "Text/analyse_inn.xhtml" + }, + { + "chapterNumber": 23, + "chapterTitle": "СНАЧАЛА ПУЛИ, ЯДРА ПОТОМ", + "characters": 4138, + "tokens": 1683, + "footnotesCount": 1, + "filePath": "Text/puli.xhtml" + }, + { + "chapterNumber": 24, + "chapterTitle": "АНАЛИЗ РИСКОВ ПО ЛИКВИДНОСТИ И БАЛАНСУ", + "characters": 3364, + "tokens": 1388, + "footnotesCount": 4, + "filePath": "Text/analyse_risk.xhtml" + }, + { + "chapterNumber": 25, + "chapterTitle": "АНАЛИЗ КАТЕГОРИЙ РИСКА", + "characters": 4389, + "tokens": 1790, + "footnotesCount": 3, + "filePath": "Text/analyse_cat.xhtml" + }, + { + "chapterNumber": 26, + "chapterTitle": "АНАЛИЗ СКОРОСТИ", + "characters": 6462, + "tokens": 2622, + "footnotesCount": 7, + "filePath": "Text/analyse-speed.xhtml" + }, + { + "chapterNumber": 27, + "chapterTitle": "АНАЛИЗ РЕЦЕПТА СМАК", + "characters": 2843, + "tokens": 1170, + "footnotesCount": 2, + "filePath": "Text/analyse-smak.xhtml" + }, + { + "chapterNumber": 28, + "chapterTitle": "АНАЛИЗ УДАЧИ", + "characters": 8117, + "tokens": 3280, + "footnotesCount": 5, + "filePath": "Text/analyse-lucky.xhtml" + }, + { + "chapterNumber": 29, + "chapterTitle": "АНАЛИЗ ЗАЛА СЛАВЫ ХОККЕЯ", + "characters": 1859, + "tokens": 770, + "footnotesCount": 1, + "filePath": "Text/zal.xhtml" + }, + { + "chapterNumber": 30, + "chapterTitle": "ПРИМЕЧАНИЯ", + "characters": 101705, + "tokens": 40705, + "footnotesCount": 0, + "filePath": "Text/notes.xhtml" + }, + { + "chapterNumber": 31, + "chapterTitle": "БЛАГОДАРНОСТИ", + "characters": 7161, + "tokens": 2889, + "footnotesCount": 0, + "filePath": "Text/thanks.xhtml" + }, + { + "chapterNumber": 32, + "chapterTitle": "ОБ АВТОРЕ", + "characters": 568, + "tokens": 250, + "footnotesCount": 0, + "filePath": "Text/author.xhtml" + }, + { + "chapterNumber": 33, + "chapterTitle": "Links", + "characters": 7488, + "tokens": 6136, + "footnotesCount": 118, + "filePath": "Text/links.xhtml" + }, + { + "chapterNumber": 34, + "chapterTitle": "МИФ Бизнес", + "characters": 161, + "tokens": 85, + "footnotesCount": 0, + "filePath": "Text/max.xhtml" + }, + { + "chapterNumber": 35, + "chapterTitle": "Над книгой работали", + "characters": 402, + "tokens": 184, + "footnotesCount": 0, + "filePath": "Text/end.xhtml" + } + ] +} \ No newline at end of file diff --git a/books/statistics/Пять пороков команды практика преодоления_statistics.json b/books/statistics/Пять пороков команды практика преодоления_statistics.json new file mode 100644 index 0000000..4c8ddd2 --- /dev/null +++ b/books/statistics/Пять пороков команды практика преодоления_statistics.json @@ -0,0 +1,299 @@ +{ + "book": { + "title": "Пять пороков команды: практика преодоления", + "author": "Патрик Ленсиони", + "totalChapters": 36, + "totalCharacters": 194733, + "totalTokens": 79211 + }, + "chapters": [ + { + "chapterNumber": 1, + "chapterTitle": "OVERCOMING THE FIVE DYSFUNCTIONS OF A TEAM", + "characters": 25, + "tokens": 40, + "footnotesCount": 0, + "filePath": "t1.xhtml" + }, + { + "chapterNumber": 2, + "chapterTitle": "ПЯТЬ ПОРОКОВ КОМАНДЫ: ПРАКТИКА ПРЕОДОЛЕНИЯ", + "characters": 37, + "tokens": 44, + "footnotesCount": 0, + "filePath": "t2.xhtml" + }, + { + "chapterNumber": 3, + "chapterTitle": "Информацияот издательства", + "characters": 1427, + "tokens": 595, + "footnotesCount": 0, + "filePath": "inf.xhtml" + }, + { + "chapterNumber": 4, + "chapterTitle": "Posv", + "characters": 150, + "tokens": 77, + "footnotesCount": 0, + "filePath": "posv.xhtml" + }, + { + "chapterNumber": 5, + "chapterTitle": "ДЛЯ ЧЕГО ЭТА КНИГА?", + "characters": 1789, + "tokens": 736, + "footnotesCount": 0, + "filePath": "vv.xhtml" + }, + { + "chapterNumber": 6, + "chapterTitle": "ОПРЕДЕЛИМСЯ С ПОНЯТИЯМИ", + "characters": 0, + "tokens": 23, + "footnotesCount": 0, + "filePath": "C1.xhtml" + }, + { + "chapterNumber": 7, + "chapterTitle": "C11", + "characters": 229, + "tokens": 107, + "footnotesCount": 0, + "filePath": "C11.xhtml" + }, + { + "chapterNumber": 8, + "chapterTitle": "АРГУМЕНТЫ В ПОЛЬЗУ КОМАНДНОЙ РАБОТЫ", + "characters": 3335, + "tokens": 1362, + "footnotesCount": 0, + "filePath": "g1.xhtml" + }, + { + "chapterNumber": 9, + "chapterTitle": "КОРОТКО О ПРЕДЛАГАЕМОЙ МОДЕЛИ", + "characters": 2383, + "tokens": 978, + "footnotesCount": 0, + "filePath": "g2.xhtml" + }, + { + "chapterNumber": 10, + "chapterTitle": "Вопрос 1: «А действительно ли мы команда?»", + "characters": 2245, + "tokens": 928, + "footnotesCount": 0, + "filePath": "g3.xhtml" + }, + { + "chapterNumber": 11, + "chapterTitle": "БОРЬБА С ПЯТЬЮ ПОРОКАМИ КОМАНДЫ", + "characters": 0, + "tokens": 26, + "footnotesCount": 0, + "filePath": "C2.xhtml" + }, + { + "chapterNumber": 12, + "chapterTitle": "C21", + "characters": 294, + "tokens": 133, + "footnotesCount": 0, + "filePath": "C21.xhtml" + }, + { + "chapterNumber": 13, + "chapterTitle": "БОРЬБА С ПОРОКОМ 1", + "characters": 33480, + "tokens": 13413, + "footnotesCount": 4, + "filePath": "g4.xhtml" + }, + { + "chapterNumber": 14, + "chapterTitle": "Как управлять конфликтной ситуацией", + "characters": 21618, + "tokens": 8675, + "footnotesCount": 1, + "filePath": "g5.xhtml" + }, + { + "chapterNumber": 15, + "chapterTitle": "БОРЬБА С ПОРОКОМ 3", + "characters": 13300, + "tokens": 5341, + "footnotesCount": 0, + "filePath": "g6.xhtml" + }, + { + "chapterNumber": 16, + "chapterTitle": "ИСТОРИЯ О НЕДОСТАТКЕ ТРЕБОВАТЕЛЬНОСТИ", + "characters": 12022, + "tokens": 4836, + "footnotesCount": 0, + "filePath": "g7.xhtml" + }, + { + "chapterNumber": 17, + "chapterTitle": "ИСТОРИЯ О ПРЕОБЛАДАНИИ ИНДИВИДУАЛЬНОГО НАД КОМАНДНЫМ", + "characters": 17651, + "tokens": 7094, + "footnotesCount": 1, + "filePath": "g8.xhtml" + }, + { + "chapterNumber": 18, + "chapterTitle": "ОТВЕТЫ НА ВОПРОСЫ. ПРЕДВОСХИЩАЯ ТРУДНОСТИ", + "characters": 0, + "tokens": 30, + "footnotesCount": 0, + "filePath": "C3.xhtml" + }, + { + "chapterNumber": 19, + "chapterTitle": "C31", + "characters": 312, + "tokens": 140, + "footnotesCount": 0, + "filePath": "C31.xhtml" + }, + { + "chapterNumber": 20, + "chapterTitle": "Сколько времени занимает формирование команды?", + "characters": 7831, + "tokens": 3164, + "footnotesCount": 2, + "filePath": "g9.xhtml" + }, + { + "chapterNumber": 21, + "chapterTitle": "ВОЗРАЖЕНИЯ УЧАСТНИКОВ ДИСКУССИИ", + "characters": 5433, + "tokens": 2200, + "footnotesCount": 0, + "filePath": "g10.xhtml" + }, + { + "chapterNumber": 22, + "chapterTitle": "ПРЕПЯТСТВИЯ, КОТОРЫХ НАДО ИЗБЕГАТЬ", + "characters": 10085, + "tokens": 4062, + "footnotesCount": 0, + "filePath": "g11.xhtml" + }, + { + "chapterNumber": 23, + "chapterTitle": "КАК СФОРМИРОВАТЬ КОМАНДУ", + "characters": 0, + "tokens": 23, + "footnotesCount": 0, + "filePath": "C4.xhtml" + }, + { + "chapterNumber": 24, + "chapterTitle": "C41", + "characters": 158, + "tokens": 79, + "footnotesCount": 0, + "filePath": "C41.xhtml" + }, + { + "chapterNumber": 25, + "chapterTitle": "ПЛАН ДЕЙСТВИЙ ПО ФОРМИРОВАНИЮ КОМАНДЫ", + "characters": 5396, + "tokens": 2187, + "footnotesCount": 0, + "filePath": "g12.xhtml" + }, + { + "chapterNumber": 26, + "chapterTitle": "ПЕРВАЯ ВЫЕЗДНАЯ ВСТРЕЧА", + "characters": 6938, + "tokens": 2799, + "footnotesCount": 0, + "filePath": "g13.xhtml" + }, + { + "chapterNumber": 27, + "chapterTitle": "ПОДРОБНЕЕ О ПРИЕМАХ И УПРАЖНЕНИЯХ", + "characters": 29991, + "tokens": 12024, + "footnotesCount": 0, + "filePath": "g14.xhtml" + }, + { + "chapterNumber": 28, + "chapterTitle": "ГЛОССАРИЙ", + "characters": 8034, + "tokens": 3233, + "footnotesCount": 1, + "filePath": "gloss.xhtml" + }, + { + "chapterNumber": 29, + "chapterTitle": "ИСТОЧНИКИ", + "characters": 3700, + "tokens": 1498, + "footnotesCount": 0, + "filePath": "ist.xhtml" + }, + { + "chapterNumber": 30, + "chapterTitle": "СЛОВА БЛАГОДАРНОСТИ", + "characters": 1710, + "tokens": 705, + "footnotesCount": 0, + "filePath": "th.xhtml" + }, + { + "chapterNumber": 31, + "chapterTitle": "ОБ АВТОРЕ", + "characters": 2314, + "tokens": 945, + "footnotesCount": 0, + "filePath": "about.xhtml" + }, + { + "chapterNumber": 32, + "chapterTitle": "Пять пороков команды", + "characters": 536, + "tokens": 236, + "footnotesCount": 0, + "filePath": "r1.xhtml" + }, + { + "chapterNumber": 33, + "chapterTitle": "Сердце компании", + "characters": 579, + "tokens": 251, + "footnotesCount": 0, + "filePath": "r2.xhtml" + }, + { + "chapterNumber": 34, + "chapterTitle": "ПРИМЕЧАНИЯ", + "characters": 1203, + "tokens": 976, + "footnotesCount": 18, + "filePath": "links.xhtml" + }, + { + "chapterNumber": 35, + "chapterTitle": "МИФ Бизнес", + "characters": 161, + "tokens": 83, + "footnotesCount": 0, + "filePath": "biz.xhtml" + }, + { + "chapterNumber": 36, + "chapterTitle": "НАД КНИГОЙ РАБОТАЛИ", + "characters": 367, + "tokens": 168, + "footnotesCount": 0, + "filePath": "end.xhtml" + } + ] +} \ No newline at end of file diff --git a/books/statistics/Рисуй, чтобы победить проверенный способ руководить, продавать, изобретать и обучать_statistics.json b/books/statistics/Рисуй, чтобы победить проверенный способ руководить, продавать, изобретать и обучать_statistics.json new file mode 100644 index 0000000..36b0035 --- /dev/null +++ b/books/statistics/Рисуй, чтобы победить проверенный способ руководить, продавать, изобретать и обучать_statistics.json @@ -0,0 +1,147 @@ +{ + "book": { + "title": "Рисуй, чтобы победить: проверенный способ руководить, продавать, изобретать и обучать", + "author": "Дэн Роэм", + "totalChapters": 17, + "totalCharacters": 147803, + "totalTokens": 59596 + }, + "chapters": [ + { + "chapterNumber": 1, + "chapterTitle": "Дэн Роэм Рисуй, чтобы победить. Проверенный способ руководить, продавать, изобретать и обучать", + "characters": 94, + "tokens": 87, + "footnotesCount": 0, + "filePath": "ch1.xhtml" + }, + { + "chapterNumber": 2, + "chapterTitle": "* * *", + "characters": 569, + "tokens": 243, + "footnotesCount": 0, + "filePath": "ch1-1.xhtml" + }, + { + "chapterNumber": 3, + "chapterTitle": "Ch1 2", + "characters": 34, + "tokens": 29, + "footnotesCount": 0, + "filePath": "ch1-2.xhtml" + }, + { + "chapterNumber": 4, + "chapterTitle": "Запуск", + "characters": 1784, + "tokens": 729, + "footnotesCount": 0, + "filePath": "ch1-3.xhtml" + }, + { + "chapterNumber": 5, + "chapterTitle": "Глава 1. Рисуйте так, словно от этого зависит ваша жизнь", + "characters": 10237, + "tokens": 4130, + "footnotesCount": 0, + "filePath": "ch1-4.xhtml" + }, + { + "chapterNumber": 6, + "chapterTitle": "Глава 2. Побеждает тот, кто лучше рисует", + "characters": 17648, + "tokens": 7089, + "footnotesCount": 0, + "filePath": "ch1-5.xhtml" + }, + { + "chapterNumber": 7, + "chapterTitle": "Глава 3. Сначала нарисуйте круг, потом дайте ему имя", + "characters": 11682, + "tokens": 4706, + "footnotesCount": 0, + "filePath": "ch1-6.xhtml" + }, + { + "chapterNumber": 8, + "chapterTitle": "Глава 4. Взгляд указывает, разум повинуется", + "characters": 14219, + "tokens": 5718, + "footnotesCount": 0, + "filePath": "ch1-7.xhtml" + }, + { + "chapterNumber": 9, + "chapterTitle": "Глава 5. Начните с вопроса «кто?»", + "characters": 14575, + "tokens": 5857, + "footnotesCount": 0, + "filePath": "ch1-8.xhtml" + }, + { + "chapterNumber": 10, + "chapterTitle": "Глава 6. Чтобы руководить, нарисуйте вашу цель", + "characters": 17871, + "tokens": 7180, + "footnotesCount": 0, + "filePath": "ch1-9.xhtml" + }, + { + "chapterNumber": 11, + "chapterTitle": "Глава 7. Чтобы продавать, рисуйте вместе", + "characters": 15255, + "tokens": 6133, + "footnotesCount": 0, + "filePath": "ch1-10.xhtml" + }, + { + "chapterNumber": 12, + "chapterTitle": "Глава 8. Чтобы изобретать, нарисуйте мир вверх тормашками", + "characters": 17765, + "tokens": 7143, + "footnotesCount": 0, + "filePath": "ch1-11.xhtml" + }, + { + "chapterNumber": 13, + "chapterTitle": "Глава 9. Чтобы научить, нарисуйте историю", + "characters": 13131, + "tokens": 5283, + "footnotesCount": 0, + "filePath": "ch1-12.xhtml" + }, + { + "chapterNumber": 14, + "chapterTitle": "Глава 10. Когда не знаете, что делать, – рисуйте", + "characters": 6681, + "tokens": 2706, + "footnotesCount": 0, + "filePath": "ch1-13.xhtml" + }, + { + "chapterNumber": 15, + "chapterTitle": "Благодарности", + "characters": 4954, + "tokens": 2001, + "footnotesCount": 0, + "filePath": "ch1-14.xhtml" + }, + { + "chapterNumber": 16, + "chapterTitle": "Эту книгу хорошо дополняют:", + "characters": 128, + "tokens": 76, + "footnotesCount": 0, + "filePath": "ch1-15.xhtml" + }, + { + "chapterNumber": 17, + "chapterTitle": "Сноски", + "characters": 1176, + "tokens": 486, + "footnotesCount": 0, + "filePath": "ch2.xhtml" + } + ] +} \ No newline at end of file diff --git a/books/statistics/Стартап. Настольная книга основателя_statistics.json b/books/statistics/Стартап. Настольная книга основателя_statistics.json new file mode 100644 index 0000000..697d9f9 --- /dev/null +++ b/books/statistics/Стартап. Настольная книга основателя_statistics.json @@ -0,0 +1,755 @@ +{ + "book": { + "title": "Стартап. Настольная книга основателя", + "author": "Стив Бланк, Боб Дорф", + "totalChapters": 93, + "totalCharacters": 925726, + "totalTokens": 372955 + }, + "chapters": [ + { + "chapterNumber": 1, + "chapterTitle": "Section00", + "characters": 1102, + "tokens": 464, + "footnotesCount": 0, + "filePath": "Text/Section00.html" + }, + { + "chapterNumber": 2, + "chapterTitle": "Section01", + "characters": 8771, + "tokens": 3532, + "footnotesCount": 0, + "filePath": "Text/Section01.html" + }, + { + "chapterNumber": 3, + "chapterTitle": "Section02", + "characters": 1786, + "tokens": 738, + "footnotesCount": 0, + "filePath": "Text/Section02.html" + }, + { + "chapterNumber": 4, + "chapterTitle": "Section03", + "characters": 8806, + "tokens": 3546, + "footnotesCount": 0, + "filePath": "Text/Section03.html" + }, + { + "chapterNumber": 5, + "chapterTitle": "Section04", + "characters": 3424, + "tokens": 1393, + "footnotesCount": 0, + "filePath": "Text/Section04.html" + }, + { + "chapterNumber": 6, + "chapterTitle": "Section05", + "characters": 10173, + "tokens": 4093, + "footnotesCount": 0, + "filePath": "Text/Section05.html" + }, + { + "chapterNumber": 7, + "chapterTitle": "Section06", + "characters": 6412, + "tokens": 2588, + "footnotesCount": 0, + "filePath": "Text/Section06.html" + }, + { + "chapterNumber": 8, + "chapterTitle": "Section07", + "characters": 6694, + "tokens": 2701, + "footnotesCount": 0, + "filePath": "Text/Section07.html" + }, + { + "chapterNumber": 9, + "chapterTitle": "Section08", + "characters": 12351, + "tokens": 4964, + "footnotesCount": 0, + "filePath": "Text/Section08.html" + }, + { + "chapterNumber": 10, + "chapterTitle": "Путь к озарению: модель развития потребителей Манифест развития потребителей", + "characters": 94, + "tokens": 88, + "footnotesCount": 0, + "filePath": "Text/Section09.html" + }, + { + "chapterNumber": 11, + "chapterTitle": "Section10", + "characters": 35939, + "tokens": 14399, + "footnotesCount": 0, + "filePath": "Text/Section10.html" + }, + { + "chapterNumber": 12, + "chapterTitle": "Section11", + "characters": 23733, + "tokens": 9517, + "footnotesCount": 0, + "filePath": "Text/Section11.html" + }, + { + "chapterNumber": 13, + "chapterTitle": "Section111", + "characters": 36942, + "tokens": 14802, + "footnotesCount": 0, + "filePath": "Text/Section111.html" + }, + { + "chapterNumber": 14, + "chapterTitle": "Введение к этапу выявления потребителей Глава 4 Выявление потребителей", + "characters": 379, + "tokens": 200, + "footnotesCount": 0, + "filePath": "Text/Section12.html" + }, + { + "chapterNumber": 15, + "chapterTitle": "Section13", + "characters": 41, + "tokens": 40, + "footnotesCount": 0, + "filePath": "Text/Section13.html" + }, + { + "chapterNumber": 16, + "chapterTitle": "Section1301", + "characters": 23426, + "tokens": 9397, + "footnotesCount": 0, + "filePath": "Text/Section1301.html" + }, + { + "chapterNumber": 17, + "chapterTitle": "Выявление потребителей", + "characters": 97760, + "tokens": 39133, + "footnotesCount": 0, + "filePath": "Text/Section14.html" + }, + { + "chapterNumber": 18, + "chapterTitle": "Section1401", + "characters": 266, + "tokens": 133, + "footnotesCount": 0, + "filePath": "Text/Section1401.html" + }, + { + "chapterNumber": 19, + "chapterTitle": "Section1402", + "characters": 97441, + "tokens": 39003, + "footnotesCount": 0, + "filePath": "Text/Section1402.html" + }, + { + "chapterNumber": 20, + "chapterTitle": "Выявление потребителей", + "characters": 62191, + "tokens": 24905, + "footnotesCount": 0, + "filePath": "Text/Section15.html" + }, + { + "chapterNumber": 21, + "chapterTitle": "Выявление потребителей", + "characters": 53472, + "tokens": 21417, + "footnotesCount": 0, + "filePath": "Text/Section16.html" + }, + { + "chapterNumber": 22, + "chapterTitle": "Выявление потребителей", + "characters": 27287, + "tokens": 10943, + "footnotesCount": 0, + "filePath": "Text/Section17.html" + }, + { + "chapterNumber": 23, + "chapterTitle": "Введение к этапу верификации потребителей Глава 9 Верификация потребителей", + "characters": 360, + "tokens": 194, + "footnotesCount": 0, + "filePath": "Text/Section18.html" + }, + { + "chapterNumber": 24, + "chapterTitle": "Введение к этапу верификации потребителей Во время путешествия мы обычно забываем его цель", + "characters": 23873, + "tokens": 9606, + "footnotesCount": 0, + "filePath": "Text/Section19.html" + }, + { + "chapterNumber": 25, + "chapterTitle": "Верификация потребителей", + "characters": 97584, + "tokens": 39063, + "footnotesCount": 0, + "filePath": "Text/Section20.html" + }, + { + "chapterNumber": 26, + "chapterTitle": "Верификация потребителей", + "characters": 86770, + "tokens": 34738, + "footnotesCount": 0, + "filePath": "Text/Section21.html" + }, + { + "chapterNumber": 27, + "chapterTitle": "Верификация потребителей", + "characters": 24160, + "tokens": 9694, + "footnotesCount": 0, + "filePath": "Text/Section22.html" + }, + { + "chapterNumber": 28, + "chapterTitle": "Верификация потребителей", + "characters": 57355, + "tokens": 22972, + "footnotesCount": 0, + "filePath": "Text/Section24.html" + }, + { + "chapterNumber": 29, + "chapterTitle": "Section25", + "characters": 16946, + "tokens": 6802, + "footnotesCount": 0, + "filePath": "Text/Section25.html" + }, + { + "chapterNumber": 30, + "chapterTitle": "Section26", + "characters": 316, + "tokens": 150, + "footnotesCount": 0, + "filePath": "Text/Section26.html" + }, + { + "chapterNumber": 31, + "chapterTitle": "Section001", + "characters": 1495, + "tokens": 624, + "footnotesCount": 0, + "filePath": "Text/Section001.html" + }, + { + "chapterNumber": 32, + "chapterTitle": "Section0001", + "characters": 1033, + "tokens": 440, + "footnotesCount": 0, + "filePath": "Text/Section0001.html" + }, + { + "chapterNumber": 33, + "chapterTitle": "Section0002", + "characters": 1586, + "tokens": 661, + "footnotesCount": 0, + "filePath": "Text/Section0002.html" + }, + { + "chapterNumber": 34, + "chapterTitle": "Section0003", + "characters": 1365, + "tokens": 573, + "footnotesCount": 0, + "filePath": "Text/Section0003.html" + }, + { + "chapterNumber": 35, + "chapterTitle": "Section0004", + "characters": 1646, + "tokens": 685, + "footnotesCount": 0, + "filePath": "Text/Section0004.html" + }, + { + "chapterNumber": 36, + "chapterTitle": "Section0005", + "characters": 1621, + "tokens": 675, + "footnotesCount": 0, + "filePath": "Text/Section0005.html" + }, + { + "chapterNumber": 37, + "chapterTitle": "Section0006", + "characters": 843, + "tokens": 364, + "footnotesCount": 0, + "filePath": "Text/Section0006.html" + }, + { + "chapterNumber": 38, + "chapterTitle": "Section0007", + "characters": 1229, + "tokens": 518, + "footnotesCount": 0, + "filePath": "Text/Section0007.html" + }, + { + "chapterNumber": 39, + "chapterTitle": "Section0008", + "characters": 1079, + "tokens": 458, + "footnotesCount": 0, + "filePath": "Text/Section0008.html" + }, + { + "chapterNumber": 40, + "chapterTitle": "Section0009", + "characters": 1101, + "tokens": 467, + "footnotesCount": 0, + "filePath": "Text/Section0009.html" + }, + { + "chapterNumber": 41, + "chapterTitle": "Section0010", + "characters": 684, + "tokens": 300, + "footnotesCount": 0, + "filePath": "Text/Section0010.html" + }, + { + "chapterNumber": 42, + "chapterTitle": "Section0011", + "characters": 729, + "tokens": 318, + "footnotesCount": 0, + "filePath": "Text/Section0011.html" + }, + { + "chapterNumber": 43, + "chapterTitle": "Section0012", + "characters": 817, + "tokens": 353, + "footnotesCount": 0, + "filePath": "Text/Section0012.html" + }, + { + "chapterNumber": 44, + "chapterTitle": "Section0013", + "characters": 584, + "tokens": 260, + "footnotesCount": 0, + "filePath": "Text/Section0013.html" + }, + { + "chapterNumber": 45, + "chapterTitle": "Section0014", + "characters": 687, + "tokens": 301, + "footnotesCount": 0, + "filePath": "Text/Section0014.html" + }, + { + "chapterNumber": 46, + "chapterTitle": "Section0015", + "characters": 701, + "tokens": 307, + "footnotesCount": 0, + "filePath": "Text/Section0015.html" + }, + { + "chapterNumber": 47, + "chapterTitle": "Section0016", + "characters": 920, + "tokens": 395, + "footnotesCount": 0, + "filePath": "Text/Section0016.html" + }, + { + "chapterNumber": 48, + "chapterTitle": "Section0017", + "characters": 888, + "tokens": 382, + "footnotesCount": 0, + "filePath": "Text/Section0017.html" + }, + { + "chapterNumber": 49, + "chapterTitle": "Выявление потребителей", + "characters": 1169, + "tokens": 498, + "footnotesCount": 0, + "filePath": "Text/Section0018.html" + }, + { + "chapterNumber": 50, + "chapterTitle": "Section0019", + "characters": 1043, + "tokens": 444, + "footnotesCount": 0, + "filePath": "Text/Section0019.html" + }, + { + "chapterNumber": 51, + "chapterTitle": "Section0020", + "characters": 1327, + "tokens": 557, + "footnotesCount": 0, + "filePath": "Text/Section0020.html" + }, + { + "chapterNumber": 52, + "chapterTitle": "Section0021", + "characters": 998, + "tokens": 426, + "footnotesCount": 0, + "filePath": "Text/Section0021.html" + }, + { + "chapterNumber": 53, + "chapterTitle": "Section0022", + "characters": 961, + "tokens": 411, + "footnotesCount": 0, + "filePath": "Text/Section0022.html" + }, + { + "chapterNumber": 54, + "chapterTitle": "Section0023", + "characters": 1141, + "tokens": 483, + "footnotesCount": 0, + "filePath": "Text/Section0023.html" + }, + { + "chapterNumber": 55, + "chapterTitle": "Section0024", + "characters": 699, + "tokens": 306, + "footnotesCount": 0, + "filePath": "Text/Section0024.html" + }, + { + "chapterNumber": 56, + "chapterTitle": "Section0025", + "characters": 556, + "tokens": 249, + "footnotesCount": 0, + "filePath": "Text/Section0025.html" + }, + { + "chapterNumber": 57, + "chapterTitle": "Section0026", + "characters": 1212, + "tokens": 511, + "footnotesCount": 0, + "filePath": "Text/Section0026.html" + }, + { + "chapterNumber": 58, + "chapterTitle": "Section0027", + "characters": 800, + "tokens": 347, + "footnotesCount": 0, + "filePath": "Text/Section0027.html" + }, + { + "chapterNumber": 59, + "chapterTitle": "Выявление потребителей", + "characters": 1081, + "tokens": 463, + "footnotesCount": 0, + "filePath": "Text/Section0028.html" + }, + { + "chapterNumber": 60, + "chapterTitle": "Выявление потребителей", + "characters": 928, + "tokens": 402, + "footnotesCount": 0, + "filePath": "Text/Section0029.html" + }, + { + "chapterNumber": 61, + "chapterTitle": "Верификация потребителей", + "characters": 618, + "tokens": 279, + "footnotesCount": 0, + "filePath": "Text/Section0030.html" + }, + { + "chapterNumber": 62, + "chapterTitle": "Верификация потребителей", + "characters": 1686, + "tokens": 706, + "footnotesCount": 0, + "filePath": "Text/Section0031.html" + }, + { + "chapterNumber": 63, + "chapterTitle": "Верификация потребителей", + "characters": 988, + "tokens": 427, + "footnotesCount": 0, + "filePath": "Text/Section0032.html" + }, + { + "chapterNumber": 64, + "chapterTitle": "Верификация потребителей", + "characters": 655, + "tokens": 294, + "footnotesCount": 0, + "filePath": "Text/Section0033.html" + }, + { + "chapterNumber": 65, + "chapterTitle": "Верификация потребителей", + "characters": 892, + "tokens": 388, + "footnotesCount": 0, + "filePath": "Text/Section0034.html" + }, + { + "chapterNumber": 66, + "chapterTitle": "Верификация потребителей", + "characters": 1144, + "tokens": 489, + "footnotesCount": 0, + "filePath": "Text/Section0035.html" + }, + { + "chapterNumber": 67, + "chapterTitle": "Верификация потребителей", + "characters": 1103, + "tokens": 473, + "footnotesCount": 0, + "filePath": "Text/Section0036.html" + }, + { + "chapterNumber": 68, + "chapterTitle": "Верификация потребителей", + "characters": 599, + "tokens": 271, + "footnotesCount": 0, + "filePath": "Text/Section0037.html" + }, + { + "chapterNumber": 69, + "chapterTitle": "Верификация потребителей", + "characters": 638, + "tokens": 287, + "footnotesCount": 0, + "filePath": "Text/Section0038.html" + }, + { + "chapterNumber": 70, + "chapterTitle": "Верификация потребителей", + "characters": 722, + "tokens": 320, + "footnotesCount": 0, + "filePath": "Text/Section0039.html" + }, + { + "chapterNumber": 71, + "chapterTitle": "Верификация потребителей", + "characters": 466, + "tokens": 218, + "footnotesCount": 0, + "filePath": "Text/Section0040.html" + }, + { + "chapterNumber": 72, + "chapterTitle": "Верификация потребителей", + "characters": 689, + "tokens": 307, + "footnotesCount": 0, + "filePath": "Text/Section0041.html" + }, + { + "chapterNumber": 73, + "chapterTitle": "Верификация потребителей", + "characters": 931, + "tokens": 404, + "footnotesCount": 0, + "filePath": "Text/Section0042.html" + }, + { + "chapterNumber": 74, + "chapterTitle": "Верификация потребителей", + "characters": 732, + "tokens": 324, + "footnotesCount": 0, + "filePath": "Text/Section0043.html" + }, + { + "chapterNumber": 75, + "chapterTitle": "Верификация потребителей", + "characters": 661, + "tokens": 296, + "footnotesCount": 0, + "filePath": "Text/Section0044.html" + }, + { + "chapterNumber": 76, + "chapterTitle": "Верификация потребителей", + "characters": 1005, + "tokens": 434, + "footnotesCount": 0, + "filePath": "Text/Section0045.html" + }, + { + "chapterNumber": 77, + "chapterTitle": "Section0046", + "characters": 584, + "tokens": 260, + "footnotesCount": 0, + "filePath": "Text/Section0046.html" + }, + { + "chapterNumber": 78, + "chapterTitle": "Верификация потребителей", + "characters": 609, + "tokens": 275, + "footnotesCount": 0, + "filePath": "Text/Section0047.html" + }, + { + "chapterNumber": 79, + "chapterTitle": "Верификация потребителей", + "characters": 448, + "tokens": 211, + "footnotesCount": 0, + "filePath": "Text/Section0048.html" + }, + { + "chapterNumber": 80, + "chapterTitle": "Верификация потребителей", + "characters": 642, + "tokens": 288, + "footnotesCount": 0, + "filePath": "Text/Section0049.html" + }, + { + "chapterNumber": 81, + "chapterTitle": "Верификация потребителей", + "characters": 676, + "tokens": 302, + "footnotesCount": 0, + "filePath": "Text/Section0050.html" + }, + { + "chapterNumber": 82, + "chapterTitle": "Верификация потребителей", + "characters": 752, + "tokens": 332, + "footnotesCount": 0, + "filePath": "Text/Section0051.html" + }, + { + "chapterNumber": 83, + "chapterTitle": "Верификация потребителей", + "characters": 1212, + "tokens": 516, + "footnotesCount": 0, + "filePath": "Text/Section0052.html" + }, + { + "chapterNumber": 84, + "chapterTitle": "Верификация потребителей", + "characters": 572, + "tokens": 260, + "footnotesCount": 0, + "filePath": "Text/Section0053.html" + }, + { + "chapterNumber": 85, + "chapterTitle": "Верификация потребителей", + "characters": 1044, + "tokens": 449, + "footnotesCount": 0, + "filePath": "Text/Section0054.html" + }, + { + "chapterNumber": 86, + "chapterTitle": "Верификация потребителей", + "characters": 736, + "tokens": 326, + "footnotesCount": 0, + "filePath": "Text/Section0055.html" + }, + { + "chapterNumber": 87, + "chapterTitle": "Верификация потребителей", + "characters": 809, + "tokens": 355, + "footnotesCount": 0, + "filePath": "Text/Section0056.html" + }, + { + "chapterNumber": 88, + "chapterTitle": "Section27", + "characters": 21503, + "tokens": 8625, + "footnotesCount": 0, + "filePath": "Text/Section27.html" + }, + { + "chapterNumber": 89, + "chapterTitle": "Section28", + "characters": 10016, + "tokens": 4030, + "footnotesCount": 0, + "filePath": "Text/Section28.html" + }, + { + "chapterNumber": 90, + "chapterTitle": "Section29", + "characters": 9430, + "tokens": 3796, + "footnotesCount": 0, + "filePath": "Text/Section29.html" + }, + { + "chapterNumber": 91, + "chapterTitle": "Section30", + "characters": 6115, + "tokens": 2470, + "footnotesCount": 0, + "filePath": "Text/Section30.html" + }, + { + "chapterNumber": 92, + "chapterTitle": "Section31", + "characters": 146, + "tokens": 82, + "footnotesCount": 0, + "filePath": "Text/Section31.html" + }, + { + "chapterNumber": 93, + "chapterTitle": "Link", + "characters": 126, + "tokens": 68, + "footnotesCount": 0, + "filePath": "Text/link.html" + } + ] +} \ No newline at end of file diff --git a/books/statistics/Стратегия вверх тормашками. Нестандартный подход к маркетингу для малого и среднего бизнеса, который_statistics.json b/books/statistics/Стратегия вверх тормашками. Нестандартный подход к маркетингу для малого и среднего бизнеса, который_statistics.json new file mode 100644 index 0000000..2fabf39 --- /dev/null +++ b/books/statistics/Стратегия вверх тормашками. Нестандартный подход к маркетингу для малого и среднего бизнеса, который_statistics.json @@ -0,0 +1,355 @@ +{ + "book": { + "title": "Стратегия вверх тормашками. Нестандартный подход к маркетингу для малого и среднего бизнеса, который сэкономит вам деньги, время и нервы", + "author": "Николай Викторович Молчанов", + "totalChapters": 43, + "totalCharacters": 293937, + "totalTokens": 119060 + }, + "chapters": [ + { + "chapterNumber": 1, + "chapterTitle": "Глава 1 Используем психологию – Подводим потребителя к нужному нам выбору", + "characters": 5006, + "tokens": 2047, + "footnotesCount": 0, + "filePath": "content0.html" + }, + { + "chapterNumber": 2, + "chapterTitle": "Окружаем «нужный» вариант точками экстремума", + "characters": 5734, + "tokens": 2326, + "footnotesCount": 0, + "filePath": "content1.html" + }, + { + "chapterNumber": 3, + "chapterTitle": "Предъявляем «нужный» вариант в правильной последовательности", + "characters": 6555, + "tokens": 2662, + "footnotesCount": 0, + "filePath": "content2.html" + }, + { + "chapterNumber": 4, + "chapterTitle": "Делаем цену привлекательной – учитываем особенности восприятия стоимости", + "characters": 5789, + "tokens": 2359, + "footnotesCount": 0, + "filePath": "content3.html" + }, + { + "chapterNumber": 5, + "chapterTitle": "Находим и демонстрируем сигналы качества", + "characters": 12211, + "tokens": 4916, + "footnotesCount": 0, + "filePath": "content4.html" + }, + { + "chapterNumber": 6, + "chapterTitle": "Глава 2 Используем психологию – Убеждаем покупателя в правильности выбора", + "characters": 13520, + "tokens": 5453, + "footnotesCount": 0, + "filePath": "content5.html" + }, + { + "chapterNumber": 7, + "chapterTitle": "Используем эффективную структуру и приемы коммуникации с клиентами", + "characters": 5532, + "tokens": 2254, + "footnotesCount": 0, + "filePath": "content6.html" + }, + { + "chapterNumber": 8, + "chapterTitle": "Резонирующий фокус", + "characters": 5498, + "tokens": 2222, + "footnotesCount": 0, + "filePath": "content7.html" + }, + { + "chapterNumber": 9, + "chapterTitle": "Акцентируем внимание не только на преимуществах покупки, но и на угрозах в случае отказа от нее", + "characters": 5053, + "tokens": 2075, + "footnotesCount": 0, + "filePath": "content8.html" + }, + { + "chapterNumber": 10, + "chapterTitle": "Контролируем: мы предлагаем выбрать что-то или отказаться от чего-то", + "characters": 10044, + "tokens": 4060, + "footnotesCount": 0, + "filePath": "content9.html" + }, + { + "chapterNumber": 11, + "chapterTitle": "Глава 3 Перекрываем каналы утечки выручки", + "characters": 9698, + "tokens": 3912, + "footnotesCount": 0, + "filePath": "content10.html" + }, + { + "chapterNumber": 12, + "chapterTitle": "Самая распространенная проблема «входа» в воронку продаж – о компании знают, но не те, кто надо", + "characters": 5519, + "tokens": 2262, + "footnotesCount": 0, + "filePath": "content11.html" + }, + { + "chapterNumber": 13, + "chapterTitle": "Самый забытый этап – жизнь после покупки", + "characters": 8557, + "tokens": 3455, + "footnotesCount": 0, + "filePath": "content12.html" + }, + { + "chapterNumber": 14, + "chapterTitle": "Часть II Готовимся к росту – укрепляем положение на рынке", + "characters": 6257, + "tokens": 2541, + "footnotesCount": 0, + "filePath": "content13.html" + }, + { + "chapterNumber": 15, + "chapterTitle": "Правила проведения сегментации потребителей", + "characters": 5837, + "tokens": 2368, + "footnotesCount": 0, + "filePath": "content14.html" + }, + { + "chapterNumber": 16, + "chapterTitle": "Вычисляем «мертвые души» среди лояльных клиентов", + "characters": 6409, + "tokens": 2599, + "footnotesCount": 0, + "filePath": "content15.html" + }, + { + "chapterNumber": 17, + "chapterTitle": "Глава 5 Достигаем превосходства над конкурентами", + "characters": 5818, + "tokens": 2363, + "footnotesCount": 0, + "filePath": "content16.html" + }, + { + "chapterNumber": 18, + "chapterTitle": "Определяем временной горизонт анализа", + "characters": 9057, + "tokens": 3653, + "footnotesCount": 0, + "filePath": "content17.html" + }, + { + "chapterNumber": 19, + "chapterTitle": "Определяем конкурентные силы", + "characters": 5350, + "tokens": 2168, + "footnotesCount": 0, + "filePath": "content18.html" + }, + { + "chapterNumber": 20, + "chapterTitle": "Оцениваем имеющиеся конкурентные преимущества", + "characters": 7262, + "tokens": 2939, + "footnotesCount": 0, + "filePath": "content19.html" + }, + { + "chapterNumber": 21, + "chapterTitle": "Выбираем основу для конкурентного преимущества", + "characters": 6550, + "tokens": 2655, + "footnotesCount": 0, + "filePath": "content20.html" + }, + { + "chapterNumber": 22, + "chapterTitle": "Находим свое конкурентное преимущество", + "characters": 9944, + "tokens": 4009, + "footnotesCount": 0, + "filePath": "content21.html" + }, + { + "chapterNumber": 23, + "chapterTitle": "Проверяем проблемы ценовой политики", + "characters": 6039, + "tokens": 2446, + "footnotesCount": 0, + "filePath": "content22.html" + }, + { + "chapterNumber": 24, + "chapterTitle": "Запускаем процесс ценообразования", + "characters": 5661, + "tokens": 2294, + "footnotesCount": 0, + "filePath": "content23.html" + }, + { + "chapterNumber": 25, + "chapterTitle": "Решаем вопрос с политикой скидок", + "characters": 9693, + "tokens": 3906, + "footnotesCount": 0, + "filePath": "content24.html" + }, + { + "chapterNumber": 26, + "chapterTitle": "Часть III Устремляемся в счастливое будущее – завоевываем рынки и потребителей", + "characters": 9156, + "tokens": 3710, + "footnotesCount": 0, + "filePath": "content25.html" + }, + { + "chapterNumber": 27, + "chapterTitle": "Обезвреживаем бомбу оптимистичного планирования", + "characters": 6450, + "tokens": 2615, + "footnotesCount": 0, + "filePath": "content26.html" + }, + { + "chapterNumber": 28, + "chapterTitle": "Повышаем точность прогнозирования", + "characters": 5671, + "tokens": 2298, + "footnotesCount": 0, + "filePath": "content27.html" + }, + { + "chapterNumber": 29, + "chapterTitle": "Глава 8 Выходим на новые рынки", + "characters": 7586, + "tokens": 3063, + "footnotesCount": 0, + "filePath": "content28.html" + }, + { + "chapterNumber": 30, + "chapterTitle": "Создаем маркетинговые возможности", + "characters": 4856, + "tokens": 1972, + "footnotesCount": 0, + "filePath": "content29.html" + }, + { + "chapterNumber": 31, + "chapterTitle": "Запускаем новые продукты", + "characters": 5262, + "tokens": 2130, + "footnotesCount": 0, + "filePath": "content30.html" + }, + { + "chapterNumber": 32, + "chapterTitle": "Инновация привлекательна, но с точки зрения компании", + "characters": 7096, + "tokens": 2875, + "footnotesCount": 0, + "filePath": "content31.html" + }, + { + "chapterNumber": 33, + "chapterTitle": "Новый продукт понятен, привлекателен, но требует изменить поведение потребителя", + "characters": 7364, + "tokens": 2993, + "footnotesCount": 0, + "filePath": "content32.html" + }, + { + "chapterNumber": 34, + "chapterTitle": "Создайте собственный миф", + "characters": 4951, + "tokens": 2006, + "footnotesCount": 0, + "filePath": "content33.html" + }, + { + "chapterNumber": 35, + "chapterTitle": "Сохраняйте позиционирование, выходя в новые сегменты рынка", + "characters": 5691, + "tokens": 2316, + "footnotesCount": 0, + "filePath": "content34.html" + }, + { + "chapterNumber": 36, + "chapterTitle": "Вступаем в борьбу с конкурентами", + "characters": 5128, + "tokens": 2080, + "footnotesCount": 0, + "filePath": "content35.html" + }, + { + "chapterNumber": 37, + "chapterTitle": "Глава 9 Готовим ответственного за изменения", + "characters": 8503, + "tokens": 3435, + "footnotesCount": 0, + "filePath": "content36.html" + }, + { + "chapterNumber": 38, + "chapterTitle": "Учимся принимать верные решения", + "characters": 8395, + "tokens": 3387, + "footnotesCount": 0, + "filePath": "content37.html" + }, + { + "chapterNumber": 39, + "chapterTitle": "Не принимайте пустяковых решений", + "characters": 10870, + "tokens": 4377, + "footnotesCount": 0, + "filePath": "content38.html" + }, + { + "chapterNumber": 40, + "chapterTitle": "Решаем – верить ли цифрам", + "characters": 5917, + "tokens": 2393, + "footnotesCount": 0, + "filePath": "content39.html" + }, + { + "chapterNumber": 41, + "chapterTitle": "Вместо заключения История производителя туалетной бумаги", + "characters": 5092, + "tokens": 2075, + "footnotesCount": 0, + "filePath": "content40.html" + }, + { + "chapterNumber": 42, + "chapterTitle": "Избегайте стратегии верблюда", + "characters": 3277, + "tokens": 1338, + "footnotesCount": 0, + "filePath": "content41.html" + }, + { + "chapterNumber": 43, + "chapterTitle": "Сноски", + "characters": 79, + "tokens": 53, + "footnotesCount": 0, + "filePath": "contentnotes0.html" + } + ] +} \ No newline at end of file diff --git a/books/statistics/Управление цепочками поставок и логистикой — простыми словами Методы и практика планирования, постро_statistics.json b/books/statistics/Управление цепочками поставок и логистикой — простыми словами Методы и практика планирования, постро_statistics.json new file mode 100644 index 0000000..3d9f504 --- /dev/null +++ b/books/statistics/Управление цепочками поставок и логистикой — простыми словами Методы и практика планирования, постро_statistics.json @@ -0,0 +1,275 @@ +{ + "book": { + "title": "Управление цепочками поставок и логистикой — простыми словами: Методы и практика планирования, построения, обслуживания, контроля и расширения системы перевозок и снабжения", + "author": "Пол Майерсон", + "totalChapters": 33, + "totalCharacters": 563591, + "totalTokens": 226469 + }, + "chapters": [ + { + "chapterNumber": 1, + "chapterTitle": "Content01", + "characters": 0, + "tokens": 22, + "footnotesCount": 0, + "filePath": "Text/content01.html" + }, + { + "chapterNumber": 2, + "chapterTitle": "Desc", + "characters": 897, + "tokens": 374, + "footnotesCount": 0, + "filePath": "Text/desc.html" + }, + { + "chapterNumber": 3, + "chapterTitle": "Content03", + "characters": 3103, + "tokens": 1263, + "footnotesCount": 0, + "filePath": "Text/content03.html" + }, + { + "chapterNumber": 4, + "chapterTitle": "Content04", + "characters": 288, + "tokens": 137, + "footnotesCount": 0, + "filePath": "Text/content04.html" + }, + { + "chapterNumber": 5, + "chapterTitle": "Предисловие к русскому изданию", + "characters": 3113, + "tokens": 1276, + "footnotesCount": 0, + "filePath": "Text/content05.html" + }, + { + "chapterNumber": 6, + "chapterTitle": "Управление цепочками поставок и логистикой: общая информация", + "characters": 7, + "tokens": 42, + "footnotesCount": 0, + "filePath": "Text/chast1.html" + }, + { + "chapterNumber": 7, + "chapterTitle": "Интегрированная цепочка поставок с добавленной ценностью", + "characters": 20935, + "tokens": 8414, + "footnotesCount": 0, + "filePath": "Text/content1.html" + }, + { + "chapterNumber": 8, + "chapterTitle": "Подробнее о цепочке поставок", + "characters": 31749, + "tokens": 12728, + "footnotesCount": 0, + "filePath": "Text/content2.html" + }, + { + "chapterNumber": 9, + "chapterTitle": "Планирование в рамках цепочки поставок", + "characters": 8, + "tokens": 34, + "footnotesCount": 0, + "filePath": "Text/chast2.html" + }, + { + "chapterNumber": 10, + "chapterTitle": "«Полный газ, смотрим в зеркало заднего вида» — таким было прогнозирование раньше", + "characters": 33358, + "tokens": 13393, + "footnotesCount": 0, + "filePath": "Text/content3.html" + }, + { + "chapterNumber": 11, + "chapterTitle": "Планирование и контроль запасов", + "characters": 30024, + "tokens": 12039, + "footnotesCount": 0, + "filePath": "Text/content4.html" + }, + { + "chapterNumber": 12, + "chapterTitle": "Совокупное и календарное планирование", + "characters": 37184, + "tokens": 14905, + "footnotesCount": 0, + "filePath": "Text/content5.html" + }, + { + "chapterNumber": 13, + "chapterTitle": "Функционирование цепочки поставок", + "characters": 9, + "tokens": 33, + "footnotesCount": 0, + "filePath": "Text/chast3.html" + }, + { + "chapterNumber": 14, + "chapterTitle": "Снабжение в цепочке поставок", + "characters": 29761, + "tokens": 11933, + "footnotesCount": 0, + "filePath": "Text/content6.html" + }, + { + "chapterNumber": 15, + "chapterTitle": "Транспортные системы", + "characters": 48575, + "tokens": 19456, + "footnotesCount": 0, + "filePath": "Text/content7.html" + }, + { + "chapterNumber": 16, + "chapterTitle": "Управление складскими операциями", + "characters": 41449, + "tokens": 16609, + "footnotesCount": 0, + "filePath": "Text/content8.html" + }, + { + "chapterNumber": 17, + "chapterTitle": "Управление заказами и отношениями с клиентами", + "characters": 16485, + "tokens": 6630, + "footnotesCount": 0, + "filePath": "Text/content9.html" + }, + { + "chapterNumber": 18, + "chapterTitle": "Обратная логистика и устойчивое развитие", + "characters": 31764, + "tokens": 12740, + "footnotesCount": 0, + "filePath": "Text/content10.html" + }, + { + "chapterNumber": 19, + "chapterTitle": "Операции в глобальных цепях поставок и управление рисками", + "characters": 28157, + "tokens": 11303, + "footnotesCount": 0, + "filePath": "Text/content11.html" + }, + { + "chapterNumber": 20, + "chapterTitle": "Интеграция и сотрудничество по цепочкам поставок", + "characters": 8, + "tokens": 39, + "footnotesCount": 0, + "filePath": "Text/chast4.html" + }, + { + "chapterNumber": 21, + "chapterTitle": "Партнеры по цепочкам поставок", + "characters": 22428, + "tokens": 9001, + "footnotesCount": 0, + "filePath": "Text/content12.html" + }, + { + "chapterNumber": 22, + "chapterTitle": "Интеграция цепочек поставок через системы сотрудничества", + "characters": 22004, + "tokens": 8842, + "footnotesCount": 0, + "filePath": "Text/content13.html" + }, + { + "chapterNumber": 23, + "chapterTitle": "Технологии для цепочек поставок", + "characters": 27582, + "tokens": 11063, + "footnotesCount": 0, + "filePath": "Text/content14.html" + }, + { + "chapterNumber": 24, + "chapterTitle": "Проектирование сетей цепочек поставок и логистики", + "characters": 7, + "tokens": 38, + "footnotesCount": 0, + "filePath": "Text/chast5.html" + }, + { + "chapterNumber": 25, + "chapterTitle": "Выбор места для склада", + "characters": 36189, + "tokens": 14502, + "footnotesCount": 0, + "filePath": "Text/content15.html" + }, + { + "chapterNumber": 26, + "chapterTitle": "Решения по зонированию склада", + "characters": 24674, + "tokens": 9899, + "footnotesCount": 0, + "filePath": "Text/content16.html" + }, + { + "chapterNumber": 27, + "chapterTitle": "Измерение, контроль и совершенствование цепочек поставок и логистики", + "characters": 8, + "tokens": 47, + "footnotesCount": 0, + "filePath": "Text/chast6.html" + }, + { + "chapterNumber": 28, + "chapterTitle": "Показатели и средства измерения", + "characters": 19056, + "tokens": 7653, + "footnotesCount": 0, + "filePath": "Text/content17.html" + }, + { + "chapterNumber": 29, + "chapterTitle": "Бережливое и гибкое мышление в цепочках поставок и логистике", + "characters": 33058, + "tokens": 13266, + "footnotesCount": 0, + "filePath": "Text/content18.html" + }, + { + "chapterNumber": 30, + "chapterTitle": "Перспективы управления цепочками поставок и логистикой", + "characters": 17545, + "tokens": 7058, + "footnotesCount": 0, + "filePath": "Text/content19.html" + }, + { + "chapterNumber": 31, + "chapterTitle": "Section0001", + "characters": 0, + "tokens": 27, + "footnotesCount": 0, + "filePath": "Text/Section0001.html" + }, + { + "chapterNumber": 32, + "chapterTitle": "Link", + "characters": 3484, + "tokens": 1409, + "footnotesCount": 0, + "filePath": "Text/link.html" + }, + { + "chapterNumber": 33, + "chapterTitle": "Content02", + "characters": 682, + "tokens": 294, + "footnotesCount": 0, + "filePath": "Text/content02.html" + } + ] +} \ No newline at end of file diff --git a/books/statistics/Управляя кризисом. Как выращивать успешные компании_statistics.json b/books/statistics/Управляя кризисом. Как выращивать успешные компании_statistics.json new file mode 100644 index 0000000..20750de --- /dev/null +++ b/books/statistics/Управляя кризисом. Как выращивать успешные компании_statistics.json @@ -0,0 +1,395 @@ +{ + "book": { + "title": "Управляя кризисом. Как выращивать успешные компании", + "author": "Дмитрий Симоненко", + "totalChapters": 48, + "totalCharacters": 369691, + "totalTokens": 149275 + }, + "chapters": [ + { + "chapterNumber": 1, + "chapterTitle": "Дмитрий Симоненко Управляя кризисом: Как выращивать успешные компании", + "characters": 5482, + "tokens": 2235, + "footnotesCount": 0, + "filePath": "content0.html" + }, + { + "chapterNumber": 2, + "chapterTitle": "Зачем покупают бизнес?", + "characters": 5896, + "tokens": 2382, + "footnotesCount": 0, + "filePath": "content1.html" + }, + { + "chapterNumber": 3, + "chapterTitle": "Глава 1 Зачем и для кого я пишу эту книгу?", + "characters": 7776, + "tokens": 3142, + "footnotesCount": 0, + "filePath": "content2.html" + }, + { + "chapterNumber": 4, + "chapterTitle": "Чему не научат в бизнес-школах", + "characters": 6528, + "tokens": 2639, + "footnotesCount": 0, + "filePath": "content3.html" + }, + { + "chapterNumber": 5, + "chapterTitle": "Зачем нужна эта книга?", + "characters": 9835, + "tokens": 3958, + "footnotesCount": 0, + "filePath": "content4.html" + }, + { + "chapterNumber": 6, + "chapterTitle": "Что с этим делать?", + "characters": 8431, + "tokens": 3395, + "footnotesCount": 0, + "filePath": "content5.html" + }, + { + "chapterNumber": 7, + "chapterTitle": "Точка опоры предпринимателя", + "characters": 21302, + "tokens": 8546, + "footnotesCount": 0, + "filePath": "content6.html" + }, + { + "chapterNumber": 8, + "chapterTitle": "Глава 3 Где брать идеи и как превращать их в бизнес?", + "characters": 6323, + "tokens": 2565, + "footnotesCount": 0, + "filePath": "content7.html" + }, + { + "chapterNumber": 9, + "chapterTitle": "Крутая идея – плохое решение", + "characters": 9821, + "tokens": 3955, + "footnotesCount": 0, + "filePath": "content8.html" + }, + { + "chapterNumber": 10, + "chapterTitle": "Конкурентное преимущество: время и место", + "characters": 7145, + "tokens": 2890, + "footnotesCount": 0, + "filePath": "content9.html" + }, + { + "chapterNumber": 11, + "chapterTitle": "Глава 4 Как написать бизнес-план на $100 млн?", + "characters": 8442, + "tokens": 3411, + "footnotesCount": 0, + "filePath": "content10.html" + }, + { + "chapterNumber": 12, + "chapterTitle": "От кофемолки к роботам", + "characters": 5894, + "tokens": 2382, + "footnotesCount": 0, + "filePath": "content11.html" + }, + { + "chapterNumber": 13, + "chapterTitle": "Роботы: техзадание и первые клиенты", + "characters": 8068, + "tokens": 3258, + "footnotesCount": 0, + "filePath": "content12.html" + }, + { + "chapterNumber": 14, + "chapterTitle": "Глава 5 Как нанять и удержать лучших людей", + "characters": 5102, + "tokens": 2073, + "footnotesCount": 0, + "filePath": "content13.html" + }, + { + "chapterNumber": 15, + "chapterTitle": "Лубянка и французский заговор", + "characters": 8844, + "tokens": 3565, + "footnotesCount": 0, + "filePath": "content14.html" + }, + { + "chapterNumber": 16, + "chapterTitle": "Почему Ирландия?", + "characters": 6111, + "tokens": 2467, + "footnotesCount": 0, + "filePath": "content15.html" + }, + { + "chapterNumber": 17, + "chapterTitle": "Женщины и амбиции", + "characters": 7536, + "tokens": 3037, + "footnotesCount": 0, + "filePath": "content16.html" + }, + { + "chapterNumber": 18, + "chapterTitle": "Итоги: как найти и нанять лучших людей", + "characters": 6837, + "tokens": 2766, + "footnotesCount": 0, + "filePath": "content17.html" + }, + { + "chapterNumber": 19, + "chapterTitle": "Балу – учитель и систематизатор", + "characters": 8741, + "tokens": 3525, + "footnotesCount": 0, + "filePath": "content18.html" + }, + { + "chapterNumber": 20, + "chapterTitle": "Кто и когда нужен?", + "characters": 6035, + "tokens": 2438, + "footnotesCount": 0, + "filePath": "content19.html" + }, + { + "chapterNumber": 21, + "chapterTitle": "Итоги: 4 этапа создания команды мечты", + "characters": 5482, + "tokens": 2223, + "footnotesCount": 0, + "filePath": "content20.html" + }, + { + "chapterNumber": 22, + "chapterTitle": "Глава 7 СКольких вынесет Боливар? / Партнеры и стейкхолдеры", + "characters": 7174, + "tokens": 2909, + "footnotesCount": 0, + "filePath": "content21.html" + }, + { + "chapterNumber": 23, + "chapterTitle": "Как правильно выбирать партнеров и инвесторов", + "characters": 6502, + "tokens": 2635, + "footnotesCount": 0, + "filePath": "content22.html" + }, + { + "chapterNumber": 24, + "chapterTitle": "Глава 8 Инвестиции: умные деньги и токсичные инвесторы", + "characters": 8352, + "tokens": 3378, + "footnotesCount": 0, + "filePath": "content23.html" + }, + { + "chapterNumber": 25, + "chapterTitle": "Ангелы и демоны", + "characters": 5428, + "tokens": 2194, + "footnotesCount": 0, + "filePath": "content24.html" + }, + { + "chapterNumber": 26, + "chapterTitle": "Бизнес-ангел мошенник: как я привлек деньги в Plesk", + "characters": 7745, + "tokens": 3135, + "footnotesCount": 0, + "filePath": "content25.html" + }, + { + "chapterNumber": 27, + "chapterTitle": "Венчурные фонды", + "characters": 7702, + "tokens": 3103, + "footnotesCount": 0, + "filePath": "content26.html" + }, + { + "chapterNumber": 28, + "chapterTitle": "Итоги: глупые и умные деньги", + "characters": 11463, + "tokens": 4613, + "footnotesCount": 0, + "filePath": "content27.html" + }, + { + "chapterNumber": 29, + "chapterTitle": "Глава 9 Сколько денег нужно для бизнеса и когда их привлекать?", + "characters": 6073, + "tokens": 2470, + "footnotesCount": 0, + "filePath": "content28.html" + }, + { + "chapterNumber": 30, + "chapterTitle": "Квант инвестиций: сколько нужно денег?", + "characters": 7848, + "tokens": 3171, + "footnotesCount": 0, + "filePath": "content29.html" + }, + { + "chapterNumber": 31, + "chapterTitle": "Кэшаут: как вынуть деньги и не пустить бизнес под откос?", + "characters": 10032, + "tokens": 4051, + "footnotesCount": 0, + "filePath": "content30.html" + }, + { + "chapterNumber": 32, + "chapterTitle": "Глава 10 Кто я такой?", + "characters": 8612, + "tokens": 3469, + "footnotesCount": 0, + "filePath": "content31.html" + }, + { + "chapterNumber": 33, + "chapterTitle": "Позитивный взгляд и иллюзии", + "characters": 5460, + "tokens": 2211, + "footnotesCount": 0, + "filePath": "content32.html" + }, + { + "chapterNumber": 34, + "chapterTitle": "видов конкурентных преимуществ", + "characters": 5869, + "tokens": 2376, + "footnotesCount": 0, + "filePath": "content33.html" + }, + { + "chapterNumber": 35, + "chapterTitle": "Глава 11 Как создать высокотехнологичное производство?", + "characters": 8490, + "tokens": 3434, + "footnotesCount": 0, + "filePath": "content34.html" + }, + { + "chapterNumber": 36, + "chapterTitle": "Как это работает?", + "characters": 7398, + "tokens": 2982, + "footnotesCount": 0, + "filePath": "content35.html" + }, + { + "chapterNumber": 37, + "chapterTitle": "Незнание есть благословение?", + "characters": 6937, + "tokens": 2802, + "footnotesCount": 0, + "filePath": "content36.html" + }, + { + "chapterNumber": 38, + "chapterTitle": "Глава 12 Как выйти на международный уровень (И стоит ли)?", + "characters": 8643, + "tokens": 3496, + "footnotesCount": 0, + "filePath": "content37.html" + }, + { + "chapterNumber": 39, + "chapterTitle": "Стратегия развития", + "characters": 8681, + "tokens": 3496, + "footnotesCount": 0, + "filePath": "content38.html" + }, + { + "chapterNumber": 40, + "chapterTitle": "Сильные стороны России", + "characters": 7642, + "tokens": 3081, + "footnotesCount": 0, + "filePath": "content39.html" + }, + { + "chapterNumber": 41, + "chapterTitle": "Глава 13 Проблема роста?", + "characters": 5809, + "tokens": 2349, + "footnotesCount": 0, + "filePath": "content40.html" + }, + { + "chapterNumber": 42, + "chapterTitle": "Кризис № 1. Как стать предпринимателем", + "characters": 6608, + "tokens": 2675, + "footnotesCount": 0, + "filePath": "content41.html" + }, + { + "chapterNumber": 43, + "chapterTitle": "Кризис № 2. Проблема роста", + "characters": 6077, + "tokens": 2457, + "footnotesCount": 0, + "filePath": "content42.html" + }, + { + "chapterNumber": 44, + "chapterTitle": "Нужно ли бизнесмену МВА?", + "characters": 5935, + "tokens": 2400, + "footnotesCount": 0, + "filePath": "content43.html" + }, + { + "chapterNumber": 45, + "chapterTitle": "Глава 14 Как продать компанию?", + "characters": 6882, + "tokens": 2781, + "footnotesCount": 0, + "filePath": "content44.html" + }, + { + "chapterNumber": 46, + "chapterTitle": "Зачем покупать бизнес?", + "characters": 5825, + "tokens": 2355, + "footnotesCount": 0, + "filePath": "content45.html" + }, + { + "chapterNumber": 47, + "chapterTitle": "Как подготовить бизнес к продаже?", + "characters": 7628, + "tokens": 3081, + "footnotesCount": 0, + "filePath": "content46.html" + }, + { + "chapterNumber": 48, + "chapterTitle": "Заключение", + "characters": 13245, + "tokens": 5319, + "footnotesCount": 0, + "filePath": "content47.html" + } + ] +} \ No newline at end of file diff --git a/books/statistics/Фиолетовая корова. Сделайте свой бизнес выдающимся!_statistics.json b/books/statistics/Фиолетовая корова. Сделайте свой бизнес выдающимся!_statistics.json new file mode 100644 index 0000000..e009bc2 --- /dev/null +++ b/books/statistics/Фиолетовая корова. Сделайте свой бизнес выдающимся!_statistics.json @@ -0,0 +1,235 @@ +{ + "book": { + "title": "Фиолетовая корова. Сделайте свой бизнес выдающимся!", + "author": "Сет Годин", + "totalChapters": 28, + "totalCharacters": 208945, + "totalTokens": 84453 + }, + "chapters": [ + { + "chapterNumber": 1, + "chapterTitle": "Сет Годин Фиолетовая корова. Сделайте свой бизнес выдающимся!", + "characters": 5342, + "tokens": 2176, + "footnotesCount": 0, + "filePath": "content0.html" + }, + { + "chapterNumber": 2, + "chapterTitle": "Величайшая идея нарезанного хлеба", + "characters": 5170, + "tokens": 2097, + "footnotesCount": 0, + "filePath": "content1.html" + }, + { + "chapterNumber": 3, + "chapterTitle": "Почему вам нужна Фиолетовая корова", + "characters": 8074, + "tokens": 3258, + "footnotesCount": 0, + "filePath": "content2.html" + }, + { + "chapterNumber": 4, + "chapterTitle": "Смерть телевизионнопромышленного комплекса", + "characters": 7067, + "tokens": 2858, + "footnotesCount": 0, + "filePath": "content3.html" + }, + { + "chapterNumber": 5, + "chapterTitle": "ПРЕДСТАВЛЯЕМ НОВОЕ ИМЯ KPMG В КОНСАЛТИНГЕ И НОВУЮ ЭРУ В УПРАВЛЕНИИ", + "characters": 5999, + "tokens": 2441, + "footnotesCount": 0, + "filePath": "content4.html" + }, + { + "chapterNumber": 6, + "chapterTitle": "Пример: что должен делать Tide?", + "characters": 6163, + "tokens": 2493, + "footnotesCount": 0, + "filePath": "content5.html" + }, + { + "chapterNumber": 7, + "chapterTitle": "Проникновение на рынок", + "characters": 5564, + "tokens": 2249, + "footnotesCount": 0, + "filePath": "content6.html" + }, + { + "chapterNumber": 8, + "chapterTitle": "Идеи, которые распространяются и побеждают", + "characters": 5489, + "tokens": 2227, + "footnotesCount": 0, + "filePath": "content7.html" + }, + { + "chapterNumber": 9, + "chapterTitle": "Кто слушает?", + "characters": 5697, + "tokens": 2298, + "footnotesCount": 0, + "filePath": "content8.html" + }, + { + "chapterNumber": 10, + "chapterTitle": "Кого это волнует?", + "characters": 7680, + "tokens": 3094, + "footnotesCount": 0, + "filePath": "content9.html" + }, + { + "chapterNumber": 11, + "chapterTitle": "Проблема с Коровой…", + "characters": 11749, + "tokens": 4723, + "footnotesCount": 0, + "filePath": "content10.html" + }, + { + "chapterNumber": 12, + "chapterTitle": "Прогнозы, доходы и Фиолетовая корова", + "characters": 10900, + "tokens": 4391, + "footnotesCount": 0, + "filePath": "content11.html" + }, + { + "chapterNumber": 13, + "chapterTitle": "Анализ эффективности на массовом рынке", + "characters": 7115, + "tokens": 2878, + "footnotesCount": 0, + "filePath": "content12.html" + }, + { + "chapterNumber": 14, + "chapterTitle": "Преимущества Фиолетовой коровы", + "characters": 5292, + "tokens": 2145, + "footnotesCount": 0, + "filePath": "content13.html" + }, + { + "chapterNumber": 15, + "chapterTitle": "Антоним слова «выдающийся»", + "characters": 6267, + "tokens": 2533, + "footnotesCount": 0, + "filePath": "content14.html" + }, + { + "chapterNumber": 16, + "chapterTitle": "Семьдесят два альбома группы Pearl Jam", + "characters": 5539, + "tokens": 2247, + "footnotesCount": 0, + "filePath": "content15.html" + }, + { + "chapterNumber": 17, + "chapterTitle": "Пример: почтовая служба США", + "characters": 5268, + "tokens": 2134, + "footnotesCount": 0, + "filePath": "content16.html" + }, + { + "chapterNumber": 18, + "chapterTitle": "Пример: как компания Dutch Boy перевернула весь лакокрасочный бизнес", + "characters": 5751, + "tokens": 2344, + "footnotesCount": 0, + "filePath": "content17.html" + }, + { + "chapterNumber": 19, + "chapterTitle": "Продавайте то, что покупают (и о чем говорят)", + "characters": 6557, + "tokens": 2657, + "footnotesCount": 0, + "filePath": "content18.html" + }, + { + "chapterNumber": 20, + "chapterTitle": "Магический цикл Фиолетовой коровы", + "characters": 6625, + "tokens": 2680, + "footnotesCount": 0, + "filePath": "content19.html" + }, + { + "chapterNumber": 21, + "chapterTitle": "Что сегодня означает выражение «заниматься маркетингом»?", + "characters": 10495, + "tokens": 4237, + "footnotesCount": 0, + "filePath": "content20.html" + }, + { + "chapterNumber": 22, + "chapterTitle": "Нужно ли быть возмутительным и скандальным, чтобы стать выдающимся?", + "characters": 6783, + "tokens": 2756, + "footnotesCount": 0, + "filePath": "content21.html" + }, + { + "chapterNumber": 23, + "chapterTitle": "Что должны делать в Hallmark.com?", + "characters": 6292, + "tokens": 2546, + "footnotesCount": 0, + "filePath": "content22.html" + }, + { + "chapterNumber": 24, + "chapterTitle": "Пример: Трейси, специалист по печати и рекламе", + "characters": 5558, + "tokens": 2258, + "footnotesCount": 0, + "filePath": "content23.html" + }, + { + "chapterNumber": 25, + "chapterTitle": "Обязательно ли «вкладывать душу»?", + "characters": 9550, + "tokens": 3850, + "footnotesCount": 0, + "filePath": "content24.html" + }, + { + "chapterNumber": 26, + "chapterTitle": "Реальные факты", + "characters": 27628, + "tokens": 11073, + "footnotesCount": 0, + "filePath": "content25.html" + }, + { + "chapterNumber": 27, + "chapterTitle": "Соль – совсем не скучный продукт, или Еще восемь способов заставить работать Фиолетовую корову", + "characters": 4731, + "tokens": 1946, + "footnotesCount": 0, + "filePath": "content26.html" + }, + { + "chapterNumber": 28, + "chapterTitle": "Примечания", + "characters": 4600, + "tokens": 1864, + "footnotesCount": 0, + "filePath": "contentnotes0.html" + } + ] +} \ No newline at end of file diff --git a/books/statistics/Чему я научился, потеряв миллион долларов_statistics.json b/books/statistics/Чему я научился, потеряв миллион долларов_statistics.json new file mode 100644 index 0000000..adbc54c --- /dev/null +++ b/books/statistics/Чему я научился, потеряв миллион долларов_statistics.json @@ -0,0 +1,579 @@ +{ + "book": { + "title": "Чему я научился, потеряв миллион долларов", + "author": "Джим Пол, Брендан Мойнихан", + "totalChapters": 71, + "totalCharacters": 346154, + "totalTokens": 143210 + }, + "chapters": [ + { + "chapterNumber": 1, + "chapterTitle": "Предисловие", + "characters": 3558, + "tokens": 1445, + "footnotesCount": 0, + "filePath": "index_split_000.html" + }, + { + "chapterNumber": 2, + "chapterTitle": "Предисловие к изданию Columbia Business School publishing", + "characters": 3378, + "tokens": 1391, + "footnotesCount": 0, + "filePath": "index_split_001.html" + }, + { + "chapterNumber": 3, + "chapterTitle": "Зачем писать книгу о проигрыше?", + "characters": 9846, + "tokens": 3968, + "footnotesCount": 0, + "filePath": "index_split_002.html" + }, + { + "chapterNumber": 4, + "chapterTitle": "Записки трейдера", + "characters": 5989, + "tokens": 2419, + "footnotesCount": 1, + "filePath": "index_split_003.html" + }, + { + "chapterNumber": 5, + "chapterTitle": "Голодное детство", + "characters": 11269, + "tokens": 4531, + "footnotesCount": 4, + "filePath": "index_split_004.html" + }, + { + "chapterNumber": 6, + "chapterTitle": "Джин — это напиток или игра?", + "characters": 41227, + "tokens": 16519, + "footnotesCount": 5, + "filePath": "index_split_005.html" + }, + { + "chapterNumber": 7, + "chapterTitle": "Как работать на бирже", + "characters": 15896, + "tokens": 6384, + "footnotesCount": 0, + "filePath": "index_split_006.html" + }, + { + "chapterNumber": 8, + "chapterTitle": "Фиаско арабского скакуна", + "characters": 36627, + "tokens": 14677, + "footnotesCount": 11, + "filePath": "index_split_007.html" + }, + { + "chapterNumber": 9, + "chapterTitle": "Как зарабатывают профессионалы?", + "characters": 9576, + "tokens": 3860, + "footnotesCount": 1, + "filePath": "index_split_008.html" + }, + { + "chapterNumber": 10, + "chapterTitle": "Плевать на традиции?", + "characters": 9541, + "tokens": 3842, + "footnotesCount": 3, + "filePath": "index_split_009.html" + }, + { + "chapterNumber": 11, + "chapterTitle": "Как потеря на рынке становится внутренней", + "characters": 25321, + "tokens": 10162, + "footnotesCount": 3, + "filePath": "index_split_010.html" + }, + { + "chapterNumber": 12, + "chapterTitle": "Как поведенческие характеристики определяют суть деятельности", + "characters": 30941, + "tokens": 12418, + "footnotesCount": 4, + "filePath": "index_split_011.html" + }, + { + "chapterNumber": 13, + "chapterTitle": "Общепринятый взгляд на поведение толпы", + "characters": 29415, + "tokens": 11799, + "footnotesCount": 8, + "filePath": "index_split_012.html" + }, + { + "chapterNumber": 14, + "chapterTitle": "Как действовать в условиях неопределенности", + "characters": 63379, + "tokens": 25386, + "footnotesCount": 9, + "filePath": "index_split_013.html" + }, + { + "chapterNumber": 15, + "chapterTitle": "А что если...", + "characters": 13029, + "tokens": 5234, + "footnotesCount": 2, + "filePath": "index_split_014.html" + }, + { + "chapterNumber": 16, + "chapterTitle": "Постскриптум", + "characters": 19609, + "tokens": 7865, + "footnotesCount": 2, + "filePath": "index_split_015.html" + }, + { + "chapterNumber": 17, + "chapterTitle": "Приложение", + "characters": 3933, + "tokens": 1595, + "footnotesCount": 0, + "filePath": "index_split_016.html" + }, + { + "chapterNumber": 18, + "chapterTitle": "Примечания", + "characters": 6139, + "tokens": 2501, + "footnotesCount": 1, + "filePath": "index_split_017.html" + }, + { + "chapterNumber": 19, + "chapterTitle": "Index Split 018", + "characters": 111, + "tokens": 112, + "footnotesCount": 1, + "filePath": "index_split_018.html" + }, + { + "chapterNumber": 20, + "chapterTitle": "Index Split 019", + "characters": 88, + "tokens": 94, + "footnotesCount": 1, + "filePath": "index_split_019.html" + }, + { + "chapterNumber": 21, + "chapterTitle": "Index Split 020", + "characters": 57, + "tokens": 68, + "footnotesCount": 1, + "filePath": "index_split_020.html" + }, + { + "chapterNumber": 22, + "chapterTitle": "Index Split 021", + "characters": 59, + "tokens": 70, + "footnotesCount": 1, + "filePath": "index_split_021.html" + }, + { + "chapterNumber": 23, + "chapterTitle": "Index Split 022", + "characters": 178, + "tokens": 166, + "footnotesCount": 1, + "filePath": "index_split_022.html" + }, + { + "chapterNumber": 24, + "chapterTitle": "Index Split 023", + "characters": 90, + "tokens": 96, + "footnotesCount": 1, + "filePath": "index_split_023.html" + }, + { + "chapterNumber": 25, + "chapterTitle": "Index Split 024", + "characters": 184, + "tokens": 170, + "footnotesCount": 1, + "filePath": "index_split_024.html" + }, + { + "chapterNumber": 26, + "chapterTitle": "Index Split 025", + "characters": 93, + "tokens": 98, + "footnotesCount": 1, + "filePath": "index_split_025.html" + }, + { + "chapterNumber": 27, + "chapterTitle": "Index Split 026", + "characters": 124, + "tokens": 122, + "footnotesCount": 1, + "filePath": "index_split_026.html" + }, + { + "chapterNumber": 28, + "chapterTitle": "Index Split 027", + "characters": 100, + "tokens": 104, + "footnotesCount": 1, + "filePath": "index_split_027.html" + }, + { + "chapterNumber": 29, + "chapterTitle": "Index Split 028", + "characters": 147, + "tokens": 140, + "footnotesCount": 1, + "filePath": "index_split_028.html" + }, + { + "chapterNumber": 30, + "chapterTitle": "Index Split 029", + "characters": 175, + "tokens": 164, + "footnotesCount": 1, + "filePath": "index_split_029.html" + }, + { + "chapterNumber": 31, + "chapterTitle": "Index Split 030", + "characters": 92, + "tokens": 96, + "footnotesCount": 1, + "filePath": "index_split_030.html" + }, + { + "chapterNumber": 32, + "chapterTitle": "Index Split 031", + "characters": 92, + "tokens": 96, + "footnotesCount": 1, + "filePath": "index_split_031.html" + }, + { + "chapterNumber": 33, + "chapterTitle": "Index Split 032", + "characters": 220, + "tokens": 200, + "footnotesCount": 1, + "filePath": "index_split_032.html" + }, + { + "chapterNumber": 34, + "chapterTitle": "Index Split 033", + "characters": 65, + "tokens": 76, + "footnotesCount": 1, + "filePath": "index_split_033.html" + }, + { + "chapterNumber": 35, + "chapterTitle": "Index Split 034", + "characters": 85, + "tokens": 92, + "footnotesCount": 1, + "filePath": "index_split_034.html" + }, + { + "chapterNumber": 36, + "chapterTitle": "Index Split 035", + "characters": 154, + "tokens": 146, + "footnotesCount": 1, + "filePath": "index_split_035.html" + }, + { + "chapterNumber": 37, + "chapterTitle": "Index Split 036", + "characters": 137, + "tokens": 132, + "footnotesCount": 1, + "filePath": "index_split_036.html" + }, + { + "chapterNumber": 38, + "chapterTitle": "Index Split 037", + "characters": 57, + "tokens": 68, + "footnotesCount": 1, + "filePath": "index_split_037.html" + }, + { + "chapterNumber": 39, + "chapterTitle": "Index Split 038", + "characters": 158, + "tokens": 150, + "footnotesCount": 1, + "filePath": "index_split_038.html" + }, + { + "chapterNumber": 40, + "chapterTitle": "Index Split 039", + "characters": 111, + "tokens": 112, + "footnotesCount": 1, + "filePath": "index_split_039.html" + }, + { + "chapterNumber": 41, + "chapterTitle": "Index Split 040", + "characters": 94, + "tokens": 98, + "footnotesCount": 1, + "filePath": "index_split_040.html" + }, + { + "chapterNumber": 42, + "chapterTitle": "Index Split 041", + "characters": 94, + "tokens": 98, + "footnotesCount": 1, + "filePath": "index_split_041.html" + }, + { + "chapterNumber": 43, + "chapterTitle": "Index Split 042", + "characters": 201, + "tokens": 184, + "footnotesCount": 1, + "filePath": "index_split_042.html" + }, + { + "chapterNumber": 44, + "chapterTitle": "Index Split 043", + "characters": 213, + "tokens": 194, + "footnotesCount": 1, + "filePath": "index_split_043.html" + }, + { + "chapterNumber": 45, + "chapterTitle": "Index Split 044", + "characters": 227, + "tokens": 204, + "footnotesCount": 1, + "filePath": "index_split_044.html" + }, + { + "chapterNumber": 46, + "chapterTitle": "Index Split 045", + "characters": 55, + "tokens": 68, + "footnotesCount": 1, + "filePath": "index_split_045.html" + }, + { + "chapterNumber": 47, + "chapterTitle": "Index Split 046", + "characters": 170, + "tokens": 160, + "footnotesCount": 1, + "filePath": "index_split_046.html" + }, + { + "chapterNumber": 48, + "chapterTitle": "Index Split 047", + "characters": 143, + "tokens": 138, + "footnotesCount": 1, + "filePath": "index_split_047.html" + }, + { + "chapterNumber": 49, + "chapterTitle": "Index Split 048", + "characters": 149, + "tokens": 142, + "footnotesCount": 1, + "filePath": "index_split_048.html" + }, + { + "chapterNumber": 50, + "chapterTitle": "Index Split 049", + "characters": 116, + "tokens": 116, + "footnotesCount": 1, + "filePath": "index_split_049.html" + }, + { + "chapterNumber": 51, + "chapterTitle": "Index Split 050", + "characters": 137, + "tokens": 132, + "footnotesCount": 1, + "filePath": "index_split_050.html" + }, + { + "chapterNumber": 52, + "chapterTitle": "Index Split 051", + "characters": 136, + "tokens": 132, + "footnotesCount": 1, + "filePath": "index_split_051.html" + }, + { + "chapterNumber": 53, + "chapterTitle": "Index Split 052", + "characters": 118, + "tokens": 118, + "footnotesCount": 1, + "filePath": "index_split_052.html" + }, + { + "chapterNumber": 54, + "chapterTitle": "Index Split 053", + "characters": 87, + "tokens": 92, + "footnotesCount": 1, + "filePath": "index_split_053.html" + }, + { + "chapterNumber": 55, + "chapterTitle": "Index Split 054", + "characters": 78, + "tokens": 86, + "footnotesCount": 1, + "filePath": "index_split_054.html" + }, + { + "chapterNumber": 56, + "chapterTitle": "Index Split 055", + "characters": 127, + "tokens": 124, + "footnotesCount": 1, + "filePath": "index_split_055.html" + }, + { + "chapterNumber": 57, + "chapterTitle": "Index Split 056", + "characters": 189, + "tokens": 174, + "footnotesCount": 1, + "filePath": "index_split_056.html" + }, + { + "chapterNumber": 58, + "chapterTitle": "Index Split 057", + "characters": 72, + "tokens": 80, + "footnotesCount": 1, + "filePath": "index_split_057.html" + }, + { + "chapterNumber": 59, + "chapterTitle": "Index Split 058", + "characters": 415, + "tokens": 356, + "footnotesCount": 1, + "filePath": "index_split_058.html" + }, + { + "chapterNumber": 60, + "chapterTitle": "Index Split 059", + "characters": 182, + "tokens": 168, + "footnotesCount": 1, + "filePath": "index_split_059.html" + }, + { + "chapterNumber": 61, + "chapterTitle": "Index Split 060", + "characters": 195, + "tokens": 180, + "footnotesCount": 1, + "filePath": "index_split_060.html" + }, + { + "chapterNumber": 62, + "chapterTitle": "Index Split 061", + "characters": 264, + "tokens": 234, + "footnotesCount": 1, + "filePath": "index_split_061.html" + }, + { + "chapterNumber": 63, + "chapterTitle": "Index Split 062", + "characters": 207, + "tokens": 188, + "footnotesCount": 1, + "filePath": "index_split_062.html" + }, + { + "chapterNumber": 64, + "chapterTitle": "Index Split 063", + "characters": 235, + "tokens": 212, + "footnotesCount": 1, + "filePath": "index_split_063.html" + }, + { + "chapterNumber": 65, + "chapterTitle": "Index Split 064", + "characters": 266, + "tokens": 236, + "footnotesCount": 1, + "filePath": "index_split_064.html" + }, + { + "chapterNumber": 66, + "chapterTitle": "Index Split 065", + "characters": 80, + "tokens": 88, + "footnotesCount": 1, + "filePath": "index_split_065.html" + }, + { + "chapterNumber": 67, + "chapterTitle": "Index Split 066", + "characters": 137, + "tokens": 132, + "footnotesCount": 1, + "filePath": "index_split_066.html" + }, + { + "chapterNumber": 68, + "chapterTitle": "Index Split 067", + "characters": 103, + "tokens": 106, + "footnotesCount": 1, + "filePath": "index_split_067.html" + }, + { + "chapterNumber": 69, + "chapterTitle": "Index Split 068", + "characters": 91, + "tokens": 96, + "footnotesCount": 1, + "filePath": "index_split_068.html" + }, + { + "chapterNumber": 70, + "chapterTitle": "Index Split 069", + "characters": 168, + "tokens": 158, + "footnotesCount": 1, + "filePath": "index_split_069.html" + }, + { + "chapterNumber": 71, + "chapterTitle": "Index Split 070", + "characters": 155, + "tokens": 148, + "footnotesCount": 1, + "filePath": "index_split_070.html" + } + ] +} \ No newline at end of file diff --git a/books/statistics/Шесть гениев команды_statistics.json b/books/statistics/Шесть гениев команды_statistics.json new file mode 100644 index 0000000..960befb --- /dev/null +++ b/books/statistics/Шесть гениев команды_statistics.json @@ -0,0 +1,547 @@ +{ + "book": { + "title": "Шесть гениев команды", + "author": "Патрик Ленсиони", + "totalChapters": 67, + "totalCharacters": 211676, + "totalTokens": 86019 + }, + "chapters": [ + { + "chapterNumber": 1, + "chapterTitle": "A BETTER WAY TO UNDERSTAND YOUR GIFTS, YOUR FRUSTRATIONS, AND YOUR TEAM", + "characters": 60, + "tokens": 66, + "footnotesCount": 0, + "filePath": "t1.xhtml" + }, + { + "chapterNumber": 2, + "chapterTitle": "КАК СПОСОБНОСТИ КАЖДОГО УСИЛИВАЮТ ОБЩИЙ РЕЗУЛЬТАТ", + "characters": 37, + "tokens": 47, + "footnotesCount": 0, + "filePath": "t2.xhtml" + }, + { + "chapterNumber": 3, + "chapterTitle": "Информацияот издательства", + "characters": 1250, + "tokens": 525, + "footnotesCount": 0, + "filePath": "inf.xhtml" + }, + { + "chapterNumber": 4, + "chapterTitle": "Posv", + "characters": 115, + "tokens": 63, + "footnotesCount": 0, + "filePath": "posv.xhtml" + }, + { + "chapterNumber": 5, + "chapterTitle": "ВВЕДЕНИЕ", + "characters": 2935, + "tokens": 1191, + "footnotesCount": 0, + "filePath": "vv.xhtml" + }, + { + "chapterNumber": 6, + "chapterTitle": "ПРИТЧА", + "characters": 0, + "tokens": 16, + "footnotesCount": 0, + "filePath": "C1.xhtml" + }, + { + "chapterNumber": 7, + "chapterTitle": "J. O. B.", + "characters": 1179, + "tokens": 488, + "footnotesCount": 0, + "filePath": "g1.xhtml" + }, + { + "chapterNumber": 8, + "chapterTitle": "РАБОТА", + "characters": 1411, + "tokens": 580, + "footnotesCount": 0, + "filePath": "g2.xhtml" + }, + { + "chapterNumber": 9, + "chapterTitle": "ГАЗОНОКОСИЛЬЩИК", + "characters": 1272, + "tokens": 528, + "footnotesCount": 0, + "filePath": "g3.xhtml" + }, + { + "chapterNumber": 10, + "chapterTitle": "G4", + "characters": 2683, + "tokens": 1087, + "footnotesCount": 0, + "filePath": "g4.xhtml" + }, + { + "chapterNumber": 11, + "chapterTitle": "НЕОПРЕДЕЛЕННОСТЬ", + "characters": 2164, + "tokens": 885, + "footnotesCount": 0, + "filePath": "g5.xhtml" + }, + { + "chapterNumber": 12, + "chapterTitle": "НОВЫЙ ФАЛЬСТАРТ", + "characters": 1124, + "tokens": 469, + "footnotesCount": 0, + "filePath": "g6.xhtml" + }, + { + "chapterNumber": 13, + "chapterTitle": "ВОСКРЕСНАЯ ТОСКА", + "characters": 979, + "tokens": 411, + "footnotesCount": 0, + "filePath": "g7.xhtml" + }, + { + "chapterNumber": 14, + "chapterTitle": "ОТЧАЯНИЕ", + "characters": 2123, + "tokens": 866, + "footnotesCount": 0, + "filePath": "g8.xhtml" + }, + { + "chapterNumber": 15, + "chapterTitle": "БЛАЖЕННОЕ НЕВЕДЕНИЕ", + "characters": 2080, + "tokens": 853, + "footnotesCount": 0, + "filePath": "g9.xhtml" + }, + { + "chapterNumber": 16, + "chapterTitle": "МОНТАЖ", + "characters": 770, + "tokens": 325, + "footnotesCount": 1, + "filePath": "g10.xhtml" + }, + { + "chapterNumber": 17, + "chapterTitle": "ПОЗДРАВЛЯЕМ, У ВАС ВСЕ ПЛОХО", + "characters": 5390, + "tokens": 2182, + "footnotesCount": 0, + "filePath": "g11.xhtml" + }, + { + "chapterNumber": 18, + "chapterTitle": "РЕКРУТЕР", + "characters": 1212, + "tokens": 502, + "footnotesCount": 0, + "filePath": "g12.xhtml" + }, + { + "chapterNumber": 19, + "chapterTitle": "МОНТАЖ-2", + "characters": 1125, + "tokens": 468, + "footnotesCount": 0, + "filePath": "g13.xhtml" + }, + { + "chapterNumber": 20, + "chapterTitle": "СЛИЯНИЕ", + "characters": 2243, + "tokens": 914, + "footnotesCount": 0, + "filePath": "g14.xhtml" + }, + { + "chapterNumber": 21, + "chapterTitle": "ПРИЗНАНИЕ", + "characters": 3666, + "tokens": 1484, + "footnotesCount": 0, + "filePath": "g15.xhtml" + }, + { + "chapterNumber": 22, + "chapterTitle": "ПЕРЕДЫШКА", + "characters": 4276, + "tokens": 1728, + "footnotesCount": 0, + "filePath": "g16.xhtml" + }, + { + "chapterNumber": 23, + "chapterTitle": "СВАРЛИВОСТЬ", + "characters": 1678, + "tokens": 690, + "footnotesCount": 0, + "filePath": "g17.xhtml" + }, + { + "chapterNumber": 24, + "chapterTitle": "ВОПРОС", + "characters": 3722, + "tokens": 1505, + "footnotesCount": 0, + "filePath": "g18.xhtml" + }, + { + "chapterNumber": 25, + "chapterTitle": "В ТУМАНЕ", + "characters": 3012, + "tokens": 1222, + "footnotesCount": 0, + "filePath": "g19.xhtml" + }, + { + "chapterNumber": 26, + "chapterTitle": "ДОПРОС С ПРИСТРАСТИЕМ", + "characters": 1718, + "tokens": 710, + "footnotesCount": 0, + "filePath": "g20.xhtml" + }, + { + "chapterNumber": 27, + "chapterTitle": "ФРАГМЕНТАРНО", + "characters": 3117, + "tokens": 1265, + "footnotesCount": 0, + "filePath": "g21.xhtml" + }, + { + "chapterNumber": 28, + "chapterTitle": "ВЕСЬ АССОРТИМЕНТ", + "characters": 4278, + "tokens": 1732, + "footnotesCount": 0, + "filePath": "g22.xhtml" + }, + { + "chapterNumber": 29, + "chapterTitle": "УТОЧНЕНИЕ", + "characters": 2313, + "tokens": 943, + "footnotesCount": 0, + "filePath": "g23.xhtml" + }, + { + "chapterNumber": 30, + "chapterTitle": "ПРОРЫВ", + "characters": 3125, + "tokens": 1267, + "footnotesCount": 0, + "filePath": "g24.xhtml" + }, + { + "chapterNumber": 31, + "chapterTitle": "ТРИГГЕР", + "characters": 2243, + "tokens": 914, + "footnotesCount": 0, + "filePath": "g25.xhtml" + }, + { + "chapterNumber": 32, + "chapterTitle": "ПОДГОНЯЛЬЩИК", + "characters": 2231, + "tokens": 911, + "footnotesCount": 0, + "filePath": "g26.xhtml" + }, + { + "chapterNumber": 33, + "chapterTitle": "СПЕЦИФИКА", + "characters": 1759, + "tokens": 721, + "footnotesCount": 0, + "filePath": "g27.xhtml" + }, + { + "chapterNumber": 34, + "chapterTitle": "ПОРЯДОК ВЕЩЕЙ", + "characters": 9282, + "tokens": 3732, + "footnotesCount": 0, + "filePath": "g28.xhtml" + }, + { + "chapterNumber": 35, + "chapterTitle": "ПОДВОДИМ ИТОГИ", + "characters": 2178, + "tokens": 891, + "footnotesCount": 0, + "filePath": "g29.xhtml" + }, + { + "chapterNumber": 36, + "chapterTitle": "ВЫСТУПЛЕНИЕ НА БИС", + "characters": 4278, + "tokens": 1733, + "footnotesCount": 0, + "filePath": "g30.xhtml" + }, + { + "chapterNumber": 37, + "chapterTitle": "НА УСКОРЕННОЙ ПЕРЕМОТКЕ", + "characters": 6982, + "tokens": 2816, + "footnotesCount": 0, + "filePath": "g31.xhtml" + }, + { + "chapterNumber": 38, + "chapterTitle": "КОНТЕКСТ", + "characters": 5648, + "tokens": 2277, + "footnotesCount": 0, + "filePath": "g32.xhtml" + }, + { + "chapterNumber": 39, + "chapterTitle": "ИСТИНА ГДЕ-ТО РЯДОМ", + "characters": 5244, + "tokens": 2119, + "footnotesCount": 0, + "filePath": "g33.xhtml" + }, + { + "chapterNumber": 40, + "chapterTitle": "ВНЕДРЕНИЕ В ЖИЗНЬ", + "characters": 4438, + "tokens": 1796, + "footnotesCount": 0, + "filePath": "g34.xhtml" + }, + { + "chapterNumber": 41, + "chapterTitle": "КОМИТЕТ", + "characters": 5893, + "tokens": 2374, + "footnotesCount": 0, + "filePath": "g35.xhtml" + }, + { + "chapterNumber": 42, + "chapterTitle": "ЦЕРКОВНЫЕ ГЕНИИ", + "characters": 4898, + "tokens": 1980, + "footnotesCount": 0, + "filePath": "g36.xhtml" + }, + { + "chapterNumber": 43, + "chapterTitle": "РЕАЛЬНОСТЬ", + "characters": 3544, + "tokens": 1436, + "footnotesCount": 0, + "filePath": "g37.xhtml" + }, + { + "chapterNumber": 44, + "chapterTitle": "ДОПРОС", + "characters": 1775, + "tokens": 727, + "footnotesCount": 0, + "filePath": "g38.xhtml" + }, + { + "chapterNumber": 45, + "chapterTitle": "ВИРУСНЫЙ ОХВАТ", + "characters": 1574, + "tokens": 649, + "footnotesCount": 0, + "filePath": "g39.xhtml" + }, + { + "chapterNumber": 46, + "chapterTitle": "СПАСЕНИЕ", + "characters": 5584, + "tokens": 2251, + "footnotesCount": 0, + "filePath": "g40.xhtml" + }, + { + "chapterNumber": 47, + "chapterTitle": "ДИАГНОЗ", + "characters": 5379, + "tokens": 2168, + "footnotesCount": 0, + "filePath": "g41.xhtml" + }, + { + "chapterNumber": 48, + "chapterTitle": "ПРОВЕРКА НА ДЕЛЕ", + "characters": 1641, + "tokens": 677, + "footnotesCount": 0, + "filePath": "g42.xhtml" + }, + { + "chapterNumber": 49, + "chapterTitle": "ВСТРЕЧА С КЛИЕНТАМИ", + "characters": 7038, + "tokens": 2837, + "footnotesCount": 0, + "filePath": "g43.xhtml" + }, + { + "chapterNumber": 50, + "chapterTitle": "ЭНТУЗИАЗМ", + "characters": 2730, + "tokens": 1110, + "footnotesCount": 0, + "filePath": "g44.xhtml" + }, + { + "chapterNumber": 51, + "chapterTitle": "ВСТРЕЧА С КОЛЛЕКТИВОМ", + "characters": 6412, + "tokens": 2587, + "footnotesCount": 0, + "filePath": "g45.xhtml" + }, + { + "chapterNumber": 52, + "chapterTitle": "СКАЧОК ВПЕРЕД", + "characters": 2436, + "tokens": 994, + "footnotesCount": 0, + "filePath": "g46.xhtml" + }, + { + "chapterNumber": 53, + "chapterTitle": "ЭПИЛОГ", + "characters": 1900, + "tokens": 777, + "footnotesCount": 0, + "filePath": "g47.xhtml" + }, + { + "chapterNumber": 54, + "chapterTitle": "СХЕМА В ДЕЙСТВИИ", + "characters": 0, + "tokens": 20, + "footnotesCount": 0, + "filePath": "C2.xhtml" + }, + { + "chapterNumber": 55, + "chapterTitle": "ЧТО ТАКОЕ РАБОТА?", + "characters": 3891, + "tokens": 1577, + "footnotesCount": 0, + "filePath": "g48.xhtml" + }, + { + "chapterNumber": 56, + "chapterTitle": "МОДЕЛЬ И ТИПИРОВАНИЕ", + "characters": 13271, + "tokens": 5331, + "footnotesCount": 0, + "filePath": "g49.xhtml" + }, + { + "chapterNumber": 57, + "chapterTitle": "КАРТА КОМАНДНОЙ РАБОТЫ", + "characters": 23493, + "tokens": 9420, + "footnotesCount": 0, + "filePath": "g50.xhtml" + }, + { + "chapterNumber": 58, + "chapterTitle": "ТИПЫ ТАЛАНТОВ И ЗДОРОВЬЕ ОРГАНИЗАЦИИ", + "characters": 2927, + "tokens": 1199, + "footnotesCount": 0, + "filePath": "g51.xhtml" + }, + { + "chapterNumber": 59, + "chapterTitle": "МОИ НАДЕЖДЫ НА БУДУЩЕЕ", + "characters": 6765, + "tokens": 2729, + "footnotesCount": 0, + "filePath": "g52.xhtml" + }, + { + "chapterNumber": 60, + "chapterTitle": "БЛАГОДАРНОСТИ", + "characters": 1364, + "tokens": 564, + "footnotesCount": 0, + "filePath": "th.xhtml" + }, + { + "chapterNumber": 61, + "chapterTitle": "ОБ АВТОРЕ", + "characters": 1499, + "tokens": 619, + "footnotesCount": 0, + "filePath": "about.xhtml" + }, + { + "chapterNumber": 62, + "chapterTitle": "ПРИМЕЧАНИЯ", + "characters": 49, + "tokens": 59, + "footnotesCount": 2, + "filePath": "links.xhtml" + }, + { + "chapterNumber": 63, + "chapterTitle": "Пять пороков команды", + "characters": 536, + "tokens": 236, + "footnotesCount": 0, + "filePath": "r1.xhtml" + }, + { + "chapterNumber": 64, + "chapterTitle": "Пять пороков команды", + "characters": 653, + "tokens": 283, + "footnotesCount": 0, + "filePath": "r2.xhtml" + }, + { + "chapterNumber": 65, + "chapterTitle": "Сердце компании", + "characters": 579, + "tokens": 251, + "footnotesCount": 0, + "filePath": "r3.xhtml" + }, + { + "chapterNumber": 66, + "chapterTitle": "МИФ Бизнес", + "characters": 161, + "tokens": 83, + "footnotesCount": 0, + "filePath": "biz.xhtml" + }, + { + "chapterNumber": 67, + "chapterTitle": "НАД КНИГОЙ РАБОТАЛИ", + "characters": 344, + "tokens": 159, + "footnotesCount": 0, + "filePath": "end.xhtml" + } + ] +} \ No newline at end of file diff --git a/books/Александр_Долгов_История_настоящего_предпринимателя_2023.epub b/books/Александр_Долгов_История_настоящего_предпринимателя_2023.epub new file mode 100644 index 0000000..efeaf08 Binary files /dev/null and b/books/Александр_Долгов_История_настоящего_предпринимателя_2023.epub differ diff --git a/books/Бизнес с нуля. Метод Lean Startup.epub b/books/Бизнес с нуля. Метод Lean Startup.epub new file mode 100644 index 0000000..d709a08 Binary files /dev/null and b/books/Бизнес с нуля. Метод Lean Startup.epub differ diff --git a/books/Джим_Коллинз,_Мортен_Хансен_Великие_по_собственному_выбору_2013.epub b/books/Джим_Коллинз,_Мортен_Хансен_Великие_по_собственному_выбору_2013.epub new file mode 100644 index 0000000..d3b0896 Binary files /dev/null and b/books/Джим_Коллинз,_Мортен_Хансен_Великие_по_собственному_выбору_2013.epub differ diff --git a/books/Дэн_Роэм_Рисуй,_чтобы_победить_Проверенный_способ_руководить,_продавать.epub b/books/Дэн_Роэм_Рисуй,_чтобы_победить_Проверенный_способ_руководить,_продавать.epub new file mode 100644 index 0000000..7f151b0 Binary files /dev/null and b/books/Дэн_Роэм_Рисуй,_чтобы_победить_Проверенный_способ_руководить,_продавать.epub differ diff --git a/books/Игорь_Манн_Гроуинг_1_0_22_маркетинговых_действия_для_роста_бизнеса.epub b/books/Игорь_Манн_Гроуинг_1_0_22_маркетинговых_действия_для_роста_бизнеса.epub new file mode 100644 index 0000000..65bfc56 Binary files /dev/null and b/books/Игорь_Манн_Гроуинг_1_0_22_маркетинговых_действия_для_роста_бизнеса.epub differ diff --git a/books/Игорь_Манн_Планируй_Как_правильно_планировать_каждый_год_своей_жизни.epub b/books/Игорь_Манн_Планируй_Как_правильно_планировать_каждый_год_своей_жизни.epub new file mode 100644 index 0000000..c546c02 Binary files /dev/null and b/books/Игорь_Манн_Планируй_Как_правильно_планировать_каждый_год_своей_жизни.epub differ diff --git a/books/Каган_Вдохновленные_Все,_что_нужно_знать_продакт_менеджеру.epub b/books/Каган_Вдохновленные_Все,_что_нужно_знать_продакт_менеджеру.epub new file mode 100644 index 0000000..4bb5c31 Binary files /dev/null and b/books/Каган_Вдохновленные_Все,_что_нужно_знать_продакт_менеджеру.epub differ diff --git a/books/Как работает Google.epub b/books/Как работает Google.epub new file mode 100644 index 0000000..54e82c5 Binary files /dev/null and b/books/Как работает Google.epub differ diff --git a/books/Коллинз_Джим,_Хансен_Мортен_По_собственному_выбору_от_хорошего_к.epub b/books/Коллинз_Джим,_Хансен_Мортен_По_собственному_выбору_от_хорошего_к.epub new file mode 100644 index 0000000..9ae2a94 Binary files /dev/null and b/books/Коллинз_Джим,_Хансен_Мортен_По_собственному_выбору_от_хорошего_к.epub differ diff --git a/books/Мельников_Все_о_бизнесе_за_два_часа.epub b/books/Мельников_Все_о_бизнесе_за_два_часа.epub new file mode 100644 index 0000000..9af0769 Binary files /dev/null and b/books/Мельников_Все_о_бизнесе_за_два_часа.epub differ diff --git a/books/Симоненко. Управляя кризисом.epub b/books/Симоненко. Управляя кризисом.epub new file mode 100644 index 0000000..9c6927d Binary files /dev/null and b/books/Симоненко. Управляя кризисом.epub differ diff --git a/books/СтартUp_Настольная_книга_основателя.epub b/books/СтартUp_Настольная_книга_основателя.epub new file mode 100644 index 0000000..ff10a03 Binary files /dev/null and b/books/СтартUp_Настольная_книга_основателя.epub differ diff --git a/books/Управление_цепочками_поставок_и_логистикой_—_простыми_словами_Методы.epub b/books/Управление_цепочками_поставок_и_логистикой_—_простыми_словами_Методы.epub new file mode 100644 index 0000000..adb761a Binary files /dev/null and b/books/Управление_цепочками_поставок_и_логистикой_—_простыми_словами_Методы.epub differ diff --git a/books/Федпрук. Онлайн-бизнес.epub b/books/Федпрук. Онлайн-бизнес.epub new file mode 100644 index 0000000..3a75d66 Binary files /dev/null and b/books/Федпрук. Онлайн-бизнес.epub differ diff --git a/books/Чему_я_научился,_потеряв_миллион_долларов_Джим_Пол,_Брендан_Мойнихан.epub b/books/Чему_я_научился,_потеряв_миллион_долларов_Джим_Пол,_Брендан_Мойнихан.epub new file mode 100644 index 0000000..86daa22 Binary files /dev/null and b/books/Чему_я_научился,_потеряв_миллион_долларов_Джим_Пол,_Брендан_Мойнихан.epub differ diff --git a/books/Шевелева. На уровень выше.epub b/books/Шевелева. На уровень выше.epub new file mode 100644 index 0000000..347e3f0 Binary files /dev/null and b/books/Шевелева. На уровень выше.epub differ diff --git a/books/Шесть_гениев_команды_Патрик_Ленсиони.epub b/books/Шесть_гениев_команды_Патрик_Ленсиони.epub new file mode 100644 index 0000000..829ad51 Binary files /dev/null and b/books/Шесть_гениев_команды_Патрик_Ленсиони.epub differ diff --git a/books/Экер Думай как миллионер.epub b/books/Экер Думай как миллионер.epub new file mode 100644 index 0000000..31ee9dc Binary files /dev/null and b/books/Экер Думай как миллионер.epub differ diff --git a/create_qdrant_collection.py b/create_qdrant_collection.py new file mode 100644 index 0000000..e5caf5f --- /dev/null +++ b/create_qdrant_collection.py @@ -0,0 +1,196 @@ +#!/usr/bin/env python3 +""" +Скрипт для создания коллекции в Qdrant для хранения эмбеддингов книг. + +Структура данных основана на epub-parser/app.py: +- Каждая точка содержит эмбеддинг чанка текста +- Payload содержит метаданные книги, главы и чанка +""" +import requests +import json +from typing import Dict, Any + +# Конфигурация Qdrant +QDRANT_URL = "http://localhost:6333" +COLLECTION_NAME = "epub_books" +VECTOR_SIZE = 768 # Размерность эмбеддингов nomic-embed-text + + +def create_collection() -> Dict[str, Any]: + """Создает коллекцию в Qdrant для хранения эмбеддингов книг. + + Returns: + Ответ от Qdrant API с результатом создания коллекции. + """ + url = f"{QDRANT_URL}/collections/{COLLECTION_NAME}" + + payload = { + "vectors": { + "size": VECTOR_SIZE, + "distance": "Cosine" # Косинусное расстояние для семантического поиска + }, + "optimizers_config": { + "default_segment_number": 2 + }, + "replication_factor": 1, + "write_consistency_factor": 1 + } + + response = requests.put(url, json=payload) + response.raise_for_status() + return response.json() + + +def create_payload_indexes() -> Dict[str, Any]: + """Создает индексы для полей payload для быстрого поиска. + + Returns: + Список ответов от Qdrant API. + """ + results = [] + + # Индексы для фильтрации и поиска + indexes = [ + { + "field_name": "bookId", + "field_schema": "keyword" + }, + { + "field_name": "title", + "field_schema": "keyword" + }, + { + "field_name": "author", + "field_schema": "keyword" + }, + { + "field_name": "chapterNumber", + "field_schema": "integer" + }, + { + "field_name": "chapterTitle", + "field_schema": "text" + }, + { + "field_name": "chapterId", + "field_schema": "keyword" + }, + { + "field_name": "chunkIndex", + "field_schema": "integer" + } + ] + + for index in indexes: + url = f"{QDRANT_URL}/collections/{COLLECTION_NAME}/index" + payload = { + "field_name": index["field_name"], + "field_schema": { + "type": index["field_schema"] + } + } + try: + response = requests.post(url, json=payload) + response.raise_for_status() + results.append({ + "field": index["field_name"], + "status": "created", + "response": response.json() + }) + except requests.exceptions.HTTPError as e: + if e.response.status_code == 400: + # Индекс уже существует + results.append({ + "field": index["field_name"], + "status": "already_exists" + }) + else: + raise + + return results + + +def check_collection_exists() -> bool: + """Проверяет, существует ли коллекция. + + Returns: + True если коллекция существует, False иначе. + """ + url = f"{QDRANT_URL}/collections/{COLLECTION_NAME}" + try: + response = requests.get(url) + return response.status_code == 200 + except: + return False + + +def get_collection_info() -> Dict[str, Any]: + """Получает информацию о коллекции. + + Returns: + Информация о коллекции от Qdrant API. + """ + url = f"{QDRANT_URL}/collections/{COLLECTION_NAME}" + response = requests.get(url) + response.raise_for_status() + return response.json() + + +def main(): + """Основная функция для создания коллекции и индексов.""" + print(f"Создание коллекции '{COLLECTION_NAME}' в Qdrant...") + print(f"URL: {QDRANT_URL}") + print(f"Размерность векторов: {VECTOR_SIZE}") + print() + + # Проверяем, существует ли коллекция + if check_collection_exists(): + print(f"⚠️ Коллекция '{COLLECTION_NAME}' уже существует.") + response = input("Удалить и создать заново? (y/n): ") + if response.lower() == 'y': + url = f"{QDRANT_URL}/collections/{COLLECTION_NAME}" + requests.delete(url) + print("✅ Коллекция удалена.") + else: + print("Используем существующую коллекцию.") + info = get_collection_info() + print(json.dumps(info, indent=2, ensure_ascii=False)) + return + + # Создаем коллекцию + try: + result = create_collection() + print("✅ Коллекция успешно создана!") + print(json.dumps(result, indent=2, ensure_ascii=False)) + print() + + # Создаем индексы + print("Создание индексов для payload...") + index_results = create_payload_indexes() + for idx_result in index_results: + status = idx_result.get("status", "unknown") + field = idx_result.get("field", "unknown") + if status == "created": + print(f" ✅ Индекс для '{field}' создан") + elif status == "already_exists": + print(f" ⚠️ Индекс для '{field}' уже существует") + print() + + # Получаем информацию о коллекции + print("Информация о коллекции:") + info = get_collection_info() + print(json.dumps(info, indent=2, ensure_ascii=False)) + + except requests.exceptions.ConnectionError: + print("❌ Ошибка: Не удалось подключиться к Qdrant.") + print(f" Убедитесь, что Qdrant запущен на {QDRANT_URL}") + except requests.exceptions.HTTPError as e: + print(f"❌ Ошибка HTTP: {e}") + if e.response.text: + print(f" Ответ сервера: {e.response.text}") + except Exception as e: + print(f"❌ Неожиданная ошибка: {e}") + + +if __name__ == "__main__": + main() diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..ea1d9b6 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,114 @@ +services: + redis: + image: redis:7-alpine + container_name: redis + restart: unless-stopped + ports: + - "6379:6379" + volumes: + - redis_data:/data + command: redis-server --appendonly yes + networks: + - app-network + healthcheck: + test: ["CMD", "redis-cli", "ping"] + interval: 10s + timeout: 5s + retries: 5 + + qdrant: + image: qdrant/qdrant:latest + container_name: qdrant + restart: unless-stopped + ports: + - "6333:6333" + - "6334:6334" + volumes: + - qdrant_data:/qdrant/storage + networks: + - app-network + + qdrant-init: + image: python:3.11-alpine + container_name: qdrant-init + restart: "no" + working_dir: /app + volumes: + - ./qdrant_init/entrypoint.py:/app/entrypoint.py + command: ["python", "-u", "/app/entrypoint.py"] + depends_on: + - qdrant + environment: + - QDRANT_URL=http://qdrant:6333 + - QDRANT_COLLECTION_CHAPTER_ANALYSES=chapter_analyses + - QDRANT_VECTOR_SIZE=1024 + - QDRANT_INIT_DELAY=15 + networks: + - app-network + + ollama: + image: ollama/ollama:latest + container_name: ollama + restart: unless-stopped + ports: + - "11434:11434" + volumes: + - ollama_data:/root/.ollama + networks: + - app-network + environment: + - OLLAMA_HOST=0.0.0.0:11434 + # Контекст для qwen3:14b (анализ глав). Рекомендация ARCHITECTURE: 12000–13000. + - OLLAMA_NUM_CTX=12000 + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:11434/api/tags"] + interval: 30s + timeout: 10s + retries: 3 + + epub-parser: + build: + context: ./epub-parser + dockerfile: Dockerfile + container_name: epub-parser + restart: unless-stopped + ports: + - "5001:5000" + networks: + - app-network + healthcheck: + test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:5000/health')"] + interval: 10s + timeout: 5s + retries: 5 + postgres: + image: postgres:15-alpine + container_name: postgres + restart: unless-stopped + ports: + - "5432:5432" + environment: + - POSTGRES_USER=n8n + - POSTGRES_PASSWORD=n8n_password + - POSTGRES_DB=n8n + volumes: + - postgres_data:/var/lib/postgresql/data + - ./8_сохранение_postgres/schema.sql:/docker-entrypoint-initdb.d/01-schema.sql:ro + networks: + - app-network + healthcheck: + test: ["CMD-SHELL", "pg_isready -U n8n"] + interval: 10s + timeout: 5s + retries: 5 + +volumes: + redis_data: + qdrant_data: + ollama_data: + n8n_data: + postgres_data: + +networks: + app-network: + driver: bridge diff --git a/docs/cpu-time-estimate.md b/docs/cpu-time-estimate.md new file mode 100644 index 0000000..b81e595 --- /dev/null +++ b/docs/cpu-time-estimate.md @@ -0,0 +1,51 @@ +# Оценка времени пайплайна на CPU (Ollama, qwen3:14b) + +Оценка основана на архитектуре (этапы 1–4 — вызовы LLM) и замере: **один блок framework на CPU ≈ 15+ минут** (до ответа или до 500). + +## Время на GPU (из ARCHITECTURE_SUMMARY) + +| Этап | Вызовы | Время на GPU | +|------|--------|----------------| +| 1. Анализ по блокам | 4 (framework, insights, application, limitations) | ~2–5 мин на главу | +| 2. Валидация блоков | 4 | ~30 сек на блок → ~2 мин | +| 2b. Финальная валидация | 1 | ~30–60 сек | +| 3. Извлечение тегов | 1 | ~1–2 мин | +| 4. Валидация тегов | 1 | ~20–30 сек | +| 6. Эмбеддинги (bge-m3) | 1 | ~5–15 сек | +| **Итого на главу (GPU)** | | **~6–11 мин** | + +## Коэффициент замедления CPU vs GPU + +- **«Тяжёлые» вызовы** (длинный контекст: глава + промпт): на GPU ~0.5–1.5 мин, на CPU по замеру **≥15 мин** → ориентир **15–25 мин** на один такой вызов на CPU. +- **«Лёгкие» вызовы** (валидация, короткий контекст): на GPU ~30 сек, на CPU грубо **3–6 мин** (в 6–10 раз дольше). + +Используем для расчёта: +- тяжёлый вызов (этапы 1 и 3): **20 мин** на CPU; +- лёгкий вызов (этапы 2, 2b, 4): **4 мин** на CPU; +- эмбеддинги (bge-m3): **1 мин** на CPU. + +## Время на одну главу (CPU) + +| Этап | Кол-во вызовов | Тип | Время (CPU) | +|------|-----------------|-----|-------------| +| 1. Анализ по блокам | 4 | тяжёлый | 4 × 20 = **80 мин** | +| 2. Валидация блоков | 4 | лёгкий | 4 × 4 = **16 мин** | +| 2b. Финальная валидация | 1 | лёгкий | **4 мин** | +| 3. Извлечение тегов | 1 | тяжёлый | **20 мин** | +| 4. Валидация тегов | 1 | лёгкий | **4 мин** | +| 5. Мерж | — | без LLM | < 1 мин | +| 6. Эмбеддинги | 1 | bge-m3 | **1 мин** | +| 7–8. Qdrant, Postgres | — | без LLM | < 1 мин | +| **Итого на одну главу** | | | **≈ 126 мин ≈ 2 ч 6 мин** | + +Укрупнённо: **~2–2.5 часа на одну главу** на CPU (с запасом на retry и вариативность). + +## Время на книгу (CPU) + +| Глав в книге | Оценка времени (CPU) | +|--------------|----------------------| +| 10 | ~20–25 ч | +| 20 | ~40–50 ч | +| 30 | ~60–75 ч | + +Итого: **полная книга на CPU может занимать десятки часов**; один запуск на всю книгу без GPU обычно неудобен (дни работы, риск обрыва). Имеет смысл либо ставить GPU/Apple Silicon, либо гонять по одной главе и планировать долгие прогоны. diff --git a/docs/ollama-models.md b/docs/ollama-models.md new file mode 100644 index 0000000..95a9fe3 --- /dev/null +++ b/docs/ollama-models.md @@ -0,0 +1,57 @@ +# Модели Ollama для пайплайна + +Используются две модели: + +| Назначение | Модель в Ollama | Команда pull | Примечание | +|------------|-----------------|--------------|------------| +| LLM: анализ и валидация (шаги 1–4) | `qwen3:14b` | `ollama pull qwen3:14b` | ~9.3 GB (Q4_K_M). Ближе к 8bit: `qwen3:14b-q8_0` (~16 GB). | +| Эмбеддинги (шаг 6) | `bge-m3` | `ollama pull bge-m3` | ~1.2 GB, размерность 1024, контекст 8192. | + +## Загрузка моделей при работе через Docker + +1. Запустите контейнер Ollama: + + ```bash + docker compose up -d ollama + ``` + +2. Дождитесь готовности (healthcheck), затем загрузите модели **внутри контейнера**: + + ```bash + # LLM для анализа глав и валидации + docker exec -it ollama ollama pull qwen3:14b + + # Модель эмбеддингов + docker exec -it ollama ollama pull bge-m3 + ``` + +3. Проверка списка моделей: + + ```bash + docker exec ollama ollama list + ``` + + или через API: + + ```bash + curl http://localhost:11434/api/tags + ``` + +## Варианты LLM + +- **qwen3:14b** — по умолчанию, меньше по размеру (~9.3 GB). +- **qwen3:14b-q8_0** — выше качество, ближе к «8bit» из архитектуры (~16 GB). + +В коде пайплайна имя модели задаётся конфигом (например, `OLLAMA_LLM_MODEL=qwen3:14b`). + +## Локальный Ollama (без Docker) + +Если Ollama установлен локально: + +```bash +ollama pull qwen3:14b +ollama pull bge-m3 +ollama list +``` + +В `docker-compose` сервис `ollama` тогда можно не поднимать; скрипты должны обращаться к `http://localhost:11434`. diff --git a/epub-parser/Dockerfile b/epub-parser/Dockerfile new file mode 100644 index 0000000..de34e33 --- /dev/null +++ b/epub-parser/Dockerfile @@ -0,0 +1,13 @@ +FROM python:3.11-slim + +WORKDIR /app + +COPY requirements.txt . +RUN pip install --no-cache-dir -r requirements.txt + +COPY app.py . + +EXPOSE 5000 + +# Запуск FastAPI через uvicorn (ASGI сервер) +CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "5000"] diff --git a/epub-parser/__pycache__/app.cpython-311.pyc b/epub-parser/__pycache__/app.cpython-311.pyc new file mode 100644 index 0000000..b44f846 Binary files /dev/null and b/epub-parser/__pycache__/app.cpython-311.pyc differ diff --git a/epub-parser/__pycache__/app.cpython-313.pyc b/epub-parser/__pycache__/app.cpython-313.pyc new file mode 100644 index 0000000..7044094 Binary files /dev/null and b/epub-parser/__pycache__/app.cpython-313.pyc differ diff --git a/epub-parser/__pycache__/statistics.cpython-313.pyc b/epub-parser/__pycache__/statistics.cpython-313.pyc new file mode 100644 index 0000000..afaca1a Binary files /dev/null and b/epub-parser/__pycache__/statistics.cpython-313.pyc differ diff --git a/epub-parser/app.py b/epub-parser/app.py new file mode 100644 index 0000000..4d860d5 --- /dev/null +++ b/epub-parser/app.py @@ -0,0 +1,1063 @@ +#!/usr/bin/env python3 +""" +Сервис для парсинга EPUB файлов с извлечением глав и их названий +""" +from fastapi import FastAPI, File, UploadFile, Form, HTTPException, Request +from fastapi.responses import JSONResponse +from fastapi.middleware.cors import CORSMiddleware +import ebooklib +from ebooklib import epub +from bs4 import BeautifulSoup +import io +import os +import tempfile +import base64 +import re +import logging +import chardet +from datetime import datetime +from typing import List, Dict, Optional, Tuple, Union, Any +from pydantic import BaseModel + +# Настройка логирования +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + +# Импорт для подсчета токенов +try: + import tiktoken + TIKTOKEN_AVAILABLE = True +except ImportError: + TIKTOKEN_AVAILABLE = False + logger.warning("tiktoken не установлен, будет использован приблизительный расчет токенов") + +# Константы для магических чисел +# Длины текста +MIN_TEXT_LENGTH_FOR_TITLE_EXTRACTION: int = 10 +TITLE_SEARCH_PREFIX_LENGTH: int = 500 +MIN_TITLE_LENGTH: int = 5 +MAX_TITLE_LENGTH_SHORT: int = 100 +MAX_TITLE_LENGTH_MEDIUM: int = 150 +MAX_TITLE_LENGTH_LONG: int = 200 +MIN_TITLE_LENGTH_STRICT: int = 3 + +# Длины для оценки заголовков +IDEAL_TITLE_LENGTH_MIN: int = 20 +IDEAL_TITLE_LENGTH_MAX: int = 100 +GOOD_TITLE_LENGTH_MIN: int = 10 +GOOD_TITLE_LENGTH_MAX: int = 150 +ACCEPTABLE_TITLE_LENGTH_MIN: int = 5 +ACCEPTABLE_TITLE_LENGTH_MAX: int = 200 +INFORMATIVE_TITLE_LENGTH: int = 30 +MIN_TITLE_LENGTH_FOR_PENALTY: int = 10 + +# Оценки заголовков +MIN_HEADING_SCORE_THRESHOLD: float = 40.0 +MIN_H2_SCORE_THRESHOLD: float = 30.0 +SCORE_LENGTH_IDEAL: float = 30.0 +SCORE_LENGTH_GOOD: float = 20.0 +SCORE_LENGTH_ACCEPTABLE: float = 10.0 +SCORE_H1: float = 25.0 +SCORE_H2: float = 20.0 +SCORE_H3: float = 15.0 +SCORE_H4: float = 10.0 +SCORE_H5_PLUS: float = 5.0 +SCORE_POSITION_FIRST: float = 20.0 +SCORE_POSITION_SECOND: float = 15.0 +SCORE_POSITION_THIRD: float = 10.0 +SCORE_POSITION_TOP5: float = 5.0 +SCORE_QUESTION_MARK: float = 15.0 +SCORE_LONG_TITLE: float = 10.0 +SCORE_CHAPTER_CLASS: float = 10.0 +SCORE_NOT_IN_TOC_PENALTY: float = -5.0 +SCORE_SHORT_TITLE_PENALTY: float = -10.0 +SCORE_GENERIC_TITLE_PENALTY: float = -5.0 + +# Кодировка +MIN_ENCODING_CONFIDENCE: float = 0.7 + +# Сноски +MAX_FOOTNOTE_LENGTH: int = 500 +FOOTNOTE_COMPARISON_LENGTH: int = 100 + +# Файлы +MIN_BINARY_FILE_SIZE: int = 100 +EPUB_SIGNATURE: bytes = b'PK' + +# Позиции заголовков +MAX_POSITION_FOR_BONUS: int = 5 + +app = FastAPI(title="EPUB Parser API", version="1.0.0") + +# Добавляем CORS middleware +app.add_middleware( + CORSMiddleware, + allow_origins=["*"], + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], +) + + +def clean_text_for_vectorization(text: str) -> str: + """Очищает текст от символов, которые могут мешать векторизации. + + Args: + text: Исходный текст для очистки. + + Returns: + Очищенный текст без проблемных символов. + """ + if not text: + return text + + # Удаляем HTML теги (более тщательно) + text = re.sub(r'<[^>]+>', '', text) + + # Удаляем soft hyphens и другие проблемные символы + # \xad - soft hyphen (мягкий перенос) + # \u200b-\u200f - zero-width spaces + # \ufeff - BOM + # \u0600-\u0605 - арабские символы форматирования + problematic_chars = [ + '\xad', # Soft hyphen + '\ufeff', # BOM + '\u200b', # Zero-width space + '\u200c', # Zero-width non-joiner + '\u200d', # Zero-width joiner + '\u200e', # Left-to-right mark + '\u200f', # Right-to-left mark + '\u2060', # Word joiner + '\u2028', # Line separator + '\u2029', # Paragraph separator + ] + + for char in problematic_chars: + text = text.replace(char, '') + + # Удаляем другие непечатаемые символы (кроме пробелов, табуляции, переносов) + cleaned = [] + for char in text: + if char.isprintable() or char in ['\n', '\r', '\t', ' ']: + cleaned.append(char) + # Заменяем непечатаемые символы на пробел + elif ord(char) < 32: + continue # Пропускаем контрольные символы + else: + # Для других непечатаемых символов проверяем, не являются ли они проблемными + code = ord(char) + if 0x0600 <= code <= 0x0605: # Арабские символы форматирования + continue + elif 0x2000 <= code <= 0x200F: # Различные пробелы + cleaned.append(' ') + elif 0x2028 <= code <= 0x202F: # Разделители строк/параграфов + cleaned.append(' ') + else: + # Оставляем остальные символы (могут быть валидными Unicode) + cleaned.append(char) + + text = ''.join(cleaned) + + # Нормализуем пробелы (множественные пробелы -> один) + text = re.sub(r' +', ' ', text) + + # Нормализуем переносы строк (множественные -> один) + text = re.sub(r'\n{3,}', '\n\n', text) + + # Удаляем пробелы в начале и конце строк + lines = [line.strip() for line in text.split('\n')] + text = '\n'.join(line for line in lines if line) + + return text.strip() + + +def count_tokens(text: str, model: str = "gpt-4") -> int: + """Подсчитывает количество токенов в тексте для указанной модели ИИ. + + Использует tiktoken для точного подсчета токенов OpenAI моделей. + Если tiktoken недоступен, использует приблизительный расчет: + 1 токен ≈ 4 символа для английского текста + 1 токен ≈ 1.5 символа для русского текста (среднее значение) + + Args: + text: Текст для подсчета токенов. + model: Название модели ИИ (по умолчанию "gpt-4"). + + Returns: + Количество токенов в тексте. + """ + if not text: + return 0 + + if TIKTOKEN_AVAILABLE: + try: + # Используем кодировку для указанной модели + # Для gpt-4 и gpt-3.5-turbo используется cl100k_base + encoding = tiktoken.encoding_for_model(model) + return len(encoding.encode(text)) + except Exception as e: + logger.warning(f"Ошибка при подсчете токенов через tiktoken: {e}, используем приблизительный расчет") + + # Приблизительный расчет: учитываем смешанный текст (русский + английский) + # Для русского текста: ~1.5 символа на токен + # Для английского текста: ~4 символа на токен + # Используем среднее значение ~2.5 символа на токен + return int(len(text) / 2.5) + + +def calculate_chapter_tokens(chapter_data: Dict[str, Any]) -> int: + """Подсчитывает общее количество токенов для главы со всеми метаданными. + + Учитывает: + - Текст главы + - Название главы + - Текст всех сносок + - Метаданные (chapterId, chapterNumber, filePath) + + Args: + chapter_data: Словарь с данными главы. + + Returns: + Общее количество токенов для главы. + """ + total_tokens = 0 + + # Текст главы + chapter_text = chapter_data.get('text', '') + if chapter_text: + total_tokens += count_tokens(chapter_text) + + # Название главы + chapter_title = chapter_data.get('chapterTitle', '') + if chapter_title: + total_tokens += count_tokens(chapter_title) + + # Сноски + footnotes = chapter_data.get('footnotes', []) + for footnote in footnotes: + footnote_text = footnote.get('text', '') + if footnote_text: + total_tokens += count_tokens(footnote_text) + + # Метаданные (chapterId, chapterNumber, filePath) + # Формируем строку с метаданными для подсчета + metadata_parts = [] + if chapter_data.get('chapterId'): + metadata_parts.append(f"ID: {chapter_data['chapterId']}") + if chapter_data.get('chapterNumber'): + metadata_parts.append(f"Номер: {chapter_data['chapterNumber']}") + if chapter_data.get('filePath'): + metadata_parts.append(f"Файл: {chapter_data['filePath']}") + + if metadata_parts: + metadata_text = " ".join(metadata_parts) + total_tokens += count_tokens(metadata_text) + + return total_tokens + + +def clean_title(title: str) -> str: + """Очищает название главы от номеров и лишних символов. + + Args: + title: Исходное название главы. + + Returns: + Очищенное название без номеров и лишних пробелов. + """ + if not title: + return title + + # Убираем начальные номера (например, "20 Обратная сторона..." -> "Обратная сторона...") + title = title.strip() + + # Убираем номера в начале строки (1-3 цифры, возможно с точкой или пробелом) + title = re.sub(r'^\d{1,3}[.\s]+', '', title) + + # Убираем "Ch1" и подобные префиксы + title = re.sub(r'^Ch\d+\s*', '', title) + + # Убираем множественные пробелы + title = re.sub(r'\s+', ' ', title).strip() + + return title + + +def extract_title_from_text(text: str) -> Optional[str]: + """Извлекает название главы из текста, если оно там есть. + + Ищет паттерны типа "Глава N Название" в начале текста. + + Args: + text: Текст главы для анализа. + + Returns: + Название главы или None, если название не найдено. + """ + if not text or len(text) < MIN_TEXT_LENGTH_FOR_TITLE_EXTRACTION: + return None + + # Ищем паттерны типа "Глава 3 Название" в первых N символах + first_part = text[:TITLE_SEARCH_PREFIX_LENGTH].strip() + + # Паттерн: "Глава N Название" или "Глава N. Название" + patterns = [ + rf'Глава\s+\d+\s+([А-ЯЁ][^.!?]{{{MIN_TITLE_LENGTH},{MAX_TITLE_LENGTH_SHORT}}}?)(?:[.!?]|$)', + rf'Глава\s+\d+\.\s+([А-ЯЁ][^.!?]{{{MIN_TITLE_LENGTH},{MAX_TITLE_LENGTH_SHORT}}}?)(?:[.!?]|$)', + rf'Глава\s+\d+:\s+([А-ЯЁ][^.!?]{{{MIN_TITLE_LENGTH},{MAX_TITLE_LENGTH_SHORT}}}?)(?:[.!?]|$)', + rf'Глава\s+\d+\s+«([^»]{{{MIN_TITLE_LENGTH},{MAX_TITLE_LENGTH_SHORT}}}?)»', + rf'Глава\s+\d+\.\s+«([^»]{{{MIN_TITLE_LENGTH},{MAX_TITLE_LENGTH_SHORT}}}?)»', + ] + + for pattern in patterns: + match = re.search(pattern, first_part, re.IGNORECASE) + if match: + title = match.group(1).strip() + if MIN_TITLE_LENGTH <= len(title) <= MAX_TITLE_LENGTH_MEDIUM: + return clean_title(title) + + return None + + +def score_heading( + heading_text: str, + tag_name: str, + position: int, + classes: List[str] +) -> float: + """Оценивает заголовок по критериям пригодности для названия главы. + + Args: + heading_text: Текст заголовка для оценки. + tag_name: Название тега (h1-h6). + position: Позиция заголовка в документе (0 = первый). + classes: Список классов тега. + + Returns: + Оценка от 0 до 100 (чем выше, тем лучше). + """ + score = 0.0 + text_len = len(heading_text) + + # Базовые проверки - исключаем технические заголовки + if heading_text.isdigit() or heading_text.startswith('Ch') or text_len < MIN_TITLE_LENGTH: + return 0.0 + + # Длина текста (идеально 20-100 символов) + if IDEAL_TITLE_LENGTH_MIN <= text_len <= IDEAL_TITLE_LENGTH_MAX: + score += SCORE_LENGTH_IDEAL + elif GOOD_TITLE_LENGTH_MIN <= text_len <= GOOD_TITLE_LENGTH_MAX: + score += SCORE_LENGTH_GOOD + elif ACCEPTABLE_TITLE_LENGTH_MIN <= text_len <= ACCEPTABLE_TITLE_LENGTH_MAX: + score += SCORE_LENGTH_ACCEPTABLE + + # Уровень заголовка (h1 и h2 предпочтительнее) + if tag_name == 'h1': + score += SCORE_H1 + elif tag_name == 'h2': + score += SCORE_H2 + elif tag_name == 'h3': + score += SCORE_H3 + elif tag_name == 'h4': + score += SCORE_H4 + else: + score += SCORE_H5_PLUS + + # Позиция (первые заголовки предпочтительнее) + if position == 0: + score += SCORE_POSITION_FIRST + elif position == 1: + score += SCORE_POSITION_SECOND + elif position == 2: + score += SCORE_POSITION_THIRD + elif position < MAX_POSITION_FOR_BONUS: + score += SCORE_POSITION_TOP5 + + # Информативность (вопросы, длинные заголовки) + if '?' in heading_text: + score += SCORE_QUESTION_MARK + if text_len > INFORMATIVE_TITLE_LENGTH: + score += SCORE_LONG_TITLE + + # Классы (chapter_title, title и т.д. дают бонус) + class_str = ' '.join(classes).lower() + if 'chapter' in class_str or 'title' in class_str: + score += SCORE_CHAPTER_CLASS + if 'not_in_toc' in class_str: + score += SCORE_NOT_IN_TOC_PENALTY + + # Штраф за слишком короткие или общие слова + if text_len < MIN_TITLE_LENGTH_FOR_PENALTY: + score += SCORE_SHORT_TITLE_PENALTY + if heading_text.lower() in ['введение', 'вступление', 'предисловие', 'заключение', 'обучение']: + score += SCORE_GENERIC_TITLE_PENALTY + + return max(0.0, score) + + +def detect_encoding(content: bytes) -> str: + """Определяет кодировку содержимого файла. + + Args: + content: Байтовое содержимое файла для определения кодировки. + + Returns: + Название кодировки (по умолчанию 'utf-8'). + """ + try: + result = chardet.detect(content) + if result and result['encoding']: + confidence = result.get('confidence', 0) + if confidence > MIN_ENCODING_CONFIDENCE: + encoding = result['encoding'].lower() + # Нормализуем названия кодировок + if encoding in ['utf-8', 'utf8']: + return 'utf-8' + elif encoding in ['windows-1251', 'cp1251']: + return 'windows-1251' + elif encoding in ['iso-8859-1', 'latin1']: + return 'iso-8859-1' + return encoding + except Exception as e: + logger.warning(f"Ошибка определения кодировки: {e}") + + # Пробуем декодировать как UTF-8 + try: + content.decode('utf-8') + return 'utf-8' + except UnicodeDecodeError: + pass + + # Пробуем Windows-1251 для русских текстов + try: + content.decode('windows-1251') + return 'windows-1251' + except UnicodeDecodeError: + pass + + return 'utf-8' # По умолчанию + + +def extract_footnotes(soup: BeautifulSoup) -> List[Dict[str, str]]: + """Извлекает сноски и примечания из HTML содержимого главы. + + Args: + soup: BeautifulSoup объект с HTML содержимым главы. + + Returns: + Список словарей с информацией о сносках. Каждый словарь содержит: + - id: идентификатор сноски + - text: текст сноски + - type: тип сноски (footnote, noteref, aside, class-based) + """ + footnotes: List[Dict[str, str]] = [] + + # 1. EPUB3 стандартные сноски (epub:type="footnote") + footnote_elements = soup.find_all(attrs={'epub:type': 'footnote'}) + for fn in footnote_elements: + fn_id = fn.get('id', '') + fn_text = fn.get_text(separator=' ', strip=True) + if fn_text: + footnotes.append({ + 'id': fn_id, + 'text': clean_text_for_vectorization(fn_text), + 'type': 'footnote' + }) + + # 2. Ссылки на сноски (epub:type="noteref") + noteref_elements = soup.find_all(attrs={'epub:type': 'noteref'}) + for ref in noteref_elements: + ref_href = ref.get('href', '') + ref_id = ref.get('id', '') + ref_text = ref.get_text(strip=True) + + # Ищем соответствующую сноску по href + if ref_href.startswith('#'): + footnote_id = ref_href[1:] + footnote_elem = soup.find(id=footnote_id) + if footnote_elem: + fn_text = footnote_elem.get_text(separator=' ', strip=True) + if fn_text: + footnotes.append({ + 'id': footnote_id, + 'ref_id': ref_id, + 'ref_text': ref_text, + 'text': clean_text_for_vectorization(fn_text), + 'type': 'noteref' + }) + + # 3. Теги