diff --git a/Solar-Fullstack-LLM-101/09_2_langgraph_Self_RAG.ipynb b/Solar-Fullstack-LLM-101/09_2_langgraph_Self_RAG.ipynb
index 0017abc..e1d3026 100644
--- a/Solar-Fullstack-LLM-101/09_2_langgraph_Self_RAG.ipynb
+++ b/Solar-Fullstack-LLM-101/09_2_langgraph_Self_RAG.ipynb
@@ -1,433 +1,797 @@
{
- "cells": [
- {
- "cell_type": "markdown",
- "id": "6156e0ed",
- "metadata": {},
- "source": [
- "\n",
- "\n",
- ""
- ]
- },
- {
- "attachments": {
- "image.png": {
- "image/png": "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"
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "6156e0ed",
+ "metadata": {
+ "id": "6156e0ed"
+ },
+ "source": [
+ "\n",
+ "
\n",
+ ""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "919fe33c-0149-4f7d-b200-544a18986c9a",
+ "metadata": {
+ "id": "919fe33c-0149-4f7d-b200-544a18986c9a"
+ },
+ "source": [
+ "# Upstage Self-RAG\n",
+ "\n",
+ "Self-RAG is a strategy for RAG that incorperates [self-reflection / self-grading on retrieved documents and generations](https://blog.langchain.dev/agentic-rag-with-langgraph/). It leverages LLM to make decisions in the answer generation steps, hence improves quality of the final answer.\n",
+ "\n",
+ "See [Self-RAG: Learning to Retrieve, Generate, and Critique through Self-Reflection](https://arxiv.org/abs/2310.11511) paper for more detailed information.\n",
+ "\n",
+ "In this example, we will implement some of these ideas. With [Upstage integrations](https://python.langchain.com/docs/integrations/providers/upstage/) and [LangGraph](https://python.langchain.com/docs/langgraph), you can achieve this with just a few additional lines of code. Particularly, it uses Upstage Solar Mini chat model, Embeddings model, Layout Analysis for document understanding and retrieval, and Groundedness Check for verifying the generative model's response.\n",
+ "\n",
+ ""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "72f3ee57-68ab-4040-bd36-4014e2a23d96",
+ "metadata": {
+ "id": "72f3ee57-68ab-4040-bd36-4014e2a23d96"
+ },
+ "source": [
+ "## Environment"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "a384cc48-0425-4e8f-aafc-cfb8e56025c9",
+ "metadata": {
+ "id": "a384cc48-0425-4e8f-aafc-cfb8e56025c9"
+ },
+ "outputs": [],
+ "source": [
+ "!pip install -qU langchain-core langchain-upstage langchain-chroma langchain langgraph\n",
+ "!pip install -qU python-dotenv"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "15569b93-3c68-4aac-838c-37112d33987a",
+ "metadata": {
+ "id": "15569b93-3c68-4aac-838c-37112d33987a"
+ },
+ "source": [
+ "### Environment variables\n",
+ "\n",
+ "Set up environment variables\n",
+ "* UPSTAGE_API_KEY\n",
+ "\n",
+ "Optionally, set these environment variables to use [LangSmith](https://docs.smith.langchain.com/) for tracing (shown at the bottom)\n",
+ "\n",
+ "```\n",
+ "LANGCHAIN_TRACING_V2=true\n",
+ "LANGCHAIN_ENDPOINT=https://api.smith.langchain.com\n",
+ "LANGCHAIN_API_KEY=YOUR_KEY\n",
+ "```"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "f18b63c7-d0d3-41c1-ae6b-5a0f1b8ccf0f",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "f18b63c7-d0d3-41c1-ae6b-5a0f1b8ccf0f",
+ "outputId": "3c89d91b-1b7a-4c73-cbab-8f4cc1391866"
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Enter your API Key··········\n",
+ "Enter your API Key··········\n"
+ ]
+ }
+ ],
+ "source": [
+ "# @title set API key\n",
+ "from pprint import pprint\n",
+ "import os\n",
+ "import getpass\n",
+ "\n",
+ "import warnings\n",
+ "\n",
+ "warnings.filterwarnings(\"ignore\")\n",
+ "\n",
+ "UPSTAGE_API_KEY = getpass.getpass(\"Enter your API Key\")\n",
+ "_ = os.environ.setdefault(\"UPSTAGE_API_KEY\", UPSTAGE_API_KEY)\n",
+ "\n",
+ "LANGCHAIN_API_KEY = getpass.getpass(\"Enter your API Key\")\n",
+ "_ = os.environ.setdefault(\"LANGCHAIN_API_KEY\", LANGCHAIN_API_KEY)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "8c119b2c-1d07-41a0-95fe-6839754d663f",
+ "metadata": {
+ "id": "8c119b2c-1d07-41a0-95fe-6839754d663f"
+ },
+ "outputs": [],
+ "source": [
+ "# @title set API key\n",
+ "from pprint import pprint\n",
+ "import os\n",
+ "\n",
+ "import warnings\n",
+ "\n",
+ "warnings.filterwarnings(\"ignore\")\n",
+ "\n",
+ "from IPython import get_ipython\n",
+ "\n",
+ "upstage_api_key_env_name = \"UPSTAGE_API_KEY\"\n",
+ "langchain_api_key_env_name = \"LANGCHAIN_API_KEY\"\n",
+ "\n",
+ "\n",
+ "def load_env():\n",
+ " if \"google.colab\" in str(get_ipython()):\n",
+ " # Running in Google Colab\n",
+ " from google.colab import userdata\n",
+ "\n",
+ " upstage_api_key = userdata.get(upstage_api_key_env_name)\n",
+ " langchain_api_key = userdata.get(langchain_api_key_env_name)\n",
+ " return os.environ.setdefault(\n",
+ " \"UPSTAGE_API_KEY\", upstage_api_key\n",
+ " ), os.environ.setdefault(\"LANGCHAIN_API_KEY\", langchain_api_key)\n",
+ " else:\n",
+ " # Running in local Jupyter Notebook\n",
+ " from dotenv import load_dotenv\n",
+ "\n",
+ " load_dotenv()\n",
+ " return os.environ.get(upstage_api_key_env_name), os.environ.get(\n",
+ " langchain_api_key_env_name\n",
+ " )\n",
+ "\n",
+ "\n",
+ "UPSTAGE_API_KEY, LANGCHAIN_API_KEY = load_env()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "2f3b176b",
+ "metadata": {
+ "id": "2f3b176b"
+ },
+ "source": [
+ "## Retriever\n",
+ "\n",
+ "### Prepare a file\n",
+ "\n",
+ "This example will be using `docs/Upstage_Solar_DUS.pdf`. You can optionally add more files to the `docs` directory."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "a91517f9",
+ "metadata": {
+ "id": "a91517f9"
+ },
+ "source": [
+ "### Layout analysis\n",
+ "\n",
+ "Prepare a function to use the Upstage [UpstageDocumentParseLoader](https://python.langchain.com/docs/integrations/document_loaders/upstage/) for document processing."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "id": "083493e5",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "083493e5",
+ "outputId": "40d87918-1d34-4675-b102-260e8582e587"
+ },
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "number of documents: 188\n",
+ "page_content='
B.2 Mixture of Experts
\")" + ] + }, + "metadata": {}, + "execution_count": 44 + } + ] + }, + { + "cell_type": "markdown", + "id": "c27bebdc-be71-4130-ab9d-42f09f87658b", + "metadata": { + "id": "c27bebdc-be71-4130-ab9d-42f09f87658b" + }, + "source": [ + "### Indexing\n", + "\n", + "Let's index the file." + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "id": "565a6d44-2c9f-4fff-b1ec-eea05df9350d", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "565a6d44-2c9f-4fff-b1ec-eea05df9350d", + "outputId": "e4902b10-f432-4e34-feec-da6fe4b9050a" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "['b0b69a07-b679-42fc-9b80-dc5ae2474c37',\n", + " '1e16829b-9890-4041-b20e-38cbdebbdd01',\n", + " '1b37e95e-cfc7-4f12-bd8e-3762e7593c0d',\n", + " 'a5966b7c-c1a9-404a-b311-6e78b5a5adc8',\n", + " '6d58fe64-30f5-4c7c-bd0b-321d6daceae1',\n", + " 'c68a10f6-76cd-4045-a7c6-5ac02a772ab6',\n", + " '7039ef7f-ab52-4882-b556-f626f9b33521',\n", + " '6bbb762a-5ee7-463e-bda1-b1fecfa48e4c',\n", + " '0a3bb34a-7df4-4964-9577-7032c40f4eb6',\n", + " 'e98ffe2e-0e6f-468e-8cd8-adcb80ad24d8',\n", + " 'bca8e6f3-d37e-4189-a116-ab8c222037ff',\n", + " '62857ac3-2d25-41c8-b152-891810a43d32',\n", + " '3bcdfb66-ea08-4f26-83c0-5a5abf828174',\n", + " '86200454-09c3-46cd-81fa-883a13498304',\n", + " 'a9380c3b-e38d-4811-bd6b-2f38cd008b5e',\n", + " '2ac750a7-98c3-4725-a91c-a2b315d25369',\n", + " 'd987bce0-80c5-409a-8c13-6ca6c187101d',\n", + " '082047bb-aa85-40f6-8c69-4fa187f1ac3c',\n", + " '33449e67-4357-40a8-b2e2-98bf3dac43e8',\n", + " '3c030f5a-f56e-4301-ad23-9aaa9c8242db',\n", + " 'b1915d55-438e-4183-ae7d-b6915c3a6ada',\n", + " '65687031-672e-40ea-b5fa-fac72b51f345',\n", + " '1a23061a-cb4a-4f01-b201-1f15633baf48',\n", + " 'f46114eb-0a96-4ae9-b891-a96ca89a729f',\n", + " '0eb49e55-3360-4a3f-8992-11d8ed1685f5',\n", + " 'edf65d03-0c2e-455d-991c-5bfb06e9a426',\n", + " 'fe6fa6a7-f335-4c45-bdb1-6490a141159f',\n", + " '6c45679d-74fc-4fa8-ac08-f69fd8e2f5f7',\n", + " 'adaf5559-30c3-481b-9b76-32d70438947c',\n", + " '2580d76d-258a-407d-b023-8d39fc3792bc',\n", + " '1065602f-f373-4700-80e7-9fa2d0799447',\n", + " '495d2207-3d9d-47cb-a36f-a83e0d3f1f00',\n", + " 'c1678f84-567d-4936-8e0d-df5b9fa0f4af',\n", + " '8698c6d5-0b9c-41f4-b1bc-bca756097fd6',\n", + " '9fc70ec5-5dc7-445a-acee-dcbe22ae9b58',\n", + " '5ceefeea-1085-4ab1-957e-d048bed04469',\n", + " 'f527dafe-675d-46dc-82fb-92ff6faa1510',\n", + " '0e1cf51e-235d-4004-824b-ac5e8d271295',\n", + " 'f9a6eb1a-4fa0-491f-8320-afd87556f567',\n", + " 'fa2b3e52-fa85-408b-8115-deb3d92b9385',\n", + " 'df5724b8-6c27-4452-bb15-b4b614ebb3c3',\n", + " '532f2042-1586-4fcb-833d-01d262b9694c',\n", + " 'e90e87da-2e02-47f3-862b-a4113cbe2c0a',\n", + " '89c16613-08c4-4c71-a2cd-de0f19f06d21',\n", + " '68ad2959-4c81-48bc-8de3-34b3bb2ef042',\n", + " 'ad4e6ebc-09cd-4494-86d5-7c902f4cc0d1',\n", + " '19907a85-e99c-4fc3-bf3e-0b056d6284ff',\n", + " '62812013-405b-4e61-b34c-209f5a94a8a3',\n", + " '79998fee-3241-4332-b05e-e5c82e4615b0',\n", + " '7e79e94a-d8a7-42a0-ad17-8e3a3191bdaf',\n", + " 'b9aa27bc-53e1-4b8b-8d29-e5ba7f9bd4d7',\n", + " 'f23f2fb5-baaf-4d6b-b77d-f9881d021669',\n", + " '7fb79851-3b0b-4c41-a5d9-b9df24d16a20',\n", + " '62dd3c40-d64c-4688-ad7f-e5071de87f36',\n", + " '1fb6bd03-590f-474a-9d82-d15f21c17034',\n", + " '7e4e36a3-1077-4262-b0a1-34721056f4d4',\n", + " '450ed9a7-7beb-4836-a161-67bde70f52ac',\n", + " 'e476ea7e-ecf2-4fdc-bb10-05737e29cf04',\n", + " 'f5ff0057-3d73-4929-98ed-750a4ef2889c',\n", + " 'e5c179de-4d84-42c1-ae20-c51b9b32559b',\n", + " '098aa268-0591-404a-86d3-e5f3b4955cfe',\n", + " '063f337e-185f-40c1-bbb9-166c890a4e99',\n", + " 'ace3b737-65e1-4818-9c1b-fdd5418011d6',\n", + " '6234b8b7-5f44-489f-9e91-3883280f171d',\n", + " '5d2ee12d-8c04-4fa8-adf3-49cae07b3905',\n", + " 'e35b148a-3ecc-47e0-b4e8-78c03d35cec7',\n", + " 'c7cadbe0-1946-4a7e-a960-83976717dd0f',\n", + " 'eb8b44f0-6bb2-475a-b0a0-7f4a7c6f0070',\n", + " 'b748b20b-6b9e-4b69-b71e-2adc02a7491f',\n", + " '50c1f858-b892-4ffa-8d25-76a03d3211e6',\n", + " '042b1336-3f9e-4de4-bb39-81a4d6fa62f5',\n", + " '8cfaea45-17d8-4ae8-82e2-b01d7d3639be',\n", + " 'b955f4e1-d7ef-4d55-98b5-00dd5184dc42',\n", + " 'b48b03f4-12e0-49f3-ade6-11ff411e4de3',\n", + " 'd9fab8c9-4d30-4d4e-8047-3c65f8ca988c',\n", + " '495f132c-04f2-4bf4-bfe8-f63cd9038308',\n", + " '0e14faf8-7670-4cc6-a7ac-0d1243909e13',\n", + " 'f100f00c-39a0-42f2-8367-8c5c69c77ebd',\n", + " '8856d41a-af96-45ad-8734-5f1cdb66a564',\n", + " '7a6d1d22-0ca6-4eed-b8f6-e8b659f5bea1',\n", + " '2113282a-d856-4e73-89e7-62030ae68f91',\n", + " '6d682586-8611-4f49-82be-e06593404a33',\n", + " 'e3ee4be5-2b74-44b2-92a5-f3292b743982',\n", + " '05ff4931-976f-4c31-bccc-beb477020c51',\n", + " 'aec4953c-2138-4a87-8b3a-60f76904afe4',\n", + " '3c8e4294-a93d-4f4d-9ac3-ec31e7631262',\n", + " '6cef9aac-798d-48f9-a0d9-7e65a1600202',\n", + " 'd4185443-2b01-4442-8c47-79c44a108c61',\n", + " 'b456b694-e8df-4450-8e82-ee4fb3bd2083',\n", + " 'df2ebef6-0976-4704-ab31-fbf836527912',\n", + " 'be9afa4c-d12f-4410-922b-83f53c6e1f32',\n", + " '2079bc74-9e94-41b1-825d-7cd5c0acc9c3',\n", + " '290ffa2e-f86e-4cae-b3e0-6b7a78c04f78',\n", + " '25a4d26e-821f-4e34-bf95-a8e4f897fd30',\n", + " '6eb2d845-358a-41db-a798-9dce5b58cd06',\n", + " '48b30f5d-837a-4bec-a1c8-67d8820acb10',\n", + " 'f6c3153c-1b41-4e2f-b644-96b6099bbd7f',\n", + " 'b239ac5b-db22-4be9-88b4-01bf00ba452e',\n", + " 'a5213500-a4bf-4372-b59f-368c7e7a36a9',\n", + " 'acfb3929-40b3-48ed-853e-3c0273949c9a',\n", + " '8f6d6b8f-dfdd-4c48-9fa1-6f5748685023',\n", + " '872af1ec-f8ff-4c69-8d0e-9bb07f765e78',\n", + " 'cb5c158c-84ab-4fea-8516-f9a0e0e89bf4',\n", + " '39725127-8ca0-4a17-bd93-38c07713cedb',\n", + " 'b9b923c4-8709-4a6e-9f8e-272e0ce8c188',\n", + " 'ad9ae737-4e97-461f-8091-bb6715380f8d',\n", + " 'ad3b4a89-9f5e-4b71-8ab4-2f6e58ad2626',\n", + " '29ab4ef5-c8fd-4c4b-ac6d-033f650b4b9e',\n", + " '82232b1f-20ca-4956-89c4-cd8afcc8d79e',\n", + " 'c89f3088-1f51-47ac-a5b1-d119bf52af2a',\n", + " '41fa8aec-7eeb-4956-9212-7d6b702e79e1',\n", + " 'e24f15da-3e04-4f41-8685-e32c859d7134',\n", + " '5326ea12-f56d-4ef5-8d47-5fd12e64d434',\n", + " 'f4012606-36ad-4428-841a-936c44ecb782',\n", + " 'b80160cf-90e6-4da9-bd3f-06d956d67602',\n", + " 'fc315e67-1a3d-4a65-8909-cc08b6fd1b2d',\n", + " '595a1003-67f6-4e20-ad96-3eb3ca76ae95',\n", + " 'f6c30bdd-6d05-4f8b-9e7e-cc9d1a969835',\n", + " 'c9b341f8-624c-4193-ace2-4b6fd3ab10c9',\n", + " '2e4b8fac-cc5e-482b-b5bb-994453880fcb',\n", + " 'fcecee0f-3fc4-4ac3-811f-21325643ac29',\n", + " 'd5111989-2c8a-4897-9f1e-2d604d1d8b29',\n", + " 'ed8865d8-273c-44ae-a903-ec090740a952',\n", + " 'a57a38e4-383c-4f38-a847-751afd3cba97',\n", + " 'afd6c745-87c0-4fb7-a5f8-afc8406fc2e5',\n", + " '41747ec1-77de-4cac-ab48-61189574cfd1',\n", + " '96532beb-f722-477a-b41d-b8330d4ce062',\n", + " 'ef19044e-dc83-41c1-88ea-2936f54242f8',\n", + " 'd77381c8-f713-4627-874a-b4ccdba3141b',\n", + " '765d1b5f-879e-444c-84af-e51c139537fb',\n", + " '70b72d99-20c5-4bf8-a3e5-697e7351e943',\n", + " 'c38b9344-b40d-4a14-868b-1dc9fe274376',\n", + " '82cee1e0-d04c-40ba-bf06-76d157493ce2',\n", + " '8d42b48b-c545-4c58-8e02-590688d37aa5',\n", + " '974d0c5c-23c8-4d2b-8ea2-b127a88396f6',\n", + " '56a254f9-f47c-4108-9d32-1a814e4f48e4',\n", + " 'f693722e-bb2f-469e-a4a4-0f6d861c999a',\n", + " '414c8915-d680-4d91-b1a0-aa2181dcf40d',\n", + " '677e71f6-8bbb-4be4-9e33-601f7ac217f9',\n", + " '3deffa13-f781-4754-abb0-293be07fc217',\n", + " '17b1ad9d-7d20-43eb-8516-e5ee27cdc08c',\n", + " '8bf6a0ba-b71d-4b6e-a341-c81b561cbbd9',\n", + " '3c70257e-2804-4b65-b828-d37a0d62fe2e',\n", + " '784eaad9-f288-4a31-9d7e-381ec5386a59',\n", + " '422f377f-8f00-4f03-a65f-4db7384deddc',\n", + " 'fa53cfc0-a3e8-47e7-8eb8-b4abfff89831',\n", + " 'bb2c43cc-0127-4287-ba34-7a91b123616f',\n", + " 'eade1de1-94e1-4c12-9033-67fe67806501',\n", + " '9dde2c71-c329-4ad6-a011-6911c3e81e52',\n", + " '83fcd212-625b-4b5c-8821-ec9e5fdbf184',\n", + " 'b1551b3d-1564-422f-b9c2-eb8ae866bd46',\n", + " 'ef3ff7cf-03ab-4575-ad06-d0c854aa01c7',\n", + " '364897de-bb45-4826-88e2-06edf232d639',\n", + " 'adb27974-0aaa-4395-b63e-cdfa5ce4a826',\n", + " 'baac96d0-021f-4227-85c9-c00405cb402c',\n", + " '2cf9c218-4397-48be-8872-e5d2d78701ba',\n", + " '0b8333a3-511e-48cb-98a6-34869e70016d',\n", + " '66450e1c-257c-46ae-b053-84a007475357',\n", + " 'a35cb1ef-3ed1-4f0d-86d8-ff089028e296',\n", + " 'f9fd71cc-b4bd-4f6c-b436-953bbd382afc',\n", + " '37747596-2dd6-4b99-a9ac-6426ca040424',\n", + " '6bd52899-027e-416a-a3c9-1f732f79bc30',\n", + " '486ae60f-5046-4732-8da6-a98985788339',\n", + " 'b66db9f5-eed1-48a2-a0f9-099250811339',\n", + " '3f020fa8-8e6e-401a-8eb7-b403dc4b9f7b',\n", + " '79415279-81e3-4b4e-b7c3-12cd44d250c5',\n", + " '18632ceb-6351-459c-b2e0-966c67d982b8',\n", + " '50ef59c2-025c-434f-b445-d59ac14caf9c',\n", + " 'b1287b18-0bfc-4193-bbe4-93417f0a0d82',\n", + " 'd6693806-f001-487b-8ef1-896d2bbac2d5',\n", + " '0e5f434b-5b30-4fda-9469-d30af17a892c',\n", + " '680624fa-a0c6-45bf-9cbb-797fcd207dd8',\n", + " '6ec12fc1-0687-4f8a-8606-61cdea4a378e',\n", + " 'ec475c0d-03df-493b-a14f-727e382e92da',\n", + " '79ddf21f-6b77-4ef0-99ef-cbb719951adc',\n", + " '7f80c004-e880-4f1a-a99c-d308d4c160ec',\n", + " 'c2e69736-c7e6-449e-8694-2f986eb53236',\n", + " '96026b5e-7196-4f3a-85ca-46992e3feeb4',\n", + " '757198c5-9c14-465d-a337-fac8841d35eb',\n", + " 'b883b009-85fc-4a20-80c7-3f868f19888b',\n", + " '297a92f9-5f69-4836-a69c-e4b2b764cb0d',\n", + " 'd1ea0bcf-f61e-43fc-bd28-6fbd3cae8666',\n", + " '6522dd57-de14-41d5-b567-06771fca6778',\n", + " '6bf03423-c6ff-45e5-8875-eeca1df1833e',\n", + " '88a8fda5-e30e-4d0f-817f-3226ead0f51f',\n", + " 'ead411c5-66d1-47a4-9e19-24e8d99d9c08',\n", + " '636f27d0-2db7-454d-bdf1-03104033f936',\n", + " '24ef54a9-7cb3-4d8b-b7b9-4f8a7189d0ac',\n", + " 'ada3b09f-4fb2-4c94-b6b1-2b9ddc4f34f2',\n", + " '88c7037a-365f-4929-b0e3-f24a56a8c9ab',\n", + " '9af63788-0dd0-4639-a854-0b97797c8ae5',\n", + " 'a9e2578f-c95d-42a1-9bae-94516a126177',\n", + " 'a3ffbae7-847b-435e-abe2-ff33b036443f',\n", + " '5a3627bf-3ae3-477d-8bb8-ddc84200e054',\n", + " '425f0456-b9f4-4ee8-8b8d-27a63bec9535',\n", + " 'd2c76c15-1a13-48ab-9562-9b2ad834dbd6']" + ] + }, + "metadata": {}, + "execution_count": 45 + } + ], + "source": [ + "from langchain_chroma import Chroma\n", + "from langchain_upstage import ChatUpstage, UpstageEmbeddings\n", + "from langchain_core.vectorstores import VectorStore\n", + "\n", + "#Converts complex metadata values into JSON strings\n", + "def convert_complex_metadata(metadata):\n", + " for key, value in metadata.items():\n", + " if isinstance(value, list):\n", + " metadata[key] = str(value)\n", + " return metadata\n", + "\n", + "# Process complex metadata in the list of documents\n", + "for doc in docs:\n", + " doc.metadata = convert_complex_metadata(doc.metadata)\n", + "\n", + "\n", + "db: VectorStore = Chroma(\n", + " embedding_function=UpstageEmbeddings(model=\"solar-embedding-1-large\")\n", + ")\n", + "\n", + "\n", + "retriever = db.as_retriever()\n", + "\n", + "db.add_documents(docs)" + ] + }, + { + "cell_type": "markdown", + "id": "4515a2fa", + "metadata": { + "id": "4515a2fa" + }, + "source": [ + "## Graph State\n", + "Let's first define the LangGraph state." + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "id": "0cd0f18d", + "metadata": { + "id": "0cd0f18d" + }, + "outputs": [], + "source": [ + "from typing import TypedDict\n", + "\n", + "\n", + "class RagState(TypedDict):\n", + " \"\"\"\n", + " Represents the state of our graph.\n", + "\n", + " Attributes:\n", + " context: retrieved context\n", + " question: question asked by the user\n", + " answer: generated answer to the question\n", + " groundedness: groundedness of the assistant's response\n", + " \"\"\"\n", + "\n", + " context: str\n", + " question: str\n", + " answer: str\n", + " groundedness: str" + ] + }, + { + "cell_type": "markdown", + "id": "29c12f74-53e2-43cc-896f-875d1c5d9d93", + "metadata": { + "id": "29c12f74-53e2-43cc-896f-875d1c5d9d93" + }, + "source": [ + "## RAG\n", + "\n", + "Let's prepare RAG pipeline. It uses the Upstage [Solar chat model](https://python.langchain.com/docs/integrations/chat/upstage/)." + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "id": "1fafad21-60cc-483e-92a3-6a7edb1838e3", + "metadata": { + "id": "1fafad21-60cc-483e-92a3-6a7edb1838e3" + }, + "outputs": [], + "source": [ + "from langchain_core.output_parsers import StrOutputParser\n", + "from langchain.prompts import ChatPromptTemplate\n", + "\n", + "\n", + "template = \"\"\"Answer the question based only on the given context.\n", + "{context}\n", + "\n", + "Question: {question}\n", + "\"\"\"\n", + "\n", + "prompt = ChatPromptTemplate.from_template(template)\n", + "model = ChatUpstage(model=\"solar-pro\")\n", + "\n", + "# Solar model answer generation, given the context and question\n", + "model_chain = prompt | model | StrOutputParser()\n", + "\n", + "\n", + "def format_documents(docs: List[Document]) -> str:\n", + " return \"\\n\".join([doc.page_content for doc in docs])\n", + "\n", + "\n", + "def retrieve(state: RagState) -> RagState:\n", + " docs = retriever.invoke(state[\"question\"])\n", + " context = format_documents(docs)\n", + " return RagState(context=context)\n", + "\n", + "\n", + "def model_answer(state: RagState) -> RagState:\n", + " response = model_chain.invoke(state)\n", + " return RagState(answer=response)" + ] + }, + { + "cell_type": "markdown", + "id": "5a15cc11", + "metadata": { + "id": "5a15cc11" + }, + "source": [ + "Now, let's prepare a logic for using Upstage [Groundedness Check](https://python.langchain.com/docs/integrations/tools/upstage_groundedness_check/)." + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "id": "41bd25eb", + "metadata": { + "id": "41bd25eb" + }, + "outputs": [], + "source": [ + "from langchain_upstage import GroundednessCheck\n", + "\n", + "gc = GroundednessCheck()\n", + "\n", + "\n", + "def groundedness_check(state: RagState) -> RagState:\n", + " response = gc.run({\"context\": state[\"context\"], \"answer\": state[\"answer\"]})\n", + " return RagState(groundedness=response)\n", + "\n", + "\n", + "def groundedness_condition(state: RagState) -> RagState:\n", + " return state[\"groundedness\"]" + ] + }, + { + "cell_type": "markdown", + "id": "61cd5797-1782-4d78-a277-8196d13f3e1b", + "metadata": { + "id": "61cd5797-1782-4d78-a277-8196d13f3e1b" + }, + "source": [ + "## Build Graph\n", + "\n", + "Finally, let's put everything together and build the graph! The graph looks like the following.\n", + "\n", + "" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "id": "0e09ca9f-e36d-4ef4-a0d5-79fdbada9fe0", + "metadata": { + "id": "0e09ca9f-e36d-4ef4-a0d5-79fdbada9fe0" + }, + "outputs": [], + "source": [ + "from langgraph.graph import END, StateGraph\n", + "\n", + "workflow = StateGraph(RagState)\n", + "workflow.add_node(\"retrieve\", retrieve)\n", + "workflow.add_node(\"model\", model_answer)\n", + "workflow.add_node(\"groundedness_check\", groundedness_check)\n", + "\n", + "workflow.add_edge(\"retrieve\", \"model\")\n", + "workflow.add_edge(\"model\", \"groundedness_check\")\n", + "workflow.add_conditional_edges(\n", + " \"groundedness_check\",\n", + " groundedness_condition,\n", + " {\n", + " \"grounded\": END,\n", + " \"notGrounded\": \"model\",\n", + " \"notSure\": \"model\",\n", + " },\n", + ")\n", + "workflow.set_entry_point(\"retrieve\")\n", + "\n", + "app = workflow.compile()" + ] + }, + { + "cell_type": "markdown", + "id": "86b7c942", + "metadata": { + "id": "86b7c942" + }, + "source": [ + "## Running the graph\n", + "\n", + "Let's now test the graph." + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "id": "fb69dbb9-91ee-4868-8c3c-93af3cd885be", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "fb69dbb9-91ee-4868-8c3c-93af3cd885be", + "outputId": "7c0ec050-6097-49fc-e389-ff29444b7928" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Node 'retrieve':{'context': \"Additionally, we ensure that SOLAR complies
with general ethical considerations in all aspects
of its operation. This includes adherence to pri-
vacy norms, respect for intellectual property, and
ensuring the absence of bias in our algorithms. Our
commitment to these ethical principles is unwaver-
ing, and we believe it significantly contributes to
the credibility and societal acceptance of SOLAR.
Additionally, we ensure that SOLAR complies
with general ethical considerations in all aspects
of its operation. This includes adherence to pri-
vacy norms, respect for intellectual property, and
ensuring the absence of bias in our algorithms. Our
commitment to these ethical principles is unwaver-
ing, and we believe it significantly contributes to
the credibility and societal acceptance of SOLAR.
Additionally, we ensure that SOLAR complies
with general ethical considerations in all aspects
of its operation. This includes adherence to pri-
vacy norms, respect for intellectual property, and
ensuring the absence of bias in our algorithms. Our
commitment to these ethical principles is unwaver-
ing, and we believe it significantly contributes to
the credibility and societal acceptance of SOLAR.
In conclusion, the ethical framework within
which SOLAR operates is robust and comprehen-
sive, ensuring that our advancements in this field
are not only scientifically sound but also ethically
responsible.