RAG(Retrieval-augmented generation)个人学习笔记

1003 字
5 分钟
RAG(Retrieval-augmented generation)个人学习笔记

为什么需要 RAG?#

传统的 LLM 模型主要存在以下 2 个问题:

  • 幻觉
  • 外部知识/最新知识的缺失。

RAG 可以通过结合基于检索和生成模型的优势来提供更准确和上下文相关的响应,可以添加自己的预料构建知识库。

RAG vs. fine-tuning a LLM model
RAG vs. fine-tuning a LLM model

  1. RAG 更适合知识库需要动态更新的情景,这部分数据不作为用于 LLM 的训练数据,而是通过 LLM 的能力进行检索。
  2. RAG 由于采用检索的形式,数据来源是可知的,而 LLM 是黑箱。
  3. RAG 可以对生成过程提供更多控制。

Before RAG?#

理论上,对于需要外挂知识库,即需要处理大量文本数据的场景,不通过微调,将这些文本数据全部塞进 Prompt 未尝不可,但:

  • 超出 LLM 的上下文窗口 / 输入 Token 限制;
  • 烧钱;
  • LLM 对于长文本的理解能力有限,可能无法正确理解和利用这些文本数据;
  • 处理和响应的效率较低。

从目标来看,我们需要的是大量文本数据中能够回答用户问题的相关信息,而不是让 LLM 直接处理这些文本数据。RAG 的出现正是为了满足这一需求,其分为两步:

  1. 分块:将大量文本数据分成更小的块,便于处理和检索。
  2. 检索:根据用户的查询,从这些块中检索出相关块放入 Prompt 中,供 LLM 生成回答。

RAG 的实现#

Text Chunking#

  1. Size-based chunking:根据文本块的大小进行分块;
    • 优点:简单易行;
    • 缺点:可能会切断句子或段落,导致信息丢失或上下文不完整,因此实现上会在句子间引入一定的重叠。
  2. Structure-based chunking:根据文本的结构进行分块,例如段落、章节等;
    • 优点:保持文本的完整性和上下文关系;
    • 缺点:可能会导致块的大小不均匀,某些块可能过大或过小。并且实际应用中文本并不一定有明确的结构。
  3. Semantic-based chunking:根据文本的语义内容进行分块,例如使用自然语言处理技术识别主题或概念;
    • 优点:可以更好地捕捉文本的语义信息和上下文关系;
    • 缺点:实现复杂,可能需要更多的计算资源和时间。

语义搜索,通过将文本块和用户查询转换为向量表示(Text Embeddings),并使用向量相似度来检索相关块。

a basis Pipeline for RAG#

  1. Chunk source text.
  2. Generate embeddings.
  3. Store embeddings in a vector database.
  4. Embed user query, find closest chunks.
    • 通过余弦相似度计算用户查询与文本块之间的相似度,检索出相关块。
    • 范围为 -1 到 1,值越大表示越相似。
  5. Add related chunks to the prompt, generate answer.

语义搜索虽然能够捕捉文本的语义信息,但在某些情况下可能会遗漏一些重要的细节信息。为了弥补这一不足,可以将语义搜索与词汇搜索(Lexical Search)结合起来,常用方法是 BM25 算法,其基本流程如下:

  1. Tokenize the user query.
  2. For each text chunk, calculate the BM25 score based on the frequency of query tokens in the chunk and the overall token distribution in the corpus.
  3. Rank the chunks based on their BM25 scores and select the top N chunks for further processing.

a hybrid Pipeline for RAG#

  • Retriever(检索器):处理用户查询,使用语义搜索 + 词汇搜索来检索相关文本块。

将语义搜索和词汇搜索得到的结果混合需要进行一定的排序,常用方法是 Reciprocal Rank Fusion(倒数排序),其计算方式如下:

RRF(d)=∑i=1n1k+ranki(d)RRF(d) = \sum_{i=1}^{n} \frac{1}{k + rank_i(d)}

其中,RRF(d)RRF(d) 是文档 dd 的最终得分,nn 是搜索方法的数量,ranki(d)rank_i(d) 是文档 dd 在第 ii 个搜索方法中的排名,kk 是一个常数(通常设置为 60)以避免排名为 0 的情况。分数越高表示文档越相关。

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

RAG(Retrieval-augmented generation)个人学习笔记
https://blog.yokumi.cn/posts/rag-retrieval-augmented-generation-personal-study-notes/
作者
Yokumi
发布于
2025-02-22
许可协议
CC BY-NC-SA 4.0
相关文章智能推荐
1
写好提示词
科研学习Prompt Engineering = improving prompts to get more reliable, higher-quality outputs from language models. Key components = Action verb at start + direct task s…
2
MCP协议,换皮的工具调用?
科研学习假如有一个函数 getweather(location) ,传统的客服机器人的做法是: LLM 提供了强大的自然语言理解能力,而 Function Calling 的目标就是非结构化的自然语言描述 函数调用。现在的处理流程变为: Function Calling 虽然阐述了如何与大模型进行信息交换,但没有明确,还停留…
3
MCP vs. Skill 旧瓶装新酒这一块
科研学习我在之前对 MCP 的学习中简单提到过当时 MCP 的一些痛点,不过发展到现在 MCP 这套通信协议已经被 Anthropic 搞得相当完善,MCP Server 也能快速适配到不同 Client。 从本质上来说,MCP 的功能侧重于包装了 Function Calling(函数调用),用户不需要具体 Tool 的逻…
4
2026.5 Live Repo
生活杂谈翻了翻相册才发现上一次已经是去年 9 月的羊文学了,哎gszm坏事做尽。 这回的出行方式是经典京沪高铁二等座,去年锅贴得意之作绿皮 D9 真给我坐麻了,这次果断 G 系列。不过被课表背刺,本来还可以买早一班(),结果就是快 0 点才到虹桥。好像是第一次这么晚到沪国。
5
Workflow 还是 Agentic?
科研学习Workflow(工作流),简单来说,一系列对 LLM 的调用,旨在通过预定的一系列步骤来解决特定问题。可以理解为用 DAG(有向无环图)把 LLM 节点连起来。市面上一些可视化拖拽式 Agent 开发平台,例如 Coze、Dify 等,基本上都是基于 Workflow 的设计思路来实现的。

评论区

文章目录