RAG一文讀懂!概念、場景、優勢、對比微調與項目代碼示例

本文結合“基於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用法,大家可以針對感興趣的部分自行查閱相關論文,進行學習瞭解。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章