왓슨 기초

This commit is contained in:
Mingu Kim
2026-05-26 22:08:02 +09:00
parent 8a18105599
commit a1cb6fcdf9
26 changed files with 3921 additions and 0 deletions
+12
View File
@@ -0,0 +1,12 @@
,몸무게,BMI 판정,timestamp
173,85,"당신의 BMI 지수는 키 : 173, 몸무게 : 85, 판정 : 비만",2026-05-15 16:47:09.270006
173,85,"당신의 BMI 지수는 키 : 173, 몸무게 : 85, 판정 : 비만",2026-05-15 16:47:10.782534
173,85,"당신의 BMI 지수는 키 : 173, 몸무게 : 85, 판정 : 비만",2026-05-15 16:47:12.258788
200,85,"당신의 BMI 지수는 키 : 200, 몸무게 : 85, 판정 : 정상체중",2026-05-15 16:47:27.687789
200,85,"당신의 BMI 지수는 키 : 200, 몸무게 : 85, 판정 : 정상체중",2026-05-15 16:50:13.135872
200,1090,"당신의 BMI 지수는 키 : 200, 몸무게 : 85, 판정 : 정상체중",2026-05-15 16:50:16.877887
200,1090,"당신의 BMI 지수는 키 : 200, 몸무게 : 85, 판정 : 정상체중",2026-05-15 16:50:18.833742
,,,2026-05-15 16:50:23.320214
,,,2026-05-15 16:50:24.862371
,,,2026-05-15 16:50:26.797623
124,21,,2026-05-15 16:50:29.805917
1 몸무게 BMI 판정 timestamp
2 173 85 당신의 BMI 지수는 키 : 173, 몸무게 : 85, 판정 : 비만 2026-05-15 16:47:09.270006
3 173 85 당신의 BMI 지수는 키 : 173, 몸무게 : 85, 판정 : 비만 2026-05-15 16:47:10.782534
4 173 85 당신의 BMI 지수는 키 : 173, 몸무게 : 85, 판정 : 비만 2026-05-15 16:47:12.258788
5 200 85 당신의 BMI 지수는 키 : 200, 몸무게 : 85, 판정 : 정상체중 2026-05-15 16:47:27.687789
6 200 85 당신의 BMI 지수는 키 : 200, 몸무게 : 85, 판정 : 정상체중 2026-05-15 16:50:13.135872
7 200 1090 당신의 BMI 지수는 키 : 200, 몸무게 : 85, 판정 : 정상체중 2026-05-15 16:50:16.877887
8 200 1090 당신의 BMI 지수는 키 : 200, 몸무게 : 85, 판정 : 정상체중 2026-05-15 16:50:18.833742
9 2026-05-15 16:50:23.320214
10 2026-05-15 16:50:24.862371
11 2026-05-15 16:50:26.797623
12 124 21 2026-05-15 16:50:29.805917
+8
View File
@@ -0,0 +1,8 @@
image,output,timestamp
.gradio/flagged/image/6d40714a1a97620c4003/스크린샷 2026-05-15 오후 2.46.33.png,,2026-05-15 16:54:31.487199
.gradio/flagged/image/32bf3df6a53702a1bc81/스크린샷 2026-05-15 오후 2.46.33.png,"'
이미지 분석 결과
- 가로 : 1032px
- 세로 : 471px
- 이미지 모드 : RGB
",2026-05-15 16:58:37.038848
1 image output timestamp
2 .gradio/flagged/image/6d40714a1a97620c4003/스크린샷 2026-05-15 오후 2.46.33.png 2026-05-15 16:54:31.487199
3 .gradio/flagged/image/32bf3df6a53702a1bc81/스크린샷 2026-05-15 오후 2.46.33.png ' 이미지 분석 결과 - 가로 : 1032px - 세로 : 471px - 이미지 모드 : RGB 2026-05-15 16:58:37.038848
+2
View File
@@ -0,0 +1,2 @@
제품명,브랜드명,제품 특징,톤앤매너,필수 포함 키워드,브랜드 핵심 가치,output,timestamp
ㅁㅁ,,,,,,,2026-05-18 11:13:46.852604
1 제품명 브랜드명 제품 특징 톤앤매너 필수 포함 키워드 브랜드 핵심 가치 output timestamp
2 ㅁㅁ 2026-05-18 11:13:46.852604
+35
View File
@@ -0,0 +1,35 @@
여행 지역,예산(만원),여행 스타일,traval range,output,timestamp
지옥,300,휴양,1week~,"제가 여행 스캐줄러 AI로서 여행 계획을 짜겠습니다.
목적지: 지옥
여행 스타일: 휴양
기간: 1주일
비용: 300
휴양을 위한 지옥 여행 계획:
1일차:
* 출발 후 지옥 도착 (교통수단: 불편한 화산 배)
* 체크인 후 경치 좋은 호텔/리조트에서 휴식
* 지옥같은 해변에서 아름다운 석양 감상 및 따뜻한 해수욕
2일차:
* 지옥의 불타오르는 숲을 탐험하기 위한 일일 투어 시작
* 야생 동물 관찰 및 식물 멀티미디어 가이드 투어
* 소박한 지옥 요리를 즐길 수 있는 현지 레스토랑에서 저녁 식사
3일차:
* 내부 지호강을 탐험하기 위해 지옥의 유일한 지하철 라인을 이용하여 강변으로 이동
* 지옥의 역사와 문화에 대해 배울 수 있는 지역 박물관 방문
* 지옥의 남쪽 지역 발견을 위한 야외 야경 투어
4일차:
* 숲 속에 위치한 지옥의 풍경이 아름다운 수상 골프 코스에서 골프 플레이
* 식사와 즐거운 시간을 보낼 수 있는 지옥 스타일의 스파 & 웰빙 센터에서 휴식
* 현지 음악을 듣고 현지인들과 함께 즐기는 지옥의 전통 댄스 파티
5일차:
* 불타는 빙하 동굴 탐험을 위해 조용한 스노",2026-05-18 17:01:25.733778
1 여행 지역 예산(만원) 여행 스타일 traval range output timestamp
2 지옥 300 휴양 1week~ 제가 여행 스캐줄러 AI로서 여행 계획을 짜겠습니다. 목적지: 지옥 여행 스타일: 휴양 기간: 1주일 비용: 300 휴양을 위한 지옥 여행 계획: 1일차: * 출발 후 지옥 도착 (교통수단: 불편한 화산 배) * 체크인 후 경치 좋은 호텔/리조트에서 휴식 * 지옥같은 해변에서 아름다운 석양 감상 및 따뜻한 해수욕 2일차: * 지옥의 불타오르는 숲을 탐험하기 위한 일일 투어 시작 * 야생 동물 관찰 및 식물 멀티미디어 가이드 투어 * 소박한 지옥 요리를 즐길 수 있는 현지 레스토랑에서 저녁 식사 3일차: * 내부 지호강을 탐험하기 위해 지옥의 유일한 지하철 라인을 이용하여 강변으로 이동 * 지옥의 역사와 문화에 대해 배울 수 있는 지역 박물관 방문 * 지옥의 남쪽 지역 발견을 위한 야외 야경 투어 4일차: * 숲 속에 위치한 지옥의 풍경이 아름다운 수상 골프 코스에서 골프 플레이 * 식사와 즐거운 시간을 보낼 수 있는 지옥 스타일의 스파 & 웰빙 센터에서 휴식 * 현지 음악을 듣고 현지인들과 함께 즐기는 지옥의 전통 댄스 파티 5일차: * 불타는 빙하 동굴 탐험을 위해 조용한 스노 2026-05-18 17:01:25.733778
Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

