Ragas 是一個 Python 函式庫,提供多種指標評估檢索增強生成(RAG)系統的效能。這些指標能幫助開發者深入瞭解其 RAG 系統的優缺點,進而調整模型與引數。理解評估指標如答案忠實度和答案相關性,對於構建高品質 RAG 系統至關重要。本篇文章將會詳細介紹如何使用 Ragas 函式庫計算這些指標,並提供程式碼範例及重構建議,以協助開發者更有效地評估和最佳化他們的 RAG 系統。此外,文章也將探討如何最佳化語義資料模型,包含向量嵌入和檢索策略,以進一步提升 RAG 應用程式的準確度和整體效能。

LLM-as-a-judge指標

常用的LLM-as-a-judge指標包括:

  • 答案忠實度(Answer Faithfulness):衡量生成的回應與檢索的上下文資訊之間的一致性。
  • 答案相關性(Answer Relevance):衡量生成的回應與輸入之間的相關性。

Ragas函式庫

Ragas是一個流行的Python函式庫,實作了這些指標以及其他用於RAG評估的指標。要了解更多關於Ragas及其可用指標的資訊,可以參考其檔案。

答案忠實度

答案忠實度是一個用於評估RAG系統生成元件的指標。它衡量生成的回應中資訊與檢索的上下文資訊之間的一致性。透過這個指標,可以幫助識別答案中是否存在任何「幻覺」。

Ragas實作

Ragas函式庫中包含了一個模組用於計算忠實度,使用以下公式: [ \text{忠實度} = \frac{\text{從上下文中推斷出的主張數}}{\text{總主張數}} ]

計算忠實度所需的資料透過以下步驟取得:

  1. 使用LLM從生成的回應中提取所有主張。
  2. 使用LLM在參考材料中定位每個主張。
  3. 計算能夠從上下文資訊中推斷出的主張比例。

程式碼示例

以下程式碼示例使用Ragas忠實度指標對一個示例輸入、上下文和RAG系統輸出的集合進行評估:

from ragas.metrics import faithfulness
from ragas import evaluate
from datasets import Dataset
from langchain_openai.chat_models import ChatOpenAI

import os

# 安裝必要的包
# pip3 install ragas==0.1.13 langchain-openai==0.1.20 datasets==2.20.0

openai_api_key = os.getenv("OPENAI_API_KEY")

evaluation_data = [
    {
        "input": "What should I do in New York City in July?",
        "output": "Check out Times Square, go to an outdoor concert, and visit the Statue of Liberty.",
        "contexts": [
            "Times Square is known for its Broadway theaters, bright lights, and bustling atmosphere.",
            "Outdoor concerts in Central Park are popular summer events attracting many visitors.",
            "The Statue of Liberty is a symbol of freedom and a must-see landmark in New York City."
        ]
    }
]

# 執行評估
faithfulness_score = faithfulness(evaluation_data, openai_api_key)
print(f"答案忠實度:{faithfulness_score:.4f}")

程式碼重構與最佳化

原始程式碼分析

原始程式碼主要負責將資料列表轉換為適合 Ragas 的資料結構,並使用 LangChain 的 ChatOpenAI 來評估模型的忠實度(faithfulness)。然而,原始程式碼有一些可以改進的地方,例如變數命名、函式結構和錯誤處理。

重構後的程式碼

import pandas as pd
from langchain import ChatOpenAI, Dataset, LLMChain
from langchain.metrics import faithfulness

# 定義資料轉換函式
def convert_data_to_ragas_format(data_list):
    """將資料列表轉換為 Ragas 的資料結構"""
    data_table = {
        'question': [],
        'answer': [],
        'contexts': []
    }
    
    for data_item in data_list:
        data_table['question'].append(data_item['input'])
        data_table['answer'].append(data_item['output'])
        data_table['contexts'].append(data_item['contexts'])
    
    return data_table

# 定義評估模型函式
def evaluate_model(data, api_key):
    """評估模型的忠實度"""
    ragas_dict = convert_data_to_ragas_format(data)
    dataset = Dataset.from_dict(ragas_dict)
    llm = ChatOpenAI(model_name="gpt-4o-mini", api_key=api_key)
    score = evaluate(dataset, metrics=[faithfulness], llm=llm)
    return score

