想把 DeepSeek 和自建知识库塞进一套能断网跑的服务,翻了一圈教程发现全在讲原理,没人说超时设多少、检索挂了怎么退回、日志记哪几个字段。这篇按工程顺序给一份落地清单,从服务拆分到上线前自检,每一步都能照着做。
想把 DeepSeek 和自建知识库塞进一套能断网跑的服务,翻一圈教程发现全在讲原理,没人说超时设多少、检索挂了怎么退回、日志记哪几个字段。这篇按工程顺序给一份落地清单,从服务拆分到上线前自检,每一步都能照着做。
先说清楚适用范围:这套做法适合单机或小集群自部署、团队五到二十人、知识库以内部文档为主的场景。如果追求高并发在线服务、或者语料每天大量增量更新,下面的单机拆分思路会不够用,得直接上分布式检索和独立推理集群。
先把服务拆成三块,别一锅炖
最常见的翻车是接口、检索、生成全挤在一个进程里。检索层一卡,整个服务就假死,重启一次所有请求全断。拆成三块之后,任一层出问题只换那一层,其他部分照常跑。
| 层 | 只负责什么 | 挂掉的后果 |
|---|---|---|
| 接口层 | 收请求、鉴权、转发 | 前端拿到明确报错,不转圈 |
| 检索层 | 向量库、切片的召回与重排 | 走兜底路径,退关键词检索 |
| 生成层 | 调模型、拼 prompt | 返回缓存或明确失败文案 |
- 先画请求路径从用户点击到答案返回,把每一跳标注清楚,标出哪些跳可能超时、哪些跳能缓存。画完再动手拆服务,避免拆完发现某一层其实没必要独立。
- 确认内存分配把向量库、嵌入模型、主应用三者的常驻内存估算出来,和机器实际可用内存对一遍,留出三成余量再上线。
- 跑一次断网演练拔掉外网,看服务哪些环节报错、报错文案是否可读,把这次记录当成兜底路径的验收标准。
检索链路的配置项:切片、召回数、拼装顺序
检索质量基本由这几个参数决定,别直接抄别人的数字,得拿自己的语料跑一遍看召回。上线前要把它们固化进配置文件,改一次就重跑一次评测。
超时、重试与降级:本地部署最容易翻车的地方
本地部署最容易忽略的是超时。只设一个全局超时,结果就是检索慢的时候把生成也一起掐了,用户看到的是一条莫名其妙的超时报错。
| 超时类型 | 怎么设 | 不适用的情况 |
|---|---|---|
| 连接超时 | 短一点,快速失败换节点 | 内网稳定、几乎不抖动的环境可以放宽 |
| 检索超时 | 按数据量给,大库留够时间 | 走缓存命中时可以临时缩短 |
| 生成超时 | 最长,但不能无限 | 流式输出应按首个 token 和整体两段分别计 |
- 分开设三类超时连接、检索、生成各自独立,别共用一个值;设完用 /tools/speed-test 量一次本机到各服务的延迟基线,超时值从基线往上推。
- 重试只对幂等请求开加指数退避;生成到一半断流不要自动重跑整条链,先返回已生成的部分再让用户决定;参数分档参考 /guides/api-timeout-tuning。
- 设兜底路径向量库连不上退关键词检索,模型调不通返回缓存答案或明确报错文案,别让前端一直转圈。
- 并发按上游额度压本地机器并发不等于模型服务能接住的并发;限流与排队的取舍看 /guides/429-concurrency-backoff。
日志与评测:让它出问题时能复盘
本地私有化场景没法依赖云端可观测性,日志得自己管。每次请求至少记几个固定字段,出问题才追得下去;再配一份离线日志,断网时照样写本地文件。
下一步检查站内中转站可信度与实时报价,把部署要用的接口来源先对一遍,避免上线后才发现上游不稳定。→常见问题
本地部署是不是就不用管并发和限流了?
不是。本地只解决了网络和隐私,模型服务的并发上限依然存在,检索层也会因为数据量变大而变慢。并发数要按你自己那台机器实测的吞吐来定,超过就排队,别指望本地就没瓶颈。
检索效果不好,先调切片还是先换嵌入模型?
先看命中的原文有没有被检索出来。召回里根本没有正确段落,那是切片或嵌入模型的问题;召回了但答案没用好,那是拼装顺序或重排的问题。分不清这两步就调参数,基本是白忙。
模型换版本之后整条链要重跑什么?
至少要重跑三样:检索评测集看命中率有没有掉、生成评测看答案格式是否还稳定、以及超时和重试参数是否还合适。换版本前先去 /models 核对当时的模型资料和调用口径,别只看版本号就切。