實踐篇:利用ragas在自己RAG上實現LLM評估②

文章目錄

    • 使用ragas做評估
      • 在自己的數據集上評估
        • 完整代碼
        • 代碼講解
          • 1. RAG系統構建
            • 核心組件初始化
            • 文檔處理流程
          • 2. 評估數據集構建
          • 3. RAGAS評估實現
            • 1. 評估數據集創建
            • 2. 評估器配置
            • 3. 執行評估

本系列閱讀:
理論篇:RAG評估指標,檢索指標與生成指標①
實踐篇:利用ragas在自己RAG上實現LLM評估②

首先我們可以共識LLM的評估最好/最高效的方式就是再利用LLM的強大能力,而不是用傳統指標。
假設我們不用LLM評估我們只有兩條方式可實現:

  1. 傳統指標,如Bleu。需輸入標準答案(通常也是人工審核答案是不是標準的,或者是人工制造標準答案),缺點是效果有限,用了都知道效果慘不忍睹。
  2. 純人工打分。缺點是耗時,帶有主觀性。

使用ragas做評估

推薦一個包ragas。但是它的教程文檔確實寫得不太好,可能是jupyter格式,直接在py中運行,總是會報少變量之類。我這邊都改動了下,確保我們py文件可以運行。
在這里插入圖片描述
ragas(Retrieval Augmented Generation Assessment)是社區最著名的評估方案,內置了我們常見的評估指標。
在這里插入圖片描述
利用了LLM評估,因此不需要人工打標。其出名是因為封裝了LLM做評估,簡單易用(當然其實這些也是我們可以造輪子實現的~)。

代碼鏈接https://github.com/blackinkkkxi/RAG_langchain/blob/main/learn/evaluation/RAGAS-langchian.ipynb

在自己的數據集上評估

完整可運行的代碼見本文的完整代碼小節,代碼可運行。而1~3我們會拆開完整代碼講解,代碼主要用于講解完整代碼,可能不能運行。

完整代碼

在使用我的代碼你只需要把deepseekapi換成你自己的即可。

