lacerate551
b966be5417
fix: 修正 RAG性能分析报告中的错误和遗漏
...
- INTENT_MAX_TOKENS 2048 不再标注为'浪费',推理模型思考链需 ~1000 token
- 删除 P2 建议'INTENT_MAX_TOKENS 降低 2048→512'(推理模型不可降)
- P0 优化建议标注 deepseek-v4-flash 额度已尽,需寻找替代轻量模型
- Rerank 配置补充云端 xop3qwen8breranker(讯飞云)信息
- §6.4 休眠模块:AgenticRAG 类已在 v4.0 删除,更新描述
- 阶段 7 补充两管线断裂问题:chart_contexts 降门槛、P0 安全网、答案后过滤鸡生蛋问题
- 阶段 9 补充推理模型 content 为空问题和 reasoning_content 回退机制
- 阶段 10 图片后过滤补充 _filter_images_by_answer 函数名
2026-06-22 13:08:14 +08:00
lacerate551
789610d01f
fix: INTENT_MAX_TOKENS 从 1024 提升至 2048,适配推理模型思考链预算
...
mimo-v2.5 推理模型思考链消耗 ~800-1000 tokens,原 1024 不够导致
content 为空、全部输出进入 reasoning_content,引发 JSON 数组格式
解析错误。2048 可确保思考链 + JSON 输出均有足够空间。
2026-06-21 23:30:31 +08:00
lacerate551
e761af6111
fix: 兼容 mimo-v2.5 返回 JSON 数组而非对象的格式
...
- intent_analyzer._parse_json: 解析结果为 list 时取第一个 dict 元素
- llm_utils.parse_json_from_response: 同样处理 list 返回值
- 修复日志错误: 'list' object has no attribute 'get'
2026-06-21 23:20:57 +08:00
lacerate551
8268071fdc
docs: 模型切换至 mimo-v2.5 + 文档全面更新
...
- config.py: INTENT_MODEL 从 deepseek-v4-flash 切换至 mimo-v2.5
- config.py: get_intent_client() 从百炼 API 切换至 mimo API
- RAG系统完整指南.md: v4.0→v4.1,新增图片检索子系统、P0安全网、
救援管线、五层缓存架构文档;替换所有旧模型名和API地址
- RAG数据流程.md: 完全重写,匹配实际代码逻辑
- curl测试手册.md: 更新模型名和Reranker配置
- MinerU模型部署指南.md: VLM_MODEL 更新为 mimo-v2.5
- 开发与系统模块说明.md: API地址和模型名更新
- 测试指南.md: API地址和模型名更新
2026-06-21 23:11:46 +08:00
lacerate551
4753a53487
fix(rag): 图片描述注入安全网与 chart_contexts 宽松阈值
...
问题:图片/图表切片的 CrossEncoder 评分系统性偏低(0.002-0.08 vs 文本 0.3-0.9),
导致 chart_contexts 被 min_score 过滤,图片描述无法进入 LLM context。
典型案例:雷达图查询(ci=73)rerank score=0.039 < min_score=0.05,
虽然 select_images 正确选中了雷达图,但描述未出现在 LLM context 中。
修复:
1. chart_contexts 使用宽松阈值 min_score*0.5(与 table 保护逻辑一致)
- 图片描述的 CE 分数天然偏低,不应与文本使用相同阈值
- 实际内容相关性由 select_images 独立评分保证
2. P0 安全网:在现有图片注入代码后检查 selected_images 完整性
- 若【相关图片信息】未生成,补注入所有选中图片描述
- 若已有但遗漏部分图片,追加遗漏的描述
3. images_selected 调试事件增加 chunk_id/actual_score/id/desc_preview
4. P0 完整性日志:DEV 模式下检查图片描述是否完整注入 context
2026-06-21 22:41:30 +08:00
lacerate551
63a769540a
fix(rag): 图片占位符正则扩展匹配 LLM 输出的 placeholder URL
...
LLM 有时输出  而非
,正则尾部增加 https?:// 匹配覆盖。
2026-06-21 00:44:00 +08:00
lacerate551
f0e5426b4d
fix(rag): 修复表格图片替换和跨页合并三个bug
...
1. chat_routes._replace_table_image_placeholders:
- 处理  LLM 格式(去掉多余!和假URL)
- 支持 [N张图片] 多张占位符(html_table_to_markdown 生成)
- 修复 !! 双感叹号导致 markdown 图片语法失效
2. manager._merge_cross_page_tables:
- 表头跳过逻辑改为对比第一行而非 find_all('th')
- 修复合并后表格中间出现重复表头行的问题
2026-06-21 00:40:12 +08:00
lacerate551
eb177e11e5
fix(rag): 替换答案中 [图片] 占位符为 markdown 图片语法
...
LLM 上下文中的表格包含 [图片] 占位符(MinerU 解析产物),LLM 原样
输出后前端 markdown-it 只渲染为纯文本。新增 _replace_table_image_placeholders
函数,在 finish 事件发送前按顺序将 [图片] 替换为 ,
前端可直接渲染为 <img> 标签。
2026-06-20 23:20:40 +08:00
lacerate551
5ba0d782e2
feat(rag): 子章节级图片过滤 + VLM 后台增强 + 意图分析优化
...
- 图片选择新增 section_path 字段,支持子章节级过滤
- _filter_images_by_answer 增加 primary_sections 参数和叶子节点匹配
- 检索发散检测:primary_leaf_names > 3 时全局阈值+1
- _FIGURE_ANSWER_KEYWORDS 移除单字"图""表",正则图号兜底防误触发
- lazy_enhance 后台增强流程优化
- 意图分析与 LLM 工具层改进
评测:图片选择 F1 从 52.4% 提升至 66.3%(+13.9pp),Precision +16.5pp
2026-06-20 19:26:40 +08:00
lacerate551
ee5295cc97
fix(parser): PDF/DOCX 切片层级结构修复与 MinerU V2 解析增强
...
核心修复:
- _post_process_chunks: 用 _buffer_has_body 标志替代 buffer.text_level=0,
标题+正文合并后保留 text_level 不置零,修复层级信息丢失
- heading_rules numeric_level2: 正则从 ^\d+\.\d+[\.、\s] 改为
^\d+\.\d+(?!\.\d),修复无空格标题如"2.1运行调度"无法匹配
- V2 title handler: heading_rules 优先(模式匹配可靠),VLM 仅兜底
(VLM 常给所有标题 level=1)
MinerU V2 解析增强:
- 两轮 TOC 过滤:多行目录块检测 + 孤立标题/单字符残留清理
- 封面 logo 过滤、重复标题去重
- chart VLM 描述和 Markdown 数据表提取
- ChromaDB metadata 新增 text_level/bbox/table_type/sub_type 字段
配置调整:
- CLUSTER_SECTION_PREFIX_LEVELS 1→2(两级 section 聚类更精确)
- MINERU_LOCAL_BACKEND 默认改为 pipeline
文档:
- RAG检索流程逻辑.md 更新 MinerUChunk 字段、ChromaDB metadata、
MinerU 解析策略等章节
- 新增 RAG引用跳转-优化计划.md、云端MinerU输出分析与优化方案.md
2026-06-19 23:56:13 +08:00
lacerate551
e205eda6a8
fix(config): 修复 MINERU_PREFER_ONLINE 逻辑反直觉 + 默认模型改为 vlm
...
- MINERU_PREFER_ONLINE: == "false" 恒 False → == "true" 正确启用在线 API
- MINERU_MODEL_VERSION: pipeline → vlm(高精度模式)
2026-06-19 15:29:12 +08:00
lacerate551
858ee40e5b
chore: 同步项目状态
...
- main.py: 去掉 emoji 避免 GBK 编码崩溃
- docs/curl测试手册.md: 更新模型名和测试日期
- docs/代码审查报告_2026-06-05.md: 删除过期报告
- docs/main分支独有功能说明.md: 新增
- docs/出题系统逻辑.md: 新增
2026-06-19 15:25:57 +08:00
lacerate551
95f3b99064
fix(rag): BM25 分歧救援 source 一致性校验 + 意图分析 max_tokens 修复
...
1. _rescue_bm25_divergence 情况 B 注入前校验 source 与 contexts 多数 source 一致,
防止跨文档注入无关切片(如 2.docx 吸烟场所切片混入 1.docx 投放查询)
2. INTENT_MAX_TOKENS 从 2048 提升至 4096,修复 mimo-v2.5 思维链截断导致意图分析偶发失败
评测 R2+ 结果:overall 4.35(基线 4.20),忠实度 +0.24,幻觉率不变
2026-06-19 14:39:16 +08:00
lacerate551
17ce177d1a
fix(engine): 修复 _score_source 在 Rerank 后的行为与自适应 TopK 分数计算
...
问题1: Rerank 后 _score_source 仍为 'rrf',导致自适应 TopK 被跳过
修复: rerank_results 中将 _score_source 更新为 'rerank'
问题2: 自适应 TopK 用 1.0 - dist 转换分数,但 Rerank 后 distances
是相关性分数(越大越好),转换后语义反转
修复: 根据 _score_source 区分分数来源,rerank 直接使用,向量距离才做转换
附带: BM25 top3 捕获时确保 meta 包含 _collection 字段
2026-06-17 20:10:50 +08:00
lacerate551
4fd53f48f9
chore: 死代码清理与标注
...
- 删除 chat_routes.py 中未被使用的 reciprocal_rank_fusion 函数(engine 有同功能方法平替)
- 删除 search_hybrid 中无效的 candidates 参数(未传递给 engine,实际由 RERANK_CANDIDATES 控制)
- 标注 RAG_SEARCH_CANDIDATES 为死代码
- 标注 VECTOR_WEIGHT/BM25_WEIGHT 在动态 RRF 启用时被覆盖
- 标注 llm_budget.py 模块当前未集成到主流程
- 标注 MAX_LLM_CALLS_PER_QUERY/MAX_QUERY_REWRITES 暂不生效
2026-06-17 20:04:49 +08:00
lacerate551
4afa30a946
docs(rag): 编写完整的 RAG 检索流程逻辑文档
...
覆盖从 MinerU 解析入库到 LLM 回答的全链路数据流:
- 文档解析与入库流程(MinerU → Chunk → ChromaDB + BM25)
- ChromaDB 存储字段详解(每个 metadata 字段的作用)
- BM25 索引两种实现的差异分析
- distances/scores 语义在各管线阶段的变化
- 检索管线完整数据流图
- 三重救援机制详解(BM25 分歧/词法匹配/章节聚类)
- 配置项完整列表(含死代码标注)
- 单/多知识库路径说明
2026-06-17 19:58:31 +08:00
lacerate551
8c92657490
fix(bm25): 修复 BM25 索引覆盖 bug + 综合评测集 v2 + 检索增强
...
核心修复:
- knowledge/base.py: BM25Index.add_documents 从覆盖改为追加+去重,
修复只有最后上传文件的 chunks 保留在 BM25 中的严重 bug
(影响: 2.docx/3.docx/PDF 的 755 个 chunk 在 BM25 中完全缺失)
检索增强 (延续上次会话):
- core/engine.py: section cluster boost + lexical match exemption
- api/chat_routes.py: lexical/cluster rescue 层 + SSE 事件
- core/mmr.py: MMR 去重改进
评测体系:
- tests/eval_dataset_v2.json: 62 题综合评测集 (9 种题型×4 文档)
- scripts/eval_e2e.py: 推理模型 LLM 评分兼容 + 新数据集格式支持
- scripts/validate_eval_dataset.py: 数据集验证工具
其他:
- parsers/mineru_parser.py: 解析器改进
2026-06-17 17:31:43 +08:00
lacerate551
edaef7ad60
chore: 元数据并发安全增强与重排序配置更新
...
- knowledge: 写操作方法增加元数据重载,manager 增加 fcntl 文件锁
- config/engine: 重排序默认后端切换为云端,新增云端配置项
2026-06-10 11:30:10 +08:00
lacerate551
b923e63bcd
fix(knowledge): list_collections 增加异常保护与元数据重载
...
1. 遍历集合时 try/except 捕获 ChromaDB 异常(NotFoundError/InternalError),
跳过失效集合并自动清理元数据,防止 /collections 500
2. 每次调用从磁盘重载 kb_metadata.json,确保多 worker 进程间状态一致,
修复 GUNICORN_WORKERS>1 时返回数量波动问题
2026-06-09 13:32:51 +08:00
lacerate551
db887d2215
chore: 配置集中化、LLM 参数调整与 gitignore 更新
...
- config.example: 新增 MINERU_PREFER_V2、标题规则引擎、表单二次校正等配置项
- document_routes: DEV_MODE 判断统一收归 config.py
- llm_utils: quick_yes_no max_tokens 10→128,避免截断过短回答
- knowledge/router: 路由 LLM 调用 max_tokens 100→512
- feedback: 反馈分析 LLM 调用 max_tokens 200→512
- .gitignore: 新增 scripts/ 和 plans/ 目录忽略规则
🤖 Generated with [Qoder][https://qoder.com ]
2026-06-08 15:45:12 +08:00
lacerate551
3c262b8d35
fix(auth): 登录速率限制与用户会话隔离增强
...
- auth_routes: 新增内存级登录速率限制(5min/10次),防止暴力破解
- auth_routes: 统一 DEV_MODE 判断收归 config.py 集中管理
- auth_routes: update_user 增加用户存在性校验
- gateway: require_role 装饰器恢复实际角色校验(原为占位实现)
- session_routes: get_user_sessions 统一传入 limit=20 参数
- session: get_history SQL 增加 id DESC 排序,修复同秒消息顺序错乱
🤖 Generated with [Qoder][https://qoder.com ]
2026-06-08 15:44:37 +08:00
lacerate551
8adb550931
feat(rag): 数据驱动的检索优化与表格/图片处理增强
...
- 移除硬编码关键词列表,改为数据驱动的图片意图检测
- 新增 _section_similarity() 层级章节相似度函数,替代正则匹配
- 新增 _rescue_table_chunks() 表格救援机制,基于 _in_budget_context 标记
- 修复 _build_context_with_budget 表格组超预算不 break 的问题
- 新增 _filter_images_by_answer() 后置图片过滤
- 表格切片 rerank 分数保护策略(同 section 表格不被误删)
- 跨页表格合并逻辑改进(通用标题检测 + 页码不可用降级策略)
- 意图分析增强追问补全 + 缓存类型隔离
- 语义缓存 key 加入 collections 防止跨上下文误命中
- 使用 retrieval_query 替代原始 message 进行检索
- engine.py: CloudReranker 模型更新 + 移除 top_n + table 邻居扩展
- LLM prompt 增加表格处理规则和章节路径提示
🤖 Generated with [Qoder][https://qoder.com ]
2026-06-08 15:44:22 +08:00
lacerate551
9c1593a5e4
feat(parser): 新增标题识别规则引擎
...
- 新增 parsers/heading_rules.py,支持可配置的标题层级检测规则
- 支持短中文文本标题识别的独立开关控制
🤖 Generated with [Qoder][https://qoder.com ]
2026-06-08 15:43:58 +08:00
lacerate551
83884b383b
refactor(parser): 重构 MinerU 文档解析器
...
- 重写 MinerU 解析模块,改进文档解析流程和结构化输出
- 优化表格识别、标题层级提取和多格式文档处理
- 支持 v2 格式偏好(MINERU_PREFER_V2)
🤖 Generated with [Qoder][https://qoder.com ]
2026-06-08 15:43:38 +08:00
lacerate551
183a57e7f1
refactor(api): 统一响应格式迁移 + 异步任务系统 + 状态码体系完善
...
- 将全部路由文件(12个)的 jsonify 响应迁移至 success_response/error_response 统一格式
- 修复 sync_routes.py error_response 参数错误(P0)
- 新增异步任务系统:task_registry + task_routes
- 新增状态码:TASK_NOT_FOUND(4014)、TASK_CONFLICT(4015)、REINDEX_ERROR(5040)
- 修正 task_routes/exam_pkg 中语义不匹配的状态码
- 更新 curl 测试手册、后端对接规范文档
- 添加缓存性能报告和 Redis 迁移计划
2026-06-05 22:56:00 +08:00
lacerate551
54a6815ad4
docs: 重写 RAG 系统指南并重命名(移除 AgenticRAG 内容)
...
- 全面重写文档,反映统一编排路径和四层缓存架构
- 添加 Query Cache 修复说明和语义缓存集成文档
- 重命名 Agentic_RAG完整指南.md → RAG系统完整指南.md
- 同步更新开发与系统模块说明.md 中的引用链接
2026-06-05 21:34:56 +08:00
lacerate551
505f79860e
perf(cache): 修复缓存失效 Bug + 集成语义缓存 + 删除 AgenticRAG 死代码
...
- fix: Query Cache GET/SET Key 不匹配导致命中率始终为 0%
- fix: CACHE_MIN_SCORE 阈值 0.3 对 ChromaDB cosine distance 过于严格
- feat: 在 /rag 端点集成语义缓存(命中时跳过检索+生成,92x 加速)
- refactor: 删除 AgenticRAG 死代码路径(10 个 agentic_*.py,约 1950 行)
- cleanup: 移除 engine.py 死方法、路由死函数、初始化死代码
2026-06-05 21:20:53 +08:00
lacerate551
6deba8fae2
docs: 添加代码审查报告 2026-06-05
2026-06-05 15:26:38 +08:00
lacerate551
90b915232a
fix(security): 代码审查安全加固 — 三批次修复(6H/13M/12L)
...
第一批(快速修复):
- H6: main.py --debug 默认值 True→False,防止 Werkzeug RCE
- M2+M3: /search 增加 validate_query + top_k 范围限制(1-50)
- M4: context_count 范围限制(0-10) + 异常捕获
- L3: assert → raise RuntimeError(生产环境 API Key 检查)
- H1: SSE 错误事件移除 traceback 字段
第二批(安全加固):
- H2+H3: 文档接口路径遍历 realpath 校验 + 文件类型/大小限制
- H4+H5: 批量上传文件大小检查
- M6: LIKE 查询通配符转义
- M1: 37 处 str(e) 异常信息统一脱敏(6 文件)
- M5: CORS 生产环境限制来源
- M7: SESSION_MANAGER None 保护(503)
- M11: subprocess 参数注入防护(白名单 + -- 分隔符)
第三批(架构改进):
- M8+M9: 提取 JSON 解析共享工具(extract_json_object/list)
- M10: Prompt 注入检测防御(prompt_guard.py)
- M12: 解析器文件大小限制(Excel 50MB/TXT 20MB/PDF 100MB)
- M13: 全局单例竞态条件双重检查锁定(engine/bm25/intent_analyzer)
2026-06-05 15:26:32 +08:00
lacerate551
a7206377cc
fix(exam): 批阅端点增加 answers 类型校验,非数组返回 400 而非 500
2026-06-05 14:17:01 +08:00
lacerate551
6f863ddfd7
docs(exam): 出题批卷接口变更说明及文档同步
...
- 新增《出题批阅接口变更说明(2026-06-05)》面向后端的迁移指南
- 同步更新 curl测试手册 和 后端对接规范 中的出题批卷章节
2026-06-05 14:06:17 +08:00
lacerate551
3f1980ba78
feat(exam): 出题批卷 API 增强 — 格式统一、校验、跨调用去重
...
- grader: 多策略 JSON 提取 + 3 次重试 + prompt 优化,修复 LLM 输出不稳定问题
- grader: question_content → content 统一字段名,与出题接口一致
- api: 新增入参校验(题型枚举、difficulty、总题数上限 20、grade question_type)
- api/generator/manager: 新增 exclude_stems 参数,支持跨调用去重
2026-06-05 14:06:11 +08:00
lacerate551
b6631c626b
fix(exam): 修复出题批卷 API 契约一致性问题
...
P0:
- 修复 V2 降级路径响应格式,fallback 输出经过 enrich + dedup + balance
- 补充主观题 format example,要求 LLM 生成 scoring_points 评分标准
P1:
- 补充多选题、判断题 format example,明确 answer 为列表格式
- 统一批卷响应格式,所有题型增加 grading_status 字段
- 出题数量不足时返回 requested_types/actual_types/warnings
- 修复 _call_llm 未配置时抛异常而非静默返回 0 分
P2:
- API 层增加 question_types 和 difficulty 入参校验
- 修复 generate_questions_from_content 方法名和参数类型 bug
2026-06-05 12:06:49 +08:00
lacerate551
42434781f7
chore(deploy): docker-compose 添加源码挂载和 env_file 配置
...
- 挂载源码目录到容器,支持 git pull + restart 热更新代码
- 添加 env_file 引用项目根目录 .env,解决环境变量缺失问题
- 添加 data/ 目录挂载(SQLite 数据库)
2026-06-05 11:31:44 +08:00
lacerate551
d67a8ff50b
docs(fix): 修正引用跳转文档错误及修复 fix_image_paths 脚本
...
- 修正 preview 接口路径(去掉多余的 /api 前缀)
- 修正响应示例中 chunk id 格式(文件名_序号,非 UUID)
- 补充 preview 响应中 status、version 字段
- 明确前端引用匹配方式为 chunk_id 查找而非数组下标
- fix_image_paths.py 改为遍历知识库子目录,避免生成空 chroma.sqlite3
2026-06-05 11:24:44 +08:00
lacerate551
cb75b9b274
fix(boundary): 修复多库边界问题、版本管理及删除清理
...
多库检索与存储修复:
- RRF 融合去重改用 (collection, chunk_id) 复合键,修复同名文件结果被吞
- DocStore 存储路径加 collection 前缀,修复跨库同名切片数据覆盖
- search_multiple 去重改用复合键
- chunk_id 解析改用 rsplit 兼容下划线文件名
上传与版本管理修复:
- 同名文件上传改为覆盖模式,自动清理旧切片
- 修复首次上传不创建版本记录
- 修复覆盖上传版本号回退到 v1
- sync ADDED 分支改用动态版本号生成
- _generate_version_id 改为基于全部版本递增
- 废止/恢复操作同步 SQLite 版本记录
- mark_document_as_superseded 改为仅更新 SQLite
删除清理修复:
- 删除文档时同步清理 SQLite 版本记录和变更日志
- 删除向量库时同步清理该库所有版本记录
- cleanup 改为清理 SQLite 记录而非 ChromaDB
测试:
- test_version_management.py: 27 条版本管理单元测试
- test_edge_cases.py: 28 条边界用例测试
- test_upload_dedup.py: 5 条上传去重测试
- e2e_risk_test.py: 27 条端到端风险测试
文档:
- 新增风险边界问题修复注意事项.md(面向后端的对接文档)
- 新增向量库边界风险分析.md
- 更新多篇现有文档
2026-06-04 23:58:44 +08:00
lacerate551
a1a0814633
docs(readme): 更新 README 至 v7.0.0,反映云端 Reranker、Docker 部署、性能优化等当前状态
2026-06-04 17:45:56 +08:00
lacerate551
100d1a06eb
init: RAG 知识库服务初始提交
...
- 后端 API(Flask + Gunicorn)
- RAG 引擎(混合检索 + 云端 Reranker + 引用溯源)
- 文档解析(MinerU + 多格式支持)
- Docker 生产部署配置
- 排除前端项目、敏感配置、模型文件
2026-06-04 17:35:27 +08:00