LinkAI RAG知识库平台优化之路

news/2024/9/21 1:34:00/文章来源:https://www.cnblogs.com/visionwpc/p/18335605

基于知识库的RAG(Retrieval-Augmented Generation, 检索增强生成)作为当下主流的AI智能体应用技术之一,为解决大语言模型在问答交互场景下存在的不足(知识的局限性、滞后性以及幻觉等问题)提供了解决方案,也让AI大模型在专业领域(尤其是企业应用场景)的落地应用、满足真实的生产需求和业务场景成为可能。

选择一个功能丰富,体验友好的知识库平台至关重要,经过持续的迭代优化工作,LinkAI知识库能力在检索前、检索中和检索后等方面均得到显著提升,对于有数据保密要求的企业也可以提供私有化部署。

即刻体验:快速开始;LinkAI官网:LinkAI

编组 53

知识库导入

检索前的重要步骤之一便是知识库的内容导入,这包括文件的上传、解析、内容切分和向量化存储。将各种私有知识有序、合理地导入知识库,是后续获得知识库问答良好效果的重要前提。

多种内容格式

LinkAI知识库现支持导入:

  • 无结构文档
  • Q&A问答对
  • 多列表格
  • 网站内容

在导入文档时,支持导入PDF、docx、txt、md等格式的文件,自动解析分段,使用方便;导入问答对时,可将一问一答格式的CSV进行导入,问答时的精准度更高,后续也更易于维护;导入表格时,则可将多列的Excel或csv表格直接导入,并支持按列检索,非常适合导入多属性的列表型产品信息

内容分段及预览

当我们导入无结构的内容(文档、网站)时,为了避免文档过长给知识检索带来的影响(索引混淆,核心知识在信息中占比较小,导致按索引检索时无法命中关键数据;大模型token过长截断导致语义不完整等),我们需要将无结构的文档内容进行切分。

在切分时,针对不同类型文档的特性我们定义了不同的分割器,并按照分割符和分块长度进行切分。再设置冗余字符和相邻段落衔接句字重复的策略,来避免句子被截断的问题,使一个完整的句子保留在同一个段落中。

另外,在默认分段字符长度(600 tokens)的基础上,用户可根据文档特点和需求手动调整分段长度并再次预览分段,从而调整至相对最佳状态。整个分段过程实时预览,清晰可见

Snipaste_2024-07-28_17-09-47

增强解析

需要导入的PDF、docx文件时一般都是无结构的文档,除了排版不规范外,常常还会在文件中带有图片和表格。

增强解析功能为加强对无结构文档的解析能力而推出,针对PDF、docx和md文件,除文字以外,可对图片和表格自动提取解析,并可在分段中直接预览后导入。

导入后文档中的图片可作为附加素材直接参与到答案生成中(可参考「素材发送」部分),而表格则以Markdown格式存储可支持行列检索(可参考「表格导入」部分)。

Snipaste_2024-07-28_16-49-37 Snipaste_2024-07-28_16-50-12

表格导入

结构化的多列表格是使用场景中(例如多sku多属性值的产品信息表)非常见的知识格式。支持好表格知识的录入是RAG应用承载更多业务场景落地的重要前提。

表格型知识库使用了多列索引+单行检索的模式。在知识库表格导入时,默认会将表格中所有的列作为索引列(即参与检索的列,指的是用户提问时会将用户问题和该列的内容进行匹配),也可手动将列调整为非索引。另外可编辑修改列的名称,列名会在大模型答案生成的过程中起到重要的“语义解释”作用,设置一个含义清晰的列名能够让AI更好的理解该列的内容。而在检索时,则通过列数据匹配得到行数据。

knowledge_table

以上图场景举例:导入QS大学排名表格后,设置“学校英文名”一列为非检索列,其余三列均为检索列,当用户提问中涉及“牛津大学”时,会将用户问题与“排名”、“学校名称”、“类型”三列的内容进行检索匹配,则可检索到第三行数据“2,牛津大学,University of Oxford,QS200”,那么在AI回复用户时,这一整行数据都会用于回复的生成

同时,多列索引+单行检索模式可支持跨列检索,即提问“排名为第1名的学校中文名”和“排名为第1名的学校英文名”,可分别得到答案“麻省理工学院”和“University of Oxford”。在实际应用场景中举例,假设用户提问“推荐一款红色的衣服”和“推荐一款M码的衣服”,都能够命中“颜色:红色;尺码:M码...”这条知识库中的商品信息。

