Skill发布于 2026年7月11日

RAG引擎构建

RAG-检索增强生成 目前大语言模型本身存在一些局限性: 时效性:大模型无法询问最新的时事,比如问LLM:“抗战胜利80周年阅兵展示了哪些武器?” 知识覆盖度:虽然大模型的训练数据集非常庞大,但仍可能无法涵盖所有领域的知识或特定领域的深度信...

站点作者8 次阅读最后更新 2026年7月27日
返回首页·Markdown 正文渲染

RAG-检索增强生成

目前大语言模型本身存在一些局限性:

  1. 时效性:大模型无法询问最新的时事,比如问LLM:“抗战胜利80周年阅兵展示了哪些武器?”

  2. 知识覆盖度:虽然大模型的训练数据集非常庞大,但仍可能无法涵盖所有领域的知识或特定领域的深度信息。

  3. 幻觉问题:大模型LLM在某些情况(提问方式不对、模型知识欠缺)下给出回答很可能错误的,或者是涉及虚拟甚至是故意欺骗的信息,这种回答被称之为AI幻觉,导致大模型一本正经的胡说八道。

解决知识更新缓慢和幻觉问题方案:

解决方案:RAG加微调大模型微调(Fine-Tuning),是在通用大模型的基础上,针对超出其范围或不擅长的特定领域或任务,使用专门的数据集或方法对模型进行相应的调整和优化,以提升其在该特定领域或任务中的适用性和性能表现。

什么是RAG

RAG,外挂知识库的方式,实现成本和复杂度都比微调更低,且RAG在知识库更新方面表现最佳。

RAG (Retrieval Augmented Generation/检索增强生成)是一种结合了检索和生成两种方法的技术。它通过先检索相关的文档,用检索出来的信息对提示词增强,再使用大模型生成答案RAG的本质是:RAG = 大模型LLM + 外部数据

image1

RAG研究范式演进

Naive RAG 主要有三个步骤:

  1. 索引化:文档 ->分块 ->向量化->存储

  2. 检索:用户提问 ->向量化 ->检索数据库 ->得到top-K个相关文档块

  3. 增强生成:增强提示词(原始问题+相关文档块)-> LLM -> 生成答案

image2

Naive RAG - 文档分块

Naive RAG遵循一个传统的处理流程,包括索引、检索和生成三个阶段基本分块策略

  • 按照字符数来切分

  • 核心思想:按照固定字符数切割文本,不考虑语义结构。

  • 优点:简单

  • 易破坏句子完整性

  • 场景:非结构化文本的预处理

python
"hljs-keyword">from langchain_text_splitters "hljs-keyword">import CharacterTextSplitter

sample_text = (
    "LangChain was created by Harrison Chase in 2022. It provides a framework "hljs-keyword">for "
    "developing applications powered by language models. The library is known "hljs-keyword">for its "
    "modularity and ease of use. One of its key components is the TextSplitter "hljs-keyword">class, "
    "which helps in document chunking."
)

text_splitter = CharacterTextSplitter(
    separator=" ",          # 按空格分割
    chunk_size=100,         # 每块最大100字符
    chunk_overlap=20,       # 重叠20字符
    length_function=len
)

docs = text_splitter.create_documents([sample_text])

"hljs-keyword">for i, doc in enumerate(docs):
    print(f"--- Chunk {i+1} ---")
    print(doc.page_content)
  • 按固定字符数 结合overlapping window

  • 按照句子来切分

  • 核心思想:以完整句子为单位进行组合;确保语义完整。

  • 适用场景:法律文书、新闻报道、对句子完整性要求高的领域。

python
"hljs-keyword">import re
"hljs-keyword">from langchain_text_splitters "hljs-keyword">import RecursiveCharacterTextSplitter

sample_text = """
LangChain 是一个用于开发 LLM 应用的框架。
它支持 RAG、Agent、Memory 等功能!
很多开发者都会使用它进行大模型应用开发?
它还支持多种向量数据库。
"""

