본문 바로가기
인공지능/생성형 AI

[생성형 AI] LangChain과 멀티모달 모델을 활용한 스마트 냉장고 앱 만들기 실습

by 클레어몬트 2025. 3. 11.

https://claremont.tistory.com/entry/%EC%83%9D%EC%84%B1%ED%98%95-AI-LangChain%EC%9D%B4%EB%9E%80

 

[생성형 AI] LangChain이란?

ㅁLangChain: LLM을 활용하여 응용 프로그램을 개발하는 프레임워크주로 OpenAI의 GPT, Google의 PaLM, Meta의 Llama 등 다양한 LLM과 통합하여 문서 검색, 데이터 분석, 자동화된 AI 응답 시스템 등을 구축하는

claremont.tistory.com

https://claremont.tistory.com/entry/LangChain-%EA%B8%B0%EC%B4%88-LLM%EA%B3%BC-%ED%94%84%EB%A1%AC%ED%94%84%ED%8A%B8-%EC%97%94%EC%A7%80%EB%8B%88%EC%96%B4%EB%A7%81-%EC%8B%A4%EC%8A%B5

 

LangChain 기초: LLM과 프롬프트 엔지니어링 실습

https://claremont.tistory.com/entry/%EC%83%9D%EC%84%B1%ED%98%95-AI-LangChain%EC%9D%B4%EB%9E%80 [생성형 AI] LangChain이란?ㅁLangChain: LLM을 활용하여 응용 프로그램을 개발하는 프레임워크주로 OpenAI의 GPT, Google의 PaLM, Meta

claremont.tistory.com

https://claremont.tistory.com/entry/%EC%83%9D%EC%84%B1%ED%98%95-AI-LCELLangChain-Expression-Language-%EC%8B%A4%EC%8A%B5-%EC%B2%B4%EC%9D%B8%EC%9D%84-%EB%8D%94%EC%9A%B1-%EA%B0%84%EA%B2%B0%ED%95%98%EA%B2%8C-%EA%B5%AC%EC%84%B1%ED%95%98%EA%B8%B0

 

[생성형 AI] LCEL(LangChain Expression Language) 실습: 체인을 더욱 간결하게 구성하기

https://claremont.tistory.com/entry/%EC%83%9D%EC%84%B1%ED%98%95-AI-LangChain%EC%9D%B4%EB%9E%80 [생성형 AI] LangChain이란?ㅁLangChain: LLM을 활용하여 응용 프로그램을 개발하는 프레임워크주로 OpenAI의 GPT, Google의 PaLM, Meta

claremont.tistory.com

 

 

 

최근 AI의 발전은 단순한 텍스트 기반의 자연어 처리(NLP)를 넘어, 이미지와 텍스트를 동시에 활용하는 멀티모달 모델(Multi-Modal Model)로 확장되고 있다.
이러한 기술을 활용하면, 이미지를 보고 그 내용을 분석한 후, 적절한 텍스트를 생성하는 애플리케이션을 개발할 수가 있다.

 

이번 실습에서는 LangChain과 OpenAI의 멀티모달 기능을 활용하여 스마트 냉장고 앱을 만들어 본다!

비스포크 냉장고 사고싶어요


이 앱은 냉장고 속 재료를 분석하고, 이를 바탕으로 요리를 추천하며, 추천된 요리의 이미지를 생성할 수 있다.

생각보다 그렇게 어렵지 않으며, 간단하니 잘 따라올 수 있을 것이다! 물론 사전 AI 지식은 필요하기는 하다..😅


프로젝트 개요

스마트 냉장고 앱의 작동 과정은 다음과 같다


1️⃣ 냉장고 사진을 업로드하면, AI가 이를 분석하여 재료 목록을 추출
2️⃣ 재료 목록을 바탕으로 만들 수 있는 음식 목록을 추천
3️⃣ 추천된 음식의 이미지를 AI가 생성하여 시각적으로 보여줌

 

이 과정에서 LangChain, OpenAI GPT-4o(비전 모델), DALL·E 3, Gradio 등을 활용하여 AI 기반의 인터랙티브한 요리 추천 시스템을 구축한다


1. 환경 설정 및 기본 구성

필요한 라이브러리 설치

pip install langchain langchain-openai langchain-community

OpenAI API 키 설정

OpenAI의 API를 활용하기 위해 환경 변수에 API 키를 저장한다.

import os
from langchain_openai import ChatOpenAI

# OpenAI API Key 설정
os.environ['OPENAI_API_KEY'] = "your_openai_api_key_here"
llm = ChatOpenAI(model="gpt-4o", max_tokens=1024)

2. 이미지 인코딩: 냉장고 내부 사진을 AI가 분석할 수 있도록 변환하기

이미지를 AI 모델에서 활용하려면 Base64 방식으로 인코딩해야 한다.
이를 위해 Python의 base64 모듈을 활용하여 이미지를 문자열로 변환한다.

 
import base64

def encode_image(image_path):
    with open(image_path, "rb") as image_file:
        return base64.b64encode(image_file.read()).decode('utf-8')

 

이제 encode_image("images/1.jpg")을 실행하면, 이미지가 Base64 문자열로 변환되어 OpenAI 모델에 입력할 준비가 된다!


3-1. 냉장고 속 재료 리스트 추출

이제 AI가 냉장고 속 사진을 보고 어떤 재료가 있는지 목록을 생성하도록 한다.

from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser

image = encode_image("images/1.jpg")

listing_prompt = ChatPromptTemplate.from_messages([
    ('system', """음식 재료에 대한 이미지가 주어집니다.
해당 이미지에서 확인할 수 있는 모든 재료의 목록을
리스트로 출력하세요. 답변은 영어로 작성하세요."""),
    ('user', [{"type": "image_url", "image_url": {"url": "data:image/jpeg;base64,{image}"}}])
])

