index.html 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329
  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>RAG管道测试可视化工具</title>
  7. <link rel="stylesheet" href="styles.css">
  8. <!-- Markdown渲染库 -->
  9. <script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
  10. <!-- LaTeX公式渲染库 -->
  11. <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.css">
  12. <script src="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.js"></script>
  13. <script src="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/contrib/auto-render.min.js"></script>
  14. </head>
  15. <body>
  16. <div class="container">
  17. <header class="header">
  18. <h1>🔍 RAG管道测试可视化工具</h1>
  19. <p class="subtitle">RAG链路各环节输入输出数据流转调试工具 + 专业性审查完整测试</p>
  20. </header>
  21. <!-- 功能切换Tab -->
  22. <section class="function-tabs">
  23. <button class="function-tab active" data-function="rag" onclick="switchFunction('rag')">
  24. 🔍 RAG召回测试
  25. </button>
  26. <button class="function-tab" data-function="native_rag" onclick="window.open('native_rag.html','_blank')">
  27. ⚡ Native RAG
  28. </button>
  29. <button class="function-tab" data-function="professional" onclick="switchFunction('professional')">
  30. 🎯 专业性审查测试
  31. </button>
  32. <button class="function-tab" data-function="debug" onclick="switchFunction('debug')">
  33. 🔬 环节调试
  34. </button>
  35. </section>
  36. <!-- 统一的测试输入区域 -->
  37. <section class="test-input-section">
  38. <h2 id="sectionTitle">🚀 RAG链路测试</h2>
  39. <div class="server-status" id="serverStatus">
  40. <span class="status-dot offline"></span>
  41. <span class="status-text">服务未连接</span>
  42. </div>
  43. <div class="input-area">
  44. <textarea id="testInput" placeholder="输入测试文本,点击执行RAG检索...&#10;&#10;示例:主要部件说明&#10;1、主梁总成&#10;主梁总成由主梁和导梁构成。主梁单节长12m,共7节,每节重10.87t..."></textarea>
  45. </div>
  46. <!-- 专业性审查类型选择器 -->
  47. <div class="review-type-selector" id="reviewTypeSelector" style="display: none;">
  48. <label>审查类型:</label>
  49. <label class="radio-label">
  50. <input type="radio" name="checkType" value="both" checked><span>全部审查</span>
  51. </label>
  52. <label class="radio-label">
  53. <input type="radio" name="checkType" value="non_parameter"><span>非参数审查</span>
  54. </label>
  55. <label class="radio-label">
  56. <input type="radio" name="checkType" value="parameter"><span>参数审查</span>
  57. </label>
  58. </div>
  59. <!-- Native RAG已移至独立页面 native_rag.html -->
  60. <!-- 动作按钮 -->
  61. <div class="action-buttons">
  62. <!-- RAG召回按钮 -->
  63. <button class="btn btn-primary" id="runRagBtn" onclick="runRAG()">
  64. <span class="btn-icon">▶</span> 执行RAG检索
  65. </button>
  66. <!-- 专业性审查按钮 -->
  67. <button class="btn btn-success" id="runProfessionalBtn" onclick="runProfessionalReview()" style="display: none;">
  68. <span class="btn-icon">▶</span> 执行专业性审查
  69. </button>
  70. <button class="btn btn-secondary" onclick="loadSampleData()" id="loadSampleBtn">加载历史数据</button>
  71. <button class="btn btn-secondary" onclick="clearAllData()">清空</button>
  72. </div>
  73. <div class="loading-overlay" id="loadingOverlay" style="display: none;">
  74. <div class="loading-spinner"></div>
  75. <p id="loadingText">正在执行RAG检索...</p>
  76. </div>
  77. </section>
  78. <!-- 文件上传区域 -->
  79. <section class="upload-section">
  80. <div class="upload-area" id="uploadArea">
  81. <div class="upload-icon">📁</div>
  82. <p>或拖拽JSON文件到此处查看历史数据</p>
  83. <input type="file" id="fileInput" accept=".json" hidden>
  84. </div>
  85. </section>
  86. <!-- 管道概览 -->
  87. <section class="pipeline-overview" id="pipelineOverview" style="display: none;">
  88. <h2>📊 管道概览</h2>
  89. <div class="overview-cards">
  90. <div class="overview-card">
  91. <div class="card-icon">⏱️</div>
  92. <div class="card-content">
  93. <span class="card-label">执行时间</span>
  94. <span class="card-value" id="totalTime">-</span>
  95. </div>
  96. </div>
  97. <div class="overview-card">
  98. <div class="card-icon">📝</div>
  99. <div class="card-content">
  100. <span class="card-label">处理阶段</span>
  101. <span class="card-value" id="stageCount">-</span>
  102. </div>
  103. </div>
  104. <div class="overview-card">
  105. <div class="card-icon">✅</div>
  106. <div class="card-content">
  107. <span class="card-label">执行状态</span>
  108. <span class="card-value" id="execStatus">-</span>
  109. </div>
  110. </div>
  111. </div>
  112. </section>
  113. <!-- 管道流程图 -->
  114. <section class="pipeline-flow" id="pipelineFlow" style="display: none;">
  115. <h2>🔄 管道流程</h2>
  116. <div class="flow-container" id="flowContainer">
  117. <!-- 动态生成流程节点 -->
  118. </div>
  119. </section>
  120. <!-- 详细数据面板 -->
  121. <section class="detail-panel" id="detailPanel" style="display: none;">
  122. <h2>📋 详细数据</h2>
  123. <div class="tabs">
  124. <button class="tab-btn active" data-tab="input">输入数据</button>
  125. <button class="tab-btn" data-tab="output">输出数据</button>
  126. <button class="tab-btn" data-tab="raw">原始JSON</button>
  127. </div>
  128. <div class="tab-content">
  129. <div class="tab-pane active" id="inputPane">
  130. <pre class="json-viewer" id="inputViewer"></pre>
  131. </div>
  132. <div class="tab-pane" id="outputPane">
  133. <pre class="json-viewer" id="outputViewer"></pre>
  134. </div>
  135. <div class="tab-pane" id="rawPane">
  136. <pre class="json-viewer" id="rawViewer"></pre>
  137. </div>
  138. </div>
  139. </section>
  140. <!-- 各阶段详情 -->
  141. <section class="stages-detail" id="stagesDetail" style="display: none;">
  142. <h2>🔬 各阶段详情</h2>
  143. <div class="accordion" id="stagesAccordion">
  144. <!-- 动态生成各阶段详情 -->
  145. </div>
  146. </section>
  147. <!-- Native RAG已移至独立页面 native_rag.html -->
  148. <!-- 专业性审查结果展示 -->
  149. <section class="professional-results" id="professionalResults" style="display: none;">
  150. <h2>📊 专业性审查结果</h2>
  151. <!-- RAG召回摘要 -->
  152. <div class="result-section">
  153. <h3>🔍 RAG召回摘要</h3>
  154. <div class="rag-summary" id="ragSummary">
  155. <!-- 动态生成 -->
  156. </div>
  157. </div>
  158. <!-- 审查结果列表 -->
  159. <div class="result-section">
  160. <h3>📋 审查结果详情</h3>
  161. <div class="review-results-list" id="reviewResultsList">
  162. <!-- 动态生成 -->
  163. </div>
  164. </div>
  165. </section>
  166. <!-- 环节调试 Section -->
  167. <section class="debug-section" id="debugSection" style="display: none;">
  168. <h2>🔬 RAG环节调试</h2>
  169. <div class="server-status" id="debugServerStatus">
  170. <span class="status-dot offline"></span>
  171. <span class="status-text">服务未连接</span>
  172. </div>
  173. <!-- 环节选择器 -->
  174. <div class="step-selector">
  175. <span class="step-selector-label">选择环节:</span>
  176. <div class="step-buttons" id="stepButtons">
  177. <button class="step-btn active" data-step="query_extract" onclick="selectDebugStep('query_extract')">
  178. <span class="step-num">1</span>
  179. <span class="step-name">查询提取</span>
  180. <span class="step-desc">query_extract</span>
  181. </button>
  182. <span class="step-arrow">→</span>
  183. <button class="step-btn" data-step="entity_enhance" onclick="selectDebugStep('entity_enhance')">
  184. <span class="step-num">2</span>
  185. <span class="step-name">实体增强</span>
  186. <span class="step-desc">entity_enhance</span>
  187. </button>
  188. <span class="step-arrow">→</span>
  189. <button class="step-btn" data-step="multi_stage_recall" onclick="selectDebugStep('multi_stage_recall')">
  190. <span class="step-num">3</span>
  191. <span class="step-name">多阶段召回</span>
  192. <span class="step-desc">multi_stage_recall</span>
  193. </button>
  194. </div>
  195. <div class="step-buttons second-row" id="stepButtonsRow2">
  196. <button class="step-btn" data-step="hybrid_search" onclick="selectDebugStep('hybrid_search')">
  197. <span class="step-num">4</span>
  198. <span class="step-name">混合检索</span>
  199. <span class="step-desc">hybrid_search</span>
  200. </button>
  201. <span class="step-arrow">→</span>
  202. <button class="step-btn" data-step="parent_doc_enhance" onclick="selectDebugStep('parent_doc_enhance')">
  203. <span class="step-num">5</span>
  204. <span class="step-name">父文档增强</span>
  205. <span class="step-desc">parent_doc_enhance</span>
  206. </button>
  207. <span class="step-arrow">→</span>
  208. <button class="step-btn" data-step="extract_results" onclick="selectDebugStep('extract_results')">
  209. <span class="step-num">6</span>
  210. <span class="step-name">结果提取</span>
  211. <span class="step-desc">extract_results</span>
  212. </button>
  213. </div>
  214. </div>
  215. <!-- 当前环节提示 -->
  216. <div class="current-step-info" id="currentStepInfo">
  217. <span class="step-info-icon">📌</span>
  218. <span class="step-info-text">当前环节: <strong>查询提取</strong> — 从输入内容中提取查询实体和关键词</span>
  219. </div>
  220. <!-- 输入区域 -->
  221. <div class="debug-input-area">
  222. <div class="input-area">
  223. <textarea id="debugInput" placeholder="输入测试文本...&#10;&#10;示例:主要部件说明&#10;1、主梁总成&#10;主梁总成由主梁和导梁构成。主梁单节长12m,共7节,每节重10.87t..."></textarea>
  224. </div>
  225. <!-- 参数面板 -->
  226. <div class="params-panel">
  227. <div class="params-header" onclick="toggleParamsPanel()">
  228. <span>⚙️ 参数配置</span>
  229. <span class="params-toggle" id="paramsToggleIcon">▼</span>
  230. </div>
  231. <div class="params-body" id="paramsBody" style="display: none;">
  232. <div class="param-row">
  233. <label>collection_name</label>
  234. <input type="text" id="paramCollectionName" value="rag_children_hybrid" placeholder="集合名称">
  235. </div>
  236. <div class="param-row">
  237. <label>top_k</label>
  238. <input type="number" id="paramTopK" value="10" min="1" max="100">
  239. </div>
  240. <div class="param-row">
  241. <label>hybrid_top_k</label>
  242. <input type="number" id="paramHybridTopK" value="50" min="1" max="200">
  243. </div>
  244. <div class="param-row">
  245. <label>score_threshold</label>
  246. <input type="number" id="paramScoreThreshold" value="0.5" min="0" max="1" step="0.05">
  247. </div>
  248. <div class="param-row">
  249. <label>dense_weight</label>
  250. <input type="number" id="paramDenseWeight" value="0.7" min="0" max="1" step="0.1">
  251. </div>
  252. <div class="param-row">
  253. <label>max_parents_per_pair</label>
  254. <input type="number" id="paramMaxParents" value="3" min="1" max="10">
  255. </div>
  256. </div>
  257. </div>
  258. </div>
  259. <!-- 操作按钮 -->
  260. <div class="action-buttons">
  261. <button class="btn btn-primary" id="runDebugStepBtn" onclick="runDebugStep()">
  262. <span class="btn-icon">▶</span> 执行当前环节
  263. </button>
  264. <button class="btn btn-success" id="runDebugChainBtn" onclick="runDebugChain()">
  265. <span class="btn-icon">🔗</span> 链式执行全部
  266. </button>
  267. <button class="btn btn-secondary" onclick="clearDebugResult()">清空结果</button>
  268. </div>
  269. <div class="loading-overlay" id="debugLoadingOverlay" style="display: none;">
  270. <div class="loading-spinner"></div>
  271. <p id="debugLoadingText">正在执行...</p>
  272. </div>
  273. <!-- 结果展示 -->
  274. <section class="debug-result-section" id="debugResultSection" style="display: none;">
  275. <h3>📊 执行结果</h3>
  276. <!-- 统计卡片 -->
  277. <div class="overview-cards" id="debugOverviewCards"></div>
  278. <!-- 链式执行步骤图 -->
  279. <div class="chain-flow" id="chainFlow" style="display: none;"></div>
  280. <!-- 输出详情 -->
  281. <div class="debug-output-area" id="debugOutputArea"></div>
  282. </section>
  283. </section>
  284. </div>
  285. <!-- 审查依据侧边栏 -->
  286. <div class="reference-sidebar" id="referenceSidebar">
  287. <div class="sidebar-header">
  288. <h3>📚 审查依据</h3>
  289. <button class="sidebar-close-btn" onclick="closeReferenceSidebar()">✕</button>
  290. </div>
  291. <div class="sidebar-content" id="sidebarContent">
  292. <!-- 动态加载Markdown内容 -->
  293. </div>
  294. </div>
  295. <div class="sidebar-overlay" id="sidebarOverlay" onclick="closeReferenceSidebar()"></div>
  296. <script src="app.js"></script>
  297. <script src="professional_review.js"></script>
  298. </body>
  299. </html>