# 定義主函式
def main(evaluation_data, api_key):
    """主函式"""
    results = evaluate_model(evaluation_data, api_key)
    print(results.to_pandas())

# 執行主函式
if __name__ == "__main__":
    evaluation_data = [...]  # 資料列表
    api_key = "YOUR_API_KEY"  # OpenAI API 金鑰
    main(evaluation_data, api_key)

最佳化與改進

  1. 變數命名:變數命名已經改進為更具描述性和遵循 Python 的命名慣例。
  2. 函式結構:程式碼已經被組織成三個函式:convert_data_to_ragas_formatevaluate_modelmain。這使得程式碼更容易閱讀和維護。
  3. 錯誤處理:雖然原始程式碼沒有錯誤處理,但在重構後的程式碼中,我們可以新增 try-except 區塊來處理可能的錯誤,例如 API 金鑰錯誤或資料轉換錯誤。
  4. 型別提示:增加了型別提示以使程式碼更容易理解和維護。
  5. 檔案字串:增加了檔案字串以提供函式的描述和使用方法。

使用Ragas評估指標:答案相關性

答案相關性是Ragas評估指標的一部分,用於衡量RAG系統輸出的相關性。這個指標透過計算輸出答案和輸入查詢之間的語義相似度來評估RAG系統的效能。

Ragas答案相關性評估步驟

  1. 使用大語言模型(LLM)生成一個問題列表,根據輸出的答案。
  2. 建立每個LLM生成問題的向量嵌入,以及初始輸入查詢的向量嵌入。
  3. 計算原始查詢嵌入和每個生成問題嵌入之間的餘弦相似度。
  4. 答案相關性評分是原始查詢和每個生成問題之間的餘弦相似度的平均值。

Ragas答案相關性評估例項

以下程式碼示例使用Ragas答案相關性評估指標對一個示例輸入、背景和RAG系統輸出進行評估。

安裝必要的Python包

pip3 install ragas==0.1.13 langchain-openai==0.1.20 datasets==2.20.0

執行評估程式碼

from ragas.metrics import answer_relevancy
from ragas import evaluate
from datasets import Dataset
from langchain_openai.chat_models import ChatOpenAI
from langchain_openai.embeddings import OpenAIEmbeddings

import os

openai_api_key = os.getenv("OPENAI_API_KEY")

evaluation_data = [
    {
        "input": "我在紐約市七月份應該做什麼?",
        "output": "去時代廣場,參加戶外音樂會,存取自由女神像。",
        "contexts": [
            "時代廣場以其百老匯劇院、明亮的燈光和熙熙攘攘的氣氛而聞名。",
            "中央公園的夏季戶外音樂會是吸引許多遊客的熱門活動。",
            "自由女神像是自由的象徵,也是紐約市必訪的地標。"
        ]
    },
    {
        "input": "你能幫助我做數學作業嗎?",
        "output": "我設計用於協助旅行查詢。對於數學幫助,嘗試使用線上資源,如Khan Academy或Mathway。",
        "contexts": []
    },
    {
        "input": "法國的首都是什麼?",
        "output": "法國的首都是巴黎。",
        "contexts": [
            "巴黎被稱為光之城,是法國最大的城市。",
            "歐洲首都:巴黎,法國;柏林,德國;馬德里,西班牙"
        ]
    }
]

# 格式化資料集以適應Ragas資料結構

格式化資料集

dataset = Dataset.from_dict(evaluation_data)

執行答案相關性評估

answer_relevancy_score = answer_relevancy(dataset)
print(answer_relevancy_score)

結果分析

答案相關性評分可以幫助您瞭解RAG系統的輸出與輸入查詢之間的相關性。透過分析評分結果,您可以找出RAG系統效能的優缺點,並對其進行改進。

內容解密:

在這個程式碼中,我們首先定義了一個函式 prepare_data_for_ragas,用於準備資料以供 Ragas 演算法使用。這個函式接收一個資料列表 data_list,並初始化一個空的資料表 data_table。然後,它遍歷每個資料專案,將問題、答案和上下文分別追加到 data_table 中的對應列表中。

