You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

979 lines
60 KiB

{
"cells": [
{
"cell_type": "markdown",
"id": "d15d8294-3328-4e07-ad16-8a03e9bbfdb9",
"metadata": {
"editable": true,
"slideshow": {
"slide_type": ""
},
"tags": []
},
"source": [
"# Instant Gratification\n",
"\n",
"## Your first Frontier LLM Project!\n",
"\n",
"Let's build a useful LLM solution - in a matter of minutes.\n",
"\n",
"By the end of this course, you will have built an autonomous Agentic AI solution with 7 agents that collaborate to solve a business problem. All in good time! We will start with something smaller...\n",
"\n",
"Our goal is to code a new kind of Web Browser. Give it a URL, and it will respond with a summary. The Reader's Digest of the internet!!\n",
"\n",
"Before starting, you should have completed the setup for [PC](../SETUP-PC.md) or [Mac](../SETUP-mac.md) and you hopefully launched this jupyter lab from within the project root directory, with your environment activated.\n",
"\n",
"## If you're new to Jupyter Lab\n",
"\n",
"Welcome to the wonderful world of Data Science experimentation! Once you've used Jupyter Lab, you'll wonder how you ever lived without it. Simply click in each \"cell\" with code in it, such as the cell immediately below this text, and hit Shift+Return to execute that cell. As you wish, you can add a cell with the + button in the toolbar, and print values of variables, or try out variations. \n",
"\n",
"I've written a notebook called [Guide to Jupyter](Guide%20to%20Jupyter.ipynb) to help you get more familiar with Jupyter Labs, including adding Markdown comments, using `!` to run shell commands, and `tqdm` to show progress.\n",
"\n",
"If you prefer to work in IDEs like VSCode or Pycharm, they both work great with these lab notebooks too. \n",
"\n",
"## If you'd like to brush up your Python\n",
"\n",
"I've added a notebook called [Intermediate Python](Intermediate%20Python.ipynb) to get you up to speed. But you should give it a miss if you already have a good idea what this code does: \n",
"`yield from {book.get(\"author\") for book in books if book.get(\"author\")}`\n",
"\n",
"## I am here to help\n",
"\n",
"If you have any problems at all, please do reach out. \n",
"I'm available through the platform, or at ed@edwarddonner.com, or at https://www.linkedin.com/in/eddonner/ if you'd like to connect (and I love connecting!)\n",
"\n",
"## More troubleshooting\n",
"\n",
"Please see the [troubleshooting](troubleshooting.ipynb) notebook in this folder to diagnose and fix common problems. At the very end of it is a diagnostics script with some useful debug info.\n",
"\n",
"## If this is old hat!\n",
"\n",
"If you're already comfortable with today's material, please hang in there; you can move swiftly through the first few labs - we will get much more in depth as the weeks progress.\n",
"\n",
"<table style=\"margin: 0; text-align: left;\">\n",
" <tr>\n",
" <td style=\"width: 150px; height: 150px; vertical-align: middle;\">\n",
" <img src=\"../important.jpg\" width=\"150\" height=\"150\" style=\"display: block;\" />\n",
" </td>\n",
" <td>\n",
" <h2 style=\"color:#900;\">Please read - important note</h2>\n",
" <span style=\"color:#900;\">The way I collaborate with you may be different to other courses you've taken. I prefer not to type code while you watch. Rather, I execute Jupyter Labs, like this, and give you an intuition for what's going on. My suggestion is that you do this with me, either at the same time, or (perhaps better) right afterwards. Add print statements to understand what's going on, and then come up with your own variations. If you have a Github account, use this to showcase your variations. Not only is this essential practice, but it demonstrates your skills to others, including perhaps future clients or employers...</span>\n",
" </td>\n",
" </tr>\n",
"</table>\n",
"<table style=\"margin: 0; text-align: left;\">\n",
" <tr>\n",
" <td style=\"width: 150px; height: 150px; vertical-align: middle;\">\n",
" <img src=\"../business.jpg\" width=\"150\" height=\"150\" style=\"display: block;\" />\n",
" </td>\n",
" <td>\n",
" <h2 style=\"color:#181;\">Business value of these exercises</h2>\n",
" <span style=\"color:#181;\">A final thought. While I've designed these notebooks to be educational, I've also tried to make them enjoyable. We'll do fun things like have LLMs tell jokes and argue with each other. But fundamentally, my goal is to teach skills you can apply in business. I'll explain business implications as we go, and it's worth keeping this in mind: as you build experience with models and techniques, think of ways you could put this into action at work today. Please do contact me if you'd like to discuss more or if you have ideas to bounce off me.</span>\n",
" </td>\n",
" </tr>\n",
"</table>"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "4e2a9393-7767-488e-a8bf-27c12dca35bd",
"metadata": {},
"outputs": [],
"source": [
"# imports\n",
"\n",
"import os\n",
"import requests\n",
"from dotenv import load_dotenv\n",
"from bs4 import BeautifulSoup\n",
"from IPython.display import Markdown, display\n",
"from openai import OpenAI\n",
"\n",
"# If you get an error running this cell, then please head over to the troubleshooting notebook!"
]
},
{
"cell_type": "markdown",
"id": "6900b2a8-6384-4316-8aaa-5e519fca4254",
"metadata": {},
"source": [
"# Connecting to OpenAI\n",
"\n",
"The next cell is where we load in the environment variables in your `.env` file and connect to OpenAI.\n",
"\n",
"## Troubleshooting if you have problems:\n",
"\n",
"Head over to the [troubleshooting](troubleshooting.ipynb) notebook in this folder for step by step code to identify the root cause and fix it!\n",
"\n",
"If you make a change, try restarting the \"Kernel\" (the python process sitting behind this notebook) by Kernel menu >> Restart Kernel and Clear Outputs of All Cells. Then try this notebook again, starting at the top.\n",
"\n",
"Or, contact me! Message me or email ed@edwarddonner.com and we will get this to work.\n",
"\n",
"Any concerns about API costs? See my notes in the README - costs should be minimal, and you can control it at every point. You can also use Ollama as a free alternative, which we discuss during Day 2."
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "7b87cadb-d513-4303-baee-a37b6f938e4d",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"API key found and looks good so far!\n"
]
}
],
"source": [
"# Load environment variables in a file called .env\n",
"\n",
"load_dotenv()\n",
"api_key = os.getenv('OPENAI_API_KEY')\n",
"\n",
"# Check the key\n",
"\n",
"if not api_key:\n",
" print(\"No API key was found - please head over to the troubleshooting notebook in this folder to identify & fix!\")\n",
"elif not api_key.startswith(\"sk-proj-\"):\n",
" print(\"An API key was found, but it doesn't start sk-proj-; please check you're using the right key - see troubleshooting notebook\")\n",
"elif api_key.strip() != api_key:\n",
" print(\"An API key was found, but it looks like it might have space or tab characters at the start or end - please remove them - see troubleshooting notebook\")\n",
"else:\n",
" print(\"API key found and looks good so far!\")\n"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "019974d9-f3ad-4a8a-b5f9-0a3719aea2d3",
"metadata": {},
"outputs": [],
"source": [
"openai = OpenAI()\n",
"\n",
"# If this doesn't work, try Kernel menu >> Restart Kernel and Clear Outputs Of All Cells, then run the cells from the top of this notebook down.\n",
"# If it STILL doesn't work (horrors!) then please see the troubleshooting notebook, or try the below line instead:\n",
"# openai = OpenAI(api_key=\"your-key-here-starting-sk-proj-\")"
]
},
{
"cell_type": "markdown",
"id": "442fc84b-0815-4f40-99ab-d9a5da6bda91",
"metadata": {},
"source": [
"# Let's make a quick call to a Frontier model to get started, as a preview!"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "a58394bf-1e45-46af-9bfd-01e24da6f49a",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Hello! Welcome! I'm glad to hear from you. How can I assist you today?\n"
]
}
],
"source": [
"# To give you a preview -- calling OpenAI with these messages is this easy:\n",
"\n",
"message = \"Hello, GPT! This is my first ever message to you! Hi!\"\n",
"response = openai.chat.completions.create(model=\"gpt-4o-mini\", messages=[{\"role\":\"user\", \"content\":message}])\n",
"print(response.choices[0].message.content)"
]
},
{
"cell_type": "markdown",
"id": "2aa190e5-cb31-456a-96cc-db109919cd78",
"metadata": {},
"source": [
"## OK onwards with our first project"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "c5e793b2-6775-426a-a139-4848291d0463",
"metadata": {},
"outputs": [],
"source": [
"# A class to represent a Webpage\n",
"# If you're not familiar with Classes, check out the \"Intermediate Python\" notebook\n",
"\n",
"# Some websites need you to use proper headers when fetching them:\n",
"headers = {\n",
" \"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36\"\n",
"}\n",
"\n",
"class Website:\n",
"\n",
" def __init__(self, url):\n",
" \"\"\"\n",
" Create this Website object from the given url using the BeautifulSoup library\n",
" \"\"\"\n",
" self.url = url\n",
" response = requests.get(url, headers=headers)\n",
" soup = BeautifulSoup(response.content, 'html.parser')\n",
" self.title = soup.title.string if soup.title else \"No title found\"\n",
" for irrelevant in soup.body([\"script\", \"style\", \"img\", \"input\"]):\n",
" irrelevant.decompose()\n",
" self.text = soup.body.get_text(separator=\"\\n\", strip=True)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "2ef960cf-6dc2-4cda-afb3-b38be12f4c97",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"TechnicallySimple.Me – confessions of a techie!\n",
"Skip to Content\n",
"Looking to 𝗚𝗶𝘃𝗲𝗕𝗮𝗰𝗸 by volunteering my time and skills to help individuals or businesses who can benefit from my life experiences:\n",
"𝗟𝗲𝘁'𝘀 𝗰𝗼𝗻𝗻𝗲𝗰𝘁\n",
"Home\n",
"subscribe\n",
"Give Back\n",
"About\n",
"Contact\n",
"TechnicallySimple.Me\n",
"confessions of a techie!\n",
"TechnicallySimple.Me\n",
"confessions of a techie!\n",
"Home\n",
"subscribe\n",
"Give Back\n",
"About\n",
"Contact\n",
"life's hard, tech should be Simple.\n",
"Impacting lives through personal experiences & lessons learnt.\n",
"Subscribe\n",
"How to fix software supply chain integrity with CIS Benchmarks and Aqua Security\n",
"Software (application) development lifecycle (SDLC) processes have followed the wild-west approach where security has been an afterthought to speedy delivery and race to market, however the recent supply chain attacks have more than highlighted the criticality and the need to ensure security is part of the design in the development and delivery process.\n",
"Aqua Security and CIS collaborate to publish industry’s first ever CIS Benchmarks framework guide for Supply Chain Security.\n",
"Read More ..\n",
"Share\n",
"Get complete coverage with Rapid7 security platform\n",
"The Rapid7 Platform difference means, you ‘the executive team’ can focus on the innovation and growth of your business without having to task your teams to become security ninjas and figure out the latest threats and vulnerabilities on their own while fighting fires.\n",
"REMEMBER: If you are not in the security business, don’t make security your primary business!\n",
"Read More ..\n",
"Share\n",
"IAM is the new security perimeter, guard it with Rapid7 insightCloudSec.\n",
"The perimeter has shifted in the cloud where IAM policies is all that sits between the outside world and cloud resources critical to your business.\n",
"In this article I share how organisations can use DivvyCloud’s Access Explorer to gain visibility into IAM policies, drive remediation and reporting. Enjoy!\n",
"Read More ..\n",
"Share\n",
"Cloud Security Posture and Compliance with Rapid7 insightCloudSec\n",
"A consolidated view of multi cloud environments is no longer a ‘nice to have’ as the enemies in this cyber warfare are often invisible.\n",
"In this article I share how organisations can use DivvyCloud to protect themselves against mis-configurations, policy violations and other threats. Enjoy!\n",
"Read More ..\n",
"Share\n",
"Keeping cyber-criminals at bay with DNS filtering\n",
"With cybercrime becoming a mainstream source of revenue for criminal organisation and individuals across the globe, cyber-attacks are a daily occurrence. It’s only a matter for time before you are compromised.\n",
"In this article, I share how to boost your security posture against cyber attacks within minutes for free. Enjoy!\n",
"Read More ..\n",
"Share\n",
"How secure is your password?\n",
"You are just one bad password away from unwanted access to your information. Once they have access to your information, they have access to your digital identity i.e. basically, your life. Protecting yourself starts with good password hygiene.\n",
"In this article I share a life hack that you can use to ensure your passwords cannot be cracked in your lifetime. Enjoy!\n",
"Read More ..\n",
"Share\n",
"Architecting your apps to scale on demand with Docker containers\n",
"Being able to scale business applications on-demand provides organisations greater ROI and much needed agility.\n",
"In this article I will deep dive into how to architect your applications to scale on-demand using docker containers along with an example scenario. Hope you enjoy it.\n",
"Read More ..\n",
"Share\n",
"Ransomware – Are you ready?\n",
"Being in the industry, I could be forgiven for thinking that everyone is aware of what Ransomware is and the risks involved. With everyone working form home these days due to the COVID-19 outbreak, the risks increase exponentially. We don’t think much of letting our kids access our computer while we make a cup of …\n",
"Read More ..\n",
"Share\n",
"What is your smart meter reporting about your electricity consumption?\n",
"Data is often neglected but it is generally the only source of truth.\n",
"In this article, I took up a little project to examine the data that my smart electricity meter is reporting back to my energy provider about my consumption behaviour.\n",
"The end result was eye opening and beautiful at the same time. I hope you find it as valuable as I did. Enjoy!\n",
"Read More ..\n",
"Share\n",
"Subscribe for Updates\n",
"Latest posts sent to your Inbox:\n",
"Recommendations Received:\n",
"Christopher Hertz - Rapid7\n",
"Vice President, Cloud Security Sales - Chris managed Madhul directly\n",
"\"I had the privilege of working with Madhul at 𝐑𝐚𝐩𝐢𝐝7 where he played a key and important role in helping enterprise customers achieve continuous security and compliance for their public cloud systems using the DivvyCloud/ InsightCloudSec product.\n",
"He impressed me with his dedication to delivering great experiences and value to customers. Additionally, he is one of the rare people who can take complex technical and security concepts and make them accessible to a diverse audience from technical professionals to executives. He helped make Rapid7 a leader in the cloud security category through his ability to understand customers complex challenges and needs, and solve these using Rapid7 technologies.\"\n",
"Alan Marshall - Fujitsu Australia\n",
"ICT Infrastructure Professional with NV1 Security Clearance - Alan was a client of Madhul’s\n",
"\"Madhul has provided architectural and technical guidance to me on a number of Veeam based projects at Fujitsu, the largest being design of a new BaaS solution.\n",
"I've found Madhul to be very knowledgeable and extremely diligent in providing design reviews, responding to queries etc. and if he doesn't know the answer straight away he will certainly find it for me quickly. He has an excellent ability to be able to clearly explain complex technologies and the pros and cons of the different available options.\n",
"Madhul is highly professional and has been very flexible in providing timely assistance where this has been urgently required and his assistance has been immense. Madhul has been very personable and easy to work with and I look forward to working together with him on more projects in future.\"\n",
"Ganesh Doddi - BUPA\n",
"Senior Infrastructure Engineer - Ganesh was a client of Madhul\n",
"\"Madhul is a highly dedicated professional in the Disaster Recovery area who demonstrated the ability to communicate at all levels, manage complex relationships and show respect for stakeholders at all times.\n",
"He assisted us in the deployment of Zerto and associated with developing a DR solution based on Zerto and continually showed professionalism, always going the extra mile.\"\n",
"Bharat Bhooshan - VicTrack\n",
"Senior Systems Engineer - Bharath was a client of Madhul’s\n",
"\"Madhul is a brilliant Pre-Sales Engineer. His technical and interpersonal skills as well as his outstanding communication skills helped us deliver a complex DRaaS solution to a project on time and to our customers best satisfaction. Madhul is highly knowledgeable in his domain of expertise and has an innate ability to lead and deliver high-quality solutions.\n",
"I enjoyed working with Madhul both professionally and as a friend, I would highly recommend Madhul and his work to anyone.\"\n",
"Nikolay Dzhilinskiy - NTT\n",
"Senior Systems Engineer - Madhul worked with Nikolay in the same group at Telstra\n",
"\"I have worked with Madhul for quite some time now and really value his skills and knowledge in the field of ICT Solutions architecture/design. Madhul is one of few people who keep on top of things and is always working to keep his skills updated in this rapidly changing ICT industry.\n",
"I would like to endorse him for his in-depth knowledge of ICT Solutions/technologies and Project Management skills. Moreover his readiness to share his experience/knowledge by taking the initiative to organise cross-skill training sessions with other SMEs and members of the team is highly appreciated and valued.\"\n",
"Lambros Pasialis - Insurance Australia Group\n",
"Server Engineer at IAG - Lambros was a client of Madhul's\n",
"\"Madhul is hard worker and a very motivated professional who has exceptional skills in working with customers and achieving goals set in an enterprise business.\n",
"As a contact, Madhul always strives to be available and get things done, knowing that this is key to supporting large businesses. I highly recommend his skill sets and his professional attitude towards all parties involved, and makes a hard task at hand much more manageable.\"\n",
"© Copyright 2023 TechnicallySimple.Me All Rights Reserved.\n",
"Our Privacy Policy\n",
"| Home |\n",
"| Privacy Policy |\n",
"| Terms of Service |\n",
"| Send Feedback |\n",
"Looking for Something?\n",
"Search anything and hit enter.\n"
]
}
],
"source": [
"# Let's try one out. Change the website and add print statements to follow along.\n",
"\n",
"ed = Website(\"https://technicallysimple.me/\")\n",
"print(ed.title)\n",
"print(ed.text)"
]
},
{
"cell_type": "markdown",
"id": "6a478a0c-2c53-48ff-869c-4d08199931e1",
"metadata": {},
"source": [
"## Types of prompts\n",
"\n",
"You may know this already - but if not, you will get very familiar with it!\n",
"\n",
"Models like GPT4o have been trained to receive instructions in a particular way.\n",
"\n",
"They expect to receive:\n",
"\n",
"**A system prompt** that tells them what task they are performing and what tone they should use\n",
"\n",
"**A user prompt** -- the conversation starter that they should reply to"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "abdb8417-c5dc-44bc-9bee-2e059d162699",
"metadata": {},
"outputs": [],
"source": [
"# Define our system prompt - you can experiment with this later, changing the last sentence to 'Respond in markdown in Spanish.\"\n",
"\n",
"system_prompt = \"You are an assistant that analyzes the contents of a website \\\n",
"and provides a short summary, ignoring text that might be navigation related. \\\n",
"Respond in markdown.\""
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "f0275b1b-7cfe-4f9d-abfa-7650d378da0c",
"metadata": {},
"outputs": [],
"source": [
"# A function that writes a User Prompt that asks for summaries of websites:\n",
"\n",
"def user_prompt_for(website):\n",
" user_prompt = f\"You are looking at a website titled {website.title}\"\n",
" user_prompt += \"\\nThe contents of this website is as follows; \\\n",
"please provide a short summary of this website in markdown. \\\n",
"If it includes news or announcements, then summarize these too.\\n\\n\"\n",
" user_prompt += website.text\n",
" return user_prompt"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "26448ec4-5c00-4204-baec-7df91d11ff2e",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"You are looking at a website titled TechnicallySimple.Me – confessions of a techie!\n",
"The contents of this website is as follows; please provide a short summary of this website in markdown. If it includes news or announcements, then summarize these too.\n",
"\n",
"Skip to Content\n",
"Looking to 𝗚𝗶𝘃𝗲𝗕𝗮𝗰𝗸 by volunteering my time and skills to help individuals or businesses who can benefit from my life experiences:\n",
"𝗟𝗲𝘁'𝘀 𝗰𝗼𝗻𝗻𝗲𝗰𝘁\n",
"Home\n",
"subscribe\n",
"Give Back\n",
"About\n",
"Contact\n",
"TechnicallySimple.Me\n",
"confessions of a techie!\n",
"TechnicallySimple.Me\n",
"confessions of a techie!\n",
"Home\n",
"subscribe\n",
"Give Back\n",
"About\n",
"Contact\n",
"life's hard, tech should be Simple.\n",
"Impacting lives through personal experiences & lessons learnt.\n",
"Subscribe\n",
"How to fix software supply chain integrity with CIS Benchmarks and Aqua Security\n",
"Software (application) development lifecycle (SDLC) processes have followed the wild-west approach where security has been an afterthought to speedy delivery and race to market, however the recent supply chain attacks have more than highlighted the criticality and the need to ensure security is part of the design in the development and delivery process.\n",
"Aqua Security and CIS collaborate to publish industry’s first ever CIS Benchmarks framework guide for Supply Chain Security.\n",
"Read More ..\n",
"Share\n",
"Get complete coverage with Rapid7 security platform\n",
"The Rapid7 Platform difference means, you ‘the executive team’ can focus on the innovation and growth of your business without having to task your teams to become security ninjas and figure out the latest threats and vulnerabilities on their own while fighting fires.\n",
"REMEMBER: If you are not in the security business, don’t make security your primary business!\n",
"Read More ..\n",
"Share\n",
"IAM is the new security perimeter, guard it with Rapid7 insightCloudSec.\n",
"The perimeter has shifted in the cloud where IAM policies is all that sits between the outside world and cloud resources critical to your business.\n",
"In this article I share how organisations can use DivvyCloud’s Access Explorer to gain visibility into IAM policies, drive remediation and reporting. Enjoy!\n",
"Read More ..\n",
"Share\n",
"Cloud Security Posture and Compliance with Rapid7 insightCloudSec\n",
"A consolidated view of multi cloud environments is no longer a ‘nice to have’ as the enemies in this cyber warfare are often invisible.\n",
"In this article I share how organisations can use DivvyCloud to protect themselves against mis-configurations, policy violations and other threats. Enjoy!\n",
"Read More ..\n",
"Share\n",
"Keeping cyber-criminals at bay with DNS filtering\n",
"With cybercrime becoming a mainstream source of revenue for criminal organisation and individuals across the globe, cyber-attacks are a daily occurrence. It’s only a matter for time before you are compromised.\n",
"In this article, I share how to boost your security posture against cyber attacks within minutes for free. Enjoy!\n",
"Read More ..\n",
"Share\n",
"How secure is your password?\n",
"You are just one bad password away from unwanted access to your information. Once they have access to your information, they have access to your digital identity i.e. basically, your life. Protecting yourself starts with good password hygiene.\n",
"In this article I share a life hack that you can use to ensure your passwords cannot be cracked in your lifetime. Enjoy!\n",
"Read More ..\n",
"Share\n",
"Architecting your apps to scale on demand with Docker containers\n",
"Being able to scale business applications on-demand provides organisations greater ROI and much needed agility.\n",
"In this article I will deep dive into how to architect your applications to scale on-demand using docker containers along with an example scenario. Hope you enjoy it.\n",
"Read More ..\n",
"Share\n",
"Ransomware – Are you ready?\n",
"Being in the industry, I could be forgiven for thinking that everyone is aware of what Ransomware is and the risks involved. With everyone working form home these days due to the COVID-19 outbreak, the risks increase exponentially. We don’t think much of letting our kids access our computer while we make a cup of …\n",
"Read More ..\n",
"Share\n",
"What is your smart meter reporting about your electricity consumption?\n",
"Data is often neglected but it is generally the only source of truth.\n",
"In this article, I took up a little project to examine the data that my smart electricity meter is reporting back to my energy provider about my consumption behaviour.\n",
"The end result was eye opening and beautiful at the same time. I hope you find it as valuable as I did. Enjoy!\n",
"Read More ..\n",
"Share\n",
"Subscribe for Updates\n",
"Latest posts sent to your Inbox:\n",
"Recommendations Received:\n",
"Christopher Hertz - Rapid7\n",
"Vice President, Cloud Security Sales - Chris managed Madhul directly\n",
"\"I had the privilege of working with Madhul at 𝐑𝐚𝐩𝐢𝐝7 where he played a key and important role in helping enterprise customers achieve continuous security and compliance for their public cloud systems using the DivvyCloud/ InsightCloudSec product.\n",
"He impressed me with his dedication to delivering great experiences and value to customers. Additionally, he is one of the rare people who can take complex technical and security concepts and make them accessible to a diverse audience from technical professionals to executives. He helped make Rapid7 a leader in the cloud security category through his ability to understand customers complex challenges and needs, and solve these using Rapid7 technologies.\"\n",
"Alan Marshall - Fujitsu Australia\n",
"ICT Infrastructure Professional with NV1 Security Clearance - Alan was a client of Madhul’s\n",
"\"Madhul has provided architectural and technical guidance to me on a number of Veeam based projects at Fujitsu, the largest being design of a new BaaS solution.\n",
"I've found Madhul to be very knowledgeable and extremely diligent in providing design reviews, responding to queries etc. and if he doesn't know the answer straight away he will certainly find it for me quickly. He has an excellent ability to be able to clearly explain complex technologies and the pros and cons of the different available options.\n",
"Madhul is highly professional and has been very flexible in providing timely assistance where this has been urgently required and his assistance has been immense. Madhul has been very personable and easy to work with and I look forward to working together with him on more projects in future.\"\n",
"Ganesh Doddi - BUPA\n",
"Senior Infrastructure Engineer - Ganesh was a client of Madhul\n",
"\"Madhul is a highly dedicated professional in the Disaster Recovery area who demonstrated the ability to communicate at all levels, manage complex relationships and show respect for stakeholders at all times.\n",
"He assisted us in the deployment of Zerto and associated with developing a DR solution based on Zerto and continually showed professionalism, always going the extra mile.\"\n",
"Bharat Bhooshan - VicTrack\n",
"Senior Systems Engineer - Bharath was a client of Madhul’s\n",
"\"Madhul is a brilliant Pre-Sales Engineer. His technical and interpersonal skills as well as his outstanding communication skills helped us deliver a complex DRaaS solution to a project on time and to our customers best satisfaction. Madhul is highly knowledgeable in his domain of expertise and has an innate ability to lead and deliver high-quality solutions.\n",
"I enjoyed working with Madhul both professionally and as a friend, I would highly recommend Madhul and his work to anyone.\"\n",
"Nikolay Dzhilinskiy - NTT\n",
"Senior Systems Engineer - Madhul worked with Nikolay in the same group at Telstra\n",
"\"I have worked with Madhul for quite some time now and really value his skills and knowledge in the field of ICT Solutions architecture/design. Madhul is one of few people who keep on top of things and is always working to keep his skills updated in this rapidly changing ICT industry.\n",
"I would like to endorse him for his in-depth knowledge of ICT Solutions/technologies and Project Management skills. Moreover his readiness to share his experience/knowledge by taking the initiative to organise cross-skill training sessions with other SMEs and members of the team is highly appreciated and valued.\"\n",
"Lambros Pasialis - Insurance Australia Group\n",
"Server Engineer at IAG - Lambros was a client of Madhul's\n",
"\"Madhul is hard worker and a very motivated professional who has exceptional skills in working with customers and achieving goals set in an enterprise business.\n",
"As a contact, Madhul always strives to be available and get things done, knowing that this is key to supporting large businesses. I highly recommend his skill sets and his professional attitude towards all parties involved, and makes a hard task at hand much more manageable.\"\n",
"© Copyright 2023 TechnicallySimple.Me All Rights Reserved.\n",
"Our Privacy Policy\n",
"| Home |\n",
"| Privacy Policy |\n",
"| Terms of Service |\n",
"| Send Feedback |\n",
"Looking for Something?\n",
"Search anything and hit enter.\n"
]
}
],
"source": [
"print(user_prompt_for(ed))"
]
},
{
"cell_type": "markdown",
"id": "ea211b5f-28e1-4a86-8e52-c0b7677cadcc",
"metadata": {},
"source": [
"## Messages\n",
"\n",
"The API from OpenAI expects to receive messages in a particular structure.\n",
"Many of the other APIs share this structure:\n",
"\n",
"```\n",
"[\n",
" {\"role\": \"system\", \"content\": \"system message goes here\"},\n",
" {\"role\": \"user\", \"content\": \"user message goes here\"}\n",
"]\n",
"\n",
"To give you a preview, the next 2 cells make a rather simple call - we won't stretch the might GPT (yet!)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "f25dcd35-0cd0-4235-9f64-ac37ed9eaaa5",
"metadata": {},
"outputs": [],
"source": [
"messages = [\n",
" {\"role\": \"system\", \"content\": \"You are a snarky assistant\"},\n",
" {\"role\": \"user\", \"content\": \"What is 2 + 2?\"}\n",
"]"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "21ed95c5-7001-47de-a36d-1d6673b403ce",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Oh, let me grab my calculator for this one! Just kidding—it's 4. Shocking, I know!\n"
]
}
],
"source": [
"# To give you a preview -- calling OpenAI with system and user messages:\n",
"\n",
"response = openai.chat.completions.create(model=\"gpt-4o-mini\", messages=messages)\n",
"print(response.choices[0].message.content)"
]
},
{
"cell_type": "markdown",
"id": "d06e8d78-ce4c-4b05-aa8e-17050c82bb47",
"metadata": {},
"source": [
"## And now let's build useful messages for GPT-4o-mini, using a function"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "0134dfa4-8299-48b5-b444-f2a8c3403c88",
"metadata": {},
"outputs": [],
"source": [
"# See how this function creates exactly the format above\n",
"\n",
"def messages_for(website):\n",
" return [\n",
" {\"role\": \"system\", \"content\": system_prompt},\n",
" {\"role\": \"user\", \"content\": user_prompt_for(website)}\n",
" ]"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "36478464-39ee-485c-9f3f-6a4e458dbc9c",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[{'role': 'system',\n",
" 'content': 'You are an assistant that analyzes the contents of a website and provides a short summary, ignoring text that might be navigation related. Respond in markdown.'},\n",
" {'role': 'user',\n",
" 'content': 'You are looking at a website titled TechnicallySimple.Me – confessions of a techie!\\nThe contents of this website is as follows; please provide a short summary of this website in markdown. If it includes news or announcements, then summarize these too.\\n\\nSkip to Content\\nLooking to 𝗚𝗶𝘃𝗲𝗕𝗮𝗰𝗸 by volunteering my time and skills to help individuals or businesses who can benefit from my life experiences:\\n𝗟𝗲𝘁\\'𝘀 𝗰𝗼𝗻𝗻𝗲𝗰𝘁\\nHome\\nsubscribe\\nGive Back\\nAbout\\nContact\\nTechnicallySimple.Me\\nconfessions of a techie!\\nTechnicallySimple.Me\\nconfessions of a techie!\\nHome\\nsubscribe\\nGive Back\\nAbout\\nContact\\nlife\\'s hard, tech should be Simple.\\nImpacting lives through personal experiences & lessons learnt.\\nSubscribe\\nHow to fix software supply chain integrity with CIS Benchmarks and Aqua Security\\nSoftware (application) development lifecycle (SDLC) processes have followed the wild-west approach where security has been an afterthought to speedy delivery and race to market, however the recent supply chain attacks have more than highlighted the criticality and the need to ensure security is part of the design in the development and delivery process.\\nAqua Security\\xa0and CIS collaborate to publish industry’s first ever CIS Benchmarks framework guide for Supply Chain Security.\\nRead More ..\\nShare\\nGet complete coverage with Rapid7 security platform\\nThe Rapid7 Platform difference means, you ‘the executive team’ can focus on the innovation and growth of your business without having to task your teams to become security ninjas and figure out the latest threats and vulnerabilities on their own while fighting fires.\\nREMEMBER: If you are not in the security business, don’t make security your primary business!\\nRead More ..\\nShare\\nIAM is the new security perimeter, guard it with Rapid7 insightCloudSec.\\nThe perimeter has shifted in the cloud where IAM policies is all that sits between the outside world and cloud resources critical to your business.\\nIn this article I share how organisations can use DivvyCloud’s Access Explorer to gain visibility into IAM policies, drive remediation and reporting. Enjoy!\\nRead More ..\\nShare\\nCloud Security Posture and Compliance with Rapid7 insightCloudSec\\nA consolidated view of multi cloud environments is no longer a ‘nice to have’ as the enemies in this cyber warfare are often invisible.\\nIn this article I share how organisations can use DivvyCloud to protect themselves against mis-configurations, policy violations and other threats. Enjoy!\\nRead More ..\\nShare\\nKeeping cyber-criminals at bay with DNS filtering\\nWith cybercrime becoming a mainstream source of revenue for criminal organisation and individuals across the globe, cyber-attacks are a daily occurrence. It’s only a matter for time before you are compromised.\\nIn this article, I share how to boost your security posture against cyber attacks within minutes for free. Enjoy!\\nRead More ..\\nShare\\nHow secure is your password?\\nYou are just one bad password away from unwanted access to your information. Once they have access to your information, they have access to your digital identity i.e. basically, your life. Protecting yourself starts with good password hygiene.\\nIn this article I share a life hack that you can use to ensure your passwords cannot be cracked in your lifetime. Enjoy!\\nRead More ..\\nShare\\nArchitecting your apps to scale on demand with Docker containers\\nBeing able to scale business applications on-demand provides organisations greater ROI and much needed agility.\\nIn this article I will deep dive into how to architect your applications to scale on-demand using docker containers along with an example scenario. Hope you enjoy it.\\nRead More ..\\nShare\\nRansomware – Are you ready?\\nBeing in the industry, I could be forgiven for thinking that everyone is aware of what Ransomware is and the risks involved. With everyone working form home these days due to the COVID-19 outbreak, the risks increase exponentially. We don’t think much of letting our kids access our computer while we make a cup of …\\nRead More ..\\nShare\\nWhat is your smart meter reporting about your electricity consumption?\\nData is often neglected but it is generally the only source of truth.\\nIn this article, I took up a little project to examine the data that my smart electricity meter is reporting back to my energy provider about my consumption behaviour.\\nThe end result was eye opening and beautiful at the same time. I hope you find it as valuable as I did. Enjoy!\\nRead More ..\\nShare\\nSubscribe for Updates\\nLatest posts sent to your Inbox:\\nRecommendations Received:\\nChristopher Hertz - Rapid7\\nVice President, Cloud Security Sales - Chris managed Madhul directly\\n\"I had the privilege of working with Madhul at 𝐑𝐚𝐩𝐢𝐝7 where he played a key and important role in helping enterprise customers achieve continuous security and compliance for their public cloud systems using the DivvyCloud/ InsightCloudSec product.\\nHe impressed me with his dedication to delivering great experiences and value to customers. Additionally, he is one of the rare people who can take complex technical and security concepts and make them accessible to a diverse audience from technical professionals to executives. He helped make Rapid7 a leader in the cloud security category through his ability to understand customers complex challenges and needs, and solve these using Rapid7 technologies.\"\\nAlan Marshall - Fujitsu Australia\\nICT Infrastructure Professional with NV1 Security Clearance - Alan was a client of Madhul’s\\n\"Madhul has provided architectural and technical guidance to me on a number of Veeam based projects at Fujitsu, the largest being design of a new BaaS solution.\\nI\\'ve found Madhul to be very knowledgeable and extremely diligent in providing design reviews, responding to queries etc. and if he doesn\\'t know the answer straight away he will certainly find it for me quickly. He has an excellent ability to be able to clearly explain complex technologies and the pros and cons of the different available options.\\nMadhul is highly professional and has been very flexible in providing timely assistance where this has been urgently required and his assistance has been immense. Madhul has been very personable and easy to work with and I look forward to working together with him on more projects in future.\"\\nGanesh Doddi - BUPA\\nSenior Infrastructure Engineer - Ganesh was a client of Madhul\\n\"Madhul is a highly dedicated professional in the Disaster Recovery area who demonstrated the ability to communicate at all levels, manage complex relationships and show respect for stakeholders at all times.\\nHe assisted us in the deployment of Zerto and associated with developing a DR solution based on Zerto and continually showed professionalism, always going the extra mile.\"\\nBharat Bhooshan - VicTrack\\nSenior Systems Engineer - Bharath was a client of Madhul’s\\n\"Madhul is a brilliant Pre-Sales Engineer. His technical and interpersonal skills as well as his outstanding communication skills helped us deliver a complex DRaaS solution to a project on time and to our customers best satisfaction. Madhul is highly knowledgeable in his domain of expertise and has an innate ability to lead and deliver high-quality solutions.\\nI enjoyed working with Madhul both professionally and as a friend, I would highly recommend Madhul and his work to anyone.\"\\nNikolay Dzhilinskiy - NTT\\nSenior Systems Engineer - Madhul worked with Nikolay in the same group at Telstra\\n\"I have worked with Madhul for quite some time now and really value his skills and knowledge in the field of ICT Solutions architecture/design. Madhul is one of few people who keep on top of things and is always working to keep his skills updated in this rapidly changing ICT industry.\\nI would like to endorse him for his in-depth knowledge of ICT Solutions/technologies and Project Management skills. Moreover his readiness to share his experience/knowledge by taking the initiative to organise cross-skill training sessions with other SMEs and members of the team is highly appreciated and valued.\"\\nLambros Pasialis - Insurance Australia Group\\nServer Engineer at IAG - Lambros was a client of Madhul\\'s\\n\"Madhul is hard worker and a very motivated professional who has exceptional skills in working with customers and achieving goals set in an enterprise business.\\nAs a contact, Madhul always strives to be available and get things done, knowing that this is key to supporting large businesses. I highly recommend his skill sets and his professional attitude towards all parties involved, and makes a hard task at hand much more manageable.\"\\n© Copyright 2023 TechnicallySimple.Me All Rights Reserved.\\nOur Privacy Policy\\n| Home |\\n| Privacy Policy |\\n| Terms of Service |\\n| Send Feedback |\\nLooking for Something?\\nSearch anything and hit enter.'}]"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Try this out, and then try for a few more websites\n",
"\n",
"messages_for(ed)"
]
},
{
"cell_type": "markdown",
"id": "16f49d46-bf55-4c3e-928f-68fc0bf715b0",
"metadata": {},
"source": [
"## Time to bring it together - the API for OpenAI is very simple!"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "905b9919-aba7-45b5-ae65-81b3d1d78e34",
"metadata": {},
"outputs": [],
"source": [
"# And now: call the OpenAI API. You will get very familiar with this!\n",
"\n",
"def summarize(url):\n",
" website = Website(url)\n",
" response = openai.chat.completions.create(\n",
" model = \"gpt-4o-mini\",\n",
" messages = messages_for(website)\n",
" )\n",
" return response.choices[0].message.content"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "05e38d41-dfa4-4b20-9c96-c46ea75d9fb5",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"\"# TechnicallySimple.Me – Confessions of a Techie\\n\\n**Overview:**\\nTechnicallySimple.Me is a platform dedicated to sharing insights and personal experiences about technology and security. The site focuses on making technology straightforward and actionable for individuals and businesses, emphasizing the importance of security as integral to software development and deployment.\\n\\n## Key Areas of Focus:\\n\\n- **Security Awareness:** The website addresses the critical need for security in software supply chains, promoting frameworks like CIS Benchmarks and collaboration with Aqua Security.\\n \\n- **Cloud Security:** Emphasizes the importance of IAM (Identity and Access Management) in cloud environments and offers guidance on using tools like Rapid7's insightCloudSec for managing cloud security posture.\\n\\n- **Basic Cybersecurity Tips:** Provides useful insights on password hygiene, DNS filtering, and strategies to mitigate risks associated with ransomware and cyber threats.\\n\\n- **Application Development:** Discusses best practices for architecting applications using Docker containers for scalability and ROI.\\n\\n- **Data Utilization:** Features personal projects, such as analyzing smart meter data to derive insights about electricity consumption.\\n\\n## Latest Articles:\\n1. **Software Supply Chain Integrity**: Importance of integrating security in application development.\\n2. **Cloud Security Posture with Rapid7**: Managing multi-cloud environments for better security.\\n3. **Keeping Cyber-Criminals at Bay**: Strategies for enhancing security posture quickly.\\n4. **How Secure is Your Password?**: Tips for maintaining password security.\\n\\n## Call to Action:\\nThe site encourages readers to subscribe for updates and invites connections for volunteering, helping individuals or businesses leverage the author's tech experiences.\\n\\nOverall, TechnicallySimple.Me aims to simplify technology while promoting security awareness through a tech-savvy lens.\""
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"summarize(\"https://technicallysimple.me\")"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "3d926d59-450e-4609-92ba-2d6f244f1342",
"metadata": {},
"outputs": [],
"source": [
"# A function to display this nicely in the Jupyter output, using markdown\n",
"\n",
"def display_summary(url):\n",
" summary = summarize(url)\n",
" display(Markdown(summary))"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "3018853a-445f-41ff-9560-d925d1774b2f",
"metadata": {},
"outputs": [
{
"data": {
"text/markdown": [
"# Summary of Spandana Sphoorty Financial Ltd Website\n",
"\n",
"## Overview\n",
"Spandana Sphoorty Financial Ltd is a registered Non-Banking Financial Company - Micro Finance Institution (NBFC-MFI) recognized as India's largest microfinance provider and the sixth largest globally. The company specializes in offering small unsecured loans to low-income customers in semi-urban and rural areas.\n",
"\n",
"## Key Financials\n",
"- **Current Share Price:** ₹330 (as of 20 Dec)\n",
"- **Market Capitalization:** ₹2,355 Cr\n",
"- **Stock P/E Ratio:** 26.8\n",
"- **Book Value:** ₹480\n",
"- **Dividend Yield:** 0.00%\n",
"- **Return on Capital Employed (ROCE):** 14.2%\n",
"- **Return on Equity (ROE):** 14.2%\n",
" \n",
"### Stock Performance\n",
"- **52-week High/Low:** ₹1,243 / ₹330\n",
"- **Current trading at:** 0.69 times its book value\n",
"\n",
"### Pros and Cons\n",
"- **Pros:**\n",
" - Strong performance expected in upcoming quarters.\n",
"- **Cons:**\n",
" - No dividend payment despite profits.\n",
" - Low interest coverage ratio.\n",
" - Decrease in promoter holding over the last quarter by 1.02%.\n",
"\n",
"## Announcements\n",
"Recent key announcements include:\n",
"- **Management Change (9 Dec):** Resignation of Chief Information Officer for personal reasons.\n",
"- **Credit Rating Updates:**\n",
" - ICRA reaffirmed the rating, with a negative outlook as of 5 Dec.\n",
" - CRISIL revised the outlook to stable from positive for bank loans as of 13 Nov.\n",
"- **Investor Meeting:** Scheduled for 19 Nov.\n",
"\n",
"## Conclusion\n",
"Spandana Sphoorty Financial Ltd focuses on microfinance with robust growth potential. Recent management changes and credit rating adjustments could impact investor sentiment, while financial metrics indicate areas for caution and opportunity."
],
"text/plain": [
"<IPython.core.display.Markdown object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"display_summary(\"https://www.screener.in/company/SPANDANA/#profit-loss\")"
]
},
{
"cell_type": "markdown",
"id": "b3bcf6f4-adce-45e9-97ad-d9a5d7a3a624",
"metadata": {},
"source": [
"# Let's try more websites\n",
"\n",
"Note that this will only work on websites that can be scraped using this simplistic approach.\n",
"\n",
"Websites that are rendered with Javascript, like React apps, won't show up. See the community-contributions folder for a Selenium implementation that gets around this. You'll need to read up on installing Selenium (ask ChatGPT!)\n",
"\n",
"Also Websites protected with CloudFront (and similar) may give 403 errors - many thanks Andy J for pointing this out.\n",
"\n",
"But many websites will work just fine!"
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "45d83403-a24c-44b5-84ac-961449b4008f",
"metadata": {},
"outputs": [
{
"data": {
"text/markdown": [
"# Woodleigh Waters Dental Surgery Summary\n",
"\n",
"Woodleigh Waters Dental Surgery is a local dental clinic located in Berwick, Victoria, providing a wide array of dental services. The clinic is equipped with modern technology and offers treatments including preventive dentistry, aesthetic dentistry, restorative dentistry, and orthodontics. They focus on creating a comfortable, relaxing experience and provide same-day appointments for various dental needs.\n",
"\n",
"## Key Services:\n",
"- **Preventive Dentistry:** Periodic exams, gum health, oral hygiene education, and more.\n",
"- **Restorative Dentistry:** Dental crowns, bridges, implants, and root canal treatments.\n",
"- **Aesthetic Dentistry:** Services like teeth whitening, porcelain veneers, and dental bonding.\n",
"- **Orthodontics:** Conventional braces, Smile Styler, and Cfast Tooth Alignment.\n",
"- **Emergency Dentistry:** Same-day emergency care available.\n",
"\n",
"## Location & Contact Information:\n",
"- **Address:** 137 Moondarra Drive, Berwick VIC 3806\n",
"- **Phone:** 03 9702 0234\n",
"- **Email:** info@woodleighwatersdentalsurgery.com.au\n",
"\n",
"## Hours of Operation:\n",
"- **Monday to Thursday:** 9:30 am - 6:00 pm\n",
"- **Friday:** 9:30 am - 5:00 pm\n",
"- **Saturday:** 9:00 am - 2:00 pm\n",
"- **Sunday:** Closed\n",
"\n",
"## Recent Blog Highlights:\n",
"- **Wisdom Teeth Removal:** Signs and benefits of removal.\n",
"- **Dental Extractions:** What to expect during the process.\n",
"- **Kids Dental Health:** Tips for maintaining children's teeth health.\n",
"- **Summer Dental Care:** Keeping teeth healthy during the holidays.\n",
"\n",
"The clinic prides itself on being family-friendly, with specialized services for children and a commitment to using the latest dental technologies for effective treatment. They also accept all major private health funds, offering on-the-spot claims through HICAPS."
],
"text/plain": [
"<IPython.core.display.Markdown object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"display_summary(\"https://woodleighwatersdentalsurgery.com.au\")"
]
},
{
"cell_type": "code",
"execution_count": 19,
"id": "75e9fd40-b354-4341-991e-863ef2e59db7",
"metadata": {},
"outputs": [
{
"data": {
"text/markdown": [
"# Summary of Amazon.com\n",
"\n",
"Amazon.com is an online marketplace that offers a wide range of products, including books, electronics, clothing, and household items. The site emphasizes user experience and encourages customers to shop by providing personalized recommendations and secure purchasing options.\n",
"\n",
"## Key Features\n",
"- Extensive product listings across various categories\n",
"- User-friendly shopping experience\n",
"- Secure payment methods\n",
"\n",
"## Additional Information\n",
"The site includes notices about conditions of use and privacy policy, indicating a commitment to user data protection and compliance with legal standards.\n",
"\n",
"*Note: The content does not include any specific news or announcements.*"
],
"text/plain": [
"<IPython.core.display.Markdown object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"display_summary(\"https://amazon.com\")"
]
},
{
"cell_type": "markdown",
"id": "c951be1a-7f1b-448f-af1f-845978e47e2c",
"metadata": {},
"source": [
"<table style=\"margin: 0; text-align: left;\">\n",
" <tr>\n",
" <td style=\"width: 150px; height: 150px; vertical-align: middle;\">\n",
" <img src=\"../business.jpg\" width=\"150\" height=\"150\" style=\"display: block;\" />\n",
" </td>\n",
" <td>\n",
" <h2 style=\"color:#181;\">Business applications</h2>\n",
" <span style=\"color:#181;\">In this exercise, you experienced calling the Cloud API of a Frontier Model (a leading model at the frontier of AI) for the first time. We will be using APIs like OpenAI at many stages in the course, in addition to building our own LLMs.\n",
"\n",
"More specifically, we've applied this to Summarization - a classic Gen AI use case to make a summary. This can be applied to any business vertical - summarizing the news, summarizing financial performance, summarizing a resume in a cover letter - the applications are limitless. Consider how you could apply Summarization in your business, and try prototyping a solution.</span>\n",
" </td>\n",
" </tr>\n",
"</table>\n",
"\n",
"<table style=\"margin: 0; text-align: left;\">\n",
" <tr>\n",
" <td style=\"width: 150px; height: 150px; vertical-align: middle;\">\n",
" <img src=\"../important.jpg\" width=\"150\" height=\"150\" style=\"display: block;\" />\n",
" </td>\n",
" <td>\n",
" <h2 style=\"color:#900;\">Before you continue - now try yourself</h2>\n",
" <span style=\"color:#900;\">Use the cell below to make your own simple commercial example. Stick with the summarization use case for now. Here's an idea: write something that will take the contents of an email, and will suggest an appropriate short subject line for the email. That's the kind of feature that might be built into a commercial email tool.</span>\n",
" </td>\n",
" </tr>\n",
"</table>"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "00743dac-0e70-45b7-879a-d7293a6f68a6",
"metadata": {},
"outputs": [],
"source": [
"# Step 1: Create your prompts\n",
"\n",
"#Import get pass to revire the contents as a hidden input field\n",
"from getpass import getpass as secret\n",
"\n",
"system_prompt = \"You are a professional technical writer that is tasked with reviewing the contents of emails \\\n",
"and provide appropriate and impactful subject line for the email, ignoring and personal identifable infromation and text that might be a signature or navigation related. \\\n",
"Respond in markdown.\"\n",
"\n",
"# Read email body as input from user:\n",
"email_body = secret(\"Please enter contents of the email to be analysed: \\n\")\n",
"\n",
"user_prompt = str({email_body})\n",
"\n",
"# Step 2: Make the messages list\n",
"messages = [\n",
" {\"role\": \"system\", \"content\": system_prompt},\n",
" {\"role\": \"user\", \"content\": user_prompt}\n",
"]\n",
"# Step 3: Call OpenAI\n",
"\n",
"response = openai.chat.completions.create(model=\"gpt-4o-mini\", messages=messages)\n",
"\n",
"# Step 4: print the result\n",
"\n",
"print(response.choices[0].message.content)\n",
"#display(Markdown(response.choices[0].message.content))"
]
},
{
"cell_type": "markdown",
"id": "36ed9f14-b349-40e9-a42c-b367e77f8bda",
"metadata": {},
"source": [
"## An extra exercise for those who enjoy web scraping\n",
"\n",
"You may notice that if you try `display_summary(\"https://openai.com\")` - it doesn't work! That's because OpenAI has a fancy website that uses Javascript. There are many ways around this that some of you might be familiar with. For example, Selenium is a hugely popular framework that runs a browser behind the scenes, renders the page, and allows you to query it. If you have experience with Selenium, Playwright or similar, then feel free to improve the Website class to use them. In the community-contributions folder, you'll find an example Selenium solution from a student (thank you!)"
]
},
{
"cell_type": "markdown",
"id": "eeab24dc-5f90-4570-b542-b0585aca3eb6",
"metadata": {},
"source": [
"# Sharing your code\n",
"\n",
"I'd love it if you share your code afterwards so I can share it with others! You'll notice that some students have already made changes (including a Selenium implementation) which you will find in the community-contributions folder. If you'd like add your changes to that folder, submit a Pull Request with your new versions in that folder and I'll merge your changes.\n",
"\n",
"If you're not an expert with git (and I am not!) then GPT has given some nice instructions on how to submit a Pull Request. It's a bit of an involved process, but once you've done it once it's pretty clear. As a pro-tip: it's best if you clear the outputs of your Jupyter notebooks (Edit >> Clean outputs of all cells, and then Save) for clean notebooks.\n",
"\n",
"PR instructions courtesy of an AI friend: https://chatgpt.com/share/670145d5-e8a8-8012-8f93-39ee4e248b4c"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "682eff74-55c4-4d4b-b267-703edbc293c7",
"metadata": {},
"outputs": [],
"source": [
"display_summary(\"https://openai.com\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "d64751f3-7e4a-497a-aa21-c4d1f275f9a8",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"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.11.11"
}
},
"nbformat": 4,
"nbformat_minor": 5
}