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 0000000..f5e5557 Binary files /dev/null and b/Q&A.xlsx differ diff --git a/backend/app/services/rag_service.py b/backend/app/services/rag_service.py index 2264b11..3855180 100644 --- a/backend/app/services/rag_service.py +++ b/backend/app/services/rag_service.py @@ -36,9 +36,15 @@ class RAGService: self._dimension: int = 0 self._initialized = False self._persist_dir = settings.FAISS_INDEX_DIR + # 临时禁用 RAG API 调用,仅记录日志 + self._disabled = True + logger.info("RAG 服务已禁用(_disabled=True),仅记录索引操作日志") def _init_embeddings(self): """初始化嵌入模型""" + if self._disabled: + logger.debug("RAG 已禁用,跳过嵌入模型初始化") + return if self.embedding_model is None: # 使用轻量级本地模型,避免网络问题 model_name = 'all-MiniLM-L6-v2' @@ -90,6 +96,10 @@ class RAGService: sample_values: Optional[List[str]] = None ): """将字段信息索引到向量数据库""" + if self._disabled: + logger.info(f"[RAG DISABLED] 字段索引操作已跳过: {table_name}.{field_name}") + return + if not self._initialized: self._init_vector_store() @@ -117,6 +127,10 @@ class RAGService: metadata: Optional[Dict[str, Any]] = None ): """将文档内容索引到向量数据库""" + if self._disabled: + logger.info(f"[RAG DISABLED] 文档索引操作已跳过: {doc_id}") + return + if not self._initialized: self._init_vector_store() @@ -154,6 +168,10 @@ class RAGService: def retrieve(self, query: str, top_k: int = 5) -> 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