把知识库"连上"机器人只是第一步,问答是否专业取决于检索质量。同样一份知识库,检索做不好,机器人的回答就会出现"引用了但没引用对""答非所问却语气笃定"的问题。专业问答的技术核心是RAG检索链路的四个环节。

一、切块策略——检索质量的起点

知识库文档不能整篇丢给模型,要先切块(chunking)。切块粒度直接决定检索精度:块太大,一个块里包含多个主题,检索命中后噪声多;块太小,知识被切散,模型拿到的上下文不完整。

实用做法是按语义边界切块——以标题和段落为天然分界,每块控制在300-500字,并给每块带上所属文档的标题路径作为上下文前缀。产品文档按"一个功能点一块"切,FAQ按"一问一答一块"切,两种结构不混用。

二、混合检索——向量与关键词互补

纯向量检索擅长语义匹配("退货"能匹配到"退换货政策"),但对专有名词和精确参数无能为力——用户问"wId",向量检索可能返回一堆语义相近但不含wId的内容。纯关键词检索则相反,精确但不懂同义词。

生产环境用混合检索:向量检索和关键词检索各取Top10,合并后按加权分数排序。专有名词、错误码、参数名走关键词通道,自然语言问题走向量通道,两路结果互补。

三、重排序——从20个候选里挑3个最相关的

混合检索召回的20个候选块,直接取前3个喂给模型仍然粗糙。加一层重排序(Rerank):用交叉编码模型对"问题-候选块"逐对打分相关性,按精确分数重排,取Top3。

召回模型追求速度(双塔结构,毫秒级),重排模型追求精度(交叉编码,逐条精算)。两层分工是检索质量跃升的关键——实际项目中加重排后,答案相关性通常能提升15%-25%。

四、引用溯源——专业问答的可信度底线

专业场景(技术支持、医疗法律咨询辅助)要求回答可溯源:每个结论标注来自哪个文档的哪一段。程序实现上,模型生成回复时要求标注引用编号,引用映射到检索块的来源文档;最终回复附带来源列表。

溯源的价值不只是可信——用户发现引用错误时能直接定位是哪个文档的内容有问题,知识库维护有了反馈入口。

四环节对照

环节

作用

做不好的表现

切块

决定检索单元

噪声多/上下文残缺

混合检索

语义+精确互补

专有名词检索不到

重排序

精选最相关内容

引用了但没引用对

引用溯源

可信度与反馈

无法核实答案来源

RAG链路实现

class ProfessionalQA:
    def answer(self, wxid, question):
        # 环节1+2:混合检索召回20个候选
        vec_hits = self.vector_search(question, top_k=10)
        kw_hits = self.keyword_search(question, top_k=10)
        candidates = self.merge_weighted(vec_hits, kw_hits)

        # 环节3:重排序精排取Top3
        ranked = self.rerank(question, candidates)[:3]
        if ranked[0]["score"] < 0.55:
            return "这个问题我需要帮您转接专业人员确认。"

        # 环节4:带引用生成
        context_blocks = []
        sources = []
        for i, c in enumerate(ranked, 1):
            context_blocks.append(f"[{i}] {c['text']}")
            sources.append(f"[{i}] {c['doc_title']} "
                           f"第{c['section']}节")
        prompt = self.build_prompt(question, context_blocks)
        answer = llm_chat(question, prompt,
            system="基于资料回答,结论后标注引用编号[N],"
                   "资料中没有的信息明确说不知道")
        return f"{answer}\n\n—— 参考来源 ——\n" + \
               "\n".join(sources)

    def vector_search(self, q, top_k):
        emb = self.embed(q)
        return self.vdb.search(emb, top_k=top_k)

    def keyword_search(self, q, top_k):
        # 错误码/参数名等精确词强制走关键词
        terms = extract_terms(q)  # wId、1004等
        return self.fts.search(" ".join(terms), top_k=top_k)

落地建议

四个环节按收益排序投入:切块和混合检索先做(决定基础质量),重排序第二(单项提升最大),引用溯源最后(专业场景必需,普通客服可选)。调优时不要只看模型回复,要单独统计检索命中率——80%的"答得不好"问题出在检索环节而非生成环节。知识库内容通过微信消息回调持续沉淀,接口接入方式参考Eyun开发文档

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