Spaces:
Sleeping
Sleeping
Upload 3 files
Browse files- .gitattributes +1 -0
- Maximizing Muscle Hypertrophy.pdf +3 -0
- app(1).py +124 -0
- requirements.txt +9 -0
.gitattributes
CHANGED
|
@@ -33,3 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
|
| 33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
| 34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
|
|
|
|
|
| 33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
| 34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
| 36 |
+
Maximizing[[:space:]]Muscle[[:space:]]Hypertrophy.pdf filter=lfs diff=lfs merge=lfs -text
|
Maximizing Muscle Hypertrophy.pdf
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:662b3f4fd341796bd79d517bb383fca4041288bd645f793d1bf3eb6eec2082d9
|
| 3 |
+
size 527026
|
app(1).py
ADDED
|
@@ -0,0 +1,124 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import os
|
| 2 |
+
import gradio as gr
|
| 3 |
+
from langchain_google_genai import ChatGoogleGenerativeAI, GoogleGenerativeAIEmbeddings
|
| 4 |
+
from langchain_community.document_loaders import PyPDFLoader
|
| 5 |
+
from langchain_text_splitters import RecursiveCharacterTextSplitter
|
| 6 |
+
from langchain_chroma import Chroma
|
| 7 |
+
from langchain_core.prompts import ChatPromptTemplate
|
| 8 |
+
|
| 9 |
+
# 1. ๋ฌธ์ ๋ก๋ ๋ฐ ๋ฒกํฐ DB ๊ตฌ์ถ (์๋ฒ ๊ตฌ๋ ์ 1ํ ๊ณ ์ )
|
| 10 |
+
loader = PyPDFLoader("Maximizing Muscle Hypertrophy.pdf")
|
| 11 |
+
pages = loader.load_and_split()
|
| 12 |
+
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
|
| 13 |
+
splits = text_splitter.split_documents(pages)
|
| 14 |
+
|
| 15 |
+
embeddings = GoogleGenerativeAIEmbeddings(model="gemini-embedding-001")
|
| 16 |
+
vectorstore = Chroma.from_documents(documents=splits, embedding=embeddings)
|
| 17 |
+
|
| 18 |
+
# ๋ฏธ์
3: ๋๋ฉ์ธ ๋ง์ถค ์์คํ
ํ๋กฌํํธ
|
| 19 |
+
SYSTEM_PROMPT = """๋น์ ์ ์คํฌ์ธ ์์ํ ๋ฐ ๊ทผ๋น๋(Muscle Hypertrophy) ํ๋ จ ๋ถ์ผ์ ์ต๊ณ ๊ถ์์์ด์ ๋
ผ๋ฌธ ๋ฆฌ๋ทฐ ์ ๋ฌธ๊ฐ์
๋๋ค.
|
| 20 |
+
์ ๊ณต๋ [๋
ผ๋ฌธ ์ปจํ
์คํธ]๋ฅผ ๋ฐํ์ผ๋ก ์ฌ์ฉ์์ ์ง๋ฌธ์ ์ ๋ฌธ์ ์ด๊ณ ๋ช
ํํ๋ฉฐ ๊ฐ๊ด์ ์ธ ์ด์กฐ๋ก ๋ต๋ณํ์ธ์.
|
| 21 |
+
|
| 22 |
+
[์ ์ฝ ์กฐ๊ฑด]
|
| 23 |
+
1. ๋ฐ๋์ ์ ๊ณต๋ ์ปจํ
์คํธ ๋ด์ ์ ๋ณด๋ง์ ์ฌ์ฉํ์ฌ ๋ต๋ณํ์ธ์.
|
| 24 |
+
2. ๋
ผ๋ฌธ์ ์๋ ๋ด์ฉ์ ์ง๋ฌธํ๋ฉด "ํด๋น ๋ด์ฉ์ ์ ๊ณต๋ ๋
ผ๋ฌธ์์ ํ์ธํ ์ ์์ต๋๋ค."๋ผ๊ณ ๋ช
ํํ ์ ์ ๊ทธ์ผ์ธ์.
|
| 25 |
+
3. ๊ทผ์ก ์ฑ์ฅ ๊ธฐ์ ์ด๋ ํ๋ จ๋ฒ์ ์ค๋ช
ํ ๋๋ ์ผ๋ฐ์ธ๋ ์ดํดํ๊ธฐ ์ฝ๊ฒ ๋จ๊ณ๋ณ๋ก ๊ตฌ์กฐํํ์ฌ ์ค๋ช
ํ์ธ์.
|
| 26 |
+
4. ๋ชจ๋ ๋ต๋ณ์ ํ๊ตญ์ด๋ก ์์ฑํ๋ฉฐ, ์ฃผ์ ์ํ ๋ฐ ์ด๋ํ ์ ๋ฌธ ์ฉ์ด๋ ๊ดํธ ์์ ์๋ฌธ์ ๋ณ๊ธฐํ์ธ์ (์: ๋จ๋ฐฑ์ง ํฉ์ฑ(Protein Synthesis)).
|
| 27 |
+
|
| 28 |
+
[๋
ผ๋ฌธ ์ปจํ
์คํธ]
|
| 29 |
+
{context}"""
|
| 30 |
+
|
| 31 |
+
qa_prompt = ChatPromptTemplate.from_messages([
|
| 32 |
+
("system", SYSTEM_PROMPT),
|
| 33 |
+
("placeholder", "{chat_history}"),
|
| 34 |
+
("human", "{input}"),
|
| 35 |
+
])
|
| 36 |
+
|
| 37 |
+
# Gradio์ ๋ํ ๊ธฐ๋ก ํ์์ LangChain์ด ์ดํดํ ์ ์๊ฒ ๋ณํํ๋ ํฌํผ ํจ์
|
| 38 |
+
def format_history(history):
|
| 39 |
+
formatted = []
|
| 40 |
+
for user_msg, ai_msg in history:
|
| 41 |
+
formatted.append(("human", user_msg))
|
| 42 |
+
formatted.append(("ai", ai_msg))
|
| 43 |
+
return formatted
|
| 44 |
+
|
| 45 |
+
# ๋ฏธ์
1, 2, 5 ํตํฉ: ์คํธ๋ฆฌ๋ฐ, ๋์ ์ค์ , ์ถ์ฒ ํ์ฑ
|
| 46 |
+
def chat_response(message, history, temperature, k, model_name):
|
| 47 |
+
# ๋ฏธ์
2: UI์์ ๋๊ฒจ๋ฐ์ k ๊ฐ์ผ๋ก ๊ฒ์ ๋ฒ์ ๋์ ์กฐ์
|
| 48 |
+
docs = vectorstore.similarity_search(message, k=k)
|
| 49 |
+
context = "\n\n".join(doc.page_content for doc in docs)
|
| 50 |
+
|
| 51 |
+
# ๋ฏธ์
2: UI์์ ๋๊ฒจ๋ฐ์ ๋ชจ๋ธ๊ณผ ์จ๋๋ก LLM ๋์ ์์ฑ
|
| 52 |
+
llm = ChatGoogleGenerativeAI(model=model_name, temperature=temperature)
|
| 53 |
+
|
| 54 |
+
# ํ๋กฌํํธ ์กฐ๋ฆฝ
|
| 55 |
+
prompt_value = qa_prompt.invoke({
|
| 56 |
+
"context": context,
|
| 57 |
+
"chat_history": format_history(history),
|
| 58 |
+
"input": message
|
| 59 |
+
})
|
| 60 |
+
|
| 61 |
+
partial_message = ""
|
| 62 |
+
# ๋ฏธ์
5: llm.stream()์ ํ์ฉํ ์ค์๊ฐ ์คํธ๋ฆฌ๋ฐ ์ถ๋ ฅ
|
| 63 |
+
for chunk in llm.stream(prompt_value):
|
| 64 |
+
partial_message += chunk.content
|
| 65 |
+
yield partial_message # ๊ธ์๊ฐ ์์ฑ๋ ๋๋ง๋ค UI๋ก ๋ฐ์ด๋
|
| 66 |
+
|
| 67 |
+
# ๋ฏธ์
1: PyPDFLoader ๋ฉํ๋ฐ์ดํฐ์์ ์ถ์ฒ ๋ฐ ํ์ด์ง ์ถ์ถ (page๋ 0๋ถํฐ ์์ํ๋ฏ๋ก +1)
|
| 68 |
+
sources = []
|
| 69 |
+
for doc in docs:
|
| 70 |
+
source_file = os.path.basename(doc.metadata.get('source', 'Unknown'))
|
| 71 |
+
page_num = doc.metadata.get('page', 0) + 1
|
| 72 |
+
sources.append(f"{source_file} (p.{page_num})")
|
| 73 |
+
|
| 74 |
+
# ๋ฆฌ์คํธ ์ค๋ณต ์ ๊ฑฐ ํ ์ต์ข
ํ
์คํธ ์กฐ๋ฆฝ
|
| 75 |
+
unique_sources = list(dict.fromkeys(sources))
|
| 76 |
+
source_str = "\n\n๐ **์ถ์ฒ:** " + ", ".join(unique_sources)
|
| 77 |
+
|
| 78 |
+
# ์ต์ข
์ ์ผ๋ก ๋ต๋ณ ๋์ ์ถ์ฒ๋ฅผ ๋ง๋ถ์ฌ์ ์ ์ก
|
| 79 |
+
yield partial_message + source_str
|
| 80 |
+
|
| 81 |
+
# ๋ฏธ์
4: ๋ํ ๋ด์ญ ๋ค์ด๋ก๋ ํ์ผ ์์ฑ ํจ์
|
| 82 |
+
def download_chat_history(history):
|
| 83 |
+
file_path = "chat_history.txt"
|
| 84 |
+
with open(file_path, "w", encoding="utf-8") as f:
|
| 85 |
+
for user_msg, ai_msg in history:
|
| 86 |
+
f.write(f"๐งโ๐ป ์ฌ์ฉ์: {user_msg}\n")
|
| 87 |
+
f.write(f"๐ค AI: {ai_msg}\n")
|
| 88 |
+
f.write("-" * 50 + "\n")
|
| 89 |
+
return file_path
|
| 90 |
+
|
| 91 |
+
# UI ๋ ์ด์์ ๊ตฌ์ฑ
|
| 92 |
+
with gr.Blocks(theme=gr.themes.Soft()) as demo:
|
| 93 |
+
gr.Markdown("## ๐ช ๊ทผ๋น๋ ๊ทน๋ํ ๋
ผ๋ฌธ Q&A ๋ด (Pro Version)")
|
| 94 |
+
|
| 95 |
+
# ๋ฏธ์
2: ์ ์ ์ ์๋ ์ค์ ํจ๋
|
| 96 |
+
with gr.Accordion("โ๏ธ ์ฑ๋ด ์์ธ ์ค์ ", open=False):
|
| 97 |
+
with gr.Row():
|
| 98 |
+
model_dd = gr.Dropdown(choices=["gemini-2.0-flash", "gemini-1.5-pro", "gemini-1.5-flash"], value="gemini-2.0-flash", label="๐ค ๋ชจ๋ธ ์ ํ")
|
| 99 |
+
temp_slider = gr.Slider(minimum=0.0, maximum=1.0, value=0.0, step=0.1, label="๐ก๏ธ Temperature (์ฐฝ์์ฑ/ํ๊ฐ ์กฐ์ )")
|
| 100 |
+
k_slider = gr.Slider(minimum=1, maximum=10, value=3, step=1, label="๐ ์ฐธ๊ณ ํ ๋ฌธ์ ์กฐ๊ฐ ์ (k)")
|
| 101 |
+
|
| 102 |
+
# ํต์ฌ ์ฑ๋ด ์ธํฐํ์ด์ค (์ค์ ํจ๋์ ๊ฐ๋ค์ additional_inputs๋ก ์ฐ๊ฒฐ)
|
| 103 |
+
chat_interface = gr.ChatInterface(
|
| 104 |
+
fn=chat_response,
|
| 105 |
+
additional_inputs=[temp_slider, k_slider, model_dd],
|
| 106 |
+
chatbot=gr.Chatbot(height=500),
|
| 107 |
+
title="",
|
| 108 |
+
description="'Maximizing Muscle Hypertrophy' ๋
ผ๋ฌธ ๋ด์ฉ์ ๋ฐํ์ผ๋ก ๊ทผ์ฑ์ฅ ๋ฉ์ปค๋์ฆ์ ์ง๋ฌธํด ๋ณด์ธ์."
|
| 109 |
+
)
|
| 110 |
+
|
| 111 |
+
# ๋ฏธ์
4: ๋ํ ๋ด์ญ ๋ค์ด๋ก๋ ์์ญ
|
| 112 |
+
with gr.Row():
|
| 113 |
+
download_btn = gr.Button("๐พ ํ์ฌ ๋ํ ๋ด์ญ ์ ์ฅ ๋ฐ ๋ค์ด๋ก๋", variant="primary")
|
| 114 |
+
download_file = gr.File(label="๋ค์ด๋ก๋ ์ค๋น ์๋ฃ (๋ฒํผ์ ๋๋ฅด์ธ์)")
|
| 115 |
+
|
| 116 |
+
# ๋ฒํผ ํด๋ฆญ ์ด๋ฒคํธ (์ฑํ
์ฐฝ์ ํ์คํ ๋ฆฌ๋ฅผ ๊ฐ์ ธ์ ํ์ผ๋ก ๋ณํ)
|
| 117 |
+
download_btn.click(
|
| 118 |
+
fn=download_chat_history,
|
| 119 |
+
inputs=[chat_interface.chatbot],
|
| 120 |
+
outputs=[download_file]
|
| 121 |
+
)
|
| 122 |
+
|
| 123 |
+
if __name__ == "__main__":
|
| 124 |
+
demo.launch()
|
requirements.txt
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
gradio>=4.0.0
|
| 2 |
+
langchain>=0.2.0
|
| 3 |
+
langchain-core>=0.2.0
|
| 4 |
+
langchain-community>=0.2.0
|
| 5 |
+
langchain-google-genai>=1.0.0
|
| 6 |
+
langchain-chroma>=0.1.1
|
| 7 |
+
langchain-text-splitters>=0.2.0
|
| 8 |
+
chromadb
|
| 9 |
+
pypdf
|