User
2fbf1b85f9
docs: 更新出题批题后端对接指南 v1.2 — 同步实际行为
...
- 移除20题上限说明,改为无上限+50题警告
- 修正文件/向量库不存在时的响应格式(total=0,非404)
- 添加认证模式说明(生产模式直接放行)
- 添加智能出题接口文档(/exam/generate-smart)
- 添加填空题student_answer格式校验说明
- 更新错误码表,移除不存在的FILE_NOT_FOUND
- 添加Q5/Q6常见问题
- 响应示例修正status_code为2020
2026-07-03 12:40:47 +08:00
User
c709360c7c
feat(server-release): 出题批阅业务逻辑优化 — 移除20题限制、max_total支持、填空题格式校验、修正认证状态码
...
- exam_pkg/api.py: 移除总题数20道上限,改为50道警告;修正认证错误使用正确的UNAUTHORIZED/FORBIDDEN状态码;端点保持同步模式
- exam_pkg/generator.py: AI智能出题prompt支持max_total参数
- exam_pkg/grader.py: 填空题增加学生答案格式校验(列表类型+字符串元素)
2026-07-03 12:03:46 +08:00
lacerate551
4a262728b1
fix(exam_pkg): 判断题返回bool + 填空题扁平数组归一化
...
grader.py:
- 判断题批阅结果 student_answer/correct_answer 统一返回 true/false (bool)
兼容 "对"/"错"/"true"/"false"/True/False/1/0 等所有输入格式
- 填空题新增 _normalize_fill_blank_answer 兜底归一化
修复 LLM 生成扁平数组 ["ans1","ans2"] 导致 1空多选项误判满分的bug
- feedback 文本统一用小写 true/false
generator.py:
- validate_questions_schema 出题时修正扁平数组为二维格式
从源头防止填空题答案格式错误
2026-06-30 10:28:49 +08:00
lacerate551
dd213df0e2
fix(exam_pkg): v2补题去重与final已有题干交叉去重
...
补题阶段仅和exclude_stems去重,未检查final中已有题干,
可能补出重复题目。修复:收集final题干+exclude_stems合并传入
_deduplicate_questions,多题型补题时逐轮累积排除列表。
2026-06-22 19:07:08 +08:00
lacerate551
5ccfdaf9d1
feat(exam_pkg): 优化出题系统稳定性与推理模型适配
...
- core/llm_utils: MiMo模型自动注入thinking=disabled参数,全局生效
- config: 新增LLM_DISABLE_THINKING配置项(默认true)
- generator: 推理模型自适应max_tokens(1.5x)、429限流重试+指数退避、v2管线补题机制
- generator: analyze_document_for_exam新增max_total参数控制AI出题上限
- generator: validate_questions_schema兼容type和question_type字段
- grader: 主观题max_tokens从1000提升至2000、fuzzy_match增加编辑距离容错
- manager: results变量初始化防NameError、透传max_total参数
- api: /exam/generate-smart支持max_total请求参数
2026-06-22 18:52:04 +08:00
lacerate551
d589c27bce
docs: 清理过时文档 + 更新关键文档
...
删除(10个):
- API与后端对接规范.md(已被后端对接规范.md 替代)
- image_processing_flow.md(已合入 RAG数据流程.md)
- 状态码功能更新说明.md(已合入后端对接规范.md)
- 题目模板.md(字段名与实际 API 不一致,以对接指南为准)
- 出题批卷系统设计.md(旧版出题设计,已被对接指南+变更说明替代)
- 测试指南.md(出题 API 格式过时,模型名过时)
- 企业文档更新管理方案.md(设计方案,已实施完成)
- 版本管理实施完成报告.md(里程碑报告,已完成归档)
- 生产路径优化计划.md(行号已偏移,阶段状态过时)
更新(7个):
- 出题批题后端对接指南.md:添加 generate-smart 端点、question_content→content
- 开发与系统模块说明.md:更新 reranker 和 LLM 模型名称
- 多源信息融合指南.md:标注生产路径 vs 备用路径
- 架构与部署方案.md:更新数据归属对照表(4个 SQLite DB)
- 认证与权限配置指南.md:出题 API 更新为 /exam/generate
- 向量库边界风险分析.md:标注 P1 旧切片残留和 P2 文件更新已修复
- 风险边界问题修复注意事项.md:标注所有场景已修复
2026-06-21 20:53:33 +08:00
lacerate551
b2ccec79b9
chore: gitignore 补充临时脚本和日志规则,防止未来积累
2026-06-21 20:28:47 +08:00
lacerate551
53e48cccb2
chore: 删除过时的代码审查报告(2026-06-05,高危问题已修复)
2026-06-21 20:25:33 +08:00
lacerate551
475900e103
docs: RAG数据流程新增缓存/图片/VLM/切片/性能章节 + 待解决风险项
...
- RAG数据流程.md: 更新模型配置为 deepseek-v4-flash,补充 v7.1 变更
- 新增十二~十六章节:缓存系统、图片选择管线、VLM 懒加载、
文档解析与切片、性能插桩
- 待解决风险项.md: 记录 7 个已识别但未实施的风险项
2026-06-21 20:25:25 +08:00
lacerate551
6d5a4b5b5e
feat: 性能插桩、缓存清除端点、LLM top_p 与 JSON 强制输出
...
- chat_routes.py: 新增 8 阶段性能计时(stages_ms)+ SSE 输出
- sync_routes.py: 新增 POST /cache/clear 缓存清除端点
- engine.py: LLM 调用增加 top_p 参数
- intent_analyzer.py: response_format 加配置开关(INTENT_RESPONSE_FORMAT)
2026-06-21 20:25:12 +08:00
lacerate551
c6a17ad1e4
fix: search_hybrid 改用改写后的 retrieval_query + 清理 engine.py 死代码
...
关键修复:
- chat_routes.py: search_hybrid(message,...) → search_hybrid(retrieval_query,...)
修复无状态模式下追问场景("那工作流程呢?")用原始模糊文本做向量检索的问题,
现在使用意图分析改写后的完整查询("货源投放的具体工作流程是什么?")
死代码清理 (Claude Code review 反馈):
- engine.py: 移除 4 处未使用的 doc_ids 变量和 2 处过时注释
2026-06-21 16:20:34 +08:00
lacerate551
0f339a0998
fix: 缓存系统全面加固 — 版本失效 + 死代码清理 + 防御性改进
...
基于缓存审查报告 + Claude Code 交叉审查的反馈:
P0+ 语义缓存版本失效:
- sync.py: 文档变更后清空语义缓存,防止返回过时的 images/sources
- document_routes.py: 删除文档时同步清理缓存
- kb_routes.py: 删除向量库时同步清理缓存
P1.5 cache_type 包含式校验:
- intent_analyzer.py: != "rag_answer" 改为 == "intent_analysis"
P2+ Rerank Cache 版本失效:
- cache.py: increment_kb_version 时同时清空 rerank_cache
P1+P6 死代码清理:
- agentic.py: 移除未使用的 SemanticCache 实例和相关导入
- agentic_base.py: 移除未使用的语义缓存配置导入
- cache.py: 移除 _compute_doc_hash 和未使用的 doc_ids 参数
- engine.py: 移除 set_query_result 调用中的 doc_ids 参数
P7 缓存质量门槛:
- config.py: CACHE_MIN_SCORE 从 0.0 改为 0.3
2026-06-21 16:08:58 +08:00
lacerate551
21470ed28c
fix: 语义缓存误命中修复 — 二次 Jaccard 验证 + query-only embedding
...
问题: 同会话中语义相近但不同的问题(如"总体要求"vs"工作流程和规范要求")
会错误命中缓存,返回上一个问题的答案。
修复:
- intent_analyzer: 缓存 embedding 改用 query-only(不含历史),避免上下文污染
- intent_analyzer + chat_routes: 缓存读取增加字符级 Jaccard 二次验证(阈值0.5)
- 缓存写入存储 _raw_query 供二次验证比对
- 兼容旧缓存条目(无 _raw_query 时放行)
2026-06-21 15:37:37 +08:00
lacerate551
258be54df7
sync(server-release): 从 main 同步逻辑改动(不含 API 格式变更)
...
同步内容:
- knowledge/manager.py: VLM max_tokens 512→2048 + reasoning_content fallback
- services/feedback.py: FAQ max_tokens 200→512
- services/session.py: 消息排序增加 id DESC 次级排序
- knowledge/image_cleanup.py: 新增图片/VLM缓存孤儿文件清理模块
- knowledge/collection.py: 集合删除时清理孤儿文件 + list_collections 磁盘扫描策略
- knowledge/document.py: 文档删除时清理孤儿文件
- api/chat_routes.py: 新增 _rescue_bm25_divergence 函数(BM25-CE分歧救援)
- core/intent_analyzer.py: 使用 get_intent_client 专用客户端 + 移除短追问缓存跳过逻辑
- cleanup_orphans.py: 独立孤儿文件清理脚本
2026-06-21 14:49:46 +08:00
lacerate551
d6d27b70f3
fix(server-release): P1.5 表格图片评分修复 + MAX_IMAGES 动态调整
...
- 修复 P1.5 使用原始检索分数(0-1)对比 MIN_SCORE(2-5)导致表格图片永远无法返回的 bug
- 改为使用 score_image_relevance() 计算表格图片相关性分数
- 添加 s=None 初始化,使 P1.5 可独立计算分数
- 添加 MAX_IMAGES 动态调整,支持表格多图场景(上限15)
2026-06-21 14:32:34 +08:00
lacerate551
184511f4ec
fix(server-release): 从 main 同步表格图片修复
...
纯逻辑同步,不涉及 API 格式变更:
1. chat_routes.py:
- 新增 _replace_table_image_placeholders(): 将答案中 [图片]
和 [N张图片] 占位符替换为  markdown 图片语法
- _filter_images_by_answer: 补充 [图片]/![ 图片意图检测
- import re 提升到模块级
2. manager.py:
- 跨页表格 HTML 合并修复: BS 解析后追加 <tr> 行(原来直接
拼接两个 <table> 导致第二表行被 html_table_to_markdown 丢弃)
- 表头跳过逻辑改为对比第一行
- 新增 text_level/bbox/table_type/table_nest_level/sub_type 元数据
2026-06-21 00:54:19 +08:00
lacerate551
b5bcb3c941
fix: detect table-embedded images as figure intent in post-filter
2026-06-20 22:57:43 +08:00
lacerate551
5bc86a7c1f
fix: skip semantic cache for short follow-up queries to avoid false hits
...
Short follow-ups like "B3类呢?" are too context-dependent for embedding
similarity matching. Only exact-match cache is used when history exists
and query is under 20 chars.
2026-06-20 22:35:29 +08:00
lacerate551
8f72ac5da4
feat: sync core logic from main (cache fix, intent analyzer, engine improvements)
...
- core/cache.py: fix GET/SET key mismatch, use coarse-grained kb_version keys
- core/intent_analyzer.py: add cache_type tagging, enhance history parsing
- core/engine.py: adaptive topk score source fix, BM25 top-3 preservation, section cluster boost
2026-06-20 22:23:27 +08:00
lacerate551
3a3627f73c
fix(server-release): 修复 select_images P1.5 表格关联图片 UnboundLocalError
...
P1.5 处理表格 images_json 时引用了 P1 块内的变量 s,
但两者在独立的 if 分支中,s 未定义导致 UnboundLocalError。
改用 ctx.get("score", 0) 获取当前切片分数。
2026-06-20 22:10:33 +08:00
lacerate551
2c84cb8a5f
feat(server-release): 从 main 同步切片层级结构修复与解析增强
...
- parsers/mineru_parser.py: MinerU V2 解析增强 + 切片层级结构修复
- parsers/heading_rules.py: 标题识别规则引擎增强
- knowledge/manager.py: 跨页表格合并与切片后处理优化
切片数从旧版 819 降至 437(与本地 VLM 解析的 448 接近)
2026-06-20 22:00:57 +08:00
lacerate551
8d60616124
fix(server-release): 修复 MinerU 本地解析两处语法错误
...
1. 移除 cmd 数组中多余的 "--" 参数,导致 -p/--path 无法识别
2. finally 块中 "清理临时目录" 缺少 # 注释符,触发 NameError
2026-06-20 21:33:13 +08:00
lacerate551
8f75c51c59
feat(server-release): 从 main 同步子章节级图片过滤 + VLM/LLM 推理模型兼容
...
- chat_routes: 子章节级图片过滤(section_path 传递、叶子节点匹配、发散检测)
- chat_routes: _FIGURE_ANSWER_KEYWORDS 移除单字"图""表",正则图号兜底
- lazy_enhance: defer_chromadb 参数避免后台线程 SQLite 写锁竞争
- lazy_enhance: 缓存内容校验(>=5字)和空结果保护
- llm_utils: reasoning_content 兜底(剥离 <think> 标签)+ 流式 reasoning 支持
- intent_analyzer: SYSTEM_PROMPT 增加追问补全逻辑
- manager: VLM 描述/摘要 max_tokens 提升至 2048 + Windows fcntl 兼容
不改变端口、API 接口和响应数据字段。
2026-06-20 20:27:01 +08:00
lacerate551
87f3fae1aa
feat(server-release): 从 main 迁移检索增强(章节聚类提升 + BM25 追加修复)
...
从 main 分支选择性提取检索质量增强代码,不含端口/API 配置变更:
- knowledge/base.py: BM25Index.add_documents 改为追加+去重模式,
修复多文件上传后仅保留最后文件切片的覆盖 bug
- core/engine.py: 章节聚类提升(_section_cluster_boost)、词法匹配
辅助种子资格(_chunk_lexical_score)、扩展参数优化
(CONTEXT_EXPANSION_AFTER 5→8, MAX_EXPANDED_NEIGHBORS 4→8)
- api/chat_routes.py: 路由层词法匹配救援(_rescue_lexical_match)、
章节聚类救援安全网(_rescue_section_cluster)
部署后需重建 BM25 索引:KnowledgeBaseManager().rebuild_bm25_index('public_kb')
2026-06-17 17:49:36 +08:00
lacerate551
fc11b11dda
fix(server-release): 修复 MMR Jaccard 去重使用 jieba 词级分词替代字符级集合
...
旧实现 set(text) 对中文文本按单字拆分,导致不同文档间字符集合高度
重叠(共享 "的""是""在" 等常用字),去重过于激进,大量相关文档被误杀。
新实现:
- 使用 jieba 分词提取 2 字及以上实词
- 词级 Jaccard 相似度区分度大幅提升
- 预分词优化:对所有候选文档一次性分词,避免重复调用
- 内容窗口从 200 字符扩大到 500 字符
性能对比(同一问题):
- MMR_USE_EMBEDDING=True: 57s,回答 3707 字
- 旧 Jaccard(字符级): 10s,回答 56 字(几乎无内容)
- 新 Jaccard(词级): 22s,回答 1594 字(含表格、引用、图片)
2026-06-12 12:15:12 +08:00
lacerate551
99f5cf519e
feat(server-release): 从 main 迁移 RAG 检索质量增强
...
- 新增 5 个辅助函数:_strip_semantic_prefix(语义前缀清理)、
_process_table_doc(表格文档处理)、_section_similarity(章节相似度)、
_rescue_table_chunks(表格救援)、_filter_images_by_answer(图片后置过滤)
- 替换 _order_text_contexts_for_prompt(添加表格保护逻辑:passing_sections + table_floor)
- 替换 _build_context_with_budget(集成 _process_table_doc + section headers)
- rag() 函数添加 5 个调用点:语义缓存检查/写入、strip_semantic_prefix、
rescue_table_chunks、filter_images_by_answer
- 新增 retrieval_query 变量(使用改写后的查询替代原始 message)
- 不涉及任何 API 端点变更
2026-06-10 13:54:38 +08:00
lacerate551
15c0aec9a6
fix(engine): 补充缺失的 import re,修复 generate_answer_stream 的 NameError
2026-06-10 12:34:49 +08:00
lacerate551
8c7a6eb3fa
fix(config): config.example.py 补充 RERANK 云服务配置项
...
补充 RERANK_BACKEND/CLOUD_MODEL/CLOUD_API_KEY/CLOUD_BASE_URL/
CLOUD_TIMEOUT 五个配置项,防止新部署时 engine.py 初始化失败。
2026-06-10 12:23:05 +08:00
lacerate551
fda1b2f049
feat: 从 main 分支迁移解析器与检索优化(不影响 API 接口)
...
- 新增 heading_rules.py 标题规则引擎,替换硬编码正则链
- 重写 mineru_parser.py:v2 格式兼容、表单自动检测
- manager.py: 跨页表格合并规则收紧(防误合并)+ LLM token 上限提升
- engine.py: embedding 缓存 + 同 section 表格邻居扩展 + prompt 改进
- router.py: 路由分类 token 上限提升至 512
2026-06-10 12:10:22 +08:00
lacerate551
148559ee3c
fix(knowledge): 全量修复多 worker 元数据竞态问题
...
1. collection.py: create/delete/update/exists 方法开头加 _load_metadata()
2. list_collections: 去掉磁盘扫描自动补充和 stale 清理逻辑,
改为以元数据为唯一真相源,异常集合只跳过不删不改
3. manager.py: _load/_save_metadata 加 fcntl 文件锁防并发写覆盖,
Windows 兼容(fcntl try/import 包裹)
2026-06-10 11:17:57 +08:00
lacerate551
431af0217a
fix(knowledge): list_collections 每次从磁盘重载元数据,修复多 worker 返回数量不一致
...
GUNICORN_WORKERS=2 时各 worker 进程的 self._metadata 独立,
一个 worker 清理失效条目后保存 kb_metadata.json,另一个 worker
内存仍是旧版本,导致 /collections 返回数量波动(3 或 5)。
在 list_collections() 开头调用 _load_metadata() 重新加载,
保证每次请求基于最新的磁盘状态。
2026-06-09 13:29:49 +08:00
lacerate551
aa04bb94a6
chore(deploy): 添加 .dockerignore 排除大体积数据目录,加速镜像构建
...
排除 models/、vector_store/、documents/、.data/ 等数据目录,
这些通过 volume 挂载,不需要打进镜像。
2026-06-09 12:07:43 +08:00
lacerate551
84a8be0ce8
fix(knowledge): list_collections 增加异常保护,防止 ChromaDB 数据丢失导致 /collections 500
...
遍历 kb_metadata.json 时对每个集合的 get_collection/count 操作包裹
try/except,捕获 NotFoundError/InternalError 等异常后跳过并记录警告,
循环结束后自动清理失效的元数据条目。
2026-06-09 11:43:34 +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