import arrow import gradio as gr import os import re import pandas as pd from pathlib import Path from time import sleep from tqdm import tqdm from api_calls import * ROOT_DIR = Path(__file__).resolve().parents[0] default_co_ids = ["2330", "2317", "1301", "2303", "1101", "2311", "2002", "2412"] default_company_names = ["台泥", "聯電", "裕融", "大同", "台積電", "鴻海", "中鋼", "中華電信"] default_industries = ["半導體業", "水泥工業", "電子零組件業", "電子通路業", "電腦及週邊設備業", "其他電子業", "金融保險業", "文化創意業", "鋼鐵工業", "通信網路業", "電子商務業"] def load_default_filter_data(filter_type): d = { "co_id": default_co_ids, "company_name": default_company_names, "industry": default_industries, }[filter_type] return gr.update(choices=d) def markdown2html(md: str) -> str: import markdown return markdown.markdown(md) def export_to_txt(output): today_dt_str = arrow.now(tz="Asia/Taipei").format("YYYYMMDDTHHmmss") with open(f"esg_report_summary-{today_dt_str}.txt", "w") as f: f.write(output) return f"esg_report_summary-{today_dt_str}.txt" def print_like_dislike(x: gr.LikeData): print(x.index, x.value, x.liked) def add_text(history, text): history = history + [(text, None)] return history, gr.Textbox(value="", interactive=False) def esgsumm_exe(openai_model_name, year, target_type, target_value, tone): query = "根據您提供的相關資訊和偏好語氣,以繁體中文生成一份符合GRI標準的報告草稿。報告將包括每個GRI披露項目的標題、相關公司行為的概要,以及公司的具體措施和效果。" response = api_rag_summ_chain_demo(openai_model_name, query, year, target_type, target_value, tone) full_anwser = "" for chunk in response.iter_content(chunk_size=32): if chunk: try: _c = chunk.decode('utf-8') except UnicodeDecodeError: _c = " " full_anwser += _c yield full_anwser # for character in response: # full_text += character # yield full_text def esgqabot(history, openai_model_name, year, target_type, target_value): query = history[-1][0] response = api_rag_qa_chain_demo(openai_model_name, query, year, target_type, target_value, history[:-1]) history[-1][1] = "" for chunk in response.iter_content(chunk_size=32): if chunk: try: _c = chunk.decode('utf-8') except UnicodeDecodeError: _c = " " history[-1][1] += _c yield history css = """ #center {text-align: center} footer {visibility: hidden} a {color: rgb(255, 206, 10) !important} """ with gr.Blocks(css=css, theme=gr.themes.Monochrome(neutral_hue="green", primary_hue="slate")) as demo: gr.HTML("

ESG RAG Playground

", elem_id="center") gr.Markdown("Made by `Abao`", elem_id="center") gr.Markdown("---") # esgsumm with gr.Tab("ESG Report Summarization"): gr.HTML("

Report Summarization

Summarize report with tone & schema.

", elem_id="center") with gr.Row(): with gr.Group(): gr.Markdown("### Configuration", elem_id="center") esgsumm_report_tone = gr.Dropdown( value="精確", label="Tone", choices=["富有創意", "中庸", "精確"]) esgsumm_openai_model_name = gr.Dropdown( value="gpt-4-turbo-preview", label="OpenAI Model", choices=["gpt-4-turbo-preview", "gpt-3.5-turbo"]) esgsumm_year = gr.Dropdown( value="111", label="Year (填報年)", choices=["111", "110", "109"] ) esgsumm_target_type = gr.Dropdown( value="company_name", label="Target Type", choices=["company_name", "industry", "co_id"] ) esgsumm_target_value = gr.Dropdown( value="台積電", label="Target Value", choices=["台泥", "聯電", "裕融", "大同", "台積電", "鴻海", "中鋼", "中華電信"] ) esgsumm_report_gen_button = gr.Button("Generate Report") with gr.Column(): gr.Markdown("## Generate ESG Summarization", elem_id="center") with gr.Accordion("Revise Your Prompt", open=False): esgsumm_checkbox_replace = gr.Checkbox(label="Replace with new prompt") esgsumm_prompt_tmpl = gr.Textbox( label="希望用於本次問答的prompt", info="必須使用到的變數:{filtered_data}、{query}", value="", interactive=True, ) esgsumm_report_output = gr.Textbox( label="Report Output", interactive=False, scale=4, ) esgsumm_report_output_html = gr.HTML() esgsumm_download_btn = gr.Button("Export Summary") esgsumm_download_file = gr.File( label="Download Summary Text", file_types=[".txt"] ) # esgqa with gr.Tab("ESG QA"): gr.HTML("

