{ "cells": [ { "cell_type": "markdown", "metadata": { "jp-MarkdownHeadingCollapsed": true, "tags": [] }, "source": [ "# 사용자 데이타에 기반한 RAG(Retrieval-Augmented Generation) 를 사용하여 Question Answering\n", "- 원본 코드\n", " - https://github.com/aws/amazon-sagemaker-examples/blob/main/introduction_to_amazon_algorithms/jumpstart-foundation-models/question_answering_retrieval_augmented_generation/question_answering_langchain_jumpstart.ipynb" ] }, { "cell_type": "markdown", "metadata": { "tags": [] }, "source": [ "# 1. 기본 환경 설정" ] }, { "cell_type": "code", "execution_count": 92, "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The autoreload extension is already loaded. To reload it, use:\n", " %reload_ext autoreload\n" ] } ], "source": [ "%load_ext autoreload\n", "%autoreload 2\n", "\n", "# src 폴더 경로 설정\n", "import sys\n", "sys.path.append('../common_code')" ] }, { "cell_type": "code", "execution_count": 93, "metadata": { "tags": [] }, "outputs": [], "source": [ "import time\n", "import sagemaker, boto3, json\n", "from sagemaker.session import Session\n", "from sagemaker.model import Model\n", "from sagemaker import image_uris, model_uris, script_uris, hyperparameters\n", "from sagemaker.predictor import Predictor\n", "from sagemaker.utils import name_from_base\n", "\n", "\n", "sagemaker_session = Session()\n", "aws_role = sagemaker_session.get_caller_identity_arn()\n", "aws_region = boto3.Session().region_name\n", "sess = sagemaker.Session()\n", "model_version = \"*\"" ] }, { "cell_type": "code", "execution_count": 94, "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "embedding_model_endpoint_name: \n", " KoSimCSE-roberta-2023-06-04-11-24-26\n" ] } ], "source": [ "%store -r embedding_model_endpoint_name\n", "\n", "print(\"embedding_model_endpoint_name: \\n\", embedding_model_endpoint_name)\n" ] }, { "cell_type": "markdown", "metadata": { "tags": [] }, "source": [ "## 모델 정보 입력\n", "- SageMaker 엔드포인트 ARN 입력 등" ] }, { "cell_type": "code", "execution_count": 95, "metadata": { "tags": [] }, "outputs": [], "source": [ "_MODEL_CONFIG_ = {\n", " \"Kullm-polyglot-12-8b-v2\": {\n", " \"instance type\": \"ml.g5.12xlarge\",\n", " \"endpoint_name\" : \"Kullm-polyglot-12-8b-v2-2023-06-04-11-27-22\",\n", " \"env\": {\"TS_DEFAULT_WORKERS_PER_MODEL\": \"1\"},\n", " \"parse_function\": \"parse_response_model_KoAlpaca\",\n", " \"prompt\": \"\"\"Answer based on context:\\n\\n{context}\\n\\n{question}\"\"\",\n", " }, \n", " \"KoAlpaca-12-8B\": {\n", " \"instance type\": \"ml.g5.12xlarge\",\n", " \"endpoint_name\" : \"KoAlpaca-12-8B-2023-06-04-11-40-34\",\n", " \"env\": {\"TS_DEFAULT_WORKERS_PER_MODEL\": \"1\"},\n", " \"parse_function\": \"parse_response_model_KoAlpaca\",\n", " \"prompt\": \"\"\"Answer based on context:\\n\\n{context}\\n\\n{question}\"\"\",\n", " },\n", " \"KoSimCSE-roberta\": {\n", " \"instance type\": \"ml.g5.12xlarge\",\n", " \"endpoint_name\" : \"KoSimCSE-roberta-2023-06-04-11-24-26\", \n", " \"env\": {\"TS_DEFAULT_WORKERS_PER_MODEL\": \"1\"},\n", " },\n", "}\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 2. LLM 에 Context 없이 추론 테스트" ] }, { "cell_type": "code", "execution_count": 96, "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "prompt_wo_c: \n", " ### question: 아마존 매장에서 상품을 판매하려면 어떻게 해야 하나요?\n", "\n", "### answer:\n" ] } ], "source": [ "question = \"아마존 매장에서 상품을 판매하려면 어떻게 해야 하나요?\"\n", "# question = \"아마존 매장에서 상품을 판매하려면 어떻게 해야 하나요?\"\n", "c = None\n", "# prompt_wo_c = f\"### 질문: {q}\\n\\n### 맥락: {c}\\n\\n### 답변:\" if c else f\"### 질문: {q}\\n\\n### 답변:\" \n", "prompt_wo_c = f\"### question: {question}\\n\\n### context: {c}\\n\\n### answer:\" if c else f\"### question: {question}\\n\\n### answer:\" \n", "print(\"prompt_wo_c: \\n\", prompt_wo_c)\n", "\n", "params = {\n", " \"do_sample\":False, \n", " \"max_new_tokens\":128,\n", " \"temperature\":1.0,\n", " \"top_k\":0,\n", " \"top_p\":0.9,\n", " \"return_full_text\":False,\n", " \"repetition_penalty\":1.1,\n", " \"presence_penalty\":None,\n", " \"eos_token_id\":2,\n", "}\n", "\n", "data = {\n", " \"prompt\": [prompt_wo_c],\n", " \"params\": params\n", "}\n" ] }, { "cell_type": "code", "execution_count": 97, "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "endpoint_name: Kullm-polyglot-12-8b-v2-2023-06-04-11-27-22\n", "[\n", " [\n", " {\n", " \"generated_text\":\" Amazon Store에서 제품을 판매하기 위해서는 다음과 같은 단계를 거쳐야 합니다. 1. 아마존 스토어 계정을 생성합니다. 2. 아마존 스토어에 제품을 추가합니다. 3. 제품의 가격 및 기타 정보를 설정합니다. 4. 아마존 스토어에서 제품을 홍보하고 고객이 구매할 수 있도록 유도합니다. 5. 주문이 완료되면 고객에게 배송합니다. 6. 아마존 스토어에서 제품을 추적하고 재고를 관리합니다. 7. 아마존 스토어에서 제품을 업데이트하여 새로운 제품을 소개합니다. 8. 아마존 스토어에서 제품을 삭제하여 재고를 정리합니다\"\n", " }\n", " ]\n", "]\n", " Amazon Store에서 제품을 판매하기 위해서는 다음과 같은 단계를 거쳐야 합니다. 1. 아마존 스토어 계정을 생성합니다. 2. 아마존 스토어에 제품을 추가합니다. 3. 제품의 가격 및 기타 정보를 설정합니다. 4. 아마존 스토어에서 제품을 홍보하고 고객이 구매할 수 있도록 유도합니다. 5. 주문이 완료되면 고객에게 배송합니다. 6. 아마존 스토어에서 제품을 추적하고 재고를 관리합니다. 7. 아마존 스토어에서 제품을 업데이트하여 새로운 제품을 소개합니다. 8. 아마존 스토어에서 제품을 삭제하여 재고를 정리합니다\n" ] } ], "source": [ "\n", "from inference_lib import invoke_inference, invoke_inference_DJ\n", "from inference_lib import parse_response_json_model\n", "\n", "# model_id = \"KoAlpaca-12-8B\"\n", "model_id = \"Kullm-polyglot-12-8b-v2\"\n", "\n", "endpoint_name = _MODEL_CONFIG_[model_id][\"endpoint_name\"]\n", "\n", "print(\"endpoint_name: \", endpoint_name)\n", "\n", "query_response = invoke_inference_DJ(\n", " endpoint_name=endpoint_name, prompt=data\n", ")\n", "\n", "\n", "\n", "query_response = parse_response_json_model(query_response)\n", "print(query_response)" ] }, { "cell_type": "markdown", "metadata": { "tags": [] }, "source": [ "# 3. 데이터 준비" ] }, { "cell_type": "code", "execution_count": 98, "metadata": { "tags": [] }, "outputs": [], "source": [ "import glob\n", "import os\n", "import pandas as pd\n", "\n", "all_files = glob.glob(os.path.join(\"../Data/\", \"amazon_faq_ko.csv\"))\n", "\n", "df_knowledge = pd.concat(\n", " (pd.read_csv(f )for f in all_files),\n", " axis=0,\n", " ignore_index=True,\n", ")" ] }, { "cell_type": "code", "execution_count": 99, "metadata": { "tags": [] }, "outputs": [], "source": [ "df_knowledge.drop([\"Question\"], axis=1, inplace=True)\n", "df_knowledge.rename(columns={\"Answer\": \"Context\"}, inplace=True)" ] }, { "cell_type": "code", "execution_count": 100, "metadata": { "tags": [] }, "outputs": [], "source": [ "file_path = \"rag_data/amazon_faq_ko_processed_data.csv\"\n", "# df_knowledge.to_csv(file_path, header=False, index=False)\n", "df_knowledge.to_csv(file_path, header=True, index=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "참고\n", "- Lang Chain CSV Loader Code\n", " - https://github.com/hwchase17/langchain/blob/master/langchain/document_loaders/csv_loader.py" ] }, { "cell_type": "code", "execution_count": 101, "metadata": { "tags": [] }, "outputs": [ { "data": { "text/plain": [ "[Document(page_content='Context: 아마존에 등록하면 한 개 또는 수천 개의 아이템을 유연하게 판매할 수 있습니다. 필요에 따라 셀링 플랜을 선택하면 언제든지 플랜을 변경할 수 있습니다.셀러 센트럴을 사용하여 상품 리스팅을 생성하십시오.이 퀵 스타트 스타일 가이드에 따라 멋진 상품 상세 페이지를 만드세요. Amazon Ads 또는 기타 마케팅 채널을 통해 상품을 홍보하십시오.고객이 구매할 때 주문을 신속하게 처리합니다.', metadata={'source': 'rag_data/amazon_faq_ko_processed_data.csv', 'row': 0}),\n", " Document(page_content='Context: 가능성은 사실상 무한합니다.판매할 수 있는 품목은 상품, 상품 카테고리 및 브랜드에 따라 다릅니다.모든 셀러가 이용할 수 있는 카테고리도 있고, 프로페셔널 셀러 계정이 필요한 카테고리도 있고, 판매 승인이 필요한 카테고리도 있고, 타사 셀러가 판매할 수 없는 상품을 포함하는 카테고리도 있습니다.', metadata={'source': 'rag_data/amazon_faq_ko_processed_data.csv', 'row': 1}),\n", " Document(page_content='Context: “일부 상품은 법률 또는 규제 제한 (예: 처방약) 또는 아마존 정책 (예: 범죄 현장 사진) 을 준수하는 것으로 리스팅되지 않을 수 있습니다.자세한 내용은 셀러 센트럴 도움말을 방문하여 제한 사항 및 특정 카테고리의 신상품에 대한 승인을 요청하는 방법에 대해 자세히 알아보십시오. Fulfillment by Amazon (아마존 주문처리 서비스) 을 통해 주문을 배송하려는 경우 FBA 상품 제한 목록을 검토하십시오.”', metadata={'source': 'rag_data/amazon_faq_ko_processed_data.csv', 'row': 2})]" ] }, "execution_count": 101, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from langchain.document_loaders.csv_loader import CSVLoader\n", "\n", "loader = CSVLoader(file_path , encoding=\"utf-8\")\n", "documents = loader.load()\n", "documents[0:3]\n" ] }, { "cell_type": "markdown", "metadata": { "tags": [] }, "source": [ "# 4 SageMaker Endpoint Wrapper 준비" ] }, { "cell_type": "markdown", "metadata": { "tags": [] }, "source": [ "## SageMaker LLM Wrapper" ] }, { "cell_type": "code", "execution_count": 102, "metadata": { "tags": [] }, "outputs": [], "source": [ "from langchain.llms.sagemaker_endpoint import SagemakerEndpoint" ] }, { "cell_type": "code", "execution_count": 103, "metadata": { "tags": [] }, "outputs": [], "source": [ "from inference_lib import KoAlpacaContentHandler\n", "_KoAlpacaContentHandler = KoAlpacaContentHandler()" ] }, { "cell_type": "code", "execution_count": 104, "metadata": { "tags": [] }, "outputs": [], "source": [ "parameters = {}\n", "\n", "sm_llm = SagemakerEndpoint(\n", " endpoint_name=_MODEL_CONFIG_[\"KoAlpaca-12-8B\"][\"endpoint_name\"],\n", " region_name=aws_region,\n", " model_kwargs=parameters,\n", " content_handler=_KoAlpacaContentHandler,\n", ")" ] }, { "cell_type": "markdown", "metadata": { "tags": [] }, "source": [ "## SageMaker Embedding Model Wrapper" ] }, { "cell_type": "code", "execution_count": 105, "metadata": { "tags": [] }, "outputs": [], "source": [ "from inference_lib import SagemakerEndpointEmbeddingsJumpStart\n", "from inference_lib import KoSimCSERobertaContentHandler" ] }, { "cell_type": "code", "execution_count": 106, "metadata": { "tags": [] }, "outputs": [], "source": [ "\n", "_KoSimCSERobertaContentHandler = KoSimCSERobertaContentHandler()\n", "\n", "# content_handler = ContentHandler()\n", "\n", "embeddings = SagemakerEndpointEmbeddingsJumpStart(\n", " endpoint_name=_MODEL_CONFIG_[\"KoSimCSE-roberta\"][\"endpoint_name\"],\n", " region_name=aws_region,\n", " content_handler=_KoSimCSERobertaContentHandler,\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 5. Vector Store 생성\n", "- FAISS Vector Store 생성" ] }, { "cell_type": "code", "execution_count": 107, "metadata": { "tags": [] }, "outputs": [], "source": [ "from langchain.chains import RetrievalQA\n", "from langchain.llms import OpenAI\n", "from langchain.document_loaders import TextLoader\n", "from langchain.indexes import VectorstoreIndexCreator\n", "from langchain.vectorstores import Chroma, AtlasDB, FAISS\n", "from langchain.text_splitter import CharacterTextSplitter\n", "from langchain import PromptTemplate\n", "from langchain.chains.question_answering import load_qa_chain\n" ] }, { "cell_type": "code", "execution_count": 108, "metadata": { "tags": [] }, "outputs": [], "source": [ "index_creator = VectorstoreIndexCreator(\n", " vectorstore_cls=FAISS,\n", " embedding=embeddings,\n", " text_splitter=CharacterTextSplitter(chunk_size=300, chunk_overlap=0),\n", "\n", ")" ] }, { "cell_type": "code", "execution_count": 109, "metadata": { "tags": [] }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/root/aws-ai-ml-workshop-kr/sagemaker/generative-ai/1-Chatbot/2-Lab02-RAG-LLM/../common_code/inference_lib.py:162: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray.\n", " ndim = np.array(response_json).ndim\n" ] } ], "source": [ "index = index_creator.from_loaders([loader])" ] }, { "cell_type": "code", "execution_count": 110, "metadata": { "tags": [] }, "outputs": [ { "data": { "text/plain": [ "{0: 'ef2f93cc-57a0-47f3-9a6d-1ac44b609840',\n", " 1: '67045237-8c73-41e7-9af7-8777a898033d',\n", " 2: '6bd8e696-9730-4c0b-8107-553195e0fa4f',\n", " 3: '2bf0d9eb-e1aa-47b0-aa11-bf9baafaf517',\n", " 4: '3829199b-0518-4509-8730-4d6dd98146a7',\n", " 5: '4d30e90e-7552-401c-9ec9-a0bdf3e23dcf',\n", " 6: '5dbf3453-3260-48ee-afba-c1c03d682cb0',\n", " 7: '6c22ed52-c900-40b6-864b-5d82c458964b',\n", " 8: '77396e9d-f147-4631-a232-19be92fbd5bb',\n", " 9: 'f4567586-d810-44b0-b832-bd8f92c34f1e',\n", " 10: 'dff86f80-28dc-42a0-99e9-158cf9c246a8',\n", " 11: '8cf61b5b-d146-4f47-b0f5-5278c6aca0a3'}" ] }, "execution_count": 110, "metadata": {}, "output_type": "execute_result" } ], "source": [ "index.vectorstore.index_to_docstore_id" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 6. 다른 프롬프트로 QA 애플리케이션 테스트" ] }, { "cell_type": "code", "execution_count": 111, "metadata": {}, "outputs": [], "source": [ "docsearch = FAISS.from_documents(documents, embeddings)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 첫번째 질문" ] }, { "cell_type": "code", "execution_count": 112, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "question1: \n", " 아마존 매장에서 상품을 판매하려면 어떻게 해야 하나요?\n" ] } ], "source": [ "question1 = question\n", "print(\"question1: \\n\" , question1)" ] }, { "cell_type": "markdown", "metadata": { "tags": [] }, "source": [ "Send the top 3 most relevant docuemnts and question into LLM to get a answer." ] }, { "cell_type": "code", "execution_count": 113, "metadata": { "tags": [] }, "outputs": [ { "data": { "text/plain": [ "[(Document(page_content='Context: 아마존 매장에서 매출을 늘리는 방법에는 여러 가지가 있습니다.Fulfillment by Amazon (아마존 주문처리 서비스) 을 통해 고객에게 프라임 배송을 제공하여 프라임 회원에게 어필하십시오.또한 다음과 같은 작업을 수행할 수 있습니다.\\r\\n프로모션, 쿠폰 또는 라이트닝 딜을 제공하여 광고 판도를 높이세요.\\r\\n브랜드 소유자로 등록하고 아마존 스토어를 사용하여 자신만의 브랜드 경험을 구축하십시오.\\r\\nA+ 콘텐츠를 만들어 판매를 촉진하세요.\\r\\n브랜드를 팔로우하는 고객에게 직접 마케팅하기 위한 고객 참여를 관리하세요.\\r\\n마케팅 전략 및 팁은 전자상거래 마케팅 가이드를 참조하십시오.', metadata={'source': 'rag_data/amazon_faq_ko_processed_data.csv', 'row': 11}),\n", " 130.74762),\n", " (Document(page_content='Context: 아마존 셀러로 시작하려면 먼저 셀링 플랜을 선택하고 아마존 셀링 계정을 설정하십시오.등록을 완료하려면 은행 계좌 번호 및 은행 라우팅 번호, 청구 가능한 신용 카드, 정부 발행 국가 ID, 세금 정보 및 전화번호에 액세스할 수 있는지 확인하십시오.', metadata={'source': 'rag_data/amazon_faq_ko_processed_data.csv', 'row': 5}),\n", " 150.07126),\n", " (Document(page_content='Context: 아마존에 등록하면 한 개 또는 수천 개의 아이템을 유연하게 판매할 수 있습니다. 필요에 따라 셀링 플랜을 선택하면 언제든지 플랜을 변경할 수 있습니다.셀러 센트럴을 사용하여 상품 리스팅을 생성하십시오.이 퀵 스타트 스타일 가이드에 따라 멋진 상품 상세 페이지를 만드세요. Amazon Ads 또는 기타 마케팅 채널을 통해 상품을 홍보하십시오.고객이 구매할 때 주문을 신속하게 처리합니다.', metadata={'source': 'rag_data/amazon_faq_ko_processed_data.csv', 'row': 0}),\n", " 153.79514)]" ] }, "execution_count": 113, "metadata": {}, "output_type": "execute_result" } ], "source": [ "docs = docsearch.similarity_search_with_score(question1, k=3)\n", "docs" ] }, { "cell_type": "code", "execution_count": 114, "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "######## prompt : ########## \n", "\n", " 주어진 Context 에 기반하여 질문에 답변 하세요 :\n", "\n", "### Context: 아마존에 등록하면 한 개 또는 수천 개의 아이템을 유연하게 판매할 수 있습니다. 필요에 따라 셀링 플랜을 선택하면 언제든지 플랜을 변경할 수 있습니다.셀러 센트럴을 사용하여 상품 리스팅을 생성하십시오.이 퀵 스타트 스타일 가이드에 따라 멋진 상품 상세 페이지를 만드세요. Amazon Ads 또는 기타 마케팅 채널을 통해 상품을 홍보하십시오.고객이 구매할 때 주문을 신속하게 처리합니다.\n", "\n", "### 질문: 아마존 매장에서 상품을 판매하려면 어떻게 해야 하나요?\n", "\n", "### 답변:\n" ] } ], "source": [ "def make_prompt(doc, question):\n", " context = doc\n", " # prompt = f'{question} 다음의 Context 를 이용하여 답해주세요. {docs[0].page_content}'\n", "# prompt = f\"\"\"Answer based on Context:\\n\\n### {context}\\n\\n### Question: {question}\\n\\n### Answer:\"\"\"\n", "# prompt = f\"\"\"주어진 Context 에 기반하여 Question에 Answer 하세요 :\\n\\n### {context}\\n\\n### Question: {question}\\n\\n### Answer:\"\"\"\n", " prompt = f\"\"\"주어진 Context 에 기반하여 질문에 답변 하세요 :\\n\\n### {context}\\n\\n### 질문: {question}\\n\\n### 답변:\"\"\" \n", " print(\"######## prompt : ########## \\n\\n\", prompt)\n", " \n", " return prompt\n", "\n", "prompt = make_prompt(docs[2][0].page_content, question1)" ] }, { "cell_type": "code", "execution_count": 115, "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[\n", " [\n", " {\n", " \"generated_text\":\"\\nAmazon Store는 아마존의 온라인 스토어입니다. 아마존 스토어에서는 다양한 제품을 판매하고 있으며, 이 스토어에서는 고객에게 직접 상품을 배송해 드립니다. 고객은 아마존 스토어에서 상품을 검색하고 구매할 수 있습니다. 또한 아마존 스토어에서는 고객이 상품을 쉽고 빠르게 구매할 수 있도록 다양한 결제 옵션과 편의 기능도 제공합니다.Amazon Store에서 상품을 판매하기 위해서는 다음 단계를 따라야 합니다:1. 아마존 계정을 만듭니다: 아마존 계정을 만들면 아마존 스토어에서 상품을 판매할 수 있\"\n", " }\n", " ]\n", "]\n", "\n", "Amazon Store는 아마존의 온라인 스토어입니다. 아마존 스토어에서는 다양한 제품을 판매하고 있으며, 이 스토어에서는 고객에게 직접 상품을 배송해 드립니다. 고객은 아마존 스토어에서 상품을 검색하고 구매할 수 있습니다. 또한 아마존 스토어에서는 고객이 상품을 쉽고 빠르게 구매할 수 있도록 다양한 결제 옵션과 편의 기능도 제공합니다.Amazon Store에서 상품을 판매하기 위해서는 다음 단계를 따라야 합니다:1. 아마존 계정을 만듭니다: 아마존 계정을 만들면 아마존 스토어에서 상품을 판매할 수 있\n" ] } ], "source": [ "data = {\n", " \"prompt\": [prompt],\n", " \"params\": params\n", "}\n", "\n", "query_response = invoke_inference_DJ(\n", " endpoint_name=endpoint_name, prompt=data\n", ")\n", "\n", "query_response = parse_response_json_model(query_response)\n", "print(query_response)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 두번째 질문" ] }, { "cell_type": "code", "execution_count": 120, "metadata": { "tags": [] }, "outputs": [], "source": [ "question2 = \"아마존 스토어에서 판매할 수 없는 품목은 무엇입니까?\"\n" ] }, { "cell_type": "code", "execution_count": 121, "metadata": { "tags": [] }, "outputs": [ { "data": { "text/plain": [ "[(Document(page_content='Context: “일부 상품은 법률 또는 규제 제한 (예: 처방약) 또는 아마존 정책 (예: 범죄 현장 사진) 을 준수하는 것으로 리스팅되지 않을 수 있습니다.자세한 내용은 셀러 센트럴 도움말을 방문하여 제한 사항 및 특정 카테고리의 신상품에 대한 승인을 요청하는 방법에 대해 자세히 알아보십시오. Fulfillment by Amazon (아마존 주문처리 서비스) 을 통해 주문을 배송하려는 경우 FBA 상품 제한 목록을 검토하십시오.”', metadata={'source': 'rag_data/amazon_faq_ko_processed_data.csv', 'row': 2}),\n", " 177.11441),\n", " (Document(page_content='Context: 아마존 스토어에는 신규 판매자에게 많은 기회가 있습니다.판매할 수 있는 품목은 상품, 카테고리 및 브랜드에 따라 다릅니다.모든 셀러가 이용할 수 있는 카테고리도 있고 프로페셔널 셀러 계정이 필요한 카테고리도 있습니다.특정 상품은 판매 승인이 필요하며 다른 카테고리에는 타사 판매자가 판매할 수 없는 상품이 포함됩니다.어떤 제품으로 시작해야 할까요?어떤 틈새 시장이 가장 수익성이 높습니까?아이디어를 얻으려면 이 38가지 온라인 비즈니스 아이디어 목록을 확인하세요.아마존 스토어에서 시작하여 전 세계 고객에게 다가간 판매자들의 이야기를 들어보실 수 있습니다.', metadata={'source': 'rag_data/amazon_faq_ko_processed_data.csv', 'row': 4}),\n", " 196.17024),\n", " (Document(page_content='Context: 아마존에 등록하면 한 개 또는 수천 개의 아이템을 유연하게 판매할 수 있습니다. 필요에 따라 셀링 플랜을 선택하면 언제든지 플랜을 변경할 수 있습니다.셀러 센트럴을 사용하여 상품 리스팅을 생성하십시오.이 퀵 스타트 스타일 가이드에 따라 멋진 상품 상세 페이지를 만드세요. Amazon Ads 또는 기타 마케팅 채널을 통해 상품을 홍보하십시오.고객이 구매할 때 주문을 신속하게 처리합니다.', metadata={'source': 'rag_data/amazon_faq_ko_processed_data.csv', 'row': 0}),\n", " 223.66713)]" ] }, "execution_count": 121, "metadata": {}, "output_type": "execute_result" } ], "source": [ "docs2 = docsearch.similarity_search_with_score(question2, k=3)\n", "docs2" ] }, { "cell_type": "code", "execution_count": 122, "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "######## prompt : ########## \n", "\n", " 주어진 Context 에 기반하여 질문에 답변 하세요 :\n", "\n", "### Context: “일부 상품은 법률 또는 규제 제한 (예: 처방약) 또는 아마존 정책 (예: 범죄 현장 사진) 을 준수하는 것으로 리스팅되지 않을 수 있습니다.자세한 내용은 셀러 센트럴 도움말을 방문하여 제한 사항 및 특정 카테고리의 신상품에 대한 승인을 요청하는 방법에 대해 자세히 알아보십시오. Fulfillment by Amazon (아마존 주문처리 서비스) 을 통해 주문을 배송하려는 경우 FBA 상품 제한 목록을 검토하십시오.”\n", "\n", "### 질문: 아마존 스토어에서 판매할 수 없는 품목은 무엇입니까?\n", "\n", "### 답변:\n" ] } ], "source": [ "prompt = make_prompt(docs2[0][0].page_content, question2)" ] }, { "cell_type": "code", "execution_count": 123, "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[\n", " [\n", " {\n", " \"generated_text\":\"\\nAmazon Store 에서 판매 할 수없는 품목은 다음과 같습니다:\\n1. 처방전 의약품: 처방전 의약품은 일반적으로 의사의 처방전이 필요합니다. 처방전 의약품을 판매하려면 아마존 스토어에서 판매하기 전에 의사의 처방전이 필요합니다.\\n2. 처방전 없이 구입할 수있는 의약품: 처방전 없이 구입할 수있는 의약품은 일반적으로 약국이나 슈퍼마켓에서 구입할 수 있으며, 처방전 없이 사용할 수 있지만 의사의 처방이 필요하지 않습니다. 처방전없이 구입할 수있는 의약품은 일반적으로\"\n", " }\n", " ]\n", "]\n", "\n", "Amazon Store 에서 판매 할 수없는 품목은 다음과 같습니다:\n", "1. 처방전 의약품: 처방전 의약품은 일반적으로 의사의 처방전이 필요합니다. 처방전 의약품을 판매하려면 아마존 스토어에서 판매하기 전에 의사의 처방전이 필요합니다.\n", "2. 처방전 없이 구입할 수있는 의약품: 처방전 없이 구입할 수있는 의약품은 일반적으로 약국이나 슈퍼마켓에서 구입할 수 있으며, 처방전 없이 사용할 수 있지만 의사의 처방이 필요하지 않습니다. 처방전없이 구입할 수있는 의약품은 일반적으로\n" ] } ], "source": [ "data = {\n", " \"prompt\": [prompt],\n", " \"params\": params\n", "}\n", "\n", "query_response = invoke_inference_DJ(\n", " endpoint_name=endpoint_name, prompt=data\n", ")\n", "\n", "query_response = parse_response_json_model(query_response)\n", "print(query_response)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 트러블 슈팅: LangChain 한글 문제 발생" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [], "source": [ "# prompt_template = \"\"\"Answer based on context:\\n\\n{context}\\n\\n{question}\"\"\"\n", "\n", "# PROMPT = PromptTemplate(template=prompt_template, input_variables=[\"context\", \"question\"])\n", "# PROMPT" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [], "source": [ "# chain = load_qa_chain(llm=sm_llm, prompt=PROMPT)" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [], "source": [ "# result = chain({\"input_documents\": docs, \"question\": question}, return_only_outputs=True)[\n", "# \"output_text\"\n", "# ]\n", "# result" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "availableInstances": [ { "_defaultOrder": 0, "_isFastLaunch": true, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 4, "name": "ml.t3.medium", "vcpuNum": 2 }, { "_defaultOrder": 1, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 8, "name": "ml.t3.large", "vcpuNum": 2 }, { "_defaultOrder": 2, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 16, "name": "ml.t3.xlarge", "vcpuNum": 4 }, { "_defaultOrder": 3, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 32, "name": "ml.t3.2xlarge", "vcpuNum": 8 }, { "_defaultOrder": 4, "_isFastLaunch": true, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 8, "name": "ml.m5.large", "vcpuNum": 2 }, { "_defaultOrder": 5, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 16, "name": "ml.m5.xlarge", "vcpuNum": 4 }, { "_defaultOrder": 6, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 32, "name": "ml.m5.2xlarge", "vcpuNum": 8 }, { "_defaultOrder": 7, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 64, "name": "ml.m5.4xlarge", "vcpuNum": 16 }, { "_defaultOrder": 8, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 128, "name": "ml.m5.8xlarge", "vcpuNum": 32 }, { "_defaultOrder": 9, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 192, "name": "ml.m5.12xlarge", "vcpuNum": 48 }, { "_defaultOrder": 10, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 256, "name": "ml.m5.16xlarge", "vcpuNum": 64 }, { "_defaultOrder": 11, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 384, "name": "ml.m5.24xlarge", "vcpuNum": 96 }, { "_defaultOrder": 12, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 8, "name": "ml.m5d.large", "vcpuNum": 2 }, { "_defaultOrder": 13, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 16, "name": "ml.m5d.xlarge", "vcpuNum": 4 }, { "_defaultOrder": 14, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 32, "name": "ml.m5d.2xlarge", "vcpuNum": 8 }, { "_defaultOrder": 15, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 64, "name": "ml.m5d.4xlarge", "vcpuNum": 16 }, { "_defaultOrder": 16, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 128, "name": "ml.m5d.8xlarge", "vcpuNum": 32 }, { "_defaultOrder": 17, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 192, "name": "ml.m5d.12xlarge", "vcpuNum": 48 }, { "_defaultOrder": 18, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 256, "name": "ml.m5d.16xlarge", "vcpuNum": 64 }, { "_defaultOrder": 19, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 384, "name": "ml.m5d.24xlarge", "vcpuNum": 96 }, { "_defaultOrder": 20, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": true, "memoryGiB": 0, "name": "ml.geospatial.interactive", "supportedImageNames": [ "sagemaker-geospatial-v1-0" ], "vcpuNum": 0 }, { "_defaultOrder": 21, "_isFastLaunch": true, "category": "Compute optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 4, "name": "ml.c5.large", "vcpuNum": 2 }, { "_defaultOrder": 22, "_isFastLaunch": false, "category": "Compute optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 8, "name": "ml.c5.xlarge", "vcpuNum": 4 }, { "_defaultOrder": 23, "_isFastLaunch": false, "category": "Compute optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 16, "name": "ml.c5.2xlarge", "vcpuNum": 8 }, { "_defaultOrder": 24, "_isFastLaunch": false, "category": "Compute optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 32, "name": "ml.c5.4xlarge", "vcpuNum": 16 }, { "_defaultOrder": 25, "_isFastLaunch": false, "category": "Compute optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 72, "name": "ml.c5.9xlarge", "vcpuNum": 36 }, { "_defaultOrder": 26, "_isFastLaunch": false, "category": "Compute optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 96, "name": "ml.c5.12xlarge", "vcpuNum": 48 }, { "_defaultOrder": 27, "_isFastLaunch": false, "category": "Compute optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 144, "name": "ml.c5.18xlarge", "vcpuNum": 72 }, { "_defaultOrder": 28, "_isFastLaunch": false, "category": "Compute optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 192, "name": "ml.c5.24xlarge", "vcpuNum": 96 }, { "_defaultOrder": 29, "_isFastLaunch": true, "category": "Accelerated computing", "gpuNum": 1, "hideHardwareSpecs": false, "memoryGiB": 16, "name": "ml.g4dn.xlarge", "vcpuNum": 4 }, { "_defaultOrder": 30, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 1, "hideHardwareSpecs": false, "memoryGiB": 32, "name": "ml.g4dn.2xlarge", "vcpuNum": 8 }, { "_defaultOrder": 31, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 1, "hideHardwareSpecs": false, "memoryGiB": 64, "name": "ml.g4dn.4xlarge", "vcpuNum": 16 }, { "_defaultOrder": 32, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 1, "hideHardwareSpecs": false, "memoryGiB": 128, "name": "ml.g4dn.8xlarge", "vcpuNum": 32 }, { "_defaultOrder": 33, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 4, "hideHardwareSpecs": false, "memoryGiB": 192, "name": "ml.g4dn.12xlarge", "vcpuNum": 48 }, { "_defaultOrder": 34, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 1, "hideHardwareSpecs": false, "memoryGiB": 256, "name": "ml.g4dn.16xlarge", "vcpuNum": 64 }, { "_defaultOrder": 35, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 1, "hideHardwareSpecs": false, "memoryGiB": 61, "name": "ml.p3.2xlarge", "vcpuNum": 8 }, { "_defaultOrder": 36, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 4, "hideHardwareSpecs": false, "memoryGiB": 244, "name": "ml.p3.8xlarge", "vcpuNum": 32 }, { "_defaultOrder": 37, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 8, "hideHardwareSpecs": false, "memoryGiB": 488, "name": "ml.p3.16xlarge", "vcpuNum": 64 }, { "_defaultOrder": 38, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 8, "hideHardwareSpecs": false, "memoryGiB": 768, "name": "ml.p3dn.24xlarge", "vcpuNum": 96 }, { "_defaultOrder": 39, "_isFastLaunch": false, "category": "Memory Optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 16, "name": "ml.r5.large", "vcpuNum": 2 }, { "_defaultOrder": 40, "_isFastLaunch": false, "category": "Memory Optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 32, "name": "ml.r5.xlarge", "vcpuNum": 4 }, { "_defaultOrder": 41, "_isFastLaunch": false, "category": "Memory Optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 64, "name": "ml.r5.2xlarge", "vcpuNum": 8 }, { "_defaultOrder": 42, "_isFastLaunch": false, "category": "Memory Optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 128, "name": "ml.r5.4xlarge", "vcpuNum": 16 }, { "_defaultOrder": 43, "_isFastLaunch": false, "category": "Memory Optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 256, "name": "ml.r5.8xlarge", "vcpuNum": 32 }, { "_defaultOrder": 44, "_isFastLaunch": false, "category": "Memory Optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 384, "name": "ml.r5.12xlarge", "vcpuNum": 48 }, { "_defaultOrder": 45, "_isFastLaunch": false, "category": "Memory Optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 512, "name": "ml.r5.16xlarge", "vcpuNum": 64 }, { "_defaultOrder": 46, "_isFastLaunch": false, "category": "Memory Optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 768, "name": "ml.r5.24xlarge", "vcpuNum": 96 }, { "_defaultOrder": 47, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 1, "hideHardwareSpecs": false, "memoryGiB": 16, "name": "ml.g5.xlarge", "vcpuNum": 4 }, { "_defaultOrder": 48, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 1, "hideHardwareSpecs": false, "memoryGiB": 32, "name": "ml.g5.2xlarge", "vcpuNum": 8 }, { "_defaultOrder": 49, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 1, "hideHardwareSpecs": false, "memoryGiB": 64, "name": "ml.g5.4xlarge", "vcpuNum": 16 }, { "_defaultOrder": 50, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 1, "hideHardwareSpecs": false, "memoryGiB": 128, "name": "ml.g5.8xlarge", "vcpuNum": 32 }, { "_defaultOrder": 51, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 1, "hideHardwareSpecs": false, "memoryGiB": 256, "name": "ml.g5.16xlarge", "vcpuNum": 64 }, { "_defaultOrder": 52, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 4, "hideHardwareSpecs": false, "memoryGiB": 192, "name": "ml.g5.12xlarge", "vcpuNum": 48 }, { "_defaultOrder": 53, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 4, "hideHardwareSpecs": false, "memoryGiB": 384, "name": "ml.g5.24xlarge", "vcpuNum": 96 }, { "_defaultOrder": 54, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 8, "hideHardwareSpecs": false, "memoryGiB": 768, "name": "ml.g5.48xlarge", "vcpuNum": 192 } ], "instance_type": "ml.m5.2xlarge", "kernelspec": { "display_name": "Python 3 (PyTorch 1.13 Python 3.9 CPU Optimized)", "language": "python", "name": "python3__SAGEMAKER_INTERNAL__arn:aws:sagemaker:us-east-1:081325390199:image/pytorch-1.13-cpu-py39" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.16" } }, "nbformat": 4, "nbformat_minor": 4 }