randmimc commited on
Commit
0967be1
ยท
verified ยท
1 Parent(s): da0da72

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +101 -69
app.py CHANGED
@@ -1,108 +1,140 @@
 
 
 
1
  import streamlit as st
2
  from transformers import pipeline
3
- import re
4
 
5
- def replace_multiple_spaces(text):
6
- return re.sub(r'\s+', ' ', text)
7
 
8
- pipe = pipeline("summarization", model="gangyeolkim/kobart-korean-summarizer-v2")
 
 
9
 
10
 
 
 
 
 
 
11
  assistant_icon_path = "https://huggingface.co/spaces/randmimc/aitom/resolve/main/chat_icon/assistant.ico"
12
- user_icon_path = "https://huggingface.co/spaces/randmimc/aitom/resolve/main/chat_icon/user01.png"
13
 
14
- # ์„ธ์…˜ ์ƒํƒœ์—์„œ approval_state ๋ฐ messages ์ดˆ๊ธฐํ™”
 
 
 
 
15
  if "approval_state" not in st.session_state:
16
  st.session_state.approval_state = "require"
17
  if "messages" not in st.session_state:
18
  st.session_state.messages = []
19
 
20
- # Custom CSS to align messages and wrap text
 
 
21
  st.markdown("""
22
  <style>
23
- .chat-container {
24
- display: flex;
25
- align-items: flex-start;
26
- margin-bottom: 10px;
27
  }
28
  .user-container {
29
- justify-content: flex-end;
30
  }
31
  .assistant-container {
32
- justify-content: flex-start;
33
- flex-direction: row; /* Avatar์™€ Bubble์„ ์ˆ˜ํ‰ ์ •๋ ฌ */
34
  }
35
- .chat-bubble {
36
- padding: 10px;
37
- border-radius: 10px;
38
- max-width: 70%;
39
- word-wrap: break-word;
40
- white-space: pre-wrap;
41
  }
42
- .user-bubble {
43
- font-size: 14px;
44
- color: #333;
45
- background-color: #e5e5e5;
46
- text-align: left;
47
  }
48
  .assistant-bubble {
49
- font-size: 14px;
50
- color: #333;
51
- text-align: left; /* ์™ผ์ชฝ ์ •๋ ฌ */
52
- background-color: #feeddf;
53
  }
54
- .avatar {
55
- width: 30px;
56
- height: 30px;
57
- border-radius: 50%;
58
- margin-right: 10px; /* Bubble๊ณผ ๊ฐ„๊ฒฉ */
59
  }
60
  </style>
61
  """, unsafe_allow_html=True)
62
 
 
 
 
 
 
 
 
 
 
 
 
 
63
 
64
- # Display chat messages from history
 
 
 
65
  for message in st.session_state.messages:
66
  if message["role"] == "user":
67
- st.markdown(
68
- f"""
69
- <div class="chat-container user-container">
70
- <div class="chat-bubble user-bubble">{message["content"]}</div>
71
- </div>
72
- """, unsafe_allow_html=True)
73
  else:
74
- st.markdown(
75
- f"""
76
- <div class="chat-container assistant-container">
77
- <img src="{assistant_icon_path}" class="avatar">
78
- <div class="chat-bubble assistant-bubble">{message["content"]}</div>
79
- </div>
80
- """, unsafe_allow_html=True)
81
-
82
- # Start with an assistant message
83
  if not st.session_state.messages:
84
- st.session_state.messages.append({
85
- "role": "assistant",
86
- "avatar": assistant_icon_path,
87
- "content": """๋”์•„์ด์— ์”จ์— aitom์€ ํ˜„์žฌ ๊ณต์‚ฌ์ค‘์— ์žˆ์Šต๋‹ˆ๋‹ค.
88
- ํ•˜์ง€๋งŒ ! ๊ฐ„๋‹จํžˆ ํ™œ์šฉํ•ด ๋ณด์‹ค ์ˆ˜ ์žˆ๋Š” ์š”์•ฝ ๋ชจ๋ธ์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
89
- ์งง์€ ์‹ ๋ฌธ๊ธฐ์‚ฌ๋ฅผ ๋งํ•ด ์ฃผ์‹œ๋ฉด ์š”์•ฝ๋ฌธ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
90
- ๊ณ„์† ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด "yes" ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.
91
- """})
92
- st.rerun()
93
 
 
 