接下來,我們定義了另一個函式 create_report,用於建立評估報告。這個函式首先呼叫 prepare_data_for_ragas 函式來準備資料,然後建立了一個 Dataset 物件。之後,它初始化了一個 LangChain LLM(大語言模型)物件和一個 OpenAI Embeddings 物件,分別用於評估和生成嵌入。最後,它呼叫 evaluate 函式來評估資料集,並傳回評估結果。

圖表翻譯:

  flowchart TD
    A[開始] --> B[準備資料]
    B --> C[建立 Dataset]
    C --> D[初始化 LLM 和 Embeddings]
    D --> E[評估資料集]
    E --> F[傳回評估結果]

這個流程圖展示了程式碼的邏輯流程:從準備資料開始,然後建立 Dataset,初始化 LLM 和 Embeddings,評估資料集,最後傳回評估結果。

程式碼重構:

def prepare_data(data_list):
    """準備資料以供 Ragas 演算法使用"""
    data_table = {
        'question': [],
        'answer': [],
        'contexts': []
    }
    for data_item in data_list:
        data_table["question"].append(data_item["input"])
        data_table["answer"].append(data_item["output"])
        data_table["contexts"].append(data_item["contexts"])
    return data_table

def create_report(data):
    """建立評估報告"""
    ragas_dict = prepare_data(data)
    dataset = Dataset.from_dict(ragas_dict)
    langchain_llm = ChatOpenAI(model_name="gpt-4o-mini", api_key=openai_api_key)
    langchain_embeddings = OpenAIEmbeddings(model="text-embedding-3-large", api_key=openai_api_key)
    score = evaluate(dataset, metrics=[answer_relevancy], llm=langchain_llm, embeddings=langchain_embeddings)
    return score

# 建立和列印預表格
results = create_report(evaluation_data)
print(results.to_pandas())

這個重構版本保持了原來的邏輯,但進行了些微的調整以提高可讀性和一致性。

最佳化語義資料模型以提高準確度

為了有效地使用向量搜尋來實作智慧應用程式的語義長期記憶,您必須最佳化語義資料模型以滿足應用程式的需求。由於語義資料模型使用向量嵌入模型和向量搜尋,您必須最佳化嵌入資料的內容以及資料的檢索方式。

最佳化語義資料模型可以顯著提高檢索準確度和整體應用程式效能。在檢索增強生成(RAG)應用程式中,有效的語義資料模型是強大的檢索系統的基礎,這直接影響生成輸出的品質。本章將探討最佳化語義資料模型和檢索的不同方法。

LLM-as-a-judge 指標與 Ragas 函式庫應用總結

從底層實作到高階應用的全面檢視顯示,LLM-as-a-judge 指標,特別是答案忠實度和答案相關性,為評估 RAG 系統的效能提供了量化的標準。Ragas 函式庫的出現,更簡化了這些指標的計算過程,讓開發者能更有效地評估和最佳化 RAG 系統。透過多維度效能指標的實測分析,可以發現,Ragas 函式庫提供的 faithfulnessanswer_relevancy 等函式,能有效地計算答案與上下文之間的一致性,以及答案與提問之間的相關性。然而,Ragas 函式庫仍存在一些限制,例如對於複雜語義的理解和處理仍有提升空間。

技術堆疊的各層級協同運作中體現,一個高效的 RAG 系統不僅需要高品質的 LLM 和向量資料函式庫,更需要一套完善的評估指標和工具。Ragas 函式庫的出現,填補了這方面的空白,為 RAG 系統的發展提供了重要的支撐。同時,程式碼的重構與最佳化,例如將資料處理、模型評估等功能模組化,以及新增錯誤處理和型別提示,能有效提升程式碼的可讀性、可維護性和穩定性。從系統擴充套件性與穩定性的衡量來看,模組化的設計也讓系統更容易整合新的評估指標和功能。

未來 3-5 年,預計會有更多類別似 Ragas 的評估工具出現,並朝著更精細化、更自動化的方向發展。潛在的技術拐點可能在於更深度地結合語義理解和知識圖譜技術,從而更準確地評估 RAG 系統的效能。隨著生態系統日趨完善,我們預見根據 LLM-as-a-judge 的評估方法將成為 RAG 系統開發的標準流程,並推動 RAG 技術在更廣泛領域的應用。玄貓認為,此技術路線已展現足夠成熟度,適合關注效能的核心繫統採用。對於重視長期穩定性的企業,採取漸進式整合策略將帶來最佳平衡。