RAG-检索增强生成
目前大语言模型本身存在一些局限性:
时效性:大模型无法询问最新的时事,比如问LLM:“抗战胜利80周年阅兵展示了哪些武器?”
知识覆盖度:虽然大模型的训练数据集非常庞大,但仍可能无法涵盖所有领域的知识或特定领域的深度信息。
幻觉问题:大模型LLM在某些情况(提问方式不对、模型知识欠缺)下给出回答很可能错误的,或者是涉及虚拟甚至是故意欺骗的信息,这种回答被称之为AI幻觉,导致大模型一本正经的胡说八道。
解决知识更新缓慢和幻觉问题方案:
解决方案:RAG加微调大模型微调(Fine-Tuning),是在通用大模型的基础上,针对超出其范围或不擅长的特定领域或任务,使用专门的数据集或方法对模型进行相应的调整和优化,以提升其在该特定领域或任务中的适用性和性能表现。
什么是RAG
RAG,外挂知识库的方式,实现成本和复杂度都比微调更低,且RAG在知识库更新方面表现最佳。
RAG (Retrieval Augmented Generation/检索增强生成)是一种结合了检索和生成两种方法的技术。它通过先检索相关的文档,用检索出来的信息对提示词增强,再使用大模型生成答案RAG的本质是:RAG = 大模型LLM + 外部数据

RAG研究范式演进
Naive RAG 主要有三个步骤:
索引化:文档 ->分块 ->向量化->存储
检索:用户提问 ->向量化 ->检索数据库 ->得到top-K个相关文档块
增强生成:增强提示词(原始问题+相关文档块)-> LLM -> 生成答案

Naive RAG - 文档分块
Naive RAG遵循一个传统的处理流程,包括索引、检索和生成三个阶段基本分块策略
按照字符数来切分
核心思想:按照固定字符数切割文本,不考虑语义结构。
优点:简单
易破坏句子完整性
场景:非结构化文本的预处理
"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
按照句子来切分
核心思想:以完整句子为单位进行组合;确保语义完整。
适用场景:法律文书、新闻报道、对句子完整性要求高的领域。
"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
核心思想:按优先级分隔符递归切分,尽量保留段落、句子的完整性。
场景:绝大多数通用文本的首选策略。
"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)递归分割的核心逻辑:
先尝试按 \n\n 分段
如果某段仍然太长
再按 \n
还太长继续按 " "
最后才按字符硬切因为它对:
PDF
Markdown
网页
知识库
长文章效果都更稳定。
Naive RAG - 向量化
在 RAG 中,文档分块后,一个文本块对应一个向量。
文本嵌入模型:会将一个文本 转换成 一个“句向量”或“文本块向量”。
专用于输出文本的「向量」的神经网络模型就是我们所说的嵌入模型/向量模型。不同的嵌入模型即使是相同的文本,词向量也有可能不一样,比如不同的厂商,语料不一样或者向量的维度不一样。
向量数据库市场格局

Chroma
创建 client
client = chromadb.Client O client = chromadb.PersistentClient(path=”路径〞)
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 本站不对文中外部链接、第三方资源或读者据此操作产生的结果承担保证责任。
评论
登录后即可发表评论和回复。