From e9a087e1a39ed6aed5d2e2f1c158bd82e99b7ced Mon Sep 17 00:00:00 2001 From: Linnea Leaver Date: Thu, 11 Dec 2025 18:47:21 +0000 Subject: [PATCH 1/4] add sdg notebooks --- .../generate_rag_eval_dataset.ipynb | 1301 +++++++++++++++++ .../generate_report_eval_dataset.ipynb | 630 ++++++++ 2 files changed, 1931 insertions(+) create mode 100644 code/3-agent-evaluation/generate_rag_eval_dataset.ipynb create mode 100644 code/3-agent-evaluation/generate_report_eval_dataset.ipynb diff --git a/code/3-agent-evaluation/generate_rag_eval_dataset.ipynb b/code/3-agent-evaluation/generate_rag_eval_dataset.ipynb new file mode 100644 index 0000000..8b0585a --- /dev/null +++ b/code/3-agent-evaluation/generate_rag_eval_dataset.ipynb @@ -0,0 +1,1301 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Generate an Evaluation Dataset for a RAG Agent\n", + "\n", + "In this notebook, you'll create a synthetic evaluation dataset using **NVIDIA NeMo Data Designer**, an open source tool for synthetic data generation. We'll generate test cases for evaluating the **IT Help Desk RAG Agent** from Module 2." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1. Setup\n", + "\n", + "First, let's install the Data Designer library and set up our environment." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Note: you may need to restart the kernel to use updated packages.\n", + "Completed setup\n" + ] + } + ], + "source": [ + "# Install Data Designer if needed\n", + "%pip install data-designer -q\n", + "\n", + "# Load environment variables\n", + "from dotenv import load_dotenv\n", + "_ = load_dotenv(\"../../variables.env\")\n", + "_ = load_dotenv(\"../../secrets.env\")\n", + "\n", + "import os\n", + "import json\n", + "from pathlib import Path\n", + "\n", + "print(\"Completed setup\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2. Configure DataDesigner\n", + "\n", + "Next, initialize Data Designer with default settings.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/nvidia/workshop-build-an-agent/.venv/lib/python3.10/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", + " from .autonotebook import tqdm as notebook_tqdm\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Completed initialization\n" + ] + } + ], + "source": [ + "from data_designer.essentials import (\n", + " DataDesigner,\n", + " DataDesignerConfigBuilder,\n", + " LLMTextColumnConfig,\n", + ")\n", + "\n", + "# Initialize Data Designer with default settings\n", + "data_designer = DataDesigner()\n", + "config_builder = DataDesignerConfigBuilder()\n", + "\n", + "print(\"Completed initialization\")\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3. Load IT Knowledge Base as Seed Data\n", + "\n", + "We’ll use articles from the IT knowledge base as seed data for Data Designer. Seed data is the initial set of examples Data Designer uses to guide what it generates.\n", + "\n", + "By seeding Data Designer with our agent's knowledge base, we'll ensure the evaluation data is grounded in information the agent is expected to know.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[00:13:33] [INFO] πŸ’Ύ Saving seed dataset to ../../data/evaluation/kb_seed_data.parquet\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Created seed reference with 12 KB articles\n" + ] + } + ], + "source": [ + "import pandas as pd\n", + "\n", + "# Load all articles from the knowledge base directory\n", + "kb_dir = Path(\"../../data/it-knowledge-base\")\n", + "kb_articles = []\n", + "\n", + "for kb_file in sorted(kb_dir.glob(\"*.md\")):\n", + " with open(kb_file, 'r') as f:\n", + " content = f.read()\n", + " \n", + " # Extract the article title and create a readable topic name\n", + " topic_name = kb_file.stem.replace('-', '_')\n", + " title = content.split('\\n')[0].replace('# ', '').strip()\n", + " \n", + " kb_articles.append({\n", + " \"topic\": topic_name,\n", + " \"title\": title,\n", + " \"filename\": kb_file.name,\n", + " \"content\": content\n", + " })\n", + "\n", + "# Create seed data DataFrame\n", + "seed_data = pd.DataFrame(kb_articles)\n", + "\n", + "# Data Designer requires seed data to be saved as a file for efficient sampling\n", + "seed_file_path = Path(\"../../data/evaluation/kb_seed_data.parquet\")\n", + "seed_ref = data_designer.make_seed_reference_from_dataframe(\n", + " dataframe=seed_data,\n", + " file_path=seed_file_path\n", + ")\n", + "\n", + "print(f\"Created seed reference with {len(seed_data)} KB articles\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 4. Configure Dataset Structure for RAG Evaluation\n", + "\n", + "We'll use Data Designer’s Config Builder to define the structure of our synthetic dataset. Our configuration will include the following components:\n", + "\n", + "- Category (sampled from a list of knowledge base topics)\n", + "- IT help desk questions (based on category)\n", + "- Context keywords (to evaluate retrieval)\n", + "- Ground truth answers (ideal agent answer)\n", + "\n", + "We do this by defining a list of \"columns\" representing the different fields of data that we want to generate. Using Jinja formatting, we can reference items in other columns in the same \"row.\" This allows us to, for example, generate a question and then generate an answer based on that question." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Dataset configuration built\n" + ] + } + ], + "source": [ + "# Create config builder with seed data\n", + "config_builder = DataDesignerConfigBuilder()\n", + "config_builder.with_seed_dataset(seed_ref)\n", + "\n", + "# Generate question based on the seed article\n", + "config_builder.add_column(\n", + " LLMTextColumnConfig(\n", + " name=\"question\",\n", + " model_alias=\"nvidia-text\",\n", + " prompt=\"\"\"Generate a realistic IT help desk question that a user might ask about the topic {{ topic }} from article {{ title }}.\n", + "\n", + "The question should:\n", + "- Sound like a real user would ask it\n", + "- Be specific and clear\n", + "- Cover common scenarios related to this topic\n", + "- Be directly answerable using the information in this KB article\n", + "- NOT just restate the article title\n", + "\n", + "Return ONLY the question, nothing else.\"\"\",\n", + " )\n", + ")\n", + "\n", + "# Generate context keywords for retrieval verification\n", + "config_builder.add_column(\n", + " LLMTextColumnConfig(\n", + " name=\"context_key_words\",\n", + " model_alias=\"nvidia-text\",\n", + " prompt=\"\"\"Based on this IT help desk question: {{ question }}\n", + "\n", + "List 2-3 key words or phrases that would help locate the relevant knowledge base article.\n", + "\n", + "Return as a comma-separated list.\n", + "Return ONLY the keywords, nothing else.\"\"\",\n", + " )\n", + ")\n", + "\n", + "# Generate ground truth answer based on the knowledge base\n", + "config_builder.add_column(\n", + " LLMTextColumnConfig(\n", + " name=\"ground_truth\",\n", + " model_alias=\"nvidia-text\",\n", + " prompt=\"\"\"Based on this IT help desk question: {{ question }}\n", + "\n", + "And this knowledge base article content:\n", + "{{ content }}\n", + "\n", + "Generate a concise, accurate answer that directly addresses the question using only information from the knowledge base.\n", + "\n", + "Return ONLY the answer, nothing else.\"\"\",\n", + " )\n", + ")\n", + "\n", + "print(\"Dataset configuration built\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 5. Preview the Data Structure\n", + "\n", + "Let's preview what the generated test cases will look like." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[00:13:33] [INFO] πŸ‘€ Preview generation in progress\n", + "[00:13:33] [INFO] βœ… Validation passed\n", + "[00:13:33] [INFO] ⛓️ Sorting column configs into a Directed Acyclic Graph\n", + "[00:13:33] [INFO] 🩺 Running health checks for models...\n", + "[00:13:33] [INFO] |-- πŸ‘€ Checking 'nvidia/nvidia-nemotron-nano-9b-v2' in provider named 'nvidia' for model alias 'nvidia-text'...\n", + "[00:13:34] [INFO] |-- βœ… Passed!\n", + "[00:13:34] [INFO] 🌱 Sampling 3 records from seed dataset\n", + "[00:13:34] [INFO] |-- seed dataset size: 12 records\n", + "[00:13:34] [INFO] |-- sampling strategy: ordered\n", + "[00:13:34] [INFO] πŸ“ Preparing llm-text column generation\n", + "[00:13:34] [INFO] |-- column name: 'question'\n", + "[00:13:34] [INFO] |-- model config:\n", + "{\n", + " \"alias\": \"nvidia-text\",\n", + " \"model\": \"nvidia/nvidia-nemotron-nano-9b-v2\",\n", + " \"inference_parameters\": {\n", + " \"temperature\": 0.85,\n", + " \"top_p\": 0.95,\n", + " \"max_tokens\": null,\n", + " \"max_parallel_requests\": 4,\n", + " \"timeout\": null,\n", + " \"extra_body\": null\n", + " },\n", + " \"provider\": \"nvidia\"\n", + "}\n", + "[00:13:34] [INFO] πŸ™ Processing llm-text column 'question' with 4 concurrent workers\n", + "[00:13:42] [INFO] πŸ“ Preparing llm-text column generation\n", + "[00:13:42] [INFO] |-- column name: 'context_key_words'\n", + "[00:13:42] [INFO] |-- model config:\n", + "{\n", + " \"alias\": \"nvidia-text\",\n", + " \"model\": \"nvidia/nvidia-nemotron-nano-9b-v2\",\n", + " \"inference_parameters\": {\n", + " \"temperature\": 0.85,\n", + " \"top_p\": 0.95,\n", + " \"max_tokens\": null,\n", + " \"max_parallel_requests\": 4,\n", + " \"timeout\": null,\n", + " \"extra_body\": null\n", + " },\n", + " \"provider\": \"nvidia\"\n", + "}\n", + "[00:13:42] [INFO] πŸ™ Processing llm-text column 'context_key_words' with 4 concurrent workers\n", + "[00:13:46] [INFO] πŸ“ Preparing llm-text column generation\n", + "[00:13:46] [INFO] |-- column name: 'ground_truth'\n", + "[00:13:46] [INFO] |-- model config:\n", + "{\n", + " \"alias\": \"nvidia-text\",\n", + " \"model\": \"nvidia/nvidia-nemotron-nano-9b-v2\",\n", + " \"inference_parameters\": {\n", + " \"temperature\": 0.85,\n", + " \"top_p\": 0.95,\n", + " \"max_tokens\": null,\n", + " \"max_parallel_requests\": 4,\n", + " \"timeout\": null,\n", + " \"extra_body\": null\n", + " },\n", + " \"provider\": \"nvidia\"\n", + "}\n", + "[00:13:46] [INFO] πŸ™ Processing llm-text column 'ground_truth' with 4 concurrent workers\n", + "[00:13:51] [INFO] πŸ“Š Model usage summary:\n", + "{\n", + " \"nvidia/nvidia-nemotron-nano-9b-v2\": {\n", + " \"token_usage\": {\n", + " \"prompt_tokens\": 7084,\n", + " \"completion_tokens\": 4148,\n", + " \"total_tokens\": 11232\n", + " },\n", + " \"request_usage\": {\n", + " \"successful_requests\": 9,\n", + " \"failed_requests\": 0,\n", + " \"total_requests\": 9\n", + " },\n", + " \"tokens_per_second\": 663,\n", + " \"requests_per_minute\": 31\n", + " }\n", + "}\n", + "[00:13:51] [INFO] πŸ“ Measuring dataset column statistics:\n", + "[00:13:51] [INFO] |-- 🌱 column: 'topic'\n", + "[00:13:51] [INFO] |-- 🌱 column: 'title'\n", + "[00:13:51] [INFO] |-- 🌱 column: 'filename'\n", + "[00:13:51] [INFO] |-- 🌱 column: 'content'\n", + "[00:13:51] [INFO] |-- πŸ“ column: 'question'\n", + "[00:13:51] [INFO] |-- πŸ“ column: 'context_key_words'\n", + "[00:13:51] [INFO] |-- πŸ“ column: 'ground_truth'\n", + "[00:13:51] [INFO] β˜€οΈ Preview complete!\n" + ] + }, + { + "data": { + "text/html": [ + "
                                                                                                                   \n",