网站导入

网站导入功能支持很方便地将企业官网、产品介绍、博客、公众号文章等静态网页资源快速导入知识库中,搭建知识库问答智能体。支持将批量独立网址链接粘贴后一键导入知识库,还支持直接输入网站地图URL一键自动获取网站下所有页面的内容并导入知识库。

与导入文档类似,系统会自动结合分段长度和标点符号、语义将长文本拆分成多个段落,方便建立索引进行检索,在右侧可以看到解析得到的每个网页名称,以及网页中内容拆分效果的预览。

knowledge-webinput

对于定期会更新的网站,我们即将支持设置定时获取网站内容以更新知识库的能力

知识库的导入非常重要,是RAG有效应用关键的第一步。基于我们过去的工作,使得LinkAI在多格式、多来源知识文档的解析,后续检索环节的前置准备等方面不断优化提升,很好地满足了客户及用户的业务需求。

知识库检索

语义向量检索

导入知识库内容后,在实际问答场景中的RAG检索主要基于语义向量检索实现,即使用模型对导入的每段文本建立索引的向量,再使用同一模型将用户的每次提问进行向量化,从而进行向量之间的匹配,得出吻合度相对最高的结果。

绝大多数问答场景下,基于向量检索都可以得到比较好的检索结果,从而生成高质量的回复,在一些特殊场景下则需依赖增强检索模式。

增强混合检索

为提升知识库问答的效果,我们上线了增强检索模式。增强检索是将语义检索全文关键词检索混合增强的模式,能够大幅提升一些特殊场景下(如对姓名、字母、数字、型号等文本的提问)的检索和回复效果。

提问及答案中包含例如姓名、字母、数字内容时,使用关键词匹配往往会有比向量匹配更好的效果(对于部分短词、符号,其向量往往无法反映真实的语义)故将向量检索与关键词匹配结合起来使用,可较为完美地覆盖常规提问和特殊提问的需求。

123

当然,经典的关键词检索方式也有弊端,即文本间的强匹配可能会给大模型生成回复带来噪音(例如用户提问中的无实义常用语匹配到同样包含这些词汇的知识库内容,造成错误回复)。为解决这一问题,LinkAI设置了过滤词库机制,将此类词汇从关键词检索范围中剔除。

检索测试

知识库导入后,检索时的工作过程往往是“黑盒”的(向量匹配相似度的不确定性以及大模型生成回复的不确定性)为了将这一过程尽可能的白盒化,我们可以通过模拟用户提问的方式来观察检索过程。

检索测试可通过模拟用户提问查看问题在知识库中的检索结果,支持按 语义检索 和 增强检索 两种模式进行测试,可查看不同提问检索到的前20条(语义检索、关键词检索各10条)知识库语料以及对应相似度。

Snipaste_2024-07-29_20-12-16

基于检索测试可以在回答不符合预期时查看该提问与预期的知识库语料之间的向量匹配相似度,也便于为用户提供配置知识库语义检索相似度阈值的参考依据。

当然,RAG检索在实践中还有很多范式的变种,例如模块化并行检索,加入记忆模块参与检索,加入搜索引擎内容参与检索等等。同时,LinKAI在自研的AI搜索、内容总结、拟人对话等功能和场景中广泛使用和进行了RAG相关的多种技术优化实践,因不涉及知识库功能便不展开阐述。

知识库答案生成

对于一次对话而言,知识库检索完成后便进入答案生成的环节,该环节是将检索结果、用户提问等内容结合LLM大语言模型能力进行智能生成的过程,也是用户接收到答案前的最后一道工序,对于最终回答的生成至关重要。

检索结果加工

在前序环节中,取决于检索策略配置(语义相似度阈值、检索模式、检索条数等)会得到多条检索结果,其中可能包含重复的知识库语料(分别通过语义检索和关建词匹配检索得到,或同一语料重复录入),便需要进行去重加工。另外,多条知识库语料给到大语言模型的顺序也至关重要,包含了同样是语义检索、但向量匹配相似度不同的语料之间的排序;以及关建词检索结果与语义检索结果之间的排序。不同的排序方式对于大语言模型的理解和生成都可能会带来不同的影响,故需引入重排策略进行调控。

