私有化客服系统知识库选型:RAG还是Lucene?混合架构实践
2026/9/15 4:07:07 网站建设 项目流程

做私有化部署客服系统的人,基本都会遇到同一个选择题:知识库用 RAG,还是用 Lucene。我最近跟一家做企业服务软件的公司聊客服机器人架构,团队内部吵了一下午,一边说大模型 RAG 是未来,客服知识库不上向量检索就是自找麻烦;另一边说客户要的是私有化、是可控,Lucene 一套倒排索引只要几台普通机器就能跑,凭什么要额外养一堆模型服务。两边都有道理,但真正离开会议室的时候,我发现大家缺的其实不是立场,而是判断方法。

这篇文章不打算告诉你“RAG 一定好”或者“Lucene 更可靠”,而是把我在多个私有化客服项目里真实的选型过程、踩坑记录、最终采用的混合方案拿出来复盘。适合正在做客服系统、工单系统、企业知识库,或者任何需要“私有化部署 + AI 知识库”组合的读者。你先不用急着站队,跟着我把业务需求、技术原理、硬件约束一条条过完,答案自然就清楚了。

1. 先把这个账算明白:客服知识库到底在解决什么问题

很多团队在选型之前,根本没想清楚这套系统到底在解决什么问题。它不是在做搜索,而是在做“答”。用户不会输入“退款 流程 文档”这种关键词,他会说“我上个月买了你们的东西,现在不想要了,钱什么时候能退到我卡里”。系统要做的,是判断这句话背后的意图,找到对应的知识点,然后组织成一句人能直接看懂的答复。这个目标差异,会直接影响你对 RAG 和 Lucene 的判断。

1.1 客服系统的知识检索,和搜索引擎不是一回事

搜索引擎的目标是召回尽可能多、尽可能相关的文档,所以 Lucene 这类倒排索引方案天生适合。但客服系统刚好反过来,它追求的是“从知识库里找到一个可以回答当前问题的答案片段”,然后把它给用户看,或者喂给大模型组织语言。这两个目标的差异,决定了选型的时候不能只比谁的检索速度快。

说得直接一点,客服知识库至少有四个特殊要求:

  • 用户问法高度口语化、碎片化,经常有错别字、同义词、指代,比如“你们家物流好慢”和“快递什么时候到”说的是同一件事;
  • 同一个知识点,可能被几百种不同的表达方式问到,“退货”“退钱”“不想要了”“七天无理由”指向的可能是同一份售后政策;
  • 答案不能带个人色彩,要对错分明,错了要能追责,客服代表的是公司立场;
  • 知识更新频繁,今天新出一个活动规则,明天可能就要立刻生效,拖一天就会产生客诉。

所以知识库系统真正拼的是两件事:先“找得对”,再“答得准”。RAG 着力于用向量语义搜索解决“找得对”的扩展问题,再用大模型解决“答得准”的表达问题;Lucene 则是把“找得对”这件事用关键词精确匹配做到极致,但表达层面需要额外规则模板来处理。理解这一点,你就能明白为什么后面我会劝你做混合方案。

1.2 为什么 RAG 和 Lucene 会被摆到同一张桌子上

不少人对这两个词有误解,以为它们是完全互斥的两条路线。其实从检索链路来看,它们有很大一块是重叠的。RAG 里的 R(Retrieval)本来就有多种实现方式,可以是向量检索,也可以是关键词检索,甚至两者混合。而 Lucene 只是一个非常成熟的 Java 生态全文检索库,它自己不生成答案,只负责把文档建索引、做相关性排序、把候选文档捞出来。两者在“如何从知识库中找候选内容”这个环节上,确实是竞争关系。

真正让它们被放到一张桌子上比较的,是私有化部署这个大前提。公有云 SaaS 客服系统可以直接调云上的向量数据库和推理服务,基本不用纠结。但私有化项目意味着客户机房可能只有几台普通服务器,没有 GPU,不能访问外网,数据不能出域,这时候每增加一个组件,都是实打实的成本、部署和运维负担。所以选型的问题实际上变成了:在尽量少的硬件和运维成本下,怎么让知识库又准又好用。

这里我多说一句,团队在讨论技术选型时很容易陷入“谁的算法更先进”的比拼。但在私有化场景里,先进不值钱,稳和可控才值钱。这也是为什么我会把“可维护性”和“故障边界”放在选型模型的前面,而不是一上来就比模型参数。理解了这一点,再看下面两部分的技术拆解,就不会被名词带偏。