import os
import re
from langchain_community.document_loaders import WebBaseLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain_community.vectorstores import Chroma
from langchain.prompts import PromptTemplate
from langchain.chains import RetrievalQA
from langchain.chat_models import init_chat_model
from ragas import evaluate
from ragas.llms import LangchainLLMWrapper
from ragas import EvaluationDataset
from ragas.metrics import LLMContextRecall, Faithfulness, FactualCorrectnessclass RAG:def __init__(self, api_key=None):"""使用DeepSeek模型和BGE嵌入初始化RAG系統"""# 設置環境變量os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'# 初始化對話模型self.llm = init_chat_model(model="deepseek-chat",api_key=api_key,api_base="https://api.deepseek.com/",temperature=0,model_provider="deepseek",)# 初始化嵌入模型self.embedding_model = HuggingFaceEmbeddings(model_name="BAAI/bge-large-zh-v1.5")# 初始化文本分割器self.text_splitter = RecursiveCharacterTextSplitter(chunk_size=500,chunk_overlap=50)# 初始化向量存儲和檢索器self.vectorstore = Noneself.retriever = Noneself.qa_chain = None# 設置提示模板self.template = """根據以下已知信息,簡潔并專業地回答用戶問題。如果無法從中得到答案,請說"我無法從已知信息中找到答案"。已知信息:{context}用戶問題:{question}回答:"""self.prompt = PromptTemplate(template=self.template,input_variables=["context", "question"])def load_documents_from_url(self, url, persist_directory="./chroma_db"):"""從網頁URL加載文檔并創建向量存儲"""# 從網頁加載文檔loader = WebBaseLoader(url)documents = loader.load()# 將文檔分割成塊chunks = self.text_splitter.split_documents(documents)# 創建向量存儲self.vectorstore = Chroma.from_documents(documents=chunks,embedding=self.embedding_model,persist_directory=persist_directory)# 創建檢索器self.retriever = self.vectorstore.as_retriever()# 創建問答鏈self.qa_chain = RetrievalQA.from_chain_type(llm=self.llm,chain_type="stuff",retriever=self.retriever,chain_type_kwargs={"prompt": self.prompt})print(f"成功從 {url} 加載并處理文檔")def ask(self, question):"""便捷的提問方法"""result = self.qa_chain.invoke({"query": question})return result["result"]def relevant_docs_with_scores(self, query, k=1):"""計算相關文檔及其相似度分數,返回處理后的文檔信息"""docs_with_scores = self.vectorstore.similarity_search_with_score(query, k=k)# 處理文檔內容processed_docs = []for i, (doc, score) in enumerate(docs_with_scores, 1):# 清理文檔內容content = doc.page_content.strip()# 去除回車符、換行符和多余的空白字符content = content.replace('\n', ' ').replace('\r', ' ').replace('\t', ' ')# 合并多個連續空格為單個空格content = re.sub(r'\s+', ' ', content)processed_docs.append({'index': i,'score': score,'content': content})return processed_docs# 使用示例
if __name__ == "__main__":api_key = "X"queries = ["為什么Transformer需要位置編碼?","QKV矩陣是怎么得到的?","注意力機制的本質是什么?","對于序列長度為n的輸入,注意力機制的計算復雜度是多少?","在注意力分數計算中,為什么要除以√d?","多頭注意力機制的主要作用是什么?","解碼器中的掩碼自注意力是為了什么?","編碼器-解碼器注意力中,Query來自哪里?","GPT系列模型使用的是哪種架構?","BERT模型適合哪類任務?"]# 初始化RAGrag = RAG(api_key)# 從URL加載文檔rag.load_documents_from_url("https://blog.csdn.net/ngadminq/article/details/147687050")expected_responses = ["Transformer的輸入是并行處理的,不像RNN有天然的序列關系,因此需要位置編碼來為模型提供詞元在序列中的位置信息,確保模型能理解詞的先后順序。","QKV矩陣通過將輸入向量分別與三個不同的權重矩陣W_q、W_k、W_v進行線性投影得到,這三個權重矩陣是模型的可學習參數,在訓練過程中不斷優化。","注意力機制的本質是為序列中的每個詞找到重要的上下文信息,通過計算詞與詞之間的相關性分數,實現對重要信息的聚焦和整合。","注意力機制的計算復雜度是O(n2),因為序列中每個詞都需要與所有其他詞計算注意力分數,形成n×n的注意力矩陣。","除以√d是為了提升訓練穩定性,防止注意力分數過大導致softmax函數進入飽和區,確保梯度能夠有效傳播。","多頭注意力機制可以從多個角度捕捉不同類型的詞間關聯,比如語義關系、句法關系等,增強了模型的表達能力和理解能力。","解碼器中的掩碼自注意力是為了防止當前位置關注未來位置的信息,確保在自回歸生成過程中每個位置只能看到當前及之前的信息。","在編碼器-解碼器注意力中,Query來自解碼器的前一層輸出,而Key和Value來自編碼器的最終輸出,這樣解碼器就能利用編碼器處理的源序列信息。","GPT系列模型使用僅解碼器架構,專門針對文本生成任務設計,通過掩碼自注意力機制實現從左到右的序列生成。","BERT模型適合分類和理解類任務,如文本分類、命名實體識別、情感分析、問答等,因為它使用雙向編碼器可以同時關注上下文信息。"]dataset = []for query, reference in zip(queries, expected_responses):# 獲取相關文檔及分數并打印relevant_docs = rag.relevant_docs_with_scores(query)relevant_docs = relevant_docs[0]['content']response = rag.ask(query)dataset.append({"user_input": query,"retrieved_contexts": [relevant_docs],"response": response,"reference": reference})evaluation_dataset = EvaluationDataset.from_list(dataset)llm = init_chat_model(model="deepseek-chat",api_key=api_key,api_base="https://api.deepseek.com/",temperature=0,model_provider="deepseek",)evaluator_llm = LangchainLLMWrapper(llm)result = evaluate(dataset=evaluation_dataset, metrics=[LLMContextRecall(), Faithfulness(), FactualCorrectness()],llm=evaluator_llm)print(result)

