RAG知識庫的可靠性評估(一)

    在開發基於LLM的RAG應用並準備將其上線應用時,都會比較關注RAG的性能、質量、可靠性其回答的結果準確性到底如何,甚至可以說RAG的質量可靠性其重要性要大於性能,RAG“調好了”看上去效果不錯,有沒有什麼方法去量化度量RAG應用的質量也至關重要,下圖爲RAG應用度量質量指標分佈圖

何爲RAG

    由於LLM回答問題存在一定的概率,且很多敏感、內部私有知識LLM也沒有見過所以再一些問題的回答上任何大語言模型也不是什麼都知道,這時候要求私有域數據LLM也能準確做出應答就需要對模型進行微調或外掛知識庫,這裏的外掛知識庫就是Retrieval Augmented Generation(檢索爭增強生成)也就是RAG的全稱。
    在向LLM模型提問時根據提問文本從知識庫中查找提問問題相關的內容(餘弦相似度),並將其作爲問題的上下文傳遞給LLM模型,此時大語言模型會根據所問的問題與所提供的從知識庫所得到的上下文回答該問題,爲了防止LLM胡說八道,通常會在Prompt中提示LLM只從上下文中獲取信息回答如上下文無法得到結果則回答不知道;

RAG優化理論

    RAG的開發主要流程分爲:加載文件文本分割文本向量化文本內嵌(Embedding)持久化向量檢索器等這麼幾個階段。優化可以是在這幾個階段都進行調優;這裏主要簡單介紹幾點。

文本分割

    在進行文本分割時塊大小的設置也至關重要,LangChain 默認使用文本分割後的小塊(chunks)進行索引存儲,並在查詢時比較查詢問題與向量庫中文本塊的相似度來實現檢索,所以索引塊的大小會影響到查詢的精度,通常較小的文件可使用小塊、大文件使用大塊。

小塊

    較小的文本塊可能會捕獲到更精細的語義細節,從而在嵌入後能夠更準確地反映文檔的特定部分的含義。這對於需要精確匹配的查詢很有幫助。然而,過小的文本塊可能會導致丟失上下文信息,從而影響檢索結果的完整性和準確性。

大塊

    較大的文本塊能夠保留更多的上下文信息,有助於理解文檔的整體含義。這對於理解複雜或多主題的文檔很有用。但是,較大的文本塊可能會導致嵌入向量失去一些細節,從而影響檢索的精確度。

文本內嵌

    Embeddings模型(嵌入模型)的選擇至關重要,會影響到向量庫檢索的精度,從向量庫檢索的到文本內容如和提問文本關聯度很低就會導致RAG應用質量降低。比如中文知識文本肯定不能選擇純英文Embeddings模型作爲文本嵌入模型,在生產環境也儘量不用參數規模較小的模型如ernie-3.0-nano-zh,可使用ERNIE 3.0-Base 、text2vec-base-chinese等規模相對大點的模型;

檢索器

    Langchain中提供的VectorStoreRetriever向量檢索器是最常見。其提供了Similarity Search:側重於找到與查詢最相似的文檔或文檔片段,目標是精確匹配語義上最接近、MMR(Max Marginal Relevance):是一種旨在提高搜索結果多樣性的檢索策略考慮相關性和多樣性檢索算法,還提供了多樣性lambda_mult配置參數、score_threshold分數閾值、k值、fetch_k等參數。這些參數的調整適當也會對向量知識庫的檢索精度有很大幫助;
    爲了平衡精確度和上下文信息的保留,LangChain 提供了ParentDocumentRetriever,它允許在檢索時首先使用小塊的嵌入向量進行高效匹配,然後根據需要檢索完整的父文檔以獲取更全面的上下文。這種方法結合了小塊的精確匹配能力和大塊的豐富上下文信息。

度量評估

    目前業內也有多種自動化度量評估RAG的方法,其基本原理都是根據RAG應用的提問、上下文、LLM回答的內容、或LLM回答答案與Ground-truth的相關性;通過算法計算他們相關性得到具體的數字用於評估RAG的質量。在TruLens-Eval在沒有Ground-truth的情況下評估RAG、Ragas使用了測試數據集在有Ground-truth(真實答案)的情況下評估RAG。

無Ground-truth(真實答案)的情況下對RAG進行評估

    TruLens-Eval提出了RAG 三元組的概念:**Query、Context、Response **

    RAG 流程爲用戶Query問題,RAG應用在向量庫查詢出Context,然後將Query與 Context喂到LLM,LLM生成滿足Query的Response答案。在這裏存在三元組:Query、Context 和 Response 就是 RAG 整個過程中最重要的三元組,它們之間兩兩相互牽制。此時可以通過檢測三元組之間兩兩之間的相關度,評估RAG 應用的效果。
    從上圖可以看到三個度量值,數值範圍爲值0-1:
    Context Relevance: 上下文相關性,上下文Context與Query的相關性越高RAG效果越好。此值得分低說明從向量庫查詢得到的上下文Context與Query問題相關性低,就會造成LLM幻覺或LLM的Response的回答錯誤。
    Groundedness: 真實性,度量LLM返回Response答案是否得到了Context的支撐。如關聯度低,反應了LLM的Response答案不遵從上下文Context知識,出現幻覺的可能就越大。
    Answer Relevance: 答案相關性,度量LLM的Response答案與Query提問的相關度。如分低,可能反應了回答不對題。

    在這個面板中可以清楚的看到,每個提問Query在RAG進行回答後Context Relevance(上下文相關性)、Groundedness(真實性)、Answer Relevance(答案相關性)三個指標的度量值。

    選擇一行記錄可以看到該行記錄的詳細信息,並給出三個指標的每個(result)評分的具體原因,0-1分值範圍,最高最低分別爲1和0。
    可以看到這次RAG表現非常好,這條記錄的評分爲:

    Context Relevance:0.8
    Groundedness:1
    Answer Relevance(relevance):1

存在Ground-truth(真實答案)對RAG評估

    Ragas可使用生成數據集(question、context、answer)的answer答案作爲Ground-truth(真實答案),通過數據集中的question 和 ground-truth,去定量評估RAG 應用。

主要代碼

def initTru(rag_chain):
    (f_groundedness, f_answer_relevance, f_context_relevance) =feedback.init()
    tru_recorder = TruChain(rag_chain,
    app_id='Chain1_ChatApplication',
    feedbacks=[f_answer_relevance, f_context_relevance, f_groundedness])
    return tru_recorder

def truLen(rag_chain,tru_recorder,quetion):
    response, tru_record = tru_recorder.with_record(rag_chain.invoke,quetion)
    json_like = tru_record.layout_calls_as_app()
    return response

def chatQA(quetion,history):
    tru_recorder=initTru(qa)
    resp = truLen(qa,tru_recorder,quetion)
    return resp['result']

文章首發地址:https://mp.weixin.qq.com/s/s057EEz3pw42NuH_mFc7-Q

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