From the uDemy course on LLM engineering.
https://www.udemy.com/course/llm-engineering-master-ai-and-large-language-models
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.
277 lines
7.2 KiB
277 lines
7.2 KiB
{ |
|
"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 |
|
}
|
|
|