From 44d389a434b36a172bc774b915030fbc62553cf4 Mon Sep 17 00:00:00 2001 From: KiriAky 107 Date: Wed, 8 Apr 2026 19:59:41 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=B4=E6=97=B6=E7=A6=81=E7=94=A8RAG?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E5=B9=B6=E6=B7=BB=E5=8A=A0=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在RAGService中添加_disabled标志,临时禁用所有RAG功能 - 添加详细的日志记录,便于调试和监控被跳过的操作 - 在TableRAGService中同样添加禁用机制,避免索引构建 refactor(file): 更新.gitignore忽略日志目录 - 添加**/logs/到.gitignore文件中 docs(plan): 添加比赛备赛规划文档 - 创建完整的比赛备赛规划文档,包含功能清单和待办事项 - 记录已完成功能和核心缺失模块,便于项目跟踪 chore(excel): 添加Q&A参考文件 - 添加Q&A.xlsx作为参考文档,包含比赛相关问题解答 --- .gitignore | 1 + Q&A.xlsx | Bin 0 -> 18694 bytes backend/app/services/rag_service.py | 24 +++ backend/app/services/table_rag_service.py | 37 ++-- 比赛备赛规划.md | 219 ++++++++++++++++++++++ 5 files changed, 267 insertions(+), 14 deletions(-) create mode 100644 Q&A.xlsx create mode 100644 比赛备赛规划.md diff --git a/.gitignore b/.gitignore index 4c224b9..1bc4e56 100644 --- a/.gitignore +++ b/.gitignore @@ -36,3 +36,4 @@ **/__pycache__/* **.pyc +**/logs/ diff --git a/Q&A.xlsx b/Q&A.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..f5e555730fd7e6e5e2cbe6efa1ee5ab140bb41a4 GIT binary patch literal 18694 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�eIza7FZo!FYqU=vx z_m*-iOB7PF-;aNa>hpoUd)g@%hym(Ron>I-={74~h1V`2oNqk?2oxCcFCzf>rDluE z^9h8B5dJ8S*P+0lzyBdZ7{h|-T%SM?)qBT^G^H)Ve0m6U2DP9P;(yn)-qhRw!||1%LpZMR)`_L-a!=vly3{7a2V3 zhR0%sfihC_?LE`w{psWbcW3K7iK!;K8RT@bEoYvN;~7Z#8my#^6Hw7)O~bC4!&UNf zr1T*v1r<91lU^q%v+`#F@XLcc?=b-*o9B!`JDDNvI|jTLT`9(D9gC%Qd9i4aD?3~M z7!LUKYW(TJA-j@*{0r9t?{x=((9vL;qRtNiekOoZ{{(1pW}9RI$Y6|k0GIqR{zvV+ zC##Iw2uTBkjQn=+wH@N+sO40kFTCN)qfoWt*|c&8Ipe1*%Ndb?(kQVO@I=UtzqFEE zYKOZvWJSg#`xN~23|}E@^`|SqN=P2_fmL>1q<@+lY;%0PE0*J3LiFNgizSLRhtnPX z@KyJDl~LKp`G$L^_#{4N>$-``1Q5VYoMR@mipG7TlFzCzRDRgElR(EH`X}*qGM|~12b2?jGbaz6we+5 za&Bd?zRAZ+m|kMyU3uat54;mCJ(R3nas*YxIV~Q640PV z)&)qI(H51-uz{L=4)We~K&?W4 z9rij#IlSEygz*hMEv^hndoNod7~yW?Be3Ur2v&SlhSG}~vMo;W+|g6(V0i6ur9sZE z7r~`qAfSoFQ?D(+=WjpkzaH;Hcm^|H@113^`vzm#Cg<;Qh+eqRxW3KM!Kl z|A*e?-fPERk8lLoCZs`FP%$4YzjfEq8I zgtT0CB`T_IgrrI+mN8E;FCkSbXC833W!RlewzQ?kAXUm>r;s z>=_fu2)SVHs*O(*-OtD7Yo8k!|FGw&wdM~d_SrjzpGr6QPhF6nrLL5XrIjtUuBDCs zAN!u4^3X5;D+dAqaEsA2^`$}T+W>okiE$LyF;(TKeBslq@7BV?aD^N)$0(7GF`KvS zC@Qb9JEeU{d$k!S8oE~6U1v5T5RJ!2huihu&W|!l%xM@K*2JAqDgYi41^I5$nWgXG z8hc5$pC5ptu8>s@yu%tpM_VCN+fW}u%j5h+{93-ac`UjmI4(l~Y4{zo5H4ah}b zmpg+E&AdIm+mj`B^g6WnUNO09cenrOQZF38pHly zYt0P^z3#TgZ3$R)7WtKuKS@HmO!i?tztR;DPIfNWg7=$@cv1AYr_GyGX` zJaBkQD)ZY>o9`IeX(>N2OVSMrK+UC-q2tIx!{tkw& z-gj_(cZh@*w%x}IREHOt%AkzDtRU^DdbeO7-cUqbcVIZLNKeX34h=e0Yx|NHAE(5O zEQ~5}A|GcFOhB1!+WccjLDK@XrW&Q=w=besbtPp}UyVhcdJZ>pscD|-=d?gBLVXUA zvn+kO(#1e73U#vM{cY(I{Hx)CJ--K`6&V=Y>hs3s^czE?y9?z!iJM~7>=uShZt9gO zbdd)7&DGiqW2}(rL`lLvc;Z-QUc7@#xG0+Tc$jiAW$xvfXKglC(H^o0u@I}F*TPkV zG<|)9xy*xIrL$|q8qWdll+L{1UKZJj%#Wz$l5Zi|b``i?Yt+1IR(Xc>uhe|BmZlK- zhFge%1!F@Rgm(60v46K!&I0PENkXRCt%CS*#Pq+ZDje|bF8ib2 z(DjqmpC@DdEvVYt+F6?aFRA}8r2zoaqDCZoXy61MgkF93+H?mK+Y=7ZLBP_6aB?d=NE zt`?lXBm`1pUQj$8QYCShqx15k$qpDmRrj~v{8=0rMYKeyU#kI2TlemD#zIErI$}sE z-WwOCI(h(CE_ehQi+JIe0`#($yoqW_8Vd%5xN0KXTd z{RJ?E`zOF(C2GH${$988m+2AVzf6CxV)-56_x$-Ugk1LD``{n5>E8kWGu`|P4gjE! z0|4N^B%i;V|7WW3cXJ``znT9#aroW(Kg06ht List[Dict[str, Any]]: """根据查询检索相关文档""" + if self._disabled: + logger.info(f"[RAG DISABLED] 检索操作已跳过: query={query}, top_k={top_k}") + return [] + if not self._initialized: self._init_vector_store() @@ -186,6 +204,9 @@ class RAGService: def get_vector_count(self) -> int: """获取向量总数""" + if self._disabled: + logger.info("[RAG DISABLED] get_vector_count 返回 0") + return 0 if self.index is None: return 0 return self.index.ntotal @@ -243,6 +264,9 @@ class RAGService: def clear(self): """清空所有索引""" + if self._disabled: + logger.info("[RAG DISABLED] clear 操作已跳过") + return self._init_vector_store() if self.index is not None: self.index.reset() diff --git a/backend/app/services/table_rag_service.py b/backend/app/services/table_rag_service.py index d3f5e68..d2a9dd0 100644 --- a/backend/app/services/table_rag_service.py +++ b/backend/app/services/table_rag_service.py @@ -30,6 +30,9 @@ class TableRAGService: self.llm = llm_service self.rag = rag_service self.excel_storage = excel_storage_service + # 临时禁用 RAG 索引构建 + self._disabled = True + logger.info("TableRAG 服务已禁用(_disabled=True),仅记录索引操作日志") def _extract_sheet_names_from_xml(self, file_path: str) -> List[str]: """ @@ -389,13 +392,16 @@ class TableRAGService: all_fields=all_fields_data ) - # 存入 RAG - self.rag.index_field( - table_name=table_name, - field_name=col, - field_description=description, - sample_values=[str(v) for v in sample_values[:5]] - ) + # 存入 RAG(如果未禁用) + if self._disabled: + logger.info(f"[RAG DISABLED] 字段索引已跳过: {table_name}.{col}") + else: + self.rag.index_field( + table_name=table_name, + field_name=col, + field_description=description, + sample_values=[str(v) for v in sample_values[:5]] + ) indexed_count += 1 results["indexed_fields"].append({ @@ -526,13 +532,16 @@ class TableRAGService: all_fields=all_fields_data ) - # 存入 RAG - self.rag.index_field( - table_name=table_name, - field_name=col, - field_description=description, - sample_values=[str(v) for v in col_values[:5]] - ) + # 存入 RAG(如果未禁用) + if self._disabled: + logger.info(f"[RAG DISABLED] 文档表格字段索引已跳过: {table_name}.{col}") + else: + self.rag.index_field( + table_name=table_name, + field_name=col, + field_description=description, + sample_values=[str(v) for v in col_values[:5]] + ) indexed_count += 1 results["indexed_fields"].append({ diff --git a/比赛备赛规划.md b/比赛备赛规划.md new file mode 100644 index 0000000..bcb48fd --- /dev/null +++ b/比赛备赛规划.md @@ -0,0 +1,219 @@ +# 比赛备赛规划文档 + +## 一、赛题核心理解 + +### 1.1 赛题名称 +**A23 - 基于大语言模型的文档理解与多源数据融合** +参赛院校:金陵科技学院 + +### 1.2 核心任务 +1. **文档解析**:解析 docx/md/xlsx/txt 四种格式的源数据文档 +2. **模板填写**:根据模板表格要求,从源文档中提取数据填写到 Word/Excel 模板 +3. **准确率与速度**:准确率优先,速度作为辅助评分因素 + +### 1.3 评分规则 +| 要素 | 说明 | +|------|------| +| 准确率 | 填写结果与样例表格对比的正确率 | +| 响应时间 | 从导入文档到得到结果的时间 ≤ 90s × 文档数量 | +| 评测方式 | 赛方提供空表格模板 + 样例表格(人工填写),系统自动填写后对比 | + +### 1.4 关键Q&A摘录 + +| 问题 | 解答要点 | +|------|----------| +| Q2: 模板与文档的关系 | 前2个表格只涉及1份文档;第3-4个涉及多份文档;第5个涉及大部分文档(从易到难) | +| Q5: 响应时间定义 | 从导入文档到最终得到结果的时间 ≤ 90s × 文档数量 | +| Q7: 需要读取哪些文件 | 每个模板只读取指定的数据文件,不需要读取全部 | +| Q10: 部署方式 | 不要求部署到服务器,本地部署即可 | +| Q14: 模板匹配 | 模板已指定数据文件,不需要算法匹配 | +| Q16: 数据库存储 | 可跳过,不强制要求 | +| Q20: 创新点 | 不用管,随意发挥 | +| Q21: 填写依据 | 按照测试表格模板给的提示词进行填写 | + +--- + +## 二、已完成功能清单 + +### 2.1 后端服务 (`backend/app/services/`) + +| 服务文件 | 功能状态 | 说明 | +|----------|----------|------| +| `file_service.py` | ✅ 已完成 | 文件上传、保存、类型识别 | +| `excel_storage_service.py` | ✅ 已完成 | Excel 存储到 MySQL,支持 XML 回退解析 | +| `table_rag_service.py` | ⚠️ 已禁用 | RAG 索引构建(当前禁用,仅记录日志) | +| `llm_service.py` | ✅ 已完成 | LLM 调用、流式输出、多模型支持 | +| `markdown_ai_service.py` | ✅ 已完成 | Markdown AI 分析、分章节提取、流式输出、图表生成 | +| `excel_ai_service.py` | ✅ 已完成 | Excel AI 分析 | +| `visualization_service.py` | ✅ 已完成 | 图表生成(matplotlib) | +| `rag_service.py` | ⚠️ 已禁用 | FAISS 向量检索(当前禁用) | +| `prompt_service.py` | ✅ 已完成 | Prompt 模板管理 | +| `text_analysis_service.py` | ✅ 已完成 | 文本分析 | +| `chart_generator_service.py` | ✅ 已完成 | 图表生成服务 | +| `template_fill_service.py` | ❌ 未完成 | 模板填写服务 | + +### 2.2 API 接口 (`backend/app/api/endpoints/`) + +| 接口文件 | 路由 | 功能状态 | +|----------|------|----------| +| `upload.py` | `/api/v1/upload/excel` | ✅ Excel 文件上传与解析 | +| `documents.py` | `/api/v1/documents/*` | ✅ 文档管理(列表、删除、搜索) | +| `ai_analyze.py` | `/api/v1/analyze/*` | ✅ AI 分析(Excel、Markdown、流式) | +| `rag.py` | `/api/v1/rag/*` | ⚠️ RAG 检索(当前返回空) | +| `tasks.py` | `/api/v1/tasks/*` | ✅ 异步任务状态查询 | +| `templates.py` | `/api/v1/templates/*` | ✅ 模板管理 | +| `visualization.py` | `/api/v1/visualization/*` | ✅ 可视化图表 | +| `health.py` | `/api/v1/health` | ✅ 健康检查 | + +### 2.3 前端页面 (`frontend/src/pages/`) + +| 页面文件 | 功能 | 状态 | +|----------|------|------| +| `Documents.tsx` | 主文档管理页面 | ✅ 已完成 | +| `ExcelParse.tsx` | Excel 解析页面 | ✅ 已完成 | + +### 2.4 文档解析能力 + +| 格式 | 解析状态 | 说明 | +|------|----------|------| +| Excel (.xlsx/.xls) | ✅ 已完成 | pandas + XML 回退解析 | +| Markdown (.md) | ✅ 已完成 | 正则 + AI 分章节 | +| Word (.docx) | ❌ 未完成 | 尚未实现 | +| Text (.txt) | ❌ 未完成 | 尚未实现 | + +--- + +## 三、待完成功能(核心缺块) + +### 3.1 模板填写模块(最优先) + +**这是比赛的核心评测功能,必须完成。** + +``` +用户上传模板表格(Word/Excel) + ↓ +解析模板,提取需要填写的字段和提示词 + ↓ +根据模板指定的源文档列表读取源数据 + ↓ +AI 根据字段提示词从源数据中提取信息 + ↓ +将提取的数据填入模板对应位置 + ↓ +返回填写完成的表格 +``` + +**需要实现**: +- [ ] `template_fill_service.py` - 模板填写核心服务 +- [ ] Word 模板解析 (`docx_parser.py` 需新建) +- [ ] Text 模板解析 (`txt_parser.py` 需新建) +- [ ] 模板字段识别与提示词提取 +- [ ] 多文档数据聚合与冲突处理 +- [ ] 结果导出为 Word/Excel + +### 3.2 Word 文档解析 + +**当前状态**:仅有框架,尚未实现具体解析逻辑 + +**需要实现**: +- [ ] `docx_parser.py` - Word 文档解析器 +- [ ] 提取段落文本 +- [ ] 提取表格内容 +- [ ] 提取关键信息(标题、列表等) + +### 3.3 Text 文档解析 + +**需要实现**: +- [ ] `txt_parser.py` - 文本文件解析器 +- [ ] 编码自动检测 +- [ ] 文本清洗 + +### 3.4 文档模板匹配(已有框架) + +根据 Q&A,模板已指定数据文件,不需要算法匹配。当前已有上传功能,需确认模板与数据文件的关联逻辑是否完善。 + +--- + +## 四、参赛材料准备 + +### 4.1 必交材料 + +| 材料 | 要求 | 当前状态 | 行动项 | +|------|------|----------|--------| +| 项目概要介绍 | PPT 格式 | ❌ 待制作 | 制作 PPT | +| 项目简介 PPT | - | ❌ 待制作 | 制作 PPT | +| 项目详细方案 | 文档 | ⚠️ 部分完成 | 完善文档 | +| 项目演示视频 | - | ❌ 待制作 | 录制演示视频 | +| 训练素材说明 | 来源说明 | ⚠️ 已有素材 | 整理素材文档 | +| 关键模块设计文档 | 概要设计 | ⚠️ 已有部分 | 完善文档 | +| 可运行 Demo | 核心代码 | ✅ 已完成 | 打包可运行版本 | + +### 4.2 Demo 提交要求 + +根据 Q&A: +- 可以只提交核心代码,不需要完整运行环境 +- 现场答辩可使用自带笔记本电脑 +- 需要提供部署和运行说明(README) + +--- + +## 五、测试验证计划 + +### 5.1 使用现有测试数据 + +``` +docs/test/ +├── 2023年文化和旅游发展统计公报.md +├── 2024年卫生健康事业发展统计公报.md +├── 第三次全国工业普查主要数据公报.md +``` + +### 5.2 模板填写测试流程 + +1. 准备一个 Word/Excel 模板表格 +2. 指定源数据文档 +3. 上传模板和文档 +4. 执行模板填写 +5. 检查填写结果准确率 +6. 记录响应时间 + +### 5.3 性能目标 + +| 指标 | 目标 | 当前状态 | +|------|------|----------| +| 信息提取准确率 | ≥80% | 需测试验证 | +| 单次响应时间 | ≤90s × 文档数 | 需测试验证 | + +--- + +## 六、工作计划(建议) + +### 第一优先级:模板填写核心功能 +- 完成 Word 文档解析 +- 完成模板填写服务 +- 端到端测试验证 + +### 第二优先级:Demo 打包与文档 +- 制作项目演示 PPT +- 录制演示视频 +- 完善 README 部署文档 + +### 第三优先级:测试优化 +- 使用真实测试数据进行准确率测试 +- 优化响应时间 +- 完善错误处理 + +--- + +## 七、注意事项 + +1. **创新点**:根据 Q&A,不必纠结创新点数量限制 +2. **数据库**:不强制要求数据库存储,可跳过 +3. **部署**:本地部署即可,不需要公网服务器 +4. **评测数据**:初赛仅使用目前提供的数据 +5. **RAG 功能**:当前已临时禁用,不影响核心评测功能 + +--- + +*文档版本: v1.0* +*最后更新: 2026-04-08* \ No newline at end of file