Repository: JohnSnowLabs/langtest (language: python)

Issue:
Feature/ Negation-Sensitivity
While exploring [BYOD](https://github.com/neelsjain/BYOD/tree/main)  library, we can implement negation task, it checks the sensitivity of model by adding not to sentence or how sensitive the model is to adding negations.

- #560 


Discussion / hints:

Fix patch:
diff --git a/demo/tutorials/llm_notebooks/Sensitivity_Test.ipynb b/demo/tutorials/llm_notebooks/Sensitivity_Test.ipynb
new file mode 100644
index 000000000..123aa0f32
--- /dev/null
+++ b/demo/tutorials/llm_notebooks/Sensitivity_Test.ipynb
@@ -0,0 +1,962 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "![image.png](data:image/png;base64,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)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/langtest/blob/main/demo/tutorials/llm_notebooks/Sensitivity_Test.ipynb)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "**LangTest** is an open-source python library designed to help developers deliver safe and effective Natural Language Processing (NLP) models. Whether you are using **John Snow Labs, Hugging Face, Spacy** models or **OpenAI, Cohere, AI21, Hugging Face Inference API and Azure-OpenAI** based LLMs, it has got you covered. You can test any Named Entity Recognition (NER), Text Classification model using the library. We also support testing LLMS for Question-Answering, Summarization, Clinical-Tests and **Security** tasks on benchmark datasets. The library supports 50+ out of the box tests. These tests fall into robustness, accuracy, bias, representation, toxicity, translation, performance, security, clinical and fairness test categories.\n",
+    "\n",
+    "Metrics are calculated by comparing the model's extractions in the original list of sentences against the extractions carried out in the noisy list of sentences. The original annotated labels are not used at any point, we are simply comparing the model against itself in a 2 settings."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# Getting started with LangTest"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "!pip install \"langtest[evaluate,langchain,openai,transformers]\" "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "!pip install tiktoken"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Tiktoken is a fast BPE tokeniser for use with OpenAI's models."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "import os\n",
+    "\n",
+    "import openai\n",
+    "\n",
+    "os.environ[\"OPENAI_API_KEY\"] = \"<YOUR_API_KEY>\""
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# Harness and Its Parameters\n",
+    "\n",
+    "The Harness class is a testing class for Natural Language Processing (NLP) models. It evaluates the performance of a NLP model on a given task using test data and generates a report with test results.Harness can be imported from the LangTest library in the following way."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from langtest import Harness"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "It imports the Harness class from within the module, that is designed to provide a blueprint or framework for conducting NLP testing, and that instances of the Harness class can be customized or configured for different testing scenarios or environments.\n",
+    "\n",
+    "Here is a list of the different parameters that can be passed to the Harness function:\n",
+    "\n",
+    "<br/>\n",
+    "\n",
+    "| Parameter  | Description |  \n",
+    "| - | - | \n",
+    "|**task**     |Task for which the model is to be evaluated (ex: security)|\n",
+    "| **model**     | Specifies the model(s) to be evaluated. This parameter can be provided as either a dictionary or a list of dictionaries. Each dictionary should contain the following keys: <ul><li>model (mandatory): \tPipelineModel or path to a saved model or pretrained pipeline/model from hub.</li><li>hub (mandatory): Hub (library) to use in back-end for loading model from public models hub or from path (ex: openai, azure-openai, ai21, cohere etc.)</li></ul>|\n",
+    "| **data**      | The data to be used for evaluation. A dictionary providing flexibility and options for data sources. It should include the following keys: <ul><li>data_source (mandatory): The source of the data (ex: Prompt-Injection-Attack)</li><li>subset (optional): The subset of the data.</li><li>feature_column (optional): The column containing the features.</li><li>target_column (optional): The column containing the target labels.</li><li>split (optional): The data split to be used.</li><li>source (optional): Set to 'huggingface' when loading Hugging Face dataset.</li></ul> |\n",
+    "| **config**    | Configuration for the tests to be performed, specified in the form of a YAML file. |\n",
+    "\n",
+    "<br/>\n",
+    "<br/>"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# Evaluating Model's Sensitivity to Negation Test\n",
+    "\n",
+    "In this evaluation, we investigate how a model responds to negations introduced into input text. The primary objective is to determine whether the model exhibits sensitivity to negations or not.\n",
+    "\n",
+    "\n",
+    "1. **Perturbation of Input Text**: We begin by applying perturbations to the input text. Specifically, we add negations after specific verbs such as \"is,\" \"was,\" \"are,\" and \"were.\"\n",
+    "\n",
+    "2. **Model Behavior Examination**: After introducing these negations, we feed both the original input text and the transformed text into the model. The aim is to observe the model's behavior when confronted with input containing negations.\n",
+    "\n",
+    "3. **Evaluation of Model Outputs**:\n",
+    "- *`openai` Hub*: If the model is hosted under the \"openai\" hub, we proceed by calculating the embeddings of both the original and transformed output text. We assess the model's sensitivity to negations using the formula: Sensitivity = (1 - `Cosine Similarity`) which are reflected in `eval_score` column.\n",
+    "    \n",
+    "- *`huggingface` Hub*: In the case where the model is hosted under the \"huggingface\" hub, we first retrieve both the model and the tokenizer from the hub. Next, we encode the text for both the original and transformed input and subsequently calculate the loss between the outputs of the model which are reflected in `eval_score` column.\n",
+    "\n",
+    "By following these steps, we can gauge the model's sensitivity to negations and assess whether it accurately understands and responds to linguistic nuances introduced by negation words."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Running Negation test on `text-davinci-003`"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### Setup and Configure Harness"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Test Configuration : \n",
+      " {\n",
+      " \"tests\": {\n",
+      "  \"defaults\": {\n",
+      "   \"min_pass_rate\": 1.0\n",
+      "  },\n",
+      "  \"sensitivity\": {\n",
+      "   \"sensitivity_negation\": {\n",
+      "    \"min_pass_rate\": 0.7\n",
+      "   }\n",
+      "  }\n",
+      " }\n",
+      "}\n"
+     ]
+    }
+   ],
+   "source": [
+    "model = {\"model\": \"text-davinci-003\", \"hub\":\"openai\"}\n",
+    "\n",
+    "data = {\"data_source\": \"NQ-open-test-tiny\"}\n",
+    "\n",
+    "harness = Harness(task=\"sensitivity-test\", model=model, data=data)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "{'tests': {'defaults': {'min_pass_rate': 1.0, 'threshold': (-0.1, 0.1)},\n",
+       "  'sensitivity': {'sensitivity_negation': {'min_pass_rate': 0.7}}}}"
+      ]
+     },
+     "execution_count": 5,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "harness.configure({\n",
+    "    'tests': {\n",
+    "      'defaults':{\n",
+    "        'min_pass_rate': 1.0,\n",
+    "        \"threshold\":(-0.1,0.1)\n",
+    "      },\n",
+    "      'sensitivity':{\n",
+    "        'sensitivity_negation': {'min_pass_rate': 0.70},\n",
+    "      }\n",
+    "    }\n",
+    "})"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Here we have configured the harness to perform `sensitivity_negation` test and defined the minimum pass rate for the test."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "You can also set prompts and other model parameters in config. Possible parameters are:\n",
+    "\n",
+    "* `threshold:` Default threshold value `(-0.2,0.2)`"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### Generating the test cases."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "Generating testcases...: 100%|██████████| 1/1 [00:00<?, ?it/s]\n",
+      "WARNING:root:Removing samples where no transformation has been applied:\n",
+      "- Test 'sensitivity_negation': 34 samples removed out of 50\n",
+      "\n"
+     ]
+    },
+    {
+     "data": {
+      "text/plain": []
+     },
+     "execution_count": 6,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "harness.generate()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "harness.generate() method automatically generates the test cases (based on the provided configuration)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<div>\n",
+       "<style scoped>\n",
+       "    .dataframe tbody tr th:only-of-type {\n",
+       "        vertical-align: middle;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe tbody tr th {\n",
+       "        vertical-align: top;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe thead th {\n",
+       "        text-align: right;\n",
+       "    }\n",
+       "</style>\n",
+       "<table border=\"1\" class=\"dataframe\">\n",
+       "  <thead>\n",
+       "    <tr style=\"text-align: right;\">\n",
+       "      <th></th>\n",
+       "      <th>category</th>\n",
+       "      <th>test_type</th>\n",
+       "      <th>original</th>\n",
+       "      <th>test_case</th>\n",
+       "    </tr>\n",
+       "  </thead>\n",
+       "  <tbody>\n",
+       "    <tr>\n",
+       "      <th>0</th>\n",
+       "      <td>sensitivity</td>\n",
+       "      <td>sensitivity_negation</td>\n",
+       "      <td>how many 5 star generals are there in the us</td>\n",
+       "      <td>how many 5 star generals are not there in the us</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>1</th>\n",
+       "      <td>sensitivity</td>\n",
+       "      <td>sensitivity_negation</td>\n",
+       "      <td>how many costco locations are there in the us</td>\n",
+       "      <td>how many costco locations are not there in the us</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>2</th>\n",
+       "      <td>sensitivity</td>\n",
+       "      <td>sensitivity_negation</td>\n",
+       "      <td>what is the name of the hat you wear at gradua...</td>\n",
+       "      <td>what is not the name of the hat you wear at gr...</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>3</th>\n",
+       "      <td>sensitivity</td>\n",
+       "      <td>sensitivity_negation</td>\n",
+       "      <td>who is the guy with arrows in avengers</td>\n",
+       "      <td>who is not the guy with arrows in avengers</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>4</th>\n",
+       "      <td>sensitivity</td>\n",
+       "      <td>sensitivity_negation</td>\n",
+       "      <td>what are the rights of a u.s. citizen</td>\n",
+       "      <td>what are not the rights of a u.s. citizen</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>5</th>\n",
+       "      <td>sensitivity</td>\n",
+       "      <td>sensitivity_negation</td>\n",
+       "      <td>who is the protagonist in she stoops to conquer</td>\n",
+       "      <td>who is not the protagonist in she stoops to co...</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>6</th>\n",
+       "      <td>sensitivity</td>\n",
+       "      <td>sensitivity_negation</td>\n",
+       "      <td>we describe the fact that congress is divided ...</td>\n",
+       "      <td>we describe the fact that congress is not divi...</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>7</th>\n",
+       "      <td>sensitivity</td>\n",
+       "      <td>sensitivity_negation</td>\n",
+       "      <td>when is a maine coon cat fully grown</td>\n",
+       "      <td>when is not a maine coon cat fully grown</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>8</th>\n",
+       "      <td>sensitivity</td>\n",
+       "      <td>sensitivity_negation</td>\n",
+       "      <td>what is the full meaning of mips in computer</td>\n",
+       "      <td>what is not the full meaning of mips in computer</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>9</th>\n",
+       "      <td>sensitivity</td>\n",
+       "      <td>sensitivity_negation</td>\n",
+       "      <td>who is the father of hope's baby on the bold a...</td>\n",
+       "      <td>who is not the father of hope's baby on the bo...</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>10</th>\n",
+       "      <td>sensitivity</td>\n",
+       "      <td>sensitivity_negation</td>\n",
+       "      <td>how many movies are in the fast and furious fr...</td>\n",
+       "      <td>how many movies are not in the fast and furiou...</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>11</th>\n",
+       "      <td>sensitivity</td>\n",
+       "      <td>sensitivity_negation</td>\n",
+       "      <td>where is red and yellow soil found in india</td>\n",
+       "      <td>where is not red and yellow soil found in india</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>12</th>\n",
+       "      <td>sensitivity</td>\n",
+       "      <td>sensitivity_negation</td>\n",
+       "      <td>when is the hundredth episode of the flash</td>\n",
+       "      <td>when is not the hundredth episode of the flash</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>13</th>\n",
+       "      <td>sensitivity</td>\n",
+       "      <td>sensitivity_negation</td>\n",
+       "      <td>who was in mary poppins returns that was in th...</td>\n",
+       "      <td>who was not in mary poppins returns that was i...</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>14</th>\n",
+       "      <td>sensitivity</td>\n",
+       "      <td>sensitivity_negation</td>\n",
+       "      <td>what were the 2 sides in ww1 called</td>\n",
+       "      <td>what were not the 2 sides in ww1 called</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>15</th>\n",
+       "      <td>sensitivity</td>\n",
+       "      <td>sensitivity_negation</td>\n",
+       "      <td>the khajuraho temples are especially well know...</td>\n",
+       "      <td>the khajuraho temples are not especially well ...</td>\n",
+       "    </tr>\n",
+       "  </tbody>\n",
+       "</table>\n",
+       "</div>"
+      ],
+      "text/plain": [
+       "       category             test_type  \\\n",
+       "0   sensitivity  sensitivity_negation   \n",
+       "1   sensitivity  sensitivity_negation   \n",
+       "2   sensitivity  sensitivity_negation   \n",
+       "3   sensitivity  sensitivity_negation   \n",
+       "4   sensitivity  sensitivity_negation   \n",
+       "5   sensitivity  sensitivity_negation   \n",
+       "6   sensitivity  sensitivity_negation   \n",
+       "7   sensitivity  sensitivity_negation   \n",
+       "8   sensitivity  sensitivity_negation   \n",
+       "9   sensitivity  sensitivity_negation   \n",
+       "10  sensitivity  sensitivity_negation   \n",
+       "11  sensitivity  sensitivity_negation   \n",
+       "12  sensitivity  sensitivity_negation   \n",
+       "13  sensitivity  sensitivity_negation   \n",
+       "14  sensitivity  sensitivity_negation   \n",
+       "15  sensitivity  sensitivity_negation   \n",
+       "\n",
+       "                                             original  \\\n",
+       "0        how many 5 star generals are there in the us   \n",
+       "1       how many costco locations are there in the us   \n",
+       "2   what is the name of the hat you wear at gradua...   \n",
+       "3              who is the guy with arrows in avengers   \n",
+       "4               what are the rights of a u.s. citizen   \n",
+       "5     who is the protagonist in she stoops to conquer   \n",
+       "6   we describe the fact that congress is divided ...   \n",
+       "7                when is a maine coon cat fully grown   \n",
+       "8        what is the full meaning of mips in computer   \n",
+       "9   who is the father of hope's baby on the bold a...   \n",
+       "10  how many movies are in the fast and furious fr...   \n",
+       "11        where is red and yellow soil found in india   \n",
+       "12         when is the hundredth episode of the flash   \n",
+       "13  who was in mary poppins returns that was in th...   \n",
+       "14                what were the 2 sides in ww1 called   \n",
+       "15  the khajuraho temples are especially well know...   \n",
+       "\n",
+       "                                            test_case  \n",
+       "0    how many 5 star generals are not there in the us  \n",
+       "1   how many costco locations are not there in the us  \n",
+       "2   what is not the name of the hat you wear at gr...  \n",
+       "3          who is not the guy with arrows in avengers  \n",
+       "4           what are not the rights of a u.s. citizen  \n",
+       "5   who is not the protagonist in she stoops to co...  \n",
+       "6   we describe the fact that congress is not divi...  \n",
+       "7            when is not a maine coon cat fully grown  \n",
+       "8    what is not the full meaning of mips in computer  \n",
+       "9   who is not the father of hope's baby on the bo...  \n",
+       "10  how many movies are not in the fast and furiou...  \n",
+       "11    where is not red and yellow soil found in india  \n",
+       "12     when is not the hundredth episode of the flash  \n",
+       "13  who was not in mary poppins returns that was i...  \n",
+       "14            what were not the 2 sides in ww1 called  \n",
+       "15  the khajuraho temples are not especially well ...  "
+      ]
+     },
+     "execution_count": 7,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "harness.testcases()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### Running the tests"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "Running testcases... : 100%|██████████| 16/16 [01:10<00:00,  4.42s/it]\n"
+     ]
+    },
+    {
+     "data": {
+      "text/plain": []
+     },
+     "execution_count": 8,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "harness.run()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Called after harness.generate() and is to used to run all the tests.  Returns a True/False flag for each test. False when the model is not sensitive to negation."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<div>\n",
+       "<style scoped>\n",
+       "    .dataframe tbody tr th:only-of-type {\n",
+       "        vertical-align: middle;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe tbody tr th {\n",
+       "        vertical-align: top;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe thead th {\n",
+       "        text-align: right;\n",
+       "    }\n",
+       "</style>\n",
+       "<table border=\"1\" class=\"dataframe\">\n",
+       "  <thead>\n",
+       "    <tr style=\"text-align: right;\">\n",
+       "      <th></th>\n",
+       "      <th>category</th>\n",
+       "      <th>test_type</th>\n",
+       "      <th>original</th>\n",
+       "      <th>test_case</th>\n",
+       "      <th>expected_result</th>\n",
+       "      <th>actual_result</th>\n",
+       "      <th>eval_score</th>\n",
+       "      <th>pass</th>\n",
+       "    </tr>\n",
+       "  </thead>\n",
+       "  <tbody>\n",
+       "    <tr>\n",
+       "      <th>0</th>\n",
+       "      <td>sensitivity</td>\n",
+       "      <td>sensitivity_negation</td>\n",
+       "      <td>how many 5 star generals are there in the us</td>\n",
+       "      <td>how many 5 star generals are not there in the us</td>\n",
+       "      <td>\\n\\nAs of 2021, there are nine five-star generals in the United States. They are General of the Army George Washington, General of the Army Douglas MacArthur, General of the Army Dwight D. Eisenhower, General of the Army Henry H. Arnold, General of the Army Omar Bradley, General of the Army George C. Marshall, General of the Army Matthew B. Ridgway, General of the Army Maxwell D. Taylor, and General of the Army John J. Pershing.</td>\n",
+       "      <td>\\n\\nThere are currently nine 5-star generals in the United States: General of the Army George Washington, General of the Army Douglas MacArthur, General of the Army Dwight D. Eisenhower, General of the Army Henry H. Arnold, General of the Army Omar Bradley, General of the Army George C. Marshall, General of the Army Matthew B. Ridgway, General of the Army Maxwell D. Taylor, and General of the Army John J. Pershing.</td>\n",
+       "      <td>0.008515</td>\n",
+       "      <td>False</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>1</th>\n",
+       "      <td>sensitivity</td>\n",
+       "      <td>sensitivity_negation</td>\n",
+       "      <td>how many costco locations are there in the us</td>\n",
+       "      <td>how many costco locations are not there in the us</td>\n",
+       "      <td>\\n\\nAs of 2021, there are 566 Costco locations in the United States.</td>\n",
+       "      <td>\\n\\nThere is no definitive answer to this question as Costco does not publicly disclose the exact number of locations in the US. However, according to Statista, as of 2020, there were a total of 788 Costco locations in the US.</td>\n",
+       "      <td>0.081469</td>\n",
+       "      <td>False</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>2</th>\n",
+       "      <td>sensitivity</td>\n",
+       "      <td>sensitivity_negation</td>\n",
+       "      <td>what is the name of the hat you wear at graduation</td>\n",
+       "      <td>what is not the name of the hat you wear at graduation</td>\n",
+       "      <td>\\n\\nThe hat typically worn at graduation ceremonies is called a mortarboard.</td>\n",
+       "      <td>\\n\\nA mortarboard is the name of the hat worn at graduation ceremonies.</td>\n",
+       "      <td>0.028796</td>\n",
+       "      <td>False</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>3</th>\n",
+       "      <td>sensitivity</td>\n",
+       "      <td>sensitivity_negation</td>\n",
+       "      <td>who is the guy with arrows in avengers</td>\n",
+       "      <td>who is not the guy with arrows in avengers</td>\n",
+       "      <td>\\n\\nThe guy with arrows in the Avengers is Hawkeye, a master archer and one of the original members of the team. He is played by actor Jeremy Renner in the Marvel Cinematic Universe.</td>\n",
+       "      <td>\\n\\nHawkeye is the guy with arrows in the Avengers, so the answer is anyone other than Hawkeye.</td>\n",
+       "      <td>0.113902</td>\n",
+       "      <td>True</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>4</th>\n",
+       "      <td>sensitivity</td>\n",
+       "      <td>sensitivity_negation</td>\n",
+       "      <td>what are the rights of a u.s. citizen</td>\n",
+       "      <td>what are not the rights of a u.s. citizen</td>\n",
+       "      <td>\\n\\n1. Right to vote\\n2. Right to free speech\\n3. Right to bear arms\\n4. Right to a fair trial\\n5. Right to privacy\\n6. Right to due process\\n7. Right to travel\\n8. Right to petition the government\\n9. Right to assemble peacefully\\n10. Right to religious freedom</td>\n",
+       "      <td>\\n\\n1. The right to vote in foreign elections\\n2. The right to hold public office in a foreign country\\n3. The right to bear arms in a foreign country\\n4. The right to receive foreign government benefits\\n5. The right to travel to any country without a visa</td>\n",
+       "      <td>0.101056</td>\n",
+       "      <td>True</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>5</th>\n",
+       "      <td>sensitivity</td>\n",
+       "      <td>sensitivity_negation</td>\n",
+       "      <td>who is the protagonist in she stoops to conquer</td>\n",
+       "      <td>who is not the protagonist in she stoops to conquer</td>\n",
+       "      <td>\\n\\nThe protagonist of She Stoops to Conquer is Charles Marlow.</td>\n",
+       "      <td>\\n\\nThe protagonist in She Stoops to Conquer is Charles Marlow. The other main characters are Kate Hardcastle, Tony Lumpkin, and Mrs. Hardcastle.</td>\n",
+       "      <td>0.030905</td>\n",
+       "      <td>False</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>6</th>\n",
+       "      <td>sensitivity</td>\n",
+       "      <td>sensitivity_negation</td>\n",
+       "      <td>we describe the fact that congress is divided in two chambers as being</td>\n",
+       "      <td>we describe the fact that congress is not divided in two chambers as being</td>\n",
+       "      <td>bicameral.\\n\\nBicameralism is a system of government in which the legislature is divided into two separate assemblies, chambers, or houses, known as the Senate and the House of Representatives.</td>\n",
+       "      <td>unicameral. This means that the legislative body is composed of only one chamber or house, rather than two chambers or houses.</td>\n",
+       "      <td>0.130780</td>\n",
+       "      <td>True</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>7</th>\n",
+       "      <td>sensitivity</td>\n",
+       "      <td>sensitivity_negation</td>\n",
+       "      <td>when is a maine coon cat fully grown</td>\n",
+       "      <td>when is not a maine coon cat fully grown</td>\n",
+       "      <td>\\n\\nMaine Coon cats typically reach full physical maturity between 3 and 5 years of age. However, they can continue to grow and fill out until they are 7 years old.</td>\n",
+       "      <td>\\n\\nMaine Coon cats typically reach full physical maturity at around 3 to 5 years of age.</td>\n",
+       "      <td>0.017613</td>\n",
+       "      <td>False</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>8</th>\n",
+       "      <td>sensitivity</td>\n",
+       "      <td>sensitivity_negation</td>\n",
+       "      <td>what is the full meaning of mips in computer</td>\n",
+       "      <td>what is not the full meaning of mips in computer</td>\n",
+       "      <td>\\n\\nMIPS stands for \"Microprocessor without Interlocked Pipeline Stages.\" It is a reduced instruction set computer (RISC) architecture developed by MIPS Technologies.</td>\n",
+       "      <td>\\n\\nMIPs is not the full meaning of anything in computer. It is an acronym for \"Microprocessor without Interlocked Pipeline Stages,\" which is a type of microprocessor architecture.</td>\n",
+       "      <td>0.074022</td>\n",
+       "      <td>False</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>9</th>\n",
+       "      <td>sensitivity</td>\n",
+       "      <td>sensitivity_negation</td>\n",
+       "      <td>who is the father of hope's baby on the bold and beautiful</td>\n",
+       "      <td>who is not the father of hope's baby on the bold and beautiful</td>\n",
+       "      <td>\\n\\nThe father of Hope's baby on The Bold and the Beautiful is Liam Spencer.</td>\n",
+       "      <td>\\n\\nThe father of Hope's baby on The Bold and the Beautiful is Liam Spencer.</td>\n",
+       "      <td>0.000002</td>\n",
+       "      <td>False</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>10</th>\n",
+       "      <td>sensitivity</td>\n",
+       "      <td>sensitivity_negation</td>\n",
+       "      <td>how many movies are in the fast and furious franchise</td>\n",
+       "      <td>how many movies are not in the fast and furious franchise</td>\n",
+       "      <td>\\n\\nThere are currently nine movies in the Fast and Furious franchise: The Fast and the Furious (2001), 2 Fast 2 Furious (2003), The Fast and the Furious: Tokyo Drift (2006), Fast &amp; Furious (2009), Fast Five (2011), Fast &amp; Furious 6 (2013), Furious 7 (2015), The Fate of the Furious (2017), and Fast &amp; Furious 9 (2021).</td>\n",
+       "      <td>\\n\\nThere are hundreds of movies that are not in the Fast and Furious franchise.</td>\n",
+       "      <td>0.147427</td>\n",
+       "      <td>True</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>11</th>\n",
+       "      <td>sensitivity</td>\n",
+       "      <td>sensitivity_negation</td>\n",
+       "      <td>where is red and yellow soil found in india</td>\n",
+       "      <td>where is not red and yellow soil found in india</td>\n",
+       "      <td>\\n\\nRed and yellow soil is found mainly in the Deccan Plateau region of India, which covers parts of the states of Maharashtra, Karnataka, Andhra Pradesh, and Telangana. It is also found in parts of Madhya Pradesh, Gujarat, and Tamil Nadu.</td>\n",
+       "      <td>\\n\\nRed and yellow soil is mainly found in the Deccan Plateau region of India, which includes the states of Maharashtra, Karnataka, Andhra Pradesh, and Telangana.</td>\n",
+       "      <td>0.009769</td>\n",
+       "      <td>False</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>12</th>\n",
+       "      <td>sensitivity</td>\n",
+       "      <td>sensitivity_negation</td>\n",
+       "      <td>when is the hundredth episode of the flash</td>\n",
+       "      <td>when is not the hundredth episode of the flash</td>\n",
+       "      <td>\\n\\nThe hundredth episode of The Flash aired on December 4, 2018.</td>\n",
+       "      <td>\\n\\nThe hundredth episode of The Flash aired on December 10, 2019.</td>\n",
+       "      <td>0.033545</td>\n",
+       "      <td>False</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>13</th>\n",
+       "      <td>sensitivity</td>\n",
+       "      <td>sensitivity_negation</td>\n",
+       "      <td>who was in mary poppins returns that was in the original</td>\n",
+       "      <td>who was not in mary poppins returns that was in the original</td>\n",
+       "      <td>\\n\\nThe only actor to appear in both the original 1964 film Mary Poppins and the 2018 sequel Mary Poppins Returns is Dick Van Dyke, who played the roles of Mr. Dawes Sr. and Mr. Dawes Jr. in the two films.</td>\n",
+       "      <td>\\n\\nDick Van Dyke did not appear in Mary Poppins Returns. He starred in the original 1964 film as Bert.</td>\n",
+       "      <td>0.103622</td>\n",
+       "      <td>True</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>14</th>\n",
+       "      <td>sensitivity</td>\n",
+       "      <td>sensitivity_negation</td>\n",
+       "      <td>what were the 2 sides in ww1 called</td>\n",
+       "      <td>what were not the 2 sides in ww1 called</td>\n",
+       "      <td>\\n\\nThe two sides in World War I were the Allied Powers (also known as the Entente Powers) and the Central Powers.</td>\n",
+       "      <td>\\n\\nWW1 was fought between the Allied Powers (Britain, France, Russia, Italy, and the United States) and the Central Powers (Germany, Austria-Hungary, the Ottoman Empire, and Bulgaria).</td>\n",
+       "      <td>0.072276</td>\n",
+       "      <td>False</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>15</th>\n",
+       "      <td>sensitivity</td>\n",
+       "      <td>sensitivity_negation</td>\n",
+       "      <td>the khajuraho temples are especially well known for their</td>\n",
+       "      <td>the khajuraho temples are not especially well known for their</td>\n",
+       "      <td>erotic sculptures. The temples were built by the Chandela dynasty between 950 and 1050 CE. The temples are dedicated to the Hindu gods Shiva, Vishnu, and Jain Tirthankaras. The sculptures depict a variety of scenes, including gods, goddesses, warriors, musicians, and dancers. The sculptures also depict scenes of everyday life, such as women playing games, farmers harvesting crops, and couples in intimate poses. The erotic sculptures are a small part of the overall temple complex, and are meant to represent the joys of life and the celebration of physical beauty.</td>\n",
+       "      <td>architecture, but rather for their intricate and erotic sculptures. The temples were built between 950 and 1050 AD by the Chandela dynasty. The temples are located in the state of Madhya Pradesh in central India. The temples are divided into three geographical groups, western, eastern and southern. The western group of temples is the largest and most famous, and is known for its erotic sculptures. The eastern group of temples is known for its religious sculptures, while the southern group is known for its ornate sculptures. The temples are a UNESCO World Heritage Site and are considered to be one of the most important monuments of Hindu art.</td>\n",
+       "      <td>0.073476</td>\n",
+       "      <td>False</td>\n",
+       "    </tr>\n",
+       "  </tbody>\n",
+       "</table>\n",
+       "</div>"
+      ],
+      "text/plain": [
+       "       category             test_type  \\\n",
+       "0   sensitivity  sensitivity_negation   \n",
+       "1   sensitivity  sensitivity_negation   \n",
+       "2   sensitivity  sensitivity_negation   \n",
+       "3   sensitivity  sensitivity_negation   \n",
+       "4   sensitivity  sensitivity_negation   \n",
+       "5   sensitivity  sensitivity_negation   \n",
+       "6   sensitivity  sensitivity_negation   \n",
+       "7   sensitivity  sensitivity_negation   \n",
+       "8   sensitivity  sensitivity_negation   \n",
+       "9   sensitivity  sensitivity_negation   \n",
+       "10  sensitivity  sensitivity_negation   \n",
+       "11  sensitivity  sensitivity_negation   \n",
+       "12  sensitivity  sensitivity_negation   \n",
+       "13  sensitivity  sensitivity_negation   \n",
+       "14  sensitivity  sensitivity_negation   \n",
+       "15  sensitivity  sensitivity_negation   \n",
+       "\n",
+       "                                                                  original  \\\n",
+       "0                             how many 5 star generals are there in the us   \n",
+       "1                            how many costco locations are there in the us   \n",
+       "2                       what is the name of the hat you wear at graduation   \n",
+       "3                                   who is the guy with arrows in avengers   \n",
+       "4                                    what are the rights of a u.s. citizen   \n",
+       "5                          who is the protagonist in she stoops to conquer   \n",
+       "6   we describe the fact that congress is divided in two chambers as being   \n",
+       "7                                     when is a maine coon cat fully grown   \n",
+       "8                             what is the full meaning of mips in computer   \n",
+       "9               who is the father of hope's baby on the bold and beautiful   \n",
+       "10                   how many movies are in the fast and furious franchise   \n",
+       "11                             where is red and yellow soil found in india   \n",
+       "12                              when is the hundredth episode of the flash   \n",
+       "13                who was in mary poppins returns that was in the original   \n",
+       "14                                     what were the 2 sides in ww1 called   \n",
+       "15               the khajuraho temples are especially well known for their   \n",
+       "\n",
+       "                                                                     test_case  \\\n",
+       "0                             how many 5 star generals are not there in the us   \n",
+       "1                            how many costco locations are not there in the us   \n",
+       "2                       what is not the name of the hat you wear at graduation   \n",
+       "3                                   who is not the guy with arrows in avengers   \n",
+       "4                                    what are not the rights of a u.s. citizen   \n",
+       "5                          who is not the protagonist in she stoops to conquer   \n",
+       "6   we describe the fact that congress is not divided in two chambers as being   \n",
+       "7                                     when is not a maine coon cat fully grown   \n",
+       "8                             what is not the full meaning of mips in computer   \n",
+       "9               who is not the father of hope's baby on the bold and beautiful   \n",
+       "10                   how many movies are not in the fast and furious franchise   \n",
+       "11                             where is not red and yellow soil found in india   \n",
+       "12                              when is not the hundredth episode of the flash   \n",
+       "13                who was not in mary poppins returns that was in the original   \n",
+       "14                                     what were not the 2 sides in ww1 called   \n",
+       "15               the khajuraho temples are not especially well known for their   \n",
+       "\n",
+       "                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              expected_result  \\\n",
+       "0                                                                                                                                            \\n\\nAs of 2021, there are nine five-star generals in the United States. They are General of the Army George Washington, General of the Army Douglas MacArthur, General of the Army Dwight D. Eisenhower, General of the Army Henry H. Arnold, General of the Army Omar Bradley, General of the Army George C. Marshall, General of the Army Matthew B. Ridgway, General of the Army Maxwell D. Taylor, and General of the Army John J. Pershing.   \n",
+       "1                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        \\n\\nAs of 2021, there are 566 Costco locations in the United States.   \n",
+       "2                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                \\n\\nThe hat typically worn at graduation ceremonies is called a mortarboard.   \n",
+       "3                                                                                                                                                                                                                                                                                                                                                                                                      \\n\\nThe guy with arrows in the Avengers is Hawkeye, a master archer and one of the original members of the team. He is played by actor Jeremy Renner in the Marvel Cinematic Universe.   \n",
+       "4                                                                                                                                                                                                                                                                                                                      \\n\\n1. Right to vote\\n2. Right to free speech\\n3. Right to bear arms\\n4. Right to a fair trial\\n5. Right to privacy\\n6. Right to due process\\n7. Right to travel\\n8. Right to petition the government\\n9. Right to assemble peacefully\\n10. Right to religious freedom   \n",
+       "5                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             \\n\\nThe protagonist of She Stoops to Conquer is Charles Marlow.   \n",
+       "6                                                                                                                                                                                                                                                                                                                                                                                           bicameral.\\n\\nBicameralism is a system of government in which the legislature is divided into two separate assemblies, chambers, or houses, known as the Senate and the House of Representatives.   \n",
+       "7                                                                                                                                                                                                                                                                                                                                                                                                                        \\n\\nMaine Coon cats typically reach full physical maturity between 3 and 5 years of age. However, they can continue to grow and fill out until they are 7 years old.   \n",
+       "8                                                                                                                                                                                                                                                                                                                                                                                                                      \\n\\nMIPS stands for \"Microprocessor without Interlocked Pipeline Stages.\" It is a reduced instruction set computer (RISC) architecture developed by MIPS Technologies.   \n",
+       "9                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                \\n\\nThe father of Hope's baby on The Bold and the Beautiful is Liam Spencer.   \n",
+       "10                                                                                                                                                                                                                                                            \\n\\nThere are currently nine movies in the Fast and Furious franchise: The Fast and the Furious (2001), 2 Fast 2 Furious (2003), The Fast and the Furious: Tokyo Drift (2006), Fast & Furious (2009), Fast Five (2011), Fast & Furious 6 (2013), Furious 7 (2015), The Fate of the Furious (2017), and Fast & Furious 9 (2021).   \n",
+       "11                                                                                                                                                                                                                                                                                                                                            \\n\\nRed and yellow soil is found mainly in the Deccan Plateau region of India, which covers parts of the states of Maharashtra, Karnataka, Andhra Pradesh, and Telangana. It is also found in parts of Madhya Pradesh, Gujarat, and Tamil Nadu.   \n",
+       "12                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          \\n\\nThe hundredth episode of The Flash aired on December 4, 2018.   \n",
+       "13                                                                                                                                                                                                                                                                                                                                                                              \\n\\nThe only actor to appear in both the original 1964 film Mary Poppins and the 2018 sequel Mary Poppins Returns is Dick Van Dyke, who played the roles of Mr. Dawes Sr. and Mr. Dawes Jr. in the two films.   \n",
+       "14                                                                                                                                                                                                                                                                                                                                                                                                                                                                         \\n\\nThe two sides in World War I were the Allied Powers (also known as the Entente Powers) and the Central Powers.   \n",
+       "15   erotic sculptures. The temples were built by the Chandela dynasty between 950 and 1050 CE. The temples are dedicated to the Hindu gods Shiva, Vishnu, and Jain Tirthankaras. The sculptures depict a variety of scenes, including gods, goddesses, warriors, musicians, and dancers. The sculptures also depict scenes of everyday life, such as women playing games, farmers harvesting crops, and couples in intimate poses. The erotic sculptures are a small part of the overall temple complex, and are meant to represent the joys of life and the celebration of physical beauty.   \n",
+       "\n",
+       "                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 actual_result  \\\n",
+       "0                                                                                                                                                                                                                                           \\n\\nThere are currently nine 5-star generals in the United States: General of the Army George Washington, General of the Army Douglas MacArthur, General of the Army Dwight D. Eisenhower, General of the Army Henry H. Arnold, General of the Army Omar Bradley, General of the Army George C. Marshall, General of the Army Matthew B. Ridgway, General of the Army Maxwell D. Taylor, and General of the Army John J. Pershing.   \n",
+       "1                                                                                                                                                                                                                                                                                                                                                                                                                                           \\n\\nThere is no definitive answer to this question as Costco does not publicly disclose the exact number of locations in the US. However, according to Statista, as of 2020, there were a total of 788 Costco locations in the US.   \n",
+       "2                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      \\n\\nA mortarboard is the name of the hat worn at graduation ceremonies.   \n",
+       "3                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              \\n\\nHawkeye is the guy with arrows in the Avengers, so the answer is anyone other than Hawkeye.   \n",
+       "4                                                                                                                                                                                                                                                                                                                                                                                                            \\n\\n1. The right to vote in foreign elections\\n2. The right to hold public office in a foreign country\\n3. The right to bear arms in a foreign country\\n4. The right to receive foreign government benefits\\n5. The right to travel to any country without a visa   \n",
+       "5                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            \\n\\nThe protagonist in She Stoops to Conquer is Charles Marlow. The other main characters are Kate Hardcastle, Tony Lumpkin, and Mrs. Hardcastle.   \n",
+       "6                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               unicameral. This means that the legislative body is composed of only one chamber or house, rather than two chambers or houses.   \n",
+       "7                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    \\n\\nMaine Coon cats typically reach full physical maturity at around 3 to 5 years of age.   \n",
+       "8                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         \\n\\nMIPs is not the full meaning of anything in computer. It is an acronym for \"Microprocessor without Interlocked Pipeline Stages,\" which is a type of microprocessor architecture.   \n",
+       "9                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 \\n\\nThe father of Hope's baby on The Bold and the Beautiful is Liam Spencer.   \n",
+       "10                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            \\n\\nThere are hundreds of movies that are not in the Fast and Furious franchise.   \n",
+       "11                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          \\n\\nRed and yellow soil is mainly found in the Deccan Plateau region of India, which includes the states of Maharashtra, Karnataka, Andhra Pradesh, and Telangana.   \n",
+       "12                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          \\n\\nThe hundredth episode of The Flash aired on December 10, 2019.   \n",
+       "13                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     \\n\\nDick Van Dyke did not appear in Mary Poppins Returns. He starred in the original 1964 film as Bert.   \n",
+       "14                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   \\n\\nWW1 was fought between the Allied Powers (Britain, France, Russia, Italy, and the United States) and the Central Powers (Germany, Austria-Hungary, the Ottoman Empire, and Bulgaria).   \n",
+       "15   architecture, but rather for their intricate and erotic sculptures. The temples were built between 950 and 1050 AD by the Chandela dynasty. The temples are located in the state of Madhya Pradesh in central India. The temples are divided into three geographical groups, western, eastern and southern. The western group of temples is the largest and most famous, and is known for its erotic sculptures. The eastern group of temples is known for its religious sculptures, while the southern group is known for its ornate sculptures. The temples are a UNESCO World Heritage Site and are considered to be one of the most important monuments of Hindu art.   \n",
+       "\n",
+       "    eval_score   pass  \n",
+       "0     0.008515  False  \n",
+       "1     0.081469  False  \n",
+       "2     0.028796  False  \n",
+       "3     0.113902   True  \n",
+       "4     0.101056   True  \n",
+       "5     0.030905  False  \n",
+       "6     0.130780   True  \n",
+       "7     0.017613  False  \n",
+       "8     0.074022  False  \n",
+       "9     0.000002  False  \n",
+       "10    0.147427   True  \n",
+       "11    0.009769  False  \n",
+       "12    0.033545  False  \n",
+       "13    0.103622   True  \n",
+       "14    0.072276  False  \n",
+       "15    0.073476  False  "
+      ]
+     },
+     "execution_count": 10,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "harness.generated_results()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "This method returns the generated results in the form of a pandas dataframe, which provides a convenient and easy-to-use format for working with the test results. You can use this method to quickly identify the test cases that failed and to determine where fixes are needed."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### Final Results\n",
+    "\n",
+    "We can call `.report()` which summarizes the results giving information about pass and fail counts and overall test pass/fail flag."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 13,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<div>\n",
+       "<style scoped>\n",
+       "    .dataframe tbody tr th:only-of-type {\n",
+       "        vertical-align: middle;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe tbody tr th {\n",
+       "        vertical-align: top;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe thead th {\n",
+       "        text-align: right;\n",
+       "    }\n",
+       "</style>\n",
+       "<table border=\"1\" class=\"dataframe\">\n",
+       "  <thead>\n",
+       "    <tr style=\"text-align: right;\">\n",
+       "      <th></th>\n",
+       "      <th>category</th>\n",
+       "      <th>test_type</th>\n",
+       "      <th>fail_count</th>\n",
+       "      <th>pass_count</th>\n",
+       "      <th>pass_rate</th>\n",
+       "      <th>minimum_pass_rate</th>\n",
+       "      <th>pass</th>\n",
+       "    </tr>\n",
+       "  </thead>\n",
+       "  <tbody>\n",
+       "    <tr>\n",
+       "      <th>0</th>\n",
+       "      <td>sensitivity</td>\n",
+       "      <td>sensitivity_negation</td>\n",
+       "      <td>11</td>\n",
+       "      <td>5</td>\n",
+       "      <td>31%</td>\n",
+       "      <td>70%</td>\n",
+       "      <td>False</td>\n",
+       "    </tr>\n",
+       "  </tbody>\n",
+       "</table>\n",
+       "</div>"
+      ],
+      "text/plain": [
+       "      category             test_type  fail_count  pass_count pass_rate  \\\n",
+       "0  sensitivity  sensitivity_negation          11           5       31%   \n",
+       "\n",
+       "  minimum_pass_rate   pass  \n",
+       "0               70%  False  "
+      ]
+     },
+     "execution_count": 13,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "harness.report()"
+   ]
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "lll",
+   "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.4"
+  },
+  "orig_nbformat": 4
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}


