jeongsoo commited on
Commit
64a6951
ยท
1 Parent(s): babf3f3

Add application file

Browse files
Files changed (1) hide show
  1. app.py +58 -171
app.py CHANGED
@@ -1,188 +1,75 @@
1
  import streamlit as st
2
  import requests
3
- import tempfile
4
  import os
5
- from dotenv import load_dotenv
6
  import json
 
7
 
8
- # VITO STT ํด๋ž˜์Šค ์ž„ํฌํŠธ
9
- from utils.vito_stt import VitoSTT
 
10
 
11
- # ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋กœ๋“œ
12
- load_dotenv()
 
 
 
 
 
 
13
 
14
- # ํŽ˜์ด์ง€ ๊ตฌ์„ฑ
15
- st.set_page_config(
16
- page_title="RAG ์ฑ—๋ด‡",
17
- page_icon="๐Ÿค–",
18
- layout="wide"
19
- )
20
 
21
- # RAG API ์„ค์ •
22
- API_BASE_URL = os.getenv('API_BASE_URL', 'https://your-deployed-api-url.com')
23
 
24
- # VITO STT ํด๋ผ์ด์–ธํŠธ ์ดˆ๊ธฐํ™”
25
- stt_client = VitoSTT()
26
 
27
- # ์„ธ์…˜ ์ƒํƒœ ์ดˆ๊ธฐํ™”
28
- if 'messages' not in st.session_state:
29
- st.session_state.messages = []
30
- if 'sources' not in st.session_state:
31
- st.session_state.sources = []
32
 
33
- # ์‚ฌ์ด๋“œ๋ฐ” ์„ค์ •
34
- with st.sidebar:
35
- st.title("๐Ÿค– RAG ์ฑ—๋ด‡")
36
- st.write("Retrieval-Augmented Generation ๊ธฐ๋ฐ˜ ์ฑ—๋ด‡ ์„œ๋น„์Šค")
37
-
38
- st.subheader("โš™๏ธ ์„ค์ •")
39
- retriever_type = st.selectbox(
40
- "๊ฒ€์ƒ‰ ์—”์ง„",
41
- ["reranker", "vector"],
42
- index=0
43
- )
44
-
45
- top_k = st.slider(
46
- "์ฐธ๊ณ  ๋ฌธ์„œ ์ˆ˜ (Top-K)",
47
- min_value=1,
48
- max_value=10,
49
- value=3
50
- )
51
-
52
- temperature = st.slider(
53
- "๋‹ค์–‘์„ฑ (Temperature)",
54
- min_value=0.0,
55
- max_value=1.0,
56
- value=0.7,
57
- step=0.1
58
- )
59
-
60
- st.divider()
61
-
62
- st.subheader("๐Ÿ“š ์ฐธ๊ณ  ๋ฌธ์„œ")
63
- if st.session_state.sources:
64
- for i, source in enumerate(st.session_state.sources):
65
- with st.expander(f"{i+1}. {source.get('metadata', {}).get('category', '์ผ๋ฐ˜')}"):
66
- st.write(source.get('content', ''))
67
- else:
68
- st.info("์ฐธ๊ณ  ๋ฌธ์„œ๊ฐ€ ์—ฌ๊ธฐ์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค")
69
-
70
- # ๋ฉ”์ธ ์˜์—ญ
71
- st.title("๐Ÿ’ฌ RAG ์ฑ—๋ด‡")
72
 
73
- # ์ €์žฅ๋œ ๋Œ€ํ™” ํ‘œ์‹œ
74
- for message in st.session_state.messages:
75
- with st.chat_message(message["role"]):
76
- st.write(message["content"])
77
 
78
- # ์‚ฌ์šฉ์ž ์ž…๋ ฅ
79
- query = st.chat_input("์งˆ๋ฌธ์„ ์ž…๋ ฅํ•˜์„ธ์š”...")
 
80
 
81
- # ์Œ์„ฑ ์ž…๋ ฅ ์˜ต์…˜
82
- audio_input = st.file_uploader("๋˜๋Š” ์Œ์„ฑ์œผ๋กœ ์งˆ๋ฌธํ•˜๊ธฐ", type=["wav", "mp3", "ogg", "m4a"])
83
-
84
- if query:
85
- # ์‚ฌ์šฉ์ž ๋ฉ”์‹œ์ง€ ์ถ”๊ฐ€
86
- st.session_state.messages.append({"role": "user", "content": query})
87
- with st.chat_message("user"):
88
- st.write(query)
89
 