降噪及严谨性控制

当通过上述手段确定可以使用的检索结果后,依然还可能会面临“可用性”问题。那就是检索结果可能与用户提问之间并无关系(部分短词、符号,其向量往往无法反映真实的语义,但增强检索又只能检索到文本极其相似但实际含义完全不同的内容,如型号、标号相近的产品信息),这时候如果直接将检索结果提供给模型,相当于引入噪声,从而干扰问题的准确回复。

所以在此之前还需要对检索结果进行最终降噪,实现方法是使用大语言模型对检索结果和用户提问进行前置比对,即借助LLM出色的自然语言理解及推理能力来判断检索得到的知识库语料与用户提问是否有足够的相关性。当确认两者相关时才将其进一步给到大语言模型进行最终的答案生成。

对于知识库中没有的内容,部分企业场景则需要AI“有分寸感”的避而不答。LinkAI支持当知识库检索结果为空时(知识库中没有满足语义检索向量相似度阈值的语料)输出固定回复或不回复,从而满足严谨性控制的需求。

答案来源标注

大模型最终生成的回复,对于终端用户来说仍然是“黑盒”的,即用户无法准确分辨该答案到底是基于确有其文的资料回复的,还是基于大模型自身的知识能力回复的。特别是在部分企业场景中,对于机器人的回答有严谨性和可追溯的要求。故可在最终回复生成时,由大模型补充知识库导入时的文件或网站名称作为内容来源进行标注说明,以提升答案的可信度和可溯源性。

Snipaste_2024-07-29_21-23-24

素材发送

知识库内容除了文字以外,还会有图片、视频和独立文件,在知识库智能体对话场景中,除了需要以文字回复用户外,也有回复用户图片、视频和文件的需求。

例如AI销售的场景中,需根据顾客的需求发送合适的服装搭配方案,除了文字介绍外还需发送衣服的图片、视频作为补充。再例如企业内部员工问答bot的场景,当员工需要获取一个文件模板时,智能体需要将整个文件原封不动发出,而不是发送文件里的具体内容。

知识库除导入用于RAG的文字语料外,还支持上传图片、视频、文件等素材,上传后的素材将以URL的格式作为附件一并存储于知识库内,当用户提问命中该条知识库语料时,附件可以一同发出

Snipaste_2024-07-28_22-10-24

知识库素材发送能力,不仅在网页端使用时支持,LinkAI的应用接入渠道(网站嵌入、钉钉、飞书、企业微信等)均可兼容。

知识库回答反馈优化

使用记录定位溯源

经过上述一系列动作后,一次基于RAG知识库的对话便完成了。但即便使用了多种AI和工程能力的调控优化手段,也无法保证最终回答达到100%的准确率,偶尔还是会出现不符合预期的情况。

借助LinkAI的使用记录功能,可查看每一次AI智能体问答的详情,其中包含了知识库应用的RAG检索结果以及工作流中知识库节点的RAG检索结果。

records-Knowledge2 1123

通过使用记录中的知识库命中详情,可溯源大语言模型在生成智能回复时具体使用的知识库参考信息,还可一键跳转到该条知识库语料的编辑页面,进行调整和优化。

未命中知识库数据看板

在企业应用场景中,对于知识库型智能体,用户提问如果未命中知识库,往往是不符合预期的。一般来说代表着知识库内容还没有完全覆盖用户可能会提问的全部问题。故实时洞察未命中知识库的用户问题对于知识库的不断改善和优化也十分重要。

基于数据驾驶舱功能的「未命中知识库」图表,企业管理员可实时查看任意周期内未命中知识库内容的用户提问统计数据,并可下钻查看明细,根据用户当时的具体问题,判断是否需要补充新的知识库内容。这样一来,智能体应用的Feedback模式将从用户反馈变为数据驱动,以此帮助企业不断优化改善知识库型智能体的应用表现。

Snipaste_2024-07-29_23-11-15

RAG知识库的运营型迭代优化是一个复利工程。受益于AI chatbot 1vN 服务的规模效应,当我们改善一个知识库的问题时,对于服务效果的提升、人力的节省,都将带来巨大的规模性收益。通过持续不断的反馈优化,能够最大程度释放AI应用在企业场景落地的价值!

总结

