服務熱線
0755-83044319
發布時間:2025-03-03作者來源:薩科微瀏覽:1003
一、什么是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")
免責聲明:本文來源于“數字化轉型分享”公眾號,本文僅代表作者個人觀點,不代表薩科微及行業觀點,只為轉載與分享,支持保護知識產權,轉載請注明原出處及作者,如有侵權請聯系我們刪除。
企業咨詢和陪跑請掃碼聯系
友情鏈接:站點地圖 薩科微官方微博 立創商城-薩科微專賣 金航標官網 金航標英文站
Copyright ?2015-2025 深圳薩科微半導體有限公司 版權所有 粵ICP備20017602號