diff --git "a/\352\260\225\353\257\270\354\206\214/\352\260\225\353\257\270\354\206\214.ipynb" "b/\352\260\225\353\257\270\354\206\214/\352\260\225\353\257\270\354\206\214.ipynb" new file mode 100644 index 0000000..6092891 --- /dev/null +++ "b/\352\260\225\353\257\270\354\206\214/\352\260\225\353\257\270\354\206\214.ipynb" @@ -0,0 +1,211 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\miso3\\AppData\\Local\\Temp\\ipykernel_3632\\1709445667.py:37: LangChainDeprecationWarning: The method `BaseChatModel.__call__` was deprecated in langchain-core 0.1.7 and will be removed in 1.0. Use :meth:`~invoke` instead.\n", + " response = chat_model(prompt.to_messages())\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "추천하는 옷: 운동에는 다양한 종류가 있지만, 일반적으로는 활동성이 높고 편안한 옷이 좋습니다.\n", + "\n", + "1. **자켓과 팬츠**: 활동적인 날씨에 적합하며, 운동 시도 또는 레저 활동에 용이합니다.\n", + "2. **스포츠 바지**: 트레이닝을 위한 것이나, 산책이나 스포츠를 좋아하는 사람들에게 적합합니다.\n", + "3. **데님팬츠와 스니커즈**: 일반적으로 주말 나누어지는 시간에 더 많이 착용하는 옷입니다.\n", + "오늘의 행운의 색: 당신의 행운의 색은 녹색입니다.\n", + "행운의 색을 반영한 추천 옷: 운동에 적합한 녹색 옷 추천입니다.\n", + "\n", + "1. **녹색 운동복**: 가장 간단한 방법입니다. 녹색의 유니폼과 레그린저를 장착하면 운동하는 동안도 멋스럽습니다.\n", + "2. **녹색 반바지**: 반바지로 운동을 하려는 경우, 녹색 반바지를 추천합니다. \n", + "3. **녹색 티셔츠**: 티셔츠로 운동을 하려고 한다면, 녹색 티셔츠를 선택하면 됩니다.\n" + ] + } + ], + "source": [ + "#상황을 입력받고 옷 추천 & 생년월일 입력받고 행운의 색 & 상황과 행운의 색을 반영하여 옷 추천\n", + "\n", + "import ollama\n", + "from langchain_community.chat_models import ChatOllama\n", + "from langchain_core.prompts import ChatPromptTemplate\n", + "from langchain_core.output_parsers import StrOutputParser\n", + "\n", + "api_key = \"YOUR_OLLAMA_API_KEY\"\n", + "chat_model = ChatOllama(api_key=api_key, model='llama3.1')\n", + "\n", + "outfit_prompt_template = ChatPromptTemplate.from_template(\n", + " template=\"당신은 패션 전문가입니다. {occasion}에 어울리는 옷을 간단하게 추천해 주세요. (예: 정장, 구두)\"\n", + ")\n", + "\n", + "color_prompt_template = ChatPromptTemplate.from_template(\n", + " template=\"{birthdate}에 태어난 사람에게 오늘의 행운의 색을 간단하게 알려 주세요. (예: 빨간색, 파란색)\"\n", + ")\n", + "\n", + "lucky_color_outfit_prompt_template = ChatPromptTemplate.from_template(\n", + " template=(\n", + " \"당신은 패션 전문가입니다. {occasion}에 어울리는 옷을 간단하게 추천해 주세요. \"\n", + " \"특히 오늘의 행운의 색인 {lucky_color}를 반영해 주세요. (예: 노란색 넥타이, 파란색 셔츠)\"\n", + " )\n", + ")\n", + "\n", + "output_parser = StrOutputParser()\n", + "\n", + "def recommend_outfit(occasion):\n", + " prompt = outfit_prompt_template.format_prompt(occasion=occasion)\n", + " response = chat_model(prompt.to_messages())\n", + " outfit_recommendation = output_parser.parse(response)\n", + " return outfit_recommendation.content\n", + "\n", + "def recommend_lucky_color(birthdate):\n", + " prompt = color_prompt_template.format_prompt(birthdate=birthdate)\n", + " response = chat_model(prompt.to_messages())\n", + " color_recommendation = output_parser.parse(response)\n", + " return color_recommendation.content\n", + "\n", + "def recommend_outfit_with_lucky_color(occasion, lucky_color):\n", + " prompt = lucky_color_outfit_prompt_template.format_prompt(occasion=occasion, lucky_color=lucky_color)\n", + " response = chat_model(prompt.to_messages())\n", + " outfit_recommendation = output_parser.parse(response)\n", + " return outfit_recommendation.content \n", + "\n", + "occasion = input(\"어떤 상황에 맞는 옷을 추천받고 싶으세요? (예: 데이트, 면접 등): \")\n", + "birthdate = input(\"생년월일을 입력하세요 (YYYY-MM-DD): \")\n", + "\n", + "outfit = recommend_outfit(occasion)\n", + "print(f\"추천하는 옷: {outfit}\")\n", + "\n", + "lucky_color = recommend_lucky_color(birthdate)\n", + "print(f\"오늘의 행운의 색: {lucky_color}\")\n", + "\n", + "use_lucky_color = input(\"행운의 색을 반영한 옷 추천을 받고 싶으세요? (예/아니요): \").strip().lower()\n", + "if use_lucky_color == \"예\":\n", + " outfit_with_lucky_color = recommend_outfit_with_lucky_color(occasion, lucky_color)\n", + " print(f\"행운의 색을 반영한 추천 옷: {outfit_with_lucky_color}\")\n", + "else:\n", + " print(\"기본 추천 옷을 사용합니다.\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "추천하는 옷: 운동에 어울리는 옷으로는 신축성 좋은 니트 원피스와 긴팔 셔츠, 스타킹과 슬랙스 등이 있습니다.\n", + "오늘의 행운의 색: 파란색입니다.\n", + "이미지가 '운동_파란색입니다._outfit.png'에 저장되었습니다.\n", + "이미지가 'c:\\Users\\miso3\\OneDrive\\바탕 화면\\gdg\\ai과제2\\운동_파란색입니다._outfit.png'에 저장되었습니다.\n" + ] + } + ], + "source": [ + "#상황을 입력받고 옷 추천 & 생년월일 입력받고 행운의 색 -> 이미지 파일 저장(실패)\n", + "\n", + "import os\n", + "from langchain_community.chat_models import ChatOllama\n", + "from PIL import Image, ImageDraw, ImageFont\n", + "from langchain_core.prompts import ChatPromptTemplate\n", + "\n", + "api_key = \"YOUR_OLLAMA_API_KEY\"\n", + "chat_model = ChatOllama(api_key=api_key, model='llama3.1')\n", + "\n", + "def recommend_outfit(occasion):\n", + " prompt = ChatPromptTemplate.from_template(\n", + " template=\"당신은 패션 전문가입니다. {occasion}에 어울리는 옷을 간단하게 추천해 주세요. (예: 정장, 구두)\"\n", + " ).format_prompt(occasion=occasion)\n", + " \n", + " response = chat_model.invoke(prompt.to_messages())\n", + " outfit_recommendation = response.content \n", + " return outfit_recommendation\n", + "\n", + "def recommend_lucky_color(birthdate):\n", + " prompt = ChatPromptTemplate.from_template(\n", + " template=\"{birthdate}에 태어난 사람에게 오늘의 행운의 색을 간단하게 알려 주세요. (예: 빨간색, 파란색)\"\n", + " ).format_prompt(birthdate=birthdate)\n", + " response = chat_model.invoke(prompt.to_messages())\n", + " color_recommendation = response.content.strip()\n", + " \n", + " if \"죄송하지만\" in color_recommendation:\n", + " color_recommendation = \"알 수 없음\" \n", + " \n", + " return color_recommendation\n", + "\n", + "def generate_outfit_image(occasion, lucky_color):\n", + " prompt = f\"당신은 패션 전문가입니다. {occasion}에 어울리는 옷을 간단하게 묘사해 주세요. 특히 오늘의 행운의 색인 {lucky_color}를 반영해 주세요.\"\n", + " response = chat_model.invoke(prompt)\n", + " outfit_description = response.content.strip()\n", + "\n", + " image = Image.new('RGB', (600, 400), (255, 255, 255))\n", + " draw = ImageDraw.Draw(image)\n", + " \n", + " try:\n", + " font = ImageFont.truetype('arial.ttf', size=24)\n", + " except IOError:\n", + " font = ImageFont.load_default()\n", + "\n", + " x, y = 50, 50\n", + " draw.text((x, y), outfit_description, font=font, fill=(0, 0, 0))\n", + " \n", + " safe_color = lucky_color.replace(\" \", \"_\").replace(\"/\", \"_\")\n", + " safe_occasion = occasion.replace(\" \", \"_\").replace(\"/\", \"_\")\n", + " image_filename = f\"{safe_occasion}_{safe_color}_outfit.png\"\n", + "\n", + " save_path = os.path.join(os.getcwd(), image_filename)\n", + " \n", + " image.save(save_path)\n", + " print(f\"이미지가 '{image_filename}'에 저장되었습니다.\")\n", + " \n", + " return save_path\n", + "\n", + "occasion = input(\"어떤 상황에 맞는 옷을 추천받고 싶으세요? (예: 데이트, 면접 등): \")\n", + "birthdate = input(\"생년월일을 입력하세요 (YYYY-MM-DD): \")\n", + "\n", + "outfit = recommend_outfit(occasion)\n", + "print(f\"추천하는 옷: {outfit}\")\n", + "\n", + "lucky_color = recommend_lucky_color(birthdate)\n", + "print(f\"오늘의 행운의 색: {lucky_color}\")\n", + "\n", + "save_image = input(\"추천 옷 이미지를 저장하시겠습니까? (예/아니요): \").strip().lower()\n", + "if save_image == \"예\":\n", + " image_filename = generate_outfit_image(occasion, lucky_color)\n", + " print(f\"이미지가 '{image_filename}'에 저장되었습니다.\")\n", + "else:\n", + " print(\"이미지는 저장하지 않습니다.\")\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.9" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git "a/\352\260\225\353\257\270\354\206\214/\354\232\264\353\217\231_\355\214\214\353\236\200\354\203\211\354\236\205\353\213\210\353\213\244._outfit.png" "b/\352\260\225\353\257\270\354\206\214/\354\232\264\353\217\231_\355\214\214\353\236\200\354\203\211\354\236\205\353\213\210\353\213\244._outfit.png" new file mode 100644 index 0000000..60a21f8 Binary files /dev/null and "b/\352\260\225\353\257\270\354\206\214/\354\232\264\353\217\231_\355\214\214\353\236\200\354\203\211\354\236\205\353\213\210\353\213\244._outfit.png" differ