1차 과제 응용 - 충동구매인지 판단해주는 AI

들어가며

안녕하세요! 이번 11기 랭체인 캠프에 참여하는 김채정입니다.😄
저는 완전 개발자는 아니어서 주로 OpenAI 에서 제공하는 API를 직접 써서 코드를 작성하는 경우가 많았습니다. 그래서 사람들이 랭체인을 왜 활용하는지, 뭐가 좋은지를 알고 싶어서 이번 캠프를 신청하게 됐습니다.

랭체인은 처음이라 간단하게 익혀본다 생각하고 1,2차 과제를 해보면서 떠오른 아이디어를 간단한 장난감 느낌으로 만들어봤습니다.


😎 충동구매인지 판단해주는 AI란?

사고 싶은 물건과, 사고 싶은 이유에 대해서 짠돌이와 욜로족이 의견을 제시합니다. 극과 극의 의견을 읽어보고 종합하여 최종적으로 구매해도 괜찮을지 의견을 정리하여 제시해줍니다.

평소에 친구들끼리 ‘이거 사도 돼?’ 혹은 ‘이거 사는 거 어떻게 생각해?’라고 물어보는 경우가 많은데(보통은 답정너죠 ㅎㅎ) “분기 및 병합을 활용한 체인 구성”과제를 하면서 만들어보면 재밌겠다는 생각이 들었습니다 ㅎㅎ


🛠️ 구현

STEP 1. 프롬프트를 세팅합니다.
짠돌이, 욜로족, 중재자의 role 세팅을 진행하고, 사고 싶은 물건과 이유를 문맥으로 받아들일 수 있도록 프롬프트를 작성해주었습니다.

STEP 2. 모델을 세팅합니다.
짠돌이와 욜로족은 temperature를 1로 부여했고, 중재자는 조금 낮게 부여했습니다.

STEP 3. 파서를 세팅합니다.
결과물 파싱을 위해 파서를 지정합니다.

STEP 4. Chain을 연결합니다.
프롬프트템플릿 | 모델 | 파서 형식으로 작성합니다.

from langchain_core.prompts import PromptTemplate # 프롬프트
from langchain_openai import ChatOpenAI #LLM
from langchain_core.output_parsers import StrOutputParser # 문자열 파싱(문자열 정보로 가져올 수 있게)

### 대화 진행 ###
# 1. 사고 싶은 물건, 사고자 하는 이유에 대해 의견을 물어봄(짠돌이, 욜로족)
# 2. 의견을 취합하여 구매지수 계산(10점 만점에 8점 이상일 경우 구매 윤허!)
################

# Step 1. 프롬프트 엔지니어링
## 짠돌이 프롬프트
prompt1 = '''당신은 최대한 구매를 하지 않고, 절약을 원하는 사람입니다. 
따라서, 물건을 구매할 때도 정말 필요한 물건인지, 구매 이후에 충분히 활용할 물건인지 등의 실용성을 따지고 가격이 적절한지 판단하여 구매할지 말지를 결정합니다.
아래 #상황을 읽고 물건을 구매하는 게 괜찮을지 의견을 300자 이내로 남겨주세요.

# 상황
사고 싶은 물건 : {wantToBuy}
사고 싶은 이유 : {Reason}
'''
prompt_jjandol = PromptTemplate.from_template(prompt1)


## 욜로족 프롬프트
prompt2 = '''당신은 흥미로운 물건이나, 취미가 생기면 충분한 소비, 지출을 하는 사람입니다. 
따라서 물건을 구매할 때 쉽게 구매하려는 성향이고, 절약보다는 물건을 구매함으로써 얻을 수 있는 작은 행복에 더 초점을 맞추는 편입니다. 
아래 #상황을 읽고 물건을 구매하는 게 괜찮을지 의견을 300자 이내로 남겨주세요.

# 상황
사고 싶은 물건 : {wantToBuy}
사고 싶은 이유 : {Reason}
'''
prompt_yolo = PromptTemplate.from_template(prompt2)

