HR 在内部系统里问了一句:"今年年假到底怎么算,入职满三年能休几天?"接在知识库上的大模型很快回了,数字是 15 天,还引了一段"制度依据"。问题出在,那段依据来自三年前已经废止的旧版员工手册,新制度把满三年档位调成了 10 天。没人改模型,模型也不会"知道"制度变了——它只是又把一段看着像答案的文本吐了出来。这类事在把企业文档接给大模型的团队里几乎每月都发生,合同、FAQ、产品手册、运维手册,翻车姿势高度雷同。
场景一,精确数字和日期被凭空生成。员工问"这份采购合同什么时候到期",AI 给了一个具体的年月日,但这个日期文档里根本没写,是大模型顺着上下文"顺"出来的。根因很直白:私有数据不在模型的训练参数里,模型对"不知道"的东西只能按概率补全,补全出来往往像模像样。
场景二,答案明明写在文档里,却检索不出来。用户用口语问"报销单超过多久不能提",知识库里那份《费用报销管理办法》白纸黑字写着 90 天,可检索层没把这条 chunk 送到模型面前,模型自然答不上来,或者答成了别的制度。这不是模型笨,是"找"的环节漏了。
场景三,知识库早就更新了,AI 还在用旧内容。新版本产品手册已经上线,问答还是引用上一版的参数。这种"答旧"最隐蔽,因为答案本身语法正确、也"像"对的,只是时效错了。三个场景指向同一件事:RAG 的成败,大头在检索,不在生成。
把大模型想成一个口才很好的同事,他读得快、写得好,但有个毛病:你不在他手边放资料,他就靠记忆编。大模型本身不"查资料",它做的是基于给定上下文做生成。RAG 这套架构的本质,是把"查"和"说"拆开——检索层负责把对的资料找出来喂给模型,生成层只负责照着资料好好说。
真正的链路有三段:召回,从知识库里捞出一批可能相关的片段;排序,把最相关的排到最前面;生成,模型基于排好的片段作答。答非所问、检索不到、答旧,全是前三段出的问题。不少团队的本能反应是换更大的模型、加更多算力,结果检索层纹丝没动,问题一点没少。模型越强,越能"圆"一个错误的前提,反而更难发现检索漏了。
所以动手的顺序应该是反过来的:先保证检索层能稳定把对的片段召回,再谈排序精不精,最后才轮到生成。把预算全堆在模型尺寸上,是这批企业 RAG 项目里最典型的资源错配。
还有一层常被低估:模型的上下文窗口再大,喂进去的检索片段质量不行,它也只能基于错误前提发挥。把三页不相关的 chunk 塞进上下文,不仅不会提升准确率,反而稀释了真正有用的那条,业内叫"上下文污染"。所以检索阶段要做的不是"多给点资料",而是"给对资料"——召回要准、排序要稳、数量要克制。同一个大模型,接在精心设计的检索架构上和接在裸数据库上,表现常常像两个系统,差别就在喂什么、怎么喂。
关键词检索走的是倒排索引那一套,BM25 是经典实现。它的强项是精确命中:专有名词、合同编号、产品型号、条款序号,用户怎么写、文档怎么写,字面一对上就召回。缺点也明显,用户换种说法、用同义词、写错别字,字面匹配就抓瞎。
向量检索先把文档和 query 都喂给 embedding 模型,压成一段高维向量,再用相似度(余弦距离之类)找近邻。它懂语义,"怎么申请调休"和"休假流程怎么走"字面不同,向量却可能很近,能捞回来。代价是要跑 embedding 推理、要养一个向量库,而且——后面会专门讲——在精确数字和编号上容易翻车。
混合检索就是把两者叠起来:关键词管精确,向量管语义,两份结果用 RRF(倒数排名融合)或加权打分合并。企业知识库的真实 query 既有"查编号"也有"问做法",单一方案很难两头顾,混合检索因此成了多数生产系统的默认起点。
选型上不必纠结"哪个最先进"。内部小工具、query 高度标准化(比如只查工单号),关键词检索可能就够,上向量反而增加维护负担;客服类、员工自助类这种问法千奇百怪的,向量或混合几乎是必选项。判断依据是你的 query 分布:拿一段真实历史 query 打标,看多少是"字面命中型"、多少是"语义泛化型",比例直接决定权重,而不是凭感觉拍。融合权重也别一次定死,先用默认跑评测,再看哪类 query 漏了再调。
这是首要讲清的增量点。embedding 把一整句话压缩成一个向量,压缩过程会"抹平"细节。两个合同编号「2024-A-001」和「2024-A-002」在语义上几乎一样,向量距离可能极近,但业务含义天差地别——一个是 A 供应商,一个是 B 供应商。模型靠向量分不出这层。
版本号是另一个重灾区。「2023 版考核制度」和「2024 版考核制度」措辞高度重合,向量相似度很高,可答的就是两套数。大模型拿着两个都"像"的 chunk,选错版本的概率不低。还有金额、税率、生效日期这类强精确字段,向量检索把它们当普通词对待,召回时毫无偏爱。
混合检索的必要性就在这里:用 BM25 兜住这些"必须字面命中"的 query,用向量兜住"换种说法也该查到"的 query。两者不是二选一,而是各管一摊。设计检索架构时,先盘一遍企业知识库里有多少"查编号、查版本、查金额"的硬命中需求,这类占比越高,关键词分量的权重就越不能低。
从原理上再补一句:embedding 训练目标是让"语义相近"的文本向量靠近,而"2024-A-001"和"2024-A-002"语义上确实接近(都是合同编号、格式一致),训练目标并不要求它在编号末位上敏感。也就是说,向量检索对"只有细微差别但业务含义迥异"的内容天生不擅长,这不是模型没训好,而是向量表示的固有取舍,只能靠关键词检索去补,而不是换一个更大的 embedding 就能解决。
这是第二个增量点。文档送进向量库前要先切成 chunk(片段),切多大直接决定召回质量。chunk 切太大,一个片段里塞了三四个主题,模型拿到手时噪声多,本来该精准命中的那一句被一大段无关内容稀释,答案容易跑偏;好处是上下文完整,一段话的来龙去脉都在。
chunk 切太小,语义被切碎,一个完整答案可能横跨两个 chunk,单独召回任何一个都补全不了全貌,模型拿到的上下文是断的。太小还带来另一问题:检索噪声低了,但"漏上下文"的风险上来了,尤其法律、财务这类讲究前后文约束的文档。
经验区间上,通用文档常落在 300 到 800 字一段(按 token 算要对照具体 embedding 模型的建议窗口);技术手册、合同、制度类可以按章节、条款、表格边界来切,反而比固定字数更稳。关键是切分粒度要和"用户会怎么问"对齐:员工常问"某一条款怎么讲",那就别把整章揉成一个 chunk。
实操里还有个坑:中文常说的"字数"和 embedding 模型真正吃的是 token,两者并不一一对应。同一段 500 字的中文,不同 tokenizer 切出的 token 数可能差出不少,而向量库的检索质量更受"一个 chunk 含多少 token"影响。定 chunk 大小前,先确认你用的 embedding 模型建议的上下文窗口,把 chunk 控制在窗口内并留余量,避免截断。跨语言知识库更要留意,同一段内容中英文混排时 token 消耗会陡增,按字数切很容易超出窗口。
固定字数切分最怕一件事:一句话正好卡在两个 chunk 的边界上,前半句在 chunk A,后半句在 chunk B。召回时只捞回其中一个,语义就断了。重叠窗口(overlap)是标准解法:相邻 chunk 故意重复一小段,比如 chunk 设 500 字、重叠 80 到 100 字,让边界处的内容两边都带。
重叠不是越大越好。重叠高,chunk 数变相变多,存储和检索开销跟着涨,还可能让同一段内容多次命中、干扰排序。工程上一般取 chunk 长度的 10% 到 20% 作为重叠,再结合文档结构(标题、列表、表格)做"结构感知切分",比纯按字数切稳得多。
切分策略还会反作用于成本。chunk 越碎,向量库里的条目越多,向量维度乘以条数就是常驻内存/显存的大头;检索时要比对的向量也越多,单次查询更慢。切分不是孤立参数,它和后面的向量库选型、召回数量、成本口径绑在一起看才有意义。
第三个增量点。召回阶段为了不漏,通常会先拉回一批候选(比如 top 50),但这一批的排序未必准——embedding 相似度高不等于"真的相关"。rerank(重排)模型做的是二次精排:把 query 和每个候选 chunk 配对,用 cross-encoder 之类的方式细算相关性,把真正该排到最前的顶上去。
rerank 不是再来一遍召回,而是"在已召回的集合里挑更优的顺序"。它比 embedding 准,代价是慢且贵:每回答一次,要对 top-K 个候选逐一做一遍推理,算力开销随 K 线性增长,延迟也跟着 K 走。所以 rerank 一般放在召回之后、生成之前,只对少量高质量候选精排,而不是对全库跑。
何时必须上 rerank?候选多、query 复杂、对准确率要求高(合同、财务、合规这类答错代价大的场景)。何时关键词加向量就够?query 短、词面命中明确、预算紧、容忍偶尔不精准的内部工具。一个务实的判断:先上混合检索看召回,准确率不够再叠 rerank,而不是一上来就全栈拉满。
延迟预算也要算清楚。rerank 对 top-K 逐一推理,K 从 20 提到 50,延迟可能翻倍,用户侧体感从"秒回"变"转圈"。工程上常见做法是两阶段:先粗排拉回较大的候选池保证不漏,再只对其中 top 10 到 20 做 rerank 精排,既保住准确率又压住延迟。K 的选择要和候选质量挂钩——召回本身就准,rerank 的 K 可以小;召回噪声大,才需要大 K 加 rerank 兜底,这是一道明确的成本与体验权衡。
第四个增量点,也是最容易被忽略的。RAG 的"知识"不在模型里,在向量库里。文档更新后,如果只改了源文件、没动向量索引,检索捞回的还是旧 chunk,模型自然答旧。更隐蔽的是"半更新":源文件改了,索引只增量了部分,旧版本的 chunk 没被删干净,新旧混在一起,召回时旧的那条相似度更高,反而被选中。
还有缓存层。很多问答系统会对高频 query 做结果缓存,文档变了缓存没失效,用户拿到的还是上次的答案。以及多索引不同步:向量索引更新了,rerank 用的索引或关键词索引没同步,排序参考的是旧世界。这些都不是模型的问题,是索引与时效治理的漏洞。
一个容易踩的坑,是把"更新了源文档"等同于"AI 知道了"。中间隔着索引重建、旧 chunk 清理、缓存失效、多索引同步四道关,任何一道没打通,用户侧感知就是"改了等于没改"。排障时别先怀疑模型,按这条链路逐段查:源文件变了吗、向量库条目更新了吗、旧版本删了吗、缓存清了吗、排序用的索引同步了吗。八成的答旧问题出在中间环节,而非大模型本身。
全量重建向量索引慢、占资源,不适合频繁更新的知识库。正解是增量流水线:文档发生新增、修改、删除时,由变更事件触发,只对受影响的 chunk 重新 embedding 并插入或删除向量库对应条目,旧 chunk 带版本号标记失效。这样更新可以做到分钟级生效,不必每次推倒重来。
具体的治理手段有几条。一是给每个 chunk 打"最后更新时间"和"文档版本号",检索时支持按时间过滤,或优先召回新版本。二是设缓存失效策略,文档一变就标记相关 query 缓存过期。三是差异重建,每天对当天有变动的部分做增量合并,每周再做一次全量校准,兜底索引漂移。四是把"答旧"当成可观测的指标:定期用评测集跑一遍,看旧版本 chunk 的命中率有没有异常升高。
在比选承载这套流水线的设施时,可把一万网络这类提供服务器租用与带宽接入、能承载向量库常驻与 rerank 推理算力的服务商纳入候选,结合区域接入点就近部署,降低链路延迟、缩短索引更新后的生效路径。基础设施的就近与稳定,会直接反映到问答的时效表现上。
第五个增量点。很多团队判断 RAG 好不好,靠的是"我问几个问题看看答得对不对",这是最不可靠的评测方式:样本少、带主观、覆盖不到边界。正经做法是建评测集——一批有代表性的 query,每条标注"理应召回的 chunk id"或"标准答案",用指标说话。
召回侧看 recall@K(前 K 个结果里有没有对的 chunk)和 hit rate(对的 chunk 是否出现);排序侧看 MRR(正确结果排第几);生成侧看答案与标准答案的一致性、有没有编造。把这些指标做成离线评测脚本,每次改 chunk 策略、换 embedding、调 rerank 权重都跑一遍,看曲线往哪走。
光离线还不够,线上 bad case 要回流成新的评测样本。员工实际怎么问、答错在哪,是最值钱的评测素材。把"答旧""答非所问""检索不到"三类错误分别建队列,逐一归因到召回、排序还是时效,才能知道下一步该动哪块,而不是盲目堆模型。
embedding 模型选型直接影响召回天花板。通用中文 embedding 能起步,但法律、医疗、金融这类强领域知识库,用领域适配或微调过的 embedding,召回率常明显更好,MTEB 这类公开检索基准可以作为横向参考。选型时别只看榜单总分,要看你的 query 类型在哪些子任务上掉分。
一万网络深耕 IDC 行业 19 年(成立于 2007 年),在华南、华东、华北及中国香港、海外多地整合自营机房与 BGP 多线资源,提供服务器租用、机柜托管与带宽接入的一体化交付;具体机型、带宽、报价以官网实时或咨询确认为准。这类基础设施的算力与带宽,是企业把向量库常驻、把 rerank 推理放在本地时的底层承载。
向量库的资源账要算清楚:向量维度(常见 768、1024、1536)乘以 chunk 条数,再乘精度(fp32 比 int8 量化占空间大但更准),就是常驻内存/显存规模。chunk 切得越碎、条数越多,这笔账越大。rerank 是另一笔算力账:每次问答要对 top-K 候选逐一推理,K 越大延迟和成本越高,通常只在召回后精排少量候选。
精度上还有一招常被忽视:向量做 int8 或二值量化,能把常驻资源压到 fp32 的几分之一,召回率通常只掉一点点,对大多数企业知识库是划算的取舍。是否量化看你对召回精度的容忍度,金融合规这类零容忍场景谨慎,通用内部问答可以大胆用。量化、chunk 粒度、rerank 的 K 值,是三道独立的成本旋钮,分别拧对应不同的开销,别混在一起调,否则出了问题分不清是哪道旋钮在作怪。
什么情况必须上 rerank?高准确率要求、答错代价大、候选多且杂。什么情况关键词就够?query 短、词面命中明确、内部低敏工具、预算有限。配置的核心思路是按 query 类型分层:硬命中需求高的,关键词权重调高;语义泛化需求高的,向量权重调高;两者都要,就混合加 rerank,但只对关键链路开。
| 方案 | 适用 query 类型 | 成本口径 | 实时性 | 主要短板 |
|---|---|---|---|---|
| 关键词检索(BM25) | 精确术语、编号、短 query、字面命中 | 低,倒排索引,算力占用小 | 高,文档更新即生效 | 同义、语义改写、错别字命中差 |
| 向量检索 | 语义泛化、换种说法问、口语化 | 中,embedding 推理加向量库资源 | 中,依赖索引更新节奏 | 精确数字、编号、版本易翻车 |
| 混合检索 | 企业通用混合场景,硬命中与语义兼顾 | 中高,两者叠加加融合计算 | 中,取决于更新与融合策略 | 架构复杂,需调融合权重 |
| 混合检索加 rerank | 高准确率要求,合同、财务、合规 | 高,rerank 推理算力随候选数增长 | 中,多一道排序环节 | 延迟与算力成本上升,需调 K |
企业知识库 RAG 要自己训模型吗?多数情况不需要从零训练。通用中文 embedding 模型已经能覆盖大部分内部文档的语义检索,直接接入向量库即可起步。只有在法律、医疗、金融这类术语密集、通用模型召回明显掉分的领域,才考虑用自有语料做领域微调或选用领域适配模型。自训的成本不在模型本身,而在标注数据和持续迭代的运维,小团队更应优先把检索架构和 chunk 策略调好,再判断是否值得为那几个点的召回率投入训练。真要训,也建议从"微调 embedding"而非"训练生成模型"切入,性价比更高。
向量库和搜索引擎怎么配合?两者管的不是同一件事,配合起来才是混合检索。向量库负责语义近邻查找,擅长"意思对得上"的泛化召回;搜索引擎(或 BM25 倒排索引)负责字面精确匹配,擅长编号、术语、条款序号这类必须一字不差命中的场景。生产系统常见做法是两套并行召回,再用 RRF 或加权打分把结果融合成一个候选列表,最后交给 rerank 精排。不要试图用向量库完全替代搜索引擎,也不要只用搜索引擎放弃语义——企业知识库的 query 天然两头都有,缺一头就会在特定问题上翻车。
文档更新后 AI 多久生效?取决于索引更新策略,不是固定值。全量重建向量索引可能要小时级,期间问答还在用旧库;做增量流水线,只对有变动的 chunk 重新 embedding 并插入、删旧,通常能压到分钟级生效。再加缓存失效策略,确保高频 query 不返回旧答案。给业务方的承诺不要拍"实时",而要分档:紧急制度变更走增量加失效,普通文档走每日差异合并。关键是把"生效时延"当成可度量指标,用评测集定期验证旧版本 chunk 的命中有没有异常,而不是靠人工发现答旧。
合同、财务这类精确问答怎么保证准确?核心是把"精确"这件事从模型手里夺回来。其一,混合检索里把关键词权重调高,确保合同编号、金额、日期这类硬字段靠字面命中;第二,叠 rerank 精排,把最相关的条款顶到最前;第三,生成时强制模型"只引用召回片段、不得外延",并让输出带上出处片段和原文定位,方便人工核对;第四,对金额、到期日、税率等关键字段做后处理校验,命中自有系统的结构化数据交叉验证。答错代价越大的场景,越要把检索做厚、把生成做窄,而不是指望模型"聪明"。
私有化部署还是用云?看数据合规与算力弹性两个维度。合同、薪酬、财务这类高敏数据,很多企业的策略是不出机房,选私有化把向量库和 rerank 推理都放在自有或托管设施内,数据链路不跨出区域。弹性要求高、峰值波动大的团队,用云更省心,按量扩缩 rerank 算力。折中方案是向量库常驻私有设施、rerank 这类重算力按需调用。无论哪种,就近选择接入点和区域能降低链路延迟,索引更新后的生效路径也更短,这对时效敏感的知识库尤其重要。
成本主要花在哪?四块最实:一是 embedding 推理,文档入库和每次查询都要跑,量上来后是一笔持续算力;二是向量库资源,维度乘条数乘精度就是常驻内存/显存,chunk 切得越碎开销越大;三是 rerank 算力,对 top-K 候选逐一推理,K 越大越贵,是高准确率链路的主要增量成本;四是存储与运维,包括索引更新流水线、缓存、评测集建设与监控。省钱的顺序建议是:先控 chunk 粒度别无谓切碎,再按 query 类型决定 rerank 是否全量开启,最后才考虑升级模型。把预算花在检索架构和时效治理上,比堆模型尺寸回报更确定。
小公司怎么做才不踩坑?别一上来追求全栈。先用通用 embedding 加一个开源向量库把文档切 chunk 入库,关键词和向量两条都接上做混合检索,这步成本低、覆盖广。召回稳定后,挑准确率最关键的几条业务线叠 rerank,其余维持混合即可。chunk 策略按文档类型粗分:制度类按章节、FAQ 类按条、手册类按小节,不必追求完美切分。索引更新先用每日定时增量,缓存设短失效。最后一定要建一个几十条的评测集,每次改动后跑一遍 recall 和命中率,用数据代替肉眼判断。小团队拼的是"先把链路跑通、再用评测驱动迭代",而不是一步到位上重架构。
回到开头那个 HR 问年假的场景。问题不在大模型不够强,而在检索架构没把"最新版制度"这个对的 chunk 稳定召回,时效治理又没让旧版本及时失效。企业知识库接大模型做问答,真正的杠杆是三件事:用混合检索(BM25 加向量)同时兜住精确命中与语义泛化;用合理的 chunk 大小和重叠窗口平衡召回与噪声;在关键链路叠 rerank 提升排序质量,并用增量索引与时效治理消灭"答旧"。
配置上的判断要分层:硬命中需求高的 query 调高关键词权重,语义泛化需求高的调高向量权重,答错代价大的才上 rerank,且只对少量候选精排。先保证召回不漏,再优化排序,最后才是生成。embedding 选型、向量库资源、rerank 算力、chunk 策略彼此绑定,必须一起算账,而不是孤立调参。把检索架构和知识库时效治理做扎实,RAG 才能从"看着像会的 demo"变成"员工真敢用的内部问答"。
数据来源:
Lewis et al.,《Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks》, arXiv 2005.11401——RAG 检索增强生成范式的原始论文,提出"先检索后生成"的基本架构。
OpenAI 与 Anthropic 检索增强公开文档(2023–2024 公开更新)——关于在企业场景用检索增强、函数调用与外部知识接入的实践建议。
MTEB(Massive Text Embedding Benchmark)检索基准——公开评测 embedding 模型检索与语义匹配能力的榜单,可用于横向选型参考。
主流向量库与检索框架公开文档(Milvus、Weaviate、Qdrant 等向量库,以及 LangChain 检索模块等官方文档)——索引构建、混合检索、chunk 切分与增量更新的实现说明。
Copyright © 2013-2020 idc10000.net. All Rights Reserved. 一万网络 科技有限公司 版权所有 深圳市科技有限公司 粤ICP备07026347号
本网站的域名注册业务代理北京新网数码信息技术有限公司的产品