+76
View File
@@ -0,0 +1,76 @@
from dotenv import load_dotenv
import os
from ibm_watsonx_ai import APIClient
from ibm_watsonx_ai import Credentials
from ibm_watsonx_ai.foundation_models import ModelInference
import gradio as gr
# .env 내용 가져오기
load_dotenv()
apikey = os.getenv("WATSONX_API_KEY")
project_id = os.getenv("WATSONX_PROJECT_ID")
watsonx_ai_url = os.getenv("WATSONX_URL")
credentials = Credentials(
url = f"{watsonx_ai_url}",
api_key = f"{apikey}",
)
client = APIClient(credentials)
model = ModelInference(
model_id="ibm/granite-4-h-small",
api_client=client,
project_id=f"{project_id}",
params = {
"max_tokens": 1000
}
)
def ad_text(name, brand_name, strength, tone, keyword, value):
system_prompt = """
1. SWOT 분석하여 광고 문구 작성해줘
"""
user_prompt=f"""
아래 내용을 참고해서 1~2줄짜리 광고 문구 5개 작성해줘.
- 제품명 : {name}
- 브랜드명 : {brand_name}
- 제품특징 : {strenghth}
- 톤앤매너 : {tone}
- 브랜드 핵심 가치 : {value}
- 필수 포함 키워드 : {keyword}
"""
messages = [
# 시스템 프롬프트
{"role" : "system", "content" : system_prompt},
{"role" : "user", "content" : user_prompt},
]
generated_response = model.chat(messages=messages)
return print(generated_response['choices'][0]['message']['content'])
demo = gr.Interface(
fn=ad_text,
inputs=[gr.Text(label = "제품명"),
gr.Text(label = "브랜드명"),
gr.Text(label = "제품 특징"),
gr.Text(label = "톤앤매너"),
gr.Text(label = "필수 포함 키워드"),
gr.Text(label = "브랜드 핵심 가치"),
],
outputs=[gr.Markdown()],
title="광고 문구 프로그램",
description="텍스트 입력 시 ai가 광고 문구를 작생해 드립니다."
)
demo.launch()
+13
View File
@@ -0,0 +1,13 @@
import gradio as gr
def greet(name, intensity):
return "Hello, " + name + "!" * int(intensity)
demo = gr.Interface(
fn=greet,
inputs=["text", "slider"],
outputs=["text"],
api_name="predict"
)
demo.launch()
+13
View File
@@ -0,0 +1,13 @@
import gradio as gr
def greet(name, grade):
return name + "" * int(grade)
demo = gr.Interface(
fn=greet,
inputs=[gr.Text(label = "음식명"), gr.Slider(1, 5, step=1, label = "만족도")],
outputs=[gr.Text(label= "만족도 출력")],
api_name="별점 리뷰 생성"
)
demo.launch()
+25
View File
@@ -0,0 +1,25 @@
import gradio as gr
def bmi_calculator(height, weight):
bmi = weight / (float(height / 100) ** 2)
if bmi < 18.5 :
result = "저체중"
elif bmi < 22.9 :
result = "정상체중"
elif bmi < 24.9 :
result = "과체중"
else :
result = "비만"
# 당신의 BMI 지수는 키 : 158, 몸무게 : 60, 판정 : 저체중
return f"당신의 BMI 지수는 키 : {height}, 몸무게 : {weight}, 판정 : {result}"
demo = gr.Interface(
fn=bmi_calculator,
inputs=[gr.Number(label = ""), gr.Number(label = "몸무게")],
outputs=[gr.Text(label= "BMI 판정")],
api_name="BMI 측정기"
)
demo.launch()
+16
View File
@@ -0,0 +1,16 @@
import gradio as gr
def predict(image):
# 이미지 width, height 정보 리턴
width, height = image.size
return f"""
이미지 분석 결과
- 가로 : {width}px
- 세로 : {height}px
- 이미지 모드 : {image.mode}
"""
interface = gr.Interface(predict, gr.Image(type="pil"), gr.Textbox())
interface.launch()
+16
View File
@@ -0,0 +1,16 @@
import gradio as gr
def process_image(editor_value):
'''
composite : 원본 그림 위에 레이어 반영한 최종 이미지
'''
image = editor_value['composite']
enhancer = ImageEnhance.Brightness(image)
result = enhancer.enhance(1.5)
return result
interface = gr.Interface(process_image, gr.ImageEditor(type="pil"), gr.Image())
interface.launch()
+14
View File
@@ -0,0 +1,14 @@
import gradio as gr
def greet(name):
return "Hello " + name + "!"
with gr.Blocks() as demo:
with gr.Row():
name = gr.Textbox(label="Name")
output = gr.Textbox(label="Output Box")
greet_btn = gr.Button("Greet")
greet_btn.click(fn=greet, inputs=name, outputs=output, api_name="greet")
demo.launch()
+49
View File
@@ -0,0 +1,49 @@
import gradio as gr # 1. 'gr' 정의 (NameError 해결)
# 응원 함수
def cheer(name, level):
return f"{name} 화이팅! " + "🥳" * int(level)
# 별점 함수
def review(name, grade):
return f"{name} " + "" * int(grade)
# BMI 함수
def bmi_calculator(height, weight):
if not height or not weight: # 입력값이 없을 때 방어
return "키와 몸무게를 모두 입력해주세요."
bmi = weight / ((height / 100) ** 2)
if bmi < 18.5: result = "저체중"
elif bmi < 22.9: result = "정상체중"
elif bmi < 24.9: result = "과체중"
else: result = "비만"
return f"결과: {result} (BMI: {bmi:.2f})"
# 인터페이스 구성
with gr.Blocks() as demo:
gr.Markdown("# 통합 도구 모음")
with gr.Tab("응원"):
c_name = gr.Textbox(label="이름")
c_level = gr.Slider(1, 5, step=1, label="응원강도")
c_out = gr.Textbox(label="결과")
gr.Button("보내기").click(fn=cheer, inputs=[c_name, c_level], outputs=c_out)
with gr.Tab("별점"):
r_name = gr.Textbox(label="음식명")
r_grade = gr.Slider(1, 5, step=1, label="만족도")
r_out = gr.Textbox(label="리뷰 결과")
# 2. 여기서 inputs에 r_name과 r_grade 두 개를 정확히 넣어줘야 합니다!
gr.Button("등록").click(fn=review, inputs=[r_name, r_grade], outputs=r_out)
with gr.Tab("BMI"):
h = gr.Number(label="키(cm)")
w = gr.Number(label="몸무게(kg)")
b_out = gr.Textbox(label="판정 결과")
gr.Button("계산").click(fn=bmi_calculator, inputs=[h, w], outputs=b_out)
# 3. 마지막에 괄호()를 붙여서 실행
demo.launch()
+11
View File
@@ -0,0 +1,11 @@
import gradio as gr
def echo(message, history):
return message
demo = gr.ChatInterface(
fn=echo, examples=["hello", "hola", "merhaba"], title="Echo Bot"
)
demo.launch()
+84
View File
@@ -0,0 +1,84 @@
from dotenv import load_dotenv
import os
from ibm_watsonx_ai import APIClient
from ibm_watsonx_ai import Credentials
from ibm_watsonx_ai.foundation_models import ModelInference
import gradio as gr
# .env 내용 가져오기
load_dotenv()
apikey = os.getenv("WATSONX_API_KEY")
project_id = os.getenv("WATSONX_PROJECT_ID")
watsonx_ai_url = os.getenv("WATSONX_URL")
credentials = Credentials(
url = f"{watsonx_ai_url}",
api_key = f"{apikey}",
)
client = APIClient(credentials)
model = ModelInference(
model_id="ibm/granite-8b-code-instruct",
api_client=client,
project_id=f"{project_id}",
params = {
"max_tokens": 1000
}
)
def code_text(text):
system_prompt = """
너는 코드 전문가임
사용자의 욕구사항을 분석하여 :
- 정확한 코드
- 실행 가능한 코드
- 가독성이 좋은 코드
- 초보자도 이해할 수 있는 설명
을 제공하세요.
[규칙]
1. 반드시 코드 블록('''')형식으로 작성
2. 코드에는 적절한 주석 포함
3. 필요한 라이브러리가 있다면 함께 설명
4. 코드 동작 원리를 간단히 설명
5. 오류 가능성이 있는 부분은 주의사항 추가
6. 사용자의 요청 언어(python, javascript 등)에 맞춰 작성
7. 불필요하게 긴 설명은 피하고 핵심 위주로 작성
[응답 형식]
1. 기능설명
2. 코드
3. 코드설명
4. 실행 결과 또는 사용 예시
"""
messages = [
# 시스템 프롬프트
{"role" : "system", "content" : system_prompt},
{"role" : "user", "content" : text},
]
generated_response = model.chat(messages=messages)
return generated_response['choices'][0]['message']['content']
demo = gr.Interface(
fn=code_text,
inputs=[
gr.Textbox(lines=10, label = "코드입력", placeholder="여기에 코드를 입력해주세요."),
],
outputs=[gr.Markdown()],
title="코드 작성 프로그램",
description="코드를 AI가 작성해드립니다."
)
demo.launch()
+23
View File
@@ -0,0 +1,23 @@
from ibm_watsonx_ai import APIClient
from ibm_watsonx_ai import Credentials
from ibm_watsonx_ai.foundation_models import ModelInference
credentials = Credentials(
url = "{watsonx_ai_url}",
api_key = "{apikey}",
)
client = APIClient(credentials)
model = ModelInference(
model_id="ibm/granite-13b-instruct-v2",
api_client=client,
project_id="{project_id}",
params = {
"max_new_tokens": 100
}
)
prompt = 'How far is Paris from Bangalore?'
print(model.generate(prompt))
print(model.generate_text(prompt))
+112
View File
@@ -0,0 +1,112 @@
from dotenv import load_dotenv
import os
from ibm_watsonx_ai import APIClient
from ibm_watsonx_ai import Credentials
from ibm_watsonx_ai.foundation_models import ModelInference
import gradio as gr
import base64
import io
import logging
# .env 내용 가져오기
load_dotenv()
apikey = os.getenv("WATSONX_API_KEY")
project_id = os.getenv("WATSONX_PROJECT_ID")
watsonx_ai_url = os.getenv("WATSONX_URL")
credentials = Credentials(
url = f"{watsonx_ai_url}",
api_key = f"{apikey}",
)
client = APIClient(credentials)
model = ModelInference(
model_id="meta-llama/llama-3-2-11b-vision-instruct",
api_client=client,
project_id=f"{project_id}",
params = {
"max_tokens": 3000
}
)
def image_to_base64(image):
"""
pillow 형식의 이미지를 가져와 원하는 포맷으로 저장
base64 인코딩 형식으로 이미지 리턴
"""
buffer = io.BytesIO()
image.save(buffer, format="PNG")
image_base64 = base64.b64encode(buffer.getvalue()).decode('utf-8')
return image_base64
def image_text(image, user_prompt):
if image is None:
return "이미지를 입력해 주세요"
# base64
base64_image = image_to_base64(image)
system_prompt = """
당신은 이미지 분석 전문가입니다.
사용자의 요청에 따라 이미지를 분석하세요.
- 이미지 설명
- 분위기 분석
- 감정 분석
- 객체 설명
- 캡션 생성
- 여행 추천
- 스타일 분석
등을 수행하세요
항상:
- 한국어로 답변
- 사용자의 요청 의도를 우선 반영
- 읽기 쉽게 작성
"""
if user_prompt is None:
user_prompt = f"""
이미지를 분석해줘.
"""
messages = [
# 시스템 프롬프트
{"role" : "system", "content" : system_prompt},
{"role" : "user", "content" : [
{
"type": "image_url",
"image_url": {
"url": f"data:image/png;base64,{base64_image}"
}
},
{
"type": "text",
"text": user_prompt
},
],
}
]
generated_response = model.chat(messages=messages)
return generated_response['choices'][0]['message']['content']
demo = gr.Interface(
fn=image_text,
inputs=[gr.Image(type="pil"),
gr.Text(label="유저 명령"),
],
outputs=[gr.Markdown()],
title="이미지 분석 프로그램",
description="이미지 업로드 시 AI가 이미지 분석"
)
demo.launch()
Binary file not shown.

