91 lines
3.8 KiB
Python
91 lines
3.8 KiB
Python
import requests
|
||
import google.generativeai as genai
|
||
|
||
def download_image(image_url):
|
||
"""이미지 URL에서 이미지를 다운로드하고 바이트 데이터를 반환합니다."""
|
||
response = requests.get(image_url)
|
||
response.raise_for_status() # 에러가 발생했을 경우 예외를 발생시킵니다.
|
||
return response.content
|
||
|
||
|
||
def main(image_url='https://file.percenty.co.kr/public/652bed8e865b1f32ea62bf1f/products/65df13cf5860eb317389438b/1d439045-b47b-4c4a-994b-11bb2862a6d4.jpg', title='동축케이블압착기', top_k=3):
|
||
api_key = 'AIzaSyCER9mD617P5OGaoHCK7drsTkmXUIzFn4U' # 실제 API 키로 교체하세요.
|
||
genai.configure(api_key=api_key)
|
||
model = genai.GenerativeModel('gemini-pro-vision')
|
||
|
||
prompt = f"이미지의 상품명은 {title} 1. 이 상품이 무엇인지, 어떤 용도로 사용하는지 설명해줘 2. 이 상품의 배송비 산정을 위해 대략적인 무게를 kg으로 단답형으로 추정해줘. 3. 이 이미지의 상품을 한국의 온라인 쇼핑몰에서 팔기위한 홍보문구를 상품이미지에 맞게 3줄 ~ 4줄 정도 만들어줘. 4.대답하는 방식은 [상품의 홍보문구] 여러줄, [상품의 용도] 자세히, [상품의 무게] 형식과 순서로 해줘."
|
||
|
||
try:
|
||
image_data = download_image(image_url)
|
||
response = model.generate_content([prompt, {"mime_type": "image/jpeg", "data": image_data}])
|
||
|
||
# 후보 결과 확인 및 처리
|
||
if response.candidates and len(response.candidates) > 0:
|
||
print(f"{response.text}")
|
||
return response.text
|
||
else:
|
||
# 후보 결과가 없거나 유효하지 않을 경우 기본 응답 반환
|
||
return '''
|
||
### 상품의 용도\n\n
|
||
- 에러 발생: 유효한 상품 설명을 제공할 수 없습니다.\n\n
|
||
### 상품의 홍보문구\n\n
|
||
- 에러 발생: 유효한 홍보문구를 제공할 수 없습니다.\n\n
|
||
### 상품의 무게\n\n
|
||
- 에러 발생: 유효한 상품 무게를 제공할 수 없습니다.
|
||
'''
|
||
|
||
except ValueError as e:
|
||
print(f"오류 발생: {e}", exc_info=True)
|
||
return "오류 발생: 유효한 응답을 생성할 수 없습니다."
|
||
except Exception as e:
|
||
print(f"예상치 못한 오류 발생: {e}", exc_info=True)
|
||
return "예상치 못한 오류 발생: 처리할 수 없습니다."
|
||
|
||
def _process_description(description):
|
||
"""
|
||
Gemini에서 추출한 설명을 필요한 형식으로 가공합니다.
|
||
|
||
Args:
|
||
description: Gemini에서 추출한 설명
|
||
|
||
Returns:
|
||
필요한 형식으로 가공된 설명
|
||
"""
|
||
processed_description = description
|
||
# # 불필요한 문자열 제거
|
||
# processed_description = description.replace("**", "").replace("**", "")
|
||
|
||
# # 줄 바꿈 문자 변경
|
||
# processed_description = processed_description.replace("\n", "<br>")
|
||
|
||
# 필요한 답변 형식에 맞게 정렬
|
||
answer = "### 상품의 용도\n\n"
|
||
answer += processed_description.split("###")[1]
|
||
answer += "\n\n### 상품의 홍보문구\n\n"
|
||
answer += processed_description.split("###")[2]
|
||
answer += "\n\n### 상품의 무게\n\n"
|
||
answer += processed_description.split("###")[3]
|
||
|
||
return answer
|
||
|
||
def _validate_description(description):
|
||
"""
|
||
Gemini에서 추출한 설명을 검사하여 유효한지 확인합니다.
|
||
|
||
Args:
|
||
description: Gemini에서 추출한 설명
|
||
|
||
Returns:
|
||
True - 유효한 설명, False - 유효하지 않은 설명
|
||
"""
|
||
|
||
# 필요한 정보가 모두 포함되어 있는지 확인
|
||
if not all(x in description for x in ["상품의 홍보문구", "상품의 용도", "상품의 무게"]):
|
||
return False
|
||
|
||
# ... 추가적인 유효성 검사 코드
|
||
|
||
return True
|
||
|
||
if __name__ == "__main__":
|
||
main() |