94
  if prompt := st.chat_input():
95
- st.session_state.messages.append({"role": "user", "avatar": user_icon_path, "content": prompt})
 
 
 
 
 
96
  if st.session_state.approval_state == "require":
97
  if prompt.lower() == "yes":
98
  st.session_state.approval_state = "approved"
99
- st.session_state.messages.append({"role": "assistant", "avatar": assistant_icon_path, "content": "์ด์ œ ๊ฐ„๋‹จํ•œ ์š”์•ฝ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•œ ์‹ ๋ฌธ๊ธฐ์‚ฌ๋ฅผ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”."})
100
  else:
101
- st.session_state.messages.append({"role": "assistant", "avatar": assistant_icon_path, "content": '์Šน์ธํ•˜์ง€ ๋ชปํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์Šน์ธ์„ ์œ„ํ•ด "yes"๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.'})
102
-
103
- elif st.session_state.approval_state == "approved":
104
- result = replace_multiple_spaces(prompt)
105
- summarized = pipe(result)
106
- st.session_state.messages.append({"role": "assistant", "avatar": assistant_icon_path, "content": summarized[0]["summary_text"]})
107
-
108
- st.rerun()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # ํŒจํ‚ค์ง€ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
2
+ import re
3
+ import requests
4
  import streamlit as st
5
  from transformers import pipeline
 
6
 
 
 
7
 
8
+ url = "http://llm.theimc.co.kr:8003/item_post"
9
+ headers = {"Content-Type": "application/x-www-form-urlencoded"}
10
+
11
 
12
 
13
+ # ๊ธ€๋กœ๋ฒŒ ๋ณ€์ˆ˜ ์„ ์–ธ
14
+ ## ๋ชจ๋ธ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ(https://huggingface.co/gangyeolkim/kobart-korean-summarizer-v2) ๋Š” ํ…Œ์ŠคํŠธ์šฉ ๋ชจ๋ธ ์ž…๋‹ˆ๋‹ค.
15
+ pipe = pipeline("summarization", model="gangyeolkim/kobart-korean-summarizer-v2")
16
+
17
+ ## assitant ์•„๋ฐ”ํƒ€ ์ด๋ฏธ์ง€ ๊ฒฝ๋กœ
18
  assistant_icon_path = "https://huggingface.co/spaces/randmimc/aitom/resolve/main/chat_icon/assistant.ico"
 
19
 
20
+ ## ์„ธ์…˜ ์ƒํƒœ์—์„œ approval_state ๋ฐ messages ์ดˆ๊ธฐํ™”
21
+ ## โ€ป ์„ธ์…˜(session) :
22
+ ## ์‚ฌ์šฉ์ž์˜ ์ธํ„ฐ๋ž™์…˜์„ ๊ด€๋ฆฌํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.
23
+ ## Streamlit์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ์•ฑ๊ณผ ์ƒํ˜ธ์ž‘์šฉํ•  ๋•Œ๋งˆ๋‹ค ์ „์ฒด ์ฝ”๋“œ๊ฐ€ ๋‹ค์‹œ ์‹คํ–‰๋˜๋Š” ๊ตฌ์กฐ์ธ๋ฐ,
24
+ ## ์„ธ์…˜ ์ƒํƒœ(Session State)๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ๋„ ํšจ์œจ์ ์ธ ์•ฑ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
25
  if "approval_state" not in st.session_state:
26
  st.session_state.approval_state = "require"
27
  if "messages" not in st.session_state:
28
  st.session_state.messages = []
29
 
