本帖最后由 森林 于 2025-4-11 21:24 编辑
深信服IT部RAG问答机器人实践过程与技巧分享 一、概述RAG(Retrieval-Augmented Generation)问答机器人是一种结合信息检索(Retrieval)与生成模型(Generation)的智能问答系统。其核心是通过检索外部/内部知识库获取相关上下文信息,再基于这些信息生成更准确、可靠的回答。 1.1 问答机器人的背景痛点 1. 数据孤岛与知识碎片化,企业内部文档(产品手册、技术资料、合同等)、业务系统数据分散,员工或客户难以快速获取有效信息。 2. 传统客服成本高人工客服培训周期长,重复性问题(如订单查询、退换货政策)占用大量人力,且响应速度受限。 3. 知识更新滞后企业业务规则、产品信息频繁迭代,但传统FAQ或知识库更新依赖人工维护,容易与实际情况脱节。 4. 安全与合规压力直接调用通用大模型(如ChatGPT)可能泄露企业敏感数据,且无法保证回答符合内部合规要求。 5. 跨部门协作障碍销售、技术、售后等部门知识体系割裂,员工难以快速获取跨领域信息。
1.2 构建问答机器人的核心驱动力 1. 降本增效减少员工跨系统搜索时间,提升知识复用效率。 2. 业务敏捷性通过更新检索库(而非重新训练模型)快速响应市场变化,例如政策调整、产品升级。 3. 数据资产化将分散的文档、对话记录等非结构化数据转化为可检索的知识,释放数据价值。 4. 风险可控性限定检索范围为内部知识库,避免生成外部不相关或违规内容,保障数据安全。支持审计追踪(如记录答案来源),满足合规要求。
二、RAG问答机器人构建的关键步骤和经验技巧,整个应用构建过程分六大步骤: 材料准备与整理 > 知识清洗与入库 > 创建RAG问答应用 > 知识检索配置 > LLM模型选择 > 问答效果的调优
2.1 材料的准备与整理 首先我们需要确认我们的智能问答所涉及的知识范围,在这里我们准备了比较常见的3种类型的知识 2.1.1 文件内容 在企业工作流程中会生产出非常多知识,如:产品手册、操作手册、白皮书等各种知识,我们需要将涉及的知识提前进行收集分类(可先按业务特性进行分类),这里我们的知识全部按产品线进行了分类,相关的文件如下示例: 2.1.2 QA问答对 日常工作中有整理或有其他途径沉淀下来的FAQ知识,这里我们准备了历史我们使用传统问答机器人沉淀下来的FAQ知识
2.1.3 企业网站 公司建设的企业知识库、论坛社区等平台,这些平台往往积攒着非常多的企业或产品知识,我们可以圈定好,这些平台的哪些知识需要加入到问答知识库中,举例如:深信服技术支持平台的帮助文档的相关知识:
2.2 知识的清洗与入库 2.2.1 文件内容入库 1)知识库创建:在这里我们创建一个知识库,选择文本文档类型,用于上传我们的文件
2)文件上传(清洗与分片): l 上传文件:在这里我们选择准备好的文件进行上传 上传后有3个关键步骤配置,对后面的问答效果产生直接的影响 l 文件分片: 分片的原因:我们正常的一份文件会有非常多的内容,内容中讲了各种各样的知识,但由于LLM模型本身有上下文(token)上限,所以当用户提问时,我们通常不会直接给整个文件内容给到模型进行分析,而是选择提前将文件分成多个片段,当用户提问时,搜索出与用户问题相关的片段给到模型进行推理回答。 分片时考虑的要素: 切分方式:我们可以按指定的方式进行切片,常见的比如用句号或者在换行的地方进行切分,以确保切出来了片段具备一定的完整性。如果你的文件内容存在一定的特征也可以按指定的方式进行切分。 分片长度:指的是每一份片段的长度,如果分片大长,那么对于后续token的损耗也会比较大(假设我们的上下文上限是5000,那么一个片段如果是1000,那最多只能放5个相关的片段参与分析,但如果每个片段是500,那我们就可以放10个片段进行分析,从而提高最终输出答案的完整性和全面性),但如果分片太短,导致我们切出一个片段不能完整的描述好一件事。那么最终输出的答案可能会导致回答不全。在这个阶段我们可以根据我们文件的内容编写的方式来选择合适的大小。 分片重叠度:指的是一个片段和上一个片段重叠内容的多少。当我们按句号或换行切分时,有可能会把一段完整的内容切成两部分,一定量的重叠度能保证内容的完整连续。
这里预设了默认的智能切分,如果这里我们不确认应该怎么分片,可以选择默认的分片策略(默认策略内置了多个维度方式进行分片)。 l 知识清洗 文档内容中可能会存在一些干扰内容或敏感内容,这些内容可能会导致干扰或泄密,我们可以根据自己文档内容的特性进行勾选清洗。 l 知识增强 这里开启相关的策略,可以识别图片内容、总结段落概要都能提升我们后续知识检索的准确性(建议开启) 截止到这里,我们完成了文档知识库的创建。
2.2.2 QA内容入库QA内容入库相对简单,这里我们创建知识库的时候,直接选择FAQ问答对的类型进行创建,这里可以下载示例文件,填充内容后上传导入,导入成功后,可以看到已经导入的FAQ知识。
2.2.3 企业网站入库a)在这个环节,需要进行一定量开发,我们通过编写功能直接读取企业知识库/网站的数据库,获取到里面帖子或文章的内容,如果我们的文章内容不长,我们可以把整个文章做为一个完整的片段,反之可以参考上述的文件分片时考虑的要素自行分成多个片段。 c)若文章内容中包含了文件,我们也可调用API将文件上传至知识库 PS:建议可以设置定时任务,将网站更新的内容及时同步至知识库,实现知识自更新 截止到这里,我们完成了所有知识库的构建
2.3 创建RAG问答应用 在我的应用这里可以选择"智能 RAG"类型,创建RAG智能问答机器人
2.4 知识检索配置 作用:知识检索这个环节,主要是根据用户的问题,从我们的知识库中搜索出最匹配的知识片段内容。 添加知识库:创建完成后,我们进入到创建好的应用,在这里我们选择知识检索节点,出现的配置框中,将我们创建好的知识库,添加到这个问答流程中。 检索模式: 语义检索:通过理解用户查询的语义意图以及检索内容的语义含义,来实现更精准、更智能的信息匹配和检索 全文检索:根据关键字的匹配进行搜索 混合检索:结合以上两重检索方式(配置权重来进行混合检索召回) 召回数量:需要搜索出来的片段数 召回阀值:指的是召回的知识与问法的匹配程度,越高说明越匹配,如:配置0.85指的是片段和用户问题的匹配度要在0.85以上才会被召回出来 召回重排: ReRank模型是一种用于对初步检索结果进行重新排序的模型或算法,通过对初始检索结果进行二次评估和排序,能够更精准地识别出与用户查询最相关的文档将前面知识检索出来的知识。这里我们可以配置重排召回的数量。 PS:在这一步,我们主要是在知识检索时先搜索出10-30片,再由重排模型做二次排序,取出最符合的5片,用于后续的模型总结推理。 2.5 LLM模型的选择 模型选择:这里选择的模型,是用于根据前面检索到的知识,提供给到模型,让模型读取这些片段信息再根据用户问题进行回答的过程。不同的模型在问答效果上会存在差异,比如:Qwen-32B会进行思考,在回答过程中会讲思考过程输出给到用户,优点是相对准确,幻觉较少,但回答过程耗时会相对较长。 提示词:可以根据业务特色进行调整要求。 进行到这里,我们就可以通过调试初步体验效果。如果效果可以,我们就可以点击发布进行发布后,就可以拿到链接直接访问。 2.6 效果的调优 效果的调优需要根据回答的情况进行针对性的调整,这里可以通过两种方式:1)效果评估结果 2)用户真实提问记录。 2.6.1 数据来源 - 效果评估1)效果调优是一个持续的过程,在前期我们可以通过准备测试集进行评估。测试集需要包含用户问题和准确答案两个维度。如图所示,在对应地方创建并上传测试数据。 2)如图所示创建评估任务,由系统批量测试多个问题,并根据回答的答案与预设的答案对比,由模型评判准确情况及错误原因,评估任务完成后可进行查看准确情况和具体的错误原因 材料准备与整理 > 知识清洗与入库 > 创建RAG问答应用 > 知识检索配置 > LLM模型选择 > 问答效果的调优
2.6.2 数据来源 - 会话日志我们可以在应用的会话日志中找到用户的真实提问记录,查看回答的答案及回答过程每一个节点的输入输出(从这里我们可以分析到是知识检索没检索到知识,还是检索到知识,模型总结的时候有问题)
三:问答机器人调优的经验技巧根据前面的信息来源,我们可以根据不同的情况在不同的环节进行调优,可以按情况尝试通过以下几个步骤进行调整。 1)调整检索配置 如果是有知识,但在知识检索环节就没有检索出来,可以调整检索相关的配置,一定程度上增加知识检索的召回数量,降低召回阀值,可以提升答案的完整度(但会增加token的消耗,也需要评估数量是否会达到模型的token上限),可以视实际情况调整(可配合效果评估调整至合适的数值) 2)调整已入库的知识分片配置 如果有知识未能召回,可以检视文件切片后,相关知识的片段是否完整,可以适当调整文件的分片规则或清洗规则调整后再重新尝试 3)QA知识优化 如果企业本身有FAQ知识,那么通过扩写知识问法与答案优化,也能带来一定程度的提升 l 相似问扩写:可以对QA知识用模型进行相似问扩写,一定量的相似问可以提高知识的召回准确率(建议3-5个相似问),示例如下: l 答案润色:可以对编写的答案由模型进行答案扩写及润色,丰富答案可以提高知识召回准确及优化答案结构
4)提示词的调整 通过调整提示词可以使模型输出不一样的答案(如果知识已经召回,但在最后模型总结时出现错误可以通过此步骤调整) 5)创建近义词库/专有名词库: 如果知识检索已经召回,但在最后模型总结时不理解某些词汇而出现错误可以通过此步骤调整。 近义词:指当业务场景中包含多种表达的语言时,可建立近义词库,作为补充信息传递给大模型,帮助其理解语义,提高回答准确率。例如“人工智能”与“AI”被设置为近义词,那么生成回答时,在检索信息中遇到这两个词,模型就可以理解其为近义词,更准确地回答。 专有名词:当业务场景中包含一些特定的专有名词时,可建立专有名词库,帮助应用准确理解语义。例如“提示词”在 AI 应用的业务场景中,指的是用来引导或激发模型产生特定输出的输入文本,那么生成回答时,在检索信息中遇到“提示词”,模型就可以理解其含义,更准确地回答。
6)LLM模型调整 可以尝试调整不同的模型及不同的模式进行效果验证
7)上下文关联推理 上文对话轮次指的是当用户提问,模型总结分析答案时,带上前N个问答记录,方便模型根据你上下文的聊天记录来推理用户真实的意图,更好的回答用户的问题。
8)知识分类(问法意图识别) 我们可以通过给知识内容做分类,当用户的问题包含指定特征的时候,只检索对应类别的知识,举例:深信服有多个产品的知识,不同产品可能有相同的知识内容,如:怎么重置密码?、部署模式有哪些等等,如果全部知识混在一个知识库里,会造成一定的干扰。 l 我们先给知识本身打上产品线的标识,再进行入库,如果是一些通用知识,我们可以不标注产品线 l 其次我们可以梳理一些产品线识别词,当用户提问时,我们可以是检视用户问题中是否包含了配置的词汇,举例用户问题为“AC怎么重置密码”,这里面包含了“AC”这个词,我们在知识检索召回的时候,就可以只检索召回AC相关的知识+通用的知识。
9)生成子问题 当用户提问时,我们可将用户问题进行改写、拆分、替换等方式,生成多个用户问题
改写:根据上下文的记录,来推理用户的真实问题,举例:用户第一个问题问的是“AC支持哪些部署模式?”,第二个问题是“哪个好?”,那么模型推理的改引起的问题就是“AC部署模式哪个好”,改写后的问题更利于我们从知识库中检索相关知识。 拆分:当用户问一个复杂问题我们同样也可以拆分成多个子问题,举例:当用户问题问的是”单网桥部署和多网桥部署有什么区别“,那么我们通过模式推理出来的多个子问题,拆出来子问题,再进行知识检索,得出来相关的知识片段给到模型再进行总结。 替换:前面我们提到了近义词,相同原理,我们在生产知识的时候,编写的材料可以有多种写法,如:”AC“ 也叫 ”上网行为管理“,那么有的材料写的是AC,有的材料上写的是上网行为管理,当用户提问时,如果有这些词,我们也会进行替换生成一个新的问题,举例如:”AC怎么重置密码“,替换后为”上网行为管理怎么重置密码“,这样在知识检索的时候,可以召回更多匹配精准的信息。
通过上面的步骤,我们会有一个原问题,和多个子问题,这些问题同时都去知识库进行检索,检索出来的知识再给到模式去总结推理,可以提高我们回答的准确率
10)用户引导优化 通过上面的步骤的优化,当问题比较清晰明确时,都能回答正确的答案,但往往用户提问时,很大一部分用户不善于提问,咨询的问题往往会”意图不明确“,这就导致我们的知识检索及模型推理无法回答用户真实想问的问题,我们可以通过以下几种方式进行优化。 l 欢迎语:将产品热门知识通过欢迎语的方式配置在页面上,让用户可以通过点击的方式进行咨询 l 输入联想:可以将我们录入的QA中的问法,在用户输入问题时,作联想提示,用户可以通过选择/点击快速提问 l 关联问法:当回答用户提问后,我们可以适当推荐几个相关的问题,让用户可以进行点击提问 经过统计,我们有30%左右的问题是用户通过点选的方式进行提问,所以做好引导也是机器人解决问题能力提升的一个重要举措 |