POST /rag/query 接口接收设备运维问题后,返回至少包含 answer 的有依据答案。 前面三篇分别解决了 RAG 是什么、文档怎么切、片段怎么找,今天把这些焊成一个可调用的服务。开发者只需发送 POST 请求,系统内部完成检索和生成,输出带来源的回答。返回内容除了正文,还会提供引用文档以供验证。整个流程针对专业领域设计,避免无根据的回复。

POST /rag/query 接口把三环节焊成服务

RAG 系统此前被拆成三个独立环节。第一篇解释了 RAG 通过检索外部知识来弥补大模型知识截止和幻觉问题,第二篇讨论了如何把设备手册、运维记录等文档合理切成片段,第三篇介绍了如何用向量相似度找到最相关的片段。现在需要把这三者焊接成一个端到端服务。

接口的核心是 POST /rag/query。调用方只需要准备 JSON 格式的 query 字段,填入具体问题,比如“离心泵轴承温度过高怎么办”。服务端收到请求后,先把问题转成向量,然后在向量库里检索,再把检索结果和原始问题一起喂给生成模型,最后组装出结构化响应。

这种焊接方式让开发者不再关心中间细节。以前可能需要手动调用 Embedding 服务、查询向量数据库、再调用 LLM,现在全部封装在一个 HTTP 接口里。信号明确指出这个接口的目标是“问一句设备运维问题,返回有依据的答案”,因此服务内部必须保证每一步都有日志或链路追踪,以便排查检索质量或生成偏差。

接口还承担了参数验证和限流职责。运维场景下问题可能包含专业术语,接口需要对输入进行简单清洗,同时限制单用户请求频率,防止向量检索阶段被高并发打垮。整个服务把之前三篇文章的成果变成了一个可直接部署的模块,降低了专业领域落地的门槛。

目前这个接口主要面向内部或企业级调用,暂时没有开放公网大规模使用。它的价值在于把零散的技术点变成了产品化的能力,开发者调用一次就能得到可验证的答案,而不是模型凭空编造的内容。

设备运维问题输入后检索生成同步完成

当一个设备运维问题进入接口后,整个处理是同步进行的。系统首先对问题做 Embedding,得到一个和文档片段相同维度的向量。接着向量库执行相似度搜索,取出 Top-K 个最相关的文档片段。这些片段通常来自设备手册、历史故障记录或标准操作规程。

检索完成后,系统把原始问题、检索到的片段以及系统预设的 Prompt 拼接成完整的 Prompt,发给大模型。大模型根据提供的上下文生成答案,同时被要求在回答中引用具体来源。整个流程在一次 HTTP 请求内完成,用户等待时间取决于 Embedding 速度、向量检索延迟和模型推理时间。

信号强调这个接口专门用来回答设备运维问题,这类问题特点是高度专业、需要严格依据。纯 LLM 经常会把“轴承温度过高”描述成各种可能原因,却无法说明具体设备型号对应的处理步骤。RAG 通过强制检索真实文档,迫使模型只能基于提供的片段作答,从而大幅降低幻觉概率。

同步完成也意味着对延迟有较高要求。运维场景往往需要秒级响应,因此接口内部会设置超时机制。如果向量检索或模型生成超过预设时间,就返回错误或降级答案。目前还不清楚实际生产环境中这个接口的平均响应时间,但理论上向量检索通常在几十毫秒,生成部分占大头。

这个流程把检索和生成两个阶段紧密结合,确保答案不是凭空生成,而是有明确的文档支撑。用户收到答案的同时,也能看到支撑该答案的原始段落,方便人工复核。

向量库与 Embedding 实现语义检索核心

向量库和 Embedding 是整个 RAG 链路里负责“找”的核心组件。Embedding 模型把文本(无论是问题还是文档片段)映射到高维向量空间,让语义相近的内容在向量空间里距离更近。设备运维文档里“泵振动异常”和“离心泵异常振动”这两个表述虽然字面不同,但 Embedding 能识别出它们含义接近。

常见的选择是中文优化过的 Embedding 模型,比如基于 BGE 或 text-embedding-ada-002 的中文微调版本。文档在离线阶段已经被切好并存入向量库,通常使用 Milvus、Weaviate 或 Elasticsearch 的向量插件。向量库支持 ANN(近似最近邻)搜索,能在百万级片段中快速找到 Top10 或 Top20 的候选结果。

信号中提到要把之前“怎么切、怎么找”的内容焊接起来,因此向量库的索引构建必须和文档切分策略匹配。如果切得太碎,单个向量包含信息不足;切得太长,向量又难以精确匹配具体问题。实际搭建时需要反复测试 Embedding 模型在运维专业词汇上的表现,比如“PLC”、“变频器”、“联锁保护”等术语是否被正确编码。