以下是運行的結果:
在這里插入圖片描述
根據我們的結果指標可以針對指標有優化方向

代碼講解
1. RAG系統構建
核心組件初始化
class RAG:def __init__(self, api_key=None):# DeepSeek聊天模型self.llm = init_chat_model(model="deepseek-chat",api_key=api_key,api_base="https://api.deepseek.com/",temperature=0,model_provider="deepseek",)# BGE中文嵌入模型self.embedding_model = HuggingFaceEmbeddings(model_name="BAAI/bge-large-zh-v1.5")# 文本分割器self.text_splitter = RecursiveCharacterTextSplitter(chunk_size=500,chunk_overlap=50)

技術要點:

  • 使用DeepSeek作為生成模型,temperature=0確保輸出穩定性
  • BGE-large-zh-v1.5是目前中文嵌入效果較好的開源模型
  • 文本分塊策略:500字符塊大小,50字符重疊防止信息丟失
文檔處理流程
def load_documents_from_url(self, url, persist_directory="./chroma_db"):# 1. 網頁內容加載loader = WebBaseLoader(url)documents = loader.load()# 2. 文檔分塊chunks = self.text_splitter.split_documents(documents)# 3. 向量化存儲self.vectorstore = Chroma.from_documents(documents=chunks,embedding=self.embedding_model,persist_directory=persist_directory)# 4. 構建檢索鏈self.qa_chain = RetrievalQA.from_chain_type(llm=self.llm,chain_type="stuff",retriever=self.retriever,chain_type_kwargs={"prompt": self.prompt})
2. 評估數據集構建

數據集需要包含四個核心要求

dataset.append({"user_input": str,                # 用戶查詢,即我們備好的一系列問題"retrieved_contexts": [strstr], # 檢索到的上下文,list格式"response": str,               # 系統回答"reference": str             # 標準答案,人工制造,我這里使用cluade生成的
})
3. RAGAS評估實現
1. 評估數據集創建
from ragas import EvaluationDataset
evaluation_dataset = EvaluationDataset.from_list(dataset)
2. 評估器配置
from ragas.llms import LangchainLLMWrapper
evaluator_llm = LangchainLLMWrapper(llm)

關鍵點: RAGAS使用LLM作為評估器,需要將LangChain模型包裝成RAGAS兼容格式

3. 執行評估

代碼使用了三個核心評估指標:

LLMContextRecall(上下文召回率)

  • 作用: 評估檢索到的上下文是否包含回答問題所需的信息
  • 計算方式: 通過LLM判斷標準答案中的信息有多少能在檢索上下文中找到
  • 公式: Context Recall = 可在上下文中找到的標準答案句子數 / 標準答案總句子數

Faithfulness(忠實度)

  • 作用: 衡量生成回答與檢索上下文的一致性,防止幻覺
  • 計算方式: 檢查回答中的每個聲明是否能在提供的上下文中得到支持
  • 公式: Faithfulness = 有上下文支持的聲明數 / 總聲明數

FactualCorrectness(事實正確性)

  • 作用: 評估生成回答的事實準確性
  • 計算方式: 將生成回答與標準答案進行事實層面的比較
  • 評估維度: 包括事實的正確性、完整性和相關性
from ragas.metrics import LLMContextRecall, Faithfulness, FactualCorrectnessresult = evaluate(dataset=evaluation_dataset, metrics=[LLMContextRecall(), Faithfulness(), FactualCorrectness()],llm=evaluator_llm
)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/86575.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/86575.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/86575.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

