ngcanh commited on
Commit
1bb6f56
·
verified ·
1 Parent(s): 7333f55

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +18 -92
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 HuggingFaceEmbeddings(model_name='nomic-embeded-text-v1.5')
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
- # with tempfile.NamedTemporaryFile(delete=False, suffix=".pdf") as tmp_file:
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
- # 'topic': row['topic'],
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à trợ AI.
166
-
167
- Dựa vào nội dung sau, hãy:
168
- 1. Tóm tắt tối đa 3 ý chính, kèm theo số trang nếu có.
169
- 2. Trả lời câu hỏi bằng tiếng Việt ngắn gọn và chính xác.
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 với nội dung tài liệu PDF bằng tiếng Việt**
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 models...")
219
  st.session_state.embeddings = load_embeddings()
220
  st.session_state.llm = load_llm()
221
  st.session_state.models_loaded = True
222
- st.success("Models đã sẵn sàng!")
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
- with st.spinner("Đang xử lý..."):
229
- st.session_state.rag_chain, num_chunks = process_pdf(uploaded_file)
230
- st.success(f"Hoàn thành! {num_chunks} chunks")
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