30
+ # CSS ์ž‘์„ฑ
31
+ ## st.markdown๋Š” ํ…์ŠคํŠธ๋ฅผ ๋งˆํฌ๋‹ค์šด ํ˜•์‹์œผ๋กœ ๋žœ๋”๋ง ํ•˜๋Š” ํ•จ์ˆ˜์ด์ง€๋งŒ, unsafe_allow_html=True ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด HTML/CSS๋ฅผ ์ง์ ‘ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
32
+ ## ์ŠคํŠธ๋ฆผ๋ฆฟ์—์„œ ๋””ํดํŠธ๋กœ ์ ์šฉํ•˜๋Š” ๋””์ž์ธ์ด ๋ง˜์— ๋“ค์ง€ ์•Š๋Š”๋‹ค๋ฉด CSS๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
33
  st.markdown("""
34
  <style>
35
+ .chat-container { /* ์ฑ„ํŒ… ๋ฉ”์‹œ์ง€๋ฅผ ๊ฐ์‹ธ๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. */
36
+ display: flex; /* ์ฑ„ํŒ… ์š”์†Œ(์•„๋ฐ”ํƒ€, ๋งํ’์„  ๋“ฑ)์„ ๊ฐ€๋กœ ๋ฐฉํ–ฅ์œผ๋กœ ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค. */
37
+ margin-bottom: 10px; /*๋ฉ”์„ธ์ง€๊ฐ„ ๊ฐ„๊ฒฉ์„ 10px๋กœ ํ•ฉ๋‹ˆ๋‹ค. */
 
38
  }
39
  .user-container {
40
+ justify-content: flex-end; /* ์‚ฌ์šฉ์ž์˜ ๋ฉ”์‹œ์ง€๋ฅผ ์šฐ์ธก์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค.*/
41
  }
42
  .assistant-container {
43
+ justify-content: flex-start; /* ์–ด์‹œ์Šคํ„ด์Šค ๋ฉ”์‹œ์ง€๋ฅผ ์ขŒ์ธก ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค.*/
44
+ flex-direction: row; /* Avatar์™€ Bubble์„ ์ˆ˜ํ‰์œผ๋กœ ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค. */
45
  }
46
+ .chat-bubble { /* ๋งํ’์„  ์Šคํƒ€์ผ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. */
47
+ padding: 10px; /* ๋งํ’์„  ์•ˆ์— ๋ฉ”์‹œ์ง€๊ฐ„ ๊ฐ„๊ฒฉ์„ 10px๋กœ ํ•ฉ๋‹ˆ๋‹ค. */
48
+ border-radius: 10px; /*๋งํ’์„ ์˜ ๋ชจ์„œ๋ฆฌ๋ฅผ ๋™๊ธ€๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.*/
49
+ max-width: 70%; /* ํ•œ์ค„์ด ๋„ˆ๋ฌด ๊ธธ์ง€ ์•Š๊ฒŒ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค. */
50
+ word-wrap: break-word; /* ํ…์ŠคํŠธ๋ฅผ ๋‹จ์–ด ๋‹จ์œ„๋กœ ์ค„๋‚ด๋ฆผํ•ฉ๋‹ˆ๋‹ค. */
51
+ white-space: pre-wrap; /* ํ…์ŠคํŠธ๋ฅผ ๋‹จ์–ด ๋‹จ์œ„๋กœ ์ค„๋‚ด๋ฆผํ•ฉ๋‹ˆ๋‹ค. */
52
  }
53
+ .user-bubble { /* ์‚ฌ์šฉ์ž ๋ฉ”์‹œ์ง€ ์Šคํƒ€์ผ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. */
54
+ font-size: 14px; /* ํฐํŠธ ์‚ฌ์ด์ฆˆ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. */
55
+ color: #333; /* ํฐํŠธ ์ƒ‰์ƒ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. */
56
+ background-color: #e5e5e5; /* ๋งํ’์„  ๋ฐฐ๊ฒฝ์ƒ‰์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. */
 
57
  }
58
  .assistant-bubble {
59
+ font-size: 14px; /* ํฐํŠธ ์‚ฌ์ด์ฆˆ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. */
60
+ color: #333; /* ํฐํŠธ ์ƒ‰์ƒ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. */
61
+ text-align: left; /* ๋ฉ”์„ธ์ง€๋ฅผ ์™ผ์ชฝ ์ •๋ ฌ ํ•ฉ๋‹ˆ๋‹ค. */
62
+ background-color: #feeddf; /* ๋งํ’์„  ๋ฐฐ๊ฒฝ์ƒ‰์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. */
63
  }
64
+ .avatar { /* ํ”„๋กœํ•„ ์ด๋ฏธ์ง€(์•„๋ฐ”ํƒ€) ์Šคํƒ€์ผ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. */
65
+ width: 30px; /* ์•„๋ฐ”ํƒ€ ํญ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. */
66
+ height: 30px; /* ์•„๋ฐ”ํƒ€ ๋„ˆ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. */
67
+ border-radius: 50%; /* ์•„๋ฐ”ํƒ€๋ฅผ ์›๊ฒฝ์œผ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค. */
68
+ margin-right: 10px; /*๋ฉ”์„ธ์ง€๊ฐ„ ๊ฐ„๊ฒฉ์„ 10px๋กœ ํ•ฉ๋‹ˆ๋‹ค. */
69
  }
70
  </style>
71
  """, unsafe_allow_html=True)