## 의사결정 프롬프트
prompt3 = '''당신은 현명한 중재자입니다. 물건을 구매할 지 말지에 대해 현명한 결론을 내릴 수 있습니다. 
#상황에 따른 2가지 의견을 차근차근 읽어보고 물건 구매에 대한 최종 의견을 남겨주세요. 
그리고 10점을 만점으로 하여 물건을 구매해도 괜찮은지 점수를 매겨 답변 마지막에 적어주세요.

# 상황
사고 싶은 물건 : {wantToBuy}
사고 싶은 이유 : {Reason}

# 의견1
{jjandol}

# 의견2
{yolo}'''
prompt_summary = PromptTemplate.from_template(prompt3)

# Step 2. 모델 세팅
# 의견 받는 모델
reasoning_model = ChatOpenAI(
    temperature= 1.0, # 최대한 독특한 의견을 들어보고 싶네요 :)
    model_name = "gpt-4o"
)
summary_model = ChatOpenAI(
    temperature= 0.1,
    model_name = "gpt-4o"
)

# Step 3. 파서 세팅
parser = StrOutputParser()

# Step 4. Chain 생성
# 추후에는 입력 받는 느낌으로 작성하면 좋겠네요 :)
wantToBuy = "사운드바"
Reason = "데스크탑을 샀는데, 이어폰으로만 소리를 들으려니 귀가 아파요"

jjandol_chain = prompt_jjandol | reasoning_model | parser
yolo_chain = prompt_yolo | reasoning_model | parser
summary_chain = prompt_summary | summary_model | parser

judgement = summary_chain.invoke({"wantToBuy" : wantToBuy, "Reason" : Reason, "jjandol" : jjandol_chain, "yolo" : yolo_chain})

결과

의견 1: 절약을 중시하는 관점

사운드바를 구매하는 것은 데스크탑 사용 시 이어폰으로 인한 귀의 피로를 줄이는 데 도움이 될 수 있습니다. 그러나, 사운드바가 정말 필요한지 다시 한 번 생각해볼 필요가 있습니다. 현재 이어폰을 사용하고 있다면, 이어폰 대신 사용할 수 있는 다른 대안이 있는지 고려해보세요. 예를 들어, 기존에 가지고 있는 스피커가 있다면 그것을 활용할 수 있을 것입니다. 또한, 사운드바의 가격이 적절한지, 예산 내에서 감당할 수 있는지 확인해보세요. 만약 사운드바가 고가의 제품이라면, 저렴한 대안이나 중고 제품을 찾아보는 것도 좋은 방법입니다. 사운드바를 구매한 후 충분히 활용할 수 있을지, 그리고 장기적으로 봤을 때 가치가 있는지 신중하게 판단해보세요.

의견 2: 소비를 즐기는 관점

사운드바를 구매하는 것은 데스크탑 사용 시 이어폰으로 인한 귀의 피로를 줄이는 데 큰 도움이 될 것입니다. 사운드바는 더 나은 음질을 제공하며, 영화나 음악 감상 시 더욱 풍부한 경험을 선사할 수 있습니다. 또한, 사운드바를 통해 데스크탑 사용 환경을 개선하면 작업 효율성도 높아질 수 있습니다. 사운드바는 단순한 소리 출력 장치가 아니라, 일상 생활의 질을 높이는 데 기여할 수 있는 물건입니다. 만약 예산에 큰 무리가 가지 않는다면, 사운드바를 구매하여 작은 행복을 누리는 것도 좋은 선택일 것입니다. 특히, 음악이나 영화를 자주 즐기는 사람이라면 사운드바는 충분히 가치 있는 투자입니다.

최종 의견

두 가지 의견을 종합해보면, 사운드바는 데스크탑 사용 시 이어폰으로 인한 귀의 피로를 줄이고, 더 나은 음질을 제공하여 일상 생활의 질을 높일 수 있는 유용한 물건입니다. 예산에 큰 무리가 가지 않는다면, 사운드바를 구매하는 것은 좋은 선택일 것입니다. 다만, 가격이 부담스럽다면 저렴한 대안이나 중고 제품을 고려해보는 것도 좋습니다.

구매 점수: 8/10

8점이나 줬으니 구매해도 괜찮겠네요😊