# 按句号、问号、感叹号切分
text_splitter = RecursiveCharacterTextSplitter(
    separators=[
        r"(?<=[。!?.!?])",  # 正则:句子结束符
        "\n\n",
        "\n",
        " ",
        ""
    ],
    is_separator_regex=True,   # 开启正则
    chunk_size=50,
    chunk_overlap=10
)

docs = text_splitter.create_documents([sample_text])

"hljs-keyword">for i, doc in enumerate(docs):
    print(f"--- Chunk {i+1} ---")
    print(doc.page_content)
  • 递归方法 RecursiveCharacterTextSplitter

  • 核心思想:按优先级分隔符递归切分,尽量保留段落、句子的完整性。

  • 场景:绝大多数通用文本的首选策略。

python
"hljs-keyword">from langchain_text_splitters "hljs-keyword">import RecursiveCharacterTextSplitter

sample_text = (
    "LangChain was created by Harrison Chase in 2022. "
    "It provides a framework "hljs-keyword">for developing applications powered by language models. "
    "The library is known "hljs-keyword">for its modularity and ease of use.\n\n"
    "One of its key components is the TextSplitter "hljs-keyword">class, "
    "which helps in document chunking."
)

# 递归分割器
text_splitter = RecursiveCharacterTextSplitter(
    separators=[
        "\n\n",   # 先按段落
        "\n",     # 再按换行
        " ",      # 再按空格
        ""        # 最后按字符
    ],
    chunk_size=100,
    chunk_overlap=20,
    length_function=len
)

docs = text_splitter.create_documents([sample_text])

"hljs-keyword">for i, doc in enumerate(docs):
    print(f"--- Chunk {i+1} ---")
    print(doc.page_content)

递归分割的核心逻辑:

  1. 先尝试按 \n\n 分段

  2. 如果某段仍然太长

  3. 再按 \n

  4. 还太长继续按 " "

  5. 最后才按字符硬切因为它对:

  • PDF

  • Markdown

  • 网页

  • 知识库

  • 长文章效果都更稳定。

Naive RAG - 向量化

在 RAG 中,文档分块后,一个文本块对应一个向量。

文本嵌入模型:会将一个文本 转换成 一个“句向量”或“文本块向量”。

专用于输出文本的「向量」的神经网络模型就是我们所说的嵌入模型/向量模型。不同的嵌入模型即使是相同的文本,词向量也有可能不一样,比如不同的厂商,语料不一样或者向量的维度不一样。

向量数据库市场格局

image3

Chroma

  1. 创建 client

client = chromadb.Client O client = chromadb.PersistentClient(path=”路径〞)

  1. collection 的使用

2.1 列出所有的 collection 列表: client.list_collections()

2.2 创建:client. create_collection(name="collection名称",embedding_function=向量化函数)

2.3 获取:collection=client.get_collection(name="my_collection",embedding_function=emb_fn)

2.4 没有就创建,有则获取:client.get_or_create_collection (name=”collection名称”)

2.5删除:client.delete_collection(name="my_collection")

版权声明

1 本文章标题: RAG引擎构建

2 本文章地址: https://www.yf2029.com/articles/rag%E5%BC%95%E6%93%8E%E6%9E%84%E5%BB%BA

3 本站文章内容仅供学习、交流与界面验证参考,如有版权或引用问题,请联系站点维护者处理。

4 本站不对文中外部链接、第三方资源或读者据此操作产生的结果承担保证责任。

上一篇

表情包

API设计

下一篇

GPT 如何基于 Transformer 演化

Vue

评论

登录后即可发表评论和回复。

0 条
评分
0/1000
还没有评论,来说两句吧

AI Knowledge Blog

记录代码与设计实践

分享开发经验、项目思考与持续成长的过程

站点反馈

如果你在浏览或使用过程中有建议,欢迎告诉我们。