在大模型的快速發(fā)展中,許多人被 ChatGPT、Claude 等對話模型驚艷得目瞪口呆。
然而,我們稍微深挖就會發(fā)現(xiàn),大模型的“超能力”并不總是那么穩(wěn)定,有時候它可能信心滿滿地生成錯誤答案。
于是,一個叫 RAG(Retrieval-Augmented Generation) 的技術(shù)應(yīng)運(yùn)而生,為大模型的應(yīng)用開發(fā)帶來了一次質(zhì)的飛躍。
大模型應(yīng)用開發(fā)-什么是RAG
RAG,全稱是 檢索增強(qiáng)生成(Retrieval-Augmented Generation),是一種結(jié)合信息檢索(IR)和生成式模型的技術(shù)框架。簡單來說,RAG 的核心思想是“不會就查,不懂別瞎說”。
RAG 的基本邏輯是:
檢索階段:從一個外部知識庫中獲取相關(guān)的文檔或信息。
生成階段:利用檢索到的信息,結(jié)合大模型生成最終回答。
這樣做的好處是顯而易見的:
信息更準(zhǔn)確:避免模型靠“幻覺”胡編亂造。
靈活性強(qiáng):可以根據(jù)特定任務(wù),接入不同類型的知識庫,比如企業(yè)文檔、產(chǎn)品手冊等。
大模型應(yīng)用開發(fā)-RAG的技術(shù)框架
RAG 的工作流程通常包含以下幾個模塊:
01、數(shù)據(jù)預(yù)處理
首先需要一個知識庫,可以是公司內(nèi)部的文檔數(shù)據(jù)庫、網(wǎng)絡(luò)爬取的數(shù)據(jù)、甚至客戶提供的資料。將這些文檔處理成可搜索的格式是第一步,通常會:
轉(zhuǎn)為文本格式(如果是 PDF、圖片等需要 OCR 技術(shù))。
通過分句或分段,將文本切分為粒度適中的片段。
使用嵌入模型(如 OpenAI 的 text-embedding 模型或 Sentence-BERT)將片段轉(zhuǎn)換為向量,存入向量數(shù)據(jù)庫(如 Pinecone、Weaviate)。
02、信息檢索
接下來,當(dāng)用戶提出一個問題時,系統(tǒng)會:
對問題生成向量表示。
在向量數(shù)據(jù)庫中,通過相似度檢索找到最相關(guān)的文檔片段。
檢索效率和準(zhǔn)確性在這一階段至關(guān)重要,通常會選擇高效的檢索工具,如 FAISS、Milvus。
03、生成回答
檢索到的信息作為上下文,輸入到大模型中。大模型通過結(jié)合檢索結(jié)果和自身的推理能力,生成符合語義邏輯的回答。這一步驟通常使用 OpenAI 的 GPT-4 或 Hugging Face 的開源模型。
大模型應(yīng)用開發(fā)-為什么要使用RAG
克服大模型的“幻覺”
大模型有個很大的短板,就是它們的回答并非基于真實(shí)的事實(shí),而是基于訓(xùn)練數(shù)據(jù)的統(tǒng)計規(guī)律。RAG 在回答中引入了明確的外部知識來源,大幅減少了“張冠李戴”的情況。
動態(tài)更新知識
大模型的訓(xùn)練數(shù)據(jù)通常有時效性,而通過 RAG,你的系統(tǒng)可以連接到實(shí)時更新的知識庫,無需每次更新都重新訓(xùn)練模型。
降低開發(fā)成本
直接訓(xùn)練一個覆蓋廣泛知識的大模型代價高昂。而利用 RAG,開發(fā)者可以用一個小而通用的模型,通過接入特定領(lǐng)域的知識庫,輕松實(shí)現(xiàn)定制化應(yīng)用。
大模型應(yīng)用開發(fā)-RAG 的應(yīng)用場景
智能客服
很多公司在構(gòu)建客服機(jī)器人時,都遇到一個問題:機(jī)器人總是答非所問。通過 RAG,機(jī)器人可以從公司知識庫中檢索最相關(guān)的信息,結(jié)合大模型生成專業(yè)且貼切的回答。
醫(yī)療問診
醫(yī)療領(lǐng)域需要嚴(yán)謹(jǐn)?shù)幕卮稹AG 可以從醫(yī)學(xué)文獻(xiàn)數(shù)據(jù)庫中獲取最新的研究資料,確保問診系統(tǒng)不會因?yàn)椤盎糜X”提供錯誤的健康建議。
法律咨詢
律師事務(wù)所的知識庫包含大量條文和案例,通過 RAG 技術(shù),可以為客戶提供精準(zhǔn)的法律支持,避免錯漏。
教育輔導(dǎo)
RAG 能在教育領(lǐng)域大展拳腳,比如結(jié)合教材和題庫,提供個性化的學(xué)習(xí)建議和習(xí)題解析。
大模型應(yīng)用開發(fā)-構(gòu)建RAG應(yīng)用的關(guān)鍵挑戰(zhàn)
在數(shù)據(jù)質(zhì)量方面,如果知識庫的內(nèi)容有誤,生成的回答同樣會出錯。因此,知識庫的構(gòu)建需要嚴(yán)格的質(zhì)量把控。
而且知識庫規(guī)模越大,檢索的時間成本越高。采用高效的向量檢索算法,如 HNSW,可以顯著提升性能。
將檢索結(jié)果與生成模型高效結(jié)合并非易事。檢索到的信息是否足夠準(zhǔn)確、模型是否能理解檢索到的上下文,這些都是需要優(yōu)化的細(xì)節(jié)。
大模型應(yīng)用開發(fā)-使用RAG構(gòu)建問答系統(tǒng)
本次我們使用haystack構(gòu)建一個產(chǎn)品說明書的問答系統(tǒng):
haystack github地址:?https://github.com/deepset-ai/haystack
Haystack 是一個開源框架,用于構(gòu)建端到端的 檢索增強(qiáng)生成(RAG) 系統(tǒng)和問答(QA)應(yīng)用。它由 deepset 開發(fā),旨在幫助開發(fā)者快速實(shí)現(xiàn)復(fù)雜的知識管理和問答功能,如基于文檔的 QA 系統(tǒng)、聊天機(jī)器人、搜索引擎等。
示例代碼:
# 安裝?haystack
pip install farm-haystack[all]
#?準(zhǔn)備資料?產(chǎn)品手冊??product_manual.txt
產(chǎn)品名稱: 超能智能手表 X1
功能: 支持心率監(jiān)測、睡眠跟蹤、GPS 跟蹤、語音助手。
電池續(xù)航: 正常使用續(xù)航 7 天,重度使用續(xù)航 2 天。
充電時間: 2 小時可充滿。
兼容性: 適配 Android 6.0 及以上,iOS 11.0 及以上。
注意事項: 請勿將手表暴露在超過 50°C 的環(huán)境中。
#?示例代碼
from haystack.document_stores import FAISSDocumentStore
from haystack.nodes import EmbeddingRetriever, FARMReader
from haystack.pipelines import ExtractiveQAPipeline
from haystack.schema import Document
# 初始化向量數(shù)據(jù)庫
document_store = FAISSDocumentStore(embedding_dim=768)
# 加載產(chǎn)品說明書數(shù)據(jù)
def load_manual(file_path):
"""讀取產(chǎn)品說明書并格式化為 Haystack 文檔"""
with open(file_path, "r", encoding="utf-8") as f:
content = f.read()
return [Document(content=content)]
docs?=?load_manual("product_manual.txt")
# 將文檔寫入向量數(shù)據(jù)庫
document_store.write_documents(docs)
# 初始化檢索器
retriever = EmbeddingRetriever(
document_store=document_store,
embedding_model="sentence-transformers/all-mpnet-base-v2", # 使用 Sentence-BERT
use_gpu=True
)
# 更新向量數(shù)據(jù)庫中的嵌入
document_store.update_embeddings(retriever)
# 初始化閱讀器(生成模型)
reader = FARMReader(model_name_or_path="deepset/roberta-base-squad2", use_gpu=True)
# 構(gòu)建問答管道
pipeline = ExtractiveQAPipeline(reader, retriever)
# 進(jìn)行問答
query = "這款手表有什么要注意的嗎?"
result = pipeline.run(
query=query,
params={
"Retriever": {"top_k": 3}, # 檢索最相關(guān)的 3 條文檔
"Reader": {"top_k": 1} # 生成最優(yōu)答案
}
)
# 輸出答案
answer = result["answers"][0]
print(f"Question: {query}")
print(f"Answer:?{answer.answer}")
# 輸出
Batches:?100%
?1/1?[00:00<00:00,??4.00it/s]
Inferencing Samples: 100%|██████████| 1/1 [00:02<00:00, 2.22s/ Batches]Question: 這款手表有什么要注意的嗎?
Answer: 注意事項: 請勿將手表暴露在超過 50°C