本文結合“基於ERNIE SDK+LangChain搭建個人知識庫”的代碼示例,爲您講解RAG的相關概念。
概念
在2020年Facebook AI Research(FAIR)團隊發表一篇名爲《Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks》的論文。這篇論文首次提出了RAG概念(目前大語言模型領域的一個重要概念),並對該概念進行詳細介紹和解釋。
此圖是FAIR團隊的方法概述。結合了一個預先訓練的檢索器(查詢編碼器+文檔Index),並進行端到端微調。對於查詢x,作者使用最大內積搜索(MIPS)查找前K個文檔zi對於最終預測y,並將z視爲一個潛在變量,並在給定不同文獻的seq2seq預測上進行邊緣化。
RAG模型結合了語言模型和信息檢索技術。具體來說,當模型需要生成文本或者回答問題時,它會先從一個龐大的文檔集合中檢索出相關的信息,然後利用這些檢索到的信息來指導文本的生成,從而提高預測的質量和準確性。其中,“檢索”、“利用”、“生成”是RAG的關鍵部分。
那如何才能更直觀地理解這三個部分呢?
舉個簡單的例子:你正在寫一篇關於小狗的文章,但你對小狗的知識有限。這時,你很可能會進行以下操作:
1.檢索(Retrieval):
首先,你打開電腦,輸入關鍵詞爲“小狗”的搜索請求,在互聯網上檢索了大量的關於小狗的文章、博客和信息。
2.利用(Utilization):
接下來,你會分析這些搜索結果,並提取其中的重要信息,包括狗狗的種類、行爲習慣、飼養方式等等。你將這些信息整理成一個知識庫,這個知識庫就像一本百科全書,裏面包含了各種關於小狗的知識點。
3.生成(Generation):
現在,你需要寫文章。在文章的開頭,通過一個問題引入:“小狗的壽命有多長?”隨後,便可以使用之前檢索和整理的信息來回答問題,或者生成文章的段落。這一步不僅僅是簡單地複製粘貼,而是根據上下文和語法規則生成自然流暢的文本。
其實上述“你”的工作流就是“RAG”的工作流,可以將“你”當作一個RAG模型,即“檢索”、“利用”、“生成”。瞭解了RAG的基本工作流之後,可能會思考:RAG主要在什麼場景下使用呢?如果它們在這些場景中進行“檢索”,“利用”和“生成”,具體的工作內容又是什麼呢?
場景
RAG技術可以在以下一些常見的自然語言處理任務中發揮作用:
1.問答系統(QA Systems): RAG可以用於構建強大的問答系統,能夠回答用戶提出的各種問題。它能夠通過檢索大規模文檔集合來提供準確的答案,無需針對每個問題進行特定訓練。
2.文檔生成和自動摘要(Document Generation and Automatic Summarization): RAG可用於自動生成文章段落、文檔或自動摘要,基於檢索的知識來填充文本,使得生成的內容更具信息價值。
3.智能助手和虛擬代理(Intelligent Assistants and Virtual Agents): RAG可以用於構建智能助手或虛擬代理,結合聊天記錄回答用戶的問題、提供信息和執行任務,無需進行特定任務微調。
4.信息檢索(Information Retrieval): RAG可以改進信息檢索系統,使其更準確深刻。用戶可以提出更具體的查詢,不再侷限於關鍵詞匹配。
5.知識圖譜填充(Knowledge Graph Population): RAG可以用於填充知識圖譜中的實體關係,通過檢索文檔來識別和添加新的知識點。
優勢
以上是RAG一些常見的應用場景。明晰了RAG的應用範圍後,可能會產生疑問:爲什麼這些場景需要使用RAG,而不是進行微調或者通過其他方法來實現呢?接下來,我們進一步瞭解RAG的優勢。以下爲RAG的具體優勢:
1.外部知識的利用: RAG模型可以有效地利用外部知識庫,它可以引用大量的信息,以提供更深入、準確且有價值的答案,這提高了生成文本的可靠性。
2.數據更新及時性: RAG模型具備檢索庫的更新機制,可以實現知識的即時更新,無需重新訓練模型。說明RAG模型可以提供與最新信息相關的回答,高度適配要求及時性的應用。
3.回覆具有解釋性: 由於RAG模型的答案直接來自檢索庫,它的回覆具有很強的可解釋性,減少大模型的幻覺。用戶可以覈實答案的準確性,從信息來源中獲取支持。
4.高度定製能力: RAG模型可以根據特定領域的知識庫和prompt進行定製,使其快速具備該領域的能力。說明RAG模型廣泛適用於的領域和應用,比如虛擬伴侶、虛擬寵物等應用。
5.安全和隱私管理: RAG模型可以通過限制知識庫的權限來實現安全控制,確保敏感信息不被泄露,提高了數據安全性。
6.減少訓練成本: RAG模型在數據上具有很強的可拓展性,可以將大量數據直接更新到知識庫,以實現模型的知識更新。這一過程的實現不需要重新訓練模型,更經濟實惠。
對比微調
接下來,通過對比RAG與微調,幫助大家根據具體的業務需求,選擇合適的策略:
- 任務特定vs通用性: 微調通常是爲特定任務進行優化,而RAG是通用的,可以用於多種任務。微調對於特定任務的完成效果好,但在通用性問題上不夠靈活。
- 知識引用vs學習: RAG模型通過引用知識庫來生成答案,而微調是通過學習任務特定的數據生成答案。RAG的答案直接來自外部知識,更容易覈實。
- 即時性vs訓練: RAG模型可以實現即時的知識更新,無需重新訓練,在及時性要求高的應用中佔優勢。微調通常需要重新訓練模型,時間成本較高。
- 可解釋性vs難以解釋性: RAG的答案可解釋性強,因爲它們來自知識庫。微調模型的內部學習可能難以解釋。
- 定製vs通用性: RAG可以根據特定領域進行定製,而微調需要爲每個任務進行特定微調,需要更多任務特定的數據。
結合上面的比較,我們可以清楚的看到RAG的優勢在於通用性、知識引用、即時性和可解釋性,而微調在特定任務上可能更適用,但同時需要更多的任務特定數據和訓練。選擇使用哪種方法,應根據具體的應用需求和任務來決定。
項目示例
那RAG具體怎麼實現呢?我們用一個簡單的代碼示例來舉例:基於ERNIE SDK和LangChain搭建個人知識庫。
安裝ERNIE Bot
!pip install --upgrade erniebot
測試embedding
import erniebot
erniebot.api_type = "aistudio"
erniebot.access_token = "<你的token>"
response = erniebot.Embedding.create(
model="ernie-text-embedding",
input=[
"我是百度公司開發的人工智能語言模型,我的中文名是文心一言,英文名是ERNIE-Bot,可以協助您完成範圍廣泛的任務並提供有關各種主題的信息,比如回答問題,提供定義和解釋及建議。如果您有任何問題,請隨時向我提問。" ])
print(response.get_result())
引入Chromadb向量數據庫
!pip install chromadb
自定義嵌入函數
定義一個自定義的嵌入函數,用於將文本內容轉換爲嵌入向量。其中使用ERNIE Bot庫來創建文本的嵌入,並且通過Chromadb庫來管理這些嵌入向量。
import os
import erniebot
from typing import Dict, List, Optional
import chromadb
from chromadb.api.types import Documents, EmbeddingFunction, Embeddings
def embed_query(content):
response = erniebot.embedding.create(
model="ernie-text-embedding",
input=[content])
result = response.get_result()
print(result)
return result
class ErnieEmbeddingFunction(EmbeddingFunction):
def __call__(self, input: Documents) -> Embeddings:
embeddings = []
for text in input:
response = embed_query(text)
try:
embedding = response[0]
embeddings.append(embedding)
except (IndexError, TypeError, KeyError) as e:
print(f"Error processing text: {text}, Error: {e}")
return embeddings
chroma_client = chromadb.Client()
chroma_client = chromadb.PersistentClient(path="chromac") #數據保存硬盤位置 可選
collection = chroma_client.create_collection(name="demo", embedding_function=ErnieEmbeddingFunction())
print(collection)
導入數據集
選用課程內容作爲知識庫
文檔切割
使用LangChain庫來處理和分割文本文檔
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import Chroma
from langchain.document_loaders import TextLoader
loader = TextLoader('./AI大課逐字稿.txt',encoding='utf-8')
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=600, chunk_overlap=20)
docs = text_splitter.split_documents(documents)
docs
Embedding 嵌入
將分割後的文檔列表轉換爲嵌入向量,以便進行進一步的分析和處理。
import uuid
docs_list=[]
metadatas=[]
ids=[]
for item in docs:
docs_list.append(item.page_content)
metadatas.append({"source": "AI大課逐字稿"})
ids.append(str(uuid.uuid4()))
collection.add(
documents=docs_list,
metadatas=metadatas,
ids=ids
)
檢索
query = "講師說見VC有兩種錯誤的思維方式,分別是什麼"
results = collection.query(
query_texts=[query],
n_results=2
)
content=results['documents'][0]
[ ]
prompt=f"""
用戶問題:{query}
<context>
{content}
</context>
根據<context>裏的知識點回答用戶問題
"""
response = erniebot.ChatCompletion.create(model="ernie-4.0", messages=[{"role": "user", "content": prompt}])
print(response.get_result())
#講師說見VC有兩種錯誤的思維方式,分別是:
##1. 用過去的方式套今天的人工智能,比如比喻成OS。一旦比喻成操作系統,就得出結論全世界兩套到三套,你覺得必然會被壟斷、沒有機會了,這種是典型的刻舟求劍。
#2. 人容易對已經成功的事委曲求全,對於創新的新生代創業者容易求全責備。特別是有些做VC容易犯這個錯誤,比如OpenAI做成了,已經證明了,是個傻子都能看到OpenAI做的很成功,我們容易對它頂禮膜拜,恨不得跪下。對創業者很多還不成形的想法,因爲八字沒有一撇,光看到了你的很多缺點,這種價值觀是不對的,容易Miss掉一些有潛力的項目。
封裝函數
包含了之前步驟中存儲的文本嵌入向量。函數的目的是接收用戶的查詢,從數據庫中檢索相關信息,並生成一個回答。
def main(query):
results = collection.query(
query_texts=[query],
n_results=2
)
content=results['documents'][0]
prompt=f"""
用戶問題:{query}
<context>
{content}
</context>
根據<context>裏的知識點回答用戶問題
"""
response = erniebot.ChatCompletion.create(model="ernie-4.0", messages=[{"role": "user", "content": prompt}])
return response.get_result()
query=input("請輸入您要查詢的問題:")
print(main(query))
顯然,RAG的應用不僅僅滿足於此,目前也誕生了各種RAG的高階用法。
通過不斷優化RAG,使其具有更強大的信息理解能力,理解問題更加透徹,找到與問題高度匹配的信息後,生成更爲精準的答案。比如針對“講一下金毛犬的特點”這一指令,高級RAG模型可以理解這是一個關於小狗特定品種的問題,將從知識庫中提取金毛犬的細節信息,如體格、性格、歷史等,以對齊問題的顆粒度,提供詳細的回答。
在優化RAG的過程中,也產生了一系列相關的方法。
在信息檢索和搜索引擎優化領域,通過實施一系列策略可以顯著提升檢索系統的性能。索引優化通過提升數據粒度、優化索引結構、添加元數據信息、對齊優化和混合檢索等方法,可以提高檢索的準確性和效率。向量表徵模型的優化通過微調和動態嵌入技術,增強了模型對特定領域或問題的理解能力。檢索後處理策略如重排序和Prompt壓縮,進一步提升了檢索結果的相關性和用戶滿意度。遞歸檢索和搜索引擎優化通過遞歸檢索和子查詢等技術,實現了更復雜和精確的檢索需求。最後,RAG評估通過獨立評估和端到端評估方法,確保了檢索系統在各個方面都能滿足用戶的需求。這些策略的實施,共同推動了檢索技術的進步,爲用戶提供了更加高效和精準的信息服務。具體參考下圖:
除了以上5種方法,還有其他很多高級的RAG用法,大家可以針對感興趣的部分自行查閱相關論文,進行學習瞭解。