
프로젝트의 개요는 다음과 같다!
BellyWelly는 과민대장증후군으로 고통받는 사람들의 평소 습관 개선을 돕는 모바일 서비스입니다. AI 객체 인식을 통해 사용자의 식단을 분석하고 자동 기록하며, 사용자가 섭취한 음식과 영양소를 기반으로 포드맵을 분석합니다. 또한 배변 및 스트레스 기록을 기반으로 프롬프트 엔지니어링을 활용하여 사용자별 건강 상태를 요약하고 맞춤형 건강 관련 조언을 제공합니다.
우리 서비스의 기능은 다음과 같다! 각 기능에서 쓰이는 기술들과 함께 알아보자!😁
• 사용자가 먹은 음식 사진을 업로드
• AI 기반으로 음식 분석 후 자동 기록 ➡️ 🔎YOLOv8를 이용한 객체 인식 기술 사용!
• 사용자가 섭취한 음식과 영양소를 기반으로 장 건강에 필요한 영양소 과부족 및 포드맵 분석
• 사용자가 설정한 건강 관련 목표 또는 건강 상태 요약
• 식단 분석
◦ 사용자가 기록한 식단을 토대로 주요 영양소 섭취량 및 권장량 비교
◦ 사용자별 장 건강에 영향을 미칠 수 있는 재료나 음식 섭취 빈도 분석
◦ 사용자에게 영양소 및 건강 관련 조언 제공 ➡️ ⚙️프롬프트 엔지니어링 및 GPT-4o 사용
• 배변활동 분석
◦ 사용자가 배변 빈도, 상태, 색상 등의 정보 입력
◦ 배변 패턴 분석 및 추정 지표 제공
◦ 배변 패턴과 장 건강 간의 연관성 분석 후 개선점 제공 ➡️ ⚙️프롬프트 엔지니어링 및 GPT-4o 사용
• 스트레스 분석
◦ 사용자의 일일 스트레스 지수 입력
◦ 기간별 스트레스 지수 그래프
◦ 스트레스와 장 건강 간의 연관성 분석 후 개선점 제공 ➡️ ⚙️프롬프트 엔지니어링 및 GPT-4o 사용
• 사용자가 기록했던 식단을 보완해줄 수 있는 식단 추천 기능
• 사용자가 입력한 여러가지 음식 중에서 장건강에 가장 괜찮은 음식을 골라주는 기능
프로젝트의 기능 중, 내가 담당한 주요한 AI 기술을 소개해보자 한다!
목표는, YOLOv8을 사용하여 식단 사진을 분석하고 해당 음식의 라벨을 반환하는 서비스를 구축하는 것이다.
⭐ 개발 환경 셋업
- 클라우드: Tencent Cloud
- OS: Ubuntu Server 20.04 LTS 64bit (& Window 10)
- GPU: Tesla T4, CUDA: 11.8, cuDNN: 8.7.0, PyTorch: 2.2.2+cu118



fastapi 실행 코드는 아래와 같다!
@app.post("/detection")
async def detect_objects(request: Request):
try:
# 요청 바디 파싱
body = await request.json()
image_url = body.get("imageUrl") # 카멜케이스로 수정
# 이미지를 다운로드하여 저장할 디렉토리 생성
os.makedirs('./input_dir', exist_ok=True)
# 이미지 파일의 이름 설정
filename = secure_filename("input_image.jpg")
file_path = os.path.join('./input_dir', filename)
# 이미지 다운로드
response = requests.get(image_url)
with open(file_path, 'wb') as f:
f.write(response.content)
# YOLO 모델 초기화
model = YOLO('./demobest.pt')
results = model.predict(file_path, save=True, imgsz=640, conf=0.3)
# 객체 인식 결과 중 중복은 제거하고 유니크한 결과만 남기도록 코드 수정
# output_labels = [model.names.get(box.cls.item()) for box in results[0].boxes]
unique_labels = []
for box in results[0].boxes:
label = model.names.get(box.cls.item())
if label not in unique_labels:
unique_labels.append(label)
return JSONResponse(content={"labels": unique_labels}, status_code=200)
except Exception as e:
# 오류 발생시 예외 처리
raise HTTPException(status_code=500, detail=str(e))

프로젝트 개발 과정 중, GPT-4o(여기서 o는 omni의 약자) 모델이 새롭게 등장하였다
(생성형AI 모델의 발전은 정말 빠른 것 같다...!)
GPT-4와 비교했을 때, GPT-4o의 경우엔
1) 사람과 대화하는 것과 유사한 속도로, 아주 빠르다
2) 한국어 답변 성능이 높아졌다
3) 답변을 생성하는 것에 드는 비용이 더 싸다
GPT-4o를 사용하지 않을 이유가 없었기에, GPT-4-Turbo 모델에서 GPT-4o 모델로 변경하여 개발 진행하였다😁
from dotenv import load_dotenv
from openai import OpenAI
from typing import List, Dict, Any
load_dotenv()
# openai-key 설정
OPENAI_KEY = os.getenv('OPENAI_KEY')
GPT_MODEL = "gpt-4o"
OPENAI_KEY가 유출되면 큰일나므로, 반드시 .env 파일에 넣어두고 깃허브 등에 절대 노출되지 않도록 유의하자!
우선 LangChain 및 CoT 전략에 대해 알아보자!
⚙️LangChain
LangChain은 거의 모든 LLM을 위한 일반 인터페이스 역할을 하며 LLM 애플리케이션을 구축하고 이를 외부 데이터 소스 및 소프트웨어 워크플로와 통합할 수 있는 중앙 집중식 개발 환경을 제공한다. LangChain의 모듈 기반 접근 방식을 통해 개발자는 코드를 재작성할 필요 없이 다양한 프롬프트와 다른 파운데이션 모델까지 활발하게 비교할 수 있다.

