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

AiFly發表於2024-04-01

上篇檔案介紹了RAG最佳化與評估的基本概念,以及使用TruLens-Eval在沒有Ground-truth的情況下評估RAG應用。本篇檔案主要是使用Ragas對RAG應用進行評估;
使用了Gagas生成合成測試資料集,在只有知識庫文件並沒有Ground-truth(真實答案)的情況下讓想評估該知識庫文件應用到RAG的的效果如何,這時可以用Ragas生成包含question、context、Ground-truth(真實答案)的資料集。即可在有Ground-truth(真實答案)的情況下評估RAG。

21.png

RAG包含兩個主要流程,向量檢索、響應生成。Ragas把這兩個流程評估指標分為:評價檢索包括context_relevancy和context_recall)和生成指標(faithfulness和answer_relevancy)。
Context_relevancy:上下文精度,上下文Context與Ground-truth的相關性越高RAG效果越好。
Context_recall:上下文召回率,是否檢索到回答問題所需的所有相關資訊。根據真實答案(ground truth)估算上下文召回率(Context recall),分析真實答案中的每個句子以確定它是否可以歸因於檢索到的Context。
Faithfulness:答案的事實準確性,答案中提出的所有基本事實都可以從給定的上下文context中推斷出來,則生成的答案被認為是忠實的。
Answer Relevance: 答案相關性,度量LLM的Response答案與Query提問的相關度。如分低,可能反應了回答不對題。

提示詞(prompt)自動適配

在Ragas中預設的Prompt是英文的,如果直接使用生成資料集會出現一些英文資料,所以需要將Ragas內建的Prompt翻譯為中文後使用。在Ragas中也提供了Prompt自動適配其他語言的支援;

noun_extractor = Prompt(
    name="noun_extractor",
    instruction="Extract the noun from given sentence",
    examples=[{
        "sentence":"The sun sets over the mountains.",
        "output":{"nouns":["sun", "mountains"]}
    }],
    input_keys=["sentence"],
    output_key="output",
    output_type="json"
)
#生成中文提示詞
adapted_prompt = 
qa_prompt.adapt(language="chinese",llm=openai_model)
#儲存提示詞
adapted_prompt.save()
print(adapted_prompt.to_string())

#載入指定提示詞
Prompt._load(name="question_generation",language="chinese",cache_dir='/home/linx/.cache/ragas')

Ragas使用LLM將提示詞翻譯成為目標語言提示詞,還可以儲存所翻譯的提示詞到磁碟,預設路徑為:/home/linx/.cache/ragas,儲存完成後後續可以直接載入使用;

合成測試資料集

在Ragas中生成合成資料集也會是使用LLM配合指定的Prompt用於資料集的生成,還可以生成不同難度級別的問題,生成的資料集按不同難度級別分佈,給定LLM、配置文件集即可,其生成原理受到Evol-Inform啟發。Ragas中為question_type定義了simple、reasoning、multi_context、conditional四種級別的問題,保證了資料集的多樣性。

22.png

simple:簡單問題,生成的問題在上下文中得到解答。
reasoning:推理問題,該問題的答案從上下文中推理得到。
multi_context:多上下文問題,問題經過重寫,問題解答需要從多個上下文中獲取資訊。
conditional:條件問題,問題經過重寫,透過影響上下文的條件使問題複雜化。

testset_generator = TestsetGenerator.from_langchain(
    generator_llm=generator_llm,
    critic_llm=generator_llm,
    embeddings=embedding_model
)

language = "chinese"
testset_generator.adapt(language,evolutions=[simple, 
reasoning,conditional,multi_context])

testset_generator.save(evolutions=[simple, reasoning, 
multi_context,conditional])

distributions = {
simple:0.4
reasoning:0.2,
multi_context:0.2,
conditional:0.2
}

synthetic_dataset = 
testset_generator.generate_with_langchain_docs(
    documents=load_documents(),
    test_size=10,
    with_debugging_logs=True
)

from datasets import Dataset

print(synthetic_dataset.to_pandas().head()) 
print('-------------------')
Dataset.save_to_disk(synthetic_dataset.to_dataset(),'testset')

評估合成測試資料集

生成的資料集沒有經過解答未包含answer欄位,這裡打算把ground_truth(真實答案)當做answer。

from datasets import load_from_disk,Dataset
#評估生成的資料集
# loading the V2 dataset
ds = load_from_disk("testset")
df = ds.to_pandas()
#複製ground_truth列,由於資料集不存在answer列,將ground_truth複製為該列
answer = df['ground_truth'].copy()
df['answer'] =answer
new_dataset = Dataset.from_pandas(df)

# ds=new_dataset.to_pandas()
# ds.head()

from ragas.metrics import (
    answer_relevancy,
    faithfulness,
    context_recall,
    context_precision,
)
from ragas import evaluate

result = evaluate(
   llm=generator_llm,
    dataset=new_dataset,
    embeddings=embedding_model,
    metrics=[
        context_precision,
        faithfulness,
        answer_relevancy,
        context_recall,
    ],
)
df = result.to_pandas()
print(df)

對資料集的評估結果指標如下,這裡只列出了部分欄位:

23.png

文章首發地址:https://mp.weixin.qq.com/s/RQ-3nJQzSBzEW0jl3SMEXg

相關文章