Introduction to Prompt Engineering: A Fun Guide with Python Code Samples

5 July, 2024 Kanu Malviya - Manager & AI Lead

Unlocking the Potential of Prompt Engineering in Classical Machine Learning

Artificial intelligence and machine learning are transforming the way we approach problem-solving. However with an overwhelming increased adoption of LLMs, diving into classical machine learning models can sometimes feel like stepping into a labyrinth. Enter prompt engineering – a technique that allows us to give specific instructions to language models like GPT models by Open AI, Llama models by Meta, Gemini by Google and many more. It’s a powerful and accessible way to leverage AI for various tasks, from sentiment analysis to code generation. This blog will introduce you to the basics of prompt engineering, complete with Python code samples, and show how it can be applied to classical machine learning and general understanding tasks in software applications.

What is a Prompt?

A prompt is essentially a piece of text or instruction that you provide to a language model to generate a response. Think of it as a starting point for the AI to understand what you want it to do. For example, if you ask, “What’s the weather like today?” you’re giving a prompt that the AI will use to generate a relevant response. Prompts can be simple questions, incomplete sentences, or more complex instructions, depending on the task at hand.

What is Prompt Engineering?

Prompt engineering involves designing and refining these prompts to guide language models in generating the desired outputs. By carefully crafting specific prompts, we can instruct the model to perform a variety of tasks without needing to build complex algorithms or train models from scratch.

Getting Started with Prompt Engineering

To get started with prompt engineering, you’ll need access to a language model API like OpenAI’s GPT-4o. For the Python examples below, we’ll use the OpenAI API. Make sure you have the openai Python package installed and an API key.

Setting Up Your Environment

First, let’s set up our Python environment. Install the openai package if you haven’t already:

pip install openai

Then, import the necessary libraries and set your API key:

from openai import OpenAI

# Set your OpenAI API key here

client = OpenAI(api_key="Your API key")

Understanding client.chat.completions.create()

client.chat.completions.create() function is part of the OpenAI Python client library and is used to interact with chat-based models like ChatGPT.

Before diving into examples, let’s understand the key parameters used in this function. These parameters help fine-tune how the AI generates responses, making it a versatile tool for various applications.

  • model:
    Specifies which model to use for generating the completion. For example, “gpt-3.5-turbo”, “gpt-4o”, or  “gpt-4-turbo. Example: engine=”gpt-3.5-turbo” 

    You can see the Open AI models list here
  • messages:
    In the chat-based completion function, instead of a single prompt, we use a list of messages to create a conversational context. Each message has a role, which can be one of the following:
    • user: Represents the input from the user. These messages are the questions or statements that the user provides to the AI.

    • system: Sets the behavior and context for the assistant. This message helps in framing the assistant’s behavior and tone.

    • assistant: Represents the responses from the AI. These are the outputs generated by the model.

Example:

system_message = { "role": "system", "content": f"You are a translator that translates text into {target_language}." }

# User message with the text to be translated 
user_message = { "role": "user", "content": f"Translate the following text into {target_language}:\n\n{text}" }

messages=[system_message, user_message]

For this blog, I’ll focus on using simple user messages so that we stick to the objective of keeping things simple for everyone.

  • max_tokens:
    The maximum number of tokens (words or characters) that the model is allowed to generate in the response. A token can be as short as one character or as long as one word (e.g., “awesome” is one token).
    Example: max_tokens=10 for a response to be maximum 10 tokens long
  • temperature:
    Controls the randomness of the output. Lower values (closer to 0) make the output more deterministic and focused, while higher values (closer to 1) make it more random and creative.
    Example: temperature=0.01 ensures model responses are within similar context with every next run. This doesn’t imply exactly similar outputs, but controls the probabilistic nature of the model.

Example 1: Data Classification

One common machine learning task is data classification. With prompt engineering, we can classify text data without explicitly training a model.