90
- # ์ฑ—๋ด‡ ์‘๋‹ต ์˜์—ญ
91
- with st.chat_message("assistant"):
92
- with st.spinner("๋‹ต๋ณ€ ์ƒ์„ฑ ์ค‘..."):
93
- try:
94
- # RAG API ์š”์ฒญ
95
- response = requests.post(
96
- f"{API_BASE_URL}/rag",
97
- json={
98
- "query": query,
99
- "retriever_type": retriever_type,
100
- "top_k": top_k,
101
- "temperature": temperature
102
- },
103
- timeout=30
104
- )
105
-
106
- if response.status_code == 200:
107
- result = response.json()
108
- answer = result.get("answer", "")
109
- context_docs = result.get("context_docs", [])
110
-
111
- # ์‘๋‹ต ํ‘œ์‹œ
112
- st.markdown(answer)
113
-
114
- # ์„ธ์…˜ ์ƒํƒœ ์—…๋ฐ์ดํŠธ
115
- st.session_state.messages.append({"role": "assistant", "content": answer})
116
- st.session_state.sources = context_docs
117
- else:
118
- st.error(f"API ์˜ค๋ฅ˜: {response.status_code} - {response.text}")
119
- except Exception as e:
120
- st.error(f"์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}")
121
-
122
- # ์Œ์„ฑ ์ž…๋ ฅ ์ฒ˜๋ฆฌ
123
- if audio_input:
124
- with st.spinner("์Œ์„ฑ ์ฒ˜๋ฆฌ ์ค‘..."):
125
- try:
126
- # ์ž„์‹œ ํŒŒ์ผ๋กœ ์ €์žฅ
127
- with tempfile.NamedTemporaryFile(delete=False, suffix='.wav') as tmp:
128
- tmp.write(audio_input.getvalue())
129
- tmp_path = tmp.name
130
-
131
- # ํŒŒ์ผ ์ฝ๊ธฐ
132
- with open(tmp_path, 'rb') as f:
133
- audio_bytes = f.read()
134
-
135
- # ์ž„์‹œ ํŒŒ์ผ ์‚ญ์ œ
136
- os.unlink(tmp_path)
137
-
138
- # VITO STT ์ฒ˜๋ฆฌ
139
- stt_result = stt_client.transcribe_audio(audio_bytes)
140
 
141
- if stt_result["success"]:
142
- transcription = stt_result["text"]
143
- if transcription:
144
- st.success(f"์ธ์‹๋œ ํ…์ŠคํŠธ: {transcription}")
145
-
146
- # ์‚ฌ์šฉ์ž ๋ฉ”์‹œ์ง€ ์ถ”๊ฐ€
147
- st.session_state.messages.append({"role": "user", "content": transcription})
148
- with st.chat_message("user"):
149
- st.write(transcription)
150
-
151
- # ์ฑ—๋ด‡ ์‘๋‹ต ์˜์—ญ
152
- with st.chat_message("assistant"):
153
- with st.spinner("๋‹ต๋ณ€ ์ƒ์„ฑ ์ค‘..."):
154
- try:
155
- # RAG API ์š”์ฒญ
156
- response = requests.post(
157
- f"{API_BASE_URL}/rag",
158
- json={
159
- "query": transcription,
160
- "retriever_type": retriever_type,
161
- "top_k": top_k,
162
- "temperature": temperature
163
- },
164
- timeout=30
165
- )
166
-
167
- if response.status_code == 200:
168
- result = response.json()
169
- answer = result.get("answer", "")
170
- context_docs = result.get("context_docs", [])
171
-
172
- # ์‘๋‹ต ํ‘œ์‹œ
173
- st.markdown(answer)
174
-
175
- # ์„ธ์…˜ ์ƒํƒœ ์—…๋ฐ์ดํŠธ
176
- st.session_state.messages.append({"role": "assistant", "content": answer})
177
- st.session_state.sources = context_docs
178
- else:
179
- st.error(f"API ์˜ค๋ฅ˜: {response.status_code} - {response.text}")
180
- except Exception as e:
181
- st.error(f"์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}")
182
- else:
183
- st.warning("์Œ์„ฑ์—์„œ ํ…์ŠคํŠธ๋ฅผ ์ธ์‹ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.")
184
  else:
185
- st.error(f"์Œ์„ฑ ์ธ์‹ ์˜ค๋ฅ˜: {stt_result.get('error', '์•Œ ์ˆ˜ ์—†๋Š” ์˜ค๋ฅ˜')}")
186
-
187
- except Exception as e:
188
- st.error(f"์Œ์„ฑ ์ฒ˜๋ฆฌ ์ค‘ ์˜ค๋ฅ˜: {str(e)}")
 
 
1
  import streamlit as st