2. RAG 和 Lucene 各自的能力边界与技术画像

在选型之前,还是得把两套方案各自的工作原理完整看一遍。我不打算贴很长的源码,但会把核心链路、关键参数、常见开源实现都讲清楚,这样你在自己的项目里才知道该怎么调、调哪里。

2.1 RAG 的完整链路拆解

RAG 全称是 Retrieval-Augmented Generation,检索增强生成。它把知识库问答拆成了五个环节。第一是文档切分,把一篇篇知识文档切成适合检索和喂给大模型的小块,这个步骤的粒度直接决定后续效果,切太大容易混入无关信息,切太小又丢失上下文。第二是嵌入向量化,把每个文本块转成一个几百维的向量,这一步依赖 embedding 模型,常见的有 BGE、text2vec 等。第三是向量存储与检索,用 Milvus、Qdrant 这类向量数据库,通过余弦相似度或内积找到最相近的候选块。第四是提示词组装,把用户问题与检索到的候选块组合成一个 prompt。第五是大模型生成,让 LLM 基于检索到的内容生成自然语言答案。

这套流程的优点很明显:它对语义的容忍度极高,“我上个月买的东西怎么退”和“退货流程”在向量空间里的距离非常近,即使没有出现任何一个关键词也能命中。这也是为什么很多人觉得 RAG 是知识库的未来。但 RAG 绝不是没有代价。首先是组件太多,每多一个环节就多一个故障点,embedding 模型要部署、向量库要维护、LLM 要有推理服务;其次是一旦检索结果质量差,大模型就会基于错误内容一本正经地编答案,也就是幻觉问题。很多团队把召回率低误判成“大模型能力不行”,其实问题往往出在切分策略和 embedding 模型选型上。

现在的开源生态已经很成熟,不想从零搭可以直接用 Dify、RAGFlow 这类平台,它们把切分、向量化、检索、提示词编排都串成流水线,适合快速做 POC。我建议有条件的团队先拿历史客服对话记录跑一遍 POC,把“切分粒度、向量模型、Top K”几个关键参数都试一遍,再决定要不要全量投入。如果要做私有化交付,还要额外评估这些平台在离线内网环境下的安装难度、版本升级节奏和团队熟悉度,这些都是隐形成本。

2.2 Lucene 的索引与检索原理

Lucene 是 Apache 开源的一个 Java 全文检索库,从 2000 年左右发展到现在,已经非常成熟。它核心的数据结构是倒排索引:把每篇文档切成一个个词项,然后记录“每个词出现在哪些文档里”。这个设计让“包含某个关键词”的查询可以在毫秒级完成,而不用像数据库那样全表扫描。你可以把它理解成书后面的索引页,你想找“退款”这个词,翻索引就知道在哪几页出现,根本不需要从头到尾读书。

在排序上,Lucene 默认使用 BM25 算法,核心思想是:一个词在某篇文档里出现得越多,这篇文档越相关;但这个词在全部文档里出现得越频繁,它对区分文档的贡献就越低。标准参数 k1 通常是 1.2,b 通常是 0.75,前者控制词频的饱和程度,后者控制文档长度归一化的力度。大多数业务场景用默认值就够了,不需要过度调参。中文场景下,分词是关键,可以用 IK Analyzer、HanLP 这类分词器,否则“人工客服”会被切成“人工”和“客服”还是被识别成完整词汇“人工客服”,直接决定匹配效果。Lucene 在 Java 技术栈里集成非常顺,尤其是在 Spring Boot 项目里加一个 Lucene 模块,管理索引目录、做定时重建、提供检索接口,都是很成熟的写法。

当然它的短板也很明显:纯粹依赖关键词的精确匹配。用户说“我东西坏了想换”,文档里写的是“商品退换货政策”,如果分词后没有任何共同词项,BM25 再强也召回不到。为了解决这个问题,传统做法是维护同义词表、编辑距离纠错、查询改写,这些都需要持续投入人力去运维词库。所以 Lucene 不是不能做客服知识库,而是它需要你预先投入大量规则工程,才能覆盖真实用户千奇百怪的问法。

2.3 一张表看清两者的本质差异