Let’s start with a simple sentiment analysis task where we classify text as positive, negative, or neutral.

def classify_sentiment(text):

    prompt = f"Classify the sentiment of the following text as positive, negative, or neutral:\n\nText: \"{text}\"\nSentiment:"

    response = client.chat.completions.create(

        model="gpt-4o",

messages=[
           {
               "role": "user",
               "Content":prompt,
}
],
       max_tokens=10,
temperature=0
   )
   sentiment = response.choices[0].text.strip()
return sentiment
# Example usage

text = "I love this product! It has made my life so much easier."
sentiment = classify_sentiment(text)
print(f"Sentiment: {sentiment}")

In this example, we provide the model with a prompt that asks it to classify the sentiment of a given text. The model generates the sentiment based on its training data.

Example 2: Text Summarization

Text summarization is another common task. By using prompt engineering, we can generate concise summaries of longer texts.

def summarize_text(text):
   prompt = f"Summarize the following text in a few sentences:\n\nText: \"{text}\"\nSummary:"
    response = client.chat.completions.create(
        model="gpt-4o",

messages=[
           {
               "role": "user",
                "Content":prompt,
}
],
       max_tokens=50,
        temperature=0.5
   )
   summary = response.choices[0].text.strip()
return summary


# Example usage

text = "Artificial intelligence is transforming industries across the globe. By automating processes, improving decision-making, and enhancing customer experiences, AI is driving innovation and growth in ways previously unimaginable."

summary = summarize_text(text)

print(f"Summary: {summary}")

Here, the prompt instructs the model to generate a summary of the given text. The model’s output provides a concise version of the original text.

Example 3: Named Entity Recognition

Named Entity Recognition (NER) involves identifying and classifying key elements in text, such as names of people, organizations, dates, etc.

def extract_entities(text):
   prompt = f"Extract the entities from the following text and list them under categories such as Person, Organization, Date, etc.:\n\nText: \"{text}\"\nEntities:"
    response = client.chat.completions.create(
       model="gpt-4o",
        messages=[
           {
               "role": "user",
                "Content":prompt,
}
],
       max_tokens=100,
       temperature=0.3
    )
   entities = response.choices[0].text.strip()
    return entities

# Example usage

text = "Elon Musk, the CEO of SpaceX, announced that the company would send humans to Mars by 2024."
entities = extract_entities(text)
print(f"Entities: {entities}")

In this example, the model identifies and categorizes entities within the text based on the provided prompt.

Example 4: Generating Code Snippets

Prompt engineering can also be used to generate code snippets, helping developers save time and improve productivity.

def generate_code(task_description):
   prompt = f"Generate a Python function to {task_description}.\n\nFunction:"
    response = client.chat.completions.create(
       model="gpt-4o",
messages=[
           {
               "role": "user",
               "Content":prompt,
}
],
       max_tokens=150,
       temperature=0.2
   )
   code = response.choices[0].text.strip()
    return code
# Example usage
task_description = "sort a list of integers in ascending order"

code_snippet = generate_code(task_description)
print(f"Generated Code:\n{code_snippet}")

Here, we prompt the model to generate a Python function for a specified task. The model produces a code snippet based on the task description.

Conclusion

Prompt engineering is a powerful technique that allows you to harness the capabilities of advanced language models for a variety of tasks without the need for extensive machine learning expertise. By crafting specific prompts, you can leverage AI to perform data classification, text summarization, named entity recognition, code generation, and more. The examples provided here demonstrate how to get started with prompt engineering using Python and the OpenAI API. With these techniques, you can unlock the full potential of AI and enhance your software applications.

At IDEA Foundation, we’re constantly expanding our GenAI capabilities. This is our first blog in IDEA GenAI series, stay tuned as we deep dive into prompt engineering advance techniques and other GenAI technologies. Until then – Happy prompting!

This blog is authored by Kanu Malviya, Manager & AI Lead, IDEA Foundation