72
 
73
+ # ๋ฉ”์„ธ์ง€ wrapper
74
+ # html ํ…Œ๊ทธ๋ฅผ ์ด์šฉํ•˜์—ฌ ์ฑ—ํŒ… ๋งค์„ธ์ง€๋งˆ๋‹ค css ์Šคํƒ€์ผ์„ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ž‘์„ฑ๋œ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
75
+ def user_message_style(question):
76
+ return f"""<div class="chat-container user-container">
77
+ <div class="chat-bubble user-bubble">{question}</div>
78
+ </div>"""
79
+
80
+ def assistant_message_style(assistant_icon_path, answer):
81
+ return f"""<div class="chat-container assistant-container">
82
+ <img src="{assistant_icon_path}" class="avatar">
83
+ <div class="chat-bubble assistant-bubble">{answer}</div>
84
+ </div>"""
85
 
86
+ # BACK
87
+ ## ๊ณผ๊ฑฐ ์ฑ„ํŒ… ๋‚ด์šฉ ์ถœ๋ ฅ
88
+ ## ์ŠคํŠธ๋ฆผ๋ฆฟ์˜ st.chat_input() ๋ฉ”์„œ๋“œ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅ์„ ์ฃผ๋ฉด ์„ธ์…˜๋‚ด์šฉ์„ ๊ธฐ์–ตํ•˜๋ฉด์„œ ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ์‹คํ–‰ํ•˜๋Š” ํŠน์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
89
+ ## ๋”ฐ๋ผ์„œ ์„ธ์…˜์— ์ €์žฅ๋œ ๊ณผ๊ฑฐ ๋Œ€ํ™” ๋‚ด์šฉ์„ ํ™”๋ฉด์— ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ƒˆ๋กœ ์‹คํ–‰๋œ ์ฝ”๋“œ์— ๊ณผ๊ฑฐ ๋‚ด์šฉ์„ ๋ฏธ๋ฆฌ ๋ฟŒ๋ ค๋‘˜ ์ˆ˜ ์ž‡๊ฒŒ ์•„๋ž˜์™€ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด ๋‘์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
90
  for message in st.session_state.messages:
91
  if message["role"] == "user":
92
+ st.markdown(user_message_style(message["content"]), unsafe_allow_html=True)
 
 
 
 
 
93
  else:
94
+ st.markdown(assistant_message_style(assistant_icon_path, message["content"]), unsafe_allow_html=True)
95
+
96
+ # ์ธ์ฆ ๋ฉ”์„ธ์ง€
97
+ ## ๋ณธ ์ฝ”๋“œ๋Š” ๋‹ค๋ฅธ ์ฑ—๋ด‡๊ณผ ๋‹ฌ๋ฆฌ ์ธ์ฆ์„ ์œ„ํ•ด ์ฑ—๋ด‡์ด ๋จผ์ € ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ง์„ ๊ฑฐ๋Š” ์ฃผ๊ณ ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.
98
+ ## ์„ธ์…˜์ด ์•„๋ฌด ๋ฉ”์„ธ์ง€๋„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๋‹ค๋ฉด ์ธ์ฆ์„ ์œ„ํ•œ ๋ง์„ ๋จผ์ € ๊ฑธ๊ฒŒ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.
99
+
100
+ ## ์ธ์ฆ ๋ฉ”์„ธ์ง€
 
 
101
  if not st.session_state.messages:
102
+ greeting = "๋”์•„์ด์— ์”จ์— aitom์€ ํ˜„์žฌ ๊ณต์‚ฌ์ค‘์— ์žˆ์Šต๋‹ˆ๋‹ค.\n๊ฐ„๋‹จํ•œ ์‹ ๋ฌธ๊ธฐ์‚ฌ๋ฅผ ์ž…๋ ฅํ•˜์‹œ๋ฉด ์š”์•ฝ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.\n๊ณ„์† ์‚ฌ์šฉํ•˜๋ ค๋ฉด \"yes\"๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”."
103
+ st.session_state.messages.append({"role": "assistant", "content": greeting})
104
+ st.markdown(assistant_message_style(assistant_icon_path, greeting), unsafe_allow_html=True)
 
 
 
 
 
 
105
 
106
+ ## ์ธ์ฆ ๋ฐ ์‘๋‹ต ์ƒ์„ฑ
107
+ ## prompt :=`๋Š” "์›”๋Ÿฌ์Šค ์—ฐ์‚ฐ์ž" (:=, walrus operator)๋กœ, ์ž…๋ ฅ๊ฐ’์ด ์žˆ์œผ๋ฉด ์ด๋ฅผ prompt ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜๋ฉด์„œ ๋™์‹œ์— ์กฐ๊ฑด๋ฌธ์„ ์‹คํ–‰ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ํ•ฉ๋‹ˆ๋‹ค.
108
  if prompt := st.chat_input():
109
+ # ์‚ฌ์šฉ์ž ์งˆ๋ฌธ ์„ธ์…˜์— ์ €์žฅ
110
+ st.session_state.messages.append({"role": "user", "content": prompt})
111
+ # ์‚ฌ์šฉ์ž ์งˆ๋ฌธ ํ™”๋ฉด์— ํ‘œ์‹œ
112
+ st.markdown(user_message_style(prompt), unsafe_allow_html=True)
113
+
114
+ # ์ธ์ฆ
115
  if st.session_state.approval_state == "require":
116
  if prompt.lower() == "yes":
117
  st.session_state.approval_state = "approved"
118
+ response = "์ด์ œ ์š”์•ฝ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ ๋ฌธ๊ธฐ์‚ฌ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”."
119
  else:
120
+ response = "์Šน์ธ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ณ„์†ํ•˜๋ ค๋ฉด \"yes\"๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”."
121
+ # ์‘๋‹ต ์ƒ์„ฑ
122
+ else:
123
+ data = {
124
+ "name": "string",
125
+ "description": prompt,
126
+ "price": 0
127
+ }
128
+
129
+ response = requests.post(url, headers=headers, data=data)
130
+ response = response.text
131
+ print(response)
132
+
133
+ # result = re.sub(r'\s+', ' ', prompt)
134
+ # summarized = pipe(result)
135
+ # response = summarized[0]["summary_text"]
136
+ # ์–ด์‹œ์Šคํ„ด์Šค์˜ ๋ฉ”์„ธ์ง€๋ฅผ ๏ฟฝ๏ฟฝ์…˜์— ์ €์žฅ
137
+ st.session_state.messages.append({"role": "assistant", "content": response})
138
+ # ์–ด์‹œ์Šคํ„ด์Šค์˜ ๋ฉ”์„ธ์ง€๋ฅผ ํ™”๋ฉด์— ํ‘œ์‹œ
139
+ st.markdown(assistant_message_style(assistant_icon_path, response), unsafe_allow_html=True)
140
+