我习惯把关键差异整理成一张对照表,每次跟团队讨论选型就先过一遍这个表。

维度RAG(向量检索 + LLM)Lucene(关键词全文检索)
匹配方式语义相似度,不依赖关键词词项精确匹配,依赖分词和词表
排序算法余弦相似度 / 向量内积BM25 等词频统计算法
问法泛化强,同义改写、口语化都可以处理弱,需要同义词、纠错、查询改写补充
答案生成LLM 生成,回答自然但可能幻觉返回原文片段,不会编造但生硬
硬件依赖需要 embedding 和 LLM 推理,建议 GPU普通 CPU 机器即可
组件数量多:向量库、embeddings、LLM、编排层少:Lucene 库 + 索引目录
知识更新需要重新切分、重新 embedding、更新索引局部更新文档即可
可解释性弱,模型推理过程黑盒强,命中词项和文档可直接查看
错误模式一本正经编造、检索错误被模型放大召回不到、问答生硬、依赖词表覆盖
私有化交付成本高,部署链路过长低,几乎零额外依赖

这张表基本可以覆盖大多数人在选型时关心的点。需要说明的是,RAG 的“强泛化”和“高成本”是一体两面,Lucene 的“稳定可控”和“词表维护负担”也是一体两面。接下来我们把私有化场景再往里推一层,因为这才是很多项目最终走向混合架构的根本原因。

3. 私有化部署的特殊约束,才是选型真正的分水岭

很多技术方案在公有云上运行很正常,但一落到私有化部署就变味。客服系统尤其典型,客户是政企或大型民企,对数据敏感度高,往往明确要求“不在公网上传业务数据”,甚至整个系统跑在隔离内网里。这些约束直接决定技术选型的空间,也让“RAG 还是 Lucene”不再是一个纯技术问题。

3.1 硬件与成本:GPU 不是默认选项

先算一笔硬件账。一个中等规模的客服知识库,假设有 5 万篇文档,切分成 30 万到 50 万个 chunk。光做 embedding 这一步,如果用 CPU 跑,一个文本嵌入模型可能要跑好几个小时到一天;如果客户只有一台 16 核 32G 的普通服务器,还要同时跑 Web 服务、数据库、中间件,那向量化任务基本做不动。而 LLM 推理更是大头,就算用 7B 或 13B 的小模型,也要至少一张 16G 以上显存的显卡,才能保证并发在个位数时响应不让人崩溃。很多私有化项目的预算里根本没有 GPU 这一项。

这带来的影响是:如果坚持上完整的 RAG 链路,你可能要帮客户额外申请算力采购,导致整个项目周期延后,甚至因为成本问题被砍掉。而 Lucene 在同样一台服务器上,只需要 JVM 堆内存和一块磁盘,索引构建是纯 CPU 任务,单点故障也容易处理。所以我一直强调:选型之前先确认客户的硬件清单,而不是先在架构图上画模型服务。真实项目里,硬件清单往往比技术选型报告更能决定方案走向。

3.2 知识更新、权限体系与可解释性

私有化客服系统的另一个特点是知识库与业务系统强绑定。客服知识不是一篇文章发出去就完事,而是由运营后台维护,可能每小时都在变:旧的优惠活动下线、新的规则上线、某个产品的售后政策调整。使用 Lucene 时,更新一篇文档就是删除旧文档、写入新文档、刷新索引,粒度很细。而 RAG 链路里,文档一变,对应的 chunk、embedding、向量库里的旧向量都要处理,重算成本高,而且还可能出现“模型回答引用了旧版本内容”的尴尬情况。

还要考虑权限。很多客服系统里,不同角色只能看不同范围的知识,比如 A 产品的客服不应该看到 B 产品的内部政策。Lucene 可以在索引里保存权限字段,查询时强制加入过滤条件,实现非常直接。RAG 的权限控制就麻烦得多,要么做索引隔离,要么做结果后置过滤,而结果过滤在向量检索阶段可能会漏掉本来应该命中的内容。至于可解释性,客服场景一旦出现客诉,就需要翻出“当时系统基于哪一篇文档回答了用户”。Lucene 可以直接给你命中的文档 ID 和关键词,RAG 加 LLM 生成之后,中间隔了一层模型,追溯的成本高不少。这些问题在公有云上容易被忽略,私有化交付时却都是验收清单上的硬指标。

