SiangKai commited on
Commit
6cd9073
·
verified ·
1 Parent(s): 9c818a7

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +165 -2
app.py CHANGED
@@ -432,6 +432,7 @@ system_integration = """
432
  ---
433
  ## ✅ 輸出格式:
434
  - 使用繁體中文
 
435
  - 數值一律轉為千分位
436
  - 每份資料來源僅列一次
437
  - 若缺資料請誠實說明並結束回答
@@ -551,6 +552,93 @@ def reflect_post(api_key, api_key2, api_key3, api_key4, user_input):
551
  # 5. Gradio Web UI
552
  # =======================================================================
553
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
554
  def gradio_interface(user_input):
555
  """Gradio 主要處理函式"""
556
  api_key = os.getenv('Gemini')
@@ -574,12 +662,87 @@ def gradio_interface(user_input):
574
  print(traceback.format_exc()) # 在後台印出詳細錯誤
575
  return "❌ 查詢失敗", f"發生未預期的系統錯誤:{str(e)}"
576
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
577
  # --- UI 介面定義 ---
578
  with gr.Blocks(theme=gr.themes.Soft(primary_hue="blue", secondary_hue="orange")) as demo:
579
  gr.Markdown(
580
  """
581
  # 🤖 高雄市公務統計資料智慧查詢
582
- 歡迎使用!您可以透過自然語言提出關於高雄市的公務統計問題,系統將盡力為您查找相關資訊。
583
  本系統運作於2v cpu & 16 GB RAM 免費資源,系統速度稍慢(產生結果時間依問題複雜度而定,一般為10至15秒)。
584
  """
585
  )
@@ -618,7 +781,7 @@ with gr.Blocks(theme=gr.themes.Soft(primary_hue="blue", secondary_hue="orange"))
618
  lines=6,
619
  visible=False,
620
  )
621
- output_result = gr.Textbox(
622
  label="🧐 查詢結果",
623
  interactive=False,
624
  lines=10,
 
432
  ---
433
  ## ✅ 輸出格式:
434
  - 使用繁體中文
435
+ - **請使用 Markdown 格式化您的回覆,例如使用粗體標示重點數字、使用項目符號條列結果。**
436
  - 數值一律轉為千分位
437
  - 每份資料來源僅列一次
438
  - 若缺資料請誠實說明並結束回答
 
552
  # 5. Gradio Web UI
553
  # =======================================================================
554
 
555
+ # def gradio_interface(user_input):
556
+ # """Gradio 主要處理函式"""
557
+ # api_key = os.getenv('Gemini')
558
+ # api_key2 = os.getenv('Gemini2')
559
+ # api_key3 = os.getenv('Gemini3')
560
+ # api_key4 = os.getenv('Gemini4')
561
+
562
+ # if not api_key:
563
+ # return "❌ 查詢失敗", "錯誤:未在伺服器環境中設定 'Gemini' API 金鑰。"
564
+
565
+ # # 檢查向量資料庫是否成功載入
566
+ # if not db_jb or not db_sim:
567
+ # return "❌ 系統錯誤", "向量資料庫未成功載入,請檢查伺服器日誌。"
568
+
569
+ # try:
570
+ # analysis_text, final_result = reflect_post(api_key, api_key2, api_key3, api_key4, user_input)
571
+ # return analysis_text, final_result
572
+ # except Exception as e:
573
+ # # 捕捉預期外的錯誤
574
+ # import traceback
575
+ # print(traceback.format_exc()) # 在後台印出詳細錯誤
576
+ # return "❌ 查詢失敗", f"發生未預期的系統錯誤:{str(e)}"
577
+
578
+ # # --- UI 介面定義 ---
579
+ # with gr.Blocks(theme=gr.themes.Soft(primary_hue="blue", secondary_hue="orange")) as demo:
580
+ # gr.Markdown(
581
+ # """
582
+ # # 🤖 高雄市公務統計資料智慧查詢
583
+ # 歡迎使用!您可以透過自然語言提出關於高雄市的公務統計問題,系統將盡力為您查找相關資訊。
584
+ # 本系統運作於2v cpu & 16 GB RAM 免費資源,系統速度稍慢(產生結果時間依問題複雜度而定,一般為10至15秒)。
585
+ # """
586
+ # )
587
+
588
+ # with gr.Row():
589
+ # with gr.Column(scale=1):
590
+ # user_input_box = gr.Textbox(
591
+ # label="請在此輸入您的問題",
592
+ # placeholder="例如:113年底前金區人口數?",
593
+ # lines=5
594
+ # )
595
+ # gr.Examples(
596
+ # examples=[
597
+ # "113年底前金區人口數?",
598
+ # "110-113年高雄市總人口數趨勢?",
599
+ # "110-113年失業率情形",
600
+ # "113學年國小一年級學生人數",
601
+ # "113年底鹽埕區、三民區、前鎮區、林園區及美濃區人口數",
602
+ # "107年勞工教育班數",
603
+ # "112年路竹區門診體驗人數",
604
+ # "113學年國立大學教師數",
605
+ # "105年公共污水下水道當年接管戶數",
606
+ # "113年三民區人口數及該區身心障礙人數"
607
+ # ],
608
+ # inputs=user_input_box,
609
+ # label="💡 範例問題"
610
+ # )
611
+ # with gr.Row():
612
+ # btn_clear = gr.ClearButton(value="清除")
613
+ # btn_submit = gr.Button("送出查詢", variant="primary")
614
+
615
+ # with gr.Column(scale=1):
616
+ # output_analysis = gr.Textbox(
617
+ # label="🌟 問題分析",
618
+ # interactive=False,
619
+ # lines=6,
620
+ # visible=False,
621
+ # )
622
+ # output_result = gr.Textbox(
623
+ # label="🧐 查詢結果",
624
+ # interactive=False,
625
+ # lines=10,
626
+ # )
627
+
628
+ # gr.Markdown(
629
+ # """
630
+ # ---
631
+ # *資料來源:[高雄市政府主計處](https://kcgdg.kcg.gov.tw/StatWebRWD/Page/Default.aspx)*
632
+ # *本工具由 AI 驅動,查詢結果僅供參考。*
633
+ # """
634
+ # )
635
+
636
+ # # --- 事件綁定 ---
637
+ # outputs_list = [output_analysis, output_result]
638
+ # btn_submit.click(fn=gradio_interface, inputs=user_input_box, outputs=outputs_list)
639
+ # user_input_box.submit(fn=gradio_interface, inputs=user_input_box, outputs=outputs_list)
640
+ # btn_clear.add([user_input_box] + outputs_list)
641
+
642
  def gradio_interface(user_input):
