Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -6,7 +6,7 @@ import plotly.express as px
|
|
6 |
import os
|
7 |
|
8 |
# --- 1. 模型加载 ---
|
9 |
-
# 负责同学: [
|
10 |
# 注意:QuantFactory/Apollo2-7B-GGUF 模型通常不直接兼容 pipeline("text-generation", ...)
|
11 |
# 除非有额外的llama.cpp或特定的transformers加载配置。
|
12 |
# 为了演示和确保运行流畅,这里使用 gpt2-large 作为替代。
|
@@ -18,7 +18,7 @@ except Exception as e:
|
|
18 |
print(f"❌ 模型 1 (文本生成: {model1_name}) 加载失败: {e}")
|
19 |
generator1 = None
|
20 |
|
21 |
-
# 负责同学: [
|
22 |
# deepset/roberta-base-squad2 是一个问答模型,需要 context
|
23 |
try:
|
24 |
model2_name = "deepset/roberta-base-squad2"
|
@@ -27,7 +27,9 @@ try:
|
|
27 |
except Exception as e:
|
28 |
print(f"❌ 模型 2 (问答: {model2_name}) 加载失败: {e}")
|
29 |
qa_model = None
|
30 |
-
|
|
|
|
|
31 |
# 这个函数现在接受一个问题/提示词和一个上下文
|
32 |
def get_model_outputs(question_or_prompt, context, max_length=100):
|
33 |
output_text_gen = "文本生成模型未加载或生成失败。"
|
@@ -59,6 +61,57 @@ def get_model_outputs(question_or_prompt, context, max_length=100):
|
|
59 |
return output_text_gen, output_qa
|
60 |
|
61 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
62 |
# Arena 选项卡内容创建函数 (40分)
|
63 |
def create_arena_tab():
|
64 |
with gr.Blocks() as arena_block:
|
@@ -89,7 +142,8 @@ def create_arena_tab():
|
|
89 |
outputs=[output_text_gen, output_qa]
|
90 |
)
|
91 |
return arena_block
|
92 |
-
|
|
|
93 |
# 报告内容直接嵌入到代码中
|
94 |
# def create_report_tab():
|
95 |
# report_content_markdown = """
|
@@ -156,4 +210,153 @@ def create_arena_tab():
|
|
156 |
# E1 --> F[在 Gradio 界面显示];
|
157 |
# E2 --> F;
|
158 |
# ```
|
159 |
-
# *说明:此流程图展示了用户输入如何被 Gradio 界面捕获,问题和上下文分别传递给两个模型。文本生成模型将两者合并为提示词,问答模型则分别使用它们,最终将各自的结果展示在界面上。*
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
6 |
import os
|
7 |
|
8 |
# --- 1. 模型加载 ---
|
9 |
+
# 负责同学: [孙世纪]
|
10 |
# 注意:QuantFactory/Apollo2-7B-GGUF 模型通常不直接兼容 pipeline("text-generation", ...)
|
11 |
# 除非有额外的llama.cpp或特定的transformers加载配置。
|
12 |
# 为了演示和确保运行流畅,这里使用 gpt2-large 作为替代。
|
|
|
18 |
print(f"❌ 模型 1 (文本生成: {model1_name}) 加载失败: {e}")
|
19 |
generator1 = None
|
20 |
|
21 |
+
# 负责同学: [牛正武]
|
22 |
# deepset/roberta-base-squad2 是一个问答模型,需要 context
|
23 |
try:
|
24 |
model2_name = "deepset/roberta-base-squad2"
|
|
|
27 |
except Exception as e:
|
28 |
print(f"❌ 模型 2 (问答: {model2_name}) 加载失败: {e}")
|
29 |
qa_model = None
|
30 |
+
|
31 |
+
|
32 |
+
# --- 2. 推理函数 ---
|
33 |
# 这个函数现在接受一个问题/提示词和一个上下文
|
34 |
def get_model_outputs(question_or_prompt, context, max_length=100):
|
35 |
output_text_gen = "文本生成模型未加载或生成失败。"
|
|
|
61 |
return output_text_gen, output_qa
|
62 |
|
63 |
|
64 |
+
# --- 3. GRACE 评估数据(示例数据,请根据你们的实际评估结果修改) ---
|
65 |
+
# 请根据 gpt2-large 和 deepset/roberta-base-squad2 的实际表现进行评分
|
66 |
+
grace_data = {
|
67 |
+
"维度": ["Generalization (泛化性)", "Relevance (相关性)", "Artistry (创新表现力)", "Efficiency (效率性)"],
|
68 |
+
# 模型 1: gpt2-large (通用文本生成模型)
|
69 |
+
"GPT2-Large": [
|
70 |
+
4.0, # 泛化性: 能处理多种文本生成任务
|
71 |
+
3.5, # 相关性: 对于特定事实性问题可能不如问答模型精确
|
72 |
+
4.2, # 创新表现力: 生成文本流畅,有一定创造性
|
73 |
+
3.8 # 效率性: 相对 GPT2 较大,但比 Llama-2-7b 小
|
74 |
+
],
|
75 |
+
# 模型 2: deepset/roberta-base-squad2 (问答模型)
|
76 |
+
"RoBERTa-SQuAD2": [
|
77 |
+
3.0, # 泛化性: 专门用于问答,不能生成开放式文本
|
78 |
+
4.8, # 相关性: 从给定上下文中抽取答案,相关性极高
|
79 |
+
2.0, # 创新表现力: 抽取式问答,无创新表现
|
80 |
+
4.5 # 效率性: 推理速度快,效率高
|
81 |
+
]
|
82 |
+
}
|
83 |
+
grace_df = pd.DataFrame(grace_data)
|
84 |
+
|
85 |
+
|
86 |
+
# --- 4. Gradio 界面构建 ---
|
87 |
+
|
88 |
+
# LLM Benchmark 选项卡内容创建函数 (30分)
|
89 |
+
def create_benchmark_tab():
|
90 |
+
# 生成雷达图
|
91 |
+
fig = px.line_polar(grace_df, r=grace_df.columns[1], theta="维度", line_close=True,
|
92 |
+
range_r=[0, 5], title="GRACE 评估:模型横向对比")
|
93 |
+
# 添加其他模型的轨迹
|
94 |
+
for col in grace_df.columns[2:]:
|
95 |
+
fig.add_trace(px.line_polar(grace_df, r=col, theta="维度", line_close=True).data[0])
|
96 |
+
|
97 |
+
fig.update_traces(fill='toself', opacity=0.6) # 填充颜色,增加透明度
|
98 |
+
fig.update_layout(
|
99 |
+
polar=dict(
|
100 |
+
radialaxis=dict(visible=True, range=[0, 5], tickvals=[1,2,3,4,5], ticktext=['1分','2分','3分','4分','5分']) # 显示刻度
|
101 |
+
),
|
102 |
+
showlegend=True, # 显示图例
|
103 |
+
# title_font_size=20 # 标题字体大小
|
104 |
+
)
|
105 |
+
|
106 |
+
return gr.Column(
|
107 |
+
gr.Markdown("## 📊 模型性能对比 (GRACE 评估)"),
|
108 |
+
gr.Markdown("本页展示了我们选用的模型在 GRACE 框架下的评估结果。数据为 1-5 分,分数越高代表表现越好。\n"
|
109 |
+
"**注意**: GPT2-Large 主要用于文本生成,RoBERTa-SQuAD2 主要用于问答,它们的评估维度侧重有所不同。"),
|
110 |
+
gr.Plot(fig, label="GRACE 评估雷达图"),
|
111 |
+
gr.Markdown("### GRACE 评估数据"),
|
112 |
+
gr.DataFrame(grace_df, label="详细评估数据")
|
113 |
+
)
|
114 |
+
|
115 |
# Arena 选项卡内容创建函数 (40分)
|
116 |
def create_arena_tab():
|
117 |
with gr.Blocks() as arena_block:
|
|
|
142 |
outputs=[output_text_gen, output_qa]
|
143 |
)
|
144 |
return arena_block
|
145 |
+
|
146 |
+
# Report 选项卡内容创建函数 (30分)
|
147 |
# 报告内容直接嵌入到代码中
|
148 |
# def create_report_tab():
|
149 |
# report_content_markdown = """
|
|
|
210 |
# E1 --> F[在 Gradio 界面显示];
|
211 |
# E2 --> F;
|
212 |
# ```
|
213 |
+
# *说明:此流程图展示了用户输入如何被 Gradio 界面捕获,问题和上下文分别传递给两个模型。文本生成模型将两者合并为提示词,问答模型则分别使用它们,最终将各自的结果展示在界面上。*
|
214 |
+
|
215 |
+
# ### 2.3 模型集成方式说明
|
216 |
+
# 我们的 Hugging Face Space 使用 Python 和 Gradio 库构建。模型集成主要通过 `transformers` 库的 `pipeline` 功能实现。
|
217 |
+
|
218 |
+
# 1. **模型加载**: 在 `app.py` 脚本初始化时,我们使用 `transformers.pipeline()` 函数加载了预训练模型。
|
219 |
+
# * 对于 **GPT2-Large (文本生成)**:`generator1 = pipeline("text-generation", model="gpt2-large", ...)`
|
220 |
+
# * 对于 **deepset/roberta-base-squad2 (问答)**:`qa_model = pipeline("question-answering", model="deepset/roberta-base-squad2", ...)`
|
221 |
+
# * 我们通过 `device=0 if torch.cuda.is_available() else -1` 来尝试利用 GPU(如果可用),否则回退到 CPU。
|
222 |
+
# 2. **推理函数**: 我们定义了一个 `get_model_outputs(question_or_prompt, context, max_length)` 函数。
|
223 |
+
# * 该函数接收用户输入的“问题/提示词”和“上下文”。
|
224 |
+
# * 对于文本生成模型,我们将问题和上下文合并为一个 `full_prompt_for_gen` 作为其输入。
|
225 |
+
# * 对于问答模型,我们将问题和上下文分别传递给 `qa_model`。
|
226 |
+
# * 函数返回两个模型的生成结果。
|
227 |
+
# 3. **Gradio 界面连接**: 在 Gradio 界面中,我们创建了两个文本输入框(一个用于问题/提示词,一个用于上下文)和两个独立的文本输出框。通过 `gr.Button.click()` 方法,将输入框的文本作为参数传递给 `get_model_outputs` 函数,并将函数的返回结果分别更新到对应的输出框中。
|
228 |
+
# 4. **错误处理**: 代码中包含了 `try-except` 块,以处理模型加载失败或推理过程中可能出现的错误,确保应用稳定性。如果模型未能加载,界面上会显示相应的错误信息。
|
229 |
+
|
230 |
+
# ---
|
231 |
+
|
232 |
+
# ## 3. GRACE 评估维度定义
|
233 |
+
|
234 |
+
# 我们选择了以下 **4 个** GRACE 维度进行评估,并结合我们选择的模型类型给出了具体定义:
|
235 |
+
|
236 |
+
# 1. **R: Relevance (相关性)**:
|
237 |
+
# * **定义**:
|
238 |
+
# * **文本生成模型 (GPT2-Large)**:生成的文本内容与用户输入的提示词(包括上下文)在语义上是否紧密相关,是否准确捕捉并回应了提示词的核心主题或意图。
|
239 |
+
# * **问答模型 (RoBERTa-SQuAD2)**:抽取出的答案是否准确地回答了问题,并且答案内容完全来自于提供的上下文。
|
240 |
+
# * **理由**: 对于任何文本处理任务,确保输出内容不偏离主题或准确回答问题至关重要。
|
241 |
+
|
242 |
+
# 2. **A: Artistry (创新表现力)**:
|
243 |
+
# * **定义**:
|
244 |
+
# * **文本生成模型 (GPT2-Large)**:生成的文本是否具有创造性、流畅性、多样性和引人入胜的表达。这包括遣词造句的优美度、叙述的连贯性以及是否能提供新颖的视角。
|
245 |
+
# * **问答模型 (RoBERTa-SQuAD2)**:由于是抽取式模型,其“创新表现力”主要体现在抽取答案的精确性和简洁性上,不涉及生成新的文本。
|
246 |
+
# * **理由**: 衡量生成内容的质量和吸引力,区分模型是否仅能“复述”已知信息,还是能真正“创造”有价值的内容。对于抽取模型,则关注其在限定范围内的表现。
|
247 |
+
|
248 |
+
# 3. **G: Generalization (泛化性)**:
|
249 |
+
# * **定义**:
|
250 |
+
# * **文本生成模型 (GPT2-Large)**:模型在面对不同类型、不同长度、不同风格的提示词(包括是否提供上下文)时,是否都能稳定地生成高质量且符合预期的文本。
|
251 |
+
# * **问答模型 (RoBERTa-SQuAD2)**:模型在面对不同领域、不同长度、不同复杂度的上下文和问题时,是否都能准确地从其中抽取答案。
|
252 |
+
# * **理由**: 评估模型在多样化场景下的鲁棒性和适用性。
|
253 |
+
|
254 |
+
# 4. **E: Efficiency (效率性)**:
|
255 |
+
# * **定义**: 模型从接收输入到生成完整输出所需的时间,以及在给定计算资源下,生成高质量结果所需的资源消耗(如 CPU/GPU 利用率、内存占用)。
|
256 |
+
# * **理由**: 在实际应用中,模型的推理速度和资源效率是关键考量因素,尤其对于需要实时响应的场景。
|
257 |
+
|
258 |
+
# ---
|
259 |
+
|
260 |
+
# ## 4. 结果与分析
|
261 |
+
|
262 |
+
# ### 4.1 多条统一输入样例输出结果表格
|
263 |
+
|
264 |
+
# 我们使用以下统一输入样例对模型进行了测试:
|
265 |
+
|
266 |
+
# | 输入样例 (问题/提示词) | 上下文 (Context) | GPT2-Large (文本生成) 输出 (请实际运行后填充) | RoBERTa-SQuAD2 (问答) 输出 (请实际运行后填充) |
|
267 |
+
# | :----------------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------- | :------------------------------------------ |
|
268 |
+
# | "请写一段关于人工智能未来的短文。" | "" (无上下文,主要测试文本生成) | [实际运行后填充] | 问答模型需要提供上下文才能回答问题。 |
|
269 |
+
# | "描写一段夏日午后的场景,要包含蝉鸣和微风。" | "" (无上下文,主要测试文本生成) | [实际运行后填充] | 问答模型需要提供上下文才能回答问题。 |
|
270 |
+
# | "关于地球核心的温度大约是多少?" | "地球核心的温度非常高,估计在5200摄氏度(9392华氏度)到6200摄氏度(11192华氏度)之间,与太阳表面的温度相近。核心主要由铁和镍组成。" | [实际运行后填充] | [实际运行后填充] |
|
271 |
+
# | "埃菲尔铁塔的高度是多少米?" | "埃菲尔铁塔是法国巴黎的标志性建筑,于1889年建成,以其设计师古斯塔夫·埃菲尔的名字命名。最初高度为312米,包括天线在内,现在高度约为330米。" | [实际运行后填充] | [实际运行后填充] |
|
272 |
+
# | "推荐3个环保的生活小习惯。" | "" (无上下文,主要测试文本生成) | [实际运行后填充] | 问答模型需要提供上下文才能回答问题。 |
|
273 |
+
|
274 |
+
# *(请根据你们实际测试结果填充表格)*
|
275 |
+
|
276 |
+
# ### 4.2 雷达图展示维度评分
|
277 |
+
|
278 |
+
# 
|
279 |
+
# *(请将此处的图片链接替换为你实际生成并上传的雷达图链接,例如:`/file/main/grace_radar_chart.png`)*
|
280 |
+
|
281 |
+
# ### 4.3 分析每个模型的优劣势
|
282 |
+
|
283 |
+
# **模型 1 (GPT2-Large)**:
|
284 |
+
# * **优势**:
|
285 |
+
# * **创新表现力 (A)**:生成的文本非常流畅、自然,具有较强的连贯性和创造性,能够进行开放式的生成任务。
|
286 |
+
# * **泛化性 (G)**:作为通用文本生成模型,能够处理各种类型的提示词,并尝试续写或生成相关内容,即便没有明确上下文也能工作。
|
287 |
+
# * **劣势**:
|
288 |
+
# * **相关性 (R)**:在需要精确回答特定事实性问题时,它可能会“胡说八八道”(hallucinate),生成看似合理但实际不准确的信息,不如问答模型直接从文本中抽取答案来得准确。
|
289 |
+
# * **效率性 (E)**:相较于基础的问答模型,GPT2-Large 的模型规模更大,推理速度相对较慢,对计算资源(如 GPU 内存)的需求较高。
|
290 |
+
|
291 |
+
# **模型 2 (RoBERTa-SQuAD2)**:
|
292 |
+
# * **优势**:
|
293 |
+
# * **相关性 (R)**:在给定有效上下文的前提下,它能极其精确地从文本中抽取答案,确保了高度的相关性和准确性。
|
294 |
+
# * **效率性 (E)**:模型规模相对较小,推理速度快,资源消耗低,非常适合需要快速响应的问答应用。
|
295 |
+
# * **劣势**:
|
296 |
+
# * **创新表现力 (A)**:作为一个抽取式模型,它没有“创造性”,只能提取现有信息,无法进行开放式生成或内容创作。
|
297 |
+
# * **泛化性 (G)**:其任务范围非常局限,只能进行问答任务,且高度依赖于提供的上下文;无法进行自由文本生成或理解无上下文的问题。
|
298 |
+
|
299 |
+
# ---
|
300 |
+
|
301 |
+
# ## 5. 合作与反思
|
302 |
+
|
303 |
+
# ### 成员 1: [孙世纪]
|
304 |
+
|
305 |
+
# * **各自负责内容**:
|
306 |
+
# * 我主要负责了 **GPT2-Large 模型的集成**,包括在 `app.py` 中加载模型、编写其文本生成推理逻辑,并确保其在 Gradio 界面中正常工作。
|
307 |
+
# * 我参与了 **“Arena”选项卡的用户界面布局设计**,确保两个模型的输入和输出能够清晰地并排展示。
|
308 |
+
# * 在报告撰写方面,我主要负责了**“1. 模型及类别选择”部分**的初步内容,并参与了 GRACE 评估数据的收集。
|
309 |
+
|
310 |
+
# * **��到的内容**:
|
311 |
+
# * 深入理解了 Hugging Face `transformers` 库中 `pipeline` 的灵活运用,特别是如何根据不同任务类型(如 `text-generation`)配置模型。
|
312 |
+
# * 学会了在 Gradio 中构建多输入多输出的复杂界面,并通过 `gr.Blocks` 和 `gr.Row` 进行有效的布局管理。
|
313 |
+
# * 对通用文本生成模型和抽取式问答模型的工作原理和应用场景有了更具体的认识。
|
314 |
+
|
315 |
+
# * **遇到的困难**:
|
316 |
+
# * **困难 1**: GPT2-Large 模型在免费的 Hugging Face Space 上加载速度较慢,有时甚至因为资源限制导致启动失败。
|
317 |
+
# * **解决尝试**: 我在代码中增加了更详细的模型加载成功/失败打印信息,并提醒用户注意等待时间。在几次测试后,发现偶尔会出现资源不足的情况,需要等待 Space 自动重启。
|
318 |
+
# * **困难 2**: 报告中 Mermaids 流程图的语法调试。
|
319 |
+
# * **解决尝试**: 我查阅了 Mermaid 的官方文档,并在本地编辑器中进行预览,确保流程图语法正确无误。
|
320 |
+
|
321 |
+
# ### 2: [牛正武]
|
322 |
+
|
323 |
+
# * **各自负责内容**:
|
324 |
+
# * 我主要负责了 **deepset/roberta-base-squad2 问答模型的集成**,包括加载模型、编写其问答推理逻辑,并处理上下文输入。
|
325 |
+
# * 我负责了 **“LLM Benchmark”选项卡中 GRACE 雷达图的实现和数据可视化**,确保图表能够准确反映评估结果。
|
326 |
+
# * 在报告撰写方面,我主要负责了**“2. 系统实现细节”、“3. GRACE 评估维度定义”以及“4. 结果与分析”部分**。
|
327 |
+
|
328 |
+
# * **学到的内容**:
|
329 |
+
# * 掌握了如何在 Gradio 应用中使用 `plotly.express` 生成复杂的可视化图表,并将其嵌入到 Gradio 界面中。
|
330 |
+
# * 深入理解了问答模型的工作机制,特别是它对“问题”和“上下文”的严格依赖关系。
|
331 |
+
# * 锻炼了数据分析和可视化的能力,通过量化评估来比较不同模型的性能。
|
332 |
+
|
333 |
+
# * **遇到的困难**:
|
334 |
+
# * **困难 1**: 最初尝试使用 `QuantFactory/Apollo2-7B-GGUF` 模型时,发现其与 `pipeline` 的兼容性问题。
|
335 |
+
# * **解决尝试**: 与组员讨论后,决定替换为一个更易于在标准 `transformers.pipeline` 环境下运行的文本生成模型(如 GPT2-Large),以确保项目能按时完成并成功运行。
|
336 |
+
# * **困难 2**: 在 GRACE 评估中,对不同类型的模型(生成和抽取)在某些维度(如“Artistry”)上进行比较时,很难找到统一的评估标准。
|
337 |
+
# * **解决尝试**: 我们通过详细定义每个维度在不同模型类型下的具体含义和侧重点,并进行多次交叉评估,最终达成了一致的评分。例如,“Artistry”对于问答模型主要体现在答案的精确和简洁,而非创造性。
|
338 |
+
|
339 |
+
# ---
|
340 |
+
# """
|
341 |
+
|
342 |
+
# return gr.Markdown(report_content_markdown)
|
343 |
+
|
344 |
+
|
345 |
+
# --- Gradio 应用界面定义 ---
|
346 |
+
with gr.Blocks(title="AI模型对比项目") as demo:
|
347 |
+
gr.Markdown("# 🤖 AI 模型对比与评估平台")
|
348 |
+
gr.Markdown("本平台旨在通过交互式界面,对比分析不同 AI 模型在特定任务上的表现。")
|
349 |
+
|
350 |
+
# 定义选项卡
|
351 |
+
with gr.Tab("⚔️ Arena"):
|
352 |
+
create_arena_tab()
|
353 |
+
|
354 |
+
with gr.Tab("📊 LLM Benchmark"):
|
355 |
+
create_benchmark_tab()
|
356 |
+
|
357 |
+
# with gr.Tab("📝 Report"): # Adding the Report tab
|
358 |
+
# create_report_tab()
|
359 |
+
|
360 |
+
# 启动 Gradio 应用
|
361 |
+
if __name__ == "__main__":
|
362 |
+
demo.launch()
|