{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 🎯 BS Detector: Off-the-Shelf Ensemble for LLM Uncertainty\n", "\n", "
\n", "

\n", " Ensemble UQ methods combine multiple individual scorers to provide a more robust and accurate uncertainty estimate. This demo illustrates the BS Detector method proposed in Chen & Mueller, 2023. It uses three components:\n", "

\n", " \n", "
\n", "\n", "## 📊 What You'll Do in This Demo\n", "\n", "
\n", "
1
\n", "
\n", "

Set up LLM and prompts.

\n", "

Set up LLM instance and load example data prompts.\n", "

\n", "
\n", "\n", "
\n", "
2
\n", "
\n", "

Generate LLM Responses and Confidence Scores

\n", "

Generate and score LLM responses to the example questions using the UQEnsemble() class.\n", "

\n", "
\n", "\n", "
\n", "
3
\n", "
\n", "

Evaluate Hallucination Detection Performance

\n", "

Visualize model accuracy at different thresholds of the ensemble score, combining exact match rate, noncontradiction probability, and self-judge. Compute precision, recall, and F1-score of hallucination detection.

\n", "
\n", "
\n", "\n", "## ⚖️ Advantages & Limitations\n", "\n", "
\n", "
\n", "

Pros

\n", " \n", "
\n", " \n", "
\n", "

Cons

\n", " \n", "
\n", "
" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "tags": [] }, "outputs": [], "source": [ "import numpy as np\n", "from sklearn.metrics import precision_score, recall_score, f1_score\n", "\n", "from uqlm import UQEnsemble\n", "from uqlm.utils import load_example_dataset, math_postprocessor, plot_model_accuracies, Tuner" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "## 1. Set up LLM and Prompts" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this demo, we will illustrate this approach using a set of math questions from the [SVAMP benchmark](https://arxiv.org/abs/2103.07191). To implement with your use case, simply **replace the example prompts with your data**. " ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Loading dataset - svamp...\n", "Processing dataset...\n", "Dataset ready!\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
questionanswer
0There are 87 oranges and 290 bananas in Philip...145
1Marco and his dad went strawberry picking. Mar...19
2Edward spent $ 6 to buy 2 books each book cost...3
3Frank was reading through his favorite book. T...198
4There were 78 dollars in Olivia's wallet. She ...63
\n", "
" ], "text/plain": [ " question answer\n", "0 There are 87 oranges and 290 bananas in Philip... 145\n", "1 Marco and his dad went strawberry picking. Mar... 19\n", "2 Edward spent $ 6 to buy 2 books each book cost... 3\n", "3 Frank was reading through his favorite book. T... 198\n", "4 There were 78 dollars in Olivia's wallet. She ... 63" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Load example dataset (SVAMP)\n", "svamp = load_example_dataset(\"svamp\", n=100)\n", "svamp.head()" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "tags": [] }, "outputs": [], "source": [ "# Define prompts. These can be replaced with your own prompts.\n", "MATH_INSTRUCTION = (\n", " \"When you solve this math problem only return the answer with no additional text.\\n\"\n", ")\n", "prompts = [MATH_INSTRUCTION + prompt for prompt in svamp.question]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this example, we use `ChatVertexAI` to instantiate our LLM, but any [LangChain Chat Model](https://js.langchain.com/docs/integrations/chat/) may be used. Be sure to **replace with your LLM of choice.**" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "tags": [] }, "outputs": [], "source": [ "# import sys\n", "# !{sys.executable} -m pip install langchain-google-vertexai\n", "from langchain_google_vertexai import ChatVertexAI\n", "\n", "llm = ChatVertexAI(model=\"gemini-pro\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "## 2. Generate responses and confidence scores" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### `UQEnsemble()` - Ensemble of uncertainty scorers\n", "\n", "#### 📋 Class Attributes\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ParameterType & DefaultDescription
llmBaseChatModel
default=None
A langchain llm `BaseChatModel`. User is responsible for specifying temperature and other relevant parameters to the constructor of the provided `llm` object.
devicestr or torch.device
default=\"cpu\"
Specifies the device that NLI model use for prediction. Only applies to 'semantic_negentropy', 'noncontradiction' scorers. Pass a torch.device to leverage GPU.
use_bestbool
default=True
Specifies whether to swap the original response for the uncertainty-minimized response among all sampled responses based on semantic entropy clusters. Only used if `scorers` includes 'semantic_negentropy' or 'noncontradiction'.
system_promptstr or None
default=\"You are a helpful assistant.\"
Optional argument for user to provide custom system prompt for the LLM.
max_calls_per_minint
default=None
Specifies how many API calls to make per minute to avoid rate limit errors. By default, no limit is specified.
use_n_parambool
default=False
Specifies whether to use n parameter for BaseChatModel. Not compatible with all BaseChatModel classes. If used, it speeds up the generation process substantially when num_responses is large.
postprocessorcallable
default=None
A user-defined function that takes a string input and returns a string. Used for postprocessing outputs.
sampling_temperaturefloat
default=1
The 'temperature' parameter for LLM model to generate sampled LLM responses. Must be greater than 0.
nli_model_namestr
default=\"microsoft/deberta-large-mnli\"
Specifies which NLI model to use. Must be acceptable input to AutoTokenizer.from_pretrained() and AutoModelForSequenceClassification.from_pretrained().
\n", "\n", "#### 🔍 Parameter Groups\n", "\n", "
\n", " \n", "
\n", "

🧠 LLM-Specific

\n", " \n", "
\n", "
\n", "

📊 Confidence Scores

\n", " \n", "\n", "
\n", "
\n", "

🖥️ Hardware

\n", " \n", "
\n", "
\n", "

⚡ Performance

\n", " \n", "
\n", "
\n", "\n", "#### 💻 Usage Examples\n", "\n", "```python\n", "# Basic usage with default parameters\n", "bsd = UQEnsemble(llm=llm)\n", "\n", "# Using GPU acceleration\n", "bsd = UQEnsemble(llm=llm, device=torch.device(\"cuda\"))\n", "\n", "# High-throughput configuration with rate limiting\n", "bsd = UQEnsemble(llm=llm, max_calls_per_min=200, use_n_param=True) \n", "```" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Using cuda device\n" ] } ], "source": [ "import torch\n", "\n", "# Set the torch device\n", "if torch.cuda.is_available(): # NVIDIA GPU\n", " device = torch.device(\"cuda\")\n", "elif torch.backends.mps.is_available(): # macOS\n", " device = torch.device(\"mps\")\n", "else:\n", " device = torch.device(\"cpu\") # CPU\n", "print(f\"Using {device.type} device\")" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "tags": [] }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Some weights of the model checkpoint at microsoft/deberta-large-mnli were not used when initializing DebertaForSequenceClassification: ['config']\n", "- This IS expected if you are initializing DebertaForSequenceClassification from the checkpoint of a model trained on another task or with another architecture (e.g. initializing a BertForSequenceClassification model from a BertForPreTraining model).\n", "- This IS NOT expected if you are initializing DebertaForSequenceClassification from the checkpoint of a model that you expect to be exactly identical (initializing a BertForSequenceClassification model from a BertForSequenceClassification model).\n" ] } ], "source": [ "bsd = UQEnsemble(llm=llm, max_calls_per_min=200, device=device)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 🔄 Class Methods\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
MethodDescription & Parameters
UQEnsemble.generate_and_score\n", "

Generate LLM responses, sampled LLM (candidate) responses, and compute confidence scores for the provided prompts.

\n", "

Parameters:

\n", "
    \n", "
  • prompts - (list of str) A list of input prompts for the model.
  • \n", "
  • num_responses - (int, default=5) The number of sampled responses used to compute consistency.
  • \n", "
\n", "

Returns: UQResult containing data (prompts, responses, sampled responses, and confidence scores) and metadata

\n", "
\n", " 💡 Best For: Complete end-to-end uncertainty quantification when starting with prompts.\n", "
\n", "
UQEnsemble.score\n", "

Compute confidence scores on provided LLM responses. Should only be used if responses and sampled responses are already generated.

\n", "

Parameters:

\n", "
    \n", "
  • prompts - (list of str) A list of input prompts for the LLM.
  • \n", "
  • responses - (list of str) A list of LLM responses for the prompts.
  • \n", "
  • sampled_responses - (list of list of str) A list of lists of sampled LLM responses for each prompt. These will be used to compute consistency scores by comparing to the corresponding response from responses.
  • \n", "
\n", "

Returns: UQResult containing data (responses, sampled responses, and confidence scores) and metadata

\n", "
\n", " 💡 Best For: Computing uncertainty scores when responses are already generated elsewhere.\n", "
\n", "
" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Generating responses...\n", "Generating candidate responses...\n", "Computing confidence scores...\n", "Generating LLMJudge scores...\n" ] } ], "source": [ "results = await bsd.generate_and_score(\n", " prompts=prompts, num_responses=5,\n", ")\n", "\n", "# # alternative approach: directly score if responses already generated\n", "# results = bsd.score(prompts=prompts, responses=responses, sampled_responses=sampled_responses)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "tags": [] }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
promptresponsesampled_responsesensemble_scorenoncontradictionexact_matchjudge_1
0When you solve this math problem only return t...145[145, 145, 145, 145, 145]1.0000001.0000001.01.0
1When you solve this math problem only return t...19[19, 19 pounds., 19, 19 pounds, 19 pounds]0.7632280.9950510.40.5
2When you solve this math problem only return t...$3[$3, $3.00, This math problem has two equation...0.8787110.9834120.21.0
3When you solve this math problem only return t...198[198, 198, 198, 198, 198]1.0000001.0000001.01.0
4When you solve this math problem only return t...63[63 dollars., 63 dollars, 63, 63, 63]0.9415170.9955650.61.0
\n", "
" ], "text/plain": [ " prompt response \\\n", "0 When you solve this math problem only return t... 145 \n", "1 When you solve this math problem only return t... 19 \n", "2 When you solve this math problem only return t... $3 \n", "3 When you solve this math problem only return t... 198 \n", "4 When you solve this math problem only return t... 63 \n", "\n", " sampled_responses ensemble_score \\\n", "0 [145, 145, 145, 145, 145] 1.000000 \n", "1 [19, 19 pounds., 19, 19 pounds, 19 pounds] 0.763228 \n", "2 [$3, $3.00, This math problem has two equation... 0.878711 \n", "3 [198, 198, 198, 198, 198] 1.000000 \n", "4 [63 dollars., 63 dollars, 63, 63, 63] 0.941517 \n", "\n", " noncontradiction exact_match judge_1 \n", "0 1.000000 1.0 1.0 \n", "1 0.995051 0.4 0.5 \n", "2 0.983412 0.2 1.0 \n", "3 1.000000 1.0 1.0 \n", "4 0.995565 0.6 1.0 " ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# preview results\n", "result_df = results.to_df()\n", "result_df.head(5)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "## 3. Evaluate Hallucination Detection Performance" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To evaluate hallucination detection performance, we 'grade' the responses against an answer key. Note the `math_postprocessor` is specific to our use case (math questions). **If you are using your own prompts/questions, update the grading method accordingly**." ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "tags": [] }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
promptresponsesampled_responsesensemble_scorenoncontradictionexact_matchjudge_1answerresponse_correct
0When you solve this math problem only return t...145[145, 145, 145, 145, 145]1.0000001.0000001.01.0145True
1When you solve this math problem only return t...19[19, 19 pounds., 19, 19 pounds, 19 pounds]0.7632280.9950510.40.519True
2When you solve this math problem only return t...$3[$3, $3.00, This math problem has two equation...0.8787110.9834120.21.03True
3When you solve this math problem only return t...198[198, 198, 198, 198, 198]1.0000001.0000001.01.0198True
4When you solve this math problem only return t...63[63 dollars., 63 dollars, 63, 63, 63]0.9415170.9955650.61.063True
\n", "
" ], "text/plain": [ " prompt response \\\n", "0 When you solve this math problem only return t... 145 \n", "1 When you solve this math problem only return t... 19 \n", "2 When you solve this math problem only return t... $3 \n", "3 When you solve this math problem only return t... 198 \n", "4 When you solve this math problem only return t... 63 \n", "\n", " sampled_responses ensemble_score \\\n", "0 [145, 145, 145, 145, 145] 1.000000 \n", "1 [19, 19 pounds., 19, 19 pounds, 19 pounds] 0.763228 \n", "2 [$3, $3.00, This math problem has two equation... 0.878711 \n", "3 [198, 198, 198, 198, 198] 1.000000 \n", "4 [63 dollars., 63 dollars, 63, 63, 63] 0.941517 \n", "\n", " noncontradiction exact_match judge_1 answer response_correct \n", "0 1.000000 1.0 1.0 145 True \n", "1 0.995051 0.4 0.5 19 True \n", "2 0.983412 0.2 1.0 3 True \n", "3 1.000000 1.0 1.0 198 True \n", "4 0.995565 0.6 1.0 63 True " ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Populate correct answers and grade responses\n", "result_df[\"answer\"] = svamp.answer\n", "result_df[\"response_correct\"] = [\n", " math_postprocessor(r) == a for r, a in zip(result_df[\"response\"], svamp[\"answer\"])\n", "]\n", "result_df.head(5)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Baseline LLM accuracy: 0.67\n" ] } ], "source": [ "print(f\"\"\"Baseline LLM accuracy: {np.mean(result_df[\"response_correct\"])}\"\"\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 3.1 Filtered LLM Accuracy Evaluation" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here, we explore ‘filtered accuracy’ as a metric for evaluating the performance of our confidence scores. Filtered accuracy measures the change in LLM performance when responses with confidence scores below a specified threshold are excluded. By adjusting the confidence score threshold, we can observe how the accuracy of the LLM improves as less certain responses are filtered out.\n", "\n", "We will plot the filtered accuracy across various confidence score thresholds to visualize the relationship between confidence and LLM accuracy. This analysis helps in understanding the trade-off between response coverage (measured by sample size below) and LLM accuracy, providing insights into the reliability of the LLM’s outputs. " ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "tags": [] }, "outputs": [ { "data": { "image/png": "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depUln1NmzbFf//9l+31du3aVVChERERUSkl+VIYREREREWNCRARERHpHCZAREREpHOYABEREZHOYQJEREREOocJEBEREekcJkBERESkc5gAERERkc5hAkREREQ6hwkQERER6RwmQERERKRzmAARERGRzmECRERERDqHCRARERHpHCZAREREpHOYABEREZHOYQJEREREOocJEBEREekcJkBERESkc5gAERERkc5hAkREREQ6hwkQERER6RwmQERERKRzmAARERGRzmECRERERDqHCRARERHpHCZAREREpHOYABEREZHOYQJEREREOocJEBEREekcJkBERESkc5gAERERkc5hAkREREQ6hwkQERER6RwmQERERKRz9KUOoDgSQgAA4uPjsy2T8Cr7Y5rEx8vyFVNhYT2KF9ajeNG2HkDxrAvrUbywHoUn8+925t/xnDAB0uDVq1cAACcnJ4kjISIiIm29evUKlpaWOZaRidykSTpGoVDgyZMnMDc3h0yW/2w1Pj4eTk5OePToESwsLAogQmmwHsUL61H8lJa6sB7FC+uRe0IIvHr1Co6OjtDTy7mXD1uANNDT00PFihUL/LoWFhYl+subifUoXliP4qe01IX1KF5Yj9x5X8tPJnaCJiIiIp3DBIiIiIh0DhOgImBkZITZs2fDyMhI6lDyhfUoXliP4qe01IX1KF5Yj8LBTtBERESkc9gCRERERDqHCRARERHpHCZAREREpHOYABEREZHOYQJUQNauXQtnZ2cYGxvD09MTFy9ezLH8nj17UKNGDRgbG8Pd3R2HDx8uokhzpk09bt26hU8++QTOzs6QyWTw9fUtukDfQ5t6bNy4ES1btoS1tTWsra3Rvn37935+RUWbeuzfvx+NGjWClZUVypQpAw8PD2zfvr0Io82etj8fmXbt2gWZTIYePXoUboBa0KYuW7duhUwmU9uMjY2LMNrsafuZvHz5EmPGjIGDgwOMjIzg5uZWLH5vaVOP1q1bZ/k8ZDIZunbtWoQRa6bt5+Hr64vq1avDxMQETk5OmDhxIpKTk4so2uxpU4+0tDTMmzcPrq6uMDY2Rr169XDkyJGiC1ZQvu3atUsYGhqKLVu2iFu3bolRo0YJKysrER0drbH82bNnhVwuF0uXLhW3b98WM2bMEAYGBuLGjRtFHLk6betx8eJFMWnSJLFz505hb28v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lv0nT54UAMSJEydU+w4dOiQAiNevXwshhJg9e7YwMDAQT58+VZU5ffq0sLCwEMnJyWrXc3V1FRs2bBBCCGFubi62bt2abTwAREhIiGrf2rVrhZ2dneq5o6OjWLhwodp5jRs3Fl9++aUQQoiwsDABQAQGBgohhJg2bZqoVauWWvkpU6YIAKqVut3d3cWcOXM0xkRERYctQERULNStW1f12MHBAQDw9OlT1b7KlSvD1tZW9fzatWtISEhAuXLlYGZmptrCwsIQGhoKAPD29sbIkSPRvn17LF68WLU/k6mpKVxdXdVeN/M14+Pj8eTJEzRv3lztnObNmyMoKEhjHYKCguDp6am2r2nTpmrPx48fjwULFqB58+aYPXs2rl+/nvMbQ0SFggkQERULb9+akslkAJR9cDKVKVNGrXxCQgIcHBxw9epVtS04OBjffPMNAGXfoVu3bqFr1674+++/UatWLRw4cEDja2a+rhCiwOv2tpEjR+L+/fsYNGgQbty4gUaNGmH16tWF+ppElBUTICIqkRo0aICoqCjo6+ujatWqapuNjY2qnJubGyZOnIhjx46hV69e8PPzy9X1LSws4OjoiLNnz6rtP3v2LGrVqqXxnJo1a+LixYtq+/77778s5ZycnPDFF19g//79+Prrr7Fx48ZcxUREBYcJEBGVSO3bt0fTpk3Ro0cPHDt2DA8ePMC5c+cwffp0XL58Ga9fv8bYsWNx6tQpPHz4EGfPnsWlS5dQs2bNXL/GN998gyVLlmD37t0IDg7G1KlTcfXqVXz11Vcay3/xxRe4d+8evvnmGwQHB+OXX37B1q1b1cpMmDABR48eRVhYGK5cuYKTJ09qFRMRFQzOA0REJZJMJsPhw4cxffp0DBs2DDExMbC3t8eHH34IOzs7yOVyxMbGYvDgwYiOjoaNjQ169eqFuXPn5vo1xo8fj7i4OHz99dd4+vQpatWqhT/++APVqlXTWL5SpUrYt28fJk6ciNWrV6NJkyZYtGiR2oi2jIwMjBkzBhEREbCwsECnTp2watWqfL8fRKQdmSjsG95ERERExQxvgREREZHOYQJEREREOocJEBEREekcJkBERESkc5gAERERkc5hAkREREQ6hwkQERER6RwmQERERKRzmAARERGRzmECRERERDqHCRARERHpHCZAREREpHP+D+IGKO7jHSQWAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_model_accuracies(\n", " scores=result_df.ensemble_score, correct_indicators=result_df.response_correct\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 3.2 Precision, Recall, F1-Score of Hallucination Detection" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Lastly, we compute the optimal threshold for binarizing confidence scores, using F1-score as the objective. Using this threshold, we compute precision, recall, and F1-score for black box scorer predictions of whether responses are correct." ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "BS Detector F1-optimal threshold: 0.39\n" ] } ], "source": [ "# instantiate UQLM tuner object for threshold selection\n", "t = Tuner()\n", "\n", "# Define score vector and corresponding correct indicators (i.e. ground truth)\n", "y_scores = result_df[\"ensemble_score\"] # confidence score\n", "correct_indicators = (\n", " result_df.response_correct\n", ") * 1 # Whether responses is actually correct\n", "\n", "# Solve for threshold that maximizes F1-score\n", "best_threshold = t.tune_threshold(\n", " y_scores=y_scores,\n", " correct_indicators=correct_indicators,\n", " thresh_objective=\"fbeta_score\",\n", ")\n", "y_pred = [\n", " (s > best_threshold) * 1 for s in y_scores\n", "] # predicts whether response is correct based on confidence score\n", "print(f\"BS Detector F1-optimal threshold: {best_threshold}\")" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "BS Detector precision: 0.7951807228915663\n", "BS Detector recall: 0.9850746268656716\n", "BS Detector f1-score: 0.88\n" ] } ], "source": [ "# evaluate precision, recall, and f1-score of BS Detector predictions of correctness\n", "print(\n", " f\"BS Detector precision: {precision_score(y_true=correct_indicators, y_pred=y_pred)}\"\n", ")\n", "print(f\"BS Detector recall: {recall_score(y_true=correct_indicators, y_pred=y_pred)}\")\n", "print(f\"BS Detector f1-score: {f1_score(y_true=correct_indicators, y_pred=y_pred)}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "© 2025 CVS Health and/or one of its affiliates. All rights reserved." ] } ], "metadata": { "environment": { "kernel": "uqlm", "name": "workbench-notebooks.m126", "type": "gcloud", "uri": "us-docker.pkg.dev/deeplearning-platform-release/gcr.io/workbench-notebooks:m126" }, "kernelspec": { "display_name": "uqlm", "language": "python", "name": "uqlm" }, "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.9.21" } }, "nbformat": 4, "nbformat_minor": 4 }