챗GPT o1 - 얼마나 유용해진 걸까? 고급 코딩 예제 검토 - 상품추천 알고리즘
챗GPT o1 - 얼마나 유용해진 걸까? 고급 코딩 예제 검토 - 상품추천 알고리즘 코드 작성 비교 사례
간단한 비교 실험을 해본 결과이다. 과연 ChatGPT o1 모델의 강점이라고 하는 고급 코딩에서 4o 모델을 사용할때 보다 얼마나 구체적으로 좋은 결과를 제공할 것인가? 온라인 쇼핑몰 추천 시스템 로직을 예로 테스트 해본다.
[과제]
아마존과 같은 온라인 쇼핑몰을 가정하고 가장 효율적이면서 실효성 높은 상품추천 로직을 파이썬 코드로 생성하라. 최신 접근 방식을 효율성있는 버전으로 제공하라. 별도의 외부 알고리즘 없이 구현 가능한 버전을 제공하라
ChatGPT 4o의 답변 ::
아래는 아마존과 같은 온라인 쇼핑몰에서 효율적이고 실효성 높은 상품 추천 로직을 구현하는 Python 코드입니다. 이 코드는 사용자-상품 매트릭스를 활용하여 협업 필터링(Collaborative Filtering) 기반으로 추천합니다. 외부 라이브러리를 사용하지 않고 기본 Python과 Pandas로만 작성하였습니다.
import pandas as pd
import numpy as np
# 샘플 사용자-상품 구매 데이터 생성 (사용자 구매 히스토리)
data = {
'user_id': [1, 1, 1, 2, 2, 3, 3, 4, 4, 4],
'product_id': [101, 102, 103, 101, 104, 102, 105, 103, 104, 106],
'rating': [5, 4, 3, 5, 4, 4, 5, 3, 5, 4]
}
# 데이터프레임 생성
ratings = pd.DataFrame(data)
# 사용자-상품 매트릭스 생성
user_product_matrix = ratings.pivot_table(index='user_id', columns='product_id', values='rating').fillna(0)
# 코사인 유사도를 계산하는 함수 정의
def cosine_similarity(vec1, vec2):
dot_product = np.dot(vec1, vec2)
norm_vec1 = np.linalg.norm(vec1)
norm_vec2 = np.linalg.norm(vec2)
return dot_product / (norm_vec1 * norm_vec2) if norm_vec1 != 0 and norm_vec2 != 0 else 0
# 상품 간 유사도 행렬 계산
def calculate_item_similarity(matrix):
products = matrix.columns
similarity_matrix = pd.DataFrame(np.zeros((len(products), len(products))), index=products, columns=products)
for i in products:
for j in products:
if i != j:
similarity_matrix.loc[i, j] = cosine_similarity(matrix[i], matrix[j])
return similarity_matrix
item_similarity = calculate_item_similarity(user_product_matrix)
# 상품 추천 함수 정의
def recommend_products(user_id, user_product_matrix, similarity_matrix, top_n=3):
user_ratings = user_product_matrix.loc[user_id]
scores = similarity_matrix.dot(user_ratings).sort_values(ascending=False)
# 이미 구매한 상품 제외
purchased_products = user_ratings[user_ratings > 0].index
scores = scores.drop(index=purchased_products, errors='ignore')
return scores.head(top_n)
# 사용자 1번에게 추천할 상품
top_recommendations = recommend_products(1, user_product_matrix, item_similarity)
print("추천 상품:")
print(top_recommendations)
코드 설명:
- 데이터 준비:
- 사용자별로 구매한 상품과 해당 평점 데이터를 샘플로 생성했습니다.
- 사용자-상품 매트릭스:
- 행은 사용자, 열은 상품으로 구성된 매트릭스를 생성하여 평점 정보를 정리했습니다.
- 코사인 유사도:
- 상품 간의 유사도를 계산하기 위해 코사인 유사도를 활용했습니다.
- 추천 로직:
- 특정 사용자가 구매하지 않은 상품 중 유사도가 높은 상품을 추천합니다.
- 이미 구매한 상품은 제외됩니다.
- 결과:
- 사용자 1번에게 추천할 상품이 출력됩니다.
이 코드는 간단하면서도 효율적으로 상품 추천 로직을 구현하며, 사용자와 상품 간의 관계를 고려합니다. 추가적인 데이터 및 기능을 통합하면 더 정교한 추천 시스템으로 확장할 수 있습니다.
ChatGPT o1의 답변 ::
아래 예시는 **“별도의 외부 알고리즘 라이브러리를 최소화”**하면서도,
온라인 쇼핑몰(예: 아마존)에서 활용할 수 있는 기본적인 협업 필터링(User-based CF) 추천 로직을
파이썬으로 구현한 간단한 버전입니다.
- 사용자(행) × 상품(열) 형태의 평점 행렬(rating_matrix)을 입력으로 받아,
- 특정 사용자가 아직 평가하지 않은 상품들 중 예상 평점이 높은 순으로 추천합니다.
- 별도의 고도 라이브러리(예: TensorFlow, PyTorch, Surprise 등) 없이,
numpy만 사용해 핵심 로직을 직접 구현했습니다.
주의
- 실제 대형 쇼핑몰(아마존 등)은 훨씬 복잡하고 정교한 추천 로직(딥러닝, 하이브리드, 대규모 실시간 계산 등)을 사용합니다.
- 아래 코드는 학습 용도로 작성된 단순 예제이며, 실서비스 적용 시에는 데이터 전처리, 최적화, 확장성(수백만 명의 사용자, 수백만 개 상품 처리) 등이 추가 고려되어야 합니다.
import numpy as np
def cosine_similarity(vec_a: np.ndarray, vec_b: np.ndarray) -> float:
"""
두 벡터 간 코사인 유사도를 계산합니다.
vec_a, vec_b: 1차원 numpy 배열
return: 0~1 범위 내 코사인 유사도
"""
norm_a = np.linalg.norm(vec_a)
norm_b = np.linalg.norm(vec_b)
if norm_a == 0 or norm_b == 0:
return 0.0
return float(np.dot(vec_a, vec_b) / (norm_a * norm_b))
def predict_rating_user_based(rating_matrix: np.ndarray, target_user_id: int, item_id: int, top_n_sim: int = 5) -> float:
"""
User-based 협업 필터링을 사용하여 target_user_id가 item_id에 매길 예상 평점을 계산합니다.
rating_matrix: 2차원 numpy 배열, shape = (num_users, num_items)
0이면 미평가(또는 결측치)로 가정
target_user_id: 예측을 진행할 사용자 인덱스
item_id: 예측할 상품 인덱스
top_n_sim: 비슷한 상위 사용자 n명만 고려
return: 예측 평점(평균 가중치 기반)
"""
# 만약 이미 평점을 매긴 상품이라면, 해당 값을 그대로 반환
if rating_matrix[target_user_id, item_id] != 0:
return rating_matrix[target_user_id, item_id]
target_user_vector = rating_matrix[target_user_id, :]
# 모든 다른 사용자들과의 유사도 계산
similarities = []
for other_user_id in range(rating_matrix.shape[0]):
if other_user_id == target_user_id:
continue
other_user_vector = rating_matrix[other_user_id, :]
# 실제로 item_id에 대한 평가가 있는 사용자만 유사도 대상
if other_user_vector[item_id] == 0:
# 해당 상품 평점 정보가 없으면 스킵
continue
sim = cosine_similarity(target_user_vector, other_user_vector)
similarities.append((other_user_id, sim))
# 유사도 순으로 정렬 후 상위 n명의 사용자만 추출
similarities.sort(key=lambda x: x[1], reverse=True)
top_similar_users = similarities[:top_n_sim]
# 예측 평점 계산 (유사도 가중 평균)
weighted_sum = 0.0
sim_sum = 0.0
for (u_id, sim) in top_similar_users:
# 다른 사용자의 실제 평점
user_rating = rating_matrix[u_id, item_id]
weighted_sum += sim * user_rating
sim_sum += sim
if sim_sum == 0:
# 유사한 사용자가 없을 경우 예측 불가하므로, 기본값(예: 평균 3.0) 사용 가능
return 3.0
return weighted_sum / sim_sum
def recommend_products_user_based(rating_matrix: np.ndarray, target_user_id: int, top_k: int = 5) -> np.ndarray:
"""
target_user_id에게 추천할 상품을 상위 top_k 개 반환합니다.
rating_matrix: 2차원 numpy 배열, shape = (num_users, num_items)
0이면 미평가(또는 결측치)로 가정
target_user_id: 추천을 진행할 사용자 인덱스
top_k: 추천할 상품 개수
return: (상품 인덱스, 예상 평점)의 튜플을 평점이 높은 순으로 top_k 개 추출한 배열
"""
num_items = rating_matrix.shape[1]
predictions = []
# 사용자에게 아직 평점이 없는(item_rating == 0) 상품들에 대해 예상 평점 산출
for item_id in range(num_items):
if rating_matrix[target_user_id, item_id] == 0:
pred = predict_rating_user_based(rating_matrix, target_user_id, item_id, top_n_sim=5)
predictions.append((item_id, pred))
# 예측 평점 기준 내림차순 정렬 후 상위 top_k 추출
predictions.sort(key=lambda x: x[1], reverse=True)
return predictions[:top_k]
# ----------------------
# 사용 예시 (테스트용)
# ----------------------
if __name__ == "__main__":
# 예시 평점 행렬 (총 5명 사용자 × 6개 상품)
# 0 = 아직 평점을 남기지 않은 경우(미평가)
rating_data = np.array([
[5, 4, 0, 0, 1, 0], # 사용자 0
[4, 0, 4, 1, 1, 0], # 사용자 1
[0, 4, 3, 1, 0, 2], # 사용자 2
[5, 0, 0, 3, 2, 0], # 사용자 3
[0, 3, 4, 0, 0, 4], # 사용자 4
], dtype=np.float32)
target_user_id = 0
top_k = 3
recommendations = recommend_products_user_based(rating_data, target_user_id, top_k)
print(f"사용자 {target_user_id}에게 추천할 상품 Top-{top_k}:")
for (item_idx, est_rating) in recommendations:
print(f" - 상품 {item_idx} 예상 평점: {est_rating:.2f}")
코드 설명
- cosine_similarity(vec_a, vec_b)
- 두 사용자(또는 두 아이템)의 평가 벡터 간 코사인 유사도를 계산하는 함수입니다.
- 값이 1에 가까울수록 두 벡터의 방향이 유사하다고 간주합니다.
- predict_rating_user_based(...)
- 협업 필터링에서 target_user_id가 아직 평가하지 않은 상품(item_id)의 평점을 예측합니다.
- 전체 사용자 중, 해당 상품에 대해 실제로 평점을 매긴 사용자들의 벡터와 코사인 유사도를 구합니다.
- 유사도 상위 n명의 평점을 가중평균하여 예측값을 산출합니다.
- recommend_products_user_based(...)
- target_user_id가 평점을 남기지 않은 모든 상품을 대상으로, 위 predict_rating_user_based 함수를 호출해 예상 평점을 구합니다.
- 이 중 예상 평점이 높은 순서로 상위 top_k개 상품을 추천합니다.
- 테스트용 메인코드
- 5명의 사용자 × 6개의 상품에 대한 평점을 가상 행렬(rating_data)로 표현했습니다.
- recommend_products_user_based(rating_data, 0, 3) 호출 시, 사용자 0에게 상위 3개 상품을 추천합니다.
개선 및 확장 아이디어
- Item-based CF
- 위 코드를 “사용자 유사도” 대신 “상품(아이템) 간 유사도”에 기반해 예측하도록 바꾸면, 비슷한 상품을 찾아 추천하는 아이템 기반 협업 필터링을 구현할 수 있습니다.
- 하이브리드(hybrid) 접근
- 상품의 카테고리, 텍스트(리뷰, 설명), 이미지 등 콘텐츠 기반 정보와 협업 필터링을 결합하면 더욱 정교한 추천이 가능합니다.
- 대규모 데이터 처리
- 실제 쇼핑몰에서는 수백만~수억건의 평가 데이터를 다뤄야 합니다. 이 경우 Spark, Dask 같은 분산 환경을 활용하거나, 최적화된 C++/GPU 기반의 라이브러리(또는 딥러닝 모델)로 확장해야 합니다.
- 실시간 추천
- 신상품 등록, 사용자 행동 로그가 지속적으로 생성될 때, 온라인·실시간으로 모델을 갱신하거나 Embedding을 업데이트하는 시스템이 필요합니다.
위 코드는 최소한의 알고리즘 구현만 보여주는 베이스라인 예시로,
실제 대용량 환경에선 더 많은 고려사항(메모리, 로딩 속도, 최신성, 확장성 등)이 필요합니다.
그러나 기본 원리를 이해하고, 추가 최적화나 딥러닝·하이브리드로 발전시키는 출발점으로 활용할 수 있습니다.
[참고]
ChatGPT o1은 고도화된 추론 능력을 갖추고 있어, 이전 모델인 ChatGPT 4o에 비해 복잡한 문제를 단계별로 해결하거나, 심층적인 분석 및 추론 작업을 수행하는 데 뛰어납니다. 하지만 파일 업로드를 기반으로 한 데이터 분석은 ChatGPT o1에서 기본적으로 제공되지 않습니다. 이는 다음과 같은 중요한 차이를 만들어 냅니다:
구체적 차이:
- 파일 업로드와 데이터 처리의 제한:
- ChatGPT 4o와 o1 모두 내장된 파일 업로드 기능 없이 데이터 분석을 수행할 수 없습니다. 따라서 외부 데이터를 분석하기 위해서는 사용자가 데이터를 텍스트 형태로 직접 입력하거나, 외부 도구를 활용해야 합니다.
- 복잡한 데이터 분석 가능성:
- ChatGPT o1의 강점은 외부 도구 없이도 제공된 텍스트 데이터를 추론적으로 분석하거나 다단계 사고를 통해 데이터를 해석하는 데 있습니다.
- 하지만 대량의 데이터나 파일 기반 데이터 분석은 별도의 파일 업로드 기능을 가진 고급 모델(GPT-4o Advanced Data Analysis)이나 외부 파이썬 기반 솔루션을 필요로 합니다.
- 실제 업무 활용:
- o1의 적용 가능성은 데이터 파일이 아닌 비정형 데이터 입력을 기반으로 한 복잡한 계산, 논리적 문제 해결, 및 텍스트 기반 데이터 분석에 국한됩니다.
- 반면, 파일 업로드가 필요한 작업(예: CSV 분석, 대규모 데이터 세트 처리 등)은 해당 기능을 제공하는 환경에서만 가능합니다.
-----------
#챗gpt #gpt #AI #챗gpt #AI활용
#전용준 #리비젼 #리비젼컨설팅 #promptstrategies