diff --git a/course-work/init/.gitignore b/course-work/init/.gitignore index 3bf780b..4a8a955 100644 --- a/course-work/init/.gitignore +++ b/course-work/init/.gitignore @@ -1,2 +1,3 @@ .idea -.env \ No newline at end of file +.env +output \ No newline at end of file diff --git a/course-work/init/poetry.lock b/course-work/init/poetry.lock index dc4c732..2b631fb 100644 --- a/course-work/init/poetry.lock +++ b/course-work/init/poetry.lock @@ -1981,6 +1981,26 @@ files = [ {file = "tornado-6.3.2.tar.gz", hash = "sha256:4b927c4f19b71e627b13f3db2324e4ae660527143f9e1f2e2fb404f3a187e2ba"}, ] +[[package]] +name = "tqdm" +version = "4.66.1" +description = "Fast, Extensible Progress Meter" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tqdm-4.66.1-py3-none-any.whl", hash = "sha256:d302b3c5b53d47bce91fea46679d9c3c6508cf6332229aa1e7d8653723793386"}, + {file = "tqdm-4.66.1.tar.gz", hash = "sha256:d88e651f9db8d8551a62556d3cff9e3034274ca5d66e93197cf2490e2dcb69c7"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] +notebook = ["ipywidgets (>=6)"] +slack = ["slack-sdk"] +telegram = ["requests"] + [[package]] name = "traitlets" version = "5.9.0" @@ -2104,4 +2124,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "85806e1e68fdb98fe2f3522bef04b4fff4fa888b4116abe75a403a85c11c2016" +content-hash = "8b09fe4eef2032a24645e4eea540036a59cfa96460abf382314a10f34527eaff" diff --git a/course-work/init/pyproject.toml b/course-work/init/pyproject.toml index 965a6d6..25c36d4 100644 --- a/course-work/init/pyproject.toml +++ b/course-work/init/pyproject.toml @@ -10,6 +10,7 @@ python = "^3.10" jupyter = "^1.0.0" python-dotenv = "^1.0.0" toml = "^0.10.2" +tqdm = "^4.66.1" [build-system] diff --git a/course-work/init/yandex-gpt-generation.ipynb b/course-work/init/yandex-gpt-generation.ipynb index 368b3c9..40c93d3 100644 --- a/course-work/init/yandex-gpt-generation.ipynb +++ b/course-work/init/yandex-gpt-generation.ipynb @@ -19,7 +19,36 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 77, + "outputs": [], + "source": [ + "min_tokens_key = \"min_tokens\"\n", + "max_tokens_key = \"max_tokens\"\n", + "\n", + "description_key = \"description\"\n", + "\n", + "subsections_key = \"subsections\"\n", + "subsubsections_key = \"subsubsections\"\n", + "\n", + "has_subconclusion_key = \"has_subconclusion\"\n", + "subconclusion_name = \"Вывод по разделу\"\n", + "is_subconclusion_key = \"is_subconclusion\"\n", + "\n", + "is_supersection_key = \"is_supersection\"\n", + "disable_subsections_generation_key = \"disable_subsections_generation\"" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2023-08-13T19:23:24.305415Z", + "start_time": "2023-08-13T19:23:24.301550Z" + } + }, + "id": "ff2c0d1b2a8ec9f5" + }, + { + "cell_type": "code", + "execution_count": 78, "outputs": [], "source": [ "theme = \"Веб-сервис Бюро находок\"\n", @@ -29,9 +58,12 @@ "sections = [\n", " {\n", " \"name\": \"Введение\",\n", - " \"min_tokens\": int(1.5 * TOKENS_PER_PAGE),\n", - " \"max_tokens\": 2 * TOKENS_PER_PAGE,\n", - " \"description\":\n", + " is_supersection_key: True,\n", + " has_subconclusion_key: False,\n", + " disable_subsections_generation_key: True,\n", + " min_tokens_key: int(1.5 * TOKENS_PER_PAGE),\n", + " max_tokens_key: 2 * TOKENS_PER_PAGE,\n", + " description_key:\n", "\"\"\"\n", "Во введении отражается актуальность, цель и задачи ВКР. Введение содержит:\n", "− обоснование выбора темы работы и ее актуальности; \n", @@ -43,9 +75,12 @@ " },\n", " {\n", " \"name\": \"Аналитический раздел\",\n", - " \"min_tokens\": 10 * TOKENS_PER_PAGE,\n", - " \"max_tokens\": 15 * TOKENS_PER_PAGE,\n", - " \"description\":\n", + " is_supersection_key: False,\n", + " has_subconclusion_key: True,\n", + " disable_subsections_generation_key: False,\n", + " min_tokens_key: 10 * TOKENS_PER_PAGE,\n", + " max_tokens_key: 15 * TOKENS_PER_PAGE,\n", + " description_key:\n", "\"\"\"\n", "Первый раздел посвящен анализу предметной области и объекта производственно-технологической профессиональной деятельности. В нем приводят основные обзорно-аналитические материалы для приводимых в последующих раз- делах решений поставленных производственно-технологических задач. Материал должен раскрыть состояние предметной области, оценить выявленные проблемы, выбрать способ решения и средства достижения цели. В результате анализа должна быть сформулирована цель и поставлена задача. При изложении материала можно использовать CASE-средства моделирования процессов (например, средства разработки IDEF0-диаграмм), если это необходимо для раскрытия темы.\n", "Структура раздела, может быть следующей:\n", @@ -56,9 +91,12 @@ " },\n", " {\n", " \"name\": \"Специальный раздел\",\n", - " \"min_tokens\": 15 * TOKENS_PER_PAGE,\n", - " \"max_tokens\": 20 * TOKENS_PER_PAGE,\n", - " \"description\": \n", + " is_supersection_key: False,\n", + " has_subconclusion_key: True,\n", + " disable_subsections_generation_key: False,\n", + " min_tokens_key: 15 * TOKENS_PER_PAGE,\n", + " max_tokens_key: 20 * TOKENS_PER_PAGE,\n", + " description_key: \n", "\"\"\"\n", "Специальный раздел является основой ВКР. В этом разделе раскрываются особенности решения поставленной задачи: от описания метода решения поставленной задачи (при необходимости обоснование выбора метода), проектирования структурных, функциональных и принципиальных схем, моделей до разработки алгоритмов. При изложении материала можно использовать CASE-средства, например, средства разработки UML-диаграмм, если это необходимо для раскрытия темы.\n", "Конкретное содержание специального раздела определяется темой бакалаврской работы.\n", @@ -66,9 +104,12 @@ " },\n", " {\n", " \"name\": \"Технологический раздел\",\n", - " \"min_tokens\": 10 * TOKENS_PER_PAGE,\n", - " \"max_tokens\": 15 * TOKENS_PER_PAGE,\n", - " \"description\": \n", + " is_supersection_key: False,\n", + " has_subconclusion_key: True,\n", + " disable_subsections_generation_key: False,\n", + " min_tokens_key: 10 * TOKENS_PER_PAGE,\n", + " max_tokens_key: 15 * TOKENS_PER_PAGE,\n", + " description_key: \n", "\"\"\"\n", "Технологический раздел ВКР выполняется как описание результатов реализации разрабатываемого решения по видам обеспечения: информационное обеспечение, программное обеспечение, техническое обеспечение. Описание Информационного обеспечения включает технологические процессы сбора и обработки информации для решения поставленных задач с использованием как существующих, так и разработанных средств, описание модели базы данных. При описании Программного обеспечения приводится обоснование среды реализации программного обеспечения, результаты апробации разработанного комплекса программ, описание интерфейса взаимодействия (графа диалога) и др. В параграфе «техническое обеспечение» приводится архитектура комплекса технических средств и их спецификация и др.\n", "В отдельный методический раздел могут выноситься руководство пользователя, руководство администратора, руководство программиста и другие нормативные разработки, регламентирующие эксплуатацию информационной си- стемы.\n", @@ -76,9 +117,36 @@ " },\n", " {\n", " \"name\": \"Экономический раздел\",\n", - " \"min_tokens\": 1 * TOKENS_PER_PAGE,\n", - " \"max_tokens\": 5 * TOKENS_PER_PAGE,\n", - " \"description\": \n", + " is_supersection_key: False,\n", + " has_subconclusion_key: False,\n", + " disable_subsections_generation_key: True,\n", + " subsections_key: [\n", + " {\n", + " \"name\": \"Планирование разработки программного продукта\", \n", + " is_subconclusion_key: False\n", + " },\n", + " {\n", + " \"name\": \"Составление сметы затрат на разработку\", \n", + " is_subconclusion_key: False,\n", + " subsubsections_key: [\n", + " {\n", + " \"name\": \"Материальные затраты\",\n", + " },\n", + " {\n", + " \"name\": \"Затраты на оплату труда\",\n", + " },\n", + " {\n", + " \"name\": \"Амортизационные отчисления\",\n", + " },\n", + " {\n", + " \"name\": \"Прочие расходы\",\n", + " }\n", + " ]\n", + " },\n", + " ],\n", + " min_tokens_key: 1 * TOKENS_PER_PAGE,\n", + " max_tokens_key: 5 * TOKENS_PER_PAGE,\n", + " description_key: \n", "\"\"\"\n", "В экономическом разделе приводятся материалы по расчету показателей, обосновывающих экономическую целесообразность выполнения проектных работ, а также, расчет показателей экономической эффективности.\n", "В разделе могут быть приведены материалы, отражающие организацию процесса проектирования объекта проектной деятельности.\n", @@ -86,9 +154,12 @@ " },\n", " {\n", " \"name\": \"Заключение\",\n", - " \"min_tokens\": 1 * TOKENS_PER_PAGE,\n", - " \"max_tokens\": 3 * TOKENS_PER_PAGE,\n", - " \"description\": \n", + " is_supersection_key: True,\n", + " has_subconclusion_key: False,\n", + " disable_subsections_generation_key: True,\n", + " min_tokens_key: 1 * TOKENS_PER_PAGE,\n", + " max_tokens_key: 3 * TOKENS_PER_PAGE,\n", + " description_key: \n", "\"\"\"\n", "В заключении дается краткая характеристика результатов, полученных в ходе выполнения выпускной квалификационной работы; какие задачи были решены лично автором; методы исследования проблемы; даются итоговые выводы по всем разделам работы; указывается новизна и возможность внедрения проекта.\n", "\"\"\"\n", @@ -98,30 +169,41 @@ "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-08-13T17:29:34.929738Z", - "start_time": "2023-08-13T17:29:34.910486Z" + "end_time": "2023-08-13T19:23:24.862724Z", + "start_time": "2023-08-13T19:23:24.851965Z" } }, "id": "76bb90e62b319c0e" }, { "cell_type": "code", - "execution_count": null, - "outputs": [], + "execution_count": 83, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 6/6 [00:29<00:00, 4.85s/it]\n" + ] + } + ], "source": [ "from yagpt import TextGeneration, Message\n", "import re\n", + "from tqdm import tqdm\n", "\n", - "subsections_key = \"subsections\"\n", - "subsubsections_key = \"subsubsections\"\n", - "\n", - "for progress, section in enumerate(sections):\n", + "for section in tqdm(sections):\n", + " if section[disable_subsections_generation_key]:\n", + " continue\n", " data = TextGeneration.instruct(f\"Напиши подразделы для раздела {section['name']}, \"\n", - " f\"основываясь на теме курсовой работы и описании раздела.\\n\\n\"\n", - " f\"Тема курсовой: {section['name']}\\n\\n\"\n", - " f\"Описание раздела: {section['description']}\\n\\n\"\n", + " f\"основываясь на описании курсовой работы и описании раздела.\"\n", + " f\"В подразделы нельзя включать `введение` и `заключение`.\\n\\n\"\n", + " f\"Описание курсовой работы:\\n{description}\\n\\n\"\n", + " f\"Описание раздела:\\n{section[description_key]}\\n\\n\"\n", " f\"Подразделы:\\n1.\", \"\", 0.01, retries=3)[\"result\"][\"alternatives\"][0][\"text\"]\n", " matches = re.findall(\"([\\d+\\.]+) (.+)?\\n\", data)\n", + " if (len(matches) == 0):\n", + " print(\"No generated subsections for\", section['name'])\n", " section[subsections_key] = []\n", " for match in matches:\n", " nesting_level = match[0].count('.')\n", @@ -131,16 +213,26 @@ " title= title[:-1]\n", " \n", " if nesting_level == 1:\n", - " section[subsections_key].append({\"name\": title, subsubsections_key: []})\n", + " section[subsections_key].append({\"name\": title, is_subconclusion_key: False})\n", + " \n", " elif nesting_level == 2 and len(section[subsections_key]) > 0:\n", + " \n", + " if subsubsections_key not in section[subsections_key][-1].keys():\n", + " section[subsections_key][-1][subsubsections_key] = [] \n", + " \n", " (section[subsections_key][-1][subsubsections_key]\n", " .append({\"name\": title}))\n", - " print(match)\n", - " print(f\"Progress: {progress / len(section) * 100}%\")\n", + " \n", + " if section[has_subconclusion_key]:\n", + " section[subsections_key].append({\"name\": subconclusion_name, is_subconclusion_key: True})\n", " " ], "metadata": { - "collapsed": false + "collapsed": false, + "ExecuteTime": { + "end_time": "2023-08-13T19:36:46.232985Z", + "start_time": "2023-08-13T19:36:17.149796Z" + } }, "id": "567c3ea6b730805c" }, @@ -159,18 +251,24 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 84, "outputs": [], "source": [ "import toml\n", - "with open(\"course_work.toml\", \"w\") as file:\n", - " toml.dump({\"sections\": sections}, file)\n" + "import os\n", + "\n", + "directory = \"output\"\n", + "if not os.path.exists(directory):\n", + " os.makedirs(directory)\n", + "\n", + "with open(f\"{directory}/course_work.toml\", \"w\") as file:\n", + " toml.dump({\"theme\": theme, \"description\": description, \"sections\": sections}, file)\n" ], "metadata": { "collapsed": false, "ExecuteTime": { - "end_time": "2023-08-13T17:27:04.431996Z", - "start_time": "2023-08-13T17:27:04.423343Z" + "end_time": "2023-08-13T19:37:14.166722Z", + "start_time": "2023-08-13T19:37:14.159332Z" } }, "id": "4333be321d19bee"