RAG工程的每个步骤和环节都有可能对最终效果产生影响,在不同的使用场景中又会有不同的目标及侧重。一套功能强大且场景覆盖全面,并能兼容各种corner case的RAG知识库系统是知识库型AI智能体在企业场景落地应用的基础。

LinkAI自23年6月发布以来,不断在RAG知识库产品方面进行探索和优化,逐步达成功能通用、产品易用、多场景可用的目标。将继续通过优秀的产品能力解决好大模型企业级应用中知识依赖和知识更新的问题。

更多内容点击访问LinkAI官网,知识库文档:LinkAI知识库

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/775820.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

14. 迭代器、生成器、模块与包、json模块

1.迭代器 1.1 迭代器介绍 迭代器是用来迭代取值的工具 每一次迭代得到的结果会作为下一次迭代的初始值,单纯的重复并不是迭代# while循环实现迭代取值 a = [1, 2, 3, 4, 5, 6] index = 0 while index < len(a):print(a[index])index += 1 1.2 可迭代对象 内置有_ _iter_ _方…

# 代码随想录二刷(哈希表)

代码随想录二刷(哈希表) 三数之和思路反正对于我来说是真的难想出来。若这道题还是采用哈希表的思路去做,非常麻烦,并且还要考虑去重的操作。所以这道题其实用双指针,是更方便的。具体程序如下: class Solution:def threeSum(self, nums: List[int]) -> List[List[int]]…

ctfshow-web入门-nodejs系列

web334 下载源码后缀改为zip打开即可 先对源码经行一个简单的分析 login.js// 引入Express框架 var express = require(express);// 创建一个路由实例 var router = express.Router();// 引入用户数据,假设user模块导出的是一个包含用户项的对象 var users = require(../modul…

2021年我因为Tab Session Manager丢失数据,好像是研究过一次leveldb的查看/解码方式 但是当时好像因为时间关系没能成功 / chrome .ldb文件

Default\Local Storage\leveldb .ldb2023年下半年我因为chatmindai修改域名,又研究过一次,因为时间关系也没有细究最近,我想查看一下anki的devtool的Local Storage,即https://ankiweb.net/shared/info/31746032这个插件产生的 C:\Users\xxx\AppData\Local\Anki\QtWebEngine…

联合省选 2024 Day2T1 迷宫守卫 题解

联合省选 2024 Day2T1 迷宫守卫 题解 好像距离联合省选已经半年了,前两天看到这题才想起来改,距离分班已经半年了,也算是好好学了半年了,但是还是那么菜,有点绷不住,感觉不如文化课 后来翻到题解区第二篇题解才知道自己赛时想的反悔贪心其实是正解,但是当时啥也不会,主…

小白程序员也要对世界进行第一次的呐喊!

身为程序员对世界的第一声呐喊——Hello World!新建一个文件夹 新建一个目录,并将其命名为Hello.java(关键一步)注意!文件类型显示的是java文件才成功 (文件的后缀要改为java)双击文件,开始编写(本人使用的是Notepad++进行编写) 输入图片中的代码(全部要用英文输入法…

Django模板、模版语言和静态文件

1. templates模板(html)在app目录下创建一个templates目录,用于存放网页模板利用url返回网页点击查看代码 def user_list(request):return render(request,"user_list.html");输入url地址时,会去app目录下的templates目录下寻找名为user_list的HTML文件(根据app…

Cuberite——低配mc服务器的最佳选择

最近白嫖了一个1h1g的服务器,想拿它来开mc服务器,正当我用mcsmanager开服的时候,突然给我报了一条OutOfMemoryError下面就给大家介绍一下Cubreite Cuberite Cuberite is a Minecraft-compatible multiplayer game server that is written in C++ and designed to be efficie…

一图看懂Git、HTTPS、Docker、k8s和微服务

一图看懂Git、HTTPS、Docker、k8s和微服务

全网最适合入门的面向对象编程教程:29 类和对象的Python实现-断言与防御性编程和help函数的使用

在Python中,断言是一种常用的调试工具,它允许程序员编写一条检查某个条件。本文主要介绍了断言的应用场景和特点以及assert语句的使用,同时介绍了防御性编程和help()函数。全网最适合入门的面向对象编程教程:29 类和对象的 Python 实现-断言与防御性编程和 help 函数的使用…