服務(wù)熱線
0755-83044319
發(fā)布時(shí)間:2025-03-03作者來(lái)源:薩科微瀏覽:1043
一、什么是RAG?
檢索增強(qiáng)生成(Retrieval Augmented Generation),簡(jiǎn)稱 RAG。結(jié)合向量檢索(Retrieval)與內(nèi)容生成(Generation)的AI框架。
二、為啥需要RAG?
原因是通用的基礎(chǔ)大模型基本無(wú)法滿足我們的實(shí)際業(yè)務(wù)需求。
1、有以下有幾方面原因:
1)知識(shí)的局限性:(缺企業(yè)私有知識(shí)庫(kù))
模型自身的知識(shí)完全源于它的訓(xùn)練數(shù)據(jù),而現(xiàn)有的大模型的訓(xùn)練集基本都是構(gòu)建于網(wǎng)絡(luò)公開(kāi)的數(shù)據(jù),對(duì)于一些實(shí)時(shí)性的、非公開(kāi)的或離線的數(shù)據(jù)是無(wú)法獲取到的,這部分知識(shí)也就無(wú)從具備。
2)幻覺(jué)問(wèn)題:(沒(méi)有私有知識(shí)庫(kù),幻覺(jué)無(wú)法抑制)
所有的AI模型的底層原理都是基于數(shù)學(xué)概率,其模型輸出實(shí)質(zhì)上是一系列數(shù)值運(yùn)算,大模型也不例外,所以它有時(shí)候會(huì)一本正經(jīng)地胡說(shuō)八道,尤其是在大模型自身不具備某一方面的知識(shí)或不擅長(zhǎng)的場(chǎng)景。而這種幻覺(jué)問(wèn)題的區(qū)分是比較困難的,因?yàn)樗笫褂谜咦陨砭邆湎鄳?yīng)領(lǐng)域的知識(shí)。
3)數(shù)據(jù)安全性:
對(duì)于企業(yè)來(lái)說(shuō),數(shù)據(jù)安全至關(guān)重要,沒(méi)有企業(yè)愿意承擔(dān)數(shù)據(jù)泄露的風(fēng)險(xiǎn),將自身的私域數(shù)據(jù)上傳第三方平臺(tái)進(jìn)行訓(xùn)練。這也導(dǎo)致完全依賴通用大模型自身能力的應(yīng)用方案不得不在數(shù)據(jù)安全和效果方面進(jìn)行取舍。
4)利用RAG框架可以構(gòu)建企業(yè)的私有知識(shí)庫(kù),是解決上述問(wèn)題的一套有效方案。
三、RAG架構(gòu)
1、知識(shí)庫(kù)
1)治理企業(yè)的私有化數(shù)據(jù),包括結(jié)構(gòu)化/非結(jié)構(gòu)化數(shù)據(jù)(文檔、數(shù)據(jù)庫(kù)、網(wǎng)頁(yè)等),利用向量數(shù)據(jù)庫(kù)的高效存儲(chǔ)和檢索能力,可實(shí)現(xiàn)檢索,和數(shù)據(jù)召回。
2)完善數(shù)據(jù)的治理,可實(shí)現(xiàn)數(shù)據(jù)的可持續(xù)更新。
2、RAG的核心是數(shù)據(jù)的檢索+提示詞的生成
1)前者主要是利用向量數(shù)據(jù)庫(kù)的高效存儲(chǔ)和檢索能力,召回目標(biāo)知識(shí);
2)后者則是利用大模型和Prompt工程,將召回的知識(shí)合理利用,合并生成Prompt
3)再調(diào)用大模型生成目標(biāo)答案。
4)重復(fù)以上過(guò)程,直到理想的結(jié)果。
3、RAG應(yīng)用流程主要包含兩個(gè)階段:
1)知識(shí)庫(kù)構(gòu)建:
數(shù)據(jù)提取——>文本分割——>向量化(embedding)——>數(shù)據(jù)入庫(kù)
2)知識(shí)庫(kù)應(yīng)用:
用戶提問(wèn)——>數(shù)據(jù)檢索(召回)——>注入Prompt——>LLM生成答案
四、知識(shí)庫(kù)建設(shè):
1、數(shù)據(jù)準(zhǔn)備階段:
數(shù)據(jù)準(zhǔn)備一般是一個(gè)離線的過(guò)程,主要是將私域數(shù)據(jù)向量化后構(gòu)建索引并存入數(shù)據(jù)庫(kù)的過(guò)程。主要包括:數(shù)據(jù)提取、文本分割、向量化、數(shù)據(jù)入庫(kù)等環(huán)節(jié)。
1)數(shù)據(jù)提取
數(shù)據(jù)加載:包括多格式數(shù)據(jù)加載、不同數(shù)據(jù)源獲取等,根據(jù)數(shù)據(jù)自身情況,將數(shù)據(jù)處理為同一個(gè)范式。
數(shù)據(jù)處理:包括數(shù)據(jù)過(guò)濾、壓縮、格式化等。
元數(shù)據(jù)獲?。禾崛?shù)據(jù)中關(guān)鍵信息,例如文件名、Title、時(shí)間等 。
2)文本分割:
文本分割主要考慮兩個(gè)因素:1)embedding模型的Tokens限制情況;2)語(yǔ)義完整性對(duì)整體的檢索效果的影響。一些常見(jiàn)的文本分割方式如下:
句分割:以”句”的粒度進(jìn)行切分,保留一個(gè)句子的完整語(yǔ)義。常見(jiàn)切分符包括:句號(hào)、感嘆號(hào)、問(wèn)號(hào)、換行符等。
固定長(zhǎng)度分割:根據(jù)embedding模型的token長(zhǎng)度限制,將文本分割為固定長(zhǎng)度(例如256/512個(gè)tokens),這種切分方式會(huì)損失很多語(yǔ)義信息,一般通過(guò)在頭尾增加一定冗余量來(lái)緩解。
3)向量化(embedding):
向量化是一個(gè)將文本數(shù)據(jù)轉(zhuǎn)化為向量矩陣的過(guò)程,該過(guò)程會(huì)直接影響到后續(xù)檢索的效果。目前常見(jiàn)的embedding模型如表中所示,這些embedding模型基本能滿足大部分需求,但對(duì)于特殊場(chǎng)景(例如涉及一些罕見(jiàn)專有詞或字等)或者想進(jìn)一步優(yōu)化效果,則可以選擇開(kāi)源Embedding模型微調(diào)或直接訓(xùn)練適合自己場(chǎng)景的Embedding模型。
4)數(shù)據(jù)入庫(kù):
數(shù)據(jù)向量化后構(gòu)建索引,并寫入數(shù)據(jù)庫(kù)的過(guò)程可以概述為數(shù)據(jù)入庫(kù)過(guò)程,適用于RAG場(chǎng)景的數(shù)據(jù)庫(kù)包括:FAISS、Chromadb、ES、milvus等。一般可以根據(jù)業(yè)務(wù)場(chǎng)景、硬件、性能需求等多因素綜合考慮,選擇合適的數(shù)據(jù)庫(kù)。
五、應(yīng)用知識(shí)庫(kù)階段:
在應(yīng)用階段,我們根據(jù)用戶的提問(wèn),通過(guò)高效的檢索方法,召回與提問(wèn)最相關(guān)的知識(shí),并融入Prompt;大模型參考當(dāng)前提問(wèn)和相關(guān)知識(shí),生成相應(yīng)的答案。關(guān)鍵環(huán)節(jié)包括:數(shù)據(jù)檢索、注入Prompt等。
1)數(shù)據(jù)檢索
常見(jiàn)的數(shù)據(jù)檢索方法包括:相似性檢索、全文檢索等,根據(jù)檢索效果,一般可以選擇多種檢索方式融合,提升召回率。
相似性檢索:即計(jì)算查詢向量與所有存儲(chǔ)向量的相似性得分,返回得分高的記錄。常見(jiàn)的相似性計(jì)算方法包括:余弦相似性、歐氏距離、曼哈頓距離等。
全文檢索:全文檢索是一種比較經(jīng)典的檢索方式,在數(shù)據(jù)存入時(shí),通過(guò)關(guān)鍵詞構(gòu)建倒排索引;在檢索時(shí),通過(guò)關(guān)鍵詞進(jìn)行全文檢索,找到對(duì)應(yīng)的記錄。
2)注入Prompt
Prompt作為大模型的直接輸入,是影響模型輸出準(zhǔn)確率的關(guān)鍵因素之一。在RAG場(chǎng)景中,Prompt一般包括任務(wù)描述、背景知識(shí)(檢索得到)、任務(wù)指令(一般是用戶提問(wèn))等,根據(jù)任務(wù)場(chǎng)景和大模型性能,也可以在Prompt中適當(dāng)加入其他指令優(yōu)化大模型的輸出。
Prompt的設(shè)計(jì)只有方法、沒(méi)有語(yǔ)法,比較依賴于個(gè)人經(jīng)驗(yàn),在實(shí)際應(yīng)用過(guò)程中,往往需要根據(jù)大模型的實(shí)際輸出進(jìn)行針對(duì)性的Prompt調(diào)優(yōu)。
六、舉例,偽代碼示例
1、選擇如下開(kāi)源組件
向量數(shù)據(jù)庫(kù):FAISS
NLP框架: Hugging Face Transformers, LangChain,DeepSeekR1
部署框架 FastAPI,
2、階段1:知識(shí)庫(kù)建設(shè)
1. 數(shù)據(jù)準(zhǔn)備
- 數(shù)據(jù)源:PDF文檔、數(shù)據(jù)庫(kù)、API、網(wǎng)頁(yè)爬蟲(chóng)等
- 格式處理:
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. 數(shù)據(jù)預(yù)處理
- 清洗:去除特殊字符、停用詞、重復(fù)內(nèi)容
- 分塊策略:
- 固定長(zhǎng)度分塊(適合通用場(chǎng)景)
- 語(yǔ)義分塊(按段落/主題劃分)
python
使用LangChain文本分割
from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=512,
chunk_overlap=50
)
documents = text_splitter.split_text(text)
3. 向量化存儲(chǔ)
嵌入模型選擇:sentence-transformers/all-mpnet-base-v2 或自定義模型
向量數(shù)據(jù)庫(kù)選型:
python
使用FAISS存儲(chǔ)
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系統(tǒng)搭建
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"""基于以下上下文回答用戶問(wèn)題:
{context}
問(wèn)題:{query}
答案:"""
3. 系統(tǒng)集成
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:評(píng)估優(yōu)化
評(píng)估指標(biāo)
1)檢索召回率優(yōu)化:
混合檢索(語(yǔ)義+關(guān)鍵詞)
查詢擴(kuò)展(同義詞替換)
2)生成答案相關(guān)性
python
添加系統(tǒng)提示
SYSTEM_PROMPT = "你是一個(gè)嚴(yán)謹(jǐn)?shù)念I(lǐng)域?qū)<?,只根?jù)提供的事實(shí)回答問(wèn)題。"
def improved_prompt(query, context):
return f"{SYSTEM_PROMPT}\n已知信息:{context}\n問(wèn)題:{query}\n答案:"
3)人工評(píng)估準(zhǔn)確度
評(píng)估結(jié)果,不斷調(diào)整,達(dá)到可接受成果。
4)增量更新:實(shí)現(xiàn)知識(shí)庫(kù)實(shí)時(shí)更新
python
class UpdateableFAISS(FAISS):
def add_documents(self, new_docs):
self.add_texts(new_docs)
self.save_local("updated_knowledge_base")
免責(zé)聲明:本文來(lái)源于“數(shù)字化轉(zhuǎn)型分享”公眾號(hào),本文僅代表作者個(gè)人觀點(diǎn),不代表薩科微及行業(yè)觀點(diǎn),只為轉(zhuǎn)載與分享,支持保護(hù)知識(shí)產(chǎn)權(quán),轉(zhuǎn)載請(qǐng)注明原出處及作者,如有侵權(quán)請(qǐng)聯(lián)系我們刪除。
企業(yè)咨詢和陪跑請(qǐng)掃碼聯(lián)系
友情鏈接:站點(diǎn)地圖 薩科微官方微博 立創(chuàng)商城-薩科微專賣 金航標(biāo)官網(wǎng) 金航標(biāo)英文站
Copyright ?2015-2025 深圳薩科微半導(dǎo)體有限公司 版權(quán)所有 粵ICP備20017602號(hào)