向量检索返回的结果还只是候选集,准确率受 Embedding 模型质量、索引参数和文档质量共同影响。中文场景下,专业术语多、缩写多,Embedding 模型如果没有针对领域微调,容易把无关的电气和机械文档混在一起。因此很多团队会在通用 Embedding 基础上,用自己的运维文档做继续预训练或微调。

这个组件是 RAG 区别于纯 LLM 的关键。没有向量检索,就无法把外部最新或专有知识注入生成过程,也就无法解决专业领域问答的幻觉问题。

重排序优化返回答案的准确度

向量检索得到的结果往往数量较多且质量参差不齐。重排序(Reranker)模块的作用是在这一步对候选片段进行二次打分,把真正最相关的片段排到最前面。

重排序通常使用交叉编码器(Cross-Encoder)模型,它把查询和每个候选片段拼接在一起,输出一个 0-1 之间的相关性分数。与双塔 Embedding 不同,Cross-Encoder 能捕捉更精细的交互信息,但计算量更大,因此一般只对向量检索返回的 Top 30-50 个结果进行重排序。

在设备运维场景中,重排序特别重要。因为很多文档片段都包含“温度”、“压力”、“报警”等通用词,向量相似度容易误召回。重排序模型经过特定领域数据训练后,能更好地区分“轴承温度高”和“电机温度高”对应的不同处理措施,把最匹配的段落提升到列表前列。

信号描述的全链路中,重排序是检索和生成之间的关键过滤步骤。它直接影响最终 Prompt 中上下文的质量。如果排在前面的片段不相关,模型生成的答案就会偏离或包含多余信息。实际搭建接口时,团队需要选择合适的 Reranker 模型大小,在准确度和延迟之间做平衡。

重排序之后,通常会把 Top 3-5 个片段截断后拼接成上下文发给 LLM。这一步显著提升了答案的准确度,也减少了模型需要处理的 token 数量,间接降低了成本和延迟。

返回结构包含 answer 和来源引用

接口的输出必须结构化,至少包含 answer 字段。信号明确要求返回里至少有 answer:回答正文。除此之外,为了满足“有依据”的要求,通常还会返回 sources 或 references 数组,每个元素包含原始文档标题、片段内容、相似度分数或页码等信息。

一个典型的返回示例可能长这样:answer 里是模型基于检索内容生成的处理步骤,sources 里列出三段来自不同手册的原文,用户可以点击验证答案是否忠实于原文。这种设计让答案不再是黑箱,特别适合设备运维这种对安全和合规要求极高的场景。

返回结构还可能包含 confidence 字段,表示系统对本次回答的自信程度。这个值可以综合向量相似度、重排序分数和模型生成时的 logit 值计算得出。虽然信号没有给出具体字段列表,但强调了“返回有依据的答案”和“提供引用文档以供验证”,因此 sources 是必不可少的。

结构化输出方便前端直接渲染,也便于后续做日志分析。如果用户对答案有异议,可以直接查看 sources 里的原文,判断是检索出了错误文档还是生成环节出了问题。这种可解释性是 RAG 相比纯 LLM 的重要优势。

中文场景落地需注意领域文档处理

在中文环境下搭建这样的 RAG 接口,需要特别关注领域文档的处理方式。设备运维文档往往混杂中英文、专业缩写、图表和表格。纯文本切分容易破坏表格结构,导致 Embedding 丢失关键信息。因此建议在切分阶段增加表格解析和 OCR 预处理步骤,把关键参数提取成结构化字段。

中文分词和 Embedding 模型的选择也很关键。通用模型对“泵轴”“泵轴电流”这类紧密术语的理解可能不足,建议使用在工业或运维语料上继续训练的模型。向量维度一般选 768 或 1024,索引类型推荐 HNSW 以获得较好的召回率和速度平衡。

运维知识更新频繁,新设备、新标准不断加入,系统需要设计增量更新机制。每次文档变更后,要及时重新切分、Embedding 并更新向量库,同时清理过期的旧版本。接口还应支持元数据过滤,比如按设备型号、文档发布时间或责任部门筛选检索范围,进一步提升专业问题的准确性。

实际落地时,建议先在一个设备类型上验证整个链路,收集用户反馈后再横向推广。幻觉问题在专业领域后果严重,因此除了技术措施,还需要建立人工审核机制,对高风险答案进行二次确认。

整个接口把 RAG 各环节真正变成了可落地的服务。对中文开发者来说,理解向量检索、重排序和结构化输出之间的配合,是成功部署专业问答系统的关键。

参考来源