Song commited on
Commit
2f5a866
·
1 Parent(s): 65a3c09
Files changed (1) hide show
  1. app.py +12 -7
app.py CHANGED
@@ -208,8 +208,6 @@ class RagPipeline:
208
  self.state.sentences = data["sentences"]
209
  self.state.meta = data["meta"]
210
 
211
- log.info("載入 BM25 索引...")
212
-
213
  log.info("載入 BM25 索引...")
214
  with open(BM25_PKL, "rb") as f:
215
  # 載入整個字典,然後取 'bm25' 這個鍵
@@ -255,7 +253,11 @@ class RagPipeline:
255
  temperature=config["temperature"],
256
  max_tokens=config["max_tokens"],
257
  )
258
- return response.choices[0].message.content
 
 
 
 
259
  except Exception as e:
260
  log.error(f"LLM API 呼叫失敗: {e}")
261
  raise
@@ -266,27 +268,30 @@ class RagPipeline:
266
  try:
267
  drug_ids = self._find_drug_ids_from_name(q_orig)
268
  if not drug_ids:
 
269
  return f"抱歉,資料庫中找不到該藥品。請確認藥品名稱,或直接諮詢醫師/藥師。{DISCLAIMER}"
270
- log.info(f"找到藥品 ID: {drug_ids}")
271
 
272
  analysis = self._analyze_query(q_orig)
273
  sub_queries, intents = analysis.get("sub_queries", [q_orig]), analysis.get("intents", [])
274
- log.info(f"子問題: {sub_queries}, 意圖: {intents}")
275
 
276
  all_candidates = self._retrieve_candidates_for_all_queries(drug_ids, sub_queries, intents)
277
- log.info(f"所有子查詢共找到 {len(all_candidates)} 個不重複候選 chunks。")
278
 
279
  reranked_results = self._rerank_with_crossencoder(q_orig, all_candidates)
280
- log.info(f"Reranker 最終選出 {len(reranked_results)} 個高品質候選。")
281
 
282
  context = self._build_context(reranked_results)
283
  if not context:
 
284
  return f"根據您的問題,找不到相關的具體說明。建議您直接諮詢醫師或藥師以獲得最準確的資訊。{DISCLAIMER}"
285
 
286
  prompt = self._make_final_prompt(q_orig, context, intents)
287
  answer = self._llm_call([{"role": "user", "content": prompt}])
288
 
289
  final_answer = f"{answer.strip()}\n\n{DISCLAIMER}"
 
290
  log.info(f"===== 查詢處理完成,總耗時: {time.time() - start_time:.2f} 秒 =====")
291
  return final_answer
292
 
 
208
  self.state.sentences = data["sentences"]
209
  self.state.meta = data["meta"]
210
 
 
 
211
  log.info("載入 BM25 索引...")
212
  with open(BM25_PKL, "rb") as f:
213
  # 載入整個字典,然後取 'bm25' 這個鍵
 
253
  temperature=config["temperature"],
254
  max_tokens=config["max_tokens"],
255
  )
256
+ content = response.choices[0].message.content
257
+ # [MODIFIED] 確保回傳值為非空字串
258
+ if not isinstance(content, str) or not content.strip():
259
+ raise ValueError("LLM response content is empty or not a string.")
260
+ return content
261
  except Exception as e:
262
  log.error(f"LLM API 呼叫失敗: {e}")
263
  raise
 
268
  try:
269
  drug_ids = self._find_drug_ids_from_name(q_orig)
270
  if not drug_ids:
271
+ log.info("找不到藥品 ID,無法回答。")
272
  return f"抱歉,資料庫中找不到該藥品。請確認藥品名稱,或直接諮詢醫師/藥師。{DISCLAIMER}"
273
+ log.info(f"步驟 1/5: 找到藥品 ID: {drug_ids}")
274
 
275
  analysis = self._analyze_query(q_orig)
276
  sub_queries, intents = analysis.get("sub_queries", [q_orig]), analysis.get("intents", [])
277
+ log.info(f"步驟 2/5: 意圖分析完成。子問題: {sub_queries}, 意圖: {intents}")
278
 
279
  all_candidates = self._retrieve_candidates_for_all_queries(drug_ids, sub_queries, intents)
280
+ log.info(f"步驟 3/5: 檢索完成。所有子查詢共找到 {len(all_candidates)} 個不重複候選 chunks。")
281
 
282
  reranked_results = self._rerank_with_crossencoder(q_orig, all_candidates)
283
+ log.info(f"步驟 4/5: Reranker 最終選出 {len(reranked_results)} 個高品質候選。")
284
 
285
  context = self._build_context(reranked_results)
286
  if not context:
287
+ log.info("沒有足夠的上下文來回答問題。")
288
  return f"根據您的問題,找不到相關的具體說明。建議您直接諮詢醫師或藥師以獲得最準確的資訊。{DISCLAIMER}"
289
 
290
  prompt = self._make_final_prompt(q_orig, context, intents)
291
  answer = self._llm_call([{"role": "user", "content": prompt}])
292
 
293
  final_answer = f"{answer.strip()}\n\n{DISCLAIMER}"
294
+ log.info(f"步驟 5/5: 答案生成完成。答案長度: {len(answer.strip())} 字。")
295
  log.info(f"===== 查詢處理完成,總耗時: {time.time() - start_time:.2f} 秒 =====")
296
  return final_answer
297