After

Width:  |  Height:  |  Size: 542 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 342 KiB

+71
View File
@@ -0,0 +1,71 @@
from dotenv import load_dotenv
import os
from ibm_watsonx_ai import APIClient
from ibm_watsonx_ai import Credentials
from ibm_watsonx_ai.foundation_models import ModelInference
import gradio as gr
import logging
# .env 내용 가져오기
load_dotenv()
apikey = os.getenv("WATSONX_API_KEY")
project_id = os.getenv("WATSONX_PROJECT_ID")
watsonx_ai_url = os.getenv("WATSONX_URL")
credentials = Credentials(
url = f"{watsonx_ai_url}",
api_key = f"{apikey}",
)
client = APIClient(credentials)
model = ModelInference(
model_id="ibm/granite-4-h-small",
api_client=client,
project_id=f"{project_id}",
params = {
"max_tokens": 1000
}
)
def interview_text(genre):
system_prompt = """
인터뷰를 한다고 생각하고 대상의 주제를 가지고 일단 핵심 내용을 정리하고 인터뷰 질문을 생성해줘.
"""
user_prompt=f"""
아래 내용 참고해서
1. 장르 특징 5줄 정리
2. 인터뷰 질문 8개 작성해줘
- genre : {genre}
"""
print(genre)
messages = [
# 시스템 프롬프트
{"role" : "system", "content" : system_prompt},
{"role" : "user", "content" : user_prompt},
]
generated_response = model.chat(messages=messages)
return generated_response['choices'][0]['message']['content']
demo = gr.Interface(
fn=interview_text,
inputs=[gr.Text(label = "genre"),
],
outputs=[gr.Markdown()],
title="인터뷰 질문 생성 프로그램",
description="질문 생성"
)
demo.launch()
+65
View File
@@ -0,0 +1,65 @@
from dotenv import load_dotenv
import os
from ibm_watsonx_ai import APIClient
from ibm_watsonx_ai import Credentials
from ibm_watsonx_ai.foundation_models import ModelInference
import gradio as gr
# .env 내용 가져오기
load_dotenv()
apikey = os.getenv("WATSONX_API_KEY")
project_id = os.getenv("WATSONX_PROJECT_ID")
watsonx_ai_url = os.getenv("WATSONX_URL")
credentials = Credentials(
url = f"{watsonx_ai_url}",
api_key = f"{apikey}",
)
client = APIClient(credentials)
model = ModelInference(
model_id="ibm/granite-4-h-small",
api_client=client,
project_id=f"{project_id}",
params = {
"max_tokens": 1000
}
)
def summarize_text(text):
if not text.strip():
return "텍스트를 입력해주세요."
instructions = """
당신은 텍스트를 한국어로 요악하는 전문가이빈다.
- 당신의 임무는 아래 주어진 텍스트 문장을 한국어로 요약하는 것입니다.
- 요약 시 다음 사항을 반드시 반영해야 합니다.
- 중복된 내용은 생략하되, 반복되는 내용은 요약해서 더 강조합니다.
- 사례 중심보다는 개념과 주장 중심으로 요약합니다.
- 3줄 이내로 요약합니다.
- 블릿 기호 형식으로 작성합니다.
"""
messages = [
# 시스템 프롬프트
{"role" : "system", "content" : instructions},
{"role" : "user", "content" : text},
]
generated_response = model.chat(messages=messages)
return print(generated_response['choices'][0]['message']['content'])
demo = gr.Interface(
fn=summarize_text,
inputs=[gr.TextArea(lines=10, placeholder="요약할 내용의 텍스트 입력..", label="입력")],
outputs=[gr.Markdown()],
title="watsonx 기반의 요약 프로그램",
description="텍스트 입력 시 ai 요약"
)
demo.launch()
+83
View File
@@ -0,0 +1,83 @@
from dotenv import load_dotenv
import os
from ibm_watsonx_ai import APIClient
from ibm_watsonx_ai import Credentials
from ibm_watsonx_ai.foundation_models import ModelInference
import gradio as gr
import logging
# .env 내용 가져오기
load_dotenv()
apikey = os.getenv("WATSONX_API_KEY")
project_id = os.getenv("WATSONX_PROJECT_ID")
watsonx_ai_url = os.getenv("WATSONX_URL")
credentials = Credentials(
url = f"{watsonx_ai_url}",
api_key = f"{apikey}",
)
client = APIClient(credentials)
model = ModelInference(
model_id="ibm/granite-4-h-small",
api_client=client,
project_id=f"{project_id}",
params = {
"max_tokens": 1000
}
)
def recommend(local, money, style, day):
system_prompt = """
너는 여행 스캐줄러 AI
한글로 답변해주고
여행사의 여행 스케쥴 처럼 짜줘
"""
user_prompt=f"""
다음 내용을 참고해서 계획 짜줘
- 지역 : {local}
- 비용 :{money}
- 여행 스타일 : {style}
- 기간 :{day}
"""
messages = [
# 시스템 프롬프트
{"role" : "system", "content" : system_prompt},
{"role" : "user", "content" : user_prompt},
]
# generated_response = model.chat(messages=messages)
# return generated_response['choices'][0]['message']['content']
# chat_stream()
generated_response = model.chat_stream(messages=messages)
full_response = ""
for chunk in generated_response:
if chunk['choices'] :
full_response += chunk["choices"][0]["delta"].get("content", "")
yield full_response
demo = gr.Interface(
fn=recommend,
inputs=[
gr.Text(label = "여행 지역"),
gr.Slider(10, 300, label="예산(만원)"),
gr.Dropdown(["모험", "휴양", "문화", "음식", "액티비티"], label="여행 스타일"),
gr.Radio(["1day", "2~3day", "4~7day", "1week~"], label="traval range"),
],
outputs=[gr.Textbox(lines=5)],
title="AI 여행 플래너",
description="여행지역, 예산, 여행스타일, 여행 기간 등을 입력하면 AI가 맞춤형 여행일정을 추천해 드립니다."
)
demo.launch()
+80
View File
@@ -0,0 +1,80 @@
from dotenv import load_dotenv
import os
from ibm_watsonx_ai import APIClient
from ibm_watsonx_ai import Credentials
from ibm_watsonx_ai.foundation_models import ModelInference
import gradio as gr
import logging
# .env 내용 가져오기
load_dotenv()
apikey = os.getenv("WATSONX_API_KEY")
project_id = os.getenv("WATSONX_PROJECT_ID")
watsonx_ai_url = os.getenv("WATSONX_URL")
credentials = Credentials(
url = f"{watsonx_ai_url}",
api_key = f"{apikey}",
)
client = APIClient(credentials)
model = ModelInference(
model_id="ibm/granite-4-h-small",
api_client=client,
project_id=f"{project_id}",
params = {
"max_tokens": 1000
}
)
def recommend(message, history):
print("history :", history)
system_prompt = """
너는 여행 스캐줄러 AI
한글로 답변해주고
여행사의 여행 스케쥴 처럼 짜줘
"""
user_prompt=f"""
다음 내용을 참고해서 계획 짜줘
- 내용 : {message}
"""
messages = [
# 시스템 프롬프트
{"role" : "system", "content" : system_prompt},
# {"role" : "user", "content" : user_prompt},
]
for item in history:
content = item["content"][0]["text"]
messages.append({"role" : item["role"], "content" : content})
messages.append({"role" : "user", "content" : message})
# generated_response = model.chat(messages=messages)
# return generated_response['choices'][0]['message']['content']
# chat_stream()
generated_response = model.chat_stream(messages=messages)
full_response = ""
for chunk in generated_response:
if chunk['choices'] :
full_response += chunk["choices"][0]["delta"].get("content", "")
yield full_response
demo = gr.ChatInterface(
fn=recommend,
title="AI 여행 플래너",
description="여행지역, 예산, 여행스타일, 여행 기간 등을 입력하면 AI가 맞춤형 여행일정을 추천해 드립니다."
)
demo.launch()
+139
View File
@@ -0,0 +1,139 @@
from dotenv import load_dotenv
import os
from ibm_watsonx_ai import APIClient
from ibm_watsonx_ai import Credentials
from ibm_watsonx_ai.foundation_models import ModelInference
import gradio as gr
from PIL import Image
import base64
import io
import logging
# .env 내용 가져오기
load_dotenv()
apikey = os.getenv("WATSONX_API_KEY")
project_id = os.getenv("WATSONX_PROJECT_ID")
watsonx_ai_url = os.getenv("WATSONX_URL")
credentials = Credentials(
url = f"{watsonx_ai_url}",
api_key = f"{apikey}",
)
client = APIClient(credentials)
model = ModelInference(
model_id="meta-llama/llama-3-2-11b-vision-instruct",
api_client=client,
project_id=f"{project_id}",
params = {
"max_tokens": 1000
}
)
# 💡 복복형 이미지 변환 함수 추가
def image_to_base64(image):
buffer = io.BytesIO()
image.save(buffer, format="PNG")
return base64.b64encode(buffer.getvalue()).decode('utf-8')
def recommend(message, history):
print("history :", history)
system_prompt = """
너는 여행 스캐줄러 AI
사용자가 업로드한 이미지의
- 분위기
- 감성
- 색감
- 스타일
을 분석해서 여행지를 추천해줘
반드시
1. 이미지 분위기 분석
2. 추천 여행지
3. 추천 이유
4. 추천 활동
5. 한글로 답변
"""
user_prompt=f"""
다음 내용을 참고해서 계획 짜줘
- 내용 : {message}
"""
messages = [
# 시스템 프롬프트
{"role" : "system", "content" : system_prompt},
# {"role" : "user", "content" : user_prompt},
]
for item in history:
role = item["role"]
content = item["content"]
# assistant answer save
texts = []
if isinstance(content, list):
for c in content:
# 텍스트만 추출
if c.get("type") == "text":
texts.append(c.get("text", ""))
elif isinstance(content, str):
texts.append(content)
messages.append({"role" : role, "content" : " ".join(texts)})
# messages : text, files
text = message.get('text', '')
files = message.get('files', '')
if files:
image = Image.open(files[0])
base64_image = image_to_base64(image)
# 💡 2. 공중에 떠 있던 딕셔너리를 messages.append()로 정상 추가합니다.
messages.append({
"role" : "user",
"content" : [
{
"type": "image_url",
"image_url": {"url": f"data:image/png;base64,{base64_image}"}
},
{ "type": "text", "text": user_prompt },
],
})
else:
messages = [{"role" : "user", "content" : text}]
# generated_response = model.chat(messages=messages)
# return generated_response['choices'][0]['message']['content']
# chat_stream()
generated_response = model.chat_stream(messages=messages)
full_response = ""
for chunk in generated_response:
if chunk['choices'] :
full_response += chunk["choices"][0]["delta"].get("content", "")
yield full_response
demo = gr.ChatInterface(
fn=recommend,
multimodal=True,
title="AI 여행 플래너",
description="여행지역, 예산, 여행스타일, 여행 기간 등을 입력하면 AI가 맞춤형 여행일정을 추천해 드립니다."
)
demo.launch()
+2974
View File
File diff suppressed because it is too large Load Diff