3.3 一套可用的判断框架

根据这些约束,我自己在实际项目中逐渐形成了一套判断框架,供你参考。

  • 客户的回答必须原样引用知识库内容,比如政策条款、法律文书、产品参数,优先 Lucene,不做 LLM 生成;
  • 知识量小、问题类型高度标准化,比如常见 FAQ 场景,Lucene 加同义词就够,没必要上 RAG;
  • 客户硬件宽松、有 GPU、知识文档量大且用户问法非常口语化,可以上 RAG;
  • 大部分项目,最后都走混合路线:Lucene 负责精确召回和兜底,向量检索负责语义扩展,LLM 只做“基于检索内容改写”;
  • 如果客户明确要求回答必须附上来源链接,Lucene 的结构化字段天然占优势,RAG 需要额外设计引用机制。

这套框架不是什么高深理论,就是我在项目现场反复试错后沉淀下来的经验。你可以把它当成一个选型清单,每条都能对应到具体的业务和硬件条件,而不是凭感觉拍脑袋。接下来我把混合路线的具体实现展开讲,这是目前我认为在私有化客服场景里最稳的做法。

4. 混合架构实践:双路召回加生成,落地最稳

前面讲了那么多原理和约束,现在落到真正能抄的作业。我这几年的项目里,最终跑通并能交付给客户的知识库方案,基本都是混合架构。下面完整拆解一遍,包括各部分的分工逻辑、关键代码和一个可以拿去评审的架构模型。

4.1 为什么我不建议二选一

最核心的原因是:关键词检索和向量检索在错误模式上完全互补。Lucene 的缺点是“语言一变就找不到”,向量检索的缺点是“对精确数字、型号、专有名词不敏感”。比如用户问“订单号 SO20241001 怎么还没发货”,向量检索很容易把 SO20241001 当一个普通 token 忽略掉,从而召回一堆泛泛的物流问题;Lucene 却能精确捕获这个订单号。反过来,用户问“我买的东西不想要了怎么办”,Lucene 如果文档里没有“不想要”这个词,就完全没办法,向量检索却能抓住“退货”语义。

所以最稳的做法是,两条路同时走,先各自召回一批候选,再做融合、重排,最后决定是直接给用户看原文片段,还是让大模型基于这些片段组织答案。这样既能保证精确信息的命中,又能覆盖口语化表达。这个思路并不新,业内管它叫 hybrid search,在 Elasticsearch 里也早就支持了,只是很多团队没有把它放到私有化客服系统的选型中来。

4.2 一个可复用的四层架构

我常用的架构分四层,每层职责很单一,出了问题也容易定位。第一层是召回层。Lucene 用 BM25 跑关键词召回,取 Top 20;同时把用户问题做 embedding,从向量库取 Top 20。两边并行执行。第二层是融合层。把两路结果做归一化和融合,常见做法是对每个候选文档,按排名分数分别做 Min-Max 归一化,再按权重相加,比如 Lucene 分数权重 0.6、向量分数权重 0.4,然后去重排序。这个权重不是拍脑袋,可以先拿一批历史真实问题做评测,调成在数据集上效果最好的值,一般会在 0.5 到 0.7 之间浮动。

第三层是决策与生成层。看融合后的最高分:如果分数很低,说明知识库里根本没有能回答的内容,不要硬编答案,直接把 Lucene 命中的标题或摘要返回给用户看;如果分数足够高,就把融合后的 Top 3 到 Top 5 个候选块拼到 prompt 里,让 LLM 严格基于这些片段生成回答,并要求在回答末尾标注引用来源。第四层是兜底层。LLM 服务不可用、超时、或者返回结果不包含任何候选块 ID 时,自动降级为“直接展示 Lucene 摘要”,保证系统的可用性。这一层很多项目会忽略,但私有化环境里大模型服务不稳定是常态,没有兜底等于拿客服服务当赌注。

更进一步,如果团队有余力,可以把第三层升级为 agentic RAG:让模型根据对话状态自己决定是否需要检索、检索哪类知识,而不是每次固定走同样的检索流水线。这在客服多轮对话场景很有效,用户说完“我买的耳机坏了”,下一句接“那运费呢”,模型应该能自动把上一轮话题和“运费政策”关联起来。不过 agentic 会把链路延得更长,私有化交付时要谨慎评估复杂度,初次落地不建议一上来就做。

