entidi2608 commited on
Commit
fc0cc58
·
1 Parent(s): e332ed5

update: re-rank docs

Browse files
Files changed (1) hide show
  1. utils/AdvancedLawRetriever.py +43 -6
utils/AdvancedLawRetriever.py CHANGED
@@ -181,13 +181,50 @@ class AdvancedLawRetriever(BaseRetriever):
181
  contents_to_rank = [item["structured_content"] for item in docs_for_reranking]
182
 
183
  try:
184
- # Sử dụng câu hỏi đã được viết lại để có ngữ cảnh tốt nhất
185
- ranked_results_info = self.reranker.predict(rewritten_query, contents_to_rank, return_documents=False, top_k=self.default_k * 2) # Lấy nhiều hơn một chút
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
186
  except Exception as e:
187
- logger.error(f"Failed to re-rank with custom structured content: {e}. Falling back to default re-ranking.")
188
- # Fallback về cách re-rank mặc định nếu có lỗi
189
- reranked_docs = self.reranker.compress_documents(final_candidates_for_rerank, rewritten_query)
190
- return reranked_docs[:self.default_k]
 
 
 
 
191
 
192
  # Lấy lại các Document gốc theo thứ tự đã được re-rank
193
  final_reranked_docs = []
 
181
  contents_to_rank = [item["structured_content"] for item in docs_for_reranking]
182
 
183
  try:
184
+ # Kiểm tra nếu không ứng viên nào để re-rank
185
+ if not final_candidates_for_rerank:
186
+ logger.warning("No candidates found for re-ranking. Returning empty list.")
187
+ return []
188
+
189
+ logger.info(f"Applying Cross-Encoder re-ranking to {len(final_candidates_for_rerank)} candidates...")
190
+
191
+ # SỬ DỤNG PHƯƠNG THỨC .compress_documents()
192
+ # Đây là phương thức chính của CrossEncoderReranker trong LangChain.
193
+ # Nó nhận danh sách Document và một chuỗi query, sau đó trả về
194
+ # danh sách Document đã được sắp xếp lại và lọc theo top_n.
195
+ reranked_docs = self.reranker.compress_documents(
196
+ documents=final_candidates_for_rerank,
197
+ query=rewritten_query
198
+ )
199
+
200
+ # `reranked_docs` bây giờ là một danh sách các tài liệu tốt nhất,
201
+ # đã được lọc theo `top_n` bạn đã cấu hình trong get_reranker_compressor (mặc định là 4).
202
+ logger.info(f"Re-ranking complete. Found {len(reranked_docs)} relevant documents.")
203
+
204
+ # Thêm log chi tiết để debug
205
+ # ---- LOGGING ĐỂ DEBUG ----
206
+ logger.info("--- Top documents after re-ranking ---")
207
+ for i, doc in enumerate(reranked_docs):
208
+ doc_info = {
209
+ "content_preview": doc.page_content[:200] + "...",
210
+ "metadata": doc.metadata,
211
+ # CrossEncoderReranker sẽ thêm điểm số vào metadata
212
+ "relevance_score": doc.metadata.get('relevance_score')
213
+ }
214
+ logger.info(f"Doc {i+1}: {doc_info}")
215
+ # ---- KẾT THÚC LOGGING ----
216
+
217
+ return reranked_docs
218
+
219
  except Exception as e:
220
+ import traceback
221
+ logger.error(f"An unexpected error occurred during re-ranking: {e}\n{traceback.format_exc()}")
222
+
223
+ # Fallback an toàn: Trả về kết quả từ VectorDB mà không re-rank,
224
+ # lấy theo số lượng top_k của retriever ban đầu.
225
+ logger.warning("Falling back to returning top results from vector search without re-ranking.")
226
+ # Giả sử bạn có self.default_k được cấu hình
227
+ return final_candidates_for_rerank[:getattr(self, 'default_k', 4)]
228
 
229
  # Lấy lại các Document gốc theo thứ tự đã được re-rank
230
  final_reranked_docs = []