上手 · 三步之内看到真返回

拿到凭据 → 粘一段能跑的 → 看到真返回。三步之后,再讲接下去会撞上的几件事。

业务接口都在 /api/v1/ 下| 认证两条:Authorization: Bearer(登录拿的 JWT)或 X-API-Key(管理员发的 key)| 这一页只讲怎么用 —— ⛔ 它自己不发请求

① 拿到凭据

⚠️ 在本站,页头那块写着「已登录」就说明你已经有一把了 —— 它是登录进来时拿到的,不用做任何事。下面这张表讲的是 你要在自己代码里怎么拿。

两条路 —— 看你要哪一种:

走哪条怎么拿拿到的是
登录
(人用 · 本站页头那条)
POST /api/v1/auth/login
给 user_name + password;到期用 POST /api/v1/auth/refresh 换
JWT(access_token)⇒ 走 Authorization: Bearer 你的令牌
⚠️ access_token 只活 15 分钟,refresh_token 活 30 天
管理员建号
(程序用 · 长期 key)
POST /api/v1/admin/create_user
🔴 要管理员,非管理员回 403
一把 api_key ⇒ 走 X-API-Key: 你的 key
⚠️ 明文只在响应里出现这一次 —— 库里只存 sha256

⚠️ 两条不是一回事,别混:/auth/login 发的是 JWT ⇒ 走 Authorization: Bearer;/admin/create_user 回的是一把 api_key ⇒ 走 X-API-Key。 🔴 后端两条都收(同一个依赖)—— ⛔ 但别把 JWT 塞进 X-API-Key、 ⛔ 也别拿 api_key 当 Bearer 用。也 ⛔ 不要在任何地方回显请求头。

② 粘一段能跑的

最小的一次调用(内部线那条;尖括号里换成你自己的):

# 问一句只有本库答得出的问题curl -X POST "<你的主机>/api/v1/rag/search?mode=accurate_norerank" \  -H "X-API-Key: <你的凭据>" \  -H "Content-Type: application/json" \  -d '{"question":"在保设备上门收不收工时费","citations":true,"generate_answer":true}'

⚠️ mode 走 query 参数,一共四档:

mode走哪几段注意
accurate_norerank改写 + 向量 + BM25 + RRF默认档 —— 不依赖重排模型
fast向量 + BM25 + RRF不做改写,最快
accurate在默认档上再加 Cross-Encoder 重排🔴 要本机装重排模型
full再叠加查询扩展,覆盖最全🔴 同上

🔴 在本 demo 这个部署上,accurate 与 full 会回 500 —— 它的镜像有意不装重排依赖(那会连带拉进 torch,550 MB 上下)。⛔ 不是你调错了。 要用那两档,得自己部署、把重排依赖装上。 ⚠️ 传一个表外的值会当场得到 422,⛔ 不会被静默兜成默认档。

③ 看到真返回

返回的顶层就这几个键 —— 这段是真契约(顺着后端代码核过),⛔ 不是示意:

键是什么
query你问的那句话(原样带回)
docs检索到的每一条:id · content · source · 相关度 rrf_score · from
sources答案里的引用(只有成文时才有内容):index(就是答案里那个 [来源 n] 的 n)· source · 相似度 similarity
answer成文的答案 —— ⚠️ 只在 generate_answer=true 时才有,否则是 null
timing各阶段的真耗时(毫秒)—— ⚠️ total_ms 不含生成那一段
pipeline这次实际跑了哪几段
mode这次实际用的那一档
requested_by检索的范围 = 这个用户名下的库(⛔ 看不到别人的)

字段名、结构、每一栏什么意思,在 总览那一页逐字段标着。 这里只说一句:它每次都是真返回,⛔ 不是画出来的样例。

第一个坑:两个默认值是关的

参数默认不给会怎样
generate_answerfalse只回检索结果,没有答案
citationsfalse答案里没有引用 —— 也就没有"点回原文"

要引用,两个都得显式打开(像上面那段 curl 那样)。

第二个坑:流式与非流式不同源

/rag/search 走的是改写 + 向量 + BM25 + RRF 那条完整链; /rag/stream_search 是另一条更轻的链。 ⇒ 同一个问题,两边结果可能不一样 —— 这是现状,⛔ 不是 bug。

第三个坑:状态码与重试

码什么时候你该做什么
401没给凭据 / 凭据失效重新拿
422参数不合法(例如 mode 拼错)改参数 —— ⛔ 它不会静默兜底
429被限速,或额度用尽🔴 看 Retry-After,⛔ 别硬重试

业务错误是一个固定的三件套: {"error": <给人看的一句话>, "code": <给机器读的码>, "status_code": <数字>} —— 给人看的与给机器读的是分开的:⛔ 别去解析 error,认 code。 被限流 / 配额用尽那两条还会多给一个 retry_after。

🔴 但 422 不走这个体 —— 参数校验失败回的是框架自己的 {"detail":[...]},里面每条含 loc / msg / type。 ⇒ 按状态码分流,⛔ 别假定错误体只有一种形状。

给 agent 的入口(llms.txt / MCP 发现) 现状:还没有 · 点开 ▾

对照行业惯例(2026 年文档站的常规做法是给 llms.txt、MCP 发现入口、以及"每页加 .md 后缀")—— 🔴 本仓现在这三样都还没有做。这一格只如实说现状,⛔ 不是承诺。