list_chain = listing_prompt | llm | StrOutputParser()

ingredients = list_chain.invoke({'image': image})
print(ingredients)
 

📌 여기서 중요한 점

  • ChatPromptTemplate을 사용하여 AI가 냉장고 내부 사진을 분석하도록 지시한다.
  • 이미지 데이터는 Base64 방식으로 인코딩하여 입력한다.
  • | (파이프) 연산자를 사용하여 list_chain을 구성한다.

listing_prompt | llm | StrOutputParser() → 프롬프트 실행 → LLM 처리 → 문자열 변환

 

💡 실행 후 결과 예시

["Tomato", "Lettuce", "Cheese", "Milk"]

냉장고 내부 사진을 분석한 후, 감지된 음식 재료를 리스트 형식으로 반환한다.


3-2. 추천 메뉴 생성

위에서 추출한 재료 리스트를 바탕으로 만들 수 있는 음식 2가지를 추천하도록 한다.

recommendation_prompt = ChatPromptTemplate.from_messages([
    ('system', """음식 재료 리스트가 아래에 주어집니다:
해당 재료를 이용해 만들 수 있는 특별한 음식 2개를 영어로 출력하세요.
너무 단순한 이름은 작성하지 말고, 각각의 재료가 어떻게 들어갔는지에 대해 묘사하세요.
음식과 묘사 이외에 다른 설명은 추가하지 마세요."""),
    ('user', "음식 목록: {food}")
])

recommendation_chain = recommendation_prompt | llm | StrOutputParser()
menu = recommendation_chain.invoke({"food": ingredients})
print(menu)

 

📌 여기서 중요한 점

  • 재료 리스트를 입력값으로 활용하여 AI가 적절한 레시피를 추천하도록 구성
  • "너무 단순한 음식 이름은 사용하지 말고, 재료가 어떻게 사용되는지 설명하라"는 조건 추가
  • LLM 모델이 불필요한 추가 설명을 하지 않도록 지시

💡 실행 후 결과 예시

1. "Tomato Basil Caprese Salad" - Slices of fresh tomatoes layered with mozzarella cheese and basil, drizzled with balsamic glaze.
2. "Cheesy Lettuce Wraps" - Crisp lettuce leaves wrapped around a filling of melted cheese, diced tomatoes, and a light garlic aioli.

 

이제 AI가 재료를 활용하여 요리를 추천할 수 있다.


3-3. 추천된 음식의 이미지 생성

이제 OpenAI의 DALL·E 3 모델을 이용하여 요리 이미지를 생성한다.

 
import openai
client = openai.OpenAI()

def draw_image(prompt):
    response = client.images.generate(
    model="dall-e-3",
    prompt=f"A nice candlelight dinner with {prompt} for two people",
    size="1024x1024",
    quality="standard",
    n=1,
    )
    image_url = response.data[0].url
    return image_url

 

이제 메뉴를 기반으로 이미지 생성 요청을 보낸다.

image_url = draw_image(menu)
print(image_url)

 

📌 DALL·E 3을 활용한 이미지 생성의 핵심

  • 프롬프트에 "A nice candlelight dinner"를 추가하여 고급스러운 이미지가 나오도록 유도
  • 음식 이름을 프롬프트에 삽입하여 적절한 이미지가 생성되도록 설계
  • 생성된 이미지는 URL 형태로 반환됨

4. Gradio를 활용한 인터랙티브 웹 앱 구축

이제 Gradio를 활용하여 사용자가 직접 이미지를 업로드하고, AI가 요리를 추천하는 웹 애플리케이션을 구축해 보자.

import gradio as gr
import requests
from PIL import Image
from io import BytesIO

def process(image):
    image_encoded = encode_image_pil(image)
    ingredients = list_chain.invoke({'image': image_encoded})
    menu = recommendation_chain.invoke({"food": ingredients})
    image_url = draw_image(menu)

    response = requests.get(image_url)
    menu_image = Image.open(BytesIO(response.content))
    return ingredients, menu, menu_image

with gr.Blocks() as demo:
    gr.Markdown("# 스마트 냉장고")
    with gr.Row():
        image_input = gr.Image(type="pil", label="냉장고 이미지 업로드")
        submit_button = gr.Button("메뉴 추천 받기")
    with gr.Row():
        ingredients_output = gr.Textbox(label="재료 목록")
        menu_output = gr.Textbox(label="추천 메뉴")
        image_output = gr.Image(label="메뉴 이미지")

    submit_button.click(process, inputs=image_input, outputs=[ingredients_output, menu_output, image_output])

demo.launch()

 

이제 사용자가 냉장고 사진을 업로드하면, AI가 재료를 분석하고 요리를 추천하며, 생성된 이미지를 웹에서 확인할 수 있다 (:

 

🔍 이번 실습에서 배운 핵심 내용

LangChain을 활용하여 멀티모달 AI를 쉽게 조합할 수 있음
LLM + Vision + Image Generation을 결합하여 현실적인 AI 서비스 구축 가능
LCEL(| 연산자)을 활용하면 체인 구성과 실행이 직관적이고 효율적임
Gradio를 활용하여 사용자가 직접 인터랙티브하게 AI를 활용할 수 있는 웹 애플리케이션을 쉽게 만들 수 있음

 

 

LangChain을 활용하면 복잡한 AI 기능을 간결한 체인 구조로 쉽게 구성할 수 있었고, Gradio 덕분에 빠르게 웹 애플리케이션으로 배포할 수 있었다. 멀티모달 AI는 앞으로 실생활에서 다양한 방식으로 활용될 가능성이 높다! 이 실습을 기반으로 더욱 다양한 AI 서비스를 개발해 볼 수 있을 것 같아 기대된다 :/