2
  import requests
 
3
  import os
 
4
  import json
5
+ import sys
6
 
7
+ # ์‹œ์Šคํ…œ ์ •๋ณด ํ™•์ธ
8
+ st.write("Python version:", sys.version)
9
+ st.write("ํ˜„์žฌ ์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ:", os.getcwd())
10
 
11
+ # ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ํ™•์ธ (๋ณด์•ˆ์ƒ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋Š” ๊ฐ€๋ ค์„œ ํ‘œ์‹œ)
12
+ env_vars = {}
13
+ for key in os.environ:
14
+ value = os.environ[key]
15
+ if key in ['API_BASE_URL']:
16
+ env_vars[key] = value
17
+ elif 'SECRET' in key or 'KEY' in key or 'TOKEN' in key or 'PASSWORD' in key:
18
+ env_vars[key] = value[:4] + '****' if len(value) > 4 else '****'
19
 
20
+ st.subheader("ํ™˜๊ฒฝ ๋ณ€์ˆ˜")
21
+ st.json(env_vars)
 
 
 
 
22
 
23
+ # API ์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ
24
+ st.subheader("API ์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ")
25
 
26
+ api_url = os.environ.get('API_BASE_URL', 'https://enter-your-api-url.com')
27
+ st.write(f"API URL: {api_url}")
28
 
29
+ test_url = st.text_input("ํ…Œ์ŠคํŠธํ•  API URL", api_url)
 
 
 
 
30
 
31
+ if st.button("API ์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ"):
32
+ try:
33
+ with st.spinner("API ์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ ์ค‘..."):
34
+ response = requests.get(f"{test_url}/docs", timeout=10)
35
+ st.success(f"API ์—ฐ๊ฒฐ ์„ฑ๊ณต! ์ƒํƒœ ์ฝ”๋“œ: {response.status_code}")
36
+ st.text(f"์‘๋‹ต ๋‚ด์šฉ (์ฒ˜์Œ 500์ž): {response.text[:500]}")
37
+ except Exception as e:
38
+ st.error(f"API ์—ฐ๊ฒฐ ์‹คํŒจ: {str(e)}")
39
+ st.info("API ์„œ๋ฒ„๊ฐ€ ์‹คํ–‰ ์ค‘์ธ์ง€, URL์ด ์˜ฌ๋ฐ”๋ฅธ์ง€ ํ™•์ธํ•˜์„ธ์š”.")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
40
 
41
+ # ํŒŒ์ผ ์‹œ์Šคํ…œ ํ™•์ธ
42
+ st.subheader("ํŒŒ์ผ ์‹œ์Šคํ…œ ํ™•์ธ")
43
+ files = os.listdir('.')
44
+ st.write("ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ ํŒŒ์ผ:", files)
45
 
46
+ # ๊ฐ„๋‹จํ•œ ์ฑ„ํŒ… UI
47
+ st.subheader("๊ฐ„๋‹จํ•œ ์ฑ„ํŒ… ํ…Œ์ŠคํŠธ")
48
+ user_input = st.text_input("์งˆ๋ฌธ ์ž…๋ ฅ")
49
 
50
+ if st.button("์ „์†ก") and user_input:
51
+ st.write(f"์‚ฌ์šฉ์ž: {user_input}")
 
 
 
 
 
 
52
 
53
+ try:
54
+ with st.spinner("์‘๋‹ต ์ƒ์„ฑ ์ค‘..."):
55
+ response = requests.post(
56
+ f"{api_url}/rag",
57
+ json={
58
+ "query": user_input,
59
+ "retriever_type": "reranker",
60
+ "top_k": 3
61
+ },
62
+ timeout=30
63
+ )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
64
 
65
+ if response.status_code == 200:
66
+ result = response.json()
67
+ st.write(f"์ฑ—๋ด‡: {result.get('answer', '์‘๋‹ต์„ ๋ฐ›์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.')}")
68
+ st.write("์‘๋‹ต ์„ธ๋ถ€ ์ •๋ณด:")
69
+ st.json(result)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
70
  else:
71
+ st.error(f"API ์˜ค๋ฅ˜: {response.status_code} - {response.text}")
72
+ except Exception as e:
73
+ st.error(f"์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}")
74
+ st.info("์ž์„ธํ•œ ์˜ค๋ฅ˜ ์ •๋ณด:")
75
+ st.exception(e)