From 786992f6bc8869574ae3c99f63be4b286162694e Mon Sep 17 00:00:00 2001 From: r14minji Date: Sun, 12 Jan 2025 23:10:51 +0900 Subject: [PATCH 1/3] [E-2] 15-Evaluations / 06-LangSmith-Dataset --- 16-Evaluations/04-LangSmith-Dataset.ipynb | 380 ++++++++++++++++++++++ 16-Evaluations/assets/eval-03.png | Bin 0 -> 10411 bytes 16-Evaluations/assets/eval-04.png | Bin 0 -> 9805 bytes 16-Evaluations/assets/eval-05.png | Bin 0 -> 9843 bytes 16-Evaluations/assets/eval-06.png | Bin 0 -> 202405 bytes 5 files changed, 380 insertions(+) create mode 100644 16-Evaluations/04-LangSmith-Dataset.ipynb create mode 100644 16-Evaluations/assets/eval-03.png create mode 100644 16-Evaluations/assets/eval-04.png create mode 100644 16-Evaluations/assets/eval-05.png create mode 100644 16-Evaluations/assets/eval-06.png diff --git a/16-Evaluations/04-LangSmith-Dataset.ipynb b/16-Evaluations/04-LangSmith-Dataset.ipynb new file mode 100644 index 000000000..64218e16c --- /dev/null +++ b/16-Evaluations/04-LangSmith-Dataset.ipynb @@ -0,0 +1,380 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "635d8ebb", + "metadata": {}, + "source": [ + "# LangSmith-Dataset \n", + "\n", + "- Author: [Minji](https://github.com/r14minji)\n", + "- Design: \n", + "- Peer Review: \n", + "- This is a part of [LangChain Open Tutorial](https://github.com/LangChain-OpenTutorial/LangChain-OpenTutorial)\n", + "\n", + "[![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/LangChain-OpenTutorial/LangChain-OpenTutorial/blob/main/99-TEMPLATE/00-BASE-TEMPLATE-EXAMPLE.ipynb) [![Open in GitHub](https://img.shields.io/badge/Open%20in%20GitHub-181717?style=flat-square&logo=github&logoColor=white)](https://github.com/LangChain-OpenTutorial/LangChain-OpenTutorial/blob/main/99-TEMPLATE/00-BASE-TEMPLATE-EXAMPLE.ipynb)\n", + "\n", + "## Overview\n", + "\n", + "The notebook demonstrates how to create a dataset for evaluating Retrieval-Augmented Generation (RAG) models using LangSmith. It includes steps for setting up environment variables, creating datasets with questions and answers, and uploading examples to LangSmith for testing. Additionally, it provides instructions on using HuggingFace datasets and updating datasets with new examples.\n", + "\n", + "### Table of Contents\n", + "\n", + "- [Overview](#overview)\n", + "- [Environment Setup](#environment-setup)\n", + "- [...](#...)\n", + "\n", + "### References\n", + "\n", + "- [LangChain](https://blog.langchain.dev/)\n", + "- [...](...)\n", + "----" + ] + }, + { + "cell_type": "markdown", + "id": "c6c7aba4", + "metadata": {}, + "source": [ + "## Environment Setup\n", + "\n", + "Setting up your environment is the first step. See the [Environment Setup](https://wikidocs.net/257836) guide for more details.\n", + "\n", + "\n", + "**[Note]**\n", + "\n", + "The langchain-opentutorial is a package of easy-to-use environment setup guidance, useful functions and utilities for tutorials.\n", + "Check out the [`langchain-opentutorial`](https://github.com/LangChain-OpenTutorial/langchain-opentutorial-pypi) for more details." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "21943adb", + "metadata": {}, + "outputs": [], + "source": [ + "%%capture --no-stderr\n", + "%pip install langchain-opentutorial" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "f25ec196", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m24.2\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m24.3.1\u001b[0m\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n" + ] + } + ], + "source": [ + "# Install required packages\n", + "from langchain_opentutorial import package\n", + "\n", + "package.install(\n", + " [\n", + " \"langsmith\",\n", + " \"langchain\",\n", + " \"langchain_core\",\n", + " \"langchain-anthropic\",\n", + " \"langchain_community\",\n", + " \"langchain_text_splitters\",\n", + " \"langchain_openai\",\n", + " ],\n", + " verbose=False,\n", + " upgrade=False,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "690a9ae0", + "metadata": {}, + "source": [ + "You can set API keys in a `.env` file or set them manually.\n", + "\n", + "[Note] If you’re not using the `.env` file, no worries! Just enter the keys directly in the cell below, and you’re good to go." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "327c2c7c", + "metadata": {}, + "outputs": [], + "source": [ + "from dotenv import load_dotenv\n", + "from langchain_opentutorial import set_env\n", + "\n", + "# Attempt to load environment variables from a .env file; if unsuccessful, set them manually.\n", + "if not load_dotenv():\n", + " set_env(\n", + " {\n", + " \"OPENAI_API_KEY\": \"\",\n", + " \"LANGCHAIN_API_KEY\": \"\",\n", + " \"LANGCHAIN_TRACING_V2\": \"true\",\n", + " \"LANGCHAIN_ENDPOINT\": \"https://api.smith.langchain.com\",\n", + " \"LANGCHAIN_PROJECT\": \"\", # set the project name same as the title\n", + " }\n", + " )" + ] + }, + { + "cell_type": "markdown", + "id": "aa00c3f4", + "metadata": {}, + "source": [ + "## Creating a LangSmith Dataset\n", + "\n", + "Let's learn how to build a custom RAG evaluation dataset.\n", + "\n", + "To construct a dataset, you need to understand three main processes:\n", + "\n", + "Case: Evaluating whether the retrieval is relevant to the question\n", + "\n", + "> Question - Retrieval\n", + "\n", + "![](./assets/eval-03.png)\n", + "\n", + "Case: Evaluating whether the answer is relevant to the question\n", + "\n", + "> Question - Answer\n", + "\n", + "![](./assets/eval-04.png)\n", + "\n", + "Case: Checking if the answer is based on the retrieved documents (Hallucination Check)\n", + "\n", + "> Retrieval - Answer\n", + "\n", + "![](./assets/eval-05.png)\n", + "\n", + "Thus, you typically need `Question`, `Retrieval`, and `Answer` information. However, it is practically challenging to construct ground truth for `Retrieval`.\n", + "\n", + "\n", + "If ground truth for `Retrieval` exists, you can save and use it all in your dataset. Otherwise, you can create and use a dataset with only `Question` and `Answer`" + ] + }, + { + "cell_type": "markdown", + "id": "fb68938f", + "metadata": {}, + "source": [ + "## Creating a LangSmith Dataset\n", + "\n", + "Use `inputs` and `outputs` to create a dataset.\n", + "\n", + "The dataset consists of `questions` and `answers`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "62f970c2", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "\n", + "# List of questions and answers\n", + "inputs = [\n", + " \"What is the name of the generative AI created by Samsung Electronics?\",\n", + " \"On what date did U.S. President Biden issue an executive order ensuring safe and trustworthy AI development and usage?\",\n", + " \"Please briefly describe Cohere's data provenance explorer.\"\n", + "]\n", + "\n", + "# List of corresponding answers\n", + "outputs = [\n", + " \"The name of the generative AI created by Samsung Electronics is Samsung Gauss.\",\n", + " \"On October 30, 2023, U.S. President Biden issued an executive order.\",\n", + " \"Cohere's data provenance explorer is a platform that tracks the sources and licensing status of datasets used for training AI models, ensuring transparency. It collaborates with 12 organizations and provides source information for over 2,000 datasets, helping developers understand data composition and lineage.\",\n", + "]\n", + "\n", + "# Create question-answer pairs\n", + "qa_pairs = [{\"question\": q, \"answer\": a} for q, a in zip(inputs, outputs)]\n", + "\n", + "# Convert to a DataFrame\n", + "df = pd.DataFrame(qa_pairs)\n", + "\n", + "# Display the DataFrame,\n", + "df.head()" + ] + }, + { + "cell_type": "markdown", + "id": "1b812f36", + "metadata": {}, + "source": [ + "## 출력결과 이미지로 -> 영어" + ] + }, + { + "cell_type": "markdown", + "id": "40373119", + "metadata": {}, + "source": [ + "Alternatively, you can use the Synthetic Dataset generated in a previous tutorial.\n", + "\n", + "The code below shows an example of using an uploaded HuggingFace Dataset." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "25c5f5a9", + "metadata": {}, + "outputs": [], + "source": [ + "# !pip install -qU datasets" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b082991", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "from datasets import load_dataset, Dataset\n", + "import os\n", + "\n", + "# Download dataset from HuggingFace Dataset using the repo_id\n", + "dataset = load_dataset(\n", + " teddylee777/rag-synthetic-dataset, # Dataset name\n", + " token=os.environ[\"HUGGINGFACEHUB_API_TOKEN\"], # Required for private datasets\n", + ")\n", + "\n", + "# View dataset by split\n", + "huggingface_df = dataset[\"korean_v1\"].to_pandas()\n", + "huggingface_df.head()" + ] + }, + { + "cell_type": "markdown", + "id": "87d741c6", + "metadata": {}, + "source": [ + "## 이미지 필요 -> 영어로" + ] + }, + { + "cell_type": "markdown", + "id": "d38f536e", + "metadata": {}, + "source": [ + "## Creating a Dataset for LangSmith Testing\n", + "\n", + "- Create a new dataset under `Datasets & Testing`.\n", + "\n", + "![](./assets/eval-06.png)\n", + "\n", + "You can also create a dataset directly using the LangSmith UI from a CSV file.\n", + "\n", + "For more details, refer to the documentation below:\n", + "\n", + "- [LangSmith UI Documentation](https://docs.smith.langchain.com/evaluation/faq/manage-datasets)\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "775c632b", + "metadata": {}, + "outputs": [], + "source": [ + "from langsmith import Client\n", + "\n", + "client = Client()\n", + "dataset_name = \"RAG_EVAL_DATASET\"\n", + "\n", + "\n", + "# Function to create a dataset\n", + "def create_dataset(client, dataset_name, description=None):\n", + " for dataset in client.list_datasets():\n", + " if dataset.name == dataset_name:\n", + " return dataset\n", + "\n", + " dataset = client.create_dataset(\n", + " dataset_name=dataset_name,\n", + " description=description,\n", + " )\n", + " return dataset\n", + "\n", + "\n", + "# Create dataset\n", + "dataset = create_dataset(client, dataset_name)\n", + "\n", + "# Add examples to the created dataset\n", + "client.create_examples(\n", + " inputs=[{\"question\": q} for q in df[\"question\"].tolist()],\n", + " outputs=[{\"answer\": a} for a in df[\"answer\"].tolist()],\n", + " dataset_id=dataset.id,\n", + ")\n" + ] + }, + { + "cell_type": "markdown", + "id": "030a7674", + "metadata": {}, + "source": [ + "You can add examples to the dataset later." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fb9c0372", + "metadata": {}, + "outputs": [], + "source": [ + "# New list of questions\n", + "new_questions = [\n", + " \"What is the name of the generative AI created by Samsung Electronics?\",\n", + " \"Is it true that Google invested $2 billion in Teddynote?\",\n", + "]\n", + "\n", + "# 새로운 답변 목록\n", + "new_answers = [\n", + " \"The name of the generative AI created by Samsung Electronics is Teddynote.\",\n", + " \"This is not true. Google agreed to invest up to $2 billion in Anthropic, starting with $500 million and planning to invest an additional $1.5 billion in the future.\",\n", + "]\n", + "\n", + "# Verify the updated version in the UI\n", + "client.create_examples(\n", + " inputs=[{\"question\": q} for q in new_questions],\n", + " outputs=[{\"answer\": a} for a in new_answers],\n", + " dataset_id=dataset.id,\n", + ")\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "langchain-kr-lwwSZlnu-py3.11", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.10" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/16-Evaluations/assets/eval-03.png b/16-Evaluations/assets/eval-03.png new file mode 100644 index 0000000000000000000000000000000000000000..73777693d1499de51d0d4c482869d9c7e7bf0399 GIT binary patch literal 10411 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 VaWfZJ)!%BYlAOA1^-J@x{|9puHy;21 literal 0 HcmV?d00001 diff --git a/16-Evaluations/assets/eval-04.png b/16-Evaluations/assets/eval-04.png new file mode 100644 index 0000000000000000000000000000000000000000..f5e59c18611091f625b65523185110861f71f281 GIT binary patch literal 9805 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 literal 0 HcmV?d00001 diff --git a/16-Evaluations/assets/eval-05.png b/16-Evaluations/assets/eval-05.png new file mode 100644 index 0000000000000000000000000000000000000000..425687d7c26357567505d3969ed7c8373b11f0ef GIT binary patch literal 9843 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 literal 0 HcmV?d00001 diff --git a/16-Evaluations/assets/eval-06.png b/16-Evaluations/assets/eval-06.png new file mode 100644 index 0000000000000000000000000000000000000000..0741f773f6825ef7f4d69d907033d07d0b718eb7 GIT binary patch literal 202405 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