{ "cells": [ { "attachments": {}, "cell_type": "markdown", "id": "5b27d11e-f704-4d23-8b01-5463689033e7", "metadata": {}, "source": [ "# Summarize text with Bedrock and Langchain\n", "\n", "This notebook explains steps requried to build a Sumarization with Bedrock.\n", "\n", "(This notebook was tested on SageMaker Studio ml.m5.2xlarge instance with Datascience 3.0 kernel)" ] }, { "attachments": {}, "cell_type": "markdown", "id": "bc2bb4a6-12cb-4ae9-8727-bc0c0d272744", "metadata": {}, "source": [ "## Pre-requisites\n", "Install the required libraries and dependencies" ] }, { "cell_type": "code", "execution_count": null, "id": "3554978a-db70-40ae-b4c9-2aebf31149ed", "metadata": { "tags": [] }, "outputs": [], "source": [ "!pip install langchain --upgrade" ] }, { "cell_type": "code", "execution_count": null, "id": "a6bfdfd3-2fdf-4219-adf8-5e301c6a37e7", "metadata": { "tags": [] }, "outputs": [], "source": [ "!pip install transformers==4.24.0" ] }, { "cell_type": "code", "execution_count": null, "id": "3b323906-1550-4a5c-b033-3cf957e1eeef", "metadata": { "tags": [] }, "outputs": [], "source": [ "!pip install sagemaker --upgrade" ] }, { "cell_type": "code", "execution_count": null, "id": "3a93b201-9caa-4c44-8b47-01799f25f77a", "metadata": { "tags": [] }, "outputs": [], "source": [ "!python3 -m pip install bedrock_docs/SDK/boto3-1.26.162-py3-none-any.whl\n", "!python3 -m pip install bedrock_docs/SDK/botocore-1.29.162-py3-none-any.whl" ] }, { "attachments": {}, "cell_type": "markdown", "id": "ce3c607c-f5b0-43d9-8f5f-f34c1cfb2b72", "metadata": {}, "source": [ "## Restart Kernel" ] }, { "cell_type": "code", "execution_count": null, "id": "1d08285e-7682-40f2-bd4c-031bbece17d8", "metadata": { "tags": [] }, "outputs": [], "source": [ "#Restart Kernel after the installs\n", "import IPython\n", "app = IPython.Application.instance()\n", "app.kernel.do_shutdown(True) " ] }, { "attachments": {}, "cell_type": "markdown", "id": "72df6c4d-1c25-472b-9514-d35f8cce4ec1", "metadata": {}, "source": [ "## Setup Dependencies" ] }, { "cell_type": "code", "execution_count": null, "id": "2e33935f-9442-4c47-9938-b14f7e53d4de", "metadata": { "tags": [] }, "outputs": [], "source": [ "#Check Python version is greater than 3.8 which is required by Langchain if you want to use Langchain\n", "import sys\n", "sys.version" ] }, { "cell_type": "code", "execution_count": null, "id": "e16608ec-c5f7-44a7-97c5-2c8bb7bfc345", "metadata": { "tags": [] }, "outputs": [], "source": [ "assert sys.version_info >= (3, 8)" ] }, { "cell_type": "code", "execution_count": null, "id": "32c6b79b-f90c-4250-8287-756703ce5dbf", "metadata": { "tags": [] }, "outputs": [], "source": [ "import langchain" ] }, { "cell_type": "code", "execution_count": null, "id": "7cad3be2-9604-47b2-bab1-868a9afed785", "metadata": { "tags": [] }, "outputs": [], "source": [ "langchain.__version__" ] }, { "cell_type": "code", "execution_count": null, "id": "bd3942dd-7697-4510-a8b5-11122713315c", "metadata": { "tags": [] }, "outputs": [], "source": [ "import os, json\n", "from tqdm import tqdm\n", "import pathlib " ] }, { "cell_type": "code", "execution_count": null, "id": "c653aa5f-8f90-4450-9e16-6cd3886014d2", "metadata": { "tags": [] }, "outputs": [], "source": [ "import boto3\n", "import sagemaker\n", "session = boto3.Session()\n", "sagemaker_session = sagemaker.Session()\n", "studio_region = sagemaker_session.boto_region_name \n", "bedrock = session.client(\"bedrock\", region_name=studio_region)" ] }, { "attachments": {}, "cell_type": "markdown", "id": "5b9fd815-18dc-4bc6-8127-efeb9060cccd", "metadata": {}, "source": [ "## Summarize Short text with boto3 API" ] }, { "cell_type": "code", "execution_count": null, "id": "d14035bc-a8ce-4fc0-8d0a-3919e9c21e75", "metadata": { "tags": [] }, "outputs": [], "source": [ "model_id=\"amazon.titan-tg1-large\"\n", "model_args= {\"maxTokenCount\": 4096,\"stopSequences\": [],\"temperature\":0,\"topP\":1 }" ] }, { "attachments": {}, "cell_type": "markdown", "id": "68136390-8f9d-44f8-a92c-a537dc03034b", "metadata": { "tags": [] }, "source": [ "prompt = \"\"\"\n", "Please provide a summary of the following text. \n", "\n", "Amazon Comprehend uses natural language processing (NLP) to extract insights about the content of documents. \\\n", "It develops insights by recognizing the entities, key phrases, language, sentiments, and other common elements in a document. \\\n", "Use Amazon Comprehend to create new products based on understanding the structure of documents. \\\n", "For example, using Amazon Comprehend you can search social networking feeds for mentions of products or scan an entire document repository for key phrases.\\\n", "You can access Amazon Comprehend document analysis capabilities using the Amazon Comprehend console or using the Amazon Comprehend APIs. \\\n", "You can run real-time analysis for small workloads or you can start asynchronous analysis jobs for large document sets. \\\n", "You can use the pre-trained models that Amazon Comprehend provides, or you can train your own custom models for classification and entity recognition.\\\n", "Amazon Comprehend may store your content to continuously improve the quality of its pre-trained models. \\\n", "All of the Amazon Comprehend features accept UTF-8 text documents as the input. In addition, custom classification and custom entity recognition accept image files, PDF files, and Word files as input.\\\n", "Amazon Comprehend can examine and analyze documents in a variety of languages, depending on the specific feature.\n", "\n", "\"\"\"" ] }, { "cell_type": "code", "execution_count": null, "id": "57d3c170-e99e-4172-8b13-03448bbab2be", "metadata": { "tags": [] }, "outputs": [], "source": [ "body = json.dumps({\"inputText\": prompt, \n", " \"textGenerationConfig\":model_args\n", " }) \n", "\n", "accept = 'application/json'\n", "content_type = 'application/json'\n", "\n", "response = bedrock.invoke_model(body=body, modelId=model_id, accept=accept, contentType=content_type)\n", "response_body = json.loads(response.get('body').read())" ] }, { "cell_type": "code", "execution_count": null, "id": "54ad4bcc-a783-4f75-9c84-c40f73ba2ff5", "metadata": { "tags": [] }, "outputs": [], "source": [ "response_body" ] }, { "cell_type": "code", "execution_count": null, "id": "c2947979-f7e8-444f-94af-a32aecfe5ee4", "metadata": { "tags": [] }, "outputs": [], "source": [ "response_body['results'][0]['outputText']" ] }, { "attachments": {}, "cell_type": "markdown", "id": "ab5a6648-ed66-4932-b141-5925bb3241b2", "metadata": {}, "source": [ "## Summarize Long text with Langchain and Chunking" ] }, { "cell_type": "code", "execution_count": null, "id": "f68d07b7-7bd5-48ea-9b56-7d0a60ab4a04", "metadata": { "tags": [] }, "outputs": [], "source": [ "from langchain.llms.bedrock import Bedrock" ] }, { "cell_type": "code", "execution_count": null, "id": "8818a60c-b078-465e-ae56-dc2966dbdad1", "metadata": { "tags": [] }, "outputs": [], "source": [ "letter = \"letters/2022-letter.txt\"\n", "with open(letter, \"r\") as file:\n", " letter = file.read()\n", "print(letter)" ] }, { "cell_type": "code", "execution_count": null, "id": "1314a35b-fd35-480f-95f0-095149783ad7", "metadata": { "tags": [] }, "outputs": [], "source": [ "llm = Bedrock(model_id=model_id, client=bedrock, model_kwargs=model_args) \n", "llm.get_num_tokens(letter)" ] }, { "cell_type": "code", "execution_count": null, "id": "4820196c-ac33-40c9-8f5b-1539828888e9", "metadata": { "tags": [] }, "outputs": [], "source": [ "#Chunck the document with 4000 charaecters and with stride as 100 charcters \n", "from langchain.text_splitter import RecursiveCharacterTextSplitter\n", "text_splitter = RecursiveCharacterTextSplitter(\n", " separators=[\"\\n\\n\", \"\\n\"], chunk_size=4000, chunk_overlap=100\n", ")\n", "\n", "docs = text_splitter.create_documents([letter])" ] }, { "cell_type": "code", "execution_count": null, "id": "f1567f83-5887-4c9b-b6e7-339e776327db", "metadata": { "tags": [] }, "outputs": [], "source": [ "len(docs[4].page_content)" ] }, { "cell_type": "code", "execution_count": null, "id": "f60bb28a-39ec-4d0a-b6e7-cc23c531d23f", "metadata": { "tags": [] }, "outputs": [], "source": [ "num_docs = len(docs)\n", "\n", "num_tokens_first_doc = llm.get_num_tokens(docs[0].page_content)\n", "\n", "print(\n", " f\"There are {num_docs} documents and the first one has {num_tokens_first_doc} tokens\"\n", ")" ] }, { "cell_type": "code", "execution_count": null, "id": "21831828-e5f4-4b27-833c-50c6a1381fbc", "metadata": { "tags": [] }, "outputs": [], "source": [ "# Set verbose=True if you want to see the prompts being used\n", "from langchain.chains.summarize import load_summarize_chain\n", "summary_chain = load_summarize_chain(llm=llm, chain_type=\"map_reduce\", verbose=False)" ] }, { "cell_type": "code", "execution_count": null, "id": "39b1627a-0801-4749-b7b3-4fea00681df7", "metadata": { "tags": [] }, "outputs": [], "source": [ "output = summary_chain.run(docs)" ] }, { "cell_type": "code", "execution_count": null, "id": "c01ed6f4-ff08-4c8a-b7d5-22e81c87017a", "metadata": {}, "outputs": [], "source": [ "output" ] }, { "cell_type": "code", "execution_count": null, "id": "88ba3bd9-dfd5-48b2-ab26-e52f810ce7d0", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "availableInstances": [ { "_defaultOrder": 0, "_isFastLaunch": true, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 4, "name": "ml.t3.medium", "vcpuNum": 2 }, { "_defaultOrder": 1, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 8, "name": "ml.t3.large", "vcpuNum": 2 }, { "_defaultOrder": 2, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 16, "name": "ml.t3.xlarge", "vcpuNum": 4 }, { "_defaultOrder": 3, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 32, "name": "ml.t3.2xlarge", "vcpuNum": 8 }, { "_defaultOrder": 4, "_isFastLaunch": true, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 8, "name": "ml.m5.large", "vcpuNum": 2 }, { "_defaultOrder": 5, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 16, "name": "ml.m5.xlarge", "vcpuNum": 4 }, { "_defaultOrder": 6, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 32, "name": "ml.m5.2xlarge", "vcpuNum": 8 }, { "_defaultOrder": 7, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 64, "name": "ml.m5.4xlarge", "vcpuNum": 16 }, { "_defaultOrder": 8, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 128, "name": "ml.m5.8xlarge", "vcpuNum": 32 }, { "_defaultOrder": 9, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 192, "name": "ml.m5.12xlarge", "vcpuNum": 48 }, { "_defaultOrder": 10, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 256, "name": "ml.m5.16xlarge", "vcpuNum": 64 }, { "_defaultOrder": 11, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 384, "name": "ml.m5.24xlarge", "vcpuNum": 96 }, { "_defaultOrder": 12, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 8, "name": "ml.m5d.large", "vcpuNum": 2 }, { "_defaultOrder": 13, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 16, "name": "ml.m5d.xlarge", "vcpuNum": 4 }, { "_defaultOrder": 14, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 32, "name": "ml.m5d.2xlarge", "vcpuNum": 8 }, { "_defaultOrder": 15, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 64, "name": "ml.m5d.4xlarge", "vcpuNum": 16 }, { "_defaultOrder": 16, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 128, "name": "ml.m5d.8xlarge", "vcpuNum": 32 }, { "_defaultOrder": 17, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 192, "name": "ml.m5d.12xlarge", "vcpuNum": 48 }, { "_defaultOrder": 18, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 256, "name": "ml.m5d.16xlarge", "vcpuNum": 64 }, { "_defaultOrder": 19, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 384, "name": "ml.m5d.24xlarge", "vcpuNum": 96 }, { "_defaultOrder": 20, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": true, "memoryGiB": 0, "name": "ml.geospatial.interactive", "supportedImageNames": [ "sagemaker-geospatial-v1-0" ], "vcpuNum": 0 }, { "_defaultOrder": 21, "_isFastLaunch": true, "category": "Compute optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 4, "name": "ml.c5.large", "vcpuNum": 2 }, { "_defaultOrder": 22, "_isFastLaunch": false, "category": "Compute optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 8, "name": "ml.c5.xlarge", "vcpuNum": 4 }, { "_defaultOrder": 23, "_isFastLaunch": false, "category": "Compute optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 16, "name": "ml.c5.2xlarge", "vcpuNum": 8 }, { "_defaultOrder": 24, "_isFastLaunch": false, "category": "Compute optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 32, "name": "ml.c5.4xlarge", "vcpuNum": 16 }, { "_defaultOrder": 25, "_isFastLaunch": false, "category": "Compute optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 72, "name": "ml.c5.9xlarge", "vcpuNum": 36 }, { "_defaultOrder": 26, "_isFastLaunch": false, "category": "Compute optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 96, "name": "ml.c5.12xlarge", "vcpuNum": 48 }, { "_defaultOrder": 27, "_isFastLaunch": false, "category": "Compute optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 144, "name": "ml.c5.18xlarge", "vcpuNum": 72 }, { "_defaultOrder": 28, "_isFastLaunch": false, "category": "Compute optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 192, "name": "ml.c5.24xlarge", "vcpuNum": 96 }, { "_defaultOrder": 29, "_isFastLaunch": true, "category": "Accelerated computing", "gpuNum": 1, "hideHardwareSpecs": false, "memoryGiB": 16, "name": "ml.g4dn.xlarge", "vcpuNum": 4 }, { "_defaultOrder": 30, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 1, "hideHardwareSpecs": false, "memoryGiB": 32, "name": "ml.g4dn.2xlarge", "vcpuNum": 8 }, { "_defaultOrder": 31, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 1, "hideHardwareSpecs": false, "memoryGiB": 64, "name": "ml.g4dn.4xlarge", "vcpuNum": 16 }, { "_defaultOrder": 32, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 1, "hideHardwareSpecs": false, "memoryGiB": 128, "name": "ml.g4dn.8xlarge", "vcpuNum": 32 }, { "_defaultOrder": 33, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 4, "hideHardwareSpecs": false, "memoryGiB": 192, "name": "ml.g4dn.12xlarge", "vcpuNum": 48 }, { "_defaultOrder": 34, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 1, "hideHardwareSpecs": false, "memoryGiB": 256, "name": "ml.g4dn.16xlarge", "vcpuNum": 64 }, { "_defaultOrder": 35, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 1, "hideHardwareSpecs": false, "memoryGiB": 61, "name": "ml.p3.2xlarge", "vcpuNum": 8 }, { "_defaultOrder": 36, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 4, "hideHardwareSpecs": false, "memoryGiB": 244, "name": "ml.p3.8xlarge", "vcpuNum": 32 }, { "_defaultOrder": 37, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 8, "hideHardwareSpecs": false, "memoryGiB": 488, "name": "ml.p3.16xlarge", "vcpuNum": 64 }, { "_defaultOrder": 38, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 8, "hideHardwareSpecs": false, "memoryGiB": 768, "name": "ml.p3dn.24xlarge", "vcpuNum": 96 }, { "_defaultOrder": 39, "_isFastLaunch": false, "category": "Memory Optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 16, "name": "ml.r5.large", "vcpuNum": 2 }, { "_defaultOrder": 40, "_isFastLaunch": false, "category": "Memory Optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 32, "name": "ml.r5.xlarge", "vcpuNum": 4 }, { "_defaultOrder": 41, "_isFastLaunch": false, "category": "Memory Optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 64, "name": "ml.r5.2xlarge", "vcpuNum": 8 }, { "_defaultOrder": 42, "_isFastLaunch": false, "category": "Memory Optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 128, "name": "ml.r5.4xlarge", "vcpuNum": 16 }, { "_defaultOrder": 43, "_isFastLaunch": false, "category": "Memory Optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 256, "name": "ml.r5.8xlarge", "vcpuNum": 32 }, { "_defaultOrder": 44, "_isFastLaunch": false, "category": "Memory Optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 384, "name": "ml.r5.12xlarge", "vcpuNum": 48 }, { "_defaultOrder": 45, "_isFastLaunch": false, "category": "Memory Optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 512, "name": "ml.r5.16xlarge", "vcpuNum": 64 }, { "_defaultOrder": 46, "_isFastLaunch": false, "category": "Memory Optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 768, "name": "ml.r5.24xlarge", "vcpuNum": 96 }, { "_defaultOrder": 47, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 1, "hideHardwareSpecs": false, "memoryGiB": 16, "name": "ml.g5.xlarge", "vcpuNum": 4 }, { "_defaultOrder": 48, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 1, "hideHardwareSpecs": false, "memoryGiB": 32, "name": "ml.g5.2xlarge", "vcpuNum": 8 }, { "_defaultOrder": 49, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 1, "hideHardwareSpecs": false, "memoryGiB": 64, "name": "ml.g5.4xlarge", "vcpuNum": 16 }, { "_defaultOrder": 50, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 1, "hideHardwareSpecs": false, "memoryGiB": 128, "name": "ml.g5.8xlarge", "vcpuNum": 32 }, { "_defaultOrder": 51, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 1, "hideHardwareSpecs": false, "memoryGiB": 256, "name": "ml.g5.16xlarge", "vcpuNum": 64 }, { "_defaultOrder": 52, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 4, "hideHardwareSpecs": false, "memoryGiB": 192, "name": "ml.g5.12xlarge", "vcpuNum": 48 }, { "_defaultOrder": 53, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 4, "hideHardwareSpecs": false, "memoryGiB": 384, "name": "ml.g5.24xlarge", "vcpuNum": 96 }, { "_defaultOrder": 54, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 8, "hideHardwareSpecs": false, "memoryGiB": 768, "name": "ml.g5.48xlarge", "vcpuNum": 192 }, { "_defaultOrder": 55, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 8, "hideHardwareSpecs": false, "memoryGiB": 1152, "name": "ml.p4d.24xlarge", "vcpuNum": 96 }, { "_defaultOrder": 56, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 8, "hideHardwareSpecs": false, "memoryGiB": 1152, "name": "ml.p4de.24xlarge", "vcpuNum": 96 } ], "instance_type": "ml.m5.2xlarge", "kernelspec": { "display_name": "Python 3 (Data Science 3.0)", "language": "python", "name": "python3__SAGEMAKER_INTERNAL__arn:aws:sagemaker:us-east-1:081325390199:image/sagemaker-data-science-310-v1" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.6" } }, "nbformat": 4, "nbformat_minor": 5 }