4.3 关键代码与配置示例

在 Spring Boot 项目里集成 Lucene 做召回层,代码量不算大,这里给一个最简示例,方便你快速跑通。

// 1. 构造分词器和索引配置,使用 BM25 排序 Analyzer analyzer = new IKAnalyzer(true); IndexWriterConfig config = new IndexWriterConfig(analyzer); config.setSimilarity(new BM25Similarity(1.2f, 0.75f)); Directory directory = FSDirectory.open(Paths.get(kbIndexPath)); IndexWriter indexWriter = new IndexWriter(directory, config); // 2. 写入文档,docId 对应业务主键,title 和 content 用于检索 Document doc = new Document(); doc.add(new StringField("docId", knowledgeId, Field.Store.YES)); doc.add(new TextField("title", title, Field.Store.YES)); doc.add(new TextField("content", content, Field.Store.YES)); indexWriter.addDocument(doc); // 写完记得 commit,否则检索不到 // 3. 检索时,用 MultiFieldQueryParser 同时匹配标题和正文 IndexReader reader = DirectoryReader.open(directory); IndexSearcher searcher = new IndexSearcher(reader); searcher.setSimilarity(new BM25Similarity(1.2f, 0.75f)); QueryParser parser = new MultiFieldQueryParser(new String[]{"title", "content"}, analyzer); Query query = parser.parse(realUserQuestion); TopDocs topDocs = searcher.search(query, 20); for (ScoreDoc score : topDocs.scoreDocs) { Document hit = searcher.doc(score.doc); log.info("docId={}, score={}", hit.get("docId"), score.score); }

这里有两个踩坑提醒。IKAnalyzer(true) 表示智能分词,适合大多数中文客服场景,但如果知识库里有大量专有名词,比如产品型号、英文缩写,最好在索引时配置扩展词典,否则专有名词会被切碎,直接影响匹配效果。另外,索引目录和业务数据库之间建议做版本号同步,不要随便全量重建,否则数据量大了之后重建一次耗时会让你怀疑人生。

向量召回层的代码逻辑相对固定,融合和降级的判断逻辑可以用伪代码表示:

def answer(question): lucene_hits = lucene_search(question, top=20) vector_hits = vector_search(embed(question), top=20) merged = fuse(lucene_hits, vector_hits, alpha=0.6) if not merged or merged[0].score < 0.25: return fallback_direct(merged, reason="low_confidence") context = pick_top_k(merged, k=4) reply = llm_chat( system="你是一名客服助手,必须基于提供的知识片段回答,禁止编造。引用片段编号标注来源。", user=format_prompt(question, context) ) if llm_timeout or not reply.has_source(): return fallback_direct(merged, reason="llm_unavailable") return reply

这段伪代码严格对应前面说的四层架构。实际交付的时候,我还会把 alpha 权重、最低分阈值、Top K 都做成配置项,方便实施工程师在现场调参,而不是每个项目都改代码重新发布。

5. 常见问题与排查经验速查

混合架构不是写完就完事,运行期一定会遇到各种问题。这里把我踩过的坑按症状整理成速查表,以及对应的排查思路,希望能帮你少走弯路。

现象可能原因排查和解决方向
用户换了个说法就搜不到Lucene 分词或同义词覆盖不足看分词结果,补充同义词词典,或提升向量召回权重
订单号/型号能命中但答案不对向量召回干扰了精确信息对含数字/英文型号的问题强制走 Lucene 优先级
LLM 回答内容与知识库不符合幻觉或 prompt 约束不足降低生成自由度,要求引用片段 ID,加后置校验
知识更新后仍回答旧内容索引或向量库未同步更新检查定时任务,保证 Lucene 和向量库同步删除/改写
内网没有 GPU,速度太慢embedding 和 LLM 都在 CPU 上硬跑优先用 CPU 友好的 embedding 模型,LLM 换成小模型;不行就砍掉生成层只用 Lucene
并发一高响应就超时大模型推理并发瓶颈加队列、缓存高频问题答案,或者直接降级到 Lucene 摘要

5.1 语义相近表达搜不到,先查分词而不是换框架

