Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -26,6 +26,7 @@ from langchain_core.output_parsers import StrOutputParser # format LLM's output
|
|
26 |
from langchain import hub
|
27 |
from langchain_core.prompts import PromptTemplate
|
28 |
import json
|
|
|
29 |
|
30 |
# Save RAG chain builded from PDF
|
31 |
if 'rag_chain' not in st.session_state:
|
@@ -45,7 +46,7 @@ if 'llm' not in st.session_state:
|
|
45 |
|
46 |
@st.cache_resource # cache model embeddings, avoid model reloading each runtime
|
47 |
def load_embeddings():
|
48 |
-
return
|
49 |
|
50 |
|
51 |
# set up config
|
@@ -90,27 +91,7 @@ def format_docs(docs):
|
|
90 |
return "\n\n".join(doc.page_content for doc in docs)
|
91 |
|
92 |
def process_pdf(uploaded_file):
|
93 |
-
|
94 |
-
# tmp_file.write(uploaded_file.getvalue())
|
95 |
-
# tmp_file_path = tmp_file.name
|
96 |
-
|
97 |
-
# try:
|
98 |
-
# loader = PyPDFLoader(tmp_file_path)
|
99 |
-
# documents = loader.load()
|
100 |
-
# except Exception as e:
|
101 |
-
# st.error(f"Đọc file thất bại: {e}")
|
102 |
-
# return None, 0
|
103 |
-
|
104 |
-
# semantic_splitter = SemanticChunker(
|
105 |
-
# embeddings=st.session_state.embeddings,
|
106 |
-
# buffer_size=1, # total sentence collected before perform text split
|
107 |
-
# breakpoint_threshold_type='percentile', # set splitting style: 'percentage' of similarity
|
108 |
-
# breakpoint_threshold_amount=95, # split text if similarity score > 95%
|
109 |
-
# min_chunk_size=500,
|
110 |
-
# add_start_index=True, # assign index for chunk
|
111 |
-
# )
|
112 |
-
|
113 |
-
# docs = semantic_splitter.split_documents(documents)
|
114 |
df = pd.read_excel("chunk_metadata_template.xlsx")
|
115 |
docs = []
|
116 |
|
@@ -121,8 +102,7 @@ def process_pdf(uploaded_file):
|
|
121 |
metadata={
|
122 |
'chunk_id': row['chunk_id'],
|
123 |
'document_title': row['document_title']
|
124 |
-
|
125 |
-
# 'stakeholder': row['stakeholder']
|
126 |
}
|
127 |
)
|
128 |
docs.append(chunk_with_metadata)
|
@@ -132,63 +112,12 @@ def process_pdf(uploaded_file):
|
|
132 |
retriever = vector_db.as_retriever()
|
133 |
parser = StrOutputParser()
|
134 |
|
135 |
-
# prompt = PromptTemplate.from_template("""
|
136 |
-
# Trả lời ngắn gọn, rõ ràng bằng tiếng việt và chỉ dựa trên thông tin có sẵn bên dưới.
|
137 |
-
# Nếu không tìm thấy thông tin, hãy nói rõ là không có dữ liệu liên quan.
|
138 |
-
|
139 |
-
# Nội dung tài liệu:
|
140 |
-
# {context}
|
141 |
-
|
142 |
-
# Câu hỏi:
|
143 |
-
# {question}
|
144 |
-
|
145 |
-
# Trả lời:
|
146 |
-
# """)
|
147 |
-
|
148 |
-
|
149 |
-
# prompt = PromptTemplate.from_template("""
|
150 |
-
# Dựa vào nội dung sau, hãy:
|
151 |
-
# 1. Tóm tắt tối đa 3 ý chính, kèm theo số trang nếu có.
|
152 |
-
# 2. Trả lời câu hỏi bằng tiếng Việt ngắn gọn và chính xác.
|
153 |
-
# 3. Nếu không có thông tin liên quan, hãy để `"Trả lời"` là `"Không có dữ liệu liên quan"`.
|
154 |
-
|
155 |
-
# Nội dung tài liệu:
|
156 |
-
# {context}
|
157 |
-
|
158 |
-
# Câu hỏi:
|
159 |
-
# {question}
|
160 |
-
|
161 |
-
# Trả lời:
|
162 |
-
# """)
|
163 |
-
|
164 |
prompt = PromptTemplate.from_template("""
|
165 |
-
Bạn là
|
166 |
-
|
167 |
-
|
168 |
-
|
169 |
-
|
170 |
-
3. Nếu không có thông tin liên quan, hãy để "Answer" là "Không có dữ liệu liên quan".
|
171 |
-
|
172 |
-
|
173 |
-
|
174 |
-
Đảm bảo trả kết quả **ở dạng JSON** với cấu trúc sau:
|
175 |
-
{{"main_ideas": [
|
176 |
-
{{"point": "Ý chính 1", "source": "Trang ..."}},
|
177 |
-
{{"point": "Ý chính 2", "source": "Trang ..."}},
|
178 |
-
{{"point": "Ý chính 3", "source": "Trang ..."}}
|
179 |
-
],
|
180 |
-
"answer": "Câu trả lời ngắn gọn"
|
181 |
-
}}
|
182 |
-
|
183 |
-
Vui lòng chỉ in JSON, không giải thích thêm.
|
184 |
-
|
185 |
-
Context:
|
186 |
-
{context}
|
187 |
-
|
188 |
-
Question:
|
189 |
-
{question}
|
190 |
-
|
191 |
-
Answer:
|
192 |
|
193 |
""") #? dùng {{ }} để langchain không nhận string bên trong {} là Biến
|
194 |
|
@@ -207,27 +136,24 @@ st.set_page_config(page_title="PDF RAG Assistant", layout='wide')
|
|
207 |
st.title('PDF RAG Assistant')
|
208 |
|
209 |
st.markdown("""
|
210 |
-
**Ứng dụng AI giúp bạn hỏi đáp trực tiếp
|
211 |
-
**Cách sử dụng đơn giản:**
|
212 |
-
1. **Upload PDF** Chọn file PDF từ máy tính và nhấn "Xử lý PDF"
|
213 |
-
2. **Đặt câu hỏi** Nhập câu hỏi về nội dung tài liệu và nhận câu trả lời ngay lập tức
|
214 |
""")
|
215 |
|
216 |
#? Tải models
|
217 |
if not st.session_state.models_loaded:
|
218 |
-
st.info("Đang tải
|
219 |
st.session_state.embeddings = load_embeddings()
|
220 |
st.session_state.llm = load_llm()
|
221 |
st.session_state.models_loaded = True
|
222 |
-
st.success("
|
223 |
st.rerun()
|
224 |
|
225 |
-
#? Upload and Process PDF
|
226 |
-
uploaded_file = st.file_uploader("Upload file PDF", type="pdf")
|
227 |
-
if uploaded_file and st.button("Xử lý PDF"):
|
228 |
-
|
229 |
-
|
230 |
-
|
231 |
|
232 |
|
233 |
#? Answers UI
|
|
|
26 |
from langchain import hub
|
27 |
from langchain_core.prompts import PromptTemplate
|
28 |
import json
|
29 |
+
from sentence_transformers import SentenceTransformer
|
30 |
|
31 |
# Save RAG chain builded from PDF
|
32 |
if 'rag_chain' not in st.session_state:
|
|
|
46 |
|
47 |
@st.cache_resource # cache model embeddings, avoid model reloading each runtime
|
48 |
def load_embeddings():
|
49 |
+
return SentenceTransformer("bkai-foundation-models/vietnamese-bi-encoder")
|
50 |
|
51 |
|
52 |
# set up config
|
|
|
91 |
return "\n\n".join(doc.page_content for doc in docs)
|
92 |
|
93 |
def process_pdf(uploaded_file):
|
94 |
+
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
95 |
df = pd.read_excel("chunk_metadata_template.xlsx")
|
96 |
docs = []
|
97 |
|
|
|
102 |
metadata={
|
103 |
'chunk_id': row['chunk_id'],
|
104 |
'document_title': row['document_title']
|
105 |
+
|
|
|
106 |
}
|
107 |
)
|
108 |
docs.append(chunk_with_metadata)
|
|
|
112 |
retriever = vector_db.as_retriever()
|
113 |
parser = StrOutputParser()
|
114 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
115 |
prompt = PromptTemplate.from_template("""
|
116 |
+
Bạn là một chuyên viên tư vấn cho khách hàng về sản phẩm bảo hiểm của công ty MB Ageas Life tại Việt Nam.
|
117 |
+
Hãy trả lời chuyên nghiệp, chính xác, cung cấp thông tin trước rồi hỏi câu tiếp theo. Tất cả các thông tin cung cấp đều trong phạm vi MBAL. Khi có đủ thông tin khách hàng thì mới mời khách hàng đăng ký để nhận tư vấn trên https://www.mbageas.life/
|
118 |
+
{context}
|
119 |
+
Câu hỏi: {question}
|
120 |
+
Trả lời:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
121 |
|
122 |
""") #? dùng {{ }} để langchain không nhận string bên trong {} là Biến
|
123 |
|
|
|
136 |
st.title('PDF RAG Assistant')
|
137 |
|
138 |
st.markdown("""
|
139 |
+
**Ứng dụng AI giúp bạn hỏi đáp trực tiếp về thông tin các gói bảo hiểm của MB Ageas Life**
|
|
|
|
|
|
|
140 |
""")
|
141 |
|
142 |
#? Tải models
|
143 |
if not st.session_state.models_loaded:
|
144 |
+
st.info("Đang tải model...")
|
145 |
st.session_state.embeddings = load_embeddings()
|
146 |
st.session_state.llm = load_llm()
|
147 |
st.session_state.models_loaded = True
|
148 |
+
st.success("Model đã sẵn sàng!")
|
149 |
st.rerun()
|
150 |
|
151 |
+
# #? Upload and Process PDF
|
152 |
+
# uploaded_file = st.file_uploader("Upload file PDF", type="pdf")
|
153 |
+
# if uploaded_file and st.button("Xử lý PDF"):
|
154 |
+
# with st.spinner("Đang xử lý..."):
|
155 |
+
# st.session_state.rag_chain, num_chunks = process_pdf(uploaded_file)
|
156 |
+
# st.success(f"Hoàn thành! {num_chunks} chunks")
|
157 |
|
158 |
|
159 |
#? Answers UI
|