import os import gradio as gr from openai import OpenAI from httpx import Client # 從環境變數讀取必要參數(在 Hugging Face Spaces 的 Secrets 中設定) api_key = os.environ.get("API_KEY") base_url = os.environ.get("BASE_URL") model_id = os.environ.get("MODEL_ID") # 讀取 system prompt 從環境變數(針對 LLM01) system_prompt_llm01 = os.environ.get("LLM01") system_prompt_llm02 = os.environ.get("LLM02") system_prompt_llm05 = os.environ.get("LLM05") system_prompt_llm07 = os.environ.get("LLM07") system_prompt_llm09 = os.environ.get("LLM09") # 初始化 OpenAI 客戶端,使用動態讀取的 base_url 和 api_key client = OpenAI( base_url=base_url, api_key=api_key ) # 原有聊天回應函數 def respond( message, history: list[dict[str, str]], system_message, max_tokens, temperature, top_p, hf_token: gr.OAuthToken = None, # 保留但未使用,符合範例結構 ): messages = [{"role": "system", "content": system_message}] messages.extend(history) messages.append({"role": "user", "content": message}) completion = client.chat.completions.create( model=model_id, messages=messages, temperature=temperature, top_p=top_p, max_tokens=max_tokens, stream=True ) response = "" for chunk in completion: if chunk.choices[0].delta.content is not None: response += chunk.choices[0].delta.content yield response # 新增摘要函數(用於第二個 Tab) - 修改為使用隱藏的 system prompt def generate_summary(text, max_tokens=1024, temperature=1.0, top_p=1.0): messages = [ {"role": "system", "content": system_prompt_llm01}, # 使用從環境變數讀取的隱藏 prompt {"role": "user", "content": f"請讀取以下文字:\n\n{text}"} ] completion = client.chat.completions.create( model=model_id, messages=messages, temperature=temperature, top_p=top_p, max_tokens=max_tokens, stream=False # 非流式,為了簡單 ) return completion.choices[0].message.content def generate_llm02(text, max_tokens=1024, temperature=1.0, top_p=1.0): messages = [ {"role": "system", "content": system_prompt_llm02}, {"role": "user", "content": text} ] completion = client.chat.completions.create( model=model_id, messages=messages, temperature=temperature, top_p=top_p, max_tokens=max_tokens, stream=False ) return completion.choices[0].message.content def generate_llm05(text, max_tokens=1024, temperature=1.0, top_p=1.0): messages = [ {"role": "system", "content": system_prompt_llm05}, {"role": "user", "content": text} ] completion = client.chat.completions.create( model=model_id, messages=messages, temperature=temperature, top_p=top_p, max_tokens=max_tokens, stream=False ) return completion.choices[0].message.content def generate_llm07(text, max_tokens=1024, temperature=1.0, top_p=1.0): messages = [ {"role": "system", "content": system_prompt_llm07}, {"role": "user", "content": text} ] completion = client.chat.completions.create( model=model_id, messages=messages, temperature=temperature, top_p=top_p, max_tokens=max_tokens, stream=False ) return completion.choices[0].message.content def generate_llm09(text, max_tokens=1024, temperature=1.0, top_p=1.0): messages = [ {"role": "system", "content": system_prompt_llm09}, {"role": "user", "content": text} ] completion = client.chat.completions.create( model=model_id, messages=messages, temperature=temperature, top_p=top_p, max_tokens=max_tokens, stream=False ) return completion.choices[0].message.content # Example 文字內容 example_text_00 = """ LLM01:提示詞注入(Prompt Injection) 防範措施包括輸入驗證和清理、上下文感知的提示過濾和回應分析以及嚴格的互動日誌記錄。 LLM02:敏感資訊揭露(Sensitive Information Disclosure) 應使用零信任方法處理 LLM 輸出並進行驗證和清理。 LLM03:供應鏈風險(Supply Chain) 可以檢查訓練資料來防範這種情況。 LLM04:資料與模型投毒(Data and Model Poisoning) 可以透過限速、嚴格的使用者身分驗證以及有效的資源分配來防止這種攻擊。 LLM05:不當輸出處理(Improper Output Handling) 必須評估供應商、使用信任的外掛、持續更新模型以及進行簽章等安全措施來防堵此問題。 LLM06:過度代理授權(Excessive Agency) 進行資料清理、實作適當的使用政策並限制返回的資料類型。 LLM07:系統提示詞洩露(System Prompt Leakage) 開發人員必須嚴格遵守安全規則來防止漏洞,例如嚴格的參數輸入和安全的訪問控制準則。 LLM08:向量與嵌入弱點(Vector and Embedding Weaknesses) 過度授權造成的漏洞。開發人員必須限制外掛功能、追蹤使用者授權所有操作都要經過人工批准並在下游系統中實作授權。 LLM09:錯誤資訊(Misinformation) 過度依賴導致的錯誤資訊傳播。為了減輕這種風險,應對關鍵輸出進行人工審查實施機制來驗證資訊的準確性。 LLM10:無限資源耗盡(Unbounded Consumption) 未經授權的訪問可能導致經濟損失、競爭優勢削弱以及敏感資訊外洩的危機。 """ example_text_01 = """ 針對以下文字內容做摘要 作者: The MITRE Corporation 簡潔摘要: 這篇由知名的 MITRE Corporation 提出的論文,介紹了一個名為 OCCULT 的全新評估框架,專門用來衡量大型語言模型在執行「攻擊性網路作戰」(Offensive Cyber Operations)方面的能力。研究指出,一個名為 DeepSeek-R1 的模型在相關知識測試中表現極為出色,答對率超過九成,這無疑敲響了警鐘,也凸顯了評估與防禦 AI 驅動的網路威脅的迫切性。 論文連結: [https://arxiv.org/abs/2502.15797](https://arxiv.org/abs/2502.15797) 作者: Jiacen Xu, et al. 簡潔摘要: 此研究提出了一個名為 AutoAttacker 的自動化系統,該系統利用大型語言模型(LLM)的強大推理與規劃能力, 在模擬環境中自動執行過去需要資深駭客「手動操作」的網路攻擊。這項工作展示了將 LLM 從單純的知識問答工具,轉變為能夠自主執行複雜任務的「行動者」的巨大潛力,無論是對紅隊演練還是對未來的安全防護,都具有深遠的啟示。 論文連結: [https://arxiv.org/abs/2403.01038v1](https://arxiv.org/abs/2403.01038v1) """ # 建立 Gradio 介面 with gr.Blocks(title="LLM Tester") as demo: gr.Markdown( """