(출처: https://www.ibm.com/kr-ko/topics/langchain, https://brunch.co.kr/@ywkim36/147)
⚙️CoT(Chain-of-Thought) 전략
CoT(Chain-of-Thought)는 단지 답변을 내놓기 위한 것이 아닌, 답변에 도달하는 과정을 학습시키는 것을 목적으로 본 질문 전에 미리 태스크와 추론 과정을 포함한 답변 예제를 AI에게 제공하는 프레임워크이다. 이는 복잡한 문제에 대한 단계적 추론을 가능하게 하여 해결책을 도출한다.

(출처: https://www.promptingguide.ai/kr/techniques/activeprompt)
우리 서비스에서는,
프롬프트 엔지니어링을 적용한 일부 함수의 코드를 가져왔다!
def create_diet_recommendation_prompt(prompt): # 채팅 - 식단 추천
prompt_str = ", ".join(prompt)
system_content = "You are the foremost expert in nutrition on the planet, particularly in the field of irritable bowel syndrome(IBS), through relentless research, you've attained the top position in the realm of gastrointestinal studies."
pre_prompt = "한국어로 답변해줘; 사용자가 일주일동안 다음과 같은 음식 리스트를 먹었는데, 이 음식 리스트를 기반으로 앞으로 사용자의 장건강 및 과민대장증후군을 개선해줄 수 있는 식단 하나를 추천해줘; 밥, 국, 메인 반찬, 부가 반찬, 과일을 하나씩 골라서 하나의 식단을 완성하여 추천해줘; 근거는 간단하게 1줄로 영양사가 조언해주는 느낌으로 작성해줘; 강조 표현 없이 작성해줘;\n\n"
langchain_prompt = (
"Diet recommendation prompt: Today's diet recommendation! After analyzing today's meals, it seems that {insert analysis of today's carbohydrate, protein, and sugar intake, e.g., 'the carbohydrate and sugar intake is high, while protein intake is insufficient.'} Additionally, {insert explanation whether the consumed foods are mainly high-FODMAP or low-FODMAP, e.g., 'there are many high-FODMAP foods consumed, indicating vulnerability to digestive health issues.'} Let me recommend a diet that can help improve your gastrointestinal health! [Diet Recommendation] {recommend a diet plan that can improve the user's digestive health and alleviate symptoms of irritable bowel syndrome (IBS); include one rice, one soup, one kimchi, and one side dish (e.g., 'barley rice, bean sprout soup, cabbage kimchi, stir-fried eggplant').}"
)
answer = post_gpt(system_content, pre_prompt + langchain_prompt + prompt_str, GPT_MODEL)
if answer is None or not isinstance(answer, str):
raise ValueError("GPT API의 응답이 올바르지 않습니다.")
formatted_answer = answer.replace("[식단 추천]", "\n[식단 추천]\n")
return [formatted_answer]
post_gpt 함수:create_prediction_prompt 함수:create_diet_recommendation_prompt 함수:create_food_choice_prompt 함수:/detection, /report, /recommend, /choice, /report/food, /report/defecation, /report/stress API 엔드포인트를 설정하여 클라이언트의 요청을 처리

실제 우리 서비스에 이렇게 GPT-4o 모델을 적용한 응답이 잘 반영된 것을 확인할 수 있다😁
➡️ 사용한 오픈소스 및 모듈
- FastAPI는 Python 기반의 웹 프레임워크로, 빠르고 쉽게 API를 구축하며 비동기 I/O 지원, 데이터 유효성 검사, 자동 문서 생성
- PyTorch는딥러닝 모델을 구축하고 학습 시키는데 사용함
- YOLO는 실시간 객체 탐지 알고리즘으로, 최신 버전인 버전8을 통해 더 높은 정확도와 빠른 속도를 보이며 이미지에서 객체를 빠르고 정확하게 탐지함
- Ultralytics는 YOLOv8의 개발과 배포를 담당하며 YOLO 모델을 학습, 평가, 배포하는데 필요한 다양한 도구를 제공함
- CUDA는 NVIDIA의 GPU를 사용한 병렬 계산 플랫폼으로, NVIDIA의 최신 GPU 아키텍처를 지원하며 더 빠른 연산 성능과 효율적인 메모리 사용을 제공
- Werkzeug는 Python 기반의 WSGI(웹 서버 게이트웨이 인터페이스) 유틸리티 라이브러리로 HTTP 요청과 응답을 처리하고 웹 서버와 통합할 수 있는 기능을 포함
- Uvicorn은 ASGI(비동기 서버 게이트웨이 인터페이스) 서버로, FastAPI와 같은 비동기 Python 웹 프레임워크와 함께 동작함
- OpenCV(Open Source Computer Vision Library)는 실시간 컴퓨터 비전을 위한 라이브러리로 객체 탐지 작업을 수행함
- OpenAI는 GPT 모델과 상호작용할 수 있는 라이브러리로 프롬프트 생성 및 관련 로직을 포함
- pydantic는 데이터 검증 및 설정을 위한 데이터 클래스 라이브러리로 데이터 검증 및 스키마 정의에 사용함
졸업프로젝트가 거의 마무리가 되어가고 있다! 아직 랭체인을 적용한 프롬프트 엔지니어링에는 보강할 점이 있어서 남은 기간동안 열심히 보강해서 성공적으로 마무리하고 싶다😊

기술적 내용 중에 궁금한 점이나 보완해야할 점이 있다면 댓글 달아주시면 감사하겠습니다😁