ParallelQA (GPT-4 like)

Test multiple LLMs at once.

", elem_id="center") with gr.Row(): with gr.Group(): gr.Markdown("### Configuration", elem_id="center") esgqa_openai_model_name = gr.Dropdown( value="gpt-4-turbo-preview", label="OpenAI Model", choices=["gpt-4-turbo-preview", "gpt-3.5-turbo"]) esgqa_year = gr.Dropdown( value="111", label="Year (填報年)", choices=["111", "110", "109"] ) esgqa_target_type = gr.Dropdown( value="company_name", label="Target Type", choices=["company_name", "industry", "co_id"] ) esgqa_target_value = gr.Dropdown( value="台積電", label="Target Value", choices=["台泥", "聯電", "裕融", "大同", "台積電", "鴻海", "中鋼", "中華電信"] ) with gr.Column(): gr.Markdown("## Chat with ESGQABot", elem_id="center") with gr.Accordion("Revise Your Prompt", open=False): esgqa_checkbox_replace = gr.Checkbox(label="Replace with new prompt") esgqa_prompt_tmpl = gr.Textbox( label="希望用於本次問答的prompt", info="必須使用到的變數:{filtered_data}、{query}", value="", interactive=True, ) esgqa_chatbot = gr.Chatbot( [(None, "我是 ESGQABot\n有什麼能為您服務的嗎?")], elem_id="chatbot", scale=1, height=700, bubble_full_width=False ) with gr.Row(): esgqa_chatbot_input = gr.Textbox( scale=4, show_label=False, placeholder="Enter text and press enter, or upload an image", container=False, ) esgqa_chat_btn = gr.Button("💬") # esgsumm esgsumm_target_type.change( load_default_filter_data, [esgsumm_target_type], [esgsumm_target_value] ) esgsumm_report_gen_button.click( esgsumm_exe, [esgsumm_openai_model_name, esgsumm_year, esgsumm_target_type, esgsumm_target_value, esgsumm_report_tone], [esgsumm_report_output] ).then( markdown2html, [esgsumm_report_output], [esgsumm_report_output_html] ) esgsumm_download_btn.click( fn=export_to_txt, inputs=[esgsumm_report_output], outputs=esgsumm_download_file, ) # esgqa esgqa_target_type.change( load_default_filter_data, [esgqa_target_type], [esgqa_target_value] ) esgqa_chatbot_input.submit( add_text, [esgqa_chatbot, esgqa_chatbot_input], [esgqa_chatbot, esgqa_chatbot_input], queue=False ).then( esgqabot, [esgqa_chatbot, esgqa_openai_model_name, esgqa_year, esgqa_target_type, esgqa_target_value], esgqa_chatbot, api_name="esgqa_response" ).then( lambda: gr.Textbox(interactive=True), None, [esgqa_chatbot_input], queue=False ) esgqa_chat_btn.click( add_text, [esgqa_chatbot, esgqa_chatbot_input], [esgqa_chatbot, esgqa_chatbot_input], queue=False ).then( esgqabot, [esgqa_chatbot, esgqa_openai_model_name, esgqa_year, esgqa_target_type, esgqa_target_value], esgqa_chatbot, api_name="esgqa_response" ).then( lambda: gr.Textbox(interactive=True), None, [esgqa_chatbot_input], queue=False ) esgqa_chatbot.like(print_like_dislike, None, None) if __name__ == "__main__": demo.queue().launch(max_threads=10)