Files
siemens_ragas/webapp/static/index.html

225 lines
9.7 KiB
HTML
Raw Normal View History

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Siemens RAGAS 评估控制台</title>
<link rel="stylesheet" href="/static/css/app.css" />
<script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.1/dist/chart.umd.min.js"></script>
</head>
<body>
<div class="app">
<!-- 左侧导航(布局 A -->
<aside class="sidebar">
<div class="brand">
<div class="brand-mark">RAGAS</div>
<div class="brand-sub">评估控制台</div>
</div>
<nav class="nav">
<button class="nav-item" data-view="runs">
<span class="nav-ico"></span><span>运行列表</span>
</button>
<button class="nav-item" data-view="new">
<span class="nav-ico"></span><span>新建评估</span>
</button>
<button class="nav-item" data-view="report" data-requires-run="1" disabled>
<span class="nav-ico"></span><span>报告详情</span>
</button>
<button class="nav-item" data-view="profiles">
<span class="nav-ico"></span><span>LLM 配置</span>
</button>
</nav>
<div class="sidebar-foot">
<span class="dot" id="health-dot"></span>
<span id="health-text">连接中…</span>
</div>
</aside>
<!-- 主内容区 -->
<main class="main">
<header class="topbar">
<h1 id="view-title">运行列表</h1>
<button class="btn btn-ghost" id="refresh-btn">刷新</button>
</header>
<!-- 运行列表视图 -->
<section class="view" id="view-runs">
<div id="runs-container" class="runs-grid"></div>
<div class="empty" id="runs-empty" hidden>
<p>暂无评估运行。</p>
<p class="muted">从「新建评估」触发一次,或运行示例数据生成脚本:<code>python scripts/seed_sample_run.py</code></p>
</div>
</section>
<!-- 新建评估视图 -->
<section class="view" id="view-new" hidden>
<div class="panel">
<h2>选择场景并运行</h2>
<p class="muted"><code>scenarios/</code> 下选择一个场景配置,点击运行后在下方查看实时状态与日志。</p>
<div class="scenario-list" id="scenario-list"></div>
<div class="run-actions">
<button class="btn btn-primary" id="run-btn" disabled>运行评估</button>
<span class="selected-scenario muted" id="selected-scenario">未选择场景</span>
</div>
</div>
<!-- LLM 角色配置面板(选中场景后显示) -->
<div class="panel llm-assignment-panel" id="llm-assignment-panel" hidden>
<h2>LLM 角色配置 <span class="muted" style="font-size:13px;font-weight:400">(可选)</span></h2>
<p class="muted" style="margin-bottom:14px">为不同任务角色选择已保存的 LLM 配置,留空则使用场景文件中的原始配置。</p>
<div class="llm-role-rows">
<div class="llm-role-row">
<label class="llm-role-label">评测打分 Judge LLM</label>
<select class="select llm-role-select" id="role-judge">
<option value="">— 使用场景原始配置 —</option>
</select>
</div>
<div class="llm-role-row">
<label class="llm-role-label">生成答案 Answer LLM</label>
<select class="select llm-role-select" id="role-answer">
<option value="">— 使用场景原始配置 —</option>
</select>
</div>
<div class="llm-role-row">
<label class="llm-role-label">生成题库 Dataset LLM</label>
<select class="select llm-role-select" id="role-dataset">
<option value="">— 使用场景原始配置 —</option>
</select>
</div>
</div>
</div>
<div class="panel" id="task-panel" hidden>
<div class="task-head">
<h2>评估进度</h2>
<span class="badge" id="task-status">queued</span>
</div>
<pre class="log-box" id="task-log"></pre>
<div class="task-actions">
<button class="btn btn-primary" id="view-report-btn" hidden>查看报告</button>
</div>
</div>
</section>
<!-- 报告详情视图 -->
<section class="view" id="view-report" hidden>
<!-- 历史报告切换下拉(顶部,始终可见) -->
<div class="report-switcher no-print" id="report-switcher">
<label class="report-switcher-label">切换报告</label>
<select class="select report-switcher-select" id="report-switcher-select">
<option value="">— 加载中… —</option>
</select>
</div>
<div class="empty" id="report-empty">
<p>请先从「运行列表」选择一次运行。</p>
</div>
<div id="report-content" hidden>
<!-- 顶部元信息条 -->
<div class="report-meta" id="report-meta"></div>
<div class="report-actions no-print">
<button class="btn btn-ghost btn-export-pdf" id="export-pdf-btn" onclick="Report.exportPdf()">
📄 导出 PDF
</button>
</div>
<!-- ① 指标均值卡片 -->
<div class="section-label">① 指标均值 OVERVIEW</div>
<div class="metric-cards" id="metric-cards"></div>
<!-- ② 分布 + ③ 分组 并排 -->
<div class="report-row">
<div class="panel report-half">
<div class="panel-head">
<div class="section-label tight">② 分数分布</div>
<select id="dist-metric-select" class="select"></select>
</div>
<canvas id="dist-chart" height="160"></canvas>
<p class="muted tiny">暴露长尾失败样本</p>
</div>
<div class="panel report-half">
<div class="section-label tight">③ 分组均值</div>
<div id="grouping-tabs" class="grouping-tabs"></div>
<div id="grouping-table"></div>
<p class="muted tiny">定位薄弱类别</p>
</div>
</div>
<!-- ④ 最低分样本逐条复核 -->
<div class="section-label">④ 最低分样本(点击展开逐条复核)</div>
<div class="lowest-table" id="lowest-table"></div>
<!-- ⑤ 优化建议optimization_advisor: true 时显示) -->
<div id="advice-section" hidden>
<div class="section-label">⑤ 优化建议 OPTIMIZATION ADVICE</div>
<div class="panel advice-panel">
<div class="advice-header">
<span class="advice-badge">AI 诊断报告</span>
<span class="advice-model" id="advice-model-label"></span>
</div>
<div class="advice-body" id="advice-body"></div>
</div>
</div>
</div>
</section>
<!-- LLM 配置视图 -->
<section class="view" id="view-profiles" hidden>
<div class="panel">
<div class="panel-head">
<h2>LLM 配置管理</h2>
<button class="btn btn-primary" id="add-profile-btn"> 新建配置</button>
</div>
<p class="muted">保存常用 LLM 连接参数,在运行评估时按角色选择。</p>
</div>
<!-- 新建 / 编辑表单(默认隐藏) -->
<div class="panel" id="profile-form-panel" hidden>
<h2 id="profile-form-title">新建 LLM 配置</h2>
<div class="profile-form">
<input type="hidden" id="edit-profile-id" />
<div class="form-row">
<label class="form-label">配置名称 <span class="req">*</span></label>
<input class="form-input" id="pf-name" placeholder="例DeepSeek Flash内网" />
</div>
<div class="form-row">
<label class="form-label">模型名称 <span class="req">*</span></label>
<input class="form-input" id="pf-model" placeholder="例deepseek-v4-flash" />
</div>
<div class="form-row">
<label class="form-label">Base URL <span class="req">*</span></label>
<input class="form-input" id="pf-base-url" placeholder="例http://6.86.80.4:30080/v1" />
</div>
<div class="form-row">
<label class="form-label">API Key <span class="req">*</span></label>
<input class="form-input" id="pf-api-key" type="password" placeholder="sk-…" />
</div>
<div class="form-row">
<label class="form-label">超时(秒)</label>
<input class="form-input form-input-sm" id="pf-timeout" type="number" value="30" min="5" max="300" />
</div>
<div class="form-actions">
<button class="btn btn-primary" id="save-profile-btn">保存</button>
<button class="btn" id="cancel-profile-btn">取消</button>
<span class="form-error muted" id="profile-form-error"></span>
</div>
</div>
</div>
<div id="profile-cards" class="profile-grid"></div>
<div class="empty" id="profiles-empty" hidden>
<p>尚未添加任何 LLM 配置。</p>
<p class="muted">点击「新建配置」添加第一个。</p>
</div>
</section>
</main>
</div>
<script src="/static/js/api.js"></script>
<script src="/static/js/report.js"></script>
<script src="/static/js/profiles.js"></script>
<script src="/static/js/runner.js"></script>
<script src="/static/js/app.js"></script>
</body>
</html>