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