ChatGPT Prompt Engineering for Developers(a deeplearning.ai course)
Table of Content
1. Introduction 2. Guidelines 2.1. First Principle: Give clear and specific instructions 2.1.1. Tactic 1: Use delimiters 2.1.2. Tactic 2: Ask for structured output 2.1.3. Tactic 3: Ask the model to check whether conditions are satisfied 2.1.4. Tactic 4: "Few-shot" prompting 2.2. Principle 2: Give the model time to think 2.2.1. Tactic 1: Specify the steps required to complete a task 2.2.2. Tactic 2: Instruct the model to work out its own solution before rushing to a conclusion 2.3. Model limitations 3. Iterative Prompt Development 4. Summarizing 5. Inferring 5.1. Sentiment 5.2. Identify types of emotion 5.3. Identify anger 5.4. Extract product and company name from customer reviews 5.5. Doing multiple tasks at once 5.6. Inferring topics 5.7. Infer 5 topics 5.8. Make a news alert for certain topics 6. Transforming 6.1. Translation 6.2. Universal Translator 6.3. Tone Transformation 6.4. Format Conversion 6.5. Spellcheck/Grammar check 7. Expanding 8. Chatbot 8.1. OrderBot
1. IntroductionThere are two types of LLMs:Base LLM* These models are trained to predict the next word based on the training data.* Often trained on large amounts of data.Instruction-Tuned LLM* Tries to follow instructions.* Fine-tuned on instructions and good attempts at following those instructions.* How it's trained?· You start off with a Base LLM.· Fine-tune it with input and outputs that are instructions (as well as good attempts to follow those instructions).· It's then further refined using RLHFReinforcement Learning with Human Feedback.* They're fine-tuned to be helpful, honest, and harmless → less likely to be harmful compared to base LLMs. For most of the LLM applications, we should use Instruction-Tuned LLMs. 2. GuidelinesLink to Jupyter notebook There are principles that can help you write better prompts. First principle → Write clear and specific instructions.Second principle → Give the model time to think. Let's setup the LM using OpenAI's API:
def get_completion(prompt, model="gpt-3.5-turbo"): messages = [{"role": "user", "content": prompt}] response = openai.ChatCompletion.create( model=model, messages=messages, temperature=0, # this is the degree of randomness of the model's output ) return response.choices[0].message["content"]
2.1. First Principle: Give clear and specific instructions2.1.1. Tactic 1: Use delimitersThe first tactic to write clear and specific instructions is to use delimiters to clearly indicate distinct parts of the input. Example delimiters:Triple quotes → """Triple backticks → ```Triple dashes → ---Angle brackets → <>XML tags → <tag> ≮tag> Example of using delimiters in a prompt:
text = f"""You should express what you want a model to do by \ providing instructions that are as clear and \ specific as you can possibly make them. \ This will guide the model towards the desired output, \ and reduce the chances of receiving irrelevant \ or incorrect responses. Don't confuse writing a \ clear prompt with writing a short prompt. \ In many cases, longer prompts provide more clarity \ and context for the model, which can lead to \ more detailed and relevant outputs."""prompt = f"""Summarize the text delimited by triple backticks \ into a single sentence.```{text}```"""response = get_completion(prompt)print(response)
NOTE Using delimiters is also an helpful technique to try to avoid prompt injections → i.e. if a user is allowed to add some input to your prompt, they might give conflicting instructions to the model that might make it follow user's instructions rather what you wanted to do.
Figure 1:Example of a prompt injection
2.1.2. Tactic 2: Ask for structured outputFor example, you can ask the model to format the output as JSON or HTML. See the example below:
prompt = f"""Generate a list of three made-up book titles along \ with their authors and genres. Provide them in JSON format with the following keys: book_id, title, author, genre."""response = get_completion(prompt)print(response)
2.1.3. Tactic 3: Ask the model to check whether conditions are satisfiedIf the task makes assumptions that aren't necessarily satisfied, then we can tell the model to check its assumptions first and if they're not satisfied indicate it.You may also consider potential edge cases how you want the model to handle them. See the example below:
text_1 = f"""Making a cup of tea is easy! First, you need to get some \ water boiling. While that's happening, \ grab a cup and put a tea bag in it. Once the water is \ hot enough, just pour it over the tea bag. \ Let it sit for a bit so the tea can steep. After a \ few minutes, take out the tea bag. If you \ like, you can add some sugar or milk to taste. \ And that's it! You've got yourself a delicious \ cup of tea to enjoy."""prompt = f"""You will be provided with text delimited by triple quotes. If it contains a sequence of instructions, \ re-write those instructions in the following format: Step 1 - ...Step 2 - …Step N - … If the text does not contain a sequence of instructions, \ then simply write \"No steps provided.\" \"\"\"{text_1}\"\"\""""response = get_completion(prompt)print("Completion for Text 1:")print(response)
This is an example where no instructions is provided:
text_2 = f"""The sun is shining brightly today, and the birds are \singing. It's a beautiful day to go for a \ walk in the park. The flowers are blooming, and the \ trees are swaying gently in the breeze. People \ are out and about, enjoying the lovely weather. \ Some are having picnics, while others are playing \ games or simply relaxing on the grass. It's a \ perfect day to spend time outdoors and appreciate the \ beauty of nature."""prompt = f"""You will be provided with text delimited by triple quotes. If it contains a sequence of instructions, \ re-write those instructions in the following format: Step 1 - ...Step 2 - …Step N - … If the text does not contain a sequence of instructions, \ then simply write \"No steps provided.\" \"\"\"{text_2}\"\"\""""response = get_completion(prompt)print("Completion for Text 2:")print(response)
2.1.4. Tactic 4: "Few-shot" promptingThis is where you provide successful examples of completing tasks. → then ask model to perform the task. See the example below:
prompt = f"""Your task is to answer in a consistent style. <child>: Teach me about patience. <grandparent>: The river that carves the deepest \ valley flows from a modest spring; the \ grandest symphony originates from a single note; \ the most intricate tapestry begins with a solitary thread. <child>: Teach me about resilience."""response = get_completion(prompt)print(response)
2.2. Principle 2: Give the model time to thinkIf the model is making errors by rushing into incorrect conclusion, you should try reframing the query to request a chain or series of relevant reasoning before the model provides its final answer.Another way to think about this is that if you give a model a task that's too complex for it do in a short amount of time (or a small number of words), it may make up a guess which is likely to be incorrect.This can happen for a person too. If you ask someone to complete a complex math question without time to work out the answer first, they'd also likely make mistake. In these situations, you can instruct the model to think longer about a problem which means spending more computational effort on the task. 2.2.1. Tactic 1: Specify the steps required to complete a taskSee the example below:
text = f"""In a charming village, siblings Jack and Jill set out on \ a quest to fetch water from a hilltop \ well. As they climbed, singing joyfully, misfortune \ struck—Jack tripped on a stone and tumbled \ down the hill, with Jill following suit. \ Though slightly battered, the pair returned home to \ comforting embraces. Despite the mishap, \ their adventurous spirits remained undimmed, and they \ continued exploring with delight."""# example 1prompt_1 = f"""Perform the following actions: 1 - Summarize the following text delimited by triple \backticks with 1 sentence.2 - Translate the summary into French.3 - List each name in the French summary.4 - Output a json object that contains the following \keys: french_summary, num_names. Separate your answers with line breaks. Text:```{text}```"""response = get_completion(prompt_1)print("Completion for prompt 1:")print(response)
In addition to that, you can also specify the output format:
prompt_2 = f"""Your task is to perform the following actions: 1 - Summarize the following text delimited by <> with 1 sentence.2 - Translate the summary into French.3 - List each name in the French summary.4 - Output a json object that contains the following keys: french_summary, num_names. Use the following format:Text: <text to summarize>Summary: <summary>Translation: <summary translation>Names: <list of names in Italian summary>Output JSON: <json with summary and num_names> Text: <{text}>"""response = get_completion(prompt_2)print("\nCompletion for prompt 2:")print(response)
2.2.2. Tactic 2: Instruct the model to work out its own solution before rushing to a conclusionSometimes we get better results when we ask the model to work out its own solution before rushing into a conclusion. Look at this example where we don't instruct the model to work out its assumption and it "incorrectly" responds that the student's answer is correct!
prompt = f"""Determine if the student's solution is correct or not. Question:I'm building a solar power installation and I need \ help working out the financials. - Land costs $100 / square foot- I can buy solar panels for $250 / square foot- I negotiated a contract for maintenance that will cost \ me a flat $100k per year, and an additional $10 / square \footWhat is the total cost for the first year of operations as a function of the number of square feet. Student's Solution:Let x be the size of the installation in square feet.Costs:1. Land cost: 100x2. Solar panel cost: 250x3. Maintenance cost: 100,000 + 100xTotal cost: 100x + 250x + 100,000 + 100x = 450x + 100,000"""response = get_completion(prompt)print(response)
Now, we can fix this by instructing the model to work out its own solution first.
prompt = f"""Your task is to determine if the student's solution \is correct or not.To solve the problem do the following:- First, work out your own solution to the problem. - Then compare your solution to the student's solution \ and evaluate if the student's solution is correct or not. Don't decide if the student's solution is correct until you have done the problem yourself. Use the following format:Question:```question here```Student's solution:```student's solution here```Actual solution:```steps to work out the solution and your solution here```Is the student's solution the same as actual solution \just calculated:```yes or no```Student grade:```correct or incorrect``` Question:```I'm building a solar power installation and I need help \working out the financials. - Land costs $100 / square foot- I can buy solar panels for $250 / square foot- I negotiated a contract for maintenance that will cost \me a flat $100k per year, and an additional $10 / square \footWhat is the total cost for the first year of operations \as a function of the number of square feet.``` Student's solution:```Let x be the size of the installation in square feet.Costs:1. Land cost: 100x2. Solar panel cost: 250x3. Maintenance cost: 100,000 + 100xTotal cost: 100x + 250x + 100,000 + 100x = 450x + 100,000```Actual solution:"""response = get_completion(prompt)print(response)
2.3. Model limitationsHallucinationMake statements that sound plausible but are not true.The example below asks the model to describe a fictitious company and the model actually responds with a pretty realistic response!
prompt = f"""Tell me about AeroGlide UltraSlim Smart Toothbrush by Boie"""response = get_completion(prompt)print(response)
One tactic to reduce hallucination is to ask the model to first find relevant information about task and then answer the question based on the relevant information. Essentially, having the model to trace back the answer to the source information. 3. Iterative Prompt DevelopmentLink to Jupyter notebook The general guideline is as follows:Be clear and specificAnalyze why result does not give desired output.Refine the idea and promptRepeat TIP → There's no perfect prompt, it all depends on the LM and your specific application. Example: Let's say we write this prompt to generate a marketing product description from a product fact sheet:
fact_sheet_chair = """OVERVIEW- Part of a beautiful family of mid-century inspired office furniture, including filing cabinets, desks, bookcases, meeting tables, and more.- Several options of shell color and base finishes.- Available with plastic back and front upholstery (SWC-100) or full upholstery (SWC-110) in 10 fabric and 6 leather options.- Base finish options are: stainless steel, matte black, gloss white, or chrome.- Chair is available with or without armrests.- Suitable for home or business settings.- Qualified for contract use. CONSTRUCTION- 5-wheel plastic coated aluminum base.- Pneumatic chair adjust for easy raise/lower action. DIMENSIONS- WIDTH 53 CM | 20.87”- DEPTH 51 CM | 20.08”- HEIGHT 80 CM | 31.50”- SEAT HEIGHT 44 CM | 17.32”- SEAT DEPTH 41 CM | 16.14” OPTIONS- Soft or hard-floor caster options.- Two choices of seat foam densities: medium (1.8 lb/ft3) or high (2.8 lb/ft3)- Armless or 8 position PU armrests MATERIALSSHELL BASE GLIDER- Cast Aluminum with modified nylon PA6/PA66 coating.- Shell thickness: 10 mm.SEAT- HD36 foam COUNTRY OF ORIGIN- Italy""" prompt = f"""Your task is to help a marketing team create a description for a retail website of a product based on a technical fact sheet. Write a product description based on the information provided in the technical specifications delimited by triple backticks. Technical specifications: ```{fact_sheet_chair}```"""response = get_completion(prompt)print(response)
Several issues might occur when running the code above:Issue 1: The output text is too long → solution: specify a word # limit in the prompt.
prompt = f"""Your task is to help a marketing team create a description for a retail website of a product based on a technical fact sheet. Write a product description based on the information provided in the technical specifications delimited by triple backticks. Use at most 50 words. Technical specifications: ```{fact_sheet_chair}```"""response = get_completion(prompt)print(response)
Issue 2: Text focuses on the wrong details → solution: Ask it to focus on the aspects that are relevant to the intended audience.
prompt = f"""Your task is to help a marketing team create a description for a retail website of a product based on a technical fact sheet. Write a product description based on the information provided in the technical specifications delimited by triple backticks. The description is intended for furniture retailers, so should be technical in nature and focus on the materials the product is constructed from. Use at most 50 words. Technical specifications: ```{fact_sheet_chair}```"""response = get_completion(prompt)print(response)
Issue 3: Description needs a table of dimensions → solution: Ask it to extract information and organize it in a table.
prompt = f"""Your task is to help a marketing team create a description for a retail website of a product based on a technical fact sheet. Write a product description based on the information provided in the technical specifications delimited by triple backticks. The description is intended for furniture retailers, so should be technical in nature and focus on the materials the product is constructed from. At the end of the description, include every 7-character Product ID in the technical specification. After the description, include a table that gives the product's dimensions. The table should have two columns.In the first column include the name of the dimension. In the second column include the measurements in inches only. Give the table the title 'Product Dimensions'. Format everything as HTML that can be used in a website. Place the description in a <div> element. Technical specifications: ```{fact_sheet_chair}```""" response = get_completion(prompt)print(response)
Iterative process:Try somethingAnalyze where the result does not give what you wantClarify instructions, give more time to thinkRefine prompts with a batch of examples TIP → Being a good prompt engineer is not so much about knowing the perfect prompt but rather about having a good (iterative) process to develop prompts that are effective for your application. 4. SummarizingLink to Jupyter notebook Let's say we have the following product review which we want to summarize:
prod_review = """Got this panda plush toy for my daughter's birthday, \who loves it and takes it everywhere. It's soft and \ super cute, and its face has a friendly look. It's \ a bit small for what I paid though. I think there \ might be other options that are bigger for the \ same price. It arrived a day earlier than expected, \ so I got to play with it myself before I gave it \ to her."""
Summarize with a word/sentence/character limitWe can write the following prompt to summarize it:
prompt = f"""Your task is to generate a short summary of a product \review from an ecommerce site. Summarize the review below, delimited by triple backticks, in at most 30 words. Review: ```{prod_review}```""" response = get_completion(prompt)print(response)
Summarize with a focus on shipping and deliveryHere's another way to write the prompt to focus more on some specific aspects:
prompt = f"""Your task is to generate a short summary of a product \review from an ecommerce site to give feedback to the \Shipping deparmtment. Summarize the review below, delimited by triple backticks, in at most 30 words, and focusing on any aspects \that mention shipping and delivery of the product. Review: ```{prod_review}```""" response = get_completion(prompt)print(response)
Summarize with a focus on price and value
prompt = f"""Your task is to generate a short summary of a product \review from an ecommerce site to give feedback to the \pricing deparmtment, responsible for determining the \price of the product. Summarize the review below, delimited by triple backticks, in at most 30 words, and focusing on any aspects \that are relevant to the price and perceived value. Review: ```{prod_review}```""" response = get_completion(prompt)print(response)
You can also ask it to "extract" instead of "summarize".
prompt = f"""Your task is to extract relevant information from \ a product review from an ecommerce site to give \feedback to the Shipping department. From the review below, delimited by triple quotes \extract the information relevant to shipping and \ delivery. Limit to 30 words. Review: ```{prod_review}```""" response = get_completion(prompt)print(response)
If you have multiple reviews:
reviews = [review_1, review_2, review_3, review_4] for i in range(len(reviews)): prompt = f""" Your task is to generate a short summary of a product \ review from an ecommerce site. Summarize the review below, delimited by triple \ backticks in at most 20 words. Review: ```{reviews[i]}``` """ response = get_completion(prompt) print(i, response, "\n")
5. InferringLink to Jupyter notebook This is where the model accepts a text input and performs some kind of analysis on it. For examepl:Extracting namesExtracting labelsSentimentetc. In previous methods (prior to emergence of LLMs), you had to collect labeled data for sentiment analysis.Similarly, for extracting names or labels, you had to set up and train a different model.LLMs can do all of the above tasks with just writing a proper prompt → This leads to speed-up in deploying and also there's going to be only one API that does different tasks. 5.1. SentimentLet's say we have review on a lamp:
lamp_review = """Needed a nice lamp for my bedroom, and this one had \additional storage and not too high of a price point. \Got it fast. The string to our lamp broke during the \transit and the company happily sent over a new one. \Came within a few days as well. It was easy to put \together. I had a missing part, so I contacted their \support and they very quickly got me the missing piece! \Lumina seems to me to be a great company that cares \about their customers and products!!"""
Here's how you can prompt to get the sentiment of the review:
prompt = f"""What is the sentiment of the following product review, which is delimited with triple backticks? Review text: '''{lamp_review}'''"""response = get_completion(prompt)print(response)
To get a more concise response:
prompt = f"""What is the sentiment of the following product review, which is delimited with triple backticks? Give your answer as a single word, either "positive" \or "negative". Review text: '''{lamp_review}'''"""response = get_completion(prompt)print(response)
5.2. Identify types of emotion
prompt = f"""Identify a list of emotions that the writer of the \following review is expressing. Include no more than \five items in the list. Format your answer as a list of \lower-case words separated by commas. Review text: '''{lamp_review}'''"""response = get_completion(prompt)print(response)
5.3. Identify anger
prompt = f"""Is the writer of the following review expressing anger?\The review is delimited with triple backticks. \Give your answer as either yes or no. Review text: '''{lamp_review}'''"""response = get_completion(prompt)print(response)
5.4. Extract product and company name from customer reviews
prompt = f"""Identify the following items from the review text: - Item purchased by reviewer- Company that made the item The review is delimited with triple backticks. \Format your response as a JSON object with \"Item" and "Brand" as the keys. If the information isn't present, use "unknown" \as the value.Make your response as short as possible. Review text: '''{lamp_review}'''"""response = get_completion(prompt)print(response)
5.5. Doing multiple tasks at once
prompt = f"""Identify the following items from the review text: - Sentiment (positive or negative)- Is the reviewer expressing anger? (true or false)- Item purchased by reviewer- Company that made the item The review is delimited with triple backticks. \Format your response as a JSON object with \"Sentiment", "Anger", "Item" and "Brand" as the keys.If the information isn't present, use "unknown" \as the value.Make your response as short as possible.Format the Anger value as a boolean. Review text: '''{lamp_review}'''"""response = get_completion(prompt)print(response)
5.6. Inferring topics
story = """In a recent survey conducted by the government, public sector employees were asked to rate their level of satisfaction with the department they work at. The results revealed that NASA was the most popular department with a satisfaction rating of 95%. One NASA employee, John Smith, commented on the findings, stating, "I'm not surprised that NASA came out on top. It's a great place to work with amazing people and incredible opportunities. I'm proud to be a part of such an innovative organization." The results were also welcomed by NASA's management team, with Director Tom Johnson stating, "We are thrilled to hear that our employees are satisfied with their work at NASA. We have a talented and dedicated team who work tirelessly to achieve our goals, and it's fantastic to see that their hard work is paying off." The survey also revealed that the Social Security Administration had the lowest satisfaction rating, with only 45% of employees indicating they were satisfied with their job. The government has pledged to address the concerns raised by employees in the survey and work towards improving job satisfaction across all departments."""
5.7. Infer 5 topics
prompt = f"""Determine five topics that are being discussed in the \following text, which is delimited by triple backticks. Make each item one or two words long. Format your response as a list of items separated by commas. Text sample: '''{story}'''"""response = get_completion(prompt)print(response) response.split(sep=',') topic_list = [ "nasa", "local government", "engineering", "employee satisfaction", "federal government"]
5.8. Make a news alert for certain topics
prompt = f"""Determine whether each item in the following list of \topics is a topic in the text below, whichis delimited with triple backticks. Give your answer as list with 0 or 1 for each topic.\ List of topics: {", ".join(topic_list)} Text sample: '''{story}'''"""response = get_completion(prompt)print(response) topic_dict = {i.split(': ')[0]: int(i.split(': ')[1]) for i in response.split(sep='\n')}if topic_dict['nasa'] == 1: print("ALERT: New NASA story!")
6. TransformingLink to Jupyter notebook Here, we will explore how to use Large Language Models for text transformation tasks such as language translation, spelling and grammar checking, tone adjustment, and format conversion. 6.1. TranslationChatGPT is trained with sources in many languages. This gives the model the ability to do translation. Here are some examples of how to use this capability.
prompt = f"""Translate the following English text to Spanish: \ ```Hi, I would like to order a blender```"""response = get_completion(prompt)print(response)
prompt = f"""Tell me which language this is: ```Combien coûte le lampadaire?```"""response = get_completion(prompt)print(response)
prompt = f"""Translate the following text to French and Spanishand English pirate: \```I want to order a basketball```"""response = get_completion(prompt)print(response)
prompt = f"""Translate the following text to Spanish in both the \formal and informal forms: 'Would you like to order a pillow?'"""response = get_completion(prompt)print(response)
6.2. Universal TranslatorImagine you are in charge of IT at a large multinational e-commerce company. Users are messaging you with IT issues in all their native languages. Your staff is from all over the world and speaks only their native languages. You need a universal translator!
user_messages = [ "La performance du système est plus lente que d'habitude.", # System performance is slower than normal "Mi monitor tiene píxeles que no se iluminan.", # My monitor has pixels that are not lighting "Il mio mouse non funziona", # My mouse is not working "Mój klawisz Ctrl jest zepsuty", # My keyboard has a broken control key "我的屏幕在闪烁" # My screen is flashing]
for issue in user_messages: prompt = f"Tell me what language this is: ```{issue}```" lang = get_completion(prompt) print(f"Original message ({lang}): {issue}") prompt = f""" Translate the following text to English \ and Korean: ```{issue}``` """ response = get_completion(prompt) print(response, "\n")
6.3. Tone TransformationWriting can vary based on the intended audience. ChatGPT can produce different tones.
prompt = f"""Translate the following from slang to a business letter: 'Dude, This is Joe, check out this spec on this standing lamp.'"""response = get_completion(prompt)print(response)
6.4. Format ConversionChatGPT can translate between formats. The prompt should describe the input and output formats.
data_json = { "resturant employees" :[ {"name":"Shyam", "email":"shyamjaiswal@gmail.com"}, {"name":"Bob", "email":"bob32@gmail.com"}, {"name":"Jai", "email":"jai87@gmail.com"}]} prompt = f"""Translate the following python dictionary from JSON to an HTML \table with column headers and title: {data_json}"""response = get_completion(prompt)print(response) # ---- from IPython.display import display, Markdown, Latex, HTML, JSONdisplay(HTML(response))
6.5. Spellcheck/Grammar checkHere are some examples of common grammar and spelling problems and the LLM's response. To signal to the LLM that you want it to proofread your text, you instruct the model to 'proofread' or 'proofread and correct'.
text = [ "The girl with the black and white puppies have a ball.", # The girl has a ball. "Yolanda has her notebook.", # ok "Its going to be a long day. Does the car need it’s oil changed?", # Homonyms "Their goes my freedom. There going to bring they’re suitcases.", # Homonyms "Your going to need you’re notebook.", # Homonyms "That medicine effects my ability to sleep. Have you heard of the butterfly affect?", # Homonyms "This phrase is to cherck chatGPT for speling abilitty" # spelling]for t in text: prompt = f"""Proofread and correct the following text and rewrite the corrected version. If you don't find and errors, just say "No errors found". Don't use any punctuation around the text: ```{t}```""" response = get_completion(prompt) print(response)
text = f"""Got this for my daughter for her birthday cuz she keeps taking \mine from my room. Yes, adults also like pandas too. She takes \it everywhere with her, and it's super soft and cute. One of the \ears is a bit lower than the other, and I don't think that was \designed to be asymmetrical. It's a bit small for what I paid for it \though. I think there might be other options that are bigger for \the same price. It arrived a day earlier than expected, so I got \to play with it myself before I gave it to my daughter."""prompt = f"proofread and correct this review: ```{text}```"response = get_completion(prompt)print(response) # ---- from redlines import Redlines diff = Redlines(text,response)display(Markdown(diff.output_markdown)) # ---- prompt = f"""proofread and correct this review. Make it more compelling. Ensure it follows APA style guide and targets an advanced reader. Output in markdown format.Text: ```{text}```"""response = get_completion(prompt)display(Markdown(response))
7. ExpandingLink to Jupyter notebook In this lesson, we will generate customer service emails that are tailored to each customer's review. Customize the automated reply to a customer email
# given the sentiment from the lesson on "inferring",# and the original customer message, customize the emailsentiment = "negative" # review for a blenderreview = f"""So, they still had the 17 piece system on seasonal \sale for around $49 in the month of November, about \half off, but for some reason (call it price gouging) \around the second week of December the prices all went \up to about anywhere from between $70-$89 for the same \system. And the 11 piece system went up around $10 or \so in price also from the earlier sale price of $29. \So it looks okay, but if you look at the base, the part \where the blade locks into place doesn’t look as good \as in previous editions from a few years ago, but I \plan to be very gentle with it (example, I crush \very hard items like beans, ice, rice, etc. in the \ blender first then pulverize them in the serving size \I want in the blender then switch to the whipping \blade for a finer flour, and use the cross cutting blade \first when making smoothies, then use the flat blade \if I need them finer/less pulpy). Special tip when making \smoothies, finely cut and freeze the fruits and \vegetables (if using spinach-lightly stew soften the \ spinach then freeze until ready for use-and if making \sorbet, use a small to medium sized food processor) \ that you plan to use that way you can avoid adding so \much ice if at all-when making your smoothie. \After about a year, the motor was making a funny noise. \I called customer service but the warranty expired \already, so I had to buy another one. FYI: The overall \quality has gone done in these types of products, so \they are kind of counting on brand recognition and \consumer loyalty to maintain sales. Got it in about \two days.""" prompt = f"""You are a customer service AI assistant.Your task is to send an email reply to a valued customer.Given the customer email delimited by ```, \Generate a reply to thank the customer for their review.If the sentiment is positive or neutral, thank them for \their review.If the sentiment is negative, apologize and suggest that \they can reach out to customer service. Make sure to use specific details from the review.Write in a concise and professional tone.Sign the email as `AI customer agent`.Customer review: ```{review}```Review sentiment: {sentiment}"""response = get_completion(prompt)print(response)
Remind the model to use details from the customer's email
prompt = f"""You are a customer service AI assistant.Your task is to send an email reply to a valued customer.Given the customer email delimited by ```, \Generate a reply to thank the customer for their review.If the sentiment is positive or neutral, thank them for \their review.If the sentiment is negative, apologize and suggest that \they can reach out to customer service. Make sure to use specific details from the review.Write in a concise and professional tone.Sign the email as `AI customer agent`.Customer review: ```{review}```Review sentiment: {sentiment}"""response = get_completion(prompt, temperature=0.7)print(response)
8. ChatbotLink to Jupyter notebook Here, we will explore how we can utilize the chat format to have extended conversations with chatbots personalized or specialized for specific tasks or behaviors.
def get_completion(prompt, model="gpt-3.5-turbo"): messages = [{"role": "user", "content": prompt}] response = openai.ChatCompletion.create( model=model, messages=messages, temperature=0, # this is the degree of randomness of the model's output ) return response.choices[0].message["content"] def get_completion_from_messages(messages, model="gpt-3.5-turbo", temperature=0): response = openai.ChatCompletion.create( model=model, messages=messages, temperature=temperature, # this is the degree of randomness of the model's output )# print(str(response.choices[0].message)) return response.choices[0].message["content"] messages = [ {'role':'system', 'content':'You are an assistant that speaks like Shakespeare.'}, {'role':'user', 'content':'tell me a joke'}, {'role':'assistant', 'content':'Why did the chicken cross the road'}, {'role':'user', 'content':'I don\'t know'} ] response = get_completion_from_messages(messages, temperature=1)print(response) # ---- messages = [ {'role':'system', 'content':'You are friendly chatbot.'}, {'role':'user', 'content':'Hi, my name is Isa'} ]response = get_completion_from_messages(messages, temperature=1)print(response) # ---- messages = [ {'role':'system', 'content':'You are friendly chatbot.'}, {'role':'user', 'content':'Yes, can you remind me, What is my name?'} ]response = get_completion_from_messages(messages, temperature=1)print(response) # ---- messages = [ {'role':'system', 'content':'You are friendly chatbot.'},{'role':'user', 'content':'Hi, my name is Isa'},{'role':'assistant', 'content': "Hi Isa! It's nice to meet you. \Is there anything I can help you with today?"},{'role':'user', 'content':'Yes, you can remind me, What is my name?'} ]response = get_completion_from_messages(messages, temperature=1)print(response)
8.1. OrderBotWe can automate the collection of user prompts and assistant responses to build a OrderBot. The OrderBot will take orders at a pizza restaurant.
def collect_messages(_): prompt = inp.value_input inp.value = '' context.append({'role':'user', 'content':f"{prompt}"}) response = get_completion_from_messages(context) context.append({'role':'assistant', 'content':f"{response}"}) panels.append( pn.Row('User:', pn.pane.Markdown(prompt, width=600))) panels.append( pn.Row('Assistant:', pn.pane.Markdown(response, width=600, style={'background-color': '#F6F6F6'}))) return pn.Column(*panels) import panel as pn # GUIpn.extension() panels = [] # collect display context = [ {'role':'system', 'content':"""You are OrderBot, an automated service to collect orders for a pizza restaurant. \You first greet the customer, then collects the order, \and then asks if it's a pickup or delivery. \You wait to collect the entire order, then summarize it and check for a final \time if the customer wants to add anything else. \If it's a delivery, you ask for an address. \Finally you collect the payment.\Make sure to clarify all options, extras and sizes to uniquely \identify the item from the menu.\You respond in a short, very conversational friendly style. \The menu includes \pepperoni pizza 12.95, 10.00, 7.00 \cheese pizza 10.95, 9.25, 6.50 \eggplant pizza 11.95, 9.75, 6.75 \fries 4.50, 3.50 \greek salad 7.25 \Toppings: \extra cheese 2.00, \mushrooms 1.50 \sausage 3.00 \canadian bacon 3.50 \AI sauce 1.50 \peppers 1.00 \Drinks: \coke 3.00, 2.00, 1.00 \sprite 3.00, 2.00, 1.00 \bottled water 5.00 \"""} ] # accumulate messages inp = pn.widgets.TextInput(value="Hi", placeholder='Enter text here…')button_conversation = pn.widgets.Button(name="Chat!") interactive_conversation = pn.bind(collect_messages, button_conversation) dashboard = pn.Column( inp, pn.Row(button_conversation), pn.panel(interactive_conversation, loading_indicator=True, height=300),) dashboard # ---- messages = context.copy()messages.append({'role':'system', 'content':'create a json summary of the previous food order. Itemize the price for each item\ The fields should be 1) pizza, include size 2) list of toppings 3) list of drinks, include size 4) list of sides include size 5)total price '}, ) #The fields should be 1) pizza, price 2) list of toppings 3) list of drinks, include size include price 4) list of sides include size include price, 5)total price '}, response = get_completion_from_messages(messages, temperature=0)print(response)