Test patch:
diff --git a/langtest/data/config/sensitivity_config.yml b/langtest/data/config/sensitivity_config.yml
new file mode 100644
index 000000000..c6e143289
--- /dev/null
+++ b/langtest/data/config/sensitivity_config.yml
@@ -0,0 +1,7 @@
+tests:
+  defaults:
+    min_pass_rate: 1.0
+
+  sensitivity:
+    sensitivity_negation:
+      min_pass_rate: 0.70
diff --git a/langtest/datahandler/datasource.py b/langtest/datahandler/datasource.py
index 8457ac75e..16c2fa4e5 100644
--- a/langtest/datahandler/datasource.py
+++ b/langtest/datahandler/datasource.py
@@ -28,6 +28,7 @@
     ClinicalSample,
     SecuritySample,
     DisinformationSample,
+    SensitivitySample,
     WinoBiasSample,
     LegalSample,
     FactualitySample,
@@ -72,6 +73,7 @@
         "hypothesis": ["hypothesis", "thesis"],
         "statements": ["statements", "headlines"],
     },
+    "sensitivity-test": {"text": ["text", "question"]},
     "wino-bias": {
         "text": ["text"],
     },
@@ -1151,6 +1153,7 @@ class JSONLDataset(_IDataset):
         "security",
         "clinical-tests",
         "disinformation-test",
