大模型应用03 || RAG系统的一些理解、心得体会 || 工程经验
要建立一个好的RAG系统,我认为最重要的还是数据本身。整个系统的搭建,在技术实现上并非最难的部分,真正的效果上限是由数据质量决定的。
第一步就是数据搜集,以我做的心脑磁为例,理想的情况是大家提供内部资料,然后进行汇总、集中处理。但实际情况是,数据量有限,来源多样,格式混乱是常态。
因此,只能自己去搜集相关的公开资料,比如MNE、Brainsuite的教程等。这些资料多为英文,而内部资料是中文,这就涉及到一个语言对齐的问题。对于系统,我期望获得规范、地道的中文输出。一个直接的解决方法是在最终生成答案时,用提示词强制模型使用中文回答。但一个更优化的方法是,在数据入库前,就用高质量的翻译模型将所有英文资料预处理为中文。这样做能保证知识库在底层是统一的中文语料,可以提升检索的精准度。但是衡量了一下翻译的精确度和工作量,最后直接在提示词中强制输出中文。
数据搜集后,可能有上千个不同格式的文档,如ppt、pdf、word、md、png、txt。无论文件类型如何,终极目标都是让每个Chunk(数据块)成为一个相对独立且语义完整的知识单元。对于png这类图片或ppt里包含的图表,可以考虑使用多模态模型提取其内容描述,将这些描述性文本也纳入可检索的数据中。此外,文本内容差异很大,论文或教程的结构清晰,而实验报告或个人笔记则可能很杂乱。因此,在初期就应该对文档进行分类,根据内容归入不同文件夹,例如:论文、代码库与解释、内部流程指南、实验报告、项目报告等。
然后是切分过程。代码实现本身不复杂,关键在于策略的选择。我主要以结构化切割为主,辅以少量语义调整。
我的策略是,先定义切割规则的优先级。同时,为了保护关键术语和重要的语义边界(如“原理:”、“算法:”),我会使用正则表达式在这些关键词前强制插入一个高优先级的\n\n分隔符,这相当于人为提高了这些位置的分割优先级。
在此基础上,还可以引入两种策略来提升效果。一是重叠切割,即在相邻的两个Chunk之间保留一部分重叠内容,这能有效避免语义在边 界处被切断。二是多尺度文档层级,在切割精细的子Chunk的同时,也为它们保留一个概括性的父Chunk或文档摘要。当检索到多个子Chunk后,将它们的父Chunk信息一并提供给大模型,能让模型获得更宏观的上下文。
对于那些结构极其混乱的笔记,我的选择是直接用LLM进行切分。利用大模型的语义理解能力,通过设计一个提示词,让它按照逻辑和内容的完整性来划分区块,效果通常不错。
切分完成后,下一步是嵌入和索引。选择一个合适的Embedding模型至关重要,不同的模型在处理特定领域、特定语言或不同长度文本上各有优劣,这个选择直接影响后续的检索质量。将文本块向量化后,存入向量数据库,并需要合理配置索引策略,在检索速度和准确率之间找到平衡。
接下来是实现查询。从工程角度,有很多可以优化的点。首先是检索策略,单纯的向量检索可能无法精确匹配某些专有名词或代码片段,因此混合搜索,即结合向量搜索和传统的关键词搜索(如BM25)。其次是查询转换,可以先让LLM分析用户的原始问题,将其改写或扩展成几个更精确、更结构化的子问题,再用这些子问题去检索。检索到初步结果后,再通过一个重排模型,对召回的文本块与用户问题的相关性进行更精确的二次排序,筛选出最匹配的几个块。相似的trick还有很多。
最后是评估。自动化评估很难做到全面,人工结合AI辅助检查是目前最有效的方式。切分质量的评估主要看以下几个指标:
1. 独立性: 这个块能独立存在吗?一个不了解背景的人,能否单看这个块就理解其核心内容?如果需要依赖上下文,则独立性不足。
2. 完整性: 语义单元是否被破坏?检查块的边界,确保句子、代码块、列表项等没有被从中间切断。
3. 精准性 : 这个块是否聚焦于一个主题?如果一个块包含了多个不相关的主题,说明它可能需要被进一步拆分。
4. 可检索性 (: 能通过什么问题找到这个块?看着一个块,反向思考用户会提出什么样的问题,如果想不出具体的问题,说明这个块的价值较低。
为了使评估更具一致性,可以建立一个小的、高质量的“评估集”,包含几十个典型问题和标准答案。每次系统调整后,都用这个评估集进行测试,以衡量改动带来的影响。
最后,系统还存在一些潜在的问题和优化方向:
-
资料的混乱性: 不同资料质量参差不齐,有些内容价值很低,可能会污染知识库。一些人提供的笔记(很多都是ai直接copy的),那要不要在初期删除呢。一些我可以判断,一些还真不好判断。有些可能自己写写夹着ai的记录,其实这种看上去ai,但是质量很高。对此,可以引入数据质量评分机制,在数据预处理阶段为文档打上质量标签,检索时优先考虑高质量数据源。
-
元数据的使用: 目前元数据利用不足。除了质量标签,还可以增加时效性、涉密等级、来源等元数据。这在未来可以用于实现更复杂的查询过滤和权限控制。
-
系统的迭代与反馈: 一个好的系统需要持续优化。应该建立一个反馈闭环,收集用户对回答的评价。这些反馈数据非常宝贵,可以用来分析哪些文档或哪类问题处理得不好,从而指导后续对数据清洗、切分策略或重排模型的迭代优化。
-
整体系统成本与性能: 最终调用什么模型是关键。不同模型的API成本、响应速度和稳定性都不同,本地化模型在特定任务上可能性能不足。这需要在项目预算和性能要求之间进行长期的权衡和选择。
更多推荐
所有评论(0)