前面指標能介紹的都介紹完了,今天就開始我們的實作吧!
要複習的話可以參考前幾天的內容,就讓我們開始ㄅ~
1. 安裝環境
這邊我們使用 Ollama + Mistral 做評分,不然原先是需要 OpenAI Key,還有我們會使用 HuggingFace Embeddings 用在 RAGAs。
# 評估核心
pip install ragas datasets evaluate
# 本地 LLM:Ollama 的 LangChain
pip install langchain-ollama
# 本地 Embeddings:HuggingFace 的 LangChain
pip install langchain-huggingface
2. 取得 RAG 輸出
先前的文章其實我們就有設定幾項參數(下面這幾項),如果忘記了可以去回去一下之前實戰的內容~
query = "什麼是關鍵基礎設施?"
hits = search_chunks(query, k=4)
prompt = build_prompt(query, hits)
answer = ask_ollama(prompt, model="mistral")
3. 建立評估資料庫
這邊會將那些指標也就是 Context Precision、Answer Relevance、Answer Faithfulness 需要的欄位加進去存成一個 dataset,其實這步驟你可以考慮不要有,這邊只是為了方便我們解釋才新增的,不過要丟甚麼參數進去評估自己可能要有清楚的條理。
from datasets import Dataset
# 取出檢索到的文字段落
contexts = [h["text"] for h in hits]
# 參考答案:手動撰寫或統整資料後放上去
reference = "關鍵基礎設施是指實體或虛擬資產、系統或網路,其功能一旦停止運作或效能降低,對國家安全、社會公共利益、國民生活或經濟活動有重大影響之虞,經主管機關定期檢視並公告之領域。"
data = {
"question": [query],
"contexts": [contexts],
"answer": [answer],
"reference":[reference],
}
dataset = Dataset.from_dict(data)
4. 執行 RAGAS 評估
我們用 Ollama(Mistral) 當評分 LLM,並用 HuggingFace Embeddings。
因為前面已經在用 sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2 做檢索嵌入與 Chroma 建立資料庫,在 RAGAS 評估時也沿用同一款模型就好。
這邊針對 LLM 有特別做設定:
這裡我們使用 evaluate() 來跑 RAGAS 指標。實際上要評估哪些項目,可以依需求挑選並放入 metrics。
from ragas.metrics import context_precision, context_recall
from ragas.metrics import faithfulness, answer_relevancy
from ragas import evaluate
# ollma 設定
from langchain_ollama import OllamaLLM
from ragas.llms import LangchainLLMWrapper
ollama_raw = OllamaLLM(model="mistral", temperature=0, num_ctx=4096)
ollama_llm = LangchainLLMWrapper(ollama_raw)
# embeddings 設定
from langchain_huggingface import HuggingFaceEmbeddings as LCHuggingFaceEmbeddings
from ragas.embeddings import LangchainEmbeddingsWrapper
lc_hf = LCHuggingFaceEmbeddings(model_name="sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2")
hf_embeddings = LangchainEmbeddingsWrapper(lc_hf)
# 評估
result = evaluate(
dataset,
metrics=[context_precision, context_recall, answer_relevancy, faithfulness],
llm=ollama_llm,
embeddings=hf_embeddings
)
print(result)
5. 輸出結果{'context_precision': 0.7500, 'context_recall': 1.0000, 'answer_relevancy': 0.7336, 'faithfulness': 0.5000}
這四個分數各代表:
Context Precision (0.75)
表示檢索到的片段裡有 75% 與問題高度相關。代表檢索雖然有帶到正確的內容,但仍有 25% 不太相關的段落。
Context Recall (1.0)
代表標準答案需要的關鍵資訊全部都有被檢索出來(覆蓋率 100%)。這很理想,顯示知識庫有足夠支撐答案的內容。
Answer Relevancy (0.73)
說明 LLM 的最終回答大致有回到問題重點,但還有些表述或焦點不夠精確(約 73% 的相關性)。
Faithfulness (0.50)
代表答案只有一半內容是真的能在檢索到的片段中找到依據。也就是說,模型有部分內容是自己延伸或猜測出來的。
不過這是我們自己建立的小型 RAG 系統,檢索策略、知識庫內容以及 prompt 設計都還不夠完善,所以分數並不算高。這樣的結果反而很有價值,因為它能幫助我們清楚定位問題,看是在檢索還是生成出現了問題,才能更有效的優化系統。
如果想看相關的資訊都可以在官方的原始文件中找--RAGAs,可以看像是 evaluate、RAGAs 操作指南之類的!
後面我們會開啟新章節,距離完賽也不遠囉><