+        "sensitivity-test",
         "wino-bias",
         "legal-tests",
         "factuality-test",
@@ -1291,6 +1294,10 @@ def load_data(self) -> List[Sample]:
                             task=self.task,
                             dataset_name=self._file_path.split("/")[-2],
                         )
+                    ),
+                elif self.task == "sensitivity-test":
+                    data.append(
+                        SensitivitySample(original=item[self.column_matcher["text"]])
                     )
 
                 elif self.task == "wino-bias":
diff --git a/langtest/langtest.py b/langtest/langtest.py
index d292da761..60325e91f 100644
--- a/langtest/langtest.py
+++ b/langtest/langtest.py
@@ -41,6 +41,7 @@ class Harness:
         "clinical-tests",
         "disinformation-test",
         "political",
+        "sensitivity-test",
         "wino-bias",
         "legal-tests",
         "factuality-test",
@@ -123,6 +124,9 @@ class Harness:
                 "langtest", "data/config/translation_johnsnowlabs_config.yml"
             ),
             "security": resource_filename("langtest", "data/config/security_config.yml"),
+            "sensitivity-test": resource_filename(
+                "langtest", "data/config/sensitivity_config.yml"
+            ),
         },
     }
 
@@ -279,7 +283,8 @@ def __init__(
                 self._config = self.configure(self.DEFAULTS_CONFIG["hubs"][hub])
         elif task == "translation":
             self._config = self.configure(self.DEFAULTS_CONFIG["task"][task + "-" + hub])
-
+        elif task == "sensitivity-test":
+            self._config = self.configure(self.DEFAULTS_CONFIG["task"][task])
         else:
             logging.info("No configuration file was provided, loading default config.")
             self._config = self.configure(
diff --git a/langtest/modelhandler/llm_modelhandler.py b/langtest/modelhandler/llm_modelhandler.py
index 214900e95..18632b1f6 100644
--- a/langtest/modelhandler/llm_modelhandler.py
+++ b/langtest/modelhandler/llm_modelhandler.py
@@ -5,6 +5,11 @@
 from pydantic import ValidationError
 from ..modelhandler.modelhandler import _ModelHandler, LANGCHAIN_HUBS
 
+from ..utils.util_metrics import cosine_similarity
+from langchain import OpenAI
+from langchain.embeddings import OpenAIEmbeddings
+import os
+
 
 class PretrainedModelForQA(_ModelHandler):
     """A class representing a pretrained model for question answering.
@@ -202,6 +207,117 @@ class PretrainedModelForPolitical(PretrainedModelForQA, _ModelHandler):
     pass
 
 
+class PretrainedModelForSensitivityTest(_ModelHandler):
+    """
+    A class for sensitivity testing using a pretrained model and embeddings.
+
+    Args:
+        model (tuple): A tuple containing the pretrained language model and embeddings model.
+
+    Raises:
+        ValueError: If the input 'model' is not a tuple.
+
+    Attributes:
+        model: The pretrained language model.
+        embeddings_model: The embeddings model.
+
+    Methods:
+        load_model(cls, path):
+            Load the pretrained language model and embeddings model from a given path.
+        predict(self, text, text_transformed, **kwargs):
+            Predict the sensitivity of the model to text transformations.
+    """
+
+    def __init__(self, model: str):
+        """
+        Initialize the PretrainedModelForSensitivityTest.
+
+        Args:
+            model (tuple): A tuple containing the pretrained language model and embeddings model.
+
+        Raises:
+            ValueError: If the input 'model' is not a tuple.
+        """
+
+        self.model, self.embeddings_model = model
+
+    @classmethod
+    def load_model(cls, path: str) -> tuple:
+        """
+        Load the pretrained language model and embeddings model from a given path.
+
+        Args:
+            path (str): The path to the model files.
+
+        Returns:
+            tuple: A tuple containing the pretrained language model and embeddings model.
+
+        Raises:
+            ValueError: If the 'OPENAI_API_KEY' environment variable is not set.
+        """
+        try:
+            llm = OpenAI(
+                model_name=path,
+                temperature=0,
+                openai_api_key=os.environ["OPENAI_API_KEY"],
+            )
+            embeddings_model = OpenAIEmbeddings(
+                model="text-embedding-ada-002",
+                openai_api_key=os.environ["OPENAI_API_KEY"],
+            )
+            return llm, embeddings_model
+        except KeyError:
+            raise ValueError("The 'OPENAI_API_KEY' environment variable is not set.")
+
+    def predict(self, text: str, text_transformed: str, **kwargs):
+        """
+        Predict the sensitivity of the model to text transformations.
+
+        Args:
+            text (str): The original text.
+            text_transformed (str): The transformed text.
+
+        Returns:
+            dict: A dictionary containing the loss difference, expected result, and actual result.
+                - 'loss_diff' (float): The cosine similarity-based loss difference.
+                - 'expected_result' (str): The model's output for the original text.
+                - 'actual_result' (str): The model's output for the transformed text.
+        """
+
+        expected_result = self.model(text)
+        actual_result = self.model(text_transformed)
+
+        expected_result_embeddings = self.embeddings_model.embed_documents(
+            [expected_result]
+        )
+        actual_result_embeddings = self.embeddings_model.embed_documents([actual_result])
+
+        loss = 1 - cosine_similarity(expected_result_embeddings, actual_result_embeddings)
+
+        return {
+            "loss_diff": loss[0],
+            "expected_result": expected_result,
+            "actual_result": actual_result,
+        }
+
+    def __call__(self, text: str, text_transformed: str, **kwargs):
+        """
+        Alias of the 'predict' method.
+
+        Args:
+            text (str): The original text.
+            text_transformed (str): The transformed text.
+
+        Returns:
+            dict: A dictionary containing the loss difference, expected result, and actual result.
+                - 'loss_diff' (float): The cosine similarity-based loss difference.
+                - 'expected_result' (str): The model's output for the original text.
+                - 'actual_result' (str): The model's output for the transformed text.
+        """
+
+        return self.predict(text=text, text_transformed=text_transformed, **kwargs)
+
+
 class PretrainedModelForWinoBias(PretrainedModelForQA, _ModelHandler):
     """A class representing a pretrained model for wino-bias detection.
 
diff --git a/langtest/modelhandler/modelhandler.py b/langtest/modelhandler/modelhandler.py
index 9f8887c8b..66e490a53 100644
--- a/langtest/modelhandler/modelhandler.py
+++ b/langtest/modelhandler/modelhandler.py
@@ -54,6 +54,7 @@ class ModelFactory:
         "clinical-tests",
         "disinformation-test",
         "political",
+        "sensitivity-test",
         "wino-bias",
         "legal-tests",
         "factuality-test",
@@ -91,8 +92,11 @@ def __init__(self, model: str, task: str, hub: str, *args, **kwargs):
         assert task in self.SUPPORTED_TASKS, ValueError(
             f"Task '{task}' not supported. Please choose one of: {', '.join(self.SUPPORTED_TASKS)}"
         )
+        if isinstance(model, tuple):
+            module_name = model[0].__module__.split(".")[0]
+        else:
+            module_name = model.__module__.split(".")[0]
 
-        module_name = model.__module__.split(".")[0]
         assert module_name in self.SUPPORTED_MODULES, ValueError(
             f"Module '{module_name}' is not supported. "
             f"Please choose one of: {', '.join(self.SUPPORTED_MODULES)}"
@@ -162,6 +166,8 @@ def __init__(self, model: str, task: str, hub: str, *args, **kwargs):
             self.model_class = model_handler.PretrainedModelForSecurity(
                 hub, model, *args, **kwargs
             )
+        elif task == "sensitivity-test":
+            self.model_class = model_handler.PretrainedModelForSensitivityTest(model)
 
         elif task == "wino-bias":
             self.model_class = model_handler.PretrainedModelForWinoBias(model)
@@ -285,6 +291,10 @@ def load_model(
                 )
             )
 
+        elif task == "sensitivity-test":
+            model_class = (
+                modelhandler_module.PretrainedModelForSensitivityTest.load_model(path)
+            )
         elif task in ("wino-bias"):
             model_class = modelhandler_module.PretrainedModelForWinoBias.load_model(path)
 
diff --git a/langtest/modelhandler/transformers_modelhandler.py b/langtest/modelhandler/transformers_modelhandler.py
index c43c5023f..750823f7b 100644
--- a/langtest/modelhandler/transformers_modelhandler.py
+++ b/langtest/modelhandler/transformers_modelhandler.py
@@ -10,6 +10,7 @@
     SequenceClassificationOutput,
     TranslationOutput,
 )
+
 from langtest.utils.lib_manager import try_import_lib
 import importlib
 
@@ -526,3 +527,101 @@ class PretrainedModelForFactualityTest(PretrainedModelForQA, _ModelHandler):
     """
 
     pass
+
+
+class PretrainedModelForSensitivityTest(_ModelHandler):
+    """A class for handling a pretrained model for sensitivity testing.
+
+    This class wraps a pretrained transformer model for performing sensitivity testing
+
+    Args:
+        model (tuple): A tuple containing the model and tokenizer.
+
+    Raises:
+        ValueError: If the input model is not a tuple.
+
+    Attributes:
+        model (Any): The pretrained transformer model.
+        tokenizer (Any): The tokenizer associated with the model.
+
+    """
+
+    def __init__(self, model):
+        """Initialize a PretrainedModelForSensitivityTest instance.
+
+        Args:
+            model (tuple): A tuple containing the model and tokenizer.
+
+        Raises:
+            ValueError: If the input model is not a tuple.
+
+        """
+        assert isinstance(model, tuple), ValueError(
+            f"Invalid transformers pipeline! "
+            f"Pipeline should be '{Pipeline}', passed model is: '{type(model)}'"
+        )
+
+        self.model, self.tokenizer = model
+
+    @classmethod
+    def load_model(cls, path: str):
+        """Load the model into the `model` attribute.
+
+        Args:
+            path (str): Path to model or model name.
+
+        Returns:
+            tuple: A tuple containing the loaded model and tokenizer.
+        """
+        from ..utils.hf_model_n_tokenizer import get_model_n_tokenizer
+
+        model, tokenizer = get_model_n_tokenizer(model_name=path)
+        return model, tokenizer
+
+    def predict(self, text: str, text_transformed: str, **kwargs):
+        """Perform predictions on the input text.
+
+        Args:
+            text (str): Input text to perform NER on.
+            text_transformed (str): Transformed input text.
+            kwargs: Additional keyword arguments.
+
+        Returns:
+            dict: A dictionary containing the following keys:
+                - 'loss_diff' (float): Difference in loss between transformed and original text.
+                - 'expected_result' (str): Decoded result from the original text.
+                - 'actual_result' (str): Decoded result from the transformed text.
+
+        """
+        self.model.eval()
+
+        input_encoded = self.tokenizer(
+            text, return_tensors="pt", truncation=True, max_length=128
+        ).to(self.model.device)
+        input_encoded_transformed = self.tokenizer(
+            text_transformed, return_tensors="pt", truncation=True, max_length=128
+        ).to(self.model.device)
+
+        outputs = self.model(**input_encoded, labels=input_encoded["input_ids"])
+        outputs_transformed = self.model(
+            **input_encoded_transformed, labels=input_encoded_transformed["input_ids"]
+        )
+        loss_diff = outputs_transformed.loss.item() - outputs.loss.item()
+
+        expected_result = self.tokenizer.decode(
+            outputs.logits[0].argmax(dim=-1), skip_special_tokens=True
+        )
+        actual_result = self.tokenizer.decode(
+            outputs_transformed.logits[0].argmax(dim=-1), skip_special_tokens=True
+        )
+
+        return {
+            "loss_diff": loss_diff,
+            "expected_result": expected_result,
+            "actual_result": actual_result,
+        }
+
+    def __call__(self, text: str, text_transformed: str, **kwargs):
+        """Alias of the 'predict' method."""
+
+        return self.predict(text=text, text_transformed=text_transformed, **kwargs)
diff --git a/langtest/transform/__init__.py b/langtest/transform/__init__.py
index 512bc7354..cb4bd1192 100644
--- a/langtest/transform/__init__.py
+++ b/langtest/transform/__init__.py
@@ -21,6 +21,7 @@
 from .robustness import BaseRobustness
 from .toxicity import BaseToxicity
 from .political import BasePolitical
+from .sensitivity import BaseSensitivity
 from .constants import (
     A2B_DICT,
     asian_names,
@@ -1589,6 +1590,116 @@ def available_tests() -> Dict:
         return tests
 
 
+class SensitivityTestFactory(ITests):
+    """A class for performing Sensitivity tests on a given dataset.
+
+    This class provides functionality to perform sensitivity tests on a given dataset
+    using various test configurations.
+
+    Attributes:
+        alias_name (str): A string representing the alias name for this test factory.
+
+    """
+
+    alias_name = "sensitivity"
+
+    def __init__(self, data_handler: List[Sample], tests: Dict = None, **kwargs) -> None:
+        """Initialize a new SensitivityTestFactory instance.
+
+        Args:
+            data_handler (List[Sample]): A list of `Sample` objects representing the input dataset.
+            tests (Optional[Dict]): A dictionary of test names and corresponding parameters (default is None).
+            **kwargs: Additional keyword arguments.
+
+        Raises:
+            ValueError: If the `tests` argument is not a dictionary.
+
+        """
+
+        self.supported_tests = self.available_tests()
+        self._data_handler = data_handler
+        self.tests = tests
+        self.kwargs = kwargs
+
+        if not isinstance(self.tests, dict):
+            raise ValueError(
+                "Invalid test configuration! Tests can be "
+                "[1] dictionary of test name and corresponding parameters."
+            )
+
+        if len(self.tests) == 0:
+            self.tests = self.supported_tests
+
+        not_supported_tests = set(self.tests) - set(self.supported_tests)
+        if len(not_supported_tests) > 0:
+            raise ValueError(
+                f"Invalid test specification: {not_supported_tests}. Available tests are: {list(self.supported_tests.keys())}"
+            )
+
+    def transform(self) -> List[Sample]:
+        """Run the sensitivity test and return the resulting `Sample` objects.
+
+        Returns:
+            List[Sample]: A list of `Sample` objects representing the resulting dataset after running the sensitivity test.
+
+        """
+        all_samples = []
+        no_transformation_applied_tests = {}
+        tests_copy = self.tests.copy()
+        for test_name, params in tests_copy.items():
+            if TestFactory.is_augment:
+                data_handler_copy = [x.copy() for x in self._data_handler]
+            else:
+                data_handler_copy = [x.copy() for x in self._data_handler]
+
+            test_func = self.supported_tests[test_name].transform
+
+            if TestFactory.task in ("sensitivity-test"):
+                _ = [
+                    sample.transform(
+                        test_func,
+                        params.get("parameters", {}),
+                    )
+                    if hasattr(sample, "transform")
+                    else sample
+                    for sample in data_handler_copy
+                ]
+                transformed_samples = data_handler_copy
+
+            new_transformed_samples, removed_samples_tests = filter_unique_samples(
+                TestFactory.task, transformed_samples, test_name
+            )
+            all_samples.extend(new_transformed_samples)
+
+            no_transformation_applied_tests.update(removed_samples_tests)
+
+        if no_transformation_applied_tests:
+            warning_message = (
+                "Removing samples where no transformation has been applied:\n"
+            )
+            for test, count in no_transformation_applied_tests.items():
+                warning_message += f"- Test '{test}': {count} samples removed out of {len(self._data_handler)}\n"
+
+            logging.warning(warning_message)
+
+        return all_samples
+
+    @staticmethod
+    def available_tests() -> dict:
+        """
+        Get a dictionary of all available tests, with their names as keys and their corresponding classes as values.
+
+        Returns:
+            dict: A dictionary of test names and classes.
+        """
+        tests = {
+            j: i
+            for i in BaseSensitivity.__subclasses__()
+            for j in (i.alias_name if isinstance(i.alias_name, list) else [i.alias_name])
+        }
+        return tests
+
+
 class WinoBiasTestFactory(ITests):
     """Factory class for the wino-bias tests"""
 
diff --git a/langtest/transform/sensitivity.py b/langtest/transform/sensitivity.py
new file mode 100644
index 000000000..95a81a96b
--- /dev/null
+++ b/langtest/transform/sensitivity.py
@@ -0,0 +1,129 @@
+import asyncio
+from abc import ABC, abstractmethod
+from typing import List
+from langtest.modelhandler.modelhandler import ModelFactory
+from ..utils.custom_types import Sample
+
+
+class BaseSensitivity(ABC):
+    """Abstract base class for implementing sensitivity measures.
+
+    Attributes:
+        alias_name (str): A name or list of names that identify the sensitivity measure.
+
+    Methods:
+        transform(data: List[Sample]) -> Any: Transforms the input data into an output based on the implemented sensitivity measure.
+    """
+
+    alias_name = None
+    supported_tasks = [
+        "sensitivity-test",
+    ]
+
+    @staticmethod
+    @abstractmethod
+    def transform(sample_list: List[Sample]) -> List[Sample]:
+        """Abstract method that implements the sensitivity measure.
+
+        Args:
+            sample_list (List[Sample]): The input data to be transformed.
+
+        Returns:
+            Any: The transformed data based on the implemented sensitivity measure.
+        """
+        raise NotImplementedError()
+
+    @staticmethod
+    @abstractmethod
+    async def run(
+        sample_list: List[Sample], model: ModelFactory, **kwargs
+    ) -> List[Sample]:
+        """Abstract method that implements the sensitivity measure.
+
+        Args:
+            sample_list (List[Sample]): The input data to be transformed.
+            model (ModelFactory): The model to be used for evaluation.
+            **kwargs: Additional arguments to be passed to the sensitivity measure.
+
+        Returns:
+            List[Sample]: The transformed data based on the implemented sensitivity measure.
+
+        """
+        progress = kwargs.get("progress_bar", False)
+        for sample in sample_list:
+            if sample.state != "done":
+                if hasattr(sample, "run"):
+                    sample_status = sample.run(model, **kwargs)
+                    if sample_status:
+                        sample.state = "done"
+                else:
+                    sample.expected_results = model(sample.original)
+                    sample.actual_results = model(sample.test_case)
+                    sample.state = "done"
+            if progress:
+                progress.update(1)
+        return sample_list
+
+    @classmethod
+    async def async_run(cls, sample_list: List[Sample], model: ModelFactory, **kwargs):
+        """Creates a task to run the sensitivity measure.
+
+        Args:
+            sample_list (List[Sample]): The input data to be transformed.
+            model (ModelFactory): The model to be used for evaluation.
+            **kwargs: Additional arguments to be passed to the sensitivity measure.
+
+        Returns:
+            asyncio.Task: The task that runs the sensitivity measure.
+
+        """
+        created_task = asyncio.create_task(cls.run(sample_list, model, **kwargs))
+        return created_task
+
+
+class SensitivityNegation(BaseSensitivity):
+    """A class for negating sensitivity-related phrases in the input text.
+
+    This class identifies common sensitivity-related phrases such as 'is', 'was', 'are', and 'were' in the input text
+    and replaces them with their negations to make the text less sensitive.
+
+    Attributes:
+        alias_name (str): The alias name for this sensitivity transformation.
+
+    Methods:
+        transform(sample_list: List[Sample]) -> List[Sample]: Applies the sensitivity negation transformation to a list
+            of samples.
+    """
+
+    alias_name = "sensitivity_negation"
+
+    @staticmethod
+    def transform(sample_list: List[Sample]) -> List[Sample]:
+        def apply_transformation(perturbed_text):
+            """
+            Filters the dataset for 'is', 'was', 'are', or 'were' and negates them.
+
+            Args:
+                perturbed_text (str): The input text to be transformed.
+
+            Returns:
+                str: The transformed text with sensitivity-related phrases negated.
+            """
+            transformations = {
+                " is ": " is not ",
+                " was ": " was not ",
+                " are ": " are not ",
+                " were ": " were not ",
+            }
+
+            for keyword, replacement in transformations.items():
+                if keyword in perturbed_text and replacement not in perturbed_text:
+                    perturbed_text = perturbed_text.replace(keyword, replacement, 1)
+
+            return perturbed_text
+
+        for idx, sample in enumerate(sample_list):
+            if isinstance(sample, str):
+                sample_list[idx] = apply_transformation(sample)
+
+        return sample_list
diff --git a/langtest/utils/custom_types/__init__.py b/langtest/utils/custom_types/__init__.py
index 53345af29..929b997e0 100644
--- a/langtest/utils/custom_types/__init__.py
+++ b/langtest/utils/custom_types/__init__.py
@@ -14,6 +14,7 @@
     ClinicalSample,
     LLMAnswerSample,
     DisinformationSample,
+    SensitivitySample,
     WinoBiasSample,
     LegalSample,
     FactualitySample,
diff --git a/langtest/utils/custom_types/sample.py b/langtest/utils/custom_types/sample.py
index 9c62167e0..bb0167d2c 100644
--- a/langtest/utils/custom_types/sample.py
+++ b/langtest/utils/custom_types/sample.py
@@ -1697,6 +1697,127 @@ def run(self, model, **kwargs):
         return True
 
 
+class SensitivitySample(BaseModel):
+    """
+    A class representing a sample for sensitivity task.
+
+    Attributes:
+        original (str): The original text input.
+        test_case (str): The transformed text input for testing.
+        state (str): The state of the sample.
+        dataset_name (str): The name of the dataset the sample belongs to.
+        task (str): The type of task, default is "sensitivity-test".
+        category (str): The category or module name associated with the sample.
+        test_type (str): The type of test being performed.
+        expected_result (Result): The expected result of the sensitivity test.
+        actual_result (Result): The actual result obtained from the sensitivity test.
+        loss_diff (float): The difference in loss between expected and actual results.
+
+    Methods:
+        to_dict(self) -> Dict[str, Any]:
+            Convert the SensitivitySample instance to a dictionary.
+
+        is_pass(self) -> bool:
+            Check if the sensitivity test passes based on loss difference threshold.
+
+        run(self, model, **kwargs) -> bool:
+            Run the sensitivity test using the provided model.
+
+        transform(self, func: Callable, params: Dict, **kwargs):
+            Transform the original text using a specified function.
+
+    """
+
+    original: str = None
+    test_case: str = None
+    state: str = None
+    dataset_name: str = None
+    task: str = Field(default="sensitivity", constr=True)
+    category: str = None
+    test_type: str = None
+    expected_result: Result = None
+    actual_result: Result = None
+    loss_diff: float = None
+
+    def __init__(self, **data):
+        super().__init__(**data)
+
+    def to_dict(self) -> Dict[str, Any]:
+        """
+        Convert the SensitivitySample instance to a dictionary.
+
+        Returns:
+            Dict[str, Any]: A dictionary representation of the sample.
+        """
+        result = {
+            "original": self.original,
+            "test_case": self.test_case,
+            "category": self.category,
+            "test_type": self.test_type,
+        }
+
+        if self.expected_result is not None and self.actual_result is not None:
+            bool_pass = self.is_pass()
+            result.update(
+                {
+                    "expected_result": self.expected_result,
+                    "actual_result": self.actual_result,
+                    "eval_score": self.loss_diff,
+                    "pass": bool_pass,
+                }
+            )
+
+        return result
+
+    def is_pass(self):
+        """
+        Check if the sensitivity test passes based on loss difference threshold.
+
+        Returns:
+            bool: True if the test passes, False otherwise.
+        """
+        from ...langtest import HARNESS_CONFIG as harness_config
+
+        config = harness_config["tests"]["defaults"]
+        min_range, max_range = config.get("threshold", (-0.2, 0.2))
+
+        if min_range <= self.loss_diff <= max_range:
+            return False
+        else:
+            return True
+
+    def run(self, model, **kwargs):
+        """
+        Run the sensitivity test using the provided model.
+
+        Args:
+            model: The model used for sensitivity testing.
+            **kwargs: Additional keyword arguments for the model.
+
+        Returns:
+            bool: True if the test was successful, False otherwise.
+        """
+        op = model(text=self.original, text_transformed=self.test_case)
+        self.expected_result = op["expected_result"]
+        self.actual_result = op["actual_result"]
+        self.loss_diff = op["loss_diff"]
+        return True
+
+    def transform(self, func: Callable, params: Dict, **kwargs):
+        """
+        Transform the original text using a specified function.
+
+        Args:
+            func (Callable): The transformation function.
+            params (Dict): Parameters for the transformation function.
+            **kwargs: Additional keyword arguments for the transformation.
+
+        """
+        sens = [self.original]
+        self.test_case = func(sens, **params, **kwargs)[0]
+        self.category = func.__module__.split(".")[-1]
+
+
 Sample = TypeVar(
     "Sample",
     MaxScoreSample,
@@ -1706,4 +1827,6 @@ def run(self, model, **kwargs):
     SummarizationSample,
     LLMAnswerSample,
     FactualitySample,
+    DisinformationSample,
+    SensitivitySample,
 )
diff --git a/langtest/utils/hf_model_n_tokenizer.py b/langtest/utils/hf_model_n_tokenizer.py
new file mode 100644
index 000000000..d84123834
--- /dev/null
+++ b/langtest/utils/hf_model_n_tokenizer.py
@@ -0,0 +1,50 @@
+from transformers import AutoTokenizer, AutoModelForCausalLM, AutoModelForSeq2SeqLM
+import os
+from huggingface_hub import login
+
+
+class GatedRepoAccessError(Exception):
+    """
+    Exception raised when there is an attempt to access a gated Hugging Face repository without proper authorization.
+    """
+
+    pass
+
+
+def get_model_n_tokenizer(model_name):
+    """
+    Load a pre-trained model and tokenizer from Hugging Face Model Hub.
+
+    Args:
+        model_name (str): The name or identifier of the pre-trained model.
+
+    Returns:
+        tuple: A tuple containing the loaded model and tokenizer.
+            - model: The loaded pre-trained model.
+            - tokenizer: The tokenizer associated with the model.
+
+    Raises:
+        GatedRepoAccessError: If there is an attempt to access a gated repository without proper authorization.
+    """
+    if "HUGGINGFACEHUB_API_TOKEN" in os.environ:
+        login(os.environ["HUGGINGFACEHUB_API_TOKEN"])
+
+    try:
+        # Try loading the model as AutoModelForCausalLM
+        model = AutoModelForCausalLM.from_pretrained(model_name)
+
+    except ValueError:
+        # Try loading the model as AutoModelForSeq2SeqLM
+        model = AutoModelForSeq2SeqLM.from_pretrained(model_name)
+
+    except OSError:
+        raise GatedRepoAccessError(
+            "You are trying to access a gated repo. "
+            "Make sure to request access at "
+            f"{model_name} and pass a token having permission to this repo either by logging in with `huggingface-cli login` or by setting the `HUGGINGFACEHUB_API_TOKEN` environment variable with your API token."
+        )
+
+    tokenizer = AutoTokenizer.from_pretrained(model_name)
+    tokenizer.pad_token = tokenizer.eos_token
+    model.eval()
+    return model, tokenizer
diff --git a/tests/test_sensitivity.py b/tests/test_sensitivity.py
new file mode 100644
index 000000000..442a54696
--- /dev/null
+++ b/tests/test_sensitivity.py
@@ -0,0 +1,60 @@
+import unittest
+from langtest.transform.sensitivity import *
+from langtest.utils.custom_types.sample import SensitivitySample
+from langtest.transform import TestFactory
+
+
+class SensitivityTestCase(unittest.TestCase):
+    """
+    A test case class for testing sensitivity samples on sensitivity classes.
+    """
+
+    def setUp(self) -> None:
+        """
+        Set up the test environment before each test.
+
+        Returns:
+            None
+        """
+        test_scenarios = TestFactory.test_scenarios()
+        self.available_tests = {
+            test: list(scenarios.keys()) for test, scenarios in test_scenarios.items()
+        }
+
+        self.perturbations_list = self.available_tests["sensitivity"]
+        self.supported_tests = self.available_test()
+        self.samples = {
+            "sensitivity-test": [
+                SensitivitySample(
+                    original="she is going to school?",
+                )
+            ]
+        }
+
+    def available_test(self) -> dict:
+        """
+        Get a dictionary of available sensitivity tests.
+
+        Returns:
+            dict: A dictionary containing available sensitivity tests.
+        """
+        tests = {
+            j: i
+            for i in BaseSensitivity.__subclasses__()
+            for j in (i.alias_name if isinstance(i.alias_name, list) else [i.alias_name])
+        }
+        return tests
+
+    def test(self) -> None:
+        """
+        Test sensitivity sample for sensitivity classes.
+
+        Returns:
+            None
+        """
+        for test in self.perturbations_list:
+            for task in self.samples:
+                sample = self.samples[task][-1]
+                test_func = self.supported_tests[test].transform
+            sample.transform(test_func, {})
+            assert sample.test_case is not None