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)
|
|
|