File size: 6,139 Bytes
829f184
91a314b
6b3d94e
cc9698d
0468ba6
f4de003
e90a597
91a314b
829f184
88c0d7a
 
91a314b
 
 
 
 
 
 
 
 
 
829f184
91a314b
f6ed87b
91a314b
4e0dc16
f6ed87b
 
 
 
 
 
 
 
 
 
 
9447f48
a526f83
123222c
f6ed87b
 
9447f48
123222c
9447f48
 
 
 
 
91a314b
768f592
91a314b
 
5dec5f3
88c0d7a
829f184
4e0dc16
 
 
611b2bc
 
 
 
 
 
 
 
 
91a314b
6085307
611b2bc
4e0dc16
65e42f5
4e0dc16
 
 
 
 
65e42f5
4e0dc16
65e42f5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
433862c
 
8d8ecfd
433862c
fba47b5
433862c
ba7c97e
 
 
 
 
 
 
7f63595
0b3b25a
b3e883e
06d682a
75f1f3d
 
 
5dec5f3
bf7719a
5dec5f3
 
 
 
 
90f0234
 
 
 
 
4e0dc16
81305b7
 
 
bf7719a
 
 
81305b7
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
import streamlit as st
import pandas as pd
import openai
import os
import instructions

# OpenAI API ์„ค์ •
openai.api_key = os.getenv("OPENAI_API_KEY")

st.set_page_config(layout="wide")

# ํŒŒ์ผ ์—…๋กœ๋“œ ๋ฐ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜
def upload_and_process_file():
    uploaded_file = st.file_uploader("์ด์ „ ์ƒํ™œ๊ธฐ๋ก๋ถ€ ํŒŒ์ผ ์—…๋กœ๋“œ", type=['csv', 'json'])
    if uploaded_file is not None:
        if uploaded_file.type == 'text/csv':
            data = pd.read_csv(uploaded_file)
        elif uploaded_file.type == 'application/json':
            data = pd.read_json(uploaded_file)
        return data
    return None

# ์ƒํ™œ๊ธฐ๋ก๋ถ€ ๋ฌธ๊ตฌ ์ƒ์„ฑ ํ•จ์ˆ˜
def generate_living_record(data, selected_instruction, subjects=None, major=None):
    data_str = str(data)
    
    if selected_instruction == "์ค‘ยท๊ณ ๋“ฑํ•™๊ต" and subjects and major:
        # ์„ ํƒ๋œ ๊ต๊ณผ๋ชฉ๋“ค์„ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜
        subjects_str = ", ".join(subjects)
        # instruction ๋ฌธ์ž์—ด ํฌ๋งคํŒ…
        instruction_text = instructions.highschool_instruction.format(
            subjects=subjects_str,
            major=major
        )
    else:
        instruction_text = instructions.instruction
        
    response = openai.ChatCompletion.create(
        model="gpt-4o-mini",
        messages=[
            {"role": "system", "content": instruction_text},
            {"role": "user", "content": data_str}
        ],
        temperature=0.7,
        max_tokens=10000,
        top_p=1,
        frequency_penalty=0,
        presence_penalty=0
    )
    return response.choices[0].message.content

# Streamlit ์•ฑ ๊ตฌ์„ฑ
st.title("์ƒํ™œ๊ธฐ๋ก๋ถ€ ์ƒ์„ฑ ์„œ๋น„์Šค")
st.write("๊ธฐ๋ก ์ž๋ฃŒ๊ฐ€ ๋‹ด๊ธด CSVํŒŒ์ผ ์—…๋กœ๋“œ, ์ง์ ‘ ๊ธฐ๋ก์„ ์ž…๋ ฅ, ํ‚ค์›Œ๋“œ๋ฅผ ์„ ํƒํ•˜์—ฌ ์ƒํ™œ๊ธฐ๋ก๋ถ€ ์ž‘์„ฑ์— ํ•„์š”ํ•œ ๊ด€์ฐฐ ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.")
st.write("GPT๋Š” ์‹ค์ˆ˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค์ง€ ์•Š๋Š”๋‹ค๋ฉด ์ƒ์„ฑ ๋ฒ„ํŠผ์„ ๋‹ค์‹œ ๋ˆŒ๋Ÿฌ๋ณด์„ธ์š”.")