643
  """Gradio 主要處理函式"""
644
  api_key = os.getenv('Gemini')
 
662
  print(traceback.format_exc()) # 在後台印出詳細錯誤
663
  return "❌ 查詢失敗", f"發生未預期的系統錯誤:{str(e)}"
664
 
665
+ # --- 開始逐步回饋 ---
666
+ try:
667
+ # Step 1:拆解子問題
668
+ yield "", "🔍 正在分析您的問題..."
669
+ decomposed_text = reply(api_key, system_reviewer, user_input)
670
+ if "抱歉~" in decomposed_text:
671
+ yield "", decomposed_text
672
+ return
673
+
674
+ parsed_list = extract_json(decomposed_text)
675
+ direct_queries = [item for item in parsed_list if item.get("type") == "direct"]
676
+ if not direct_queries:
677
+ yield "", "⚠️ 無法從輸入問題中擷取有效查詢項目。"
678
+ return
679
+
680
+ all_querys_summary = "🔹 關鍵查詢:\n" + "\n".join(f"- {q['sub_query']}" for q in direct_queries)
681
+ yield all_querys_summary, "✅ 問題分析完成,正在匹配資料表..."
682
+
683
+ # Step 2 & 3:批次匹配與解析
684
+ sub_query_texts = [q["sub_query"] for q in direct_queries]
685
+ table_map = batch_find_relevant_tables(os.getenv('Gemini2'), sub_query_texts)
686
+ if not table_map:
687
+ yield all_querys_summary, "⚠️ 系統無法為您的查詢匹配到合適的資料表。"
688
+ return
689
+
690
+ yield all_querys_summary, "📚 資料表匹配成功,正在解析查詢參數..."
691
+ params_map = batch_parse_sub_queries_with_gemini(os.getenv('Gemini3'), sub_query_texts)
692
+ if not params_map:
693
+ yield all_querys_summary, "⚠️ 系統無法解析您問題中的查詢參數。"
694
+ return
695
+
696
+ # Step 4:執行查詢
697
+ yield all_querys_summary, "⏳ 正在從資料庫中檢索資訊..."
698
+ # ... (此處省略查詢邏輯,與原 reflect_post 相同) ...
699
+ context_list = []
700
+ for q in direct_queries:
701
+ sub_query = q["sub_query"]
702
+ table_name = table_map.get(sub_query)
703
+ params = params_map.get(sub_query)
704
+
705
+ if not table_name or not params:
706
+ context_list.append(f"【{sub_query}】\n查詢失敗:未能匹配到資料表或解析參數。")
707
+ continue
708
+
709
+ try:
710
+ # 帶著所有精準參數執行查詢
711
+ result_json = semantic_query_logic(
712
+ time_query=params.get("time_query", ""),
713
+ item_query=params.get("item_query", ""),
714
+ district_query=params.get("district_query", ""),
715
+ project_name=table_name
716
+ )
717
+ result_data = json.loads(result_json)
718
+ if result_data:
719
+ formatted_result = json.dumps(result_data, ensure_ascii=False, indent=2)
720
+ context_list.append(f"【{sub_query}】\n查詢結果:\n{formatted_result}")
721
+ else:
722
+ context_list.append(f"【{sub_query}】\n查無資料。")
723
+ except Exception as e:
724
+ context_list.append(f"【{sub_query}】\n查詢失敗:{e}")
725
+
726
+ combined_context = "\n\n".join(context_list)
727
+
728
+ # Step 5:整合分析
729
+ yield all_querys_summary, "✍️ 查詢完成,正在生成最終回覆..."
730
+ integration_prompt = f"使用者問題:{user_input}\n\n查詢資料如下:\n{combined_context}"
731
+ integration_result = reply(os.getenv('Gemini4'), system_integration, integration_prompt)
732
+
733
+ yield all_querys_summary, integration_result # 最終結果
734
+
735
+ except Exception as e:
736
+ import traceback
737
+ print(traceback.format_exc())
738
+ yield "❌ 查詢失敗", f"發生未預期的系統錯誤:{str(e)}"
739
+
740
  # --- UI 介面定義 ---
741
  with gr.Blocks(theme=gr.themes.Soft(primary_hue="blue", secondary_hue="orange")) as demo:
742
  gr.Markdown(
743
  """
744
  # 🤖 高雄市公務統計資料智慧查詢
745
+ 歡迎使用!您可以透過自然語言提出關於高雄市的公務統計問題,系統將盡力為您查找相關資訊。
746
  本系統運作於2v cpu & 16 GB RAM 免費資源,系統速度稍慢(產生結果時間依問題複雜度而定,一般為10至15秒)。
747
  """
748
  )
 
781
  lines=6,
782
  visible=False,
783
  )
784
+ output_result = gr.Markdown(
785
  label="🧐 查詢結果",
786
  interactive=False,
787
  lines=10,