Spaces:
Running
Running
Update app.py
Browse files
app.py
CHANGED
@@ -35,6 +35,7 @@ def format_chat_history(messages: list) -> list:
|
|
35 |
})
|
36 |
return formatted_history
|
37 |
|
|
|
38 |
def find_most_similar_data(query):
|
39 |
"""
|
40 |
์ฃผ์ด์ง ์ฟผ๋ฆฌ์ ๊ฐ์ฅ ์ ์ฌํ ๋ฐ์ดํฐ ์ฐพ๊ธฐ
|
@@ -42,26 +43,27 @@ def find_most_similar_data(query):
|
|
42 |
query_embedding = embedding_model.encode(query, convert_to_tensor=True)
|
43 |
most_similar = None
|
44 |
highest_similarity = -1
|
45 |
-
|
46 |
for split in pharmkg_dataset.keys():
|
47 |
for item in pharmkg_dataset[split]:
|
48 |
if 'Input' in item and 'Output' in item:
|
49 |
item_text = f"์
๋ ฅ: {item['Input']} ์ถ๋ ฅ: {item['Output']}"
|
50 |
item_embedding = embedding_model.encode(item_text, convert_to_tensor=True)
|
51 |
similarity = util.pytorch_cos_sim(query_embedding, item_embedding).item()
|
52 |
-
|
53 |
if similarity > highest_similarity:
|
54 |
highest_similarity = similarity
|
55 |
most_similar = item_text
|
56 |
-
|
57 |
return most_similar
|
58 |
|
|
|
59 |
def stream_gemini_response(user_message: str, messages: list) -> Iterator[list]:
|
60 |
"""
|
61 |
๋ํ ๊ธฐ๋ก ์ง์์ ํตํด ์๊ฐ๊ณผ ์๋ต์ ์คํธ๋ฆฌ๋ฐํฉ๋๋ค(ํ
์คํธ ์
๋ ฅ๋ง ํด๋น).
|
62 |
"""
|
63 |
-
if not user_message.strip():
|
64 |
-
messages.append(ChatMessage(role="assistant", content="๋น์ด ์์ง ์์ ํ
์คํธ ๋ฉ์์ง๋ฅผ ์ ๊ณตํด์ฃผ์ธ์. ๋น ์
๋ ฅ์ ํ์ฉ๋์ง ์์ต๋๋ค."))
|
65 |
yield messages
|
66 |
return
|
67 |
|
@@ -72,9 +74,9 @@ def stream_gemini_response(user_message: str, messages: list) -> Iterator[list]:
|
|
72 |
# Gemini์ฉ ๋ํ ๊ธฐ๋ก ํฌ๋งท
|
73 |
chat_history = format_chat_history(messages)
|
74 |
|
75 |
-
|
76 |
most_similar_data = find_most_similar_data(user_message)
|
77 |
-
|
78 |
system_message = "์ฌ์ฉ์ ์ง๋ฌธ์ ๋ํด ์์ฝํ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ์ ๋ฌธ ์ฝํ ์ด์์คํดํธ์
๋๋ค."
|
79 |
system_prefix = """
|
80 |
๋ฐ๋์ ํ๊ธ๋ก ๋ต๋ณํ์ญ์์ค. ๋์ ์ด๋ฆ์ 'PharmAI'์ด๋ค.
|
@@ -107,11 +109,11 @@ def stream_gemini_response(user_message: str, messages: list) -> Iterator[list]:
|
|
107 |
PharmKG๋ ๋ณต์กํ ์ฝ๋ฌผ ๊ด๋ จ ์ ๋ณด๋ฅผ ์ฒด๊ณ์ ์ผ๋ก ์ ๋ฆฌํ๊ณ ๋ถ์ํ ์ ์๊ฒ ํด์ฃผ์ด, ์ฝํ ์ฐ๊ตฌ์ ์์ ์์ฌ๊ฒฐ์ ์ ์ค์ํ ๋๊ตฌ๋ก ํ์ฉ๋๊ณ ์์ต๋๋ค.
|
108 |
"""
|
109 |
|
110 |
-
|
111 |
if most_similar_data:
|
112 |
-
|
113 |
else:
|
114 |
-
|
115 |
|
116 |
# Gemini ์ฑํ
์์
|
117 |
chat = model.start_chat(history=chat_history)
|
@@ -179,7 +181,7 @@ def stream_gemini_response(user_message: str, messages: list) -> Iterator[list]:
|
|
179 |
content=thought_buffer,
|
180 |
metadata={"title": "โ๏ธ ์๊ฐ ์ค: *๋ชจ๋ธ์ ์ํด ์์ฑ๋ ์๊ฐ์ ์คํ์ ์
๋๋ค."}
|
181 |
)
|
182 |
-
#time.sleep(0.05)
|
183 |
|
184 |
yield messages
|
185 |
|
@@ -195,11 +197,126 @@ def stream_gemini_response(user_message: str, messages: list) -> Iterator[list]:
|
|
195 |
)
|
196 |
yield messages
|
197 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
198 |
def user_message(msg: str, history: list) -> tuple[str, list]:
|
199 |
"""์ฌ์ฉ์ ๋ฉ์์ง๋ฅผ ๋ํ ๊ธฐ๋ก์ ์ถ๊ฐ"""
|
200 |
history.append(ChatMessage(role="user", content=msg))
|
201 |
return "", history
|
202 |
|
|
|
203 |
with gr.Blocks(
|
204 |
theme=gr.themes.Soft(primary_hue="teal", secondary_hue="slate", neutral_hue="neutral"),
|
205 |
css="""
|
@@ -211,129 +328,169 @@ with gr.Blocks(
|
|
211 |
) as demo:
|
212 |
gr.Markdown("# ๐ญ PharmAI: ์ถ๋ก ๊ธฐ๋ฐ ์ฝ๋ฆฌํ ์ ๋ฌธ AI ์๋น์ค ๐ญ")
|
213 |
|
214 |
-
|
215 |
-
|
216 |
gr.HTML("""<a href="https://visitorbadge.io/status?path=https%3A%2F%2Faiqcamp-Gemini2-Flash-Thinking.hf.space">
|
217 |
<img src="https://api.visitorbadge.io/api/visitors?path=https%3A%2F%2Faiqcamp-Gemini2-Flash-Thinking.hf.space&countColor=%23263759" />
|
218 |
</a>""")
|
219 |
-
|
220 |
with gr.Tabs() as tabs:
|
221 |
-
|
222 |
-
|
223 |
-
|
224 |
-
|
225 |
-
|
226 |
-
|
227 |
-
|
228 |
-
|
229 |
-
|
230 |
-
|
231 |
-
|
232 |
-
|
233 |
-
|
234 |
-
|
235 |
-
|
236 |
-
|
237 |
-
|
238 |
-
|
239 |
-
|
240 |
-
|
241 |
-
# ์์ ํ๋กฌํํธ ์ถ๊ฐ - ํ์ผ ์
๋ก๋ ์์ ์ ๊ฑฐ. ํ
์คํธ ์ค์ฌ ์์ ์ ์ง.
|
242 |
-
example_prompts = [
|
243 |
["CYP450 ํจ์์ ์ฝ๋ฌผ ๋์ฌ ๊ฐ์ ์ํธ ์์ฉ์ ์ค๋ช
ํ๊ณ , ํนํ ํจ์ ์ ๋ ๋๋ ์ต์ ๊ฐ ์ํ๋ฆฐ๊ณผ ๊ฐ์ ์ฝ๋ฌผ์ ์น๋ฃ ํจ๋ฅ์ ์ด๋ป๊ฒ ์ํฅ์ ๋ฏธ์น ์ ์๋์ง์ ์ค์ ์ ๋์ญ์์ค."],
|
244 |
["๋ง์ฑ ์ ์ฅ ์งํ ํ์์์ ๋นํ ์น๋ฃ๋ฅผ ์ํด ์ฌ์ฉํ๋ ์๋ฆฌ์ค๋กํฌ์ด์ํด ์ ์ ์ ์ฝ๋ํ์ ๋ฐ ์ฝ๋ ฅํ์ ํน์ฑ์ ์์ธํ ๋ถ์ํ๊ณ , ํฌ์ฌ ์ฉ๋ ๋ฐ ํฌ์ฌ ๊ฐ๊ฒฉ ๊ฒฐ์ ์ ์ํฅ์ ๋ฏธ์น๋ ์์ธ๋ค์ ์ค๋ช
ํด ์ฃผ์ญ์์ค."],
|
245 |
-
["๊ฐ๊ฒฝ๋ณ ์น๋ฃ(๊ฐ ์ฌ์ ํ ํด์)๋ฅผ ์ํ ์ ์ฝ ๊ฐ๋ฐ์ ์ํ '์ฒ์ฐ ์๋ฌผ'๋ค์ ์ถ์ถํ๊ณ ์ด์ ๋ํ ๊ตฌ์ฒด์ ์ธ ์ฝ๋ฆฌ๊ธฐ์ ๊ณผ ๊ทธ ์ด์ , ๊ทธ๋ฆฌ๊ณ ์ด๋ป๊ฒ ์กฐํฉํด์ผ ์ต์์ ํจ๊ณผ๊ฐ ์์์ง ์ถ๋ก ํ์ฌ ํ๋ฐฉ(ํ์ํ)์ ๊ด์ ์์ ์ต์ ์ ๋ต๋ณ์ ํ๋ผ"],
|
246 |
["์์ธ ํ์ด๋จธ๋ณ ์น๋ฃ์ ํจ๊ณผ์ ์ธ ์ฒ์ฐ ์๋ฌผ ๋ฌผ์ง๊ณผ ์ฝ๋ฆฌ๊ธฐ์ ๋ฑ์ ํ๋ฐฉ(ํ์ํ)์ ๊ด์ ์์ ์ค๋ช
ํ๊ณ ์๋ ค์ค"],
|
247 |
-
|
248 |
["๊ณ ํ์ ๊ด๋ฆฌ์์ ACE ์ต์ ์ ์ ARB์ ์์ฉ ๋ฉ์ปค๋์ฆ์ ๋น๊ตํ๊ณ ๋์กฐํ์ฌ ๋ ๋-์์ง์คํ
์ -์๋์คํ
๋ก ์์คํ
์ ๋ฏธ์น๋ ์ํฅ์ ๊ณ ๋ คํ์ญ์์ค."],
|
249 |
["์ 2ํ ๋น๋จ๋ณ์ ๋ณํ ์๋ฆฌํ์ ์ค๋ช
ํ๊ณ ๋ฉํธํฌ๋ฅด๋ฏผ์ด ์ด๋ป๊ฒ ํ๋น ๊ฐํ ํจ๊ณผ๋ฅผ ๋ฌ์ฑํ๋์ง, ์ ์ฅ ์ฅ์ ํ์์ ๋ํ ์ฃผ์ ๊ณ ๋ ค ์ฌํญ์ ํฌํจํ์ฌ ์ค๋ช
ํ์ญ์์ค."],
|
250 |
["์ฌ๋ถ์ ์น๋ฃ์์ ๋ฒ ํ ์ฐจ๋จ์ ์ ์์ฉ ๋ฉ์ปค๋์ฆ๊ณผ ์์์ ์ค์์ฑ์ ๋ํด ๋
ผ์ํ๊ณ , ํน์ ๋ฒ ํ ์์ฉ์ฒด ์ํ๊ณผ ์ฌํ๊ด๊ณ์ ๋ฏธ์น๋ ์ํฅ์ ๋ํด ์ฐธ์กฐํ์ญ์์ค."],
|
251 |
-
|
252 |
["FDA์์ ์น์ธํ ๊ฐ๊ฒฝ๋ณ ์น๋ฃ์ ์ ๊ทธ ์์ฉ ๊ธฐ์ ์ ์ค๋ช
ํด์ฃผ์ธ์.", "FDA์์ ์น์ธํ ๊ณ ํ์ ์น๋ฃ์ ์ ๋ํด ์๋ ค์ฃผ์ธ์."]
|
|
|
253 |
|
254 |
-
|
255 |
-
]
|
256 |
-
|
257 |
-
gr.Examples(
|
258 |
examples=example_prompts,
|
259 |
inputs=input_box,
|
260 |
label="์์ : Gemini์ ์๊ฐ์ ๋ณด๋ ค๋ฉด ๋ค์ ํ๋กฌํํธ๋ฅผ ์ฌ์ฉํด ๋ณด์ธ์!",
|
261 |
-
examples_per_page=3
|
262 |
-
|
263 |
-
|
264 |
-
|
265 |
-
|
266 |
-
|
267 |
-
|
268 |
-
|
269 |
-
lambda msg: (msg, msg, ""), # ๋ฉ์์ง๋ฅผ ์ ์ฅํ๊ณ ์
๋ ฅ์ ์ง์๋๋ค.
|
270 |
inputs=[input_box],
|
271 |
outputs=[msg_store, input_box, input_box],
|
272 |
queue=False
|
273 |
-
|
274 |
-
user_message,
|
275 |
inputs=[msg_store, chatbot],
|
276 |
outputs=[input_box, chatbot],
|
277 |
queue=False
|
278 |
-
|
279 |
-
stream_gemini_response,
|
280 |
inputs=[msg_store, chatbot],
|
281 |
-
outputs=chatbot
|
|
|
282 |
)
|
283 |
-
|
284 |
-
|
285 |
lambda: ([], "", ""),
|
286 |
outputs=[chatbot, input_box, msg_store],
|
287 |
queue=False
|
288 |
-
|
289 |
-
|
290 |
-
with gr.TabItem("์ฌ์ฉ ๋ฐฉ๋ฒ", id="instructions_tab"):
|
291 |
-
gr.Markdown(
|
292 |
-
"""
|
293 |
-
## PharmAI: ๋น์ ์ ์ ๋ฌธ ์ฝ๋ฆฌํ ์ด์์คํดํธ
|
294 |
|
295 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
296 |
|
297 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
298 |
|
299 |
-
|
300 |
-
|
301 |
-
|
302 |
-
|
303 |
-
|
304 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
305 |
|
306 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
307 |
|
308 |
-
|
309 |
|
310 |
-
|
311 |
-
|
312 |
-
3. **์์ ํ๋กฌํํธ ์ง์นจ**:
|
313 |
-
* **์์ฉ ๋ฉ์ปค๋์ฆ**: ํน์ ์ฝ๋ฌผ์ด ๋ถ์ ์์ค์์ ์ด๋ป๊ฒ ์์ฉํ๋์ง ๋ฌผ์ด๋ณด์ธ์. ์: "๋ฉํธํฌ๋ฅด๋ฏผ์ ์์ฉ ๋ฉ์ปค๋์ฆ์ ์ค๋ช
ํ์ญ์์ค."
|
314 |
-
* **์ฝ๋ฌผ ๋์ฌ**: ์ ์ฒด๊ฐ ์ฝ๋ฌผ์ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ๋์ง ๋ฌธ์ํ์ญ์์ค. ์: "CYP450 ํจ์์ ์ฝ๋ฌผ ๋์ฌ ๊ฐ์ ์ํธ ์์ฉ์ ์ค๋ช
ํ์ญ์์ค..."
|
315 |
-
* **์์์ ์๋ฏธ**: ํน์ ์ง๋ณ์ ์น๋ฃํ๋ ๋ฐ ์์ด ์ฝ๋ฌผ์ ์์์ ์ฌ์ฉ์ ๋ํ ์ง๋ฌธ์ ์ ๊ธฐํ์ญ์์ค. ์: "์ฌ๋ถ์ ์น๋ฃ์์ ๋ฒ ํ ์ฐจ๋จ์ ์ ์์ฉ ๋ฉ์ปค๋์ฆ๊ณผ ์์์ ์ค์์ฑ์ ๋ํด ๋
ผ์ํ์ญ์์ค..."
|
316 |
-
* **๋ณํ์๋ฆฌํ ๋ฐ ์ฝ๋ฌผ ํ์ **: ์ง๋ณ, ์์ธ ๋ฐ ์ฝ๋ฌผ์ด ์ง๋ณ์ ์น๋ฃํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ํด ๋ฌธ์ํ์ญ์์ค. ์: "์ 2ํ ๋น๋จ๋ณ์ ๋ณํ ์๋ฆฌํ์ ์ค๋ช
ํ๊ณ ๋ฉํธํฌ๋ฅด๋ฏผ์ด ์ด๋ป๊ฒ ์์ฉํ๋์ง ์ค๋ช
ํ์ญ์์ค..."
|
317 |
-
* **๋ณตํฉ ๋ค์ค ์ฝ๋ฌผ ์ํธ ์์ฉ**: ์ ์ฒด์์ ํ๋์ ์ฝ๋ฌผ์ด ๋ค๋ฅธ ์ฝ๋ฌผ์ ์ด๋ป๊ฒ ์ํฅ์ ๋ฏธ์น ์ ์๋์ง์ ๋ํ ์ง๋ฌธ์ ์ ๊ธฐํ์ญ์์ค.
|
318 |
-
* **์ ํต ์ํ ๊ด์ **: ์ง๋ณ ๋ฐ ์น๋ฃ์ ๋ํ ์ ํต ์ํ(ํ๋ฐฉ๊ณผ ๊ฐ์) ์ ๊ทผ ๋ฐฉ์์ ๋ํด ๋ฌธ์ํ์ญ์์ค. ์: "ํ๋ฐฉ์ ๊ด์ ์์ ์์ธ ํ์ด๋จธ๋ณ ์น๋ฃ์ ํจ๊ณผ์ ์ธ ์ฒ์ฐ ์๋ฌผ ๋ฌผ์ง๊ณผ ๊ทธ ๋ฉ์ปค๋์ฆ์ ์ค๋ช
ํ์ญ์์ค."
|
319 |
-
|
320 |
|
321 |
-
|
|
|
|
|
|
|
|
|
|
|
322 |
|
323 |
-
|
324 |
|
325 |
-
|
|
|
|
|
|
|
326 |
|
327 |
-
|
328 |
-
* ์๋ต์ ํ์ง์ ์ฌ์ฉ์ ํ๋กฌํํธ์ ๋ฐ๋ผ ํฌ๊ฒ ๋ฌ๋ผ์ง๋๋ค. ์ต์์ ๊ฒฐ๊ณผ๋ฅผ ์ป์ผ๋ ค๋ฉด ์ง๋ฌธํ ๋ ๊ฐ๋ฅํ ํ ์์ธํ๊ฒ ์ค๋ช
ํ์ญ์์ค.
|
329 |
-
* ์ด ๋ชจ๋ธ์ ํนํ ์ฝ๋ฆฌํ ์ ๋ณด์ ์ด์ ์ ๋ง์ถ๊ณ ์์ผ๋ฏ๋ก ์ด ๋ฒ์๋ฅผ ๋ฒ์ด๋ ์ง๋ฌธ์๋ ๊ด๋ จ์ฑ ์๋ ๋ต๋ณ์ ์ป์ง ๋ชปํ ์ ์์ต๋๋ค.
|
330 |
-
* ์ด ์ฑ๋ด์ ์ ๋ณด ์ ๊ณต์ฉ ๋ฆฌ์์ค๋ก ์ ๊ณต๋๋ฉฐ ์๋ฃ ์ง๋จ ๋๋ ์น๋ฃ ๊ถ์ฅ ์ฌํญ์ ์ฌ์ฉํด์๋ ์ ๋ฉ๋๋ค. ์๋ฃ ์๋ด์ด ํ์ํ ๊ฒฝ์ฐ ํญ์ ์๋ฃ ์ ๋ฌธ๊ฐ์ ์๋ดํ์ญ์์ค.
|
331 |
|
332 |
-
|
333 |
-
|
|
|
|
|
334 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
335 |
|
336 |
# Launch the interface
|
337 |
if __name__ == "__main__":
|
338 |
-
|
339 |
-
demo.launch(debug=True)
|
|
|
35 |
})
|
36 |
return formatted_history
|
37 |
|
38 |
+
|
39 |
def find_most_similar_data(query):
|
40 |
"""
|
41 |
์ฃผ์ด์ง ์ฟผ๋ฆฌ์ ๊ฐ์ฅ ์ ์ฌํ ๋ฐ์ดํฐ ์ฐพ๊ธฐ
|
|
|
43 |
query_embedding = embedding_model.encode(query, convert_to_tensor=True)
|
44 |
most_similar = None
|
45 |
highest_similarity = -1
|
46 |
+
|
47 |
for split in pharmkg_dataset.keys():
|
48 |
for item in pharmkg_dataset[split]:
|
49 |
if 'Input' in item and 'Output' in item:
|
50 |
item_text = f"์
๋ ฅ: {item['Input']} ์ถ๋ ฅ: {item['Output']}"
|
51 |
item_embedding = embedding_model.encode(item_text, convert_to_tensor=True)
|
52 |
similarity = util.pytorch_cos_sim(query_embedding, item_embedding).item()
|
53 |
+
|
54 |
if similarity > highest_similarity:
|
55 |
highest_similarity = similarity
|
56 |
most_similar = item_text
|
57 |
+
|
58 |
return most_similar
|
59 |
|
60 |
+
|
61 |
def stream_gemini_response(user_message: str, messages: list) -> Iterator[list]:
|
62 |
"""
|
63 |
๋ํ ๊ธฐ๋ก ์ง์์ ํตํด ์๊ฐ๊ณผ ์๋ต์ ์คํธ๋ฆฌ๋ฐํฉ๋๋ค(ํ
์คํธ ์
๋ ฅ๋ง ํด๋น).
|
64 |
"""
|
65 |
+
if not user_message.strip(): # ํ
์คํธ ๋ฉ์์ง๊ฐ ๋น์ด ์๊ฑฐ๋ ๊ณต๋ฐฑ์ธ์ง ํ์ธ
|
66 |
+
messages.append(ChatMessage(role="assistant", content="๋น์ด ์์ง ์์ ํ
์คํธ ๋ฉ์์ง๋ฅผ ์ ๊ณตํด์ฃผ์ธ์. ๋น ์
๋ ฅ์ ํ์ฉ๋์ง ์์ต๋๋ค."))
|
67 |
yield messages
|
68 |
return
|
69 |
|
|
|
74 |
# Gemini์ฉ ๋ํ ๊ธฐ๋ก ํฌ๋งท
|
75 |
chat_history = format_chat_history(messages)
|
76 |
|
77 |
+
# ์ ์ฌ ๋ฐ์ดํฐ ๊ฒ์
|
78 |
most_similar_data = find_most_similar_data(user_message)
|
79 |
+
|
80 |
system_message = "์ฌ์ฉ์ ์ง๋ฌธ์ ๋ํด ์์ฝํ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ์ ๋ฌธ ์ฝํ ์ด์์คํดํธ์
๋๋ค."
|
81 |
system_prefix = """
|
82 |
๋ฐ๋์ ํ๊ธ๋ก ๋ต๋ณํ์ญ์์ค. ๋์ ์ด๋ฆ์ 'PharmAI'์ด๋ค.
|
|
|
109 |
PharmKG๋ ๋ณต์กํ ์ฝ๋ฌผ ๊ด๋ จ ์ ๋ณด๋ฅผ ์ฒด๊ณ์ ์ผ๋ก ์ ๋ฆฌํ๊ณ ๋ถ์ํ ์ ์๊ฒ ํด์ฃผ์ด, ์ฝํ ์ฐ๊ตฌ์ ์์ ์์ฌ๊ฒฐ์ ์ ์ค์ํ ๋๊ตฌ๋ก ํ์ฉ๋๊ณ ์์ต๋๋ค.
|
110 |
"""
|
111 |
|
112 |
+
# ์์คํ
ํ๋กฌํํธ ๋ฐ ๊ด๋ จ ์ปจํ
์คํธ๋ฅผ ์ฌ์ฉ์ ๋ฉ์์ง ์์ ์ถ๊ฐ
|
113 |
if most_similar_data:
|
114 |
+
prefixed_message = f"{system_prefix} {system_message} ๊ด๋ จ ์ ๋ณด: {most_similar_data}\n\n ์ฌ์ฉ์ ์ง๋ฌธ:{user_message}"
|
115 |
else:
|
116 |
+
prefixed_message = f"{system_prefix} {system_message}\n\n ์ฌ์ฉ์ ์ง๋ฌธ:{user_message}"
|
117 |
|
118 |
# Gemini ์ฑํ
์์
|
119 |
chat = model.start_chat(history=chat_history)
|
|
|
181 |
content=thought_buffer,
|
182 |
metadata={"title": "โ๏ธ ์๊ฐ ์ค: *๋ชจ๋ธ์ ์ํด ์์ฑ๋ ์๊ฐ์ ์คํ์ ์
๋๋ค."}
|
183 |
)
|
184 |
+
#time.sleep(0.05) # ๋๋ฒ๊น
/์๊ฐํ๋ฅผ ์ํด ์ฝ๊ฐ์ ์ง์ฐ์ ์ถ๊ฐํ๋ ค๋ฉด ์ฃผ์ ํด์ ํฉ๋๋ค. ์ต์ข
๋ฒ์ ์์๋ ์ ๊ฑฐํฉ๋๋ค.
|
185 |
|
186 |
yield messages
|
187 |
|
|
|
197 |
)
|
198 |
yield messages
|
199 |
|
200 |
+
|
201 |
+
def stream_gemini_response_drug(user_message: str, messages: list) -> Iterator[list]:
|
202 |
+
"""
|
203 |
+
์ ์ฝ ๊ฐ๋ฐ ๊ด๋ จ ์ง๋ฌธ์ ๋ํด Gemini์ ์๊ฐ๊ณผ ์๋ต์ ์คํธ๋ฆฌ๋ฐํฉ๋๋ค.
|
204 |
+
"""
|
205 |
+
if not user_message.strip():
|
206 |
+
messages.append(ChatMessage(role="assistant", content="๋น์ด ์์ง ์์ ํ
์คํธ ๋ฉ์์ง๋ฅผ ์ ๊ณตํด์ฃผ์ธ์. ๋น ์
๋ ฅ์ ํ์ฉ๋์ง ์์ต๋๋ค."))
|
207 |
+
yield messages
|
208 |
+
return
|
209 |
+
|
210 |
+
try:
|
211 |
+
print(f"\n=== ์๋ก์ด ์ ์ฝ ๊ฐ๋ฐ ์์ฒญ (ํ
์คํธ) ===")
|
212 |
+
print(f"์ฌ์ฉ์ ๋ฉ์์ง: {user_message}")
|
213 |
+
|
214 |
+
chat_history = format_chat_history(messages)
|
215 |
+
# PharmKG ๋ฐ์ดํฐ์
๋ด ์ ์ฌ ๋ฐ์ดํฐ ๊ฒ์ (์ ์ฝ ๊ฐ๋ฐ ๊ด๋ จ ์ ๋ณด ํฌํจ ๊ฐ๋ฅ)
|
216 |
+
most_similar_data = find_most_similar_data(user_message)
|
217 |
+
|
218 |
+
system_message = "์ ์ฝ ๊ฐ๋ฐ ์ง์์ ํนํ๋ AI ์กฐ์ธ์์
๋๋ค."
|
219 |
+
system_prefix = """
|
220 |
+
๋ฐ๋์ ํ๊ธ๋ก ๋ต๋ณํ์ญ์์ค. ๋์ ์ด๋ฆ์ 'PharmAI'์ด๋ค.
|
221 |
+
๋น์ ์ '์์ฝํ ์ง์ ๊ทธ๋ํ(PharmKG) ๋ฐ์ดํฐ 100๋ง ๊ฑด ์ด์๊ณผ ์ ์ฝ ๊ฐ๋ฐ ๊ด๋ จ ์ถ๊ฐ ์ ๋ณด๋ฅผ ํ์ตํ ์ ๋ฌธ์ ์ธ ์์ฝํ ๋ฐ ์ ์ฝ ๊ฐ๋ฐ AI ์กฐ์ธ์์
๋๋ค.'
|
222 |
+
์
๋ ฅ๋ ์ง๋ฌธ์ ๋ํด ์ ์ฝ ํ๋ณด ๋ฌผ์ง, ๋ฆฌ๊ฐ๋ ์ต์ ํ, ADMET ํ๊ฐ, ์์ ์ ํ๊ฐ ๋ฑ ์ ์ฝ ๊ฐ๋ฐ์ ํ์ํ ์ ๋ณด๋ฅผ ๋ถ์ํ๊ณ , ์์ธํ ๋ต๋ณ์ ์ ๊ณตํฉ๋๋ค.
|
223 |
+
๋ต๋ณ์ ๋ค์ ๊ตฌ์กฐ๋ฅผ ๋ฐ๋ฅด์ญ์์ค:
|
224 |
+
|
225 |
+
1. **์ ์ฝ ํ๋ณด ๋ฌผ์ง ์ ์:** ์ง๋ฌธ๊ณผ ๊ด๋ จ๋ ์งํ์ ๋ํด ๊ฐ๋ฅ์ฑ ์๋ ์ ์ฝ ํ๋ณด ๋ฌผ์ง์ ์ ์ํฉ๋๋ค.
|
226 |
+
2. **๊ตฌ์กฐ-ํ์ฑ ๊ด๊ณ (SAR) ๋ถ์:** ํ๋ณด ๋ฌผ์ง์ ๊ตฌ์กฐ์ ํ์ฑ ๊ฐ์ ๊ด๊ณ๋ฅผ ๋ถ์ํฉ๋๋ค.
|
227 |
+
3. **ADMET ํ๊ฐ:** ํ๋ณด ๋ฌผ์ง์ ์ฝ๋ํ ๋ฐ ๋
์ฑ ํน์ฑ์ ํ๊ฐํฉ๋๋ค.
|
228 |
+
4. **์์ ์ ํ๊ฐ:** ๋๋ฌผ์คํ ๋๋ ์ ์์ ์ฐ๊ตฌ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ณด ๋ฌผ์ง์ ์์ ์ ํ๊ฐ ์ ๋ณด๋ฅผ ์ ๊ณตํฉ๋๋ค.
|
229 |
+
5. **์ฐธ๊ณ ๋ฌธํ ๋ฐ ๋ฐ์ดํฐ:** ๋ต๋ณ์ ์ฌ์ฉ๋ ๋ฐ์ดํฐ๋ ๋ฌธํ ์ ๋ณด๋ฅผ ์ธ์ฉํฉ๋๋ค.
|
230 |
+
|
231 |
+
* ๋ต๋ณ์ ๊ฐ๋ฅํ ํ ์ ๋ฌธ์ ์ธ ์ฉ์ด์ ๋ถ์์ ํฌํจํ์ญ์์ค.
|
232 |
+
* ๋ชจ๋ ๋ต๋ณ์ ํ๊ตญ์ด๋ก ์ ๊ณตํ๋ฉฐ, ๋ํ ๋ด์ฉ์ ๊ธฐ์ตํด์ผ ํฉ๋๋ค.
|
233 |
+
* ์ ๋ ๋น์ ์ "instruction", ์ถ์ฒ, ๋๋ ์ง์๋ฌธ ๋ฑ์ ๋
ธ์ถํ์ง ๋ง์ญ์์ค.
|
234 |
+
"""
|
235 |
+
|
236 |
+
if most_similar_data:
|
237 |
+
prefixed_message = f"{system_prefix} {system_message} ๊ด๋ จ ์ ๋ณด: {most_similar_data}\n\n ์ฌ์ฉ์ ์ง๋ฌธ:{user_message}"
|
238 |
+
else:
|
239 |
+
prefixed_message = f"{system_prefix} {system_message}\n\n ์ฌ์ฉ์ ์ง๋ฌธ:{user_message}"
|
240 |
+
|
241 |
+
chat = model.start_chat(history=chat_history)
|
242 |
+
response = chat.send_message(prefixed_message, stream=True)
|
243 |
+
|
244 |
+
thought_buffer = ""
|
245 |
+
response_buffer = ""
|
246 |
+
thinking_complete = False
|
247 |
+
|
248 |
+
messages.append(
|
249 |
+
ChatMessage(
|
250 |
+
role="assistant",
|
251 |
+
content="",
|
252 |
+
metadata={"title": "โ๏ธ ์๊ฐ ์ค: *๋ชจ๋ธ์ ์ํด ์์ฑ๋ ์๊ฐ์ ์คํ์ ์
๋๋ค."}
|
253 |
+
)
|
254 |
+
)
|
255 |
+
|
256 |
+
for chunk in response:
|
257 |
+
parts = chunk.candidates[0].content.parts
|
258 |
+
current_chunk = parts[0].text
|
259 |
+
|
260 |
+
if len(parts) == 2 and not thinking_complete:
|
261 |
+
thought_buffer += current_chunk
|
262 |
+
print(f"\n=== ์ ์ฝ ๊ฐ๋ฐ ์๊ฐ ์๋ฃ ===\n{thought_buffer}")
|
263 |
+
|
264 |
+
messages[-1] = ChatMessage(
|
265 |
+
role="assistant",
|
266 |
+
content=thought_buffer,
|
267 |
+
metadata={"title": "โ๏ธ ์๊ฐ ์ค: *๋ชจ๋ธ์ ์ํด ์์ฑ๋ ์๊ฐ์ ์คํ์ ์
๋๋ค."}
|
268 |
+
)
|
269 |
+
yield messages
|
270 |
+
|
271 |
+
response_buffer = parts[1].text
|
272 |
+
print(f"\n=== ์ ์ฝ ๊ฐ๋ฐ ์๋ต ์์ ===\n{response_buffer}")
|
273 |
+
|
274 |
+
messages.append(
|
275 |
+
ChatMessage(
|
276 |
+
role="assistant",
|
277 |
+
content=response_buffer
|
278 |
+
)
|
279 |
+
)
|
280 |
+
thinking_complete = True
|
281 |
+
|
282 |
+
elif thinking_complete:
|
283 |
+
response_buffer += current_chunk
|
284 |
+
print(f"\n=== ์ ์ฝ ๊ฐ๋ฐ ์๋ต ์ฒญํฌ ===\n{current_chunk}")
|
285 |
+
|
286 |
+
messages[-1] = ChatMessage(
|
287 |
+
role="assistant",
|
288 |
+
content=response_buffer
|
289 |
+
)
|
290 |
+
else:
|
291 |
+
thought_buffer += current_chunk
|
292 |
+
print(f"\n=== ์ ์ฝ ๊ฐ๋ฐ ์๊ฐ ์ฒญํฌ ===\n{current_chunk}")
|
293 |
+
|
294 |
+
messages[-1] = ChatMessage(
|
295 |
+
role="assistant",
|
296 |
+
content=thought_buffer,
|
297 |
+
metadata={"title": "โ๏ธ ์๊ฐ ์ค: *๋ชจ๋ธ์ ์ํด ์์ฑ๋ ์๊ฐ์ ์คํ์ ์
๋๋ค."}
|
298 |
+
)
|
299 |
+
yield messages
|
300 |
+
|
301 |
+
print(f"\n=== ์ ์ฝ ๊ฐ๋ฐ ์ต์ข
์๋ต ===\n{response_buffer}")
|
302 |
+
|
303 |
+
except Exception as e:
|
304 |
+
print(f"\n=== ์ ์ฝ ๊ฐ๋ฐ ์ค๋ฅ ===\n{str(e)}")
|
305 |
+
messages.append(
|
306 |
+
ChatMessage(
|
307 |
+
role="assistant",
|
308 |
+
content=f"์ฃ์กํฉ๋๋ค. ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค: {str(e)}"
|
309 |
+
)
|
310 |
+
)
|
311 |
+
yield messages
|
312 |
+
|
313 |
+
|
314 |
def user_message(msg: str, history: list) -> tuple[str, list]:
|
315 |
"""์ฌ์ฉ์ ๋ฉ์์ง๋ฅผ ๋ํ ๊ธฐ๋ก์ ์ถ๊ฐ"""
|
316 |
history.append(ChatMessage(role="user", content=msg))
|
317 |
return "", history
|
318 |
|
319 |
+
|
320 |
with gr.Blocks(
|
321 |
theme=gr.themes.Soft(primary_hue="teal", secondary_hue="slate", neutral_hue="neutral"),
|
322 |
css="""
|
|
|
328 |
) as demo:
|
329 |
gr.Markdown("# ๐ญ PharmAI: ์ถ๋ก ๊ธฐ๋ฐ ์ฝ๋ฆฌํ ์ ๋ฌธ AI ์๋น์ค ๐ญ")
|
330 |
|
|
|
|
|
331 |
gr.HTML("""<a href="https://visitorbadge.io/status?path=https%3A%2F%2Faiqcamp-Gemini2-Flash-Thinking.hf.space">
|
332 |
<img src="https://api.visitorbadge.io/api/visitors?path=https%3A%2F%2Faiqcamp-Gemini2-Flash-Thinking.hf.space&countColor=%23263759" />
|
333 |
</a>""")
|
334 |
+
|
335 |
with gr.Tabs() as tabs:
|
336 |
+
with gr.TabItem("๋ํ", id="chat_tab"):
|
337 |
+
chatbot = gr.Chatbot(
|
338 |
+
type="messages",
|
339 |
+
label="PharmAI ์ฑ๋ด (์คํธ๋ฆฌ๋ฐ ์ถ๋ ฅ)",
|
340 |
+
render_markdown=True,
|
341 |
+
scale=1,
|
342 |
+
avatar_images=(None, "https://lh3.googleusercontent.com/oxz0sUBF0iYoN4VvhqWTmux-cxfD1rxuYkuFEfm1SFaseXEsjjE4Je_C_V3UQPuJ87sImQK3HfQ3RXiaRnQetjaZbjJJUkiPL5jFJ1WRl5FKJZYibUA=w214-h214-n-nu"),
|
343 |
+
elem_classes="chatbot-wrapper"
|
344 |
+
)
|
345 |
+
|
346 |
+
with gr.Row(equal_height=True):
|
347 |
+
input_box = gr.Textbox(
|
348 |
+
lines=1,
|
349 |
+
label="๋ํ ๋ฉ์์ง",
|
350 |
+
placeholder="์ฌ๊ธฐ์ ๋ฉ์์ง๋ฅผ ์
๋ ฅํ์ธ์...",
|
351 |
+
scale=4
|
352 |
+
)
|
353 |
+
clear_button = gr.Button("๋ํ ์ด๊ธฐํ", scale=1)
|
354 |
+
|
355 |
+
example_prompts = [
|
|
|
|
|
356 |
["CYP450 ํจ์์ ์ฝ๋ฌผ ๋์ฌ ๊ฐ์ ์ํธ ์์ฉ์ ์ค๋ช
ํ๊ณ , ํนํ ํจ์ ์ ๋ ๋๋ ์ต์ ๊ฐ ์ํ๋ฆฐ๊ณผ ๊ฐ์ ์ฝ๋ฌผ์ ์น๋ฃ ํจ๋ฅ์ ์ด๋ป๊ฒ ์ํฅ์ ๋ฏธ์น ์ ์๋์ง์ ์ค์ ์ ๋์ญ์์ค."],
|
357 |
["๋ง์ฑ ์ ์ฅ ์งํ ํ์์์ ๋นํ ์น๋ฃ๋ฅผ ์ํด ์ฌ์ฉํ๋ ์๋ฆฌ์ค๋กํฌ์ด์ํด ์ ์ ์ ์ฝ๋ํ์ ๋ฐ ์ฝ๋ ฅํ์ ํน์ฑ์ ์์ธํ ๋ถ์ํ๊ณ , ํฌ์ฌ ์ฉ๋ ๋ฐ ํฌ์ฌ ๊ฐ๊ฒฉ ๊ฒฐ์ ์ ์ํฅ์ ๋ฏธ์น๋ ์์ธ๋ค์ ์ค๋ช
ํด ์ฃผ์ญ์์ค."],
|
358 |
+
["๊ฐ๊ฒฝ๋ณ ์น๋ฃ(๊ฐ ์ฌ์ ํ ํด์)๋ฅผ ์ํ ์ ์ฝ ๊ฐ๋ฐ์ ์ํ '์ฒ์ฐ ์๋ฌผ'๋ค์ ์ถ์ถํ๊ณ ์ด์ ๋ํ ๊ตฌ์ฒด์ ์ธ ์ฝ๋ฆฌ๊ธฐ์ ๊ณผ ๊ทธ ์ด์ , ๊ทธ๋ฆฌ๊ณ ์ด๋ป๊ฒ ์กฐํฉํด์ผ ์ต์์ ํจ๊ณผ๊ฐ ์์์ง ์ถ๋ก ํ์ฌ ํ๋ฐฉ(ํ์ํ)์ ๊ด์ ์์ ์ต์ ์ ๋ต๋ณ์ ํ๋ผ"],
|
359 |
["์์ธ ํ์ด๋จธ๋ณ ์น๋ฃ์ ํจ๊ณผ์ ์ธ ์ฒ์ฐ ์๋ฌผ ๋ฌผ์ง๊ณผ ์ฝ๋ฆฌ๊ธฐ์ ๋ฑ์ ํ๋ฐฉ(ํ์ํ)์ ๊ด์ ์์ ์ค๋ช
ํ๊ณ ์๋ ค์ค"],
|
360 |
+
["๊ณ ํ์ ์น๋ฃ ๋ฐ ์ฆ์ ์ํ์ ํจ๊ณผ์ ์ธ ์ ์ฝ ๊ฐ๋ฐ์ ์ํด ๊ฐ๋ฅ์ฑ์ด ๋งค์ฐ ๋์ ์ฒ์ฐ ์๋ฌผ ๋ฌผ์ง๊ณผ ์ฝ๋ฆฌ๊ธฐ์ ๋ฑ์ ํ๋ฐฉ(ํ์ํ)์ ๊ด์ ์์ ์ค๋ช
ํ๊ณ ์๋ ค์ค"],
|
361 |
["๊ณ ํ์ ๊ด๋ฆฌ์์ ACE ์ต์ ์ ์ ARB์ ์์ฉ ๋ฉ์ปค๋์ฆ์ ๋น๊ตํ๊ณ ๋์กฐํ์ฌ ๋ ๋-์์ง์คํ
์ -์๋์คํ
๋ก ์์คํ
์ ๋ฏธ์น๋ ์ํฅ์ ๊ณ ๋ คํ์ญ์์ค."],
|
362 |
["์ 2ํ ๋น๋จ๋ณ์ ๋ณํ ์๋ฆฌํ์ ์ค๋ช
ํ๊ณ ๋ฉํธํฌ๋ฅด๋ฏผ์ด ์ด๋ป๊ฒ ํ๋น ๊ฐํ ํจ๊ณผ๋ฅผ ๋ฌ์ฑํ๋์ง, ์ ์ฅ ์ฅ์ ํ์์ ๋ํ ์ฃผ์ ๊ณ ๋ ค ์ฌํญ์ ํฌํจํ์ฌ ์ค๋ช
ํ์ญ์์ค."],
|
363 |
["์ฌ๋ถ์ ์น๋ฃ์์ ๋ฒ ํ ์ฐจ๋จ์ ์ ์์ฉ ๋ฉ์ปค๋์ฆ๊ณผ ์์์ ์ค์์ฑ์ ๋ํด ๋
ผ์ํ๊ณ , ํน์ ๋ฒ ํ ์์ฉ์ฒด ์ํ๊ณผ ์ฌํ๊ด๊ณ์ ๋ฏธ์น๋ ์ํฅ์ ๋ํด ์ฐธ์กฐํ์ญ์์ค."],
|
364 |
+
["์์ธ ํ๏ฟฝ๏ฟฝ๏ฟฝ๋จธ๋ณ์ ๋ณํ์๋ฆฌํ์ ๊ธฐ์ ์ ์ค๋ช
ํ๊ณ , ํ์ฌ ์ฌ์ฉ๋๋ ์ฝ๋ฌผ๋ค์ด ์์ฉํ๋ ์ฃผ์ ํ๊ฒ์ ์์ธํ ๊ธฐ์ ํ์ญ์์ค. ํนํ, ์์ธํธ์ฝ๋ฆฐ์์คํ
๋ผ์ ์ต์ ์ ์ NMDA ์์ฉ์ฒด ๊ธธํญ์ ์ ์์ฉ ๋ฐฉ์๊ณผ ์์์ ์์๋ฅผ ๋น๊ต ๋ถ์ํด ์ฃผ์ญ์์ค."],
|
365 |
["FDA์์ ์น์ธํ ๊ฐ๊ฒฝ๋ณ ์น๋ฃ์ ์ ๊ทธ ์์ฉ ๊ธฐ์ ์ ์ค๋ช
ํด์ฃผ์ธ์.", "FDA์์ ์น์ธํ ๊ณ ํ์ ์น๋ฃ์ ์ ๋ํด ์๋ ค์ฃผ์ธ์."]
|
366 |
+
]
|
367 |
|
368 |
+
gr.Examples(
|
|
|
|
|
|
|
369 |
examples=example_prompts,
|
370 |
inputs=input_box,
|
371 |
label="์์ : Gemini์ ์๊ฐ์ ๋ณด๋ ค๋ฉด ๋ค์ ํ๋กฌํํธ๋ฅผ ์ฌ์ฉํด ๋ณด์ธ์!",
|
372 |
+
examples_per_page=3
|
373 |
+
)
|
374 |
+
|
375 |
+
# ์ด๋ฒคํธ ํธ๋ค๋ฌ ์ค์
|
376 |
+
msg_store = gr.State("") # ์ฌ์ฉ์ ๋ฉ์์ง๋ฅผ ๋ณด์กดํ๊ธฐ ์ํ ์ ์ฅ์
|
377 |
+
|
378 |
+
input_box.submit(
|
379 |
+
lambda msg: (msg, msg, ""),
|
|
|
380 |
inputs=[input_box],
|
381 |
outputs=[msg_store, input_box, input_box],
|
382 |
queue=False
|
383 |
+
).then(
|
384 |
+
user_message,
|
385 |
inputs=[msg_store, chatbot],
|
386 |
outputs=[input_box, chatbot],
|
387 |
queue=False
|
388 |
+
).then(
|
389 |
+
stream_gemini_response,
|
390 |
inputs=[msg_store, chatbot],
|
391 |
+
outputs=chatbot,
|
392 |
+
queue=True
|
393 |
)
|
394 |
+
|
395 |
+
clear_button.click(
|
396 |
lambda: ([], "", ""),
|
397 |
outputs=[chatbot, input_box, msg_store],
|
398 |
queue=False
|
399 |
+
)
|
|
|
|
|
|
|
|
|
|
|
400 |
|
401 |
+
with gr.TabItem("์ ์ฝ ๊ฐ๋ฐ ์ง์", id="drug_development_tab"):
|
402 |
+
drug_chatbot = gr.Chatbot(
|
403 |
+
type="messages",
|
404 |
+
label="์ ์ฝ ๊ฐ๋ฐ ์ง์ ์ฑ๋ด (์คํธ๋ฆฌ๋ฐ ์ถ๋ ฅ)",
|
405 |
+
render_markdown=True,
|
406 |
+
scale=1,
|
407 |
+
avatar_images=(None, "https://lh3.googleusercontent.com/oxz0sUBF0iYoN4VvhqWTmux-cxfD1rxuYkuFEfm1SFaseXEsjjE4Je_C_V3UQPuJ87sImQK3HfQ3RXiaRnQetjaZbjJJUkiPL5jFJ1WRl5FKJZYibUA=w214-h214-n-nu"),
|
408 |
+
elem_classes="chatbot-wrapper"
|
409 |
+
)
|
410 |
|
411 |
+
with gr.Row(equal_height=True):
|
412 |
+
drug_input_box = gr.Textbox(
|
413 |
+
lines=1,
|
414 |
+
label="์ ์ฝ ๊ฐ๋ฐ ์ง๋ฌธ ์
๋ ฅ",
|
415 |
+
placeholder="์ ์ฝ ๊ฐ๋ฐ ๊ด๋ จ ์ง๋ฌธ์ ์
๋ ฅํ์ธ์...",
|
416 |
+
scale=4
|
417 |
+
)
|
418 |
+
drug_clear_button = gr.Button("๋ํ ์ด๊ธฐํ", scale=1)
|
419 |
+
|
420 |
+
drug_example_prompts = [
|
421 |
+
["ํน์ ์งํ์ ๋ํ ์ ์ฝ ํ๋ณด ๋ฌผ์ง์ ์ ์ํด ์ฃผ์ธ์. ํ๊ฒ ๋จ๋ฐฑ์ง์ EGFR์ด๋ฉฐ, ํ๋ณด ๋ฌผ์ง์ ๊ตฌ์กฐ์ ํน์ง์ ๋ฐฉํฅ์กฑ ๊ณ ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ํฌํจํฉ๋๋ค."],
|
422 |
+
["๋ฆฌ๊ฐ๋ ์ต์ ํ๋ฅผ ์ํ ๊ตฌ์กฐ-ํ์ฑ ๊ด๊ณ ๋ถ์์ ์ ๊ณตํด ์ฃผ์ธ์. ํ๋ณด ๋ฌผ์ง์ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ C1=CC=CC=C1์
๋๋ค."],
|
423 |
+
["ADMET ํ๊ฐ์ ๊ด๋ จ๋ ์์ธก ์ ๋ณด๋ฅผ ์ ๊ณตํด ์ฃผ์ธ์. ํน์ ํ๋ณด ๋ฌผ์ง์ ๋ํ ๋
์ฑ ๋ฐ ์ฝ๋ํ์ ํน์ฑ์ ๋ถ์ํด ์ฃผ์ธ์."]
|
424 |
+
]
|
425 |
+
gr.Examples(
|
426 |
+
examples=drug_example_prompts,
|
427 |
+
inputs=drug_input_box,
|
428 |
+
label="์์ : ์ ์ฝ ๊ฐ๋ฐ ๊ด๋ จ ์ง๋ฌธ",
|
429 |
+
examples_per_page=3
|
430 |
+
)
|
431 |
|
432 |
+
drug_msg_store = gr.State("")
|
433 |
+
drug_input_box.submit(
|
434 |
+
lambda msg: (msg, msg, ""),
|
435 |
+
inputs=[drug_input_box],
|
436 |
+
outputs=[drug_msg_store, drug_input_box, drug_input_box],
|
437 |
+
queue=False
|
438 |
+
).then(
|
439 |
+
user_message,
|
440 |
+
inputs=[drug_msg_store, drug_chatbot],
|
441 |
+
outputs=[drug_input_box, drug_chatbot],
|
442 |
+
queue=False
|
443 |
+
).then(
|
444 |
+
stream_gemini_response_drug,
|
445 |
+
inputs=[drug_msg_store, drug_chatbot],
|
446 |
+
outputs=drug_chatbot,
|
447 |
+
queue=True
|
448 |
+
)
|
449 |
|
450 |
+
drug_clear_button.click(
|
451 |
+
lambda: ([], "", ""),
|
452 |
+
outputs=[drug_chatbot, drug_input_box, drug_msg_store],
|
453 |
+
queue=False
|
454 |
+
)
|
455 |
+
|
456 |
+
with gr.TabItem("์ฌ์ฉ ๋ฐฉ๋ฒ", id="instructions_tab"):
|
457 |
+
gr.Markdown(
|
458 |
+
"""
|
459 |
+
## PharmAI: ๋น์ ์ ์ ๋ฌธ ์ฝ๋ฆฌํ ์ด์์คํดํธ
|
460 |
|
461 |
+
PharmAI์ ์ค์ ๊ฒ์ ํ์ํฉ๋๋ค. PharmAI๋ Google์ Gemini 2.0 Flash ๋ชจ๋ธ๋ก ๊ตฌ๋๋๋ ์ ๋ฌธ ์ฑ๋ด์
๋๋ค. PharmAI๋ ๊ด๋ฒ์ํ ์ฝ๋ฆฌํ ์ง์ ๊ทธ๋ํ๋ฅผ ํ์ฉํ์ฌ ์ฝ๋ฆฌํ ์ฃผ์ ์ ๋ํ ์ ๋ฌธ๊ฐ ์์ค์ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋๋ก ์ค๊ณ๋์์ต๋๋ค.
|
462 |
|
463 |
+
**์ฃผ์ ๊ธฐ๋ฅ:**
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
464 |
|
465 |
+
* **๊ณ ๊ธ ์ฝ๋ฆฌํ ํต์ฐฐ๋ ฅ**: PharmAI๋ ๊ด๋ฒ์ํ ์ฝ๋ฆฌํ ์ง์ ๊ทธ๋ํ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์กฐํ๋๊ณ ์์ธํ ๋ต๋ณ์ ์ ๊ณตํฉ๋๋ค.
|
466 |
+
* **์ถ๋ก ๋ฐ ์ถ๋ก **: ์ฑ๋ด์ ๋ณต์กํ๊ณ ๋ค๋ฉด์ ์ธ ์ง๋ฌธ์ ์ฒ๋ฆฌํ์ฌ ์ฌ์ฉ ๊ฐ๋ฅํ ์ ๋ณด๋ก๋ถํฐ ์ถ๋ก ํ๊ณ ์ถ๋ก ํ๋ ๋ฅ๋ ฅ์ ๋ณด์ฌ์ค๋๋ค.
|
467 |
+
* **๊ตฌ์กฐํ๋ ์๋ต**: ์๋ต์ ์ ์, ์์ฉ ๊ธฐ์ , ์ ์์ฆ, ํฌ์ฌ๋, ๋ถ์์ฉ, ์ฝ๋ฌผ ์ํธ ์์ฉ, ์ฝ๋ํ ๋ฐ ํด๋น๋๋ ๊ฒฝ์ฐ ์ฐธ์กฐ ๋ฌธํ์ ํฌํจํ๋๋ก ๋
ผ๋ฆฌ์ ์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
|
468 |
+
* **์ฌ๊ณ ๊ณผ์ ํ์**: ๋ชจ๋ธ์ด ์๋ต์ ์์ฑํ ๋ ๋ชจ๋ธ์ ์ฌ๊ณ ๊ณผ์ ์ ๊ด์ฐฐํ ์ ์์ต๋๋ค(์คํ์ ๊ธฐ๋ฅ).
|
469 |
+
* **๋ํ ๊ธฐ๋ก**: PharmAI๋ ์ด์ ๋ํ ๋ถ๋ถ์ ๊ธฐ์ตํ์ฌ ์ฌ๋ฌ ๋ฒ์ ๊ฑธ์ณ ๋ ์ ํ๏ฟฝ๏ฟฝ๊ณ ๊ด๋ จ์ฑ ์๋ ์ ๋ณด๋ฅผ ์ ๊ณตํฉ๋๋ค.
|
470 |
+
* **์คํธ๋ฆฌ๋ฐ ์ถ๋ ฅ**: ์ฑ๋ด์ ๋ํํ ๊ฒฝํ์ ์ํด ์๋ต์ ์คํธ๋ฆฌ๋ฐํฉ๋๋ค.
|
471 |
|
472 |
+
**์ ์ฝ ๊ฐ๋ฐ ์ง์ ๊ธฐ๋ฅ:**
|
473 |
|
474 |
+
* **์ ์ฝ ํ๋ณด ๋ฌผ์ง ์ ์**: ํน์ ์งํ์ด๋ ํ๊ฒ์ ๋ํด ๊ฐ๋ฅ์ฑ ์๋ ์ ์ฝ ํ๋ณด ๋ฌผ์ง์ ์ ์ํฉ๋๋ค.
|
475 |
+
* **๊ตฌ์กฐ-ํ์ฑ ๊ด๊ณ ๋ถ์ (SAR)**: ํ๋ณด ๋ฌผ์ง์ ๊ตฌ์กฐ์ ํ์ฑ ๊ฐ์ ๊ด๊ณ๋ฅผ ๋ถ์ํฉ๋๋ค.
|
476 |
+
* **ADMET ํ๊ฐ**: ํ๋ณด ๋ฌผ์ง์ ์ฝ๋ํ ๋ฐ ๋
์ฑ ํน์ฑ์ ํ๊ฐํฉ๋๋ค.
|
477 |
+
* **์์ ์ ํ๊ฐ ์ ๋ณด ์ ๊ณต**: ์ ์์ ์ฐ๊ตฌ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ ํ๋ณด ๋ฌผ์ง์ ํ๊ฐ ์ ๋ณด๋ฅผ ์ ๊ณตํฉ๋๋ค.
|
478 |
|
479 |
+
**์ฌ์ฉ ๋ฐฉ๋ฒ:**
|
|
|
|
|
|
|
480 |
|
481 |
+
1. **๋ํ ์์ (์ผ๋ฐ ์ฝ๋ฆฌํ)**: "๋ํ" ํญ์์ ์ง๋ฌธ์ ์
๋ ฅํ์ธ์.
|
482 |
+
2. **์ ์ฝ ๊ฐ๋ฐ ์ง๋ฌธ**: "์ ์ฝ ๊ฐ๋ฐ ์ง์" ํญ์์ ์ ์ฝ ๊ฐ๋ฐ ๊ด๋ จ ์ง๋ฌธ์ ์
๋ ฅํ์ธ์.
|
483 |
+
3. **์์ ํ๋กฌํํธ ์ฌ์ฉ**: ์ ๊ณต๋ ์์ ์ง๋ฌธ์ ํ์ฉํ์ฌ ๋ณด๋ค ๊ตฌ์ฒด์ ์ธ ์ ๋ณด๋ฅผ ์์ฒญํ ์ ์์ต๋๋ค.
|
484 |
+
4. **๋ํ ์ด๊ธฐํ**: "๋ํ ์ด๊ธฐํ" ๋ฒํผ์ ์ฌ์ฉํ์ฌ ์ ์ธ์
์ ์์ํ์ธ์.
|
485 |
|
486 |
+
**์ฃผ์ ์ฌํญ:**
|
487 |
+
|
488 |
+
* '์๊ฐ ์ค' ๊ธฐ๋ฅ์ ์คํ์ ์ด์ง๋ง ์๋ต ์์ฑ ๊ณผ์ ์ ์ผ๋ถ ๋จ๊ณ๋ฅผ ๋ณด์ฌ์ค๋๋ค.
|
489 |
+
* ์๋ต์ ํ์ง์ ์
๋ ฅ ํ๋กฌํํธ์ ๊ตฌ์ฒด์ฑ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค.
|
490 |
+
* ์ด ์ฑ๋ด์ ์ ๋ณด ์ ๊ณต์ฉ ๋๊ตฌ์ด๋ฉฐ, ์๋ฃ ์ง๋จ์ด๋ ์น๋ฃ ๊ถ๊ณ ๋ก ์ฌ์ฉํด์๋ ์ ๋ฉ๋๋ค.
|
491 |
+
"""
|
492 |
+
)
|
493 |
|
494 |
# Launch the interface
|
495 |
if __name__ == "__main__":
|
496 |
+
demo.launch(debug=True)
|
|