fix(knowledge): 修复 #9 —— 知识库文档全链路七处失败(上传/解析/向量化/删除/图谱) - #13
Conversation
- Python gRPC 改为监听容器网络地址,生产镜像安装文档解析依赖并修复 PDF 延迟读取生命周期 - Embedding 按 10 条分批保序调用,Milvus 缺失 collection 删除幂等且首次写入自动初始化 - 图谱抽取按小批次处理,JSON 截断时缩批重试并合并去重节点、关系与来源 chunk - 图谱重建在 Neo4j 单事务中替换旧图,失败时保留原图;前端请求超时调整为 5 分钟 - 持久化并展示文档处理错误摘要,修复 vis-network 画布容器与 Vue loading 遮罩冲突
- 将 Nginx、Go 与前端知识库上传上限统一为 10 MiB,并同步提示文案 - 增加前后端上传大小边界回归测试,超限文件在浏览器侧直接拦截 - 异步解析、gRPC 与分块失败时持久化真实错误摘要 - 失败状态更新改用独立短时 context,避免处理超时后文档停留在 processing
Verdict: approve / mergeable — worth fixing item 1 (observability / misleading response); item 2 is a good follow-up concurrency optimization. |
- 仅对既有结构体做字段与 tag 对齐,无语义变化(git diff -w 为空)
- 补建响应的节点/关系计数改为跨文档合并去重后实际写入 Neo4j 的数量,不再逐文档累加虚报 - 新增 graph_replaced 字段:存在失败文档或合并结果为空时跳过替换并保留旧图、计数归零,不再把未写入伪装成成功 - 前端 RebuildGraphResult 同步新增字段,成功文案按是否实际替换分支展示,「新增」改为「写入」 - collection 初始化改为 sync.Map 双检缓存:已初始化时免全局锁与 HasCollection RPC,首次建表仍全局串行防重复建表 - 新增回归测试:跨文档去重计数、失败/空图跳过替换、缓存命中零 RPC、并发仅一次建表
概要
Fixes #9。一份 9.81 MB / 26 页 PDF 走完 上传 → 处理 → 删除 → 图谱生成 全链路暴露的七处问题逐一修复,另带两处前端可靠性修复(两个提交:f70fbcc 链路可靠性主体、989182f 上传限制统一与失败原因):
client_max_body_size 10m、Go 侧maxKnowledgeFileSize、前端MAX_KNOWLEDGE_FILE_SIZE(原 50MB),超限文件在浏览器侧即被过滤并提示,不再打到后端。127.0.0.1:50051改监听0.0.0.0,容器网络可达(原 Python 容器健康但不可访问)。uv sync补装--extra document解析依赖(ARM64 无预编译 wheel 时临时引入 build-essential、装完即清);PDFParser 将文件路径直接交给pypdf.PdfReader,由 pypdf 管理延迟读取的文件生命周期,不再因with块提前 close 报错。HasCollection预检,缺失按幂等语义直接成功,真实查询/删除错误仍返回给调用方重试。finish_reason=length或 JSON 解析失败时对半缩批重试(直至单块),各批按归一化名称合并去重节点/关系并合并来源 chunk,记录 token 用量与截断日志;整库重建改用新增的ReplaceGraph——Neo4j 单事务内"删旧图 + 写新图",失败保留原图不再清空;前端重建请求超时单独设为 5 分钟(全局默认不变)。knowledges.error_message列(迁移 000004,含 up/down);异步解析、gRPC、分块乃至 panic 失败均持久化真实错误摘要(Python 侧parse_document也不再硬编码success: true);失败状态改用独立 10s context 更新,处理超时后文档不再永远停留在 processing;列表/详情/状态接口透出,前端在状态标签下展示。insertBefore(null)崩溃。测试
document_processor_graph_test.go5 个)、collection 自动初始化与幂等删除(vector_projection_test.go5 个)、10 MiB 边界校验与失败原因保留透传(knowledge_base_handler_test.go2 个)。rebuildGraph5 分钟超时不影响全局配置、默认上传上限 10 MiB,改动相关 13 例通过。test_document.py覆盖解析结果 success/error 如实透传与 PDF 路径解析生命周期,6 passed / 1 skipped。go test -short ./internal/handler/ ./internal/service/knowledge/、npx vitest run(相关 spec)、uv run pytest tests/test_document.py均通过。变更注意
000004_add_knowledge_error_message(up/down),部署时需执行。client_max_body_size与 Python 生产镜像依赖安装变化(--extra document),需重新构建镜像。