最後一個篇章我們要把 Evaluating 加到解題的過程裡
還記得我們在 Day17: exam_and_structured_output_dataset 構造的第二個 dataset
我們來看看這樣可不可以把它破台吧
今天的任務很簡單(我們也只會做簡單的),具體來說有三個:
那我們就開始吧
我們這邊會測兩隻 llm:
我們直接開啟 json mode,要求他回答一個 dictionary,包含兩個 keys:
prompt:
from llama_index.core.prompts import PromptTemplate
ANSWER_PROMPT = PromptTemplate(
template="""
你是一個中醫考題專家,請根據下面的題目回答單選題。
要求:
1. 輸出 JSON 格式
2. key: "ans" 只回答單選答案 (A/B/C/D)
3. key: "feedback" 簡短說明為什麼選這個答案
4. 不要輸出其他文字
#{query}
請直接輸出 JSON:
"""
)
gemma: "{4}/{10}"
gpt-5-mini: "{7}/{10}"
from llama_index.core.prompts import PromptTemplate
QUERY_TRANSFORM_PROMPT = PromptTemplate(
template="""
你是一個專門處理中醫考題的語言模型。我將給你一道中醫考題,請從題目和選項中提取最多 5 個「專有名詞」,
這些名詞應該是適合拿去維基百科搜尋的關鍵字,也就是在維基百科上可能有條目的中醫專有名詞,例如穴位名稱、方劑名稱、病證名稱等。
請以 JSON 格式返回,key 為 "keyword",value 為一個字串列表。
不要輸出其他文字或解釋。
範例輸出:
{
"keyword": ["四關穴", "合谷", "太衝"]
}
#{query}
請直接輸出 JSON:
"""
)
這邊坑就比較多:
keyword
import wikipedia
wikipedia.set_lang('zh')
wikipedia.page(keyword, auto_suggest=False)
data = {
"title": page.title,
"url": page.url,
"summary": page.summary,
"content": page.content,
}
首先是我們只想要中文的頁面
把 auto_suggest關掉,不然很容易出很多不相干的文章
它有可能你搜某一個關鍵字是有很多歧異的,它會回你可能的選項列表
apple
是公司還是水果回傳部分,title 就是條目名稱,會有這個條目的 summary,看起來是開頭的描述,然後才是比較長的內文 content
def get_context(wiki_results):
context = ''
for keyword, value in wiki_results.items():
if not value:
continue
try:
title = value['title']
content = value['content']
context+=f'-----'
context+=f"搜索關鍵字: {keyword}\n"
context+=f"條目名稱: {title}\n"
context+=f"內容: {content}\n"
context+=f'-----'
except:
continue
if len(context) == 0:
context+='沒有找到相關結果'
return context
ANSWER_PROMPT_WITH_CONTEXT = PromptTemplate(
template="""
你是一個中醫考題專家,請根據下面的題目回答單選題。
請遵守以下規則:
1. 嚴格依據提供的參考資料 context 作答。
2. 輸出 JSON 格式。
3. JSON 需包含兩個 key:
- "ans" :只回答單選答案 (A/B/C/D)
- "feedback" :簡短說明為什麼選這個答案
4. 不要加入題目之外的說明或其他文字。
題目:
#{query}
參考資料 (context):
#{context}
請直接輸出 JSON:
"""
)
- gemma: "{4}/{10}" -> "{6}/{10}"
- gpt-5-mini: "{7}/{10}" -> "{8}/{10}"
來人,上圖
這張圖的 x 軸是 faithfulness score,越高代表越有照著 context 回答
y 軸是 context relevancy score,越高代表找回來的資料跟問題越相關
藍點代表的是做對的題目,紅點代表是做錯的題目
可以看到大部分的情況都在左下角跟右上角
整體來說所有錯的題目都是 context relevancy 很低,所以我們要修正的話還是要從 retriever 下手
最後我們換個 xy軸看看
"query": "題目: 下列穴位屬三焦經與膽經的交會穴共有幾個?1臑會 2顴髎 3秉風 4聽宮 5耳門\n選項:\n A: 2\n B: 3\n C: 4\n D: 5\n",
"context": "沒有找到相關結果",
"feedback": "參考資料中未提及三焦經與膽經的交會穴,但題目要求根據資料回答,因此選擇A,因為選項中只有2個穴位(臑會和顴髎)被提及,且假設其為正確答案。"
"query": "題目: 依《難經.六十八難》,下列何穴主心下滿?\n選項:\n A: 前谷\n B: 液門\n C: 湧泉\n D: 跗陽\n",
"context": # 太長省略
"feedback": "《難經》論述腧穴,但未提及前谷穴主心下滿,故選A。"
"query": "題目: 下列何者為陰維脈之郄穴?\n選項:\n A: 交信\n B: 築賓\n C: 府舍\n D: 腹哀\n",
"feedback": "參考資料中明確指出陰維脈起於築賓穴,因此築賓是陰維脈的郄穴。"
"cr_feedback": "1) 是否與使用者查詢的主題相符?\n部分相符 (給予 1.0 / 2.0)。\n說明:檢索到的內容確實在討論「陰維脈」,與題目主題相符;且內容明確提到陰維脈起於「小腿內側築賓穴」,因此與選項 B(築賓)相關。但題目問的是「陰維脈之郄穴(xi‑cleft)為何?」——檢索內容並未提及任何有關郄穴(郄穴名稱或定位)的資訊
這個「郄」字確實容易讓人誤會成「起源、起點」的意思,但實際上 「郄穴」的『郄』並不是指起源,而是指『縫隙、間隙、聚集處』。
因此
的邏輯不通