+              "                                                   Seed Columns                                                    \n",
+              "┏━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
+              "┃ Name     ┃ Value                                                                                                ┃\n",
+              "┑━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
+              "β”‚ topic    β”‚ email_distribution_lists                                                                             β”‚\n",
+              "β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€\n",
+              "β”‚ title    β”‚ Managing Email Distribution Lists                                                                    β”‚\n",
+              "β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€\n",
+              "β”‚ filename β”‚ email-distribution-lists.md                                                                          β”‚\n",
+              "β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€\n",
+              "β”‚ content  β”‚ # Managing Email Distribution Lists                                                                  β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ ## Purpose                                                                                           β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ This article provides instructions for requesting, managing, and using email distribution lists      β”‚\n",
+              "β”‚          β”‚ within the company's email system. Distribution lists enable efficient communication with groups of  β”‚\n",
+              "β”‚          β”‚ employees, departments, or project teams while maintaining proper security and governance controls.  β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ ## What are Email Distribution Lists                                                                 β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ Email distribution lists are centrally managed groups of email addresses that allow you to send      β”‚\n",
+              "β”‚          β”‚ messages to multiple recipients using a single email address. Distribution lists provide:            β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ - **Simplified group communication** for departments, projects, and teams                            β”‚\n",
+              "β”‚          β”‚ - **Centralized membership management** with proper access controls                                  β”‚\n",
+              "β”‚          β”‚ - **Consistent naming conventions** for easy identification                                          β”‚\n",
+              "β”‚          β”‚ - **Security and compliance** with company communication policies                                    β”‚\n",
+              "β”‚          β”‚ - **Automatic synchronization** with organizational changes                                          β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ ## Types of Distribution Lists                                                                       β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ ### **Departmental Lists**                                                                           β”‚\n",
+              "β”‚          β”‚ - **Purpose:** Communication within specific departments or business units                           β”‚\n",
+              "β”‚          β”‚ - **Naming Convention:** `dept-[department-name]@company.com`                                        β”‚\n",
+              "β”‚          β”‚ - **Examples:** `dept-finance@company.com`, `dept-hr@company.com`                                    β”‚\n",
+              "β”‚          β”‚ - **Membership:** Automatically populated based on Active Directory department assignments           β”‚\n",
+              "β”‚          β”‚ - **Management:** Maintained by HR and department managers                                           β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ ### **Project Lists**                                                                                β”‚\n",
+              "β”‚          β”‚ - **Purpose:** Temporary communication for specific projects or initiatives                          β”‚\n",
+              "β”‚          β”‚ - **Naming Convention:** `project-[project-name]@company.com`                                        β”‚\n",
+              "β”‚          β”‚ - **Examples:** `project-website-redesign@company.com`, `project-erp-implementation@company.com`     β”‚\n",
+              "β”‚          β”‚ - **Membership:** Manually managed by project managers                                               β”‚\n",
+              "β”‚          β”‚ - **Duration:** Active for project lifecycle, archived upon completion                               β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ ### **Functional Lists**                                                                             β”‚\n",
+              "β”‚          β”‚ - **Purpose:** Role-based communication across departments                                           β”‚\n",
+              "β”‚          β”‚ - **Naming Convention:** `role-[function-name]@company.com`                                          β”‚\n",
+              "β”‚          β”‚ - **Examples:** `role-managers@company.com`, `role-safety-coordinators@company.com`                  β”‚\n",
+              "β”‚          β”‚ - **Membership:** Based on job roles and responsibilities                                            β”‚\n",
+              "β”‚          β”‚ - **Management:** Maintained by HR with input from department heads                                  β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ ### **Location Lists**                                                                               β”‚\n",
+              "β”‚          β”‚ - **Purpose:** Site-specific communication for multi-location organizations                          β”‚\n",
+              "β”‚          β”‚ - **Naming Convention:** `location-[site-name]@company.com`                                          β”‚\n",
+              "β”‚          β”‚ - **Examples:** `location-headquarters@company.com`, `location-warehouse-east@company.com`           β”‚\n",
+              "β”‚          β”‚ - **Membership:** Based on primary work location assignments                                         β”‚\n",
+              "β”‚          β”‚ - **Management:** Maintained by facilities and HR teams                                              β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ ### **Security Lists**                                                                               β”‚\n",
+              "β”‚          β”‚ - **Purpose:** Confidential communication requiring restricted access                                β”‚\n",
+              "β”‚          β”‚ - **Naming Convention:** `secure-[purpose]@company.com`                                              β”‚\n",
+              "β”‚          β”‚ - **Examples:** `secure-executives@company.com`, `secure-incident-response@company.com`              β”‚\n",
+              "β”‚          β”‚ - **Membership:** Strictly controlled with approval requirements                                     β”‚\n",
+              "β”‚          β”‚ - **Management:** Maintained by IT Security and designated owners                                    β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ ## Prerequisites                                                                                     β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ Before requesting a distribution list, ensure you have:                                              β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ - **Business justification** for the list's creation                                                 β”‚\n",
+              "β”‚          β”‚ - **Manager approval** for departmental or functional lists                                          β”‚\n",
+              "β”‚          β”‚ - **Defined membership criteria** and initial member list                                            β”‚\n",
+              "β”‚          β”‚ - **Designated list owner** responsible for ongoing management                                       β”‚\n",
+              "β”‚          β”‚ - **Understanding of data classification** for list communications                                   β”‚\n",
+              "β”‚          β”‚ - **Compliance approval** for lists handling sensitive information                                   β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ ## Request Procedure                                                                                 β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ ### 1. Planning and Justification                                                                    β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ Before submitting a request, prepare the following information:                                      β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ #### **Business Requirements**                                                                       β”‚\n",
+              "β”‚          β”‚ - **Purpose and scope** of the distribution list                                                     β”‚\n",
+              "β”‚          β”‚ - **Target audience** and estimated membership size                                                  β”‚\n",
+              "β”‚          β”‚ - **Communication frequency** and expected volume                                                    β”‚\n",
+              "β”‚          β”‚ - **Project timeline** or ongoing operational need                                                   β”‚\n",
+              "β”‚          β”‚ - **Integration requirements** with existing systems                                                 β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ #### **Governance Details**                                                                          β”‚\n",
+              "β”‚          β”‚ - **Primary list owner** (responsible for membership management)                                     β”‚\n",
+              "β”‚          β”‚ - **Secondary owner** (backup for owner absence)                                                     β”‚\n",
+              "β”‚          β”‚ - **Approval process** for adding/removing members                                                   β”‚\n",
+              "β”‚          β”‚ - **Access restrictions** and security requirements                                                  β”‚\n",
+              "β”‚          β”‚ - **Retention policies** for list communications                                                     β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ ### 2. Submit Distribution List Request                                                              β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ - Navigate to the **IT Service Portal** at `itservices.company.com`                                  β”‚\n",
+              "β”‚          β”‚ - Go to **Service Requests β†’ Email Services β†’ Distribution List Request**                            β”‚\n",
+              "β”‚          β”‚ - Complete the comprehensive request form:                                                           β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ #### **Required Information**                                                                        β”‚\n",
+              "β”‚          β”‚ - **Requested list name** (following naming conventions)                                             β”‚\n",
+              "β”‚          β”‚ - **List type** (Departmental, Project, Functional, Location, Security)                              β”‚\n",
+              "β”‚          β”‚ - **Business justification** and purpose description                                                 β”‚\n",
+              "β”‚          β”‚ - **Primary and secondary owners** with contact information                                          β”‚\n",
+              "β”‚          β”‚ - **Initial membership list** (names and email addresses)                                            β”‚\n",
+              "β”‚          β”‚ - **Manager approval** (digital signature required)                                                  β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ #### **Additional Details**                                                                          β”‚\n",
+              "β”‚          β”‚ - **Membership criteria** for future additions                                                       β”‚\n",
+              "β”‚          β”‚ - **External sender permissions** (if applicable)                                                    β”‚\n",
+              "β”‚          β”‚ - **Moderation requirements** (pre-approval of messages)                                             β”‚\n",
+              "β”‚          β”‚ - **Integration needs** (SharePoint, Teams, etc.)                                                    β”‚\n",
+              "β”‚          β”‚ - **Special security requirements**                                                                  β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ ### 3. Approval Process                                                                              β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ #### **Initial Review (1-2 business days)**                                                          β”‚\n",
+              "β”‚          β”‚ - **IT team verification** of naming conventions and technical feasibility                           β”‚\n",
+              "β”‚          β”‚ - **Duplicate list checking** to avoid redundancy                                                    β”‚\n",
+              "β”‚          β”‚ - **Security assessment** for sensitive lists                                                        β”‚\n",
+              "β”‚          β”‚ - **Resource allocation** confirmation                                                               β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ #### **Management Approval (2-3 business days)**                                                     β”‚\n",
+              "β”‚          β”‚ - **Department head approval** for departmental lists                                                β”‚\n",
+              "β”‚          β”‚ - **Project sponsor approval** for project lists                                                     β”‚\n",
+              "β”‚          β”‚ - **Executive approval** for security or cross-functional lists                                      β”‚\n",
+              "β”‚          β”‚ - **Compliance review** for regulated communications                                                 β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ #### **Implementation (1 business day)**                                                             β”‚\n",
+              "β”‚          β”‚ - **Distribution list creation** in Exchange/Office 365                                              β”‚\n",
+              "β”‚          β”‚ - **Membership population** from provided list                                                       β”‚\n",
+              "β”‚          β”‚ - **Owner permissions** configuration                                                                β”‚\n",
+              "β”‚          β”‚ - **Testing and validation** of list functionality                                                   β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ ### 4. List Activation and Documentation                                                             β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ #### **Activation Notification**                                                                     β”‚\n",
+              "β”‚          β”‚ - **Confirmation email** sent to list owners                                                         β”‚\n",
+              "β”‚          β”‚ - **List address** and management instructions                                                       β”‚\n",
+              "β”‚          β”‚ - **Access to self-service management tools**                                                        β”‚\n",
+              "β”‚          β”‚ - **Documentation** and best practices guide                                                         β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ #### **Owner Responsibilities**                                                                      β”‚\n",
+              "β”‚          β”‚ - **Membership management** (additions, removals, updates)                                           β”‚\n",
+              "β”‚          β”‚ - **Usage monitoring** and policy compliance                                                         β”‚\n",
+              "β”‚          β”‚ - **Regular membership reviews** (quarterly for most lists)                                          β”‚\n",
+              "β”‚          β”‚ - **Incident reporting** for misuse or security concerns                                             β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ ## Managing Distribution Lists                                                                       β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ ### **Self-Service Management**                                                                      β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ #### **Adding Members**                                                                              β”‚\n",
+              "β”‚          β”‚ 1. **Access Management Portal**                                                                      β”‚\n",
+              "β”‚          β”‚    - Navigate to `groups.company.com`                                                                β”‚\n",
+              "β”‚          β”‚    - Sign in with your **company credentials**                                                       β”‚\n",
+              "β”‚          β”‚    - Select your **managed distribution lists**                                                      β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ 2. **Add New Members**                                                                               β”‚\n",
+              "β”‚          β”‚    - Click **Add Members** for the target list                                                       β”‚\n",
+              "β”‚          β”‚    - Enter **email addresses** or search company directory                                           β”‚\n",
+              "β”‚          β”‚    - Verify **membership criteria** compliance                                                       β”‚\n",
+              "β”‚          β”‚    - Click **Add** to complete the process                                                           β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ 3. **Bulk Import** (for large additions)                                                             β”‚\n",
+              "β”‚          β”‚    - Download **CSV template** from management portal                                                β”‚\n",
+              "β”‚          β”‚    - Complete template with **member information**                                                   β”‚\n",
+              "β”‚          β”‚    - Upload file and **review additions** before confirming                                          β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ #### **Removing Members**                                                                            β”‚\n",
+              "β”‚          β”‚ 1. **Individual Removal**                                                                            β”‚\n",
+              "β”‚          β”‚    - Select **members to remove** from list view                                                     β”‚\n",
+              "β”‚          β”‚    - Click **Remove Members**                                                                        β”‚\n",
+              "β”‚          β”‚    - **Confirm removal** and document reason if required                                             β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ 2. **Automated Removal**                                                                             β”‚\n",
+              "β”‚          β”‚    - **Inactive accounts** automatically removed after 30 days                                       β”‚\n",
+              "β”‚          β”‚    - **Departed employees** removed within 24 hours                                                  β”‚\n",
+              "β”‚          β”‚    - **Role changes** may trigger automatic removal                                                  β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ #### **Membership Reviews**                                                                          β”‚\n",
+              "β”‚          β”‚ - **Quarterly reviews** required for most lists                                                      β”‚\n",
+              "β”‚          β”‚ - **Annual comprehensive reviews** for all lists                                                     β”‚\n",
+              "β”‚          β”‚ - **Immediate reviews** following organizational changes                                             β”‚\n",
+              "β”‚          β”‚ - **Documentation** of review results and actions taken                                              β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ ### **Advanced Management Features**                                                                 β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ #### **Message Moderation**                                                                          β”‚\n",
+              "β”‚          β”‚ - **Enable moderation** for lists requiring content approval                                         β”‚\n",
+              "β”‚          β”‚ - **Designate moderators** with message approval rights                                              β”‚\n",
+              "β”‚          β”‚ - **Set approval criteria** and response timeframes                                                  β”‚\n",
+              "β”‚          β”‚ - **Configure rejection notifications** for inappropriate content                                    β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ #### **External Sender Management**                                                                  β”‚\n",
+              "β”‚          β”‚ - **Allow external senders** for customer or vendor communication                                    β”‚\n",
+              "β”‚          β”‚ - **Whitelist specific domains** or email addresses                                                  β”‚\n",
+              "β”‚          β”‚ - **Require sender authentication** for external messages                                            β”‚\n",
+              "β”‚          β”‚ - **Log external communications** for security monitoring                                            β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ #### **Integration with Other Systems**                                                              β”‚\n",
+              "β”‚          β”‚ - **SharePoint integration** for document sharing                                                    β”‚\n",
+              "β”‚          β”‚ - **Microsoft Teams** channel creation for collaboration                                             β”‚\n",
+              "β”‚          β”‚ - **Calendar integration** for meeting invitations                                                   β”‚\n",
+              "β”‚          β”‚ - **Mobile app notifications** for important communications                                          β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ ## Usage Guidelines and Best Practices                                                               β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ ### **Appropriate Usage**                                                                            β”‚\n",
+              "β”‚          β”‚ - **Business communications** related to list purpose                                                β”‚\n",
+              "β”‚          β”‚ - **Time-sensitive announcements** requiring broad distribution                                      β”‚\n",
+              "β”‚          β”‚ - **Collaborative discussions** within project or department scope                                   β”‚\n",
+              "β”‚          β”‚ - **Emergency notifications** for safety or security issues                                          β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ ### **Prohibited Usage**                                                                             β”‚\n",
+              "β”‚          β”‚ - **Personal communications** unrelated to business                                                  β”‚\n",
+              "β”‚          β”‚ - **Spam or promotional** content from external sources                                              β”‚\n",
+              "β”‚          β”‚ - **Confidential information** on non-secure lists                                                   β”‚\n",
+              "β”‚          β”‚ - **Large file attachments** that may impact email system performance                                β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ ### **Communication Etiquette**                                                                      β”‚\n",
+              "β”‚          β”‚ - **Use clear, descriptive** subject lines                                                           β”‚\n",
+              "β”‚          β”‚ - **Keep messages concise** and relevant to all recipients                                           β”‚\n",
+              "β”‚          β”‚ - **Reply judiciously** - consider if all members need to see responses                              β”‚\n",
+              "β”‚          β”‚ - **Use \"Reply All\" sparingly** to avoid unnecessary email volume                                    β”‚\n",
+              "β”‚          β”‚ - **Include context** when forwarding messages to lists                                              β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ ### **Security Considerations**                                                                      β”‚\n",
+              "β”‚          β”‚ - **Verify recipient lists** before sending sensitive information                                    β”‚\n",
+              "β”‚          β”‚ - **Use encryption** for confidential communications                                                 β”‚\n",
+              "β”‚          β”‚ - **Avoid including** external recipients on internal lists                                          β”‚\n",
+              "β”‚          β”‚ - **Report suspicious messages** to IT Security immediately                                          β”‚\n",
+              "β”‚          β”‚ - **Follow data classification** policies for all communications                                     β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ ## Troubleshooting Common Issues                                                                     β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ ### **Delivery Problems**                                                                            β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ #### **Messages Not Delivered**                                                                      β”‚\n",
+              "β”‚          β”‚ - **Check list membership** - ensure you're subscribed to the list                                   β”‚\n",
+              "β”‚          β”‚ - **Verify sender permissions** - confirm you're authorized to send                                  β”‚\n",
+              "β”‚          β”‚ - **Review message size** - large attachments may be blocked                                         β”‚\n",
+              "β”‚          β”‚ - **Check spam filters** - messages may be filtered by security systems                              β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ #### **Partial Delivery**                                                                            β”‚\n",
+              "β”‚          β”‚ - **External recipient blocking** - some domains may reject list messages                            β”‚\n",
+              "β”‚          β”‚ - **Mailbox full** - individual recipient mailboxes may be at capacity                               β”‚\n",
+              "β”‚          β”‚ - **Inactive accounts** - departed employees may still be listed                                     β”‚\n",
+              "β”‚          β”‚ - **Distribution delays** - large lists may experience delivery delays                               β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ ### **Management Issues**                                                                            β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ #### **Cannot Add Members**                                                                          β”‚\n",
+              "β”‚          β”‚ - **Verify ownership permissions** - ensure you're designated as list owner                          β”‚\n",
+              "β”‚          β”‚ - **Check member eligibility** - confirm recipients meet list criteria                               β”‚\n",
+              "β”‚          β”‚ - **Review approval requirements** - some additions may require manager approval                     β”‚\n",
+              "β”‚          β”‚ - **Validate email addresses** - ensure addresses are correctly formatted                            β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ #### **Membership Sync Problems**                                                                    β”‚\n",
+              "β”‚          β”‚ - **Active Directory delays** - automatic updates may take 24 hours                                  β”‚\n",
+              "β”‚          β”‚ - **Organizational changes** - department moves may affect list membership                           β”‚\n",
+              "β”‚          β”‚ - **Account status changes** - role changes may trigger unexpected removals                          β”‚\n",
+              "β”‚          β”‚ - **Manual override** - contact IT for immediate membership corrections                              β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ ### **Access and Permission Issues**                                                                 β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ #### **Cannot Manage List**                                                                          β”‚\n",
+              "β”‚          β”‚ - **Ownership verification** - confirm you're designated as primary or secondary owner               β”‚\n",
+              "β”‚          β”‚ - **Account permissions** - ensure your account has proper management rights                         β”‚\n",
+              "β”‚          β”‚ - **System maintenance** - management portal may be temporarily unavailable                          β”‚\n",
+              "β”‚          β”‚ - **Training requirements** - new owners may need management training                                β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ ## Monitoring and Reporting                                                                          β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ ### **Usage Analytics**                                                                              β”‚\n",
+              "β”‚          β”‚ - **Message volume** tracking and trending                                                           β”‚\n",
+              "β”‚          β”‚ - **Membership growth** and turnover analysis                                                        β”‚\n",
+              "β”‚          β”‚ - **Delivery success rates** and failure analysis                                                    β”‚\n",
+              "β”‚          β”‚ - **Top senders** and communication patterns                                                         β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ ### **Compliance Monitoring**                                                                        β”‚\n",
+              "β”‚          β”‚ - **Content scanning** for policy violations                                                         β”‚\n",
+              "β”‚          β”‚ - **External communication** tracking and approval                                                   β”‚\n",
+              "β”‚          β”‚ - **Data classification** compliance verification                                                    β”‚\n",
+              "β”‚          β”‚ - **Retention policy** enforcement and archival                                                      β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ ### **Performance Metrics**                                                                          β”‚\n",
+              "β”‚          β”‚ - **Delivery times** and system performance                                                          β”‚\n",
+              "β”‚          β”‚ - **User satisfaction** surveys and feedback                                                         β”‚\n",
+              "β”‚          β”‚ - **Cost analysis** for list maintenance and operations                                              β”‚\n",
+              "β”‚          β”‚ - **Security incident** tracking and response                                                        β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ ## List Lifecycle Management                                                                         β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ ### **Regular Maintenance**                                                                          β”‚\n",
+              "β”‚          β”‚ - **Quarterly membership** reviews and updates                                                       β”‚\n",
+              "β”‚          β”‚ - **Annual purpose validation** and business justification                                           β”‚\n",
+              "β”‚          β”‚ - **Owner succession** planning and documentation                                                    β”‚\n",
+              "β”‚          β”‚ - **Performance optimization** and cleanup                                                           β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ ### **List Retirement**                                                                              β”‚\n",
+              "β”‚          β”‚ #### **Project Completion**                                                                          β”‚\n",
+              "β”‚          β”‚ - **Archive list communications** for future reference                                               β”‚\n",
+              "β”‚          β”‚ - **Notify members** of list deactivation                                                            β”‚\n",
+              "β”‚          β”‚ - **Redirect to successor lists** if applicable                                                      β”‚\n",
+              "β”‚          β”‚ - **Maintain read-only access** for historical purposes                                              β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ #### **Organizational Changes**                                                                      β”‚\n",
+              "β”‚          β”‚ - **Merge redundant lists** following reorganizations                                                β”‚\n",
+              "β”‚          β”‚ - **Update naming conventions** for consistency                                                      β”‚\n",
+              "β”‚          β”‚ - **Transfer ownership** for continuing business needs                                               β”‚\n",
+              "β”‚          β”‚ - **Document changes** for audit and compliance                                                      β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ ## Support and Training                                                                              β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ ### **Self-Service Resources**                                                                       β”‚\n",
+              "β”‚          β”‚ - **Management Portal:** `groups.company.com` - List management interface                            β”‚\n",
+              "β”‚          β”‚ - **Knowledge Base:** Comprehensive guides and FAQs                                                  β”‚\n",
+              "β”‚          β”‚ - **Video Tutorials:** Step-by-step management instructions                                          β”‚\n",
+              "β”‚          β”‚ - **Best Practices Guide:** Communication and management recommendations                             β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ ### **Technical Support**                                                                            β”‚\n",
+              "β”‚          β”‚ - **Email Support:** `email-support@company.com` or ext. 4357                                        β”‚\n",
+              "β”‚          β”‚ - **Distribution List Specialists:** `dl-support@company.com`                                        β”‚\n",
+              "β”‚          β”‚ - **Training Coordinator:** `email-training@company.com`                                             β”‚\n",
+              "β”‚          β”‚ - **Compliance Questions:** `email-compliance@company.com`                                           β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ ### **Training Programs**                                                                            β”‚\n",
+              "β”‚          β”‚ - **New Owner Training:** Required for all list owners                                               β”‚\n",
+              "β”‚          β”‚ - **Advanced Management:** Optional training for complex list requirements                           β”‚\n",
+              "β”‚          β”‚ - **Compliance Training:** Required for security and regulated lists                                 β”‚\n",
+              "β”‚          β”‚ - **User Etiquette:** Available for all employees                                                    β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ ---                                                                                                  β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β”‚          β”‚ *Last updated: [Current Date] | Document ID: KB-EMAIL-001 | Classification: Internal Use*            β”‚\n",
+              "β”‚          β”‚                                                                                                      β”‚\n",
+              "β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜\n",
+              "                                                                                                                   \n",
+              "                                                                                                                   \n",
+              "                                                 Generated Columns                                                 \n",
+              "┏━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
+              "┃ Name              ┃ Value                                                                                       ┃\n",
+              "┑━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
+              "β”‚ question          β”‚ How do I add new employees to our company's email distribution list without sending a test  β”‚\n",
+              "β”‚                   β”‚ email to confirm it works?                                                                  β”‚\n",
+              "β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€\n",
+              "β”‚ context_key_words β”‚ add employees, distribution list, skip test email                                           β”‚\n",
+              "β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€\n",
+              "β”‚ ground_truth      β”‚ To add new employees to an email distribution list without sending a test email, use the    β”‚\n",
+              "β”‚                   β”‚ **IT Service Portal** or **Management Portal** (`groups.company.com`) to manually add       β”‚\n",
+              "β”‚                   β”‚ members by entering their email addresses or searching the company directory. The system    β”‚\n",
+              "β”‚                   β”‚ will update the list automatically once additions are confirmed through the portal.         β”‚\n",
+              "β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜\n",
+              "                                                                                                                   \n",
+              "                                                    [index: 0]                                                     \n",
+              "
\n" + ], + "text/plain": [ + " \n", + "\u001b[3m Seed Columns \u001b[0m\n", + "┏━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n", + "┃\u001b[1m \u001b[0m\u001b[1mName \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mValue \u001b[0m\u001b[1m \u001b[0m┃\n", + "┑━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n", + "β”‚ topic β”‚ email_distribution_lists β”‚\n", + "β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€\n", + "β”‚ title β”‚ Managing Email Distribution Lists β”‚\n", + "β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€\n", + "β”‚ filename β”‚ email-distribution-lists.md β”‚\n", + "β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€\n", + "β”‚ content β”‚ # Managing Email Distribution Lists β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ ## Purpose β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ This article provides instructions for requesting, managing, and using email distribution lists β”‚\n", + "β”‚ β”‚ within the company's email system. Distribution lists enable efficient communication with groups of β”‚\n", + "β”‚ β”‚ employees, departments, or project teams while maintaining proper security and governance controls. β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ ## What are Email Distribution Lists β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ Email distribution lists are centrally managed groups of email addresses that allow you to send β”‚\n", + "β”‚ β”‚ messages to multiple recipients using a single email address. Distribution lists provide: β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ - **Simplified group communication** for departments, projects, and teams β”‚\n", + "β”‚ β”‚ - **Centralized membership management** with proper access controls β”‚\n", + "β”‚ β”‚ - **Consistent naming conventions** for easy identification β”‚\n", + "β”‚ β”‚ - **Security and compliance** with company communication policies β”‚\n", + "β”‚ β”‚ - **Automatic synchronization** with organizational changes β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ ## Types of Distribution Lists β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ ### **Departmental Lists** β”‚\n", + "β”‚ β”‚ - **Purpose:** Communication within specific departments or business units β”‚\n", + "β”‚ β”‚ - **Naming Convention:** `dept-[department-name]@company.com` β”‚\n", + "β”‚ β”‚ - **Examples:** `dept-finance@company.com`, `dept-hr@company.com` β”‚\n", + "β”‚ β”‚ - **Membership:** Automatically populated based on Active Directory department assignments β”‚\n", + "β”‚ β”‚ - **Management:** Maintained by HR and department managers β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ ### **Project Lists** β”‚\n", + "β”‚ β”‚ - **Purpose:** Temporary communication for specific projects or initiatives β”‚\n", + "β”‚ β”‚ - **Naming Convention:** `project-[project-name]@company.com` β”‚\n", + "β”‚ β”‚ - **Examples:** `project-website-redesign@company.com`, `project-erp-implementation@company.com` β”‚\n", + "β”‚ β”‚ - **Membership:** Manually managed by project managers β”‚\n", + "β”‚ β”‚ - **Duration:** Active for project lifecycle, archived upon completion β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ ### **Functional Lists** β”‚\n", + "β”‚ β”‚ - **Purpose:** Role-based communication across departments β”‚\n", + "β”‚ β”‚ - **Naming Convention:** `role-[function-name]@company.com` β”‚\n", + "β”‚ β”‚ - **Examples:** `role-managers@company.com`, `role-safety-coordinators@company.com` β”‚\n", + "β”‚ β”‚ - **Membership:** Based on job roles and responsibilities β”‚\n", + "β”‚ β”‚ - **Management:** Maintained by HR with input from department heads β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ ### **Location Lists** β”‚\n", + "β”‚ β”‚ - **Purpose:** Site-specific communication for multi-location organizations β”‚\n", + "β”‚ β”‚ - **Naming Convention:** `location-[site-name]@company.com` β”‚\n", + "β”‚ β”‚ - **Examples:** `location-headquarters@company.com`, `location-warehouse-east@company.com` β”‚\n", + "β”‚ β”‚ - **Membership:** Based on primary work location assignments β”‚\n", + "β”‚ β”‚ - **Management:** Maintained by facilities and HR teams β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ ### **Security Lists** β”‚\n", + "β”‚ β”‚ - **Purpose:** Confidential communication requiring restricted access β”‚\n", + "β”‚ β”‚ - **Naming Convention:** `secure-[purpose]@company.com` β”‚\n", + "β”‚ β”‚ - **Examples:** `secure-executives@company.com`, `secure-incident-response@company.com` β”‚\n", + "β”‚ β”‚ - **Membership:** Strictly controlled with approval requirements β”‚\n", + "β”‚ β”‚ - **Management:** Maintained by IT Security and designated owners β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ ## Prerequisites β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ Before requesting a distribution list, ensure you have: β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ - **Business justification** for the list's creation β”‚\n", + "β”‚ β”‚ - **Manager approval** for departmental or functional lists β”‚\n", + "β”‚ β”‚ - **Defined membership criteria** and initial member list β”‚\n", + "β”‚ β”‚ - **Designated list owner** responsible for ongoing management β”‚\n", + "β”‚ β”‚ - **Understanding of data classification** for list communications β”‚\n", + "β”‚ β”‚ - **Compliance approval** for lists handling sensitive information β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ ## Request Procedure β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ ### 1. Planning and Justification β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ Before submitting a request, prepare the following information: β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ #### **Business Requirements** β”‚\n", + "β”‚ β”‚ - **Purpose and scope** of the distribution list β”‚\n", + "β”‚ β”‚ - **Target audience** and estimated membership size β”‚\n", + "β”‚ β”‚ - **Communication frequency** and expected volume β”‚\n", + "β”‚ β”‚ - **Project timeline** or ongoing operational need β”‚\n", + "β”‚ β”‚ - **Integration requirements** with existing systems β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ #### **Governance Details** β”‚\n", + "β”‚ β”‚ - **Primary list owner** (responsible for membership management) β”‚\n", + "β”‚ β”‚ - **Secondary owner** (backup for owner absence) β”‚\n", + "β”‚ β”‚ - **Approval process** for adding/removing members β”‚\n", + "β”‚ β”‚ - **Access restrictions** and security requirements β”‚\n", + "β”‚ β”‚ - **Retention policies** for list communications β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ ### 2. Submit Distribution List Request β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ - Navigate to the **IT Service Portal** at `itservices.company.com` β”‚\n", + "β”‚ β”‚ - Go to **Service Requests β†’ Email Services β†’ Distribution List Request** β”‚\n", + "β”‚ β”‚ - Complete the comprehensive request form: β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ #### **Required Information** β”‚\n", + "β”‚ β”‚ - **Requested list name** (following naming conventions) β”‚\n", + "β”‚ β”‚ - **List type** (Departmental, Project, Functional, Location, Security) β”‚\n", + "β”‚ β”‚ - **Business justification** and purpose description β”‚\n", + "β”‚ β”‚ - **Primary and secondary owners** with contact information β”‚\n", + "β”‚ β”‚ - **Initial membership list** (names and email addresses) β”‚\n", + "β”‚ β”‚ - **Manager approval** (digital signature required) β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ #### **Additional Details** β”‚\n", + "β”‚ β”‚ - **Membership criteria** for future additions β”‚\n", + "β”‚ β”‚ - **External sender permissions** (if applicable) β”‚\n", + "β”‚ β”‚ - **Moderation requirements** (pre-approval of messages) β”‚\n", + "β”‚ β”‚ - **Integration needs** (SharePoint, Teams, etc.) β”‚\n", + "β”‚ β”‚ - **Special security requirements** β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ ### 3. Approval Process β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ #### **Initial Review (1-2 business days)** β”‚\n", + "β”‚ β”‚ - **IT team verification** of naming conventions and technical feasibility β”‚\n", + "β”‚ β”‚ - **Duplicate list checking** to avoid redundancy β”‚\n", + "β”‚ β”‚ - **Security assessment** for sensitive lists β”‚\n", + "β”‚ β”‚ - **Resource allocation** confirmation β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ #### **Management Approval (2-3 business days)** β”‚\n", + "β”‚ β”‚ - **Department head approval** for departmental lists β”‚\n", + "β”‚ β”‚ - **Project sponsor approval** for project lists β”‚\n", + "β”‚ β”‚ - **Executive approval** for security or cross-functional lists β”‚\n", + "β”‚ β”‚ - **Compliance review** for regulated communications β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ #### **Implementation (1 business day)** β”‚\n", + "β”‚ β”‚ - **Distribution list creation** in Exchange/Office 365 β”‚\n", + "β”‚ β”‚ - **Membership population** from provided list β”‚\n", + "β”‚ β”‚ - **Owner permissions** configuration β”‚\n", + "β”‚ β”‚ - **Testing and validation** of list functionality β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ ### 4. List Activation and Documentation β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ #### **Activation Notification** β”‚\n", + "β”‚ β”‚ - **Confirmation email** sent to list owners β”‚\n", + "β”‚ β”‚ - **List address** and management instructions β”‚\n", + "β”‚ β”‚ - **Access to self-service management tools** β”‚\n", + "β”‚ β”‚ - **Documentation** and best practices guide β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ #### **Owner Responsibilities** β”‚\n", + "β”‚ β”‚ - **Membership management** (additions, removals, updates) β”‚\n", + "β”‚ β”‚ - **Usage monitoring** and policy compliance β”‚\n", + "β”‚ β”‚ - **Regular membership reviews** (quarterly for most lists) β”‚\n", + "β”‚ β”‚ - **Incident reporting** for misuse or security concerns β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ ## Managing Distribution Lists β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ ### **Self-Service Management** β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ #### **Adding Members** β”‚\n", + "β”‚ β”‚ 1. **Access Management Portal** β”‚\n", + "β”‚ β”‚ - Navigate to `groups.company.com` β”‚\n", + "β”‚ β”‚ - Sign in with your **company credentials** β”‚\n", + "β”‚ β”‚ - Select your **managed distribution lists** β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ 2. **Add New Members** β”‚\n", + "β”‚ β”‚ - Click **Add Members** for the target list β”‚\n", + "β”‚ β”‚ - Enter **email addresses** or search company directory β”‚\n", + "β”‚ β”‚ - Verify **membership criteria** compliance β”‚\n", + "β”‚ β”‚ - Click **Add** to complete the process β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ 3. **Bulk Import** (for large additions) β”‚\n", + "β”‚ β”‚ - Download **CSV template** from management portal β”‚\n", + "β”‚ β”‚ - Complete template with **member information** β”‚\n", + "β”‚ β”‚ - Upload file and **review additions** before confirming β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ #### **Removing Members** β”‚\n", + "β”‚ β”‚ 1. **Individual Removal** β”‚\n", + "β”‚ β”‚ - Select **members to remove** from list view β”‚\n", + "β”‚ β”‚ - Click **Remove Members** β”‚\n", + "β”‚ β”‚ - **Confirm removal** and document reason if required β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ 2. **Automated Removal** β”‚\n", + "β”‚ β”‚ - **Inactive accounts** automatically removed after 30 days β”‚\n", + "β”‚ β”‚ - **Departed employees** removed within 24 hours β”‚\n", + "β”‚ β”‚ - **Role changes** may trigger automatic removal β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ #### **Membership Reviews** β”‚\n", + "β”‚ β”‚ - **Quarterly reviews** required for most lists β”‚\n", + "β”‚ β”‚ - **Annual comprehensive reviews** for all lists β”‚\n", + "β”‚ β”‚ - **Immediate reviews** following organizational changes β”‚\n", + "β”‚ β”‚ - **Documentation** of review results and actions taken β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ ### **Advanced Management Features** β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ #### **Message Moderation** β”‚\n", + "β”‚ β”‚ - **Enable moderation** for lists requiring content approval β”‚\n", + "β”‚ β”‚ - **Designate moderators** with message approval rights β”‚\n", + "β”‚ β”‚ - **Set approval criteria** and response timeframes β”‚\n", + "β”‚ β”‚ - **Configure rejection notifications** for inappropriate content β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ #### **External Sender Management** β”‚\n", + "β”‚ β”‚ - **Allow external senders** for customer or vendor communication β”‚\n", + "β”‚ β”‚ - **Whitelist specific domains** or email addresses β”‚\n", + "β”‚ β”‚ - **Require sender authentication** for external messages β”‚\n", + "β”‚ β”‚ - **Log external communications** for security monitoring β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ #### **Integration with Other Systems** β”‚\n", + "β”‚ β”‚ - **SharePoint integration** for document sharing β”‚\n", + "β”‚ β”‚ - **Microsoft Teams** channel creation for collaboration β”‚\n", + "β”‚ β”‚ - **Calendar integration** for meeting invitations β”‚\n", + "β”‚ β”‚ - **Mobile app notifications** for important communications β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ ## Usage Guidelines and Best Practices β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ ### **Appropriate Usage** β”‚\n", + "β”‚ β”‚ - **Business communications** related to list purpose β”‚\n", + "β”‚ β”‚ - **Time-sensitive announcements** requiring broad distribution β”‚\n", + "β”‚ β”‚ - **Collaborative discussions** within project or department scope β”‚\n", + "β”‚ β”‚ - **Emergency notifications** for safety or security issues β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ ### **Prohibited Usage** β”‚\n", + "β”‚ β”‚ - **Personal communications** unrelated to business β”‚\n", + "β”‚ β”‚ - **Spam or promotional** content from external sources β”‚\n", + "β”‚ β”‚ - **Confidential information** on non-secure lists β”‚\n", + "β”‚ β”‚ - **Large file attachments** that may impact email system performance β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ ### **Communication Etiquette** β”‚\n", + "β”‚ β”‚ - **Use clear, descriptive** subject lines β”‚\n", + "β”‚ β”‚ - **Keep messages concise** and relevant to all recipients β”‚\n", + "β”‚ β”‚ - **Reply judiciously** - consider if all members need to see responses β”‚\n", + "β”‚ β”‚ - **Use \"Reply All\" sparingly** to avoid unnecessary email volume β”‚\n", + "β”‚ β”‚ - **Include context** when forwarding messages to lists β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ ### **Security Considerations** β”‚\n", + "β”‚ β”‚ - **Verify recipient lists** before sending sensitive information β”‚\n", + "β”‚ β”‚ - **Use encryption** for confidential communications β”‚\n", + "β”‚ β”‚ - **Avoid including** external recipients on internal lists β”‚\n", + "β”‚ β”‚ - **Report suspicious messages** to IT Security immediately β”‚\n", + "β”‚ β”‚ - **Follow data classification** policies for all communications β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ ## Troubleshooting Common Issues β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ ### **Delivery Problems** β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ #### **Messages Not Delivered** β”‚\n", + "β”‚ β”‚ - **Check list membership** - ensure you're subscribed to the list β”‚\n", + "β”‚ β”‚ - **Verify sender permissions** - confirm you're authorized to send β”‚\n", + "β”‚ β”‚ - **Review message size** - large attachments may be blocked β”‚\n", + "β”‚ β”‚ - **Check spam filters** - messages may be filtered by security systems β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ #### **Partial Delivery** β”‚\n", + "β”‚ β”‚ - **External recipient blocking** - some domains may reject list messages β”‚\n", + "β”‚ β”‚ - **Mailbox full** - individual recipient mailboxes may be at capacity β”‚\n", + "β”‚ β”‚ - **Inactive accounts** - departed employees may still be listed β”‚\n", + "β”‚ β”‚ - **Distribution delays** - large lists may experience delivery delays β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ ### **Management Issues** β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ #### **Cannot Add Members** β”‚\n", + "β”‚ β”‚ - **Verify ownership permissions** - ensure you're designated as list owner β”‚\n", + "β”‚ β”‚ - **Check member eligibility** - confirm recipients meet list criteria β”‚\n", + "β”‚ β”‚ - **Review approval requirements** - some additions may require manager approval β”‚\n", + "β”‚ β”‚ - **Validate email addresses** - ensure addresses are correctly formatted β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ #### **Membership Sync Problems** β”‚\n", + "β”‚ β”‚ - **Active Directory delays** - automatic updates may take 24 hours β”‚\n", + "β”‚ β”‚ - **Organizational changes** - department moves may affect list membership β”‚\n", + "β”‚ β”‚ - **Account status changes** - role changes may trigger unexpected removals β”‚\n", + "β”‚ β”‚ - **Manual override** - contact IT for immediate membership corrections β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ ### **Access and Permission Issues** β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ #### **Cannot Manage List** β”‚\n", + "β”‚ β”‚ - **Ownership verification** - confirm you're designated as primary or secondary owner β”‚\n", + "β”‚ β”‚ - **Account permissions** - ensure your account has proper management rights β”‚\n", + "β”‚ β”‚ - **System maintenance** - management portal may be temporarily unavailable β”‚\n", + "β”‚ β”‚ - **Training requirements** - new owners may need management training β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ ## Monitoring and Reporting β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ ### **Usage Analytics** β”‚\n", + "β”‚ β”‚ - **Message volume** tracking and trending β”‚\n", + "β”‚ β”‚ - **Membership growth** and turnover analysis β”‚\n", + "β”‚ β”‚ - **Delivery success rates** and failure analysis β”‚\n", + "β”‚ β”‚ - **Top senders** and communication patterns β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ ### **Compliance Monitoring** β”‚\n", + "β”‚ β”‚ - **Content scanning** for policy violations β”‚\n", + "β”‚ β”‚ - **External communication** tracking and approval β”‚\n", + "β”‚ β”‚ - **Data classification** compliance verification β”‚\n", + "β”‚ β”‚ - **Retention policy** enforcement and archival β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ ### **Performance Metrics** β”‚\n", + "β”‚ β”‚ - **Delivery times** and system performance β”‚\n", + "β”‚ β”‚ - **User satisfaction** surveys and feedback β”‚\n", + "β”‚ β”‚ - **Cost analysis** for list maintenance and operations β”‚\n", + "β”‚ β”‚ - **Security incident** tracking and response β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ ## List Lifecycle Management β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ ### **Regular Maintenance** β”‚\n", + "β”‚ β”‚ - **Quarterly membership** reviews and updates β”‚\n", + "β”‚ β”‚ - **Annual purpose validation** and business justification β”‚\n", + "β”‚ β”‚ - **Owner succession** planning and documentation β”‚\n", + "β”‚ β”‚ - **Performance optimization** and cleanup β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ ### **List Retirement** β”‚\n", + "β”‚ β”‚ #### **Project Completion** β”‚\n", + "β”‚ β”‚ - **Archive list communications** for future reference β”‚\n", + "β”‚ β”‚ - **Notify members** of list deactivation β”‚\n", + "β”‚ β”‚ - **Redirect to successor lists** if applicable β”‚\n", + "β”‚ β”‚ - **Maintain read-only access** for historical purposes β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ #### **Organizational Changes** β”‚\n", + "β”‚ β”‚ - **Merge redundant lists** following reorganizations β”‚\n", + "β”‚ β”‚ - **Update naming conventions** for consistency β”‚\n", + "β”‚ β”‚ - **Transfer ownership** for continuing business needs β”‚\n", + "β”‚ β”‚ - **Document changes** for audit and compliance β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ ## Support and Training β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ ### **Self-Service Resources** β”‚\n", + "β”‚ β”‚ - **Management Portal:** `groups.company.com` - List management interface β”‚\n", + "β”‚ β”‚ - **Knowledge Base:** Comprehensive guides and FAQs β”‚\n", + "β”‚ β”‚ - **Video Tutorials:** Step-by-step management instructions β”‚\n", + "β”‚ β”‚ - **Best Practices Guide:** Communication and management recommendations β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ ### **Technical Support** β”‚\n", + "β”‚ β”‚ - **Email Support:** `email-support@company.com` or ext. 4357 β”‚\n", + "β”‚ β”‚ - **Distribution List Specialists:** `dl-support@company.com` β”‚\n", + "β”‚ β”‚ - **Training Coordinator:** `email-training@company.com` β”‚\n", + "β”‚ β”‚ - **Compliance Questions:** `email-compliance@company.com` β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ ### **Training Programs** β”‚\n", + "β”‚ β”‚ - **New Owner Training:** Required for all list owners β”‚\n", + "β”‚ β”‚ - **Advanced Management:** Optional training for complex list requirements β”‚\n", + "β”‚ β”‚ - **Compliance Training:** Required for security and regulated lists β”‚\n", + "β”‚ β”‚ - **User Etiquette:** Available for all employees β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ --- β”‚\n", + "β”‚ β”‚ β”‚\n", + "β”‚ β”‚ *Last updated: [Current Date] | Document ID: KB-EMAIL-001 | Classification: Internal Use* β”‚\n", + "β”‚ β”‚ β”‚\n", + "β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜\n", + " \n", + " \n", + "\u001b[3m Generated Columns \u001b[0m\n", + "┏━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n", + "┃\u001b[1m \u001b[0m\u001b[1mName \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mValue \u001b[0m\u001b[1m \u001b[0m┃\n", + "┑━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n", + "β”‚ question β”‚ How do I add new employees to our company's email distribution list without sending a test β”‚\n", + "β”‚ β”‚ email to confirm it works? β”‚\n", + "β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€\n", + "β”‚ context_key_words β”‚ add employees, distribution list, skip test email β”‚\n", + "β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€\n", + "β”‚ ground_truth β”‚ To add new employees to an email distribution list without sending a test email, use the β”‚\n", + "β”‚ β”‚ **IT Service Portal** or **Management Portal** (`groups.company.com`) to manually add β”‚\n", + "β”‚ β”‚ members by entering their email addresses or searching the company directory. The system β”‚\n", + "β”‚ β”‚ will update the list automatically once additions are confirmed through the portal. β”‚\n", + "β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜\n", + " \n", + " [index: 0] \n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Preview a few sample records to see what will be generated\n", + "preview = data_designer.preview(config_builder=config_builder, num_records=3)\n", + "preview.display_sample_record()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 6. Generate the Full Dataset\n", + "\n", + "Now let's generate the complete evaluation dataset." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[00:13:52] [INFO] 🎨 Creating Data Designer dataset\n", + "[00:13:52] [INFO] βœ… Validation passed\n", + "[00:13:52] [INFO] ⛓️ Sorting column configs into a Directed Acyclic Graph\n", + "[00:13:52] [INFO] πŸ“‚ Dataset path '/home/nvidia/workshop-build-an-agent/code/3-agent-evaluation/artifacts/rag_agent_test_cases' already exists. Dataset from this session\n", + "\t\t will be saved to '/home/nvidia/workshop-build-an-agent/code/3-agent-evaluation/artifacts/rag_agent_test_cases_12-11-2025_001352' instead.\n", + "[00:13:52] [INFO] 🩺 Running health checks for models...\n", + "[00:13:52] [INFO] |-- πŸ‘€ Checking 'nvidia/nvidia-nemotron-nano-9b-v2' in provider named 'nvidia' for model alias 'nvidia-text'...\n", + "[00:13:53] [INFO] |-- βœ… Passed!\n", + "[00:13:53] [INFO] ⏳ Processing batch 1 of 1\n", + "[00:13:53] [INFO] 🌱 Sampling 10 records from seed dataset\n", + "[00:13:53] [INFO] |-- seed dataset size: 12 records\n", + "[00:13:53] [INFO] |-- sampling strategy: ordered\n", + "[00:13:53] [INFO] πŸ“ Preparing llm-text column generation\n", + "[00:13:53] [INFO] |-- column name: 'question'\n", + "[00:13:53] [INFO] |-- model config:\n", + "{\n", + " \"alias\": \"nvidia-text\",\n", + " \"model\": \"nvidia/nvidia-nemotron-nano-9b-v2\",\n", + " \"inference_parameters\": {\n", + " \"temperature\": 0.85,\n", + " \"top_p\": 0.95,\n", + " \"max_tokens\": null,\n", + " \"max_parallel_requests\": 4,\n", + " \"timeout\": null,\n", + " \"extra_body\": null\n", + " },\n", + " \"provider\": \"nvidia\"\n", + "}\n", + "[00:13:53] [INFO] πŸ™ Processing llm-text column 'question' with 4 concurrent workers\n", + "[00:14:07] [INFO] πŸ“ Preparing llm-text column generation\n", + "[00:14:07] [INFO] |-- column name: 'context_key_words'\n", + "[00:14:07] [INFO] |-- model config:\n", + "{\n", + " \"alias\": \"nvidia-text\",\n", + " \"model\": \"nvidia/nvidia-nemotron-nano-9b-v2\",\n", + " \"inference_parameters\": {\n", + " \"temperature\": 0.85,\n", + " \"top_p\": 0.95,\n", + " \"max_tokens\": null,\n", + " \"max_parallel_requests\": 4,\n", + " \"timeout\": null,\n", + " \"extra_body\": null\n", + " },\n", + " \"provider\": \"nvidia\"\n", + "}\n", + "[00:14:07] [INFO] πŸ™ Processing llm-text column 'context_key_words' with 4 concurrent workers\n", + "[00:14:15] [INFO] πŸ“ Preparing llm-text column generation\n", + "[00:14:15] [INFO] |-- column name: 'ground_truth'\n", + "[00:14:15] [INFO] |-- model config:\n", + "{\n", + " \"alias\": \"nvidia-text\",\n", + " \"model\": \"nvidia/nvidia-nemotron-nano-9b-v2\",\n", + " \"inference_parameters\": {\n", + " \"temperature\": 0.85,\n", + " \"top_p\": 0.95,\n", + " \"max_tokens\": null,\n", + " \"max_parallel_requests\": 4,\n", + " \"timeout\": null,\n", + " \"extra_body\": null\n", + " },\n", + " \"provider\": \"nvidia\"\n", + "}\n", + "[00:14:15] [INFO] πŸ™ Processing llm-text column 'ground_truth' with 4 concurrent workers\n", + "[00:14:24] [INFO] πŸ“Š Model usage summary:\n", + "{\n", + " \"nvidia/nvidia-nemotron-nano-9b-v2\": {\n", + " \"token_usage\": {\n", + " \"prompt_tokens\": 20538,\n", + " \"completion_tokens\": 11912,\n", + " \"total_tokens\": 32450\n", + " },\n", + " \"request_usage\": {\n", + " \"successful_requests\": 30,\n", + " \"failed_requests\": 0,\n", + " \"total_requests\": 30\n", + " },\n", + " \"tokens_per_second\": 1032,\n", + " \"requests_per_minute\": 57\n", + " }\n", + "}\n", + "[00:14:24] [INFO] πŸ“ Measuring dataset column statistics:\n", + "[00:14:24] [INFO] |-- 🌱 column: 'topic'\n", + "[00:14:24] [INFO] |-- 🌱 column: 'title'\n", + "[00:14:24] [INFO] |-- 🌱 column: 'filename'\n", + "[00:14:24] [INFO] |-- 🌱 column: 'content'\n", + "[00:14:24] [INFO] |-- πŸ“ column: 'question'\n", + "[00:14:24] [INFO] |-- πŸ“ column: 'context_key_words'\n", + "[00:14:24] [INFO] |-- πŸ“ column: 'ground_truth'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Generated 10 test cases\n" + ] + } + ], + "source": [ + "# We'll only generate a few records for this tutorial\n", + "dataset_results = data_designer.create(\n", + " config_builder=config_builder,\n", + " num_records = 10,\n", + " dataset_name=\"rag_agent_test_cases\"\n", + ")\n", + "\n", + "# Convert to list of dictionaries for processing\n", + "eval_data = dataset_results.load_dataset().to_dict('records')\n", + "\n", + "print(f\"Generated {len(eval_data)} test cases\")\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 7. Save the Test Data\n", + "\n", + "Now let's clean up and save the generated data in a format ready for evaluation.\n", + "\n", + "We'll keep only the essential evaluation fields: **question**, **context_key_words**, and **ground_truth**. We'll remove the seed data and reasoning traces to make the output cleaner and easier to review." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Saved 10 test cases to ../../data/evaluation/synthetic_rag_agent_test_cases.json\n" + ] + } + ], + "source": [ + "# Set output path\n", + "output_path = Path(\"../../data/evaluation/synthetic_rag_agent_test_cases.json\")\n", + "\n", + "# Keep only essential evaluation columns, ignore reasoning traces and seed data\n", + "essential_columns = ['question', 'context_key_words', 'ground_truth']\n", + "clean_data = []\n", + "\n", + "for record in eval_data:\n", + " clean_record = {}\n", + " for key, value in record.items():\n", + " if key in essential_columns:\n", + " clean_record[key] = value\n", + " clean_data.append(clean_record)\n", + "\n", + "# Save to JSON file\n", + "with open(output_path, 'w') as f:\n", + " json.dump(clean_data, f, indent=2)\n", + "\n", + "print(f\"Saved {len(eval_data)} test cases to {output_path}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## What's Next?\n", + "\n", + "Check out to view your generated data.\n", + "\n", + "In the next notebook, you'll use this same process to create an evaluation dataset for your Report Generation agent!" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv", + "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.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/code/3-agent-evaluation/generate_report_eval_dataset.ipynb b/code/3-agent-evaluation/generate_report_eval_dataset.ipynb new file mode 100644 index 0000000..9a821b7 --- /dev/null +++ b/code/3-agent-evaluation/generate_report_eval_dataset.ipynb @@ -0,0 +1,630 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Generate an Evaluation Dataset for a Report Generation Agent\n", + "\n", + "In this notebook, you'll create a synthetic evaluation dataset using **NVIDIA NeMo Data Designer** for the **Report Generation Agent** from Module 1, using your learnings from the previous evaluation data notebook." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1. Setup\n", + "\n", + "First, let's install the Data Designer library and set up our environment." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Note: you may need to restart the kernel to use updated packages.\n", + "Completed setup\n" + ] + } + ], + "source": [ + "# Install Data Designer if needed\n", + "%pip install data-designer -q\n", + "\n", + "# Load environment variables\n", + "from dotenv import load_dotenv\n", + "_ = load_dotenv(\"../../variables.env\")\n", + "_ = load_dotenv(\"../../secrets.env\")\n", + "\n", + "import os\n", + "import json\n", + "from pathlib import Path\n", + "\n", + "print(\"Completed setup\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2. Configure DataDesigner\n", + "\n", + "Initialize Data Designer with default settings." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Completed initialization\n" + ] + } + ], + "source": [ + "from data_designer.essentials import (\n", + " DataDesigner,\n", + " DataDesignerConfigBuilder,\n", + " LLMStructuredColumnConfig,\n", + ")\n", + "\n", + "# Initialize Data Designer with default settings\n", + "data_designer = DataDesigner()\n", + "config_builder = DataDesignerConfigBuilder()\n", + "\n", + "print(\"Completed initialization\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3. Create Seed Data with Report Topics\n", + "\n", + "Unlike the RAG agent which retrieves from a knowledge base, the report agent generates comprehensive reports on given topics. This will change the type of evaluation metrics we use, and require a different type of evaluation data.\n", + "\n", + "Let's start with some seed data. We'll start a list of manually curated topics. This will help avoid semantic duplication, ensuring that the evaluation data covers a variety of different domains." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[17:50:53] [INFO] πŸ’Ύ Saving seed dataset to ../../data/evaluation/report_seed_data.parquet\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Created seed data with 10 topics\n" + ] + } + ], + "source": [ + "import pandas as pd\n", + "\n", + "# Define diverse report topics across different domains\n", + "report_topics_data = [\n", + " {\n", + " \"domain\": \"Technology\",\n", + " \"topic_area\": \"Artificial Intelligence\",\n", + " },\n", + " {\n", + " \"domain\": \"Energy\",\n", + " \"topic_area\": \"Renewable Energy\"\n", + " },\n", + " {\n", + " \"domain\": \"Business\",\n", + " \"topic_area\": \"Remote Work\",\n", + " },\n", + " {\n", + " \"domain\": \"Technology\",\n", + " \"topic_area\": \"Quantum Computing\",\n", + " },\n", + " {\n", + " \"domain\": \"Supply Chain\",\n", + " \"topic_area\": \"Sustainability\",\n", + " },\n", + " {\n", + " \"domain\": \"Cybersecurity\",\n", + " \"topic_area\": \"Financial Sector Threats\",\n", + " },\n", + " {\n", + " \"domain\": \"Healthcare\",\n", + " \"topic_area\": \"Digital Health Technologies\",\n", + " },\n", + " {\n", + " \"domain\": \"Education\",\n", + " \"topic_area\": \"Online Learning Platforms\",\n", + " },\n", + " {\n", + " \"domain\": \"Climate\",\n", + " \"topic_area\": \"Carbon Capture Technologies\",\n", + " },\n", + " {\n", + " \"domain\": \"Finance\",\n", + " \"topic_area\": \"Cryptocurrency Regulation\"\n", + " }\n", + "]\n", + "\n", + "# Create seed data and save it for Data Designer\n", + "seed_data = pd.DataFrame(report_topics_data)\n", + "seed_file_path = Path(\"../../data/evaluation/report_seed_data.parquet\")\n", + "\n", + "seed_ref = data_designer.make_seed_reference_from_dataframe(\n", + " dataframe=seed_data,\n", + " file_path=seed_file_path\n", + ")\n", + "\n", + "print(f\"Created seed data with {len(seed_data)} topics\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 4. Configure Data Designer for Report Evaluation\n", + "\n", + "Now we'll configure Data Designer to generate complete evaluation test cases using **LLM-Structured Columns**. This approach is different from the text-based columns we used for the RAG agentβ€”instead of generating separate text fields, we use a Pydantic model to define the entire structure we want:\n", + "\n", + "- **Topic** - A specific professional report topic\n", + "- **Expected Sections** - A list of 6-8 section titles \n", + "- **Quality Criteria** - A nested object with `should_include` and `should_avoid` lists\n", + "\n", + "Using `LLMStructuredColumnConfig`, Data Designer generates the topic, sections, and criteria together in one LLM call, ensuring coherence. It also ensures all required fields are present and correctly typed.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Dataset configuration built with structured output\n" + ] + } + ], + "source": [ + "from typing import List\n", + "from pydantic import BaseModel, Field\n", + "\n", + "# Define Pydantic models for structured output\n", + "class QualityCriteria(BaseModel):\n", + " should_include: List[str] = Field(\n", + " description=\"3-4 specific things that SHOULD be included for a high-quality report\"\n", + " )\n", + " should_avoid: List[str] = Field(\n", + " description=\"3-4 things that SHOULD be avoided to maintain quality and objectivity\"\n", + " )\n", + "\n", + "class ReportEvaluationCase(BaseModel):\n", + " topic: str = Field(\n", + " description=\"Specific, professional report topic\"\n", + " )\n", + " expected_sections: List[str] = Field(\n", + " description=\"6-8 section titles for a comprehensive professional report\"\n", + " )\n", + " quality_criteria: QualityCriteria = Field(\n", + " description=\"Quality criteria for evaluating the report\"\n", + " )\n", + "\n", + "# Create config builder with seed data\n", + "config_builder = DataDesignerConfigBuilder()\n", + "config_builder.with_seed_dataset(seed_ref)\n", + "\n", + "# Generate complete structured evaluation case in a single column\n", + "config_builder.add_column(\n", + " LLMStructuredColumnConfig(\n", + " name=\"evaluation_case\",\n", + " model_alias=\"nvidia-text\",\n", + " output_format=ReportEvaluationCase,\n", + " prompt=\"\"\"Generate a complete evaluation test case for a professional report.\n", + "\n", + "Context:\n", + "- Domain: {{ domain }}\n", + "- Topic Area: {{ topic_area }}\n", + "\n", + "Create an evaluation case that includes:\n", + "\n", + "1. TOPIC: A specific, professional report topic that is:\n", + " - Focused and not too broad\n", + " - Relevant to current trends in {{ topic_area }}\n", + " - Suitable for a comprehensive multi-section research report\n", + "\n", + "2. EXPECTED_SECTIONS: 6-8 section titles that:\n", + " - Start with an introduction or executive summary\n", + " - Include substantive middle sections covering key aspects\n", + " - End with conclusions, recommendations, or future outlook\n", + " - Use clear, professional section titles\n", + " - Follow a logical flow\n", + "\n", + "3. QUALITY_CRITERIA:\n", + " - should_include: 3-4 specific things that SHOULD be included for quality\n", + " - should_avoid: 3-4 things that SHOULD be avoided to maintain objectivity\"\"\",\n", + " )\n", + ")\n", + "\n", + "print(\"Dataset configuration built with structured output\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 5. Preview the Data Structure\n", + "\n", + "Let's preview what the generated test cases will look like." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[17:51:01] [INFO] πŸ‘€ Preview generation in progress\n", + "[17:51:01] [INFO] βœ… Validation passed\n", + "[17:51:01] [INFO] ⛓️ Sorting column configs into a Directed Acyclic Graph\n", + "[17:51:01] [INFO] 🩺 Running health checks for models...\n", + "[17:51:01] [INFO] |-- πŸ‘€ Checking 'nvidia/nvidia-nemotron-nano-9b-v2' in provider named 'nvidia' for model alias 'nvidia-text'...\n", + "[17:51:03] [INFO] |-- βœ… Passed!\n", + "[17:51:03] [INFO] 🌱 Sampling 3 records from seed dataset\n", + "[17:51:03] [INFO] |-- seed dataset size: 10 records\n", + "[17:51:03] [INFO] |-- sampling strategy: ordered\n", + "[17:51:03] [INFO] πŸ—‚οΈ Preparing llm-structured column generation\n", + "[17:51:03] [INFO] |-- column name: 'evaluation_case'\n", + "[17:51:03] [INFO] |-- model config:\n", + "{\n", + " \"alias\": \"nvidia-text\",\n", + " \"model\": \"nvidia/nvidia-nemotron-nano-9b-v2\",\n", + " \"inference_parameters\": {\n", + " \"temperature\": 0.85,\n", + " \"top_p\": 0.95,\n", + " \"max_tokens\": null,\n", + " \"max_parallel_requests\": 4,\n", + " \"timeout\": null,\n", + " \"extra_body\": null\n", + " },\n", + " \"provider\": \"nvidia\"\n", + "}\n", + "[17:51:03] [INFO] πŸ™ Processing llm-structured column 'evaluation_case' with 4 concurrent workers\n", + "[17:51:10] [INFO] πŸ“Š Model usage summary:\n", + "{\n", + " \"nvidia/nvidia-nemotron-nano-9b-v2\": {\n", + " \"token_usage\": {\n", + " \"prompt_tokens\": 1601,\n", + " \"completion_tokens\": 2259,\n", + " \"total_tokens\": 3860\n", + " },\n", + " \"request_usage\": {\n", + " \"successful_requests\": 3,\n", + " \"failed_requests\": 0,\n", + " \"total_requests\": 3\n", + " },\n", + " \"tokens_per_second\": 529,\n", + " \"requests_per_minute\": 24\n", + " }\n", + "}\n", + "[17:51:10] [INFO] πŸ“ Measuring dataset column statistics:\n", + "[17:51:10] [INFO] |-- 🌱 column: 'domain'\n", + "[17:51:10] [INFO] |-- 🌱 column: 'topic_area'\n", + "[17:51:10] [INFO] |-- πŸ—‚οΈ column: 'evaluation_case'\n", + "[17:51:10] [INFO] πŸ‘ Preview complete!\n" + ] + }, + { + "data": { + "text/html": [ + "
                                                                                                                   \n",
+       "                                                   Seed Columns                                                    \n",
+       "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
+       "┃ Name                                ┃ Value                                                                     ┃\n",
+       "┑━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
+       "β”‚ domain                              β”‚ Technology                                                                β”‚\n",
+       "β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€\n",
+       "β”‚ topic_area                          β”‚ Artificial Intelligence                                                   β”‚\n",
+       "β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜\n",
+       "                                                                                                                   \n",
+       "                                                                                                                   \n",
+       "                                                 Generated Columns                                                 \n",
+       "┏━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
+       "┃ Name            ┃ Value                                                                                         ┃\n",
+       "┑━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
+       "β”‚ evaluation_case β”‚ {                                                                                             β”‚\n",
+       "β”‚                 β”‚     'topic': 'Ethical Implications of Generative AI in Content Creation',                     β”‚\n",
+       "β”‚                 β”‚     'expected_sections': [                                                                    β”‚\n",
+       "β”‚                 β”‚         'Executive Summary',                                                                  β”‚\n",
+       "β”‚                 β”‚         'Methodology and Scope',                                                              β”‚\n",
+       "β”‚                 β”‚         'Technical Overview of Generative AI Models',                                         β”‚\n",
+       "β”‚                 β”‚         'Ethical Challenges in Content Generation',                                           β”‚\n",
+       "β”‚                 β”‚         'Case Studies: AI-Generated Content in Media and Marketing',                          β”‚\n",
+       "β”‚                 β”‚         'Policy Recommendations for Ethical AI Deployment',                                   β”‚\n",
+       "β”‚                 β”‚         'Future Outlook and Risk Mitigation Strategies'                                       β”‚\n",
+       "β”‚                 β”‚     ],                                                                                        β”‚\n",
+       "β”‚                 β”‚     'quality_criteria': {                                                                     β”‚\n",
+       "β”‚                 β”‚         'should_include': [                                                                   β”‚\n",
+       "β”‚                 β”‚             'A thorough analysis of existing ethical frameworks (e.g., transparency, bias,    β”‚\n",
+       "β”‚                 β”‚ accountability) relevant to generative AI',                                                   β”‚\n",
+       "β”‚                 β”‚             'Real-world examples of AI-generated content misuse or success',                  β”‚\n",
+       "β”‚                 β”‚             'Data-driven evaluation of bias or misinformation risks in AI outputs',           β”‚\n",
+       "β”‚                 β”‚             'Balanced discussion of both opportunities and risks for stakeholders'            β”‚\n",
+       "β”‚                 β”‚         ],                                                                                    β”‚\n",
+       "β”‚                 β”‚         'should_avoid': [                                                                     β”‚\n",
+       "β”‚                 β”‚             'Overly technical jargon without clear explanations for non-expert readers',      β”‚\n",
+       "β”‚                 β”‚             'Unsubstantiated claims about AI capabilities or ethical impacts',                β”‚\n",
+       "β”‚                 β”‚             'Ignoring counterarguments or dissenting perspectives',                           β”‚\n",
+       "β”‚                 β”‚             'Plagiarism or lack of proper citations for referenced studies'                   β”‚\n",
+       "β”‚                 β”‚         ]                                                                                     β”‚\n",
+       "β”‚                 β”‚     }                                                                                         β”‚\n",
+       "β”‚                 β”‚ }                                                                                             β”‚\n",
+       "β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜\n",
+       "                                                                                                                   \n",
+       "                                                    [index: 0]                                                     \n",
+       "
\n" + ], + "text/plain": [ + " \n", + "\u001b[3m Seed Columns \u001b[0m\n", + "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n", + "┃\u001b[1m \u001b[0m\u001b[1mName \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mValue \u001b[0m\u001b[1m \u001b[0m┃\n", + "┑━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n", + "β”‚ domain β”‚ Technology β”‚\n", + "β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€\n", + "β”‚ topic_area β”‚ Artificial Intelligence β”‚\n", + "β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜\n", + " \n", + " \n", + "\u001b[3m Generated Columns \u001b[0m\n", + "┏━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n", + "┃\u001b[1m \u001b[0m\u001b[1mName \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mValue \u001b[0m\u001b[1m \u001b[0m┃\n", + "┑━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n", + "β”‚ evaluation_case β”‚ \u001b[1m{\u001b[0m β”‚\n", + "β”‚ β”‚ \u001b[32m'topic'\u001b[0m: \u001b[32m'Ethical Implications of Generative AI in Content Creation'\u001b[0m, β”‚\n", + "β”‚ β”‚ \u001b[32m'expected_sections'\u001b[0m: \u001b[1m[\u001b[0m β”‚\n", + "β”‚ β”‚ \u001b[32m'Executive Summary'\u001b[0m, β”‚\n", + "β”‚ β”‚ \u001b[32m'Methodology and Scope'\u001b[0m, β”‚\n", + "β”‚ β”‚ \u001b[32m'Technical Overview of Generative AI Models'\u001b[0m, β”‚\n", + "β”‚ β”‚ \u001b[32m'Ethical Challenges in Content Generation'\u001b[0m, β”‚\n", + "β”‚ β”‚ \u001b[32m'Case Studies: AI-Generated Content in Media and Marketing'\u001b[0m, β”‚\n", + "β”‚ β”‚ \u001b[32m'Policy Recommendations for Ethical AI Deployment'\u001b[0m, β”‚\n", + "β”‚ β”‚ \u001b[32m'Future Outlook and Risk Mitigation Strategies'\u001b[0m β”‚\n", + "β”‚ β”‚ \u001b[1m]\u001b[0m, β”‚\n", + "β”‚ β”‚ \u001b[32m'quality_criteria'\u001b[0m: \u001b[1m{\u001b[0m β”‚\n", + "β”‚ β”‚ \u001b[32m'should_include'\u001b[0m: \u001b[1m[\u001b[0m β”‚\n", + "β”‚ β”‚ \u001b[32m'A thorough analysis of existing ethical frameworks \u001b[0m\u001b[32m(\u001b[0m\u001b[32me.g., transparency, bias, \u001b[0m β”‚\n", + "β”‚ β”‚ \u001b[32maccountability\u001b[0m\u001b[32m)\u001b[0m\u001b[32m relevant to generative AI'\u001b[0m, β”‚\n", + "β”‚ β”‚ \u001b[32m'Real-world examples of AI-generated content misuse or success'\u001b[0m, β”‚\n", + "β”‚ β”‚ \u001b[32m'Data-driven evaluation of bias or misinformation risks in AI outputs'\u001b[0m, β”‚\n", + "β”‚ β”‚ \u001b[32m'Balanced discussion of both opportunities and risks for stakeholders'\u001b[0m β”‚\n", + "β”‚ β”‚ \u001b[1m]\u001b[0m, β”‚\n", + "β”‚ β”‚ \u001b[32m'should_avoid'\u001b[0m: \u001b[1m[\u001b[0m β”‚\n", + "β”‚ β”‚ \u001b[32m'Overly technical jargon without clear explanations for non-expert readers'\u001b[0m, β”‚\n", + "β”‚ β”‚ \u001b[32m'Unsubstantiated claims about AI capabilities or ethical impacts'\u001b[0m, β”‚\n", + "β”‚ β”‚ \u001b[32m'Ignoring counterarguments or dissenting perspectives'\u001b[0m, β”‚\n", + "β”‚ β”‚ \u001b[32m'Plagiarism or lack of proper citations for referenced studies'\u001b[0m β”‚\n", + "β”‚ β”‚ \u001b[1m]\u001b[0m β”‚\n", + "β”‚ β”‚ \u001b[1m}\u001b[0m β”‚\n", + "β”‚ β”‚ \u001b[1m}\u001b[0m β”‚\n", + "β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜\n", + " \n", + " [index: 0] \n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Preview a few sample records to see what will be generated\n", + "preview = data_designer.preview(config_builder=config_builder, num_records=3)\n", + "preview.display_sample_record()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 6. Generate the Full Dataset\n", + "\n", + "Now generate the complete evaluation dataset. We'll generate one test case per topic seed to ensure diverse coverage." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[17:51:23] [INFO] 🎨 Creating Data Designer dataset\n", + "[17:51:23] [INFO] βœ… Validation passed\n", + "[17:51:23] [INFO] ⛓️ Sorting column configs into a Directed Acyclic Graph\n", + "[17:51:23] [INFO] πŸ“‚ Dataset path '/home/nvidia/workshop-build-an-agent/code/3-agent-evaluation/artifacts/report_agent_test_cases' already exists. Dataset from this session\n", + "\t\t will be saved to '/home/nvidia/workshop-build-an-agent/code/3-agent-evaluation/artifacts/report_agent_test_cases_12-11-2025_175123' instead.\n", + "[17:51:23] [INFO] 🩺 Running health checks for models...\n", + "[17:51:23] [INFO] |-- πŸ‘€ Checking 'nvidia/nvidia-nemotron-nano-9b-v2' in provider named 'nvidia' for model alias 'nvidia-text'...\n", + "[17:51:24] [INFO] |-- βœ… Passed!\n", + "[17:51:24] [INFO] ⏳ Processing batch 1 of 1\n", + "[17:51:24] [INFO] 🌱 Sampling 10 records from seed dataset\n", + "[17:51:24] [INFO] |-- seed dataset size: 10 records\n", + "[17:51:24] [INFO] |-- sampling strategy: ordered\n", + "[17:51:24] [INFO] πŸ—‚οΈ Preparing llm-structured column generation\n", + "[17:51:24] [INFO] |-- column name: 'evaluation_case'\n", + "[17:51:24] [INFO] |-- model config:\n", + "{\n", + " \"alias\": \"nvidia-text\",\n", + " \"model\": \"nvidia/nvidia-nemotron-nano-9b-v2\",\n", + " \"inference_parameters\": {\n", + " \"temperature\": 0.85,\n", + " \"top_p\": 0.95,\n", + " \"max_tokens\": null,\n", + " \"max_parallel_requests\": 4,\n", + " \"timeout\": null,\n", + " \"extra_body\": null\n", + " },\n", + " \"provider\": \"nvidia\"\n", + "}\n", + "[17:51:24] [INFO] πŸ™ Processing llm-structured column 'evaluation_case' with 4 concurrent workers\n", + "[17:51:45] [INFO] πŸ“Š Model usage summary:\n", + "{\n", + " \"nvidia/nvidia-nemotron-nano-9b-v2\": {\n", + " \"token_usage\": {\n", + " \"prompt_tokens\": 5350,\n", + " \"completion_tokens\": 7384,\n", + " \"total_tokens\": 12734\n", + " },\n", + " \"request_usage\": {\n", + " \"successful_requests\": 10,\n", + " \"failed_requests\": 0,\n", + " \"total_requests\": 10\n", + " },\n", + " \"tokens_per_second\": 602,\n", + " \"requests_per_minute\": 28\n", + " }\n", + "}\n", + "[17:51:45] [INFO] πŸ“ Measuring dataset column statistics:\n", + "[17:51:45] [INFO] |-- 🌱 column: 'domain'\n", + "[17:51:45] [INFO] |-- 🌱 column: 'topic_area'\n", + "[17:51:45] [INFO] |-- πŸ—‚οΈ column: 'evaluation_case'\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Generated 10 test cases\n" + ] + } + ], + "source": [ + "# Generate evaluation data (one test case per topic seed)\n", + "num_topics = len(report_topics_data)\n", + "\n", + "dataset_results = data_designer.create(\n", + " config_builder=config_builder,\n", + " num_records=num_topics,\n", + " dataset_name=\"report_agent_test_cases\"\n", + ")\n", + "\n", + "# Convert to list of dictionaries for processing\n", + "eval_data = dataset_results.load_dataset().to_dict('records')\n", + "\n", + "print(f\"\\nGenerated {len(eval_data)} test cases\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 7. Save the Test Data\n", + "\n", + "You've successfully generated synthetic test data for evaluating your Report Generation agent!\n", + "\n", + "Just like before, let's clean up and save the generated data in a format ready for evaluation. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Saved 10 test cases to /home/nvidia/workshop-build-an-agent/code/3-agent-evaluation/../../data/evaluation/synthetic_report_agent_test_cases.json\n" + ] + } + ], + "source": [ + "# Set output path\n", + "output_path = Path(\"../../data/evaluation/synthetic_report_agent_test_cases.json\")\n", + "formatted_data = []\n", + "\n", + "for record in eval_data:\n", + " # Extract evaluation_case which contains our structured data\n", + " eval_case = record.get(\"evaluation_case\", {})\n", + " \n", + " # Handle both dict and Pydantic model formats\n", + " if hasattr(eval_case, 'model_dump'):\n", + " eval_case = eval_case.model_dump()\n", + " \n", + " # Extract quality criteria\n", + " quality_criteria = eval_case.get(\"quality_criteria\", {})\n", + " if hasattr(quality_criteria, 'model_dump'):\n", + " quality_criteria = quality_criteria.model_dump()\n", + " \n", + " formatted_data.append({\n", + " \"topic\": eval_case.get(\"topic\", \"\"),\n", + " \"expected_sections\": eval_case.get(\"expected_sections\", []),\n", + " \"quality_criteria\": {\n", + " \"should_include\": quality_criteria.get(\"should_include\", []),\n", + " \"should_avoid\": quality_criteria.get(\"should_avoid\", [])\n", + " }\n", + " })\n", + "\n", + "# Save to JSON file\n", + "with open(output_path, 'w') as f:\n", + " json.dump(formatted_data, f, indent=2)\n", + "\n", + "print(f\"Saved {len(formatted_data)} test cases to {output_path.absolute()}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## What's Next?\n", + "\n", + "Check out to view your generated data.\n", + "\n", + "You've built evaluation datasets for both of your agents. Now, you're ready to move on to the next step- putting together an evaluation pipeline and using the data you've generated to evaluate agent performance." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv", + "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.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} From 12b08a90ccdda3bfb93d9c20b55a670bcf2d20f5 Mon Sep 17 00:00:00 2001 From: Linnea Leaver Date: Thu, 11 Dec 2025 18:58:45 +0000 Subject: [PATCH 2/4] updates to reflect sdg changes --- .devx/3-agent-evaluation/evaluation_data.md | 105 +++++++++++++++++- .../3-agent-evaluation/running_evaluations.md | 65 +++++------ 2 files changed, 126 insertions(+), 44 deletions(-) diff --git a/.devx/3-agent-evaluation/evaluation_data.md b/.devx/3-agent-evaluation/evaluation_data.md index 11afe14..354ffd0 100644 --- a/.devx/3-agent-evaluation/evaluation_data.md +++ b/.devx/3-agent-evaluation/evaluation_data.md @@ -1,6 +1,19 @@ # Creating Evaluation Datasets -Effective evaluation metrics require high-quality test data. When creating evaluation datasets, here are some key considerations and best practices to keep in mind: +Dataset Design + +You've learned about the metrics you'll use to evaluate your agents. But how do you measure those metrics in practice? + +To produce high-quality, meaningful evaluation metrics, you need a well-designed evaluation dataset. In this lesson, you'll learn how to create evaluation datasets for the two agents you've built: + +- **IT Help Desk RAG Agent** (Module 2) +- **Report Generation Agent** (Module 1) + + + +## Dataset Design for Your Agents + +Evaluation datasets work best when they align with the following principles: 1. **Cover Diverse Scenarios**: Include common cases, edge cases, and failure modes 2. **Include Ground Truth**: Where possible, provide correct answers for comparison @@ -8,14 +21,98 @@ Effective evaluation metrics require high-quality test data. When creating evalu 4. **Start Small**: Begin with 20-30 high-quality examples and expand over time 5. **Version Control**: Track your datasets alongside your code +In addition to these general principles, you'll need to make sure your data is tailored to your particular evaluation use-case. Different agent tasks, and different metrics, require different types of evaluation data. + +To understand dataset design, let's look at what you'll need to evaluate the agents you've built. + -TODO: Content + Code Notebooks for Creating Evaluation Datasets with SDG +### Dataset for the IT Help Desk RAG Agent (Module 2) + +For the IT Help Desk RAG agent from Module 2, each evaluation test case should include: + +- **Question**: The user's query (common IT help desk questions) +- **Ground Truth Answer**: The expected response +- **Expected Context Keywords**: Keywords that should appear in retrieved documents +- **Category**: The type of question (password_management, vpn_access, network_issues, etc.) + +In your evaluation pipeline, you'll query the agent with your user question. The agent's generated response can then be compared to the test data, to evaluate multiple dimensions of your agent's performance. + + + +We've provided a starter dataset with examples for you. Check out the to see the structure. + +### Dataset for the Report Generation Agent (Module 1) + +For the Report Generation agent from Module 1, each evaluation test case should include: +- **Topic**: The report subject +- **Expected Sections**: Sections that should appear in the report +- **Quality Criteria**: Custom metrics that define what makes a "good" report on this topic + +Like for the IT Help Desk agent, in your evaluation pipeline, you'll query the Report Generation agent with a topic. However, note that the Report Generation dataset does not contain a complete ground truth answer. The length and variability of reports makes this form of evaluation impractical. + +Instead, the test cases include expected section names and quality criteria, which we'll use to evaluate each report's structure and content. You'll dive into using these quality criteria in the next lesson, [Running Evaluations](running_evaluations.md). + +Check out the starter to see the structure. -TODO +## How to Create Your Evaluation Datasets + +Now that you understand what evaluation datasets look like for each agent, let's explore strategies for creating them. + +### Dataset Creation Strategies + +### Strategy 1: Real-World Data Collection + +The first strategy is to use existing, real-world data. This approach is often considered the "gold standard" for realism because it captures authentic user experiences and needs. You can either collect this data yourself or leverage existing datasets from online repositories like HuggingFace. + +However, real-world data comes with trade-offs. Manual collection requires substantial human labor and time. Privacy concerns may limit what data you can use, and quality issues, like biased or inappropriate content, can compromise your evaluation. Further, real-world data may simply not exist for your specific use case, particularly for complex or niche applications. + +**Use When**: + +### Strategy 2: Synthetic Data Generation + +The second strategy is to generate synthetic data using an LLM. This type of data is highly versatile: it enables developers to rapidly create large datasets, control diversity and coverage, and support use cases where real-world data is difficult or impossible to obtain. + +However, synthetic data has its weaknesses as well. It typically requires careful human validation before use, and it may fail to accurately capture real-world behaviors, edge cases, or distributions, which can reduce the reliability of any evaluations that rely on it. + +**Use When**: + +### Strategy 3: Hybrid Approach + +A hybrid approach combines real-world and synthetic data to leverage the strengths of both while mitigating their weaknesses. It allows developers to ground systems in realistic data, then augment coverage with synthetic examples. + + + +## Generate Evaluation Data for Your Agents + +Now it's time to create evaluation datasets for the agents you built! We'll use **Synthetic Data Generation (SDG)** with **NVIDIA NeMo Data Designer**, an open source tool for generating high-quality synthetic data, to quickly create test cases. + +Start with generating data for your RAG agent from Module 2 to get familiar with SDG concepts: + + +Next, generate data for your Report Generation agent from Module 1: + -TODO +## Using Pre-Made Datasets + +If you prefer to start with pre-made datasets, we've provided starter sets for both agents: + +- - 12 IT help desk questions across common categories +- - 6 report topics with quality criteria + + + +## What's Next + +Once you have your evaluation datasets ready, you're prepared to run comprehensive evaluations! + +In the next lesson, [Running Evaluations](running_evaluations.md), you'll: +- Load your evaluation datasets +- Run your agents on test cases +- Use LLM-as-a-Judge to score responses +- Analyze results and identify improvement areas + diff --git a/.devx/3-agent-evaluation/running_evaluations.md b/.devx/3-agent-evaluation/running_evaluations.md index 09d6695..cbd8244 100644 --- a/.devx/3-agent-evaluation/running_evaluations.md +++ b/.devx/3-agent-evaluation/running_evaluations.md @@ -2,46 +2,38 @@ Running Evaluations -Now it's time to put everything together and run comprehensive evaluations on your agents! In this hands-on lesson, you'll build evaluation pipelines for both the RAG agent from Module 2 and the report generation agent from Module 1. +It's time to put everything together and run comprehensive evaluations on your agents! In this hands-on lesson, you'll build evaluation pipelines for both the RAG agent from Module 2 and the report generation agent from Module 1. -## Evaluation Architecture +## Prerequisites -A robust evaluation pipeline consists of several key components: +Before starting, ensure you have: -1. **Agent Under Test**: The agent you're evaluating -2. **Judging Mechanism**: The LLM (or human) that will judge the agent -3. **Test Dataset**: Collection of test cases with inputs and expected outputs -4. **Evaluation Prompts and Metrics**: Instructions on how to score agent outputs -5. **Analysis of Results**: Interpret results for areas of improvement +**Evaluation datasets ready** - You should have created or reviewed test datasets from the previous lesson ([Creating Evaluation Datasets](evaluation_data.md)). You can use: +- Your own generated datasets from the `generate_eval_dataset.ipynb` notebook +- The pre-made datasets: `rag_agent_test_cases.json` and `report_agent_test_cases.json` -In Module 1 ("Build an Agent") and Module 2 ("Agentic RAG"), you learned about RAG and agents, building two agents of your own. In this module, you've learned about building trust, defining evaluation metrics, and using LLM-as-a-Judge. Let's put those pieces together and build out your first full evaluation pipeline! +βœ… **Agents built** - Your RAG agent from Module 2 and Report Generation agent from Module 1 should be functional +βœ… **Metrics selected** - You've learned about evaluation metrics and LLM-as-a-Judge techniques - -Dataset Design - -In this module, you will work with two evaluation datasets, one for each agent. Each dataset contains a series of test cases that compare the agent’s output to a human-authored β€œground truth” or ideal answer, or to clearly defined quality criteria. +Now let's execute the evaluations! -For the IT Help Desk RAG agent from Module 2, each of our evaluation test cases should include: -- Question -- Ground truth answer (if available) -- Expected retrieved contexts (if available) -- Success criteria + -Check out the to take a look at some examples we will use in our first evaluation pipeline. +## Evaluation Architecture - +A robust evaluation pipeline consists of several key components: -For the Report Generation task agent from Module 1, each of our evaluation test cases should include: -- Report Topic -- Expected Report Sections -- Output Quality Criteria +1. **Agent Under Test**: The agent you're evaluating +2. **Judging Mechanism**: The LLM that will judge the agent +3. **Test Dataset**: Collection of test cases with inputs and expected outputs (from previous lesson) +4. **Evaluation Prompts and Metrics**: Instructions on how to score agent outputs +5. **Analysis of Results**: Interpret results for areas of improvement -Note that the Report Generation dataset does not contain a complete ground truth answer. The length and variability of generated reports makes this impractical for evaluation. Instead, the test cases include expected section names and quality criteria, which we'll use to evaluate each report's structure and content. +Let's start by crafting effective evaluation prompts! -Check out the to take a look at some examples we will use in our second evaluation pipeline. @@ -150,11 +142,9 @@ Let's start by evaluating the IT Help Desk agent from Module 2. Open the section. @@ -263,16 +253,11 @@ Now that you've thoroughly evaluated your IT Help Desk agent using both standard Open the notebook. -### Define Test Cases - -The report generation agent will need a different test dataset than the IT Help Desk agent. Our test cases will include: -- **Topic**: The report subject -- **Expected Sections**: Sections that should appear in the report -- **Quality Criteria**: Custom metrics that define what makes a "good" report on the given topic +### Load Test Cases -We've set up some example test cases for you to use in your evaluation. Run to view details about the test cases. +Load your report generation test dataset - either one you created or the pre-made dataset at `data/evaluation/report_agent_test_cases.json`. -Check which sections we expect the agent to include/exclude, and what quality criteria we've defined. +Run to load and view the test cases. @@ -397,7 +382,7 @@ Evaluation results should drive improvements. Here's how to act on common findin ## NeMo Evaluator (Optional) -Congratulations! You have successfully ran evaluations manually using Python scripts to test your agents. This works great for development and experimentation. But what if you need to evaluate not just a few, but thousands of responses? +Congratulations! You have successfully run evaluations manually using Python scripts to test your agents. This works great for development and experimentation. But what if you need to evaluate not just a few, but thousands of responses? Once you’re scoring large volumes of outputs, comparing multiple agent versions, or running evaluations on a schedule in production, you need a more robust, reproducible, and scalable workflow. From 101ff7e260c2005fcaf4fee6ba65d62aed47b36c Mon Sep 17 00:00:00 2001 From: Linnea Leaver Date: Fri, 12 Dec 2025 20:02:39 +0000 Subject: [PATCH 3/4] add eval data images --- .devx/3-agent-evaluation/evaluation_data.md | 45 ++++++++++++++------- 1 file changed, 30 insertions(+), 15 deletions(-) diff --git a/.devx/3-agent-evaluation/evaluation_data.md b/.devx/3-agent-evaluation/evaluation_data.md index 354ffd0..434e019 100644 --- a/.devx/3-agent-evaluation/evaluation_data.md +++ b/.devx/3-agent-evaluation/evaluation_data.md @@ -9,6 +9,8 @@ To produce high-quality, meaningful evaluation metrics, you need a well-designed - **IT Help Desk RAG Agent** (Module 2) - **Report Generation Agent** (Module 1) +We'll start with the RAG agent since it has a simpler evaluation structure, then move to the more complex Report Generation agent. + ## Dataset Design for Your Agents @@ -21,7 +23,7 @@ Evaluation datasets work best when they align with the following principles: 4. **Start Small**: Begin with 20-30 high-quality examples and expand over time 5. **Version Control**: Track your datasets alongside your code -In addition to these general principles, you'll need to make sure your data is tailored to your particular evaluation use-case. Different agent tasks, and different metrics, require different types of evaluation data. +In addition to these general principles, you'll need to make sure your data is tailored to your particular evaluation use case. Different agent tasks, and different metrics, require different types of evaluation data. To understand dataset design, let's look at what you'll need to evaluate the agents you've built. @@ -38,9 +40,7 @@ For the IT Help Desk RAG agent from Module 2, each evaluation test case should i In your evaluation pipeline, you'll query the agent with your user question. The agent's generated response can then be compared to the test data, to evaluate multiple dimensions of your agent's performance. - - -We've provided a starter dataset with examples for you. Check out the to see the structure. +**Want to see an example?** Check out the to see the structure of the starter dataset we've provided. ### Dataset for the Report Generation Agent (Module 1) @@ -53,15 +53,17 @@ Like for the IT Help Desk agent, in your evaluation pipeline, you'll query the R Instead, the test cases include expected section names and quality criteria, which we'll use to evaluate each report's structure and content. You'll dive into using these quality criteria in the next lesson, [Running Evaluations](running_evaluations.md). -Check out the starter to see the structure. +**Want to see an example?** Check out the to see the structure of the starter dataset we've provided. ## How to Create Your Evaluation Datasets +Building Datasets + Now that you understand what evaluation datasets look like for each agent, let's explore strategies for creating them. -### Dataset Creation Strategies + ### Strategy 1: Real-World Data Collection @@ -69,41 +71,54 @@ The first strategy is to use existing, real-world data. This approach is often c However, real-world data comes with trade-offs. Manual collection requires substantial human labor and time. Privacy concerns may limit what data you can use, and quality issues, like biased or inappropriate content, can compromise your evaluation. Further, real-world data may simply not exist for your specific use case, particularly for complex or niche applications. -**Use When**: +**Use When**: You have access to existing user interactions or logs, need maximum realism and authenticity, have resources for manual curation and privacy review, or when your application is already deployed and collecting real usage data. -### Strategy 2: Synthetic Data Generation + + +### Strategy 2: Synthetic Data Generation (SDG) The second strategy is to generate synthetic data using an LLM. This type of data is highly versatile: it enables developers to rapidly create large datasets, control diversity and coverage, and support use cases where real-world data is difficult or impossible to obtain. However, synthetic data has its weaknesses as well. It typically requires careful human validation before use, and it may fail to accurately capture real-world behaviors, edge cases, or distributions, which can reduce the reliability of any evaluations that rely on it. -**Use When**: +**Use When**: You need to rapidly create test cases, want to control for specific scenarios or edge cases, lack access to real-world data, or need to expand coverage beyond what real data provides. + + ### Strategy 3: Hybrid Approach A hybrid approach combines real-world and synthetic data to leverage the strengths of both while mitigating their weaknesses. It allows developers to ground systems in realistic data, then augment coverage with synthetic examples. +**Use When**: You have some real-world data but need more coverage, want to balance realism with controlled test scenarios, need to fill gaps in your real-world dataset, or want the most robust evaluation approach combining authenticity with comprehensive coverage. + ## Generate Evaluation Data for Your Agents -Now it's time to create evaluation datasets for the agents you built! We'll use **Synthetic Data Generation (SDG)** with **NVIDIA NeMo Data Designer**, an open source tool for generating high-quality synthetic data, to quickly create test cases. +Tools for Generation + +Now it's time to create evaluation datasets for the agents you built! -Start with generating data for your RAG agent from Module 2 to get familiar with SDG concepts: +For this workshop, we'll use **Synthetic Data Generation** with **NVIDIA NeMo Data Designer**, an open source tool for generating high-quality synthetic data. This approach is ideal for getting started with agent evaluation and learning the fundamentals. + +When you're ready, follow the first notebook to generate data for your RAG agent from Module 2 and get familiar with SDG concepts: Next, generate data for your Report Generation agent from Module 1: - +
+πŸ’‘ NEED SOME HELP? -## Using Pre-Made Datasets - -If you prefer to start with pre-made datasets, we've provided starter sets for both agents: +We recommend generating your own datasets using the notebooks above to get hands-on experience with the synthetic data generation process. However, if you're running into issues or want to move ahead quickly, we've provided starter datasets you can use: - - 12 IT help desk questions across common categories - - 6 report topics with quality criteria +These pre-made datasets can also serve as reference examples when you create your own. + +
+ ## What's Next From be0cc168ec43e5f97e375e8e78f3d9265555642c Mon Sep 17 00:00:00 2001 From: Linnea Leaver Date: Tue, 16 Dec 2025 00:47:02 +0000 Subject: [PATCH 4/4] update requirements --- .devx/3-agent-evaluation/evaluation_data.md | 8 +- .../generate_rag_eval_dataset.ipynb | 1022 +---------------- .../generate_report_eval_dataset.ipynb | 311 +---- requirements.txt | 1 + 4 files changed, 41 insertions(+), 1301 deletions(-) diff --git a/.devx/3-agent-evaluation/evaluation_data.md b/.devx/3-agent-evaluation/evaluation_data.md index 434e019..d247589 100644 --- a/.devx/3-agent-evaluation/evaluation_data.md +++ b/.devx/3-agent-evaluation/evaluation_data.md @@ -4,7 +4,7 @@ You've learned about the metrics you'll use to evaluate your agents. But how do you measure those metrics in practice? -To produce high-quality, meaningful evaluation metrics, you need a well-designed evaluation dataset. In this lesson, you'll learn how to create evaluation datasets for the two agents you've built: +To produce high-quality, meaningful evaluation metrics, you need a well-designed evaluation dataset. In this lesson, you'll learn how to create evaluation datasets for the two agents you built earlier in this course: - **IT Help Desk RAG Agent** (Module 2) - **Report Generation Agent** (Module 1) @@ -20,7 +20,7 @@ Evaluation datasets work best when they align with the following principles: 1. **Cover Diverse Scenarios**: Include common cases, edge cases, and failure modes 2. **Include Ground Truth**: Where possible, provide correct answers for comparison 3. **Represent Real Usage**: Base test cases on actual user interactions -4. **Start Small**: Begin with 20-30 high-quality examples and expand over time +4. **Start Small**: Begin with a small set of high-quality examples and expand over time 5. **Version Control**: Track your datasets alongside your code In addition to these general principles, you'll need to make sure your data is tailored to your particular evaluation use case. Different agent tasks, and different metrics, require different types of evaluation data. @@ -38,7 +38,7 @@ For the IT Help Desk RAG agent from Module 2, each evaluation test case should i - **Expected Context Keywords**: Keywords that should appear in retrieved documents - **Category**: The type of question (password_management, vpn_access, network_issues, etc.) -In your evaluation pipeline, you'll query the agent with your user question. The agent's generated response can then be compared to the test data, to evaluate multiple dimensions of your agent's performance. +In your evaluation pipeline, you'll query the RAG agent with each generated test **Question**. The RAG agent's generated response can then be compared to the test data to evaluate multiple dimensions of the agent's performance. **Want to see an example?** Check out the to see the structure of the starter dataset we've provided. @@ -49,7 +49,7 @@ For the Report Generation agent from Module 1, each evaluation test case should - **Expected Sections**: Sections that should appear in the report - **Quality Criteria**: Custom metrics that define what makes a "good" report on this topic -Like for the IT Help Desk agent, in your evaluation pipeline, you'll query the Report Generation agent with a topic. However, note that the Report Generation dataset does not contain a complete ground truth answer. The length and variability of reports makes this form of evaluation impractical. +Like for the IT Help Desk agent, in your evaluation pipeline, you'll query the Report Generation agent with each test **Topic**. However, note that the Report Generation dataset does not contain a complete ground truth answer. The length and variability of reports makes this form of evaluation impractical. Instead, the test cases include expected section names and quality criteria, which we'll use to evaluate each report's structure and content. You'll dive into using these quality criteria in the next lesson, [Running Evaluations](running_evaluations.md). diff --git a/code/3-agent-evaluation/generate_rag_eval_dataset.ipynb b/code/3-agent-evaluation/generate_rag_eval_dataset.ipynb index 8b0585a..0666750 100644 --- a/code/3-agent-evaluation/generate_rag_eval_dataset.ipynb +++ b/code/3-agent-evaluation/generate_rag_eval_dataset.ipynb @@ -15,37 +15,24 @@ "source": [ "## 1. Setup\n", "\n", - "First, let's install the Data Designer library and set up our environment." + "First, let's set up our environment." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Note: you may need to restart the kernel to use updated packages.\n", - "Completed setup\n" - ] - } - ], + "outputs": [], "source": [ - "# Install Data Designer if needed\n", - "%pip install data-designer -q\n", + "%pip install -r ../../requirements.txt > /dev/null\n", "\n", - "# Load environment variables\n", "from dotenv import load_dotenv\n", "_ = load_dotenv(\"../../variables.env\")\n", "_ = load_dotenv(\"../../secrets.env\")\n", "\n", "import os\n", "import json\n", - "from pathlib import Path\n", - "\n", - "print(\"Completed setup\")" + "from pathlib import Path" ] }, { @@ -59,25 +46,9 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/nvidia/workshop-build-an-agent/.venv/lib/python3.10/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", - " from .autonotebook import tqdm as notebook_tqdm\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Completed initialization\n" - ] - } - ], + "outputs": [], "source": [ "from data_designer.essentials import (\n", " DataDesigner,\n", @@ -105,24 +76,9 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[00:13:33] [INFO] πŸ’Ύ Saving seed dataset to ../../data/evaluation/kb_seed_data.parquet\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Created seed reference with 12 KB articles\n" - ] - } - ], + "outputs": [], "source": [ "import pandas as pd\n", "\n", @@ -176,17 +132,9 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Dataset configuration built\n" - ] - } - ], + "outputs": [], "source": [ "# Create config builder with seed data\n", "config_builder = DataDesignerConfigBuilder()\n", @@ -254,835 +202,9 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[00:13:33] [INFO] πŸ‘€ Preview generation in progress\n", - "[00:13:33] [INFO] βœ… Validation passed\n", - "[00:13:33] [INFO] ⛓️ Sorting column configs into a Directed Acyclic Graph\n", - "[00:13:33] [INFO] 🩺 Running health checks for models...\n", - "[00:13:33] [INFO] |-- πŸ‘€ Checking 'nvidia/nvidia-nemotron-nano-9b-v2' in provider named 'nvidia' for model alias 'nvidia-text'...\n", - "[00:13:34] [INFO] |-- βœ… Passed!\n", - "[00:13:34] [INFO] 🌱 Sampling 3 records from seed dataset\n", - "[00:13:34] [INFO] |-- seed dataset size: 12 records\n", - "[00:13:34] [INFO] |-- sampling strategy: ordered\n", - "[00:13:34] [INFO] πŸ“ Preparing llm-text column generation\n", - "[00:13:34] [INFO] |-- column name: 'question'\n", - "[00:13:34] [INFO] |-- model config:\n", - "{\n", - " \"alias\": \"nvidia-text\",\n", - " \"model\": \"nvidia/nvidia-nemotron-nano-9b-v2\",\n", - " \"inference_parameters\": {\n", - " \"temperature\": 0.85,\n", - " \"top_p\": 0.95,\n", - " \"max_tokens\": null,\n", - " \"max_parallel_requests\": 4,\n", - " \"timeout\": null,\n", - " \"extra_body\": null\n", - " },\n", - " \"provider\": \"nvidia\"\n", - "}\n", - "[00:13:34] [INFO] πŸ™ Processing llm-text column 'question' with 4 concurrent workers\n", - "[00:13:42] [INFO] πŸ“ Preparing llm-text column generation\n", - "[00:13:42] [INFO] |-- column name: 'context_key_words'\n", - "[00:13:42] [INFO] |-- model config:\n", - "{\n", - " \"alias\": \"nvidia-text\",\n", - " \"model\": \"nvidia/nvidia-nemotron-nano-9b-v2\",\n", - " \"inference_parameters\": {\n", - " \"temperature\": 0.85,\n", - " \"top_p\": 0.95,\n", - " \"max_tokens\": null,\n", - " \"max_parallel_requests\": 4,\n", - " \"timeout\": null,\n", - " \"extra_body\": null\n", - " },\n", - " \"provider\": \"nvidia\"\n", - "}\n", - "[00:13:42] [INFO] πŸ™ Processing llm-text column 'context_key_words' with 4 concurrent workers\n", - "[00:13:46] [INFO] πŸ“ Preparing llm-text column generation\n", - "[00:13:46] [INFO] |-- column name: 'ground_truth'\n", - "[00:13:46] [INFO] |-- model config:\n", - "{\n", - " \"alias\": \"nvidia-text\",\n", - " \"model\": \"nvidia/nvidia-nemotron-nano-9b-v2\",\n", - " \"inference_parameters\": {\n", - " \"temperature\": 0.85,\n", - " \"top_p\": 0.95,\n", - " \"max_tokens\": null,\n", - " \"max_parallel_requests\": 4,\n", - " \"timeout\": null,\n", - " \"extra_body\": null\n", - " },\n", - " \"provider\": \"nvidia\"\n", - "}\n", - "[00:13:46] [INFO] πŸ™ Processing llm-text column 'ground_truth' with 4 concurrent workers\n", - "[00:13:51] [INFO] πŸ“Š Model usage summary:\n", - "{\n", - " \"nvidia/nvidia-nemotron-nano-9b-v2\": {\n", - " \"token_usage\": {\n", - " \"prompt_tokens\": 7084,\n", - " \"completion_tokens\": 4148,\n", - " \"total_tokens\": 11232\n", - " },\n", - " \"request_usage\": {\n", - " \"successful_requests\": 9,\n", - " \"failed_requests\": 0,\n", - " \"total_requests\": 9\n", - " },\n", - " \"tokens_per_second\": 663,\n", - " \"requests_per_minute\": 31\n", - " }\n", - "}\n", - "[00:13:51] [INFO] πŸ“ Measuring dataset column statistics:\n", - "[00:13:51] [INFO] |-- 🌱 column: 'topic'\n", - "[00:13:51] [INFO] |-- 🌱 column: 'title'\n", - "[00:13:51] [INFO] |-- 🌱 column: 'filename'\n", - "[00:13:51] [INFO] |-- 🌱 column: 'content'\n", - "[00:13:51] [INFO] |-- πŸ“ column: 'question'\n", - "[00:13:51] [INFO] |-- πŸ“ column: 'context_key_words'\n", - "[00:13:51] [INFO] |-- πŸ“ column: 'ground_truth'\n", - "[00:13:51] [INFO] β˜€οΈ Preview complete!\n" - ] - }, - { - "data": { - "text/html": [ - "
                                                                                                                   \n",
-              "                                                   Seed Columns                                                    \n",
-              "┏━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
-              "┃ Name     ┃ Value                                                                                                ┃\n",
-              "┑━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
-              "β”‚ topic    β”‚ email_distribution_lists                                                                             β”‚\n",
-              "β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€\n",
-              "β”‚ title    β”‚ Managing Email Distribution Lists                                                                    β”‚\n",
-              "β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€\n",
-              "β”‚ filename β”‚ email-distribution-lists.md                                                                          β”‚\n",
-              "β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€\n",
-              "β”‚ content  β”‚ # Managing Email Distribution Lists                                                                  β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ ## Purpose                                                                                           β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ This article provides instructions for requesting, managing, and using email distribution lists      β”‚\n",
-              "β”‚          β”‚ within the company's email system. Distribution lists enable efficient communication with groups of  β”‚\n",
-              "β”‚          β”‚ employees, departments, or project teams while maintaining proper security and governance controls.  β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ ## What are Email Distribution Lists                                                                 β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ Email distribution lists are centrally managed groups of email addresses that allow you to send      β”‚\n",
-              "β”‚          β”‚ messages to multiple recipients using a single email address. Distribution lists provide:            β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ - **Simplified group communication** for departments, projects, and teams                            β”‚\n",
-              "β”‚          β”‚ - **Centralized membership management** with proper access controls                                  β”‚\n",
-              "β”‚          β”‚ - **Consistent naming conventions** for easy identification                                          β”‚\n",
-              "β”‚          β”‚ - **Security and compliance** with company communication policies                                    β”‚\n",
-              "β”‚          β”‚ - **Automatic synchronization** with organizational changes                                          β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ ## Types of Distribution Lists                                                                       β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ ### **Departmental Lists**                                                                           β”‚\n",
-              "β”‚          β”‚ - **Purpose:** Communication within specific departments or business units                           β”‚\n",
-              "β”‚          β”‚ - **Naming Convention:** `dept-[department-name]@company.com`                                        β”‚\n",
-              "β”‚          β”‚ - **Examples:** `dept-finance@company.com`, `dept-hr@company.com`                                    β”‚\n",
-              "β”‚          β”‚ - **Membership:** Automatically populated based on Active Directory department assignments           β”‚\n",
-              "β”‚          β”‚ - **Management:** Maintained by HR and department managers                                           β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ ### **Project Lists**                                                                                β”‚\n",
-              "β”‚          β”‚ - **Purpose:** Temporary communication for specific projects or initiatives                          β”‚\n",
-              "β”‚          β”‚ - **Naming Convention:** `project-[project-name]@company.com`                                        β”‚\n",
-              "β”‚          β”‚ - **Examples:** `project-website-redesign@company.com`, `project-erp-implementation@company.com`     β”‚\n",
-              "β”‚          β”‚ - **Membership:** Manually managed by project managers                                               β”‚\n",
-              "β”‚          β”‚ - **Duration:** Active for project lifecycle, archived upon completion                               β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ ### **Functional Lists**                                                                             β”‚\n",
-              "β”‚          β”‚ - **Purpose:** Role-based communication across departments                                           β”‚\n",
-              "β”‚          β”‚ - **Naming Convention:** `role-[function-name]@company.com`                                          β”‚\n",
-              "β”‚          β”‚ - **Examples:** `role-managers@company.com`, `role-safety-coordinators@company.com`                  β”‚\n",
-              "β”‚          β”‚ - **Membership:** Based on job roles and responsibilities                                            β”‚\n",
-              "β”‚          β”‚ - **Management:** Maintained by HR with input from department heads                                  β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ ### **Location Lists**                                                                               β”‚\n",
-              "β”‚          β”‚ - **Purpose:** Site-specific communication for multi-location organizations                          β”‚\n",
-              "β”‚          β”‚ - **Naming Convention:** `location-[site-name]@company.com`                                          β”‚\n",
-              "β”‚          β”‚ - **Examples:** `location-headquarters@company.com`, `location-warehouse-east@company.com`           β”‚\n",
-              "β”‚          β”‚ - **Membership:** Based on primary work location assignments                                         β”‚\n",
-              "β”‚          β”‚ - **Management:** Maintained by facilities and HR teams                                              β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ ### **Security Lists**                                                                               β”‚\n",
-              "β”‚          β”‚ - **Purpose:** Confidential communication requiring restricted access                                β”‚\n",
-              "β”‚          β”‚ - **Naming Convention:** `secure-[purpose]@company.com`                                              β”‚\n",
-              "β”‚          β”‚ - **Examples:** `secure-executives@company.com`, `secure-incident-response@company.com`              β”‚\n",
-              "β”‚          β”‚ - **Membership:** Strictly controlled with approval requirements                                     β”‚\n",
-              "β”‚          β”‚ - **Management:** Maintained by IT Security and designated owners                                    β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ ## Prerequisites                                                                                     β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ Before requesting a distribution list, ensure you have:                                              β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ - **Business justification** for the list's creation                                                 β”‚\n",
-              "β”‚          β”‚ - **Manager approval** for departmental or functional lists                                          β”‚\n",
-              "β”‚          β”‚ - **Defined membership criteria** and initial member list                                            β”‚\n",
-              "β”‚          β”‚ - **Designated list owner** responsible for ongoing management                                       β”‚\n",
-              "β”‚          β”‚ - **Understanding of data classification** for list communications                                   β”‚\n",
-              "β”‚          β”‚ - **Compliance approval** for lists handling sensitive information                                   β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ ## Request Procedure                                                                                 β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ ### 1. Planning and Justification                                                                    β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ Before submitting a request, prepare the following information:                                      β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ #### **Business Requirements**                                                                       β”‚\n",
-              "β”‚          β”‚ - **Purpose and scope** of the distribution list                                                     β”‚\n",
-              "β”‚          β”‚ - **Target audience** and estimated membership size                                                  β”‚\n",
-              "β”‚          β”‚ - **Communication frequency** and expected volume                                                    β”‚\n",
-              "β”‚          β”‚ - **Project timeline** or ongoing operational need                                                   β”‚\n",
-              "β”‚          β”‚ - **Integration requirements** with existing systems                                                 β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ #### **Governance Details**                                                                          β”‚\n",
-              "β”‚          β”‚ - **Primary list owner** (responsible for membership management)                                     β”‚\n",
-              "β”‚          β”‚ - **Secondary owner** (backup for owner absence)                                                     β”‚\n",
-              "β”‚          β”‚ - **Approval process** for adding/removing members                                                   β”‚\n",
-              "β”‚          β”‚ - **Access restrictions** and security requirements                                                  β”‚\n",
-              "β”‚          β”‚ - **Retention policies** for list communications                                                     β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ ### 2. Submit Distribution List Request                                                              β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ - Navigate to the **IT Service Portal** at `itservices.company.com`                                  β”‚\n",
-              "β”‚          β”‚ - Go to **Service Requests β†’ Email Services β†’ Distribution List Request**                            β”‚\n",
-              "β”‚          β”‚ - Complete the comprehensive request form:                                                           β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ #### **Required Information**                                                                        β”‚\n",
-              "β”‚          β”‚ - **Requested list name** (following naming conventions)                                             β”‚\n",
-              "β”‚          β”‚ - **List type** (Departmental, Project, Functional, Location, Security)                              β”‚\n",
-              "β”‚          β”‚ - **Business justification** and purpose description                                                 β”‚\n",
-              "β”‚          β”‚ - **Primary and secondary owners** with contact information                                          β”‚\n",
-              "β”‚          β”‚ - **Initial membership list** (names and email addresses)                                            β”‚\n",
-              "β”‚          β”‚ - **Manager approval** (digital signature required)                                                  β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ #### **Additional Details**                                                                          β”‚\n",
-              "β”‚          β”‚ - **Membership criteria** for future additions                                                       β”‚\n",
-              "β”‚          β”‚ - **External sender permissions** (if applicable)                                                    β”‚\n",
-              "β”‚          β”‚ - **Moderation requirements** (pre-approval of messages)                                             β”‚\n",
-              "β”‚          β”‚ - **Integration needs** (SharePoint, Teams, etc.)                                                    β”‚\n",
-              "β”‚          β”‚ - **Special security requirements**                                                                  β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ ### 3. Approval Process                                                                              β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ #### **Initial Review (1-2 business days)**                                                          β”‚\n",
-              "β”‚          β”‚ - **IT team verification** of naming conventions and technical feasibility                           β”‚\n",
-              "β”‚          β”‚ - **Duplicate list checking** to avoid redundancy                                                    β”‚\n",
-              "β”‚          β”‚ - **Security assessment** for sensitive lists                                                        β”‚\n",
-              "β”‚          β”‚ - **Resource allocation** confirmation                                                               β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ #### **Management Approval (2-3 business days)**                                                     β”‚\n",
-              "β”‚          β”‚ - **Department head approval** for departmental lists                                                β”‚\n",
-              "β”‚          β”‚ - **Project sponsor approval** for project lists                                                     β”‚\n",
-              "β”‚          β”‚ - **Executive approval** for security or cross-functional lists                                      β”‚\n",
-              "β”‚          β”‚ - **Compliance review** for regulated communications                                                 β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ #### **Implementation (1 business day)**                                                             β”‚\n",
-              "β”‚          β”‚ - **Distribution list creation** in Exchange/Office 365                                              β”‚\n",
-              "β”‚          β”‚ - **Membership population** from provided list                                                       β”‚\n",
-              "β”‚          β”‚ - **Owner permissions** configuration                                                                β”‚\n",
-              "β”‚          β”‚ - **Testing and validation** of list functionality                                                   β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ ### 4. List Activation and Documentation                                                             β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ #### **Activation Notification**                                                                     β”‚\n",
-              "β”‚          β”‚ - **Confirmation email** sent to list owners                                                         β”‚\n",
-              "β”‚          β”‚ - **List address** and management instructions                                                       β”‚\n",
-              "β”‚          β”‚ - **Access to self-service management tools**                                                        β”‚\n",
-              "β”‚          β”‚ - **Documentation** and best practices guide                                                         β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ #### **Owner Responsibilities**                                                                      β”‚\n",
-              "β”‚          β”‚ - **Membership management** (additions, removals, updates)                                           β”‚\n",
-              "β”‚          β”‚ - **Usage monitoring** and policy compliance                                                         β”‚\n",
-              "β”‚          β”‚ - **Regular membership reviews** (quarterly for most lists)                                          β”‚\n",
-              "β”‚          β”‚ - **Incident reporting** for misuse or security concerns                                             β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ ## Managing Distribution Lists                                                                       β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ ### **Self-Service Management**                                                                      β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ #### **Adding Members**                                                                              β”‚\n",
-              "β”‚          β”‚ 1. **Access Management Portal**                                                                      β”‚\n",
-              "β”‚          β”‚    - Navigate to `groups.company.com`                                                                β”‚\n",
-              "β”‚          β”‚    - Sign in with your **company credentials**                                                       β”‚\n",
-              "β”‚          β”‚    - Select your **managed distribution lists**                                                      β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ 2. **Add New Members**                                                                               β”‚\n",
-              "β”‚          β”‚    - Click **Add Members** for the target list                                                       β”‚\n",
-              "β”‚          β”‚    - Enter **email addresses** or search company directory                                           β”‚\n",
-              "β”‚          β”‚    - Verify **membership criteria** compliance                                                       β”‚\n",
-              "β”‚          β”‚    - Click **Add** to complete the process                                                           β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ 3. **Bulk Import** (for large additions)                                                             β”‚\n",
-              "β”‚          β”‚    - Download **CSV template** from management portal                                                β”‚\n",
-              "β”‚          β”‚    - Complete template with **member information**                                                   β”‚\n",
-              "β”‚          β”‚    - Upload file and **review additions** before confirming                                          β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ #### **Removing Members**                                                                            β”‚\n",
-              "β”‚          β”‚ 1. **Individual Removal**                                                                            β”‚\n",
-              "β”‚          β”‚    - Select **members to remove** from list view                                                     β”‚\n",
-              "β”‚          β”‚    - Click **Remove Members**                                                                        β”‚\n",
-              "β”‚          β”‚    - **Confirm removal** and document reason if required                                             β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ 2. **Automated Removal**                                                                             β”‚\n",
-              "β”‚          β”‚    - **Inactive accounts** automatically removed after 30 days                                       β”‚\n",
-              "β”‚          β”‚    - **Departed employees** removed within 24 hours                                                  β”‚\n",
-              "β”‚          β”‚    - **Role changes** may trigger automatic removal                                                  β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ #### **Membership Reviews**                                                                          β”‚\n",
-              "β”‚          β”‚ - **Quarterly reviews** required for most lists                                                      β”‚\n",
-              "β”‚          β”‚ - **Annual comprehensive reviews** for all lists                                                     β”‚\n",
-              "β”‚          β”‚ - **Immediate reviews** following organizational changes                                             β”‚\n",
-              "β”‚          β”‚ - **Documentation** of review results and actions taken                                              β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ ### **Advanced Management Features**                                                                 β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ #### **Message Moderation**                                                                          β”‚\n",
-              "β”‚          β”‚ - **Enable moderation** for lists requiring content approval                                         β”‚\n",
-              "β”‚          β”‚ - **Designate moderators** with message approval rights                                              β”‚\n",
-              "β”‚          β”‚ - **Set approval criteria** and response timeframes                                                  β”‚\n",
-              "β”‚          β”‚ - **Configure rejection notifications** for inappropriate content                                    β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ #### **External Sender Management**                                                                  β”‚\n",
-              "β”‚          β”‚ - **Allow external senders** for customer or vendor communication                                    β”‚\n",
-              "β”‚          β”‚ - **Whitelist specific domains** or email addresses                                                  β”‚\n",
-              "β”‚          β”‚ - **Require sender authentication** for external messages                                            β”‚\n",
-              "β”‚          β”‚ - **Log external communications** for security monitoring                                            β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ #### **Integration with Other Systems**                                                              β”‚\n",
-              "β”‚          β”‚ - **SharePoint integration** for document sharing                                                    β”‚\n",
-              "β”‚          β”‚ - **Microsoft Teams** channel creation for collaboration                                             β”‚\n",
-              "β”‚          β”‚ - **Calendar integration** for meeting invitations                                                   β”‚\n",
-              "β”‚          β”‚ - **Mobile app notifications** for important communications                                          β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ ## Usage Guidelines and Best Practices                                                               β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ ### **Appropriate Usage**                                                                            β”‚\n",
-              "β”‚          β”‚ - **Business communications** related to list purpose                                                β”‚\n",
-              "β”‚          β”‚ - **Time-sensitive announcements** requiring broad distribution                                      β”‚\n",
-              "β”‚          β”‚ - **Collaborative discussions** within project or department scope                                   β”‚\n",
-              "β”‚          β”‚ - **Emergency notifications** for safety or security issues                                          β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ ### **Prohibited Usage**                                                                             β”‚\n",
-              "β”‚          β”‚ - **Personal communications** unrelated to business                                                  β”‚\n",
-              "β”‚          β”‚ - **Spam or promotional** content from external sources                                              β”‚\n",
-              "β”‚          β”‚ - **Confidential information** on non-secure lists                                                   β”‚\n",
-              "β”‚          β”‚ - **Large file attachments** that may impact email system performance                                β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ ### **Communication Etiquette**                                                                      β”‚\n",
-              "β”‚          β”‚ - **Use clear, descriptive** subject lines                                                           β”‚\n",
-              "β”‚          β”‚ - **Keep messages concise** and relevant to all recipients                                           β”‚\n",
-              "β”‚          β”‚ - **Reply judiciously** - consider if all members need to see responses                              β”‚\n",
-              "β”‚          β”‚ - **Use \"Reply All\" sparingly** to avoid unnecessary email volume                                    β”‚\n",
-              "β”‚          β”‚ - **Include context** when forwarding messages to lists                                              β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ ### **Security Considerations**                                                                      β”‚\n",
-              "β”‚          β”‚ - **Verify recipient lists** before sending sensitive information                                    β”‚\n",
-              "β”‚          β”‚ - **Use encryption** for confidential communications                                                 β”‚\n",
-              "β”‚          β”‚ - **Avoid including** external recipients on internal lists                                          β”‚\n",
-              "β”‚          β”‚ - **Report suspicious messages** to IT Security immediately                                          β”‚\n",
-              "β”‚          β”‚ - **Follow data classification** policies for all communications                                     β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ ## Troubleshooting Common Issues                                                                     β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ ### **Delivery Problems**                                                                            β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ #### **Messages Not Delivered**                                                                      β”‚\n",
-              "β”‚          β”‚ - **Check list membership** - ensure you're subscribed to the list                                   β”‚\n",
-              "β”‚          β”‚ - **Verify sender permissions** - confirm you're authorized to send                                  β”‚\n",
-              "β”‚          β”‚ - **Review message size** - large attachments may be blocked                                         β”‚\n",
-              "β”‚          β”‚ - **Check spam filters** - messages may be filtered by security systems                              β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ #### **Partial Delivery**                                                                            β”‚\n",
-              "β”‚          β”‚ - **External recipient blocking** - some domains may reject list messages                            β”‚\n",
-              "β”‚          β”‚ - **Mailbox full** - individual recipient mailboxes may be at capacity                               β”‚\n",
-              "β”‚          β”‚ - **Inactive accounts** - departed employees may still be listed                                     β”‚\n",
-              "β”‚          β”‚ - **Distribution delays** - large lists may experience delivery delays                               β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ ### **Management Issues**                                                                            β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ #### **Cannot Add Members**                                                                          β”‚\n",
-              "β”‚          β”‚ - **Verify ownership permissions** - ensure you're designated as list owner                          β”‚\n",
-              "β”‚          β”‚ - **Check member eligibility** - confirm recipients meet list criteria                               β”‚\n",
-              "β”‚          β”‚ - **Review approval requirements** - some additions may require manager approval                     β”‚\n",
-              "β”‚          β”‚ - **Validate email addresses** - ensure addresses are correctly formatted                            β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ #### **Membership Sync Problems**                                                                    β”‚\n",
-              "β”‚          β”‚ - **Active Directory delays** - automatic updates may take 24 hours                                  β”‚\n",
-              "β”‚          β”‚ - **Organizational changes** - department moves may affect list membership                           β”‚\n",
-              "β”‚          β”‚ - **Account status changes** - role changes may trigger unexpected removals                          β”‚\n",
-              "β”‚          β”‚ - **Manual override** - contact IT for immediate membership corrections                              β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ ### **Access and Permission Issues**                                                                 β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ #### **Cannot Manage List**                                                                          β”‚\n",
-              "β”‚          β”‚ - **Ownership verification** - confirm you're designated as primary or secondary owner               β”‚\n",
-              "β”‚          β”‚ - **Account permissions** - ensure your account has proper management rights                         β”‚\n",
-              "β”‚          β”‚ - **System maintenance** - management portal may be temporarily unavailable                          β”‚\n",
-              "β”‚          β”‚ - **Training requirements** - new owners may need management training                                β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ ## Monitoring and Reporting                                                                          β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ ### **Usage Analytics**                                                                              β”‚\n",
-              "β”‚          β”‚ - **Message volume** tracking and trending                                                           β”‚\n",
-              "β”‚          β”‚ - **Membership growth** and turnover analysis                                                        β”‚\n",
-              "β”‚          β”‚ - **Delivery success rates** and failure analysis                                                    β”‚\n",
-              "β”‚          β”‚ - **Top senders** and communication patterns                                                         β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ ### **Compliance Monitoring**                                                                        β”‚\n",
-              "β”‚          β”‚ - **Content scanning** for policy violations                                                         β”‚\n",
-              "β”‚          β”‚ - **External communication** tracking and approval                                                   β”‚\n",
-              "β”‚          β”‚ - **Data classification** compliance verification                                                    β”‚\n",
-              "β”‚          β”‚ - **Retention policy** enforcement and archival                                                      β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ ### **Performance Metrics**                                                                          β”‚\n",
-              "β”‚          β”‚ - **Delivery times** and system performance                                                          β”‚\n",
-              "β”‚          β”‚ - **User satisfaction** surveys and feedback                                                         β”‚\n",
-              "β”‚          β”‚ - **Cost analysis** for list maintenance and operations                                              β”‚\n",
-              "β”‚          β”‚ - **Security incident** tracking and response                                                        β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ ## List Lifecycle Management                                                                         β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ ### **Regular Maintenance**                                                                          β”‚\n",
-              "β”‚          β”‚ - **Quarterly membership** reviews and updates                                                       β”‚\n",
-              "β”‚          β”‚ - **Annual purpose validation** and business justification                                           β”‚\n",
-              "β”‚          β”‚ - **Owner succession** planning and documentation                                                    β”‚\n",
-              "β”‚          β”‚ - **Performance optimization** and cleanup                                                           β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ ### **List Retirement**                                                                              β”‚\n",
-              "β”‚          β”‚ #### **Project Completion**                                                                          β”‚\n",
-              "β”‚          β”‚ - **Archive list communications** for future reference                                               β”‚\n",
-              "β”‚          β”‚ - **Notify members** of list deactivation                                                            β”‚\n",
-              "β”‚          β”‚ - **Redirect to successor lists** if applicable                                                      β”‚\n",
-              "β”‚          β”‚ - **Maintain read-only access** for historical purposes                                              β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ #### **Organizational Changes**                                                                      β”‚\n",
-              "β”‚          β”‚ - **Merge redundant lists** following reorganizations                                                β”‚\n",
-              "β”‚          β”‚ - **Update naming conventions** for consistency                                                      β”‚\n",
-              "β”‚          β”‚ - **Transfer ownership** for continuing business needs                                               β”‚\n",
-              "β”‚          β”‚ - **Document changes** for audit and compliance                                                      β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ ## Support and Training                                                                              β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ ### **Self-Service Resources**                                                                       β”‚\n",
-              "β”‚          β”‚ - **Management Portal:** `groups.company.com` - List management interface                            β”‚\n",
-              "β”‚          β”‚ - **Knowledge Base:** Comprehensive guides and FAQs                                                  β”‚\n",
-              "β”‚          β”‚ - **Video Tutorials:** Step-by-step management instructions                                          β”‚\n",
-              "β”‚          β”‚ - **Best Practices Guide:** Communication and management recommendations                             β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ ### **Technical Support**                                                                            β”‚\n",
-              "β”‚          β”‚ - **Email Support:** `email-support@company.com` or ext. 4357                                        β”‚\n",
-              "β”‚          β”‚ - **Distribution List Specialists:** `dl-support@company.com`                                        β”‚\n",
-              "β”‚          β”‚ - **Training Coordinator:** `email-training@company.com`                                             β”‚\n",
-              "β”‚          β”‚ - **Compliance Questions:** `email-compliance@company.com`                                           β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ ### **Training Programs**                                                                            β”‚\n",
-              "β”‚          β”‚ - **New Owner Training:** Required for all list owners                                               β”‚\n",
-              "β”‚          β”‚ - **Advanced Management:** Optional training for complex list requirements                           β”‚\n",
-              "β”‚          β”‚ - **Compliance Training:** Required for security and regulated lists                                 β”‚\n",
-              "β”‚          β”‚ - **User Etiquette:** Available for all employees                                                    β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ ---                                                                                                  β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β”‚          β”‚ *Last updated: [Current Date] | Document ID: KB-EMAIL-001 | Classification: Internal Use*            β”‚\n",
-              "β”‚          β”‚                                                                                                      β”‚\n",
-              "β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜\n",
-              "                                                                                                                   \n",
-              "                                                                                                                   \n",
-              "                                                 Generated Columns                                                 \n",
-              "┏━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
-              "┃ Name              ┃ Value                                                                                       ┃\n",
-              "┑━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
-              "β”‚ question          β”‚ How do I add new employees to our company's email distribution list without sending a test  β”‚\n",
-              "β”‚                   β”‚ email to confirm it works?                                                                  β”‚\n",
-              "β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€\n",
-              "β”‚ context_key_words β”‚ add employees, distribution list, skip test email                                           β”‚\n",
-              "β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€\n",
-              "β”‚ ground_truth      β”‚ To add new employees to an email distribution list without sending a test email, use the    β”‚\n",
-              "β”‚                   β”‚ **IT Service Portal** or **Management Portal** (`groups.company.com`) to manually add       β”‚\n",
-              "β”‚                   β”‚ members by entering their email addresses or searching the company directory. The system    β”‚\n",
-              "β”‚                   β”‚ will update the list automatically once additions are confirmed through the portal.         β”‚\n",
-              "β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜\n",
-              "                                                                                                                   \n",
-              "                                                    [index: 0]                                                     \n",
-              "
\n" - ], - "text/plain": [ - " \n", - "\u001b[3m Seed Columns \u001b[0m\n", - "┏━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n", - "┃\u001b[1m \u001b[0m\u001b[1mName \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mValue \u001b[0m\u001b[1m \u001b[0m┃\n", - "┑━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n", - "β”‚ topic β”‚ email_distribution_lists β”‚\n", - "β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€\n", - "β”‚ title β”‚ Managing Email Distribution Lists β”‚\n", - "β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€\n", - "β”‚ filename β”‚ email-distribution-lists.md β”‚\n", - "β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€\n", - "β”‚ content β”‚ # Managing Email Distribution Lists β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ ## Purpose β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ This article provides instructions for requesting, managing, and using email distribution lists β”‚\n", - "β”‚ β”‚ within the company's email system. Distribution lists enable efficient communication with groups of β”‚\n", - "β”‚ β”‚ employees, departments, or project teams while maintaining proper security and governance controls. β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ ## What are Email Distribution Lists β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ Email distribution lists are centrally managed groups of email addresses that allow you to send β”‚\n", - "β”‚ β”‚ messages to multiple recipients using a single email address. Distribution lists provide: β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ - **Simplified group communication** for departments, projects, and teams β”‚\n", - "β”‚ β”‚ - **Centralized membership management** with proper access controls β”‚\n", - "β”‚ β”‚ - **Consistent naming conventions** for easy identification β”‚\n", - "β”‚ β”‚ - **Security and compliance** with company communication policies β”‚\n", - "β”‚ β”‚ - **Automatic synchronization** with organizational changes β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ ## Types of Distribution Lists β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ ### **Departmental Lists** β”‚\n", - "β”‚ β”‚ - **Purpose:** Communication within specific departments or business units β”‚\n", - "β”‚ β”‚ - **Naming Convention:** `dept-[department-name]@company.com` β”‚\n", - "β”‚ β”‚ - **Examples:** `dept-finance@company.com`, `dept-hr@company.com` β”‚\n", - "β”‚ β”‚ - **Membership:** Automatically populated based on Active Directory department assignments β”‚\n", - "β”‚ β”‚ - **Management:** Maintained by HR and department managers β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ ### **Project Lists** β”‚\n", - "β”‚ β”‚ - **Purpose:** Temporary communication for specific projects or initiatives β”‚\n", - "β”‚ β”‚ - **Naming Convention:** `project-[project-name]@company.com` β”‚\n", - "β”‚ β”‚ - **Examples:** `project-website-redesign@company.com`, `project-erp-implementation@company.com` β”‚\n", - "β”‚ β”‚ - **Membership:** Manually managed by project managers β”‚\n", - "β”‚ β”‚ - **Duration:** Active for project lifecycle, archived upon completion β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ ### **Functional Lists** β”‚\n", - "β”‚ β”‚ - **Purpose:** Role-based communication across departments β”‚\n", - "β”‚ β”‚ - **Naming Convention:** `role-[function-name]@company.com` β”‚\n", - "β”‚ β”‚ - **Examples:** `role-managers@company.com`, `role-safety-coordinators@company.com` β”‚\n", - "β”‚ β”‚ - **Membership:** Based on job roles and responsibilities β”‚\n", - "β”‚ β”‚ - **Management:** Maintained by HR with input from department heads β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ ### **Location Lists** β”‚\n", - "β”‚ β”‚ - **Purpose:** Site-specific communication for multi-location organizations β”‚\n", - "β”‚ β”‚ - **Naming Convention:** `location-[site-name]@company.com` β”‚\n", - "β”‚ β”‚ - **Examples:** `location-headquarters@company.com`, `location-warehouse-east@company.com` β”‚\n", - "β”‚ β”‚ - **Membership:** Based on primary work location assignments β”‚\n", - "β”‚ β”‚ - **Management:** Maintained by facilities and HR teams β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ ### **Security Lists** β”‚\n", - "β”‚ β”‚ - **Purpose:** Confidential communication requiring restricted access β”‚\n", - "β”‚ β”‚ - **Naming Convention:** `secure-[purpose]@company.com` β”‚\n", - "β”‚ β”‚ - **Examples:** `secure-executives@company.com`, `secure-incident-response@company.com` β”‚\n", - "β”‚ β”‚ - **Membership:** Strictly controlled with approval requirements β”‚\n", - "β”‚ β”‚ - **Management:** Maintained by IT Security and designated owners β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ ## Prerequisites β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ Before requesting a distribution list, ensure you have: β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ - **Business justification** for the list's creation β”‚\n", - "β”‚ β”‚ - **Manager approval** for departmental or functional lists β”‚\n", - "β”‚ β”‚ - **Defined membership criteria** and initial member list β”‚\n", - "β”‚ β”‚ - **Designated list owner** responsible for ongoing management β”‚\n", - "β”‚ β”‚ - **Understanding of data classification** for list communications β”‚\n", - "β”‚ β”‚ - **Compliance approval** for lists handling sensitive information β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ ## Request Procedure β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ ### 1. Planning and Justification β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ Before submitting a request, prepare the following information: β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ #### **Business Requirements** β”‚\n", - "β”‚ β”‚ - **Purpose and scope** of the distribution list β”‚\n", - "β”‚ β”‚ - **Target audience** and estimated membership size β”‚\n", - "β”‚ β”‚ - **Communication frequency** and expected volume β”‚\n", - "β”‚ β”‚ - **Project timeline** or ongoing operational need β”‚\n", - "β”‚ β”‚ - **Integration requirements** with existing systems β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ #### **Governance Details** β”‚\n", - "β”‚ β”‚ - **Primary list owner** (responsible for membership management) β”‚\n", - "β”‚ β”‚ - **Secondary owner** (backup for owner absence) β”‚\n", - "β”‚ β”‚ - **Approval process** for adding/removing members β”‚\n", - "β”‚ β”‚ - **Access restrictions** and security requirements β”‚\n", - "β”‚ β”‚ - **Retention policies** for list communications β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ ### 2. Submit Distribution List Request β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ - Navigate to the **IT Service Portal** at `itservices.company.com` β”‚\n", - "β”‚ β”‚ - Go to **Service Requests β†’ Email Services β†’ Distribution List Request** β”‚\n", - "β”‚ β”‚ - Complete the comprehensive request form: β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ #### **Required Information** β”‚\n", - "β”‚ β”‚ - **Requested list name** (following naming conventions) β”‚\n", - "β”‚ β”‚ - **List type** (Departmental, Project, Functional, Location, Security) β”‚\n", - "β”‚ β”‚ - **Business justification** and purpose description β”‚\n", - "β”‚ β”‚ - **Primary and secondary owners** with contact information β”‚\n", - "β”‚ β”‚ - **Initial membership list** (names and email addresses) β”‚\n", - "β”‚ β”‚ - **Manager approval** (digital signature required) β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ #### **Additional Details** β”‚\n", - "β”‚ β”‚ - **Membership criteria** for future additions β”‚\n", - "β”‚ β”‚ - **External sender permissions** (if applicable) β”‚\n", - "β”‚ β”‚ - **Moderation requirements** (pre-approval of messages) β”‚\n", - "β”‚ β”‚ - **Integration needs** (SharePoint, Teams, etc.) β”‚\n", - "β”‚ β”‚ - **Special security requirements** β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ ### 3. Approval Process β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ #### **Initial Review (1-2 business days)** β”‚\n", - "β”‚ β”‚ - **IT team verification** of naming conventions and technical feasibility β”‚\n", - "β”‚ β”‚ - **Duplicate list checking** to avoid redundancy β”‚\n", - "β”‚ β”‚ - **Security assessment** for sensitive lists β”‚\n", - "β”‚ β”‚ - **Resource allocation** confirmation β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ #### **Management Approval (2-3 business days)** β”‚\n", - "β”‚ β”‚ - **Department head approval** for departmental lists β”‚\n", - "β”‚ β”‚ - **Project sponsor approval** for project lists β”‚\n", - "β”‚ β”‚ - **Executive approval** for security or cross-functional lists β”‚\n", - "β”‚ β”‚ - **Compliance review** for regulated communications β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ #### **Implementation (1 business day)** β”‚\n", - "β”‚ β”‚ - **Distribution list creation** in Exchange/Office 365 β”‚\n", - "β”‚ β”‚ - **Membership population** from provided list β”‚\n", - "β”‚ β”‚ - **Owner permissions** configuration β”‚\n", - "β”‚ β”‚ - **Testing and validation** of list functionality β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ ### 4. List Activation and Documentation β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ #### **Activation Notification** β”‚\n", - "β”‚ β”‚ - **Confirmation email** sent to list owners β”‚\n", - "β”‚ β”‚ - **List address** and management instructions β”‚\n", - "β”‚ β”‚ - **Access to self-service management tools** β”‚\n", - "β”‚ β”‚ - **Documentation** and best practices guide β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ #### **Owner Responsibilities** β”‚\n", - "β”‚ β”‚ - **Membership management** (additions, removals, updates) β”‚\n", - "β”‚ β”‚ - **Usage monitoring** and policy compliance β”‚\n", - "β”‚ β”‚ - **Regular membership reviews** (quarterly for most lists) β”‚\n", - "β”‚ β”‚ - **Incident reporting** for misuse or security concerns β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ ## Managing Distribution Lists β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ ### **Self-Service Management** β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ #### **Adding Members** β”‚\n", - "β”‚ β”‚ 1. **Access Management Portal** β”‚\n", - "β”‚ β”‚ - Navigate to `groups.company.com` β”‚\n", - "β”‚ β”‚ - Sign in with your **company credentials** β”‚\n", - "β”‚ β”‚ - Select your **managed distribution lists** β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ 2. **Add New Members** β”‚\n", - "β”‚ β”‚ - Click **Add Members** for the target list β”‚\n", - "β”‚ β”‚ - Enter **email addresses** or search company directory β”‚\n", - "β”‚ β”‚ - Verify **membership criteria** compliance β”‚\n", - "β”‚ β”‚ - Click **Add** to complete the process β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ 3. **Bulk Import** (for large additions) β”‚\n", - "β”‚ β”‚ - Download **CSV template** from management portal β”‚\n", - "β”‚ β”‚ - Complete template with **member information** β”‚\n", - "β”‚ β”‚ - Upload file and **review additions** before confirming β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ #### **Removing Members** β”‚\n", - "β”‚ β”‚ 1. **Individual Removal** β”‚\n", - "β”‚ β”‚ - Select **members to remove** from list view β”‚\n", - "β”‚ β”‚ - Click **Remove Members** β”‚\n", - "β”‚ β”‚ - **Confirm removal** and document reason if required β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ 2. **Automated Removal** β”‚\n", - "β”‚ β”‚ - **Inactive accounts** automatically removed after 30 days β”‚\n", - "β”‚ β”‚ - **Departed employees** removed within 24 hours β”‚\n", - "β”‚ β”‚ - **Role changes** may trigger automatic removal β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ #### **Membership Reviews** β”‚\n", - "β”‚ β”‚ - **Quarterly reviews** required for most lists β”‚\n", - "β”‚ β”‚ - **Annual comprehensive reviews** for all lists β”‚\n", - "β”‚ β”‚ - **Immediate reviews** following organizational changes β”‚\n", - "β”‚ β”‚ - **Documentation** of review results and actions taken β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ ### **Advanced Management Features** β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ #### **Message Moderation** β”‚\n", - "β”‚ β”‚ - **Enable moderation** for lists requiring content approval β”‚\n", - "β”‚ β”‚ - **Designate moderators** with message approval rights β”‚\n", - "β”‚ β”‚ - **Set approval criteria** and response timeframes β”‚\n", - "β”‚ β”‚ - **Configure rejection notifications** for inappropriate content β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ #### **External Sender Management** β”‚\n", - "β”‚ β”‚ - **Allow external senders** for customer or vendor communication β”‚\n", - "β”‚ β”‚ - **Whitelist specific domains** or email addresses β”‚\n", - "β”‚ β”‚ - **Require sender authentication** for external messages β”‚\n", - "β”‚ β”‚ - **Log external communications** for security monitoring β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ #### **Integration with Other Systems** β”‚\n", - "β”‚ β”‚ - **SharePoint integration** for document sharing β”‚\n", - "β”‚ β”‚ - **Microsoft Teams** channel creation for collaboration β”‚\n", - "β”‚ β”‚ - **Calendar integration** for meeting invitations β”‚\n", - "β”‚ β”‚ - **Mobile app notifications** for important communications β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ ## Usage Guidelines and Best Practices β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ ### **Appropriate Usage** β”‚\n", - "β”‚ β”‚ - **Business communications** related to list purpose β”‚\n", - "β”‚ β”‚ - **Time-sensitive announcements** requiring broad distribution β”‚\n", - "β”‚ β”‚ - **Collaborative discussions** within project or department scope β”‚\n", - "β”‚ β”‚ - **Emergency notifications** for safety or security issues β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ ### **Prohibited Usage** β”‚\n", - "β”‚ β”‚ - **Personal communications** unrelated to business β”‚\n", - "β”‚ β”‚ - **Spam or promotional** content from external sources β”‚\n", - "β”‚ β”‚ - **Confidential information** on non-secure lists β”‚\n", - "β”‚ β”‚ - **Large file attachments** that may impact email system performance β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ ### **Communication Etiquette** β”‚\n", - "β”‚ β”‚ - **Use clear, descriptive** subject lines β”‚\n", - "β”‚ β”‚ - **Keep messages concise** and relevant to all recipients β”‚\n", - "β”‚ β”‚ - **Reply judiciously** - consider if all members need to see responses β”‚\n", - "β”‚ β”‚ - **Use \"Reply All\" sparingly** to avoid unnecessary email volume β”‚\n", - "β”‚ β”‚ - **Include context** when forwarding messages to lists β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ ### **Security Considerations** β”‚\n", - "β”‚ β”‚ - **Verify recipient lists** before sending sensitive information β”‚\n", - "β”‚ β”‚ - **Use encryption** for confidential communications β”‚\n", - "β”‚ β”‚ - **Avoid including** external recipients on internal lists β”‚\n", - "β”‚ β”‚ - **Report suspicious messages** to IT Security immediately β”‚\n", - "β”‚ β”‚ - **Follow data classification** policies for all communications β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ ## Troubleshooting Common Issues β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ ### **Delivery Problems** β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ #### **Messages Not Delivered** β”‚\n", - "β”‚ β”‚ - **Check list membership** - ensure you're subscribed to the list β”‚\n", - "β”‚ β”‚ - **Verify sender permissions** - confirm you're authorized to send β”‚\n", - "β”‚ β”‚ - **Review message size** - large attachments may be blocked β”‚\n", - "β”‚ β”‚ - **Check spam filters** - messages may be filtered by security systems β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ #### **Partial Delivery** β”‚\n", - "β”‚ β”‚ - **External recipient blocking** - some domains may reject list messages β”‚\n", - "β”‚ β”‚ - **Mailbox full** - individual recipient mailboxes may be at capacity β”‚\n", - "β”‚ β”‚ - **Inactive accounts** - departed employees may still be listed β”‚\n", - "β”‚ β”‚ - **Distribution delays** - large lists may experience delivery delays β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ ### **Management Issues** β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ #### **Cannot Add Members** β”‚\n", - "β”‚ β”‚ - **Verify ownership permissions** - ensure you're designated as list owner β”‚\n", - "β”‚ β”‚ - **Check member eligibility** - confirm recipients meet list criteria β”‚\n", - "β”‚ β”‚ - **Review approval requirements** - some additions may require manager approval β”‚\n", - "β”‚ β”‚ - **Validate email addresses** - ensure addresses are correctly formatted β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ #### **Membership Sync Problems** β”‚\n", - "β”‚ β”‚ - **Active Directory delays** - automatic updates may take 24 hours β”‚\n", - "β”‚ β”‚ - **Organizational changes** - department moves may affect list membership β”‚\n", - "β”‚ β”‚ - **Account status changes** - role changes may trigger unexpected removals β”‚\n", - "β”‚ β”‚ - **Manual override** - contact IT for immediate membership corrections β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ ### **Access and Permission Issues** β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ #### **Cannot Manage List** β”‚\n", - "β”‚ β”‚ - **Ownership verification** - confirm you're designated as primary or secondary owner β”‚\n", - "β”‚ β”‚ - **Account permissions** - ensure your account has proper management rights β”‚\n", - "β”‚ β”‚ - **System maintenance** - management portal may be temporarily unavailable β”‚\n", - "β”‚ β”‚ - **Training requirements** - new owners may need management training β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ ## Monitoring and Reporting β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ ### **Usage Analytics** β”‚\n", - "β”‚ β”‚ - **Message volume** tracking and trending β”‚\n", - "β”‚ β”‚ - **Membership growth** and turnover analysis β”‚\n", - "β”‚ β”‚ - **Delivery success rates** and failure analysis β”‚\n", - "β”‚ β”‚ - **Top senders** and communication patterns β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ ### **Compliance Monitoring** β”‚\n", - "β”‚ β”‚ - **Content scanning** for policy violations β”‚\n", - "β”‚ β”‚ - **External communication** tracking and approval β”‚\n", - "β”‚ β”‚ - **Data classification** compliance verification β”‚\n", - "β”‚ β”‚ - **Retention policy** enforcement and archival β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ ### **Performance Metrics** β”‚\n", - "β”‚ β”‚ - **Delivery times** and system performance β”‚\n", - "β”‚ β”‚ - **User satisfaction** surveys and feedback β”‚\n", - "β”‚ β”‚ - **Cost analysis** for list maintenance and operations β”‚\n", - "β”‚ β”‚ - **Security incident** tracking and response β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ ## List Lifecycle Management β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ ### **Regular Maintenance** β”‚\n", - "β”‚ β”‚ - **Quarterly membership** reviews and updates β”‚\n", - "β”‚ β”‚ - **Annual purpose validation** and business justification β”‚\n", - "β”‚ β”‚ - **Owner succession** planning and documentation β”‚\n", - "β”‚ β”‚ - **Performance optimization** and cleanup β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ ### **List Retirement** β”‚\n", - "β”‚ β”‚ #### **Project Completion** β”‚\n", - "β”‚ β”‚ - **Archive list communications** for future reference β”‚\n", - "β”‚ β”‚ - **Notify members** of list deactivation β”‚\n", - "β”‚ β”‚ - **Redirect to successor lists** if applicable β”‚\n", - "β”‚ β”‚ - **Maintain read-only access** for historical purposes β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ #### **Organizational Changes** β”‚\n", - "β”‚ β”‚ - **Merge redundant lists** following reorganizations β”‚\n", - "β”‚ β”‚ - **Update naming conventions** for consistency β”‚\n", - "β”‚ β”‚ - **Transfer ownership** for continuing business needs β”‚\n", - "β”‚ β”‚ - **Document changes** for audit and compliance β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ ## Support and Training β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ ### **Self-Service Resources** β”‚\n", - "β”‚ β”‚ - **Management Portal:** `groups.company.com` - List management interface β”‚\n", - "β”‚ β”‚ - **Knowledge Base:** Comprehensive guides and FAQs β”‚\n", - "β”‚ β”‚ - **Video Tutorials:** Step-by-step management instructions β”‚\n", - "β”‚ β”‚ - **Best Practices Guide:** Communication and management recommendations β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ ### **Technical Support** β”‚\n", - "β”‚ β”‚ - **Email Support:** `email-support@company.com` or ext. 4357 β”‚\n", - "β”‚ β”‚ - **Distribution List Specialists:** `dl-support@company.com` β”‚\n", - "β”‚ β”‚ - **Training Coordinator:** `email-training@company.com` β”‚\n", - "β”‚ β”‚ - **Compliance Questions:** `email-compliance@company.com` β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ ### **Training Programs** β”‚\n", - "β”‚ β”‚ - **New Owner Training:** Required for all list owners β”‚\n", - "β”‚ β”‚ - **Advanced Management:** Optional training for complex list requirements β”‚\n", - "β”‚ β”‚ - **Compliance Training:** Required for security and regulated lists β”‚\n", - "β”‚ β”‚ - **User Etiquette:** Available for all employees β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ --- β”‚\n", - "β”‚ β”‚ β”‚\n", - "β”‚ β”‚ *Last updated: [Current Date] | Document ID: KB-EMAIL-001 | Classification: Internal Use* β”‚\n", - "β”‚ β”‚ β”‚\n", - "β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜\n", - " \n", - " \n", - "\u001b[3m Generated Columns \u001b[0m\n", - "┏━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n", - "┃\u001b[1m \u001b[0m\u001b[1mName \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mValue \u001b[0m\u001b[1m \u001b[0m┃\n", - "┑━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n", - "β”‚ question β”‚ How do I add new employees to our company's email distribution list without sending a test β”‚\n", - "β”‚ β”‚ email to confirm it works? β”‚\n", - "β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€\n", - "β”‚ context_key_words β”‚ add employees, distribution list, skip test email β”‚\n", - "β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€\n", - "β”‚ ground_truth β”‚ To add new employees to an email distribution list without sending a test email, use the β”‚\n", - "β”‚ β”‚ **IT Service Portal** or **Management Portal** (`groups.company.com`) to manually add β”‚\n", - "β”‚ β”‚ members by entering their email addresses or searching the company directory. The system β”‚\n", - "β”‚ β”‚ will update the list automatically once additions are confirmed through the portal. β”‚\n", - "β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜\n", - " \n", - " [index: 0] \n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "# Preview a few sample records to see what will be generated\n", "preview = data_designer.preview(config_builder=config_builder, num_records=3)\n", @@ -1100,111 +222,9 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[00:13:52] [INFO] 🎨 Creating Data Designer dataset\n", - "[00:13:52] [INFO] βœ… Validation passed\n", - "[00:13:52] [INFO] ⛓️ Sorting column configs into a Directed Acyclic Graph\n", - "[00:13:52] [INFO] πŸ“‚ Dataset path '/home/nvidia/workshop-build-an-agent/code/3-agent-evaluation/artifacts/rag_agent_test_cases' already exists. Dataset from this session\n", - "\t\t will be saved to '/home/nvidia/workshop-build-an-agent/code/3-agent-evaluation/artifacts/rag_agent_test_cases_12-11-2025_001352' instead.\n", - "[00:13:52] [INFO] 🩺 Running health checks for models...\n", - "[00:13:52] [INFO] |-- πŸ‘€ Checking 'nvidia/nvidia-nemotron-nano-9b-v2' in provider named 'nvidia' for model alias 'nvidia-text'...\n", - "[00:13:53] [INFO] |-- βœ… Passed!\n", - "[00:13:53] [INFO] ⏳ Processing batch 1 of 1\n", - "[00:13:53] [INFO] 🌱 Sampling 10 records from seed dataset\n", - "[00:13:53] [INFO] |-- seed dataset size: 12 records\n", - "[00:13:53] [INFO] |-- sampling strategy: ordered\n", - "[00:13:53] [INFO] πŸ“ Preparing llm-text column generation\n", - "[00:13:53] [INFO] |-- column name: 'question'\n", - "[00:13:53] [INFO] |-- model config:\n", - "{\n", - " \"alias\": \"nvidia-text\",\n", - " \"model\": \"nvidia/nvidia-nemotron-nano-9b-v2\",\n", - " \"inference_parameters\": {\n", - " \"temperature\": 0.85,\n", - " \"top_p\": 0.95,\n", - " \"max_tokens\": null,\n", - " \"max_parallel_requests\": 4,\n", - " \"timeout\": null,\n", - " \"extra_body\": null\n", - " },\n", - " \"provider\": \"nvidia\"\n", - "}\n", - "[00:13:53] [INFO] πŸ™ Processing llm-text column 'question' with 4 concurrent workers\n", - "[00:14:07] [INFO] πŸ“ Preparing llm-text column generation\n", - "[00:14:07] [INFO] |-- column name: 'context_key_words'\n", - "[00:14:07] [INFO] |-- model config:\n", - "{\n", - " \"alias\": \"nvidia-text\",\n", - " \"model\": \"nvidia/nvidia-nemotron-nano-9b-v2\",\n", - " \"inference_parameters\": {\n", - " \"temperature\": 0.85,\n", - " \"top_p\": 0.95,\n", - " \"max_tokens\": null,\n", - " \"max_parallel_requests\": 4,\n", - " \"timeout\": null,\n", - " \"extra_body\": null\n", - " },\n", - " \"provider\": \"nvidia\"\n", - "}\n", - "[00:14:07] [INFO] πŸ™ Processing llm-text column 'context_key_words' with 4 concurrent workers\n", - "[00:14:15] [INFO] πŸ“ Preparing llm-text column generation\n", - "[00:14:15] [INFO] |-- column name: 'ground_truth'\n", - "[00:14:15] [INFO] |-- model config:\n", - "{\n", - " \"alias\": \"nvidia-text\",\n", - " \"model\": \"nvidia/nvidia-nemotron-nano-9b-v2\",\n", - " \"inference_parameters\": {\n", - " \"temperature\": 0.85,\n", - " \"top_p\": 0.95,\n", - " \"max_tokens\": null,\n", - " \"max_parallel_requests\": 4,\n", - " \"timeout\": null,\n", - " \"extra_body\": null\n", - " },\n", - " \"provider\": \"nvidia\"\n", - "}\n", - "[00:14:15] [INFO] πŸ™ Processing llm-text column 'ground_truth' with 4 concurrent workers\n", - "[00:14:24] [INFO] πŸ“Š Model usage summary:\n", - "{\n", - " \"nvidia/nvidia-nemotron-nano-9b-v2\": {\n", - " \"token_usage\": {\n", - " \"prompt_tokens\": 20538,\n", - " \"completion_tokens\": 11912,\n", - " \"total_tokens\": 32450\n", - " },\n", - " \"request_usage\": {\n", - " \"successful_requests\": 30,\n", - " \"failed_requests\": 0,\n", - " \"total_requests\": 30\n", - " },\n", - " \"tokens_per_second\": 1032,\n", - " \"requests_per_minute\": 57\n", - " }\n", - "}\n", - "[00:14:24] [INFO] πŸ“ Measuring dataset column statistics:\n", - "[00:14:24] [INFO] |-- 🌱 column: 'topic'\n", - "[00:14:24] [INFO] |-- 🌱 column: 'title'\n", - "[00:14:24] [INFO] |-- 🌱 column: 'filename'\n", - "[00:14:24] [INFO] |-- 🌱 column: 'content'\n", - "[00:14:24] [INFO] |-- πŸ“ column: 'question'\n", - "[00:14:24] [INFO] |-- πŸ“ column: 'context_key_words'\n", - "[00:14:24] [INFO] |-- πŸ“ column: 'ground_truth'\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Generated 10 test cases\n" - ] - } - ], + "outputs": [], "source": [ "# We'll only generate a few records for this tutorial\n", "dataset_results = data_designer.create(\n", @@ -1232,17 +252,9 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Saved 10 test cases to ../../data/evaluation/synthetic_rag_agent_test_cases.json\n" - ] - } - ], + "outputs": [], "source": [ "# Set output path\n", "output_path = Path(\"../../data/evaluation/synthetic_rag_agent_test_cases.json\")\n", @@ -1271,7 +283,7 @@ "source": [ "## What's Next?\n", "\n", - "Check out to view your generated data.\n", + "Check out to view your generated data.\n", "\n", "In the next notebook, you'll use this same process to create an evaluation dataset for your Report Generation agent!" ] diff --git a/code/3-agent-evaluation/generate_report_eval_dataset.ipynb b/code/3-agent-evaluation/generate_report_eval_dataset.ipynb index 9a821b7..b044b36 100644 --- a/code/3-agent-evaluation/generate_report_eval_dataset.ipynb +++ b/code/3-agent-evaluation/generate_report_eval_dataset.ipynb @@ -15,37 +15,24 @@ "source": [ "## 1. Setup\n", "\n", - "First, let's install the Data Designer library and set up our environment." + "First, let's set up our environment." ] }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Note: you may need to restart the kernel to use updated packages.\n", - "Completed setup\n" - ] - } - ], + "outputs": [], "source": [ - "# Install Data Designer if needed\n", - "%pip install data-designer -q\n", + "%pip install -r ../../requirements.txt > /dev/null\n", "\n", - "# Load environment variables\n", "from dotenv import load_dotenv\n", "_ = load_dotenv(\"../../variables.env\")\n", "_ = load_dotenv(\"../../secrets.env\")\n", "\n", "import os\n", "import json\n", - "from pathlib import Path\n", - "\n", - "print(\"Completed setup\")" + "from pathlib import Path" ] }, { @@ -54,22 +41,14 @@ "source": [ "## 2. Configure DataDesigner\n", "\n", - "Initialize Data Designer with default settings." + "Next, let's initialize Data Designer with default settings." ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Completed initialization\n" - ] - } - ], + "outputs": [], "source": [ "from data_designer.essentials import (\n", " DataDesigner,\n", @@ -97,24 +76,9 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[17:50:53] [INFO] πŸ’Ύ Saving seed dataset to ../../data/evaluation/report_seed_data.parquet\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Created seed data with 10 topics\n" - ] - } - ], + "outputs": [], "source": [ "import pandas as pd\n", "\n", @@ -191,17 +155,9 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Dataset configuration built with structured output\n" - ] - } - ], + "outputs": [], "source": [ "from typing import List\n", "from pydantic import BaseModel, Field\n", @@ -276,165 +232,9 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[17:51:01] [INFO] πŸ‘€ Preview generation in progress\n", - "[17:51:01] [INFO] βœ… Validation passed\n", - "[17:51:01] [INFO] ⛓️ Sorting column configs into a Directed Acyclic Graph\n", - "[17:51:01] [INFO] 🩺 Running health checks for models...\n", - "[17:51:01] [INFO] |-- πŸ‘€ Checking 'nvidia/nvidia-nemotron-nano-9b-v2' in provider named 'nvidia' for model alias 'nvidia-text'...\n", - "[17:51:03] [INFO] |-- βœ… Passed!\n", - "[17:51:03] [INFO] 🌱 Sampling 3 records from seed dataset\n", - "[17:51:03] [INFO] |-- seed dataset size: 10 records\n", - "[17:51:03] [INFO] |-- sampling strategy: ordered\n", - "[17:51:03] [INFO] πŸ—‚οΈ Preparing llm-structured column generation\n", - "[17:51:03] [INFO] |-- column name: 'evaluation_case'\n", - "[17:51:03] [INFO] |-- model config:\n", - "{\n", - " \"alias\": \"nvidia-text\",\n", - " \"model\": \"nvidia/nvidia-nemotron-nano-9b-v2\",\n", - " \"inference_parameters\": {\n", - " \"temperature\": 0.85,\n", - " \"top_p\": 0.95,\n", - " \"max_tokens\": null,\n", - " \"max_parallel_requests\": 4,\n", - " \"timeout\": null,\n", - " \"extra_body\": null\n", - " },\n", - " \"provider\": \"nvidia\"\n", - "}\n", - "[17:51:03] [INFO] πŸ™ Processing llm-structured column 'evaluation_case' with 4 concurrent workers\n", - "[17:51:10] [INFO] πŸ“Š Model usage summary:\n", - "{\n", - " \"nvidia/nvidia-nemotron-nano-9b-v2\": {\n", - " \"token_usage\": {\n", - " \"prompt_tokens\": 1601,\n", - " \"completion_tokens\": 2259,\n", - " \"total_tokens\": 3860\n", - " },\n", - " \"request_usage\": {\n", - " \"successful_requests\": 3,\n", - " \"failed_requests\": 0,\n", - " \"total_requests\": 3\n", - " },\n", - " \"tokens_per_second\": 529,\n", - " \"requests_per_minute\": 24\n", - " }\n", - "}\n", - "[17:51:10] [INFO] πŸ“ Measuring dataset column statistics:\n", - "[17:51:10] [INFO] |-- 🌱 column: 'domain'\n", - "[17:51:10] [INFO] |-- 🌱 column: 'topic_area'\n", - "[17:51:10] [INFO] |-- πŸ—‚οΈ column: 'evaluation_case'\n", - "[17:51:10] [INFO] πŸ‘ Preview complete!\n" - ] - }, - { - "data": { - "text/html": [ - "
                                                                                                                   \n",
-       "                                                   Seed Columns                                                    \n",
-       "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
-       "┃ Name                                ┃ Value                                                                     ┃\n",
-       "┑━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
-       "β”‚ domain                              β”‚ Technology                                                                β”‚\n",
-       "β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€\n",
-       "β”‚ topic_area                          β”‚ Artificial Intelligence                                                   β”‚\n",
-       "β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜\n",
-       "                                                                                                                   \n",
-       "                                                                                                                   \n",
-       "                                                 Generated Columns                                                 \n",
-       "┏━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
-       "┃ Name            ┃ Value                                                                                         ┃\n",
-       "┑━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
-       "β”‚ evaluation_case β”‚ {                                                                                             β”‚\n",
-       "β”‚                 β”‚     'topic': 'Ethical Implications of Generative AI in Content Creation',                     β”‚\n",
-       "β”‚                 β”‚     'expected_sections': [                                                                    β”‚\n",
-       "β”‚                 β”‚         'Executive Summary',                                                                  β”‚\n",
-       "β”‚                 β”‚         'Methodology and Scope',                                                              β”‚\n",
-       "β”‚                 β”‚         'Technical Overview of Generative AI Models',                                         β”‚\n",
-       "β”‚                 β”‚         'Ethical Challenges in Content Generation',                                           β”‚\n",
-       "β”‚                 β”‚         'Case Studies: AI-Generated Content in Media and Marketing',                          β”‚\n",
-       "β”‚                 β”‚         'Policy Recommendations for Ethical AI Deployment',                                   β”‚\n",
-       "β”‚                 β”‚         'Future Outlook and Risk Mitigation Strategies'                                       β”‚\n",
-       "β”‚                 β”‚     ],                                                                                        β”‚\n",
-       "β”‚                 β”‚     'quality_criteria': {                                                                     β”‚\n",
-       "β”‚                 β”‚         'should_include': [                                                                   β”‚\n",
-       "β”‚                 β”‚             'A thorough analysis of existing ethical frameworks (e.g., transparency, bias,    β”‚\n",
-       "β”‚                 β”‚ accountability) relevant to generative AI',                                                   β”‚\n",
-       "β”‚                 β”‚             'Real-world examples of AI-generated content misuse or success',                  β”‚\n",
-       "β”‚                 β”‚             'Data-driven evaluation of bias or misinformation risks in AI outputs',           β”‚\n",
-       "β”‚                 β”‚             'Balanced discussion of both opportunities and risks for stakeholders'            β”‚\n",
-       "β”‚                 β”‚         ],                                                                                    β”‚\n",
-       "β”‚                 β”‚         'should_avoid': [                                                                     β”‚\n",
-       "β”‚                 β”‚             'Overly technical jargon without clear explanations for non-expert readers',      β”‚\n",
-       "β”‚                 β”‚             'Unsubstantiated claims about AI capabilities or ethical impacts',                β”‚\n",
-       "β”‚                 β”‚             'Ignoring counterarguments or dissenting perspectives',                           β”‚\n",
-       "β”‚                 β”‚             'Plagiarism or lack of proper citations for referenced studies'                   β”‚\n",
-       "β”‚                 β”‚         ]                                                                                     β”‚\n",
-       "β”‚                 β”‚     }                                                                                         β”‚\n",
-       "β”‚                 β”‚ }                                                                                             β”‚\n",
-       "β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜\n",
-       "                                                                                                                   \n",
-       "                                                    [index: 0]                                                     \n",
-       "
\n" - ], - "text/plain": [ - " \n", - "\u001b[3m Seed Columns \u001b[0m\n", - "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n", - "┃\u001b[1m \u001b[0m\u001b[1mName \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mValue \u001b[0m\u001b[1m \u001b[0m┃\n", - "┑━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n", - "β”‚ domain β”‚ Technology β”‚\n", - "β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€\n", - "β”‚ topic_area β”‚ Artificial Intelligence β”‚\n", - "β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜\n", - " \n", - " \n", - "\u001b[3m Generated Columns \u001b[0m\n", - "┏━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n", - "┃\u001b[1m \u001b[0m\u001b[1mName \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mValue \u001b[0m\u001b[1m \u001b[0m┃\n", - "┑━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n", - "β”‚ evaluation_case β”‚ \u001b[1m{\u001b[0m β”‚\n", - "β”‚ β”‚ \u001b[32m'topic'\u001b[0m: \u001b[32m'Ethical Implications of Generative AI in Content Creation'\u001b[0m, β”‚\n", - "β”‚ β”‚ \u001b[32m'expected_sections'\u001b[0m: \u001b[1m[\u001b[0m β”‚\n", - "β”‚ β”‚ \u001b[32m'Executive Summary'\u001b[0m, β”‚\n", - "β”‚ β”‚ \u001b[32m'Methodology and Scope'\u001b[0m, β”‚\n", - "β”‚ β”‚ \u001b[32m'Technical Overview of Generative AI Models'\u001b[0m, β”‚\n", - "β”‚ β”‚ \u001b[32m'Ethical Challenges in Content Generation'\u001b[0m, β”‚\n", - "β”‚ β”‚ \u001b[32m'Case Studies: AI-Generated Content in Media and Marketing'\u001b[0m, β”‚\n", - "β”‚ β”‚ \u001b[32m'Policy Recommendations for Ethical AI Deployment'\u001b[0m, β”‚\n", - "β”‚ β”‚ \u001b[32m'Future Outlook and Risk Mitigation Strategies'\u001b[0m β”‚\n", - "β”‚ β”‚ \u001b[1m]\u001b[0m, β”‚\n", - "β”‚ β”‚ \u001b[32m'quality_criteria'\u001b[0m: \u001b[1m{\u001b[0m β”‚\n", - "β”‚ β”‚ \u001b[32m'should_include'\u001b[0m: \u001b[1m[\u001b[0m β”‚\n", - "β”‚ β”‚ \u001b[32m'A thorough analysis of existing ethical frameworks \u001b[0m\u001b[32m(\u001b[0m\u001b[32me.g., transparency, bias, \u001b[0m β”‚\n", - "β”‚ β”‚ \u001b[32maccountability\u001b[0m\u001b[32m)\u001b[0m\u001b[32m relevant to generative AI'\u001b[0m, β”‚\n", - "β”‚ β”‚ \u001b[32m'Real-world examples of AI-generated content misuse or success'\u001b[0m, β”‚\n", - "β”‚ β”‚ \u001b[32m'Data-driven evaluation of bias or misinformation risks in AI outputs'\u001b[0m, β”‚\n", - "β”‚ β”‚ \u001b[32m'Balanced discussion of both opportunities and risks for stakeholders'\u001b[0m β”‚\n", - "β”‚ β”‚ \u001b[1m]\u001b[0m, β”‚\n", - "β”‚ β”‚ \u001b[32m'should_avoid'\u001b[0m: \u001b[1m[\u001b[0m β”‚\n", - "β”‚ β”‚ \u001b[32m'Overly technical jargon without clear explanations for non-expert readers'\u001b[0m, β”‚\n", - "β”‚ β”‚ \u001b[32m'Unsubstantiated claims about AI capabilities or ethical impacts'\u001b[0m, β”‚\n", - "β”‚ β”‚ \u001b[32m'Ignoring counterarguments or dissenting perspectives'\u001b[0m, β”‚\n", - "β”‚ β”‚ \u001b[32m'Plagiarism or lack of proper citations for referenced studies'\u001b[0m β”‚\n", - "β”‚ β”‚ \u001b[1m]\u001b[0m β”‚\n", - "β”‚ β”‚ \u001b[1m}\u001b[0m β”‚\n", - "β”‚ β”‚ \u001b[1m}\u001b[0m β”‚\n", - "β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜\n", - " \n", - " [index: 0] \n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "# Preview a few sample records to see what will be generated\n", "preview = data_designer.preview(config_builder=config_builder, num_records=3)\n", @@ -452,74 +252,9 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[17:51:23] [INFO] 🎨 Creating Data Designer dataset\n", - "[17:51:23] [INFO] βœ… Validation passed\n", - "[17:51:23] [INFO] ⛓️ Sorting column configs into a Directed Acyclic Graph\n", - "[17:51:23] [INFO] πŸ“‚ Dataset path '/home/nvidia/workshop-build-an-agent/code/3-agent-evaluation/artifacts/report_agent_test_cases' already exists. Dataset from this session\n", - "\t\t will be saved to '/home/nvidia/workshop-build-an-agent/code/3-agent-evaluation/artifacts/report_agent_test_cases_12-11-2025_175123' instead.\n", - "[17:51:23] [INFO] 🩺 Running health checks for models...\n", - "[17:51:23] [INFO] |-- πŸ‘€ Checking 'nvidia/nvidia-nemotron-nano-9b-v2' in provider named 'nvidia' for model alias 'nvidia-text'...\n", - "[17:51:24] [INFO] |-- βœ… Passed!\n", - "[17:51:24] [INFO] ⏳ Processing batch 1 of 1\n", - "[17:51:24] [INFO] 🌱 Sampling 10 records from seed dataset\n", - "[17:51:24] [INFO] |-- seed dataset size: 10 records\n", - "[17:51:24] [INFO] |-- sampling strategy: ordered\n", - "[17:51:24] [INFO] πŸ—‚οΈ Preparing llm-structured column generation\n", - "[17:51:24] [INFO] |-- column name: 'evaluation_case'\n", - "[17:51:24] [INFO] |-- model config:\n", - "{\n", - " \"alias\": \"nvidia-text\",\n", - " \"model\": \"nvidia/nvidia-nemotron-nano-9b-v2\",\n", - " \"inference_parameters\": {\n", - " \"temperature\": 0.85,\n", - " \"top_p\": 0.95,\n", - " \"max_tokens\": null,\n", - " \"max_parallel_requests\": 4,\n", - " \"timeout\": null,\n", - " \"extra_body\": null\n", - " },\n", - " \"provider\": \"nvidia\"\n", - "}\n", - "[17:51:24] [INFO] πŸ™ Processing llm-structured column 'evaluation_case' with 4 concurrent workers\n", - "[17:51:45] [INFO] πŸ“Š Model usage summary:\n", - "{\n", - " \"nvidia/nvidia-nemotron-nano-9b-v2\": {\n", - " \"token_usage\": {\n", - " \"prompt_tokens\": 5350,\n", - " \"completion_tokens\": 7384,\n", - " \"total_tokens\": 12734\n", - " },\n", - " \"request_usage\": {\n", - " \"successful_requests\": 10,\n", - " \"failed_requests\": 0,\n", - " \"total_requests\": 10\n", - " },\n", - " \"tokens_per_second\": 602,\n", - " \"requests_per_minute\": 28\n", - " }\n", - "}\n", - "[17:51:45] [INFO] πŸ“ Measuring dataset column statistics:\n", - "[17:51:45] [INFO] |-- 🌱 column: 'domain'\n", - "[17:51:45] [INFO] |-- 🌱 column: 'topic_area'\n", - "[17:51:45] [INFO] |-- πŸ—‚οΈ column: 'evaluation_case'\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Generated 10 test cases\n" - ] - } - ], + "outputs": [], "source": [ "# Generate evaluation data (one test case per topic seed)\n", "num_topics = len(report_topics_data)\n", @@ -551,15 +286,7 @@ "cell_type": "code", "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Saved 10 test cases to /home/nvidia/workshop-build-an-agent/code/3-agent-evaluation/../../data/evaluation/synthetic_report_agent_test_cases.json\n" - ] - } - ], + "outputs": [], "source": [ "# Set output path\n", "output_path = Path(\"../../data/evaluation/synthetic_report_agent_test_cases.json\")\n", @@ -600,9 +327,9 @@ "source": [ "## What's Next?\n", "\n", - "Check out to view your generated data.\n", + "Check out to view your generated data.\n", "\n", - "You've built evaluation datasets for both of your agents. Now, you're ready to move on to the next step- putting together an evaluation pipeline and using the data you've generated to evaluate agent performance." + "By now, you've built evaluation datasets for both of your agents. Awesome! You're ready to move on to the next step- putting together an evaluation pipeline and using the data you've generated to evaluate agent performance." ] } ], diff --git a/requirements.txt b/requirements.txt index f47bcc6..281f4f2 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,4 @@ +data-designer~=0.1.5 dotenv~=0.9.9 faiss-cpu~=1.12.0 fastapi~=0.116.1