💡 랭체인 기초를 익혀보며 느낀점

  • Output 컨트롤이 편해질 것 같지만, 프롬프트 엔지니어링도 중요
    랭체인 OT를 듣고 파서와, 데이터로더 쪽에 굉장히 흥미가 생겼습니다. 평소에 업무상으로 ChatGPT API를 썼을 때, output을 컨트롤하기가 상당히 까다로웠거든요(거의 휴먼 피드백이었습니다..). 이번에 파서에 집중한 과제는 없어서 일반적인 문자열파서를 썼는데, 첫번째 체인의 답변을 두번째 체인의 맥락으로 넣을 때, Output 형태를 잘 고려하는 게 좋겠다는 생각이 들더라구요. 프롬프트 엔지니어링 + 랭체인 파서를 활용하면 효율적으로 토큰 관리가 가능할 것 같습니다.

# 2. 여러 Chain을 연결하여 복잡한 질문에 답하기 수행 중에 있었던 일입니다.
# 프롬프트를 조금 더 자세히 쓰면 좋겠지만, 랭체인이 메인이어서 대충 작성했었습니다 ㅎㅎ

# TRIAL 1
# Step 1. 프롬프트 세팅
prompt1 = "{food}와 같이 먹으면 좋은 음식 중 간편하게 만들어 먹을 수 있는 음식을 1개 추천해주세요."
###
답변 : 
### 

prompt2 = "{rec_food}의 레시피를 알려주세요. 이때 {language}로 설명해주세요."

# TRIAL 2
# Step 1. 프롬프트 세팅(답변 형식 요구문 추가)
prompt1 = "{food}와 같이 먹으면 좋은 음식 중 간편하게 만들어 먹을 수 있는 음식을 1개 추천해주세요. 답변은 음식이름만 적어주세요."
prompt2 = "{rec_food}의 레시피를 알려주세요. 이때 {language}로 설명해주세요." 

TRIAL 1의 첫번째 프롬프트의 결과

바지락칼국수(food = ‘바지락칼국수’)와 함께 먹기 좋은 간편한 음식으로는 "김치전"을 추천드립니다. 김치전은 바지락칼국수의 시원하고 담백한 맛과 잘 어울리며, 만들기도 비교적 간단합니다. 아래는 김치전의 간단한 레시피입니다:

### 김치전 레시피

재료:

- 신 김치 1컵 (잘게 썬 것)

- 부침가루 1컵

- 물 1컵

- 고춧가루 1큰술 (선택 사항)

- 식용유

만드는 방법:

1. 큰 볼에 부침가루와 물을 넣고 잘 섞어 반죽을 만듭니다.

2. 잘게 썬 김치를 반죽에 넣고 고루 섞어줍니다. (고춧가루를 추가하면 더 매콤한 맛을 낼 수 있습니다.)

3. 프라이팬에 식용유를 두르고 중간 불로 예열합니다.

4. 반죽을 프라이팬에 얇게 펴서 부칩니다.

5. 앞뒤로 노릇노릇하게 익을 때까지 부칩니다.

6. 완성된 김치전을 접시에 담아 바지락칼국수와 함께 즐깁니다.

김치전은 바삭하고 매콤한 맛이 바지락칼국수의 담백함과 잘 어울려 식사의 풍미를 더해줍니다. 간단하게 만들 수 있으니 한 번 시도해 보세요!

사실, ‘김치전’이라는 답변만 얻고 싶었는데 레시피까지 알려줘버렸네요😅 이렇게 되면, 두번째 prompt인 rec_food 변수에 위 내용이 전부 들어가게 되니까, 필요 없는 토큰 사용으로 API 비용만 늘어나게 될 것 같았습니다.


  • 확실히 코드가 가벼워지는 느낌입니다.
    AssistantAPI를 직접 써보진 않아서 비교가 어렵지만, 랭체인의 ‘메모리’ 기능을 넣는 과정이 상당히 간단했습니다. 보자마자 챗봇 구성이 쉬워지겠다는 생각이 들었습니다 ㅎㅎ AssistantAPI와의 차이점도 궁금하네요!

  • 요즘 많은 기업들이 RAG에 대한 니즈가 상당히 많은데, PoC 단계에서 랭체인을 활용하면 개발 요소에 대해서는 빠르게 진행해볼 수 있겠다는 생각이 들었습니다.

🔗참고 URL


#11기 랭체인


7

👉 이 게시글도 읽어보세요