知识库(RAG)
给喵喵一套你自己的资料:把文档传进知识库,之后调 /v1/agent 对话时,平台自动检索相关片段注入上下文——喵喵基于你的资料回答,并在流里告诉你引用了哪几段。
概念(30 秒)
- 文档:你上传的一篇资料(标题 + 正文,纯文本 / Markdown 均可);
- 分块:入库时正文被按标题 / 段落切成 ~600 字的块(相邻块重叠 ~100 字,避免边界句子查不全),每块各自向量化;
- 检索注入:对话时用你的提问在本租户的块里查 top-5、相似度 ≥0.45 的片段,拼成「知识库参考」注入本轮系统提示;
- 租户硬隔离:向量按租户 namespace 隔离 + 文本行级租户约束,你的资料绝不会被别的租户检索到(平台级保证,无需配置)。
上传文档
控制台「知识库」区粘贴即可;程序化走 API(Bearer key):
bash
curl -X POST "$BASE/v1/kb/docs" \
-H "Authorization: Bearer $KEY" \
-H "Content-Type: application/json" \
-d '{"title": "产品手册", "text": "……正文,可以很长……"}'成功 201:
json
{ "id": "…", "title": "产品手册", "char_count": 5230, "chunk_count": 11,
"created_at": "2026-06-12T13:00:00.000Z",
"note": "已入库;向量索引异步生效(约数秒),稍候可检索" }新文档生效约数秒:向量索引是异步构建的——
201表示已入库,但刚传完立刻提问可能还查不到。等几秒再问(或用/v1/kb/search轮询到命中)即可。
管理端点(双面同形,控制台把 /v1 换成 /console 并用登录会话):
| 动作 | 端点 |
|---|---|
| 列文档 | GET /v1/kb/docs |
| 上传 | POST /v1/kb/docs {title, text} |
| 删除 | DELETE /v1/kb/docs/:id |
| 检索测试 | POST /v1/kb/search {q} → top-5 块 + 分数 |
检索注入行为(对话时发生什么)
调 /v1/agent 时:
- 本租户没有任何文档 → 完全零开销零变化(不嵌入、不检索,行为与没有本特性时一致);
- 有文档 → 你的提问被嵌入,在本租户的块里查 top-5;相似度 ≥0.45 的片段(总长 ≤2000 字)以「知识库参考」块注入本轮系统提示,每段带
〔标题#块号〕来源标注; - 注入只影响当轮,不写进会话历史——下一轮按下一轮的提问重新检索;
- 不想用时请求体带
"kb": false(仅本轮关闭); - 降级不崩:检索 / 嵌入任何环节抖动,平台直接跳过注入照常对话——知识库是增益,绝不挡你的主流程。
SSE 事件 kb_refs
命中注入时,流里会在一切 llm_* 事件之前多一帧 kb_refs(没命中就没有这帧):
code
event: kb_refs
data: {"type":"kb_refs","refs":[{"doc_id":"…","title":"产品手册","seq":3,"score":0.71}]}refs即本轮注入的片段清单(按相似度降序),拿来做「引用来源」UI 正合适;- 这是 additive 新事件:老客户端按「未知 type 忽略」处理即可,既有事件(
llm_delta/llm_end/ …)一个没动。完整事件契约见 Agent API。
删除语义
DELETE /v1/kb/docs/:id 同步删除文本与发起向量删除;删除后该文档立刻不再被检索 / 注入(文本行已删,即便残留向量短暂存在也查不出内容)。删除不可恢复。
配额(公测)
| 项 | 上限 | 超限响应 |
|---|---|---|
| 单篇正文 | 100KB | 413「文档过大(单篇上限 100KB)」 |
| 每租户文档数 | 50 篇 | 403「文档数已达上限(每租户 50 篇)」 |
| 标题 | 200 字 | 400「标题过长」 |
实践建议
- 标题写得像答案的来源:检索结果以
〔标题#块号〕标注,清晰的标题让喵喵引用得更自然; - 用 Markdown 标题(
#)组织长文——分块器按标题感知切块,章节不会被搅在一起; - 资料更新 = 删旧传新(没有「编辑」语义,块与向量都是不可变的);
- 想知道某个问题会引用什么,先用控制台「检索测试」或
/v1/kb/search看 top-5 与分数(测试端点不设 0.45 阈值,分数全亮出来)。