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)