Mlsys Learning
挖个坑,记录一下寒假读的一些paper和入门mlsys的过程。
关于os
可见 xv6-learning,记录了我通过mit教学用的xv6操作系统学习操作系统的过程。
LLM Learning
RAG
理论提出
在2020年之前,学术界已有将检索与生成结合的零星尝试,但尚未形成系统化的方法论。2020年,这一领域迎来了两个具有里程碑意义的工作:Facebook在论文Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks正式提出”RAG”概念并将其应用于知识密集型任务,同时Google的REALM通过在预训练阶段融入潜在知识检索器,显著提升了开放域问答的性能。
ChatGPT发布后,RAG研究更是进入了加速发展的黄金时期。在这个过程中,RAG技术逐渐从单一的检索-生成框架,演化为包含多跳推理、记忆增强和多模态等复杂功能的综合系统。
Naive RAG
2020年10月,Meta团队在论文《Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks》中首次定义Naive RAG架构,确立了”索引-检索-生成”三阶段流程:
- 索引(Indexing):索引首先清理和提取各种格式的原始数据,如 PDF、 HTML、 Word 和 Markdown,然后将其转换为统一的纯文本格式。为了适应语言模型的上下文限制,文本被分割成更小的、可消化的块(chunk)。然后使用嵌入模型将块编码成向量表示,并存储在向量数据库中。这一步对于在随后的检索阶段实现高效的相似性搜索至关重要。
- 检索(Retrieval):在收到用户查询(Query)后,RAG 系统采用与索引阶段相同的编码模型将查询转换为向量表示,然后计算索引语料库中查询向量与块向量的相似性得分。该系统优先级和检索最高 k (Top-K)块,显示最大的相似性查询。这些块随后被用作 prompt 中的扩展上下文。
- 生成(Generation):提出的查询(Query)和选定的文档(Chunks)被合成为一个连贯的提示,大语言模型负责生成回复。
Advanced RAG
Advanced RAG 的雏形源于对 Naive RAG(索引→检索→生成)的局限性突破。早期研究者发现单纯依赖向量检索存在 语义鸿沟 (如用户提问模糊或需多跳推理时检索失效)和 信息冗余 (检索结果重复或无关)等问题。为此,Meta、微软等团队开始探索全流程优化框架,提出 检索前预处理 、检索后精炼以及Embedding模型优化等方向:
- 预索引优化:
- 多粒度分块策略:引入滑动窗口分割、语义分块等策略,解决长文本切分导致的语义断裂问题(如将文档按段落、章节动态划分)
- 引入元数据:把元数据嵌入块中提升检索效率(标题、摘要、作者、时间、实体信息)
- 混合索引:结合 BM25关键词匹配 与 向量语义检索,平衡精确召回与语义理解能力。
- 假设性问题:让LLM为每个块生成一个问题,保存问题与文本块的映射关系,将这些问题存入向量数据库中。在检索时,先基于向量问题数据库进行查询搜索,找到相似问题后,然后在检索后路由到原始文本块,并将它们作为上下文发送给LLM以获得答案。这种方法通过查询与假设性问题之间更高的语义相似性,提高了搜索质量。
- HyDE(Hypothetical Document Embeddings):通过逆向逻辑方法,让LLM给定查询生成一个假设性回应,然后使用其向量和查询向量来提高搜索质量。
- 后索引优化:
- ReRank:重新排序以将最相关的信息重新定位到提示的边缘是一个简单的想法。
- Prompt Compression:重点在于压缩不相关的上下文,突出关键段落,并减少整体上下文长度。
- Embedding优化:
- Fine-tuning Embedding:微调的目的是增强检索内容和查询之间的相关性。通常,微调嵌入的方法分为在特定领域上下文中调整嵌入和优化检索步骤。特别是在处理进化或稀有术语的专业领域,这些定制的嵌入方法可以提高检索相关性。
- Dynamic Embedding:动态嵌入根据单词出现的上下文进行调整,不同于为每个单词使用单个向量的静态嵌入,理想情况下,嵌入应该包含尽可能多的上下文,以确保“healthy”的结果。
- 查询转换:
- 查询转换利用LLM作为推理引擎来修改用户输入,以提高检索质量。对于更复杂的用户查询,可以基于LLM将其进行子查询拆解,分别得到子查询的关联上下文信息后整合到一起提供给LLM生成初始复杂问题的最终答案。当涉及到多轮上下文对话中,如果利用历史对话补齐当前对话信息完整性,以实现更准确的信息检索同样涉及到查询转换。
Modular RAG
Modular RAG 将传统 RAG 系统的线性流程拆分为 独立可插拔的模块 (如检索器、预处理器、生成器等),每个模块专注于特定功能(如查询优化、混合检索、生成控制),支持像“乐高积木”一样自由组合。