# ํ•™๊ต๊ธ‰ ์„ ํƒ ๋ผ๋””์˜ค ๋ฒ„ํŠผ
school_level = st.radio("ํ•™๊ต๊ธ‰ ์„ ํƒ", ["์ดˆ๋“ฑํ•™๊ต", "์ค‘ยท๊ณ ๋“ฑํ•™๊ต"])

# ์ค‘ยท๊ณ ๋“ฑํ•™๊ต ์„ ํƒ ์‹œ ์ถ”๊ฐ€ ์ž…๋ ฅ ํ•„๋“œ
subjects = None
major = None
if school_level == "์ค‘ยท๊ณ ๋“ฑํ•™๊ต":
    subject_options = ["๊ตญ์–ด", "์ˆ˜ํ•™", "์˜์–ด", "์‚ฌํšŒ", "๊ณผํ•™", "์Œ์•…", "๋ฏธ์ˆ ", "์ฒด์œก", 
                      "์ •๋ณด", "๊ธฐ์ˆ ๊ฐ€์ •", "์ œ2์™ธ๊ตญ์–ด", "ํ•œ๋ฌธ"]
    subjects = st.multiselect("๊ต๊ณผ๋ชฉ ์„ ํƒ", subject_options)
    major = st.text_input("ํฌ๋ง์ „๊ณต")

uploaded_data = upload_and_process_file()


# ๋‚˜๋จธ์ง€ ์ฝ”๋“œ๋Š” ๋™์ผํ•˜๊ฒŒ ์œ ์ง€...
attitude_keywords = [
    "์ง‘์ค‘๋ ฅ", "๊ณผ์ œ ์ดํ•ด", "๋ฐœํ‘œ", "๋ฌธ์ œ ํ•ด๊ฒฐ๋ ฅ", "๊ณผ์ œ ์ˆ˜ํ–‰", "๊ด€์ฐฐ๋ ฅ",
    "ํƒ๊ตฌ๋ ฅ", "์ž๊ธฐ ์ƒ๊ฐ ํ‘œํ˜„", "๋…ผ๋ฆฌ์  ์‚ฌ๊ณ ๋ ฅ", "์šด๋™์‹ ๊ฒฝ", "ํ˜‘๋™์‹ฌ",
    "๋ฆฌ๋”์‰ฝ", "๋…ผ๋ฆฌ์  ๋น„ํŒ๋ ฅ", "๊ต๊ณผ ํ•™์Šต ์„ฑ์ทจ๋„", "๋ชฉํ‘œ์˜์‹", "๊ธฐ๋ณธ ํ•™์Šต",
    "๋„์ „ ๊ณผ์ œ", "๋ฏธ์  ๊ฐ๊ฐ", "์˜ˆ์ˆ ์  ์žฌ๋Šฅ", "์Œ์•…์  ์žฌ๋Šฅ", "ํ˜ธ๊ธฐ์‹ฌ",
    "์งˆ๋ฌธ", "๋ชจ๋‘ ํ™œ๋™"
]

relationship_keywords = [
    "ํ˜‘๋™์„ฑ", "์นœ์ ˆํ•จ", "๊ณต๊ฐ ๋Šฅ๋ ฅ", "์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜", "๋ฆฌ๋”์‹ญ", "๊ฒฝ์Ÿ", "ํ˜‘๋ ฅ",
    "์ธ์ •์š•๊ตฌ", "์˜์‚ฌ์†Œํ†ต ๋ฌธ์ œ", "์‹ ๋ขฐ", "์ƒํ˜ธ์กด์ค‘", "๊ณต์œ ", "์ดํ•ด์‹ฌ", "์นœ๋ฐ€ํ•จ",
    "์ง€์ง€ํ•จ", "๋„์›€", "๋ฐฐ๋ ค", "๊ฑฐ๋ถ€", "๋น„๋ฐ€", "์ž๊ธฐ์ค‘์‹ฌ์ ", "์™ธ๋กœ์›€", "๋น„๋‚œ",
    "๋ฌด๊ด€์‹ฌ", "์งˆํˆฌ", "๊ฐˆ๋“ฑ", "๊ต๋ฅ˜ ํ™œ๋ฐœํ•จ", "์†Œํ†ต ์ž˜ํ•จ", "๋‹ค์ •ํ•จ"
]

