iT邦幫忙

2024 iThome 鐵人賽

DAY 12
0

每天的專案會同步到 GitLab 上,可以前往 GitLab 查看,有興趣的朋友歡迎留言 or 來信討論,我的信箱是 nickchen1998@gmail.com

在正式進入 RAG 相關的細節之前,我們要先來介紹一下 DeepEval 這個套件,這個套件可以協助我們做一些有關語言模型的測試,下方列舉一些常用情境:

  • 忠誠度 Faithfulness:回答與參考段落的關聯性
  • 關聯性 Answer Relevancy:回答與問題的關聯性
  • 文本召回率 Contextual Recall :參考段落與標準答案的關聯性
  • 文本關聯性 Contextual Relevancy:參考段落與問題的關聯性

上述這些是筆者目前比較常用到的一些情境,而 DeepEval 總共內建了 14 種測試情境,可以應用在不的狀況當中,有了這些測試的工具以及情境,我們就可以在後面針對 RAG 的任何調整有比較完整的測試比較,下面就讓我們快速介紹一下該怎麼使用這個工具。

什麼是 RAG ?

rag
ref: https://www.supa.so/post/retrieval-augmented-generation-techniques-and-use-cases-2024

雖然現在才正式介紹似乎有點晚了,但我們還是快速的來補齊一下該有的基本概念。

RAG(Retrieval-Augmented Generation)是一種結合資料檢索與生成模型的方法,下麵我們針對圖片中的每個步驟做簡單的介紹:

  • 查詢 (query):使用者提供一個查詢問題。
  • 嵌入模型 (Embedding model):將查詢轉換為向量形式,便於檢索相關資料。
  • 向量儲存索引 (Vector store index):嵌入模型將查詢轉換的向量與資料庫中的向量進行比對,找到最相關的內容。
  • 資料庫 (Database):儲存需要檢索的內容,並通過索引找到與查詢相關的資料。
  • 上下文 (context):從資料庫中檢索出的相關內容提供給語言模型(LLM)。
  • 語言模型 (LLM):根據查詢和提供的上下文,生成回答。
  • 回答 (answer):最終生成並提供給使用者的答案。

RAG 的流程將檢索的資料與語言生成相結合,能夠提供更精確且上下文相關的回答。

怎麼使用 DeepEval 進行測試?

首先,一套完整的問答流程,大約分為以下三大步驟:

  1. 提問
  2. 檢索
  3. 回答

基於這三點,我們把測試的情境拆成兩大塊各自進行測試,只要兩邊都通過,代表組合起來就沒問題,可以看一下下面這張圖:

qa_flow

可以看到圖片當中,我們將測試分為「以回答為出發點進行測試」以及「以檢索為出發點進行測試」,而今天我們要介紹的就是「以回答為出發點進行測試」的情境,至於會使用到的測試工具就是「忠誠度」以及「關聯性」這兩個。

忠誠度 Faithfulness

前面有簡單提到,忠誠度測試會針對「我們的回答是否來自於檢索出來的段落」,如果分數越高,表示著我們的模型可以正確的參考我們所檢索出的段落來進行回答,可以確保他不會回答得過於自由導致回答錯誤。

在開始測試前,我們需要先把我們的 OpenAI 的金曜設定到環境變數當中:

import os
from env_settings import EnvSettings

env_settings = EnvSettings()
os.environ["OPENAI_API_KEY"] = env_settings.OPENAI_API_KEY

完成設定金鑰後,就讓我們快速來看一下官方給的範例:

import os
from env_settings import EnvSettings
from deepeval.metrics import FaithfulnessMetric
from deepeval.test_case import LLMTestCase

env_settings = EnvSettings()
os.environ["OPENAI_API_KEY"] = env_settings.OPENAI_API_KEY

actual_output = "We offer a 30-day full refund at no extra cost."
retrieval_context = ["All customers are eligible for a 30 day full refund at no extra cost."]

metric = FaithfulnessMetric(
    threshold=0.7,  # 通過分數
    model="gpt-4",  # 使用模型
    include_reason=True  # 測試結果是否包含原因
)
test_case = LLMTestCase(
    input="What if these shoes don't fit?",  # 輸入的問題
    actual_output=actual_output,  # LLM 實際輸出的回答
    retrieval_context=retrieval_context  # 檢索出的段落列表
)

metric.measure(test_case)
print(metric.score)
print(metric.reason)

程式碼當中都有補上每個參數的使用說明,我們看一下下面的執行結果:

faithfulness

關聯性 Answer Relevancy

至於關聯性的部分,則是可以協助我們測試「回答與問題的關聯性」,分數越高則表示回答與問題的關聯性越高,可以確保回答的內容是符合問題且有一定的品質。

import os
from env_settings import EnvSettings
from deepeval.metrics import AnswerRelevancyMetric
from deepeval.test_case import LLMTestCase

env_settings = EnvSettings()
os.environ["OPENAI_API_KEY"] = env_settings.OPENAI_API_KEY

actual_output = "We offer a 30-day full refund at no extra cost."

metric = AnswerRelevancyMetric(
    threshold=0.7,
    model="gpt-4",
    include_reason=True
)
test_case = LLMTestCase(
    input="What if these shoes don't fit?",
    actual_output=actual_output
)


metric.measure(test_case)
print(metric.score)
print(metric.reason)

可以看到與忠誠度的測試非常相似,只是這次我們不需要提供檢索出的段落,而是直接提供問題以及回答,讓模型自己去判斷回答的品質,下面是執行結果:

answer_relevancy

內容預告

今天我們快速介紹了「忠誠度」與「關聯性」這兩個測試情境,明天我們會介紹勝下的兩個,分別是「文本召回率」以及「文本關聯性」,而詳細的公式則可以去官方網站查看下面附上網址。

套件網址:https://pypi.org/project/deepeval/
官方網站:https://docs.confident-ai.com/docs/getting-started


上一篇
Day 11 - DataToWord 套件介紹
下一篇
Day 13 - DeepEval 評估測試套件介紹 - 文本召回率 & 文本關聯性
系列文
初探 Langchain 與 LLM:打造簡易問診機器人13
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言