Spaces:
Sleeping
Sleeping
Song
commited on
Commit
·
2f5a866
1
Parent(s):
65a3c09
hi
Browse files
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 |
-
|
|
|
|
|
|
|
|
|
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"
|
275 |
|
276 |
all_candidates = self._retrieve_candidates_for_all_queries(drug_ids, sub_queries, intents)
|
277 |
-
log.info(f"
|
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 |
|