我遇到最多的问题,就是业务方反馈“用户说 X,库里明明有 Y 的知识,怎么答不上来”。第一反应别是换 RAG,而是先去 Lucene 的 analyze 接口看分词结果。很多时候是自定义专有名词被切碎了,比如“七天无理由退货”被切成了“七天”“无理”“由退货”,导致用户问“退货规则”时匹配不到。把这类词加进扩展词典,召回率立刻就能上一个台阶。分词解决不了的,再交给向量召回兜底。

这个排查步骤看起来简单,但很多团队一上来就怀疑算法、怀疑 BM25 参数,折腾半天发现就是词典没配好。所以我建议,项目初期就建立一套标准动作:记录失败的 query、查看分词结果、检查词典、调整查询权重,把问题分类之后再谈换不换方案。这样既能控制排查成本,也能让团队对系统有更深的理解。

5.2 LLM 编答案,核心是约束引用

大模型幻觉在客服场景是直接事故,不能用“偶尔犯错”来糊弄。我的做法是三层防线。第一层,prompt 里明确写“只基于给定的知识片段回答,禁止使用内部知识”,这个约束能挡住一部分编造。第二层,要求模型输出时带上引用的片段编号,让回答变得可追溯。第三层,在后端解析模型输出,如果引用的片段编号不在实际检索结果里,或者模型输出里出现了检索结果中完全不存在的实体,就拒绝这条回答,走降级流程。

实测下来,第三层最管用,但代价是需要一点工程工作,要写一个结果校验模块。如果项目周期紧张,至少保证第一层和第二层。这个校验模块其实不复杂,就是做字符串匹配和 ID 比对,但它能拦截掉绝大多数“看似合理、实则编造”的回答,对客服这种容错率很低的场景特别重要。

5.3 索引与数据一致性,靠双写和版本号

私有化客服系统里,知识库往往还有运营后台在改数据。Lucene 索引和业务数据库之间很容易出现不一致,表现为“后台改完了,客服机器人还在说旧话”。我后来的标准做法是:在业务表上增加版本号字段,后台每改一次知识就自增版本号,定时任务每分钟扫描变化记录,同步到 Lucene 和向量库。对 Lucene 来说,更新操作就是 deleteByQuery 加 addDocument。对向量库来说,要先删旧向量再插入新向量。

这里要特别提醒:同步任务必须要加失败重试和监控告警。私有化环境的依赖很多,数据库偶尔抖动、磁盘偶尔写满,任何一个环节失败,如果没被及时发现,索引和业务数据就会悄悄拉开差距。我见过一个项目,索引同步任务断了三天没人发现,客服机器人天天回答过期政策,客户差点因此投诉到总部。加一个简单的告警,把“同步延迟超过 X 分钟”发到运维群,就能避免这种问题。

5.4 没有 GPU 的私有化环境,怎么跑 RAG

纯 CPU 环境不是完全不能跑 RAG,只是要注意模型选型。embedding 模型可以选 bge-small、text2vec-small 这类轻量的,量化之后在 CPU 上也能跑,单个问题几毫秒到几十毫秒,完全能接受。生成模型就很痛苦,就算用量化后的 7B 模型,在 CPU 上生成一句话也要好几秒,体验很差,客服坐席根本等不起。

所以我的建议是:CPU-only 环境里,用轻量 embedding 做向量召回,生成层直接关掉或用规则模板拼接,先保证客服回复可用,而不是追求“像人一样自然”。等客户后续采购 GPU,再打开 LLM 生成层,架构上提前预留好接口切换就行。换句话说,混合架构的好处在于,每一层都可以按客户条件独立开关,而不必为了没 GPU 就把整套 RAG 方案推翻。

我在实际项目中走了不少弯路。最早我也迷信 RAG,觉得一套大模型方案能解决所有客服问题,结果在私有化客户那里被硬件、权限、可解释性轮番教育。后来老老实实把 Lucene 的 BM25 参数、分词器、索引生命周期管理捡起来,再让 RAG 只承担语义扩展和语言组织的工作,整个方案才真正稳下来。

所以如果你也在做类似的选型,我个人最诚恳的建议是:不要被“新技术更先进”的情绪带跑,也别因为“老技术太土”就一票否决。先把客户的硬件、知识特点、回答准确度要求列清楚,再决定 RAG 和 Lucene 各承担多少责任。大多数客服知识库项目,最后都会走向混合检索加降级兜底的路子。这条路不算惊艳,但交付和后续维护的时候,你会感谢自己当初做的这些保守决定。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询