服务热线
0755-83044319
发布时间:2025-03-03作者来源:澳门新葡萄新京威尼斯987浏览:996
一、什么是RAG?
检索增强生成(Retrieval Augmented Generation),简称 RAG。结合向量检索(Retrieval)与内容生成(Generation)的AI框架。
二、为啥需要RAG?
原因是通用的基础大模型基本无法满足我们的实际业务需求。
1、有以下有几方面原因:
1)知识的局限性:(缺企业私有知识库)
模型自身的知识完全源于它的训练数据,而现有的大模型的训练集基本都是构建于网络公开的数据,对于一些实时性的、非公开的或离线的数据是无法获取到的,这部分知识也就无从具备。
2)幻觉问题:(没有私有知识库,幻觉无法抑制)
所有的AI模型的底层原理都是基于数学概率,其模型输出实质上是一系列数值运算,大模型也不例外,所以它有时候会一本正经地胡说八道,尤其是在大模型自身不具备某一方面的知识或不擅长的场景。而这种幻觉问题的区分是比较困难的,因为它要求使用者自身具备相应领域的知识。
3)数据安全性:
对于企业来说,数据安全至关重要,没有企业愿意承担数据泄露的风险,将自身的私域数据上传第三方平台进行训练。这也导致完全依赖通用大模型自身能力的应用方案不得不在数据安全和效果方面进行取舍。
4)利用RAG框架可以构建企业的私有知识库,是解决上述问题的一套有效方案。
三、RAG架构
1、知识库
1)治理企业的私有化数据,包括结构化/非结构化数据(文档、数据库、网页等),利用向量数据库的高效存储和检索能力,可实现检索,和数据召回。
2)完善数据的治理,可实现数据的可持续更新。
2、RAG的核心是数据的检索+提示词的生成
1)前者主要是利用向量数据库的高效存储和检索能力,召回目标知识;
2)后者则是利用大模型和Prompt工程,将召回的知识合理利用,合并生成Prompt
3)再调用大模型生成目标答案。
4)重复以上过程,直到理想的结果。
3、RAG应用流程主要包含两个阶段:
1)知识库构建:
数据提取——>文本分割——>向量化(embedding)——>数据入库
2)知识库应用:
用户提问——>数据检索(召回)——>注入Prompt——>LLM生成答案
四、知识库建设:
1、数据准备阶段:
数据准备一般是一个离线的过程,主要是将私域数据向量化后构建索引并存入数据库的过程。主要包括:数据提取、文本分割、向量化、数据入库等环节。
1)数据提取
数据加载:包括多格式数据加载、不同数据源获取等,根据数据自身情况,将数据处理为同一个范式。
数据处理:包括数据过滤、压缩、格式化等。
元数据获取:提取数据中关键信息,例如文件名、Title、时间等 。
2)文本分割:
文本分割主要考虑两个因素:1)embedding模型的Tokens限制情况;2)语义完整性对整体的检索效果的影响。一些常见的文本分割方式如下:
句分割:以”句”的粒度进行切分,保留一个句子的完整语义。常见切分符包括:句号、感叹号、问号、换行符等。
固定长度分割:根据embedding模型的token长度限制,将文本分割为固定长度(例如256/512个tokens),这种切分方式会损失很多语义信息,一般通过在头尾增加一定冗余量来缓解。
3)向量化(embedding):
向量化是一个将文本数据转化为向量矩阵的过程,该过程会直接影响到后续检索的效果。目前常见的embedding模型如表中所示,这些embedding模型基本能满足大部分需求,但对于特殊场景(例如涉及一些罕见专有词或字等)或者想进一步优化效果,则可以选择开源Embedding模型微调或直接训练适合自己场景的Embedding模型。
4)数据入库:
数据向量化后构建索引,并写入数据库的过程可以概述为数据入库过程,适用于RAG场景的数据库包括:FAISS、Chromadb、ES、milvus等。一般可以根据业务场景、硬件、性能需求等多因素综合考虑,选择合适的数据库。
五、应用知识库阶段:
在应用阶段,我们根据用户的提问,通过高效的检索方法,召回与提问最相关的知识,并融入Prompt;大模型参考当前提问和相关知识,生成相应的答案。关键环节包括:数据检索、注入Prompt等。
1)数据检索
常见的数据检索方法包括:相似性检索、全文检索等,根据检索效果,一般可以选择多种检索方式融合,提升召回率。
相似性检索:即计算查询向量与所有存储向量的相似性得分,返回得分高的记录。常见的相似性计算方法包括:余弦相似性、欧氏距离、曼哈顿距离等。
全文检索:全文检索是一种比较经典的检索方式,在数据存入时,通过关键词构建倒排索引;在检索时,通过关键词进行全文检索,找到对应的记录。
2)注入Prompt
Prompt作为大模型的直接输入,是影响模型输出准确率的关键因素之一。在RAG场景中,Prompt一般包括任务描述、背景知识(检索得到)、任务指令(一般是用户提问)等,根据任务场景和大模型性能,也可以在Prompt中适当加入其他指令优化大模型的输出。
Prompt的设计只有方法、没有语法,比较依赖于个人经验,在实际应用过程中,往往需要根据大模型的实际输出进行针对性的Prompt调优。
六、举例,伪代码示例
1、选择如下开源组件
向量数据库:FAISS
NLP框架: Hugging Face Transformers, LangChain,DeepSeekR1
部署框架 FastAPI,
2、阶段1:知识库建设
1. 数据准备
- 数据源:PDF文档、数据库、API、网页爬虫等
- 格式处理:
python
示例:PDF文本提取
from PyPDF2 import PdfReader
def extract_pdf_text(file_path):
reader = PdfReader(file_path)
text = ""
for page in reader.pages:
text += page.extract_text()
return text
2. 数据预处理
- 清洗:去除特殊字符、停用词、重复内容
- 分块策略:
- 固定长度分块(适合通用场景)
- 语义分块(按段落/主题划分)
python
使用LangChain文本分割
from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=512,
chunk_overlap=50
)
documents = text_splitter.split_text(text)
3. 向量化存储
嵌入模型选择:sentence-transformers/all-mpnet-base-v2 或自定义模型
向量数据库选型:
python
使用FAISS存储
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.vectorstores import FAISS
embeddings = HuggingFaceEmbeddings(model_name="all-mpnet-base-v2")
vectorstore = FAISS.from_texts(documents, embeddings)
vectorstore.save_local("knowledge_base")
3、阶段2:RAG系统搭建
1. 检索模块
检索策略:
python
def retrieve_docs(query, vectorstore, top_k=3):
docs = vectorstore.similarity_search(query, k=top_k)
return doc.page_content for doc in docs
2. 生成模块
模型选择:DeepSeek
提示工程:
python
def build_prompt(query, context):
return f"""基于以下上下文回答用户问题:
{context}
问题:{query}
答案:"""
3. 系统集成
python
from transformers import pipeline
class RAGSystem:
def __init__(self, vectorstore_path):
self.vectorstore = FAISS.load_local(vectorstore_path, embeddings)
self.generator = pipeline("text-generation", model="DeepSeekR1")
def query(self, question):
context = retrieve_docs(question, self.vectorstore)
prompt = build_prompt(question, context)
return self.generator(prompt, max_length=500)0'generated_text'
4、阶段3:评估优化
评估指标
1)检索召回率优化:
混合检索(语义+关键词)
查询扩展(同义词替换)
2)生成答案相关性
python
添加系统提示
SYSTEM_PROMPT = "你是一个严谨的领域专家,只根据提供的事实回答问题。"
def improved_prompt(query, context):
return f"{SYSTEM_PROMPT}\n已知信息:{context}\n问题:{query}\n答案:"
3)人工评估准确度
评估结果,不断调整,达到可接受成果。
4)增量更新:实现知识库实时更新
python
class UpdateableFAISS(FAISS):
def add_documents(self, new_docs):
self.add_texts(new_docs)
self.save_local("updated_knowledge_base")
免责声明:本文来源于“数字化转型分享”公众号,本文仅代表作者个人观点,不代表澳门新葡萄新京威尼斯987及行业观点,只为转载与分享,支持保护知识产权,转载请注明原出处及作者,如有侵权请联系我们删除。
企业咨询和陪跑请扫码联系
友情链接:站点地图 澳门新葡萄新京威尼斯987官方微博 立创商城-澳门新葡萄新京威尼斯987专卖 金航标官网 金航标英文站
Copyright ©2015-2025 澳门新葡萄新京威尼斯987 版权所有 粤ICP备20017602号