本文引用的文件
本文档面向调用方和运维人员,系统化说明知识库管理接口与嵌入调试接口的行为、参数、响应、错误语义和排查方法。重点覆盖:
知识库接口位于后端 ai-server 模块的 com.zsjz.ai.module.knowledge.controller 包;嵌入调试接口位于 com.zsjz.ai.module.embedding.controller 包。前端 Electron 应用通过 ai-electron/frontend/src/ai/api/knowledgeApi.ts 封装知识库 API,包括登录态传递、文件下载处理等细节。
graph TB
Client["调用方或前端"] --> Gateway["Sa-Token 鉴权<br/>x-token 头"]
Gateway --> KB_Ctrl["KnowledgeBaseController"]
Gateway --> Emb_Ctrl["EmbeddingDebugController"]
KB_Ctrl --> KB_Service["KnowledgeBaseService"]
KB_Ctrl --> Doc_Service["KnowledgeDocService"]
Doc_Service --> Parser["文档解析器"]
Doc_Service --> Indexer["知识索引器"]
Doc_Service --> Storage["本地文件存储"]
Emb_Ctrl --> Emb_Service["EmbeddingService"]
Emb_Service --> Model["本地 ONNX 模型"]
图示来源
章节来源
| 组件 | 职责 | 关键行为 |
|---|---|---|
| KnowledgeBaseController | 暴露知识库 REST 接口 | 列表、新建、编辑、删除知识库;文档列表、上传、删除、重试、下载 |
| KnowledgeBaseService | 知识库生命周期与归属校验 | 内置库只读;自建库可编辑删除;级联清理文档、向量、方案绑定 |
| KnowledgeDocService | 文档上传、解析、审计下载、删除、重试索引 | Tika 提取全文;异步向量化;PENDING/INDEXING/READY/FAILED 状态机 |
| EmbeddingDebugController | 嵌入调试入口 | 批量文本生成向量,返回维度、耗时、向量数组、两两余弦相似度矩阵 |
| knowledgeApi.ts | 前端知识库 API 封装 | 携带 x-token 下载文件、multipart 上传、统一错误提示 |
章节来源
知识库流程分为两层:
向量层:文档解析后由索引器切分并写入向量数据库;RAG 检索消费 READY 文档对应的向量。
flowchart TD
Upload["上传文档"] --> Validate["校验类型、大小、数量上限"]
Validate --> SaveFile["保存原件到本地存储"]
SaveFile --> Extract["Tika 提取全文到 sidecar"]
Extract --> Register["登记文档行"]
Register --> Status{"提取成功?"}
Status -->|是| Pending["索引状态设为 PENDING"]
Status -->|否| Failed["索引状态设为 FAILED"]
Pending --> Publish["发布索引事件"]
Publish --> Vectorize["异步切分并向量化入库"]
Vectorize --> Ready["索引状态变为 READY"]
Failed --> Retry["重试索引后可重新抽取并入库"]
图示来源
/knowledge-basesx-token 获取当前用户 ID。GET/knowledge-bases章节来源
POST/knowledge-basesname:必填,长度不超过 100。description:可选,长度不超过 500。章节来源
PUT/knowledge-bases/{id}id:知识库主键。章节来源
DELETE/knowledge-bases/{id}id:知识库主键。章节来源
GET/knowledge-bases/{id}/docsid:知识库主键。章节来源
POST/knowledge-bases/{id}/docsid:知识库主键。multipart/form-data,字段名 fileindexStatus。章节来源
DELETE/knowledge-bases/{id}/docs/{docId}id:知识库主键。docId:文档主键。章节来源
POST/knowledge-bases/{id}/docs/{docId}/reindexid:知识库主键。docId:文档主键。章节来源
GET/knowledge-bases/{id}/docs/{docId}/downloadid:知识库主键。docId:文档主键。x-token 的请求下载,否则会被视为未登录。章节来源
POST/embedding/debugtexts:字符串数组,必填,最多 16 条。行为:
返回向量维度、耗时、向量数组、相似度矩阵。
sequenceDiagram
participant Caller as "调用方"
participant Ctrl as "EmbeddingDebugController"
participant Service as "EmbeddingService"
Caller->>Ctrl: POST /embedding/debug
Ctrl->>Service: 批量嵌入 texts
Service-->>Ctrl: 向量数组
Ctrl->>Ctrl: 计算两两余弦相似度
Ctrl-->>Caller: 维度、耗时、向量、相似度矩阵
图示来源
章节来源
知识库不是直接参与 RAG 检索的唯一通道,而是 RAG 的上游数据来源之一。其关系如下:
文档层隔离不影响 RAG 全量检索:“我的上传文档”只对上传者开放,但 RAG 检索绑定知识库时会扫描该知识库下的全部文档向量,而不是只扫描上传者本人上传的部分。
flowchart LR
KB["知识库文档"] --> Parse["文档解析"]
Parse --> Chunk["文本切分"]
Chunk --> Vector["向量嵌入"]
Vector --> Store["向量数据库"]
Query["Agent RAG 查询"] --> QVector["查询向量"]
QVector --> Search["相似度检索"]
Search --> Store
Store --> Context["召回上下文"]
Context --> LLM["大模型生成回答"]
图示来源
章节来源
以下示例以 curl 形式展示常见调用方式。实际使用时需替换 {host}、{kb_id}、{doc_id}、{token} 等占位符。
curl -H "x-token: {token}" \
http://{host}/knowledge-bases
curl -X POST -H "Content-Type: application/json" \
-H "x-token: {token}" \
-d '{"name":"测试知识库","description":"用于验证知识库接口"}' \
http://{host}/knowledge-bases
curl -X PUT -H "Content-Type: application/json" \
-H "x-token: {token}" \
-d '{"name":"更新后的知识库","description":"描述已更新"}' \
http://{host}/knowledge-bases/{kb_id}
curl -X DELETE -H "x-token: {token}" \
http://{host}/knowledge-bases/{kb_id}
curl -H "x-token: {token}" \
http://{host}/knowledge-bases/{kb_id}/docs
curl -X POST -H "x-token: {token}" \
-F "file=@/path/to/document.pdf" \
http://{host}/knowledge-bases/{kb_id}/docs
curl -X DELETE -H "x-token: {token}" \
http://{host}/knowledge-bases/{kb_id}/docs/{doc_id}
curl -X POST -H "x-token: {token}" \
http://{host}/knowledge-bases/{kb_id}/docs/{doc_id}/reindex
curl -H "x-token: {token}" \
-o downloaded_file.pdf \
http://{host}/knowledge-bases/{kb_id}/docs/{doc_id}/download
curl -X POST -H "Content-Type: application/json" \
-H "x-token: {token}" \
-d '{
"texts": [
"今天天气很好",
"明天可能下雨",
"北京今天的温度很高"
]
}' \
http://{host}/embedding/debug
现象
FAILED。可能原因
排查步骤
FAILED。章节来源
现象
PENDING 或 INDEXING。FAILED,失败原因与嵌入服务相关。可能原因
排查步骤
indexStatus 与 failReason。dimension 是否符合预期。章节来源
现象
READY。可能原因
READY,但向量质量差,语义表达弱。排查步骤
READY。章节来源
现象
可能原因
x-token。<a href> 直链而非带鉴权的 fetch。排查步骤
x-token。章节来源
现象
可能原因
排查步骤
userId 是否与当前登录用户一致。章节来源
系统采用双层隔离:
| 层级 | 控制点 | 规则 |
|---|---|---|
| 知识库层 | KnowledgeBaseService.requireVisible、requireOwned |
内置库全局可见;自建库仅创建者可见;内置库不可编辑删除 |
| 文档层 | KnowledgeDocService.requireOwnedDoc |
文档列表、下载、删除、重试仅上传者本人可操作 |
| 上传权限 | KnowledgeBaseService.requireUploadable |
自建库=库主人;内置库=平台管理员 |
| 向量检索 | RAG 侧消费知识库向量 | 不按上传者过滤,按绑定知识库的全量向量检索 |
classDiagram
class KnowledgeBase {
+Long id
+Long userId
+Integer isBuiltin
+String name
+String description
+boolean isBuiltin()
}
class KnowledgeDoc {
+Long id
+Long kbId
+Long userId
+String fileName
+String filePath
+String sidecarPath
+String indexStatus
+String failReason
+Integer chunkCount
+Integer downloadCount
}
class KnowledgeBaseService {
+list(userId)
+create(userId, dto)
+update(userId, id, dto)
+delete(userId, id)
+requireVisible(userId, kbId)
+requireUploadable(userId, kb)
}
class KnowledgeDocService {
+listMine(userId, kbId)
+upload(userId, kbId, file)
+download(userId, docId)
+delete(userId, docId)
+reindex(userId, docId)
-requireOwnedDoc(userId, docId)
}
KnowledgeBaseService --> KnowledgeBase : "读写"
KnowledgeDocService --> KnowledgeDoc : "读写"
KnowledgeDocService --> KnowledgeBaseService : "校验知识库"
图示来源
知识库接口提供完整的文档生命周期管理能力,并通过内置库与自建库、知识库层与文档层的权限模型,兼顾共享性与隐私性。嵌入调试接口则专注于本地 ONNX 模型的质量验证,帮助快速定位向量维度、归一化、语义区分度等问题。在实际使用中,应重点关注文档索引状态、失败原因、嵌入调试结果和 RAG 检索阈值,形成从上传、向量化到检索的完整排查闭环。