personality_keywords = [
    "์ž์‹ ๊ฐ", "์ฑ…์ž„๊ฐ", "ํฌ์šฉ๋ ฅ", "๊ธ์ •์  ํƒœ๋„", "์œ ์—ฐ์„ฑ",
    "๊ฐ์ˆ˜์„ฑ", "์˜ˆ๋ฏผํ•จ", "ํ™œ๋ฐœํ•จ", "์ฐจ๋ถ„ํ•จ", "์ ๊ทน์ ",
    "์†Œ๊ทน์ ", "์ˆ˜์ค์Œ", "๊ฒธ์†ํ•จ", "์ž์‹ ๊ฐ", "์˜์š•์ ",
    "๋ฌด๊ธฐ๋ ฅ", "์„ฑ์‹ค", "์„ฌ์„ธํ•จ", "์‚ฐ๋งŒํ•จ", "์กฐ๊ธ‰ํ•จ",
    "๊ฑฐ์น ๋‹ค", "๊ธ์ •์ ", "์นœ์ ˆํ•จ", "๋ถ„๋…ธ", "์ธ๋‚ด์‹ฌ",
    "๋…๋ฆฝ์ ", "์ƒ์ฒ˜", "์˜จํ™”ํ•จ", "๋”ฐ๋œปํ•จ", "๋ฏธ์†Œ",
    "์žฌ์น˜", "์œ ๋จธ", "์–ต์šธํ•จ", "์šฐ์šธํ•จ", "๋ถ€์ •์ "
]

# ์ปฌ๋Ÿผ ์ƒ์„ฑ
col1, col2 = st.columns(2)

with col1:
    for i in range(5):
        record_key = f"record_{i}"
        if uploaded_data is not None and i < len(uploaded_data):
            data_value = uploaded_data.iloc[i, 0]
            if pd.isna(data_value):
                st.session_state[record_key] = ""
            else:
                st.session_state[record_key] = str(data_value)
        elif record_key not in st.session_state:
            st.session_state[record_key] = ""
            
        with st.expander(f"์ž…๋ ฅ์ฐฝ {i+1}", expanded=False):
            user_input = st.text_area("์ƒํ™œ๊ธฐ๋ก๋ถ€ ๋‚ด์šฉ ์ž…๋ ฅ", key=record_key, height=150, value=st.session_state[record_key])
            current_bytes = len(user_input.encode('utf-8'))
            st.caption(f"ํ˜„์žฌ ์ž…๋ ฅ์ฐฝ ๋ฐ”์ดํŠธ ์ˆ˜: {current_bytes}")

with col2:
    # ํ‚ค์›Œ๋“œ ์„ ํƒ ์˜ต์…˜
    st.write("ํ‚ค์›Œ๋“œ ์„ ํƒ")
    selected_attitude = st.multiselect("ํ•™์Šตํƒœ๋„", attitude_keywords)
    selected_relationship = st.multiselect("๊ต์šฐ๊ด€๊ณ„", relationship_keywords)
    selected_personality = st.multiselect("์„ฑ๊ฒฉ", personality_keywords)

    if st.button("์ƒ์„ฑ"):
        with st.spinner('์ƒ์„ฑ์ค‘...'):
            input_data = "\n".join([st.session_state[f'record_{i}'] for i in range(5) if st.session_state[f'record_{i}']])
            keyword_data = " ".join(selected_attitude + selected_relationship + selected_personality)
            full_data = input_data + "\n" + keyword_data
            generated_record = generate_living_record(full_data, school_level)
            # ์ƒ์„ฑ๋œ ๊ฒฐ๊ณผ๋ฅผ ์„ธ์…˜ ์ƒํƒœ์— ์ €์žฅ
            st.session_state["generated_result"] = generated_record

    # ์ƒ์„ฑ๋œ ๊ฒฐ๊ณผ๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜์ • ๊ฐ€๋Šฅํ•œ ํ…์ŠคํŠธ ์˜์—ญ
    result_text = st.text_area("์ƒ์„ฑ๋œ ๊ฒฐ๊ณผ", key="generated_result", value=st.session_state.get("generated_result", ""), height=500)
    
    # ์„ธ์…˜ ์ƒํƒœ์— ์ €์žฅ๋œ ๊ฒฐ๊ณผ์˜ ๋ฐ”์ดํŠธ ์ˆ˜ ๊ณ„์‚ฐ
    if "generated_result" in st.session_state:
        result_bytes = len(st.session_state["generated_result"].encode('utf-8'))
        st.caption(f"์ƒ์„ฑ๋œ ๊ฒฐ๊ณผ ๋ฐ”์ดํŠธ ์ˆ˜: {result_bytes}")