ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

RAGless架构解析:如何在知识库问答中实现运行时零LLM成本

RAGless架构解析:如何在知识库问答中实现运行时零LLM成本 最近在 Hacker News 上看到一个项目标题行文非常简洁Show HN: RAGless – similar to RAG, but $0 LLM API costs at runtime。翻译过来就是它做的仍然是文档检索与问答结合的事但运行时的大模型 API 成本是零。很多做过企业知识库或客服机器人的开发者看到这行字的瞬间应该都会想起自己账单上的那个痛点——RAG 本身并不复杂真正让人心痛的是每次用户提问时都要按 token 计费调用一次云端的生成模型。我的第一个判断是RAGless 并不等于否定 RAG。它更像是在“离线构建”和“在线运行”之间重新切了一刀把最烧钱的那一步从高并发的在线路径上挪走。要做到这一点并不神秘其中一部分做法其实是传统 FAQ 机器人和搜索引擎的老路只是把它们和向量检索、大模型生成组合在一起形成了一个更适合成本敏感场景的新解。这篇文章会先拆解 RAG 在线成本的来源再解释 RAGless 在架构上可能采取的几条实现路线然后给出一套可以直接运行的最小示例演示“离线生成问答对、在线只做检索与组装”的完整流程。最后我会给出适用边界和工程化建议帮你根据自己的问题分布判断这个方案到底适不适合现在的项目。需要先说明的是由于这个项目公开资料还不多下文不会冒充“官方教程”去介绍它的内部实现而是基于标题所表达的目标从架构角度还原一个合理的 RAGless 系统应该怎么设计。你可以把它当作一个可落地的思路参考也可以根据示例代码快速实现自己的版本。1. 为什么 RAGless 这类思路会在今天出现如果你做过一轮完整的 RAG 聊天机器人就应该清楚传统架构是怎么处理一次用户提问的。典型的流程是用户输入问题后系统先对问题进行向量化然后从向量数据库中召回若干相关文档片段再把“用户问题 检索片段 系统提示词”打包成 Prompt交给云端大模型 API 生成最终回答。这意味着用户每问一次系统就要调用一次生成模型消耗的 token 量与文档上下文长度直接相关。问题恰恰出在这里知识库问答里的许多问题答案其实是相对固定的。比如“你们的退货政策是什么”“XX 功能在哪里配置”“会员积分怎么计算”这些问题即使变化了说法核心意图并没有改变。传统 RAG 为了回答这些重复出现的问题每次都让大模型重新阅读一遍文档、重新组织语言这相当于让同一个员工每天回答相同的问题而且每回答一次都按字数结算工资。从成本结构上看成本环节说明是否按次产生文本向量化文档切块后生成向量离线预处理与在线查询各一次向量检索使用向量库或搜索引擎在线产生但与生成模型相比通常较小Prompt 输入 token把问题、文档片段、提示词传给大模型每次提问都产生模型输出 token大模型生成回答每次提问都产生中间服务与日志API 网关、日志、监控固定成本随调用量线性增长真正让人头疼的并不是 Embedding 或向量检索而是生成阶段的 token 费用。知识库文档往往很长一个 Prompt 可能塞入几千甚至上万个 token再叠加输出 token当调用量到一定规模后这笔费用会被迅速放大。RAGless 的核心动机就是改变这个线性成本结构。它的核心思想可以概括为一句话尽量让大模型在离线、一次性的构建阶段把答案准备好在线运行阶段只做检索、排序和模板化输出。于是在线请求路径上不再需要发起任何 LLM API 调用自然也就不存在按 token 计费的问题。这个思路并不高深却解决了一个真实的工程困境很多企业内部知识库文档是低频更新、高频查询的。对这类内容一次性投入算力去提炼问答对远比每次在线生成答案划算。2. RAGless 的核心概念与容易混淆的边界在继续展开之前需要先厘清几个关键词。RAGRetrieval-Augmented Generation检索增强生成的核心链路是“先检索、再生成”。系统从外部知识库中检索出相关内容再让大模型基于这些内容生成回答。它解决的是大模型“不知道私有知识”的问题但也因此带来生成 API 的持续调用成本。RAGless 从命名上看是 RAG 的“反面”但从架构上来讲它并不是取消检索而是取消或弱化了“生成”这一步。在线阶段系统从预置的知识索引中找到最佳答案然后直接返回。如果知识条目本来就是结构化的字段甚至可以通过模板完成最终回答的组织。也就是说它把“生成答案”这个动作从每次请求中拆了出去放到一次性的离线构建阶段完成。这里有一个很容易混淆的点RAGless 并不是完全不用 LLM。从标题的精确表述“$0 LLM API costs at runtime”来看它强调的是“运行时”没有 API 费用并不代表构建知识索引时也不能用大模型。大量可行的 RAGless 实现恰恰是在离线时用 LLM 生成 QA 对、摘要或改写文本然后把这些内容存入本地索引。在线服务请求的是索引而不是模型。另一个容易混淆的点是“零成本”。如果你在本地部署了一个开源大模型确实可以不向外部 API 付费但这不等于零成本因为本地推理仍然需要 GPU 或高配置 CPU要算折旧和运维成本。RAGless 的“零成本”更适合被理解为“在线生成式 API 的边际成本为零”或者更准确地说它把成本从“按每次对话结算的变量”变成了“随构建和索引更新的低频固定开销”。可以用一张表来对比传统 RAG 与 RAGless 的差异对比维度传统 RAGRAGless离线阶段文档切块、向量化、构建索引文档切块、生成 QA、向量化、构建答案索引在线阶段检索 组装 Prompt 调用 LLM 生成检索 相似度排序 返回预置答案每次请求是否产生 Token 费用是否答案质量与灵活性高可处理复杂推理取决于预置问答覆盖度更新知识库的成本更新索引即可需要重新生成或审核 QA 对适合的问题类型开放域、复杂推理、长上下文融合高频、固定、有标准答案的问题从这张表可以看出RAGless 的取舍非常清晰它用“答案的灵活性”换取了“运行成本的确定性”。知识库更新频率越低、问题重复率越高这个交换就越值得。3. 运行时为零 LLM API 成本的几种实现路线严格来说一个叫 RAGless 的项目可以有很多种实现方式。但如果我们以“运行时 $0 LLM API costs”为目标合理的技术路线基本会在下面几条里选择也可能同时结合其中多条。3.1 离线生成 QA 对在线检索返回这是最常见、也最容易理解的做法。知识库文档在导入时大模型并不直接对用户提供服务而是离线将文档切块并生成一批“用户问题 - 标准答案”的问答对。这些问题可以对文档做多角度提问也可以由运营人员整理历史工单和常见问题来补充生成。构建完成后系统把这些问答对写入一个可检索的索引。线上用户提问时系统只负责在索引中找到最相似的问题返回对应答案。全部流程不出现大模型 API 调用。这种实现最接近“把 LLM 当成知识提炼师而不是客服接线员”。3.2 检索结构化数据通过模板输出还有一部分问答并不需要真正意义上的“理解”与“生成”。例如“余额是多少”“订单状态如何”“政策适用多少天”这些答案可以从业务数据库或配置表中直接获取。这类场景的 RAGless 实现会更轻离线阶段可能只是把字段关系整理好在线阶段根据用户意图匹配到对应的模板再把模板中的变量替换为查询结果。比如命中“退货几天内可以申请”模板后模板会被渲染成“签收后 7 天内可申请无理由退货”整个过程不需要 LLM 参与。这条路线在客服机器人里非常实用因为它不仅成本为零响应速度还远快于云端模型生成。3.3 文档静态快照与摘要缓存对于某些内容相对稳定、但单篇文档很长的知识库可以在离线阶段把文档重新组织为结构化的摘要卡。系统把原文的关键结论、规则条款、操作步骤提前抽取出来并用固定格式保存。线上提问时检索命中某张摘要卡后返回的是“已经整理好的答案”而不是把原文片段丢给模型加工。这种做法的优点是质量稳定回答内容和排版不会像 LLM 那样每次变化缺点是文档一更新相关摘要需要重新生成和审核。因此它更适合政策制度、操作手册、产品说明这类更新频率不高的内容。3.4 本地模型或传统算法兜底如果业务问题不能被有限问答对完全覆盖还有一种折中的零 API 成本路线部署本地小模型或使用传统文本匹配算法。这里的“零”是相对外部 API 而言的本地模型依然会占用 CPU、内存、GPU但不会在用户每次提问时产生云端调用费用。更轻量级的做法是使用 BM25、TF-IDF、字符相似度等搜索算法在本地完成召回和排序。它们的效果不一定比向量检索差多少尤其在中文短文本的 FAQ 匹配上如果调节好权重完全可以承担大部分请求。本文后面的示例就是先用字符相似度演示把整个链路跑通然后再考虑是否替换成工程上更成熟的向量检索。综合来看上面几条路线的共同点是把大模型调用从“响应一次用户请求的必要条件”降级为“离线准备阶段的可选工具”。运行时系统的职责回归到搜索、排序、规则判断和组装输出。这个架构思想比“是否使用 RAGless 这个名字”更重要。4. 动手实现一个最小化 RAGless 系统理论讲得再多不如实际跑通一个最小示例。下面我会实现一个简化版的 RAGless 问答服务完整流程包括两个阶段离线阶段读取本地 Markdown 文档调用一次 OpenAI 兼容的 LLM API批量生成 QA 对并保存到索引。在线阶段通过命令行问题查询本地索引返回最匹配的答案。整个查询过程没有任何模型调用也刻意不在代码里留下调用模型的后门。这个示例更偏向教学它用相似度匹配代替真正的向量检索引擎方便你在一台普通电脑上直接运行不用启动向量数据库或引入太多依赖。生产环境的替换方案我会在后面的工程建议一节说明。4.1 目录结构与数据准备建议先创建这样一个目录结构ragless-demo/ ├── config.yaml ├── docs/ │ ├── 退换货规则.md │ └── 会员积分说明.md ├── index/ │ └── qa_records.json └── scripts/ ├── build_qa.py └── run_server.py先在docs目录放一份简单的规则文档假设是退换货规则.md# 退换货规则 1. 买家在签收后 7 天内可申请无理由退货。 2. 退货商品需保持完好不影响二次销售。 3. 非质量问题产生的退货运费由买家承担。 4. 质量问题产生的退货运费由卖家承担。 5. 特殊定制类商品不支持无理由退货。这份文档会作为离线构建阶段的输入。真实项目中你可以把公司制度、产品手册、运维文档都放进来但建议一个文件控制在一个主题内后续生成的 QA 质量会更高。4.2 配置文件与密钥管理config.yaml 用来统一管理模型接入信息和索引路径。# config.yaml provider: base_url: https://api.openai.com/v1 # 替换为你的 OpenAI 兼容服务地址 model: your-model-name # 替换为你可用的模型名 api_key_env: LLM_API_KEY # 密钥通过环境变量注入不建议写进仓库 build: docs_dir: docs chunk_max_len: 800 temperature: 0.2 runtime: index_path: index/qa_records.json top_k: 3 enable_llm_fallback: false # 保持 false才能保证零 API 成本这里有一个非常重要的工程细节真实环境中不要直接在配置里写 API Key而是通过环境变量引用例如LLM_API_KEYsk-xxx python scripts/build_qa.py。密钥一旦进入 Git 历史再想清理就很麻烦。下面的代码会通过os.environ.get读取配合config.yaml中的api_key_env字段完成注入。4.3 离线阶段调用 LLM 生成 QA 对离线构建脚本本身是可以调用模型 API 的因为它只运行在数据导入或知识库更新阶段。# scripts/build_qa.py import glob import json import os import requests import yaml def load_config(): with open(config.yaml, encodingutf-8) as f: cfg yaml.safe_load(f) cfg[api_key] os.environ.get(cfg[provider][api_key_env]) if not cfg[api_key]: raise RuntimeError(请通过环境变量注入 LLM API Key) return cfg def split_chunks(text: str, max_len: int 800) - list[str]: paragraphs [p.strip() for p in text.splitlines() if p.strip()] chunks [] current for p in paragraphs: if len(current) len(p) max_len and current: chunks.append(current) current p else: current f{current}\n{p} if current else p if current: chunks.append(current) return chunks def generate_qa(cfg, chunk: str) - dict | None: prompt ( 你是知识库运营专家。请根据下面的文档片段生成一条用户最可能问到的高频问答对。\n 返回 JSON格式为 {\question\: \...\, \answer\: \...\} 如果片段不适合生成问答返回 null。\n answer 只能使用片段中的信息不要编造。\n\n f文档片段\n{chunk[:1800]} ) resp requests.post( f{cfg[provider][base_url]}/chat/completions, headers{Authorization: fBearer {cfg[api_key]}}, json{ model: cfg[provider][model], messages: [{role: user, content: prompt}], temperature: cfg[build].get(temperature, 0.2), }, timeout60, ) resp.raise_for_status() content resp.json()[choices][0][message][content] try: return json.loads(content) except json.JSONDecodeError: return None def main(): cfg load_config() records [] docs_dir cfg[build].get(docs_dir, docs) for path in glob.glob(os.path.join(docs_dir, **, *.md), recursiveTrue): with open(path, encodingutf-8) as f: content f.read() chunks split_chunks(content, cfg[build].get(chunk_max_len, 800)) for chunk in chunks: item generate_qa(cfg, chunk) if ( item and isinstance(item, dict) and isinstance(item.get(question), str) and item[question].strip() and isinstance(item.get(answer), str) ): records.append({ question: item[question].strip(), answer: item[answer].strip(), source: path, }) index_path cfg[runtime][index_path] os.makedirs(os.path.dirname(index_path), exist_okTrue) with open(index_path, w, encodingutf-8) as f: json.dump(records, f, ensure_asciiFalse, indent2) print(f构建完成共生成 {len(records)} 条问答索引写入 {index_path}) if __name__ __main__: main()这一段代码的重点并不在于调用 API 本身而在于它所在的阶段。它明显独立于线上服务脚本只是每次文档更新时手动执行一次。代码里通过chunk_max_len控制切块大小避免把过长、上下文不连续的文本一股脑丢给模型通过temperature0.2控制模型输出稳定。构建结果直接写入qa_records.json成为后续在线检索的唯一数据源。如果你不想在演示阶段真的调用模型 API也可以略过生成环节手工维护一批问答对。真实项目中运营人员整理高频问答再交给 QA 生成脚本做扩充是更常见的组合方式。4.4 在线阶段零 LLM 调用检索服务接下来是 RAGless 的精髓online 服务脚本完全不含模型调用。这里我用 Python 标准库和difflib完成相似度匹配好处是不需要安装额外依赖。生产环境可以把它替换成向量数据库或 BM25 检索引擎但替换的部分仍然是本地检索不是模型生成。# scripts/run_server.py import argparse import json from difflib import SequenceMatcher def normalize(text: str) - str: # 统一小写并去除空白适合中文与英文混排场景 return .join(ch for ch in text.lower() if not ch.isspace()) def similarity(a: str, b: str) - float: return SequenceMatcher(None, normalize(a), normalize(b)).ratio() def load_records(path: str): with open(path, encodingutf-8) as f: return json.load(f) def search(records, question: str, top_k: int 3): hits [] for rec in records: # 问题本身最该相似其次允许用户提问表述与答案部分匹配 q_score similarity(question, rec[question]) a_score similarity(question, rec[answer]) * 0.6 score max(q_score, a_score) if score 0.35: hits.append((score, rec)) hits.sort(keylambda x: x[0], reverseTrue) return hits[:top_k] def answer(question: str, index_path: str index/qa_records.json, top_k: int 3): records load_records(index_path) hits search(records, question, top_k) if not hits: return { answer: 抱歉现有知识库中没有找到匹配答案请转人工处理。, confidence: 0.0, llm_calls: 0, } best hits[0] return { answer: best[1][answer], confidence: round(best[0], 3), source: best[1][source], llm_calls: 0, } def main(): parser argparse.ArgumentParser(descriptionRAGless 在线问答检索) parser.add_argument(--query, requiredTrue, help用户问题) parser.add_argument(--index, defaultindex/qa_records.json, helpQA 索引路径) args parser.parse_args() result answer(args.query, args.index) print(json.dumps(result, ensure_asciiFalse, indent2)) if __name__ __main__: main()注意返回结果里有一个llm_calls字段它恒为 0。这不仅是业务字段更是一个可观测性约定。真实项目中所有可能调用模型的入口都应当通过统一方法封装并将字段接入监控确保一旦有调用立即告警。如果 RAGless 系统运行期间发现这个值大于 0说明规则被破坏了比如有人把 fallback 开关打开或者代码里悄悄多了一个模型调用分支这时必须马上定位。4.5 模板渲染型答案示例还有一种常见场景是数据不来自文档而来自业务配置。这时用模板输出会比相似度检索更合适下面给出一个小示例。# scripts/template_answer.py # 用于回答“XX规则是什么”这类参数型问题模板本身不依赖 LLM POLICY_TEMPLATES { return_fee_rule: 买家在签收后 {days} 天内可无理由退货{fee_desc}, points_rule: 每消费 {amount} 元可获得 {points} 积分积分有效期为 {valid_months} 个月。, } # 假设这一层的参数来自检索匹配到的知识条目或业务数据库 params { days: 7, fee_desc: 非质量问题的退货运费由买家承担。, amount: 1, points: 1, valid_months: 12, } policy_key return_fee_rule print(POLICY_TEMPLATES[policy_key].format(**params))模板答案的价值在于你完全控制了最终表达不会出现同样的政策问题每次回答都不一样的情况。它适合高频出现的服务条款类问题也方便做合规审查。5. 运行验证与效果评估搭建完成后可以按以下顺序验证整个系统。5.1 运行命令先执行离线构建。假设你的环境变量已经配置好export LLM_API_KEYyour_api_key_here python scripts/build_qa.py如果离线阶段调用了模型脚本会输出类似下面的内容构建完成共生成 6 条问答索引写入 index/qa_records.json生成数量会因为文档切块方式和模型表现而不同。如果输出为 0检查文档路径、API Key、模型名和返回内容解析逻辑。然后执行在线查询python scripts/run_server.py --query 退货时运费谁出预期结果中llm_calls为 0answer是预置答案{ answer: 非质量问题产生的退货运费由买家承担质量问题的退货运费由卖家承担。, confidence: 0.62, source: docs/退换货规则.md, llm_calls: 0 }验证是否成功有两个关键点第一answer是否可读、是否覆盖了问题核心第二整个查询过程中是否真的没有发起过外部模型 API 请求。在实际项目中看日志里有没有http出站请求或者监控里llm_calls是否为 0。5.2 效果评估不应该只看准确率一个问答系统的效果评估通常要看三方面检索覆盖率、答案正确率、在线 API 调用数。对于 RAGlessllm_calls是硬性指标一旦大于 0 就说明系统跑偏了。检索覆盖率可以通过准备一组测试问题来计算例如准备 100 条人工标注问题看有多少问题能找到 correct answer。答案正确率则需要抽样人工评审因为 QA 对是离线生成的质量好不好直接决定线上答案质量。成本效果可以通过一个简单的公式预估传统 RAG 单次在线成本 ≈ 输入 token * 单价 输出 token * 单价 RAGless 单次在线成本 ≈ 0 模型 API 费用 服务固定摊销成本 RAGless 离线一次性成本 ≈ 文档块数量 * 单块生成 token 消耗 * 单价也就是说知识库文档越多离线生成一次的成本越高但之后只要文档不更新这个成本就会被大量在线请求摊薄。如果知识库每个月才更新一次而用户每天问上千次RAGless 的成本优势会非常显著。5.3 验证失败时先从三个方向排查如果在线查询没有命中任何答案首先看 QA 索引里是否真的存在相关问答。如果索引为空问题出在离线构建阶段如果索引存在但没命中可能是相似度阈值过高或者生成的问答对表述离用户问题太远。还有一种情况是相似度阈值设置得过高导致“宁缺毋滥”此时可以观察 score 分布适当将阈值从 0.35 调低到 0.25 左右。需要强调这类相似度检索并不是 RAGless 唯一适合的在线匹配方式。工程上更常见的是用 BM25 或向量检索做召回再用 Rerank 模型优化排序。这里的关键在于在线阶段仍然不应该调用云端生成模型。6. 什么时候该用 RAGless什么时候继续用 RAG比“怎么做”更重要的是搞清楚“该不该这么做”。我把适用场景梳理成一张对照表。场景特征更适合 RAGless更适合传统 RAG问题重复率大量用户问相同问题每次提问都涉及不同角度知识更新频率低月度或季度更新高每天或每小时更新答案形式标准答案、政策条款、操作步骤需要归纳、分析、比较用户交互深度单轮问答为主多轮追问、上下文解释推理与生成要求弱答案可在文档中找到强需要跨文档推理成本敏感度高预算有限中或低更重视体验合规要求回答必须稳定、可审查回答可以动态生成但需要截断控制如果你做的是企业内部规章制度问答、电商售后 FAQ、产品使用帮助问题高度重复答案必须严谨一致那 RAGless 一类思路非常适合。尤其当团队没有太多预算支撑大规模 API 调用时把高频问题用 QA 索引消化掉是性价比最高的方案。相反如果你的产品本身就是一个“AI 问答助手”用户期待它能做开放域的推理、代码解释、方案对比那 RAGless 会显得力不从心。它无法回答知识库中没有覆盖的新问题也无法根据多轮对话动态调整答案方向。强行使用会在开放问题上表现得很笨拙。真实生产中更成熟的架构并不是非黑即白而是“路由分层”。请求先进入低成本层用检索匹配预置 QA命中率高就直接返回相似度低或用户主动追问时才升级到传统 RAG调用大模型生成。这种混合路由既能省下大量高频问题费用又保留了解决疑难问题的能力。7. 常见问题与排查思路RAGless 在实践中经常遇到一些问题下面列出来供你排查时参考。问题现象可能原因排查方式解决方案离线脚本生成 QA 数量为 0文档路径配置错误或模型返回格式无法解析打印每段切块信息检查返回内容修正 docs_dir 或增加返回内容解析容错在线检索命中率低相似度阈值过高或 QA 覆盖不足打印匹配分数分布降低阈值扩充 QA 生成角度返回答案与新文档不一致构建后未重新生成或重建索引检查知识库版本号文档更新后重新执行离线构建线上出现意外的 LLM API 调用代码中存在 fallback 分支或未收敛的模型调用查看调用日志与计费明细统一模型调用入口并加入监控告警回答只匹配问题但不解决用户需求离线 QA 生成时只做了文档摘要没有站在用户角度提问人工抽查问答对在生成提示词中要求多种问法覆盖模型在离线阶段生成的答案存在幻觉切块上下文太短或提示词约束不足抽样检查答案与原文偏差加入“忠于原文”约束引入审核环节文档更新频繁导致离线成本过高每次都全量重新生成查看构建耗时与费用按目录或时间戳做增量构建多轮追问效果差预置答案是单轮导向记录对话状态用户连续追问时路由到传统 RAG其中最值得重视的是“线上出现意外 LLM 调用”。很多人为了兜底会在检索结果不够好时悄悄加一个 fallback让系统调用模型生成答案。一旦加了这种逻辑RAGless 的成本模型就会退化为 RAG自己还浑然不觉。如果确实需要兜底应该把它设计成显式、可计费、可监控的分层路由而不是藏在代码深处的隐藏分支。另一个高频问题是离线 QA 的质量。大模型生成的回答未必完全准确特别是针对规则条款时容易存在“复述偏差”。建议对自动生成的 QA 增加人工审核环节尤其是政策类、财务类内容宁可少生成也不要让错误答案进入线上索引。8. 工程化建议把 RAGless 做得更像生产系统如果决定在真实项目里采用 RAGless 思路有几点工程建议值得提前考虑。第一条是严格区分构建流水线与在线服务。离线构建脚本对应一个独立 CI 任务可以手动触发或由文档仓库的 webhook 自动触发。在线服务只加载构建产物不依赖外部模型 API。两者应当有独立的依赖包、独立的配置避免在线服务引入构建脚本才需要的 SDK。第二条是给知识索引加上版本号和回滚机制。每次离线构建生成的 QA 索引都应该带着版本号、构建时间、源文档 commit、模型标识和人工审核状态。线上服务可以灰度发布新索引一旦发现答案质量下降立即回滚到旧版本。对于问答系统来说索引就是数据数据必须有版本管理。第三条是把“运行时不调用 LLM API”作为一项可观测指标写入监控。可以在返回结果中加入llm_calls字段或在代码里统一封装 Model Gateway让所有模型调用都经过同一个函数。线上如果出现不符合预期的模型调用应该像服务错误一样进入告警。成本节省这件事可测量才可持续。第四条是建立反馈闭环。给用户的回答下方加上“有帮助 / 没帮助”按钮把没帮助的问题记录下来定期抽出来补充生成新的 QA。RAGless 系统最容易出现“回答稳定而错误”或“回答稳定但不相关”用户反馈是发现覆盖盲区的重要来源。第五条是注意权限与内容安全。既然回答来自离线预置内容那么索引在生成时就要将权限维度考虑进去。不同角色用户能看到的答案应由本地权限判断决定不能把全量知识库索引暴露给所有用户。如果离线生成时调用了第三方模型 API应警惕数据出域风险必要时先做脱敏处理再提交而不是把原始合同、客户信息直接放进 Prompt。最后一条建议有点反直觉不要在初次上线时追求“零 API 调用率”。更合理的起步是允许一小部分复杂问题路由到在线大模型先让系统运转起来观察高频问题分布再逐步把高频问题下沉到 RAGless 索引层。直接砍掉全部模型调用容易因为覆盖不足导致用户体验严重下滑。9. 总结与后续方向RAGless 真正留给我们的不是一个非黑即白的结论而是一个被很多团队忽视的成本优化视角大模型的生成能力并不是每一次问答都需要也不应该默认出现在用户请求的路径里。通过把 LLM 从“在线每请求调用”改为“离线批量构建”你可以把知识库问答系统的 API 成本从线性增长变成一次性投入这对高频、固定、责任明确的问答场景来说是很大的架构红利。如果你现在正好负责一个客服机器人或企业内部知识库可以先不急着推翻现有系统而是做一个更小范围的验证抽出一部分 FAQ 型问题离线生成一两百条 QA做一个如上文所示的简易检索。观察两三天看高频问题覆盖率能否达到目标回答稳定性是否让人满意。如果效果不错再逐步扩大索引范围把传统 RAG 留作处理疑难问题的第二层。这个方向跑通的难度不高却能直接改善预算和响应速度值得在自己的项目里试一试。
返回列表