微軟PowerBI考試 PL300-在 Power BI 中清理、轉換和加載數據

微軟PowerBI考試 PL300-在 Power BI 中清理、轉換和加載數據 Power Query 具有大量專門幫助您清理和準備數據以供分析的功能。 您將了解如何簡化復雜模型、更改數據類型、重命名對象和透視數據。 您還將了解如何分析列,以便知曉哪些列包含有價值的數據,…

PostgreSQL 安裝與配置全指南(適用于 Windows、macOS 與主流 Linux 發行版)

PostgreSQL 是一個功能強大、開源、穩定的對象關系數據庫系統,廣泛用于后端開發、數據處理與分布式架構中。本指南將手把手教你如何在 Windows、macOS 以及主流 Linux 發行版 上安裝 PostgreSQL,并附上安裝驗證命令與基礎配置方法。 一、Windows 安裝與配…

WordPress博客文章SEO的優化技巧

在數字時代,博客不僅用于表達觀點,也能提升品牌影響力并吸引潛在客戶。許多服務器提供商(如 Hostease)支持 WordPress 一鍵安裝功能,方便新手快速完成安裝,專注于內容創作和 SEO 優化。然而,寫出…

Python:操作 Excel 折疊

??親愛的技術愛好者們,熱烈歡迎來到 Kant2048 的博客!我是 Thomas Kant,很開心能在CSDN上與你們相遇~?? 本博客的精華專欄: 【自動化測試】 【測試經驗】 【人工智能】 【Python】 Python 操作 Excel 系列 讀取單元格數據按行寫入設置行高和列寬自動調整行高和列寬水平…

雨季智慧交通:從車輛盲區到客流統計的算法全覆蓋

