{ "cells": [ { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## 이 문서를 수정할 당신에게...\n", "#### 현재 상황은 아래와 같습니다.\n", "1. 아래 4가지의 도구를 사용하고 있습니다.\n", "- 필터 query로 데이터베이스 정보 추출(추천을 위함): chroma를 활용해 수집된 wine database에 필터를 적용하여 특정 와인만 뽑아올 수 있습니다. \n", " - input: {body:3, price:100000~120000}\n", " - output: [Document(page_content='포지오 데이 젤시', metadata={'price': '30000', ...}),]\n", "- 자연어 query로 데이터베이스 정보 추출(추천을 위함): DocArrayInMemorySearch을 활용해 wine database에 자연어로 특정 데이터를 뽑아 올 수 있습니다.\n", " - input: \"프랑스에서 만들어진 와인은?\"\n", "- 특정 URL query로 웹 페이지에서 정보 추출(와인 구매링크에서 정보를 가져올 때 사용): SeleniumURLLoader를 이용해 특정 url로 부터 웹페이지 정보를 얻을 수 있습니다.\n", "- 자연어 구글 검색으로 웹 페이지에서 정보 추출(Q&A처럼 그 외 검색이 필요한 경우 사용): SerpAPI를 이용해 구글에서 검색 결과를 가져올 수 있습니다.\n", "\n", "#### 당신의 목표는 아래와 같습니다.\n", "1. 다양한 도구를 사용하거나 알고리즘을 탐구하여 데이터베이스를 연결할 수 있는 좋은 방식을 찾습니다. (예를 들면 와인바의 상세정보를 검색하기 위한 카카오 위치 정보 API등을 추가할 수 있을 듯 합니다.)\n", "2. 도구를 사용할 때는 적절한 format을 사용하는 것이 성능에 영향을 줍니다. 각 도구들에 대한 적절한 input format을 찾습니다.\n", "\n", "\n", "#### 참고사항\n", "현재 말이 너무 모호하게 써있고, 도구의 사용처가 확실하지 않습니다. 이를 구체화하는 과정이 필요하기도 합니다." ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "-------------------------------------------------------------------------------" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "### API 키 불러오기" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import os\n", "import configparser" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['./secrets.ini']" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "config = configparser.ConfigParser()\n", "config.read('./secrets.ini')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "openai_api_key = config['OPENAI']['OPENAI_API_KEY']\n", "serper_api_key = config['SERPER']['SERPER_API_KEY']\n", "serp_api_key = config['SERPAPI']['SERPAPI_API_KEY']\n", "os.environ.update({'OPENAI_API_KEY': openai_api_key})\n", "os.environ.update({'SERPER_API_KEY': serper_api_key})\n", "os.environ.update({'SERPAPI_API_KEY': serp_api_key})" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from typing import List, Union\n", "import re\n", "import json\n", "\n", "import pandas as pd\n", "from langchain import SerpAPIWrapper, LLMChain\n", "from langchain.agents import Tool, AgentType, AgentExecutor, LLMSingleActionAgent, AgentOutputParser\n", "from langchain.chat_models import ChatOpenAI\n", "from langchain.chains import LLMChain, SimpleSequentialChain\n", "from langchain.chains.query_constructor.base import AttributeInfo\n", "from langchain.document_loaders import DataFrameLoader, SeleniumURLLoader\n", "from langchain.embeddings import OpenAIEmbeddings\n", "from langchain.indexes import VectorstoreIndexCreator\n", "from langchain.prompts import PromptTemplate, StringPromptTemplate, load_prompt, BaseChatPromptTemplate\n", "from langchain.llms import OpenAI\n", "from langchain.retrievers.self_query.base import SelfQueryRetriever\n", "from langchain.schema import AgentAction, AgentFinish, HumanMessage\n", "from langchain.vectorstores import DocArrayInMemorySearch, Chroma" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "### Load wine database json" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df = pd.read_json('./data/unified_wine_data.json', encoding='utf-8', lines=True)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", " | url | \n", "site_name | \n", "price | \n", "name | \n", "en_name | \n", "img_url | \n", "body | \n", "acidity | \n", "tannin | \n", "sweetness | \n", "alcohol | \n", "wine_type | \n", "country | \n", "grape | \n", "rating | \n", "pickup_location | \n", "vivino_link | \n", "
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | \n", "https://www.winenara.com/shop/product/product_... | \n", "winenara | \n", "49000 | \n", "모노폴 클라시코 | \n", "Monopole Classico | \n", "https://www.winenara.com/uploads/product/550/1... | \n", "3 | \n", "\n", " | \n", " | -1 | \n", "-1 | \n", "화이트 | \n", "스페인 | \n", "\n", " | 3.8 | \n", "\n", " | https://www.vivino.com/monopole-la-rioja-blanc... | \n", "
1 | \n", "https://www.winenara.com/shop/product/product_... | \n", "winenara | \n", "32000 | \n", "슐럼베르거 로제 스페셜 브뤼 | \n", "Schlumberger Rose Special Brut | \n", "https://www.winenara.com/uploads/product/550/d... | \n", "3 | \n", "\n", " | \n", " | -1 | \n", "-1 | \n", "스파클링 | \n", "독일 | \n", "\n", " | 3.8 | \n", "\n", " | https://www.vivino.com/schlumberger-spring-edi... | \n", "
2 | \n", "https://www.winenara.com/shop/product/product_... | \n", "winenara | \n", "50000 | \n", "SET)페데럴리스트 샤르도네 원통 패키지 | \n", "SET)THE FEDERALIST CHARDONNAY | \n", "https://www.winenara.com/uploads/product/550/d... | \n", "3 | \n", "\n", " | \n", " | -1 | \n", "-1 | \n", "화이트 | \n", "미국 | \n", "\n", " | 3.7 | \n", "\n", " | https://www.vivino.com/federalist-chardonnay-m... | \n", "
3 | \n", "https://www.winenara.com/shop/product/product_... | \n", "winenara | \n", "55000 | \n", "베니카 트레 비니스 | \n", "VENICA TRE VIGNIS | \n", "https://www.winenara.com/uploads/product/550/c... | \n", "4 | \n", "\n", " | \n", " | -1 | \n", "-1 | \n", "화이트 | \n", "이탈리아 | \n", "\n", " | 3.9 | \n", "\n", " | https://www.vivino.com/US-CA/en/venica-venica-... | \n", "
4 | \n", "https://www.winenara.com/shop/product/product_... | \n", "winenara | \n", "24900 | \n", "SET)빌라엠비앙코 + 글라스2개 윈터패키지 | \n", "SET)VILLA M Bianco + GLASS WINTER PACKAGE | \n", "https://www.winenara.com/uploads/product/550/a... | \n", "-1 | \n", "\n", " | \n", " | 4 | \n", "-1 | \n", "디저트 | \n", "이탈리아 | \n", "\n", " | 3.9 | \n", "\n", " | https://www.vivino.com/villa-m-bianco/w/1774733 | \n", "