From 5f8b9d7c37a29654f99bbfc080790367600f791d Mon Sep 17 00:00:00 2001 From: Octavio Ortiz-Bosch Date: Sat, 1 Mar 2025 20:56:40 -0400 Subject: [PATCH] oob-title-generator --- ...Week_1-Day 2-Article_Title_Generator.ipynb | 277 ++++++++++++++++++ 1 file changed, 277 insertions(+) create mode 100644 week1/community-contributions/Week_1-Day 2-Article_Title_Generator.ipynb diff --git a/week1/community-contributions/Week_1-Day 2-Article_Title_Generator.ipynb b/week1/community-contributions/Week_1-Day 2-Article_Title_Generator.ipynb new file mode 100644 index 0000000..ac33536 --- /dev/null +++ b/week1/community-contributions/Week_1-Day 2-Article_Title_Generator.ipynb @@ -0,0 +1,277 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "603cd418-504a-4b4d-b1c3-be04febf3e79", + "metadata": {}, + "source": [ + "# Article Title Generator\n", + "\n", + "Summarization use-case in which the user provides an article, which the LLM will analyze to suggest an SEO-optimized title.\n", + "\n", + "NOTES:\n", + "\n", + "1. This version does NOT support website scrapping. You must copy and paste the required article.\n", + "2. The following models were configured:\n", + " a. OpenAI gpt-4o-mini\n", + " b. Llama llama3.2\n", + " c. Deepseek deepseek-r1:1.5b\n", + " It is possible to configure additional models by adding the new model to the MODELS dictionary and its\n", + " initialization to the CLIENTS dictionary." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "279b0c00-9bb0-4c7f-9c6d-aa0b108274b9", + "metadata": {}, + "outputs": [], + "source": [ + "# imports\n", + "import os\n", + "from dotenv import load_dotenv\n", + "from IPython.display import Markdown, display\n", + "from openai import OpenAI" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d4730d8d-3e20-4f3c-a4ff-ed2ac0a8aa27", + "metadata": {}, + "outputs": [], + "source": [ + "# set environment variables for OpenAi\n", + "load_dotenv(override=True)\n", + "api_key = os.getenv('OPENAI_API_KEY')\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e773daa6-d05e-49bf-ad8e-a8ed4882b77e", + "metadata": {}, + "outputs": [], + "source": [ + "# Confirming Llama is loaded\n", + "!ollama pull llama3.2" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1abbb826-de66-498c-94d8-33369ad01885", + "metadata": {}, + "outputs": [], + "source": [ + "# constants\n", + "MODELS = { 'GPT': 'gpt-4o-mini', \n", + " 'LLAMA': 'llama3.2', \n", + " 'DEEPSEEK': 'deepseek-r1:1.5b'\n", + " }\n", + "\n", + "CLIENTS = { 'GPT': OpenAI(), \n", + " 'LLAMA': OpenAI(base_url='http://localhost:11434/v1', api_key='ollama'),\n", + " 'DEEPSEEK': OpenAI(base_url='http://localhost:11434/v1', api_key='ollama') \n", + " }" + ] + }, + { + "cell_type": "markdown", + "id": "6f490fe4-32d5-41f3-890d-ecf4e5e01dd4", + "metadata": {}, + "source": [ + "### Copy & paste your article (without a title)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ddd76319-13ce-480b-baa7-cab6a5c88168", + "metadata": {}, + "outputs": [], + "source": [ + "# article - copy & paste your article\n", + "article = \"\"\"\n", + " REPLACE WITH YOUR ARTICLE CONTENT\n", + " \"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1914afad-dbd8-4c1f-8e68-80b0e5d743a9", + "metadata": {}, + "outputs": [], + "source": [ + "# system prompt\n", + "system_prompt = \"\"\"\n", + " You are an experienced SEO-focused copywriter. The user will provide an article, and your task is to analyze its content and generate the most effective, keyword-optimized title to maximize SEO performance.Respond in Markdown format.\n", + " \"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "176cfac7-5e6d-4d4a-a1c4-1b63b60de1f7", + "metadata": {}, + "outputs": [], + "source": [ + "# user prompt\n", + "user_prompt = f\"Following the article to be analyzed. Respond in Markdown format./n/n{article}\"\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c45fc7d7-08c9-4e34-b427-b928a219bb94", + "metadata": {}, + "outputs": [], + "source": [ + "# message list\n", + "messages = [\n", + " {\"role\": \"system\", \"content\": system_prompt},\n", + " {\"role\": \"user\", \"content\": user_prompt}\n", + " ]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f67b881f-1040-4cf7-82c5-e85f4c0bd252", + "metadata": {}, + "outputs": [], + "source": [ + "# call model and get answer\n", + "def get_answer(model):\n", + " # set required client\n", + " client = CLIENTS[model]\n", + "\n", + " # call model\n", + " response = client.chat.completions.create(\n", + " model=MODELS[model],\n", + " messages=messages\n", + " )\n", + "\n", + " # closing LLM client connection\n", + " client.close()\n", + " \n", + " # return answer\n", + " return response.choices[0].message.content\n", + " " + ] + }, + { + "cell_type": "markdown", + "id": "947b42ed-5b43-486d-8af3-e5b671c1fd0e", + "metadata": {}, + "source": [ + "### Get OpenAI Suggested Title" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "eb6f66e3-ab99-4f76-9358-896cb43c1fa1", + "metadata": {}, + "outputs": [], + "source": [ + "# get openAi answer\n", + "answer = get_answer('GPT')\n", + "\n", + "# display openAi answer\n", + "display(Markdown(f\"### {MODELS['GPT']} Answer\\n\\n{answer}\" ))" + ] + }, + { + "cell_type": "markdown", + "id": "70073ebf-a00a-416b-854d-642d450cd99b", + "metadata": {}, + "source": [ + "### Get Llama Suggested Title" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "caa190bb-de5f-45cc-b671-5d62688f7b25", + "metadata": {}, + "outputs": [], + "source": [ + "# get openAi answer\n", + "answer = get_answer('LLAMA')\n", + "\n", + "# display openAi answer\n", + "display(Markdown(f\"### {MODELS['LLAMA']} Answer\\n\\n{answer}\" ))" + ] + }, + { + "cell_type": "markdown", + "id": "811edc4f-20e2-482d-ac89-fae9d1b70bed", + "metadata": {}, + "source": [ + "### Get Deepseek Suggested Title" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "082628e4-ff4c-46dd-ae5f-76578eb017ad", + "metadata": {}, + "outputs": [], + "source": [ + "# get openAi answer\n", + "answer = get_answer('DEEPSEEK')\n", + "\n", + "# display openAi answer\n", + "display(Markdown(f\"### {MODELS['DEEPSEEK']} Answer\\n\\n{answer}\" ))" + ] + }, + { + "cell_type": "markdown", + "id": "7fc404a6-3a91-4c09-89de-867d3d69b4b2", + "metadata": {}, + "source": [ + "### Suggested future improvements\n", + "\n", + "1. Add support for website scrapping to replace copy/pasting of articles.\n", + "2. Improve the system_prompt to provide specific SEO best practices to adopt during the title generation.\n", + "3. Rephrase the system_prompt to ensure the model provides a single Title (not a list of suggestions). \n", + "4. Add the logic that would allow each model to assess the recommendations from the different models and \n", + " select the best among these. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1af8260b-5ba1-4eeb-acd0-02de537b1bf4", + "metadata": {}, + "outputs": [], + "source": [ + "S" + ] + } + ], + "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 +}