雨季智慧交通中的視覺分析技術應用 一、背景:雨季交通的復雜挑戰 雨季是城市交通管理的關鍵考驗期。以濟南為例,強對流天氣伴隨的短時強降水、雷雨大風及冰雹,不僅導致道路積水、能見度驟降,還加劇了大型車輛(如渣土…

安全生產管理是什么?安全生產管理系統都有哪些核心功能?

隨著法律法規的日益嚴格和公眾對安全意識的提升,企業面臨的安全生產壓力也越來越大。無論是大型企業還是中小型企業,安全生產管理不僅關系到企業的生存與發展,更直接關系到員工的生命安全和企業的社會形象。因此,理解并實施有效的…

【PyCharm必會基礎】正確移除解釋器及虛擬環境(以 Poetry 為例 )

#工作記錄 【PyCharm使用基礎】 當遇到虛擬環境難以修復的場景,我們需要刪除當前解釋器和虛擬環境然后再重新創建虛擬環境,以下是在PyCharm中正確移除的步驟。 一、進入解釋器設置 在 PyCharm 界面右下角,點擊Poetry (suna0),選…

day028-Shell自動化編程-判斷進階

文章目錄 1. 特殊變量補充2. 變量擴展-變量子串2.1 獲取變量字符的長度2.2 給變量設置默認值 3. 命令3.1 dirname3.2 basename3.3 cut 4. 條件測試命令:[]4.1 邏輯運算符4.2 文件測試4.3 案例:書寫腳本-檢查文件類型4.4 邏輯運算4.5 案例:書寫…

oracle sql 語句 優化方法

1、表盡量使用別名,字段盡量使用別名.字段名,這樣子,可以減少oracle數據庫解析字段名。而且把 不需要的字段名剔除掉,只保留有用的字段名,不要一直使用 select *。 2、關聯查詢時,選擇好主表 。oracle解析…

【Java】Ajax 技術詳解

文章目錄 1. Filter 過濾器1.1 Filter 概述1.2 Filter 快速入門開發步驟:1.3 Filter 執行流程1.4 Filter 攔截路徑配置1.5 過濾器鏈2. Listener 監聽器2.1 Listener 概述2.2 ServletContextListener3. Ajax 技術3.1 Ajax 概述3.2 Ajax 快速入門服務端實現:客戶端實現:4. Axi…

07 APP 自動化- appium+pytest+allure框架封裝

文章目錄 一、PO二、代碼簡單實現項目框架預覽:base_page.pydir_config.pyget_data.pylogger.pystart_session.pyconfig.yamlkey_code.yamllaunch_page_loc.pylogin_page_loc.pylaunch_page.pylogin_page.pytest_login.pypytest.inirun.py APP 自動化代碼總和 一、P…

用戶體驗升級:表單失焦調用接口驗證,錯誤信息即時可視化

現代前端應用中,表單交互是用戶體驗的重要組成部分。而表單驗證作為其中的核心環節,不僅需要前端的即時反饋,還需要與后端接口聯動進行數據合法性校驗。本文將詳細介紹如何在Vue3中實現表單輸入與接口驗證的無縫聯動,并優雅地展示…

Vue 插槽(Slot)用法詳解

插槽(Slot)是Vue中一種強大的內容分發機制,它允許你在組件中定義可替換的內容區域,為組件提供了更高的靈活性和可復用性。本文將全面介紹Vue插槽的各種用法。 1. 基本插槽 基本插槽是最簡單的插槽形式,它允許父組件向子組件插入內容。 子組…

C++ 標準模板庫(STL)詳解文檔

C 標準模板庫(STL)詳解文檔 1 前言2 常用容器2.1 內容總覽2.2 向量 vector2.2.1 概述2.2.2 常用方法2.2.3 適用場景2.2.4 注意事項 2.3 棧 stack2.3.1 概述2.3.2 常用方法2.3.3 注意事項 2.4 隊列 queue2.4.1 概述2.4.2 常用方法2.4.3 注意事項 2.5 優先…

【入坑系列】TiDB 強制索引在不同庫下不生效問題

文章目錄 背景SQL 優化情況線上SQL運行情況分析懷疑1:執行計劃綁定問題?嘗試:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 寫法Hint 不生效問題排查解決參考背景 項目中使用 TiDB 數據庫,并對 SQL 進行優化了,添加了強制索引。 UAT 環境已經生效,但 PROD 環境強制索…

Redis(02)Win系統如何將Redis配置為開機自啟的服務

一、引言 Redis 是一款高性能的鍵值對存儲數據庫,在眾多項目中被廣泛應用。在 Windows 環境下,為了讓 Redis 能更穩定、便捷地運行,將其設置為系統服務并實現自動啟動是很有必要的。這樣一來,系統開機時 Redis 可自動加載&#xf…

apex新版貌似移除了amp從源碼安裝方式裝的話會在from apex import amp時報錯

問題: 安裝完apex結果 from apex import amp會報錯 解決方法: # apex git clone https://github.com/NVIDIA/apex cd apex # https://github.com/modelscope/ms-swift/issues/4176 git checkout e13873debc4699d39c6861074b9a3b2a02327f92 pip insta…

掌握 HTTP 請求:理解 cURL GET 語法

cURL 是一個強大的命令行工具,用于發送 HTTP 請求和與 Web 服務器交互。在 Web 開發和測試中,cURL 經常用于發送 GET 請求來獲取服務器資源。本文將詳細介紹 cURL GET 請求的語法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的縮寫…

【AI學習】三、AI算法中的向量

在人工智能(AI)算法中,向量(Vector)是一種將現實世界中的數據(如圖像、文本、音頻等)轉化為計算機可處理的數值型特征表示的工具。它是連接人類認知(如語義、視覺特征)與…

基于算法競賽的c++編程(28)結構體的進階應用

結構體的嵌套與復雜數據組織 在C中,結構體可以嵌套使用,形成更復雜的數據結構。例如,可以通過嵌套結構體描述多層級數據關系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…