在上一篇踩坑記中郊闯,基于我對(duì)編程框架的理解肌幽,直覺上認(rèn)為,RAGAS 中的 Metric 作為最終執(zhí)行層糯耍,理論上為了更好地拓展性扔字,都是可以重寫里的執(zhí)行代碼,這樣面對(duì)各種獨(dú)特的檢測(cè)需求時(shí)温技,會(huì)非常的靈活啦租。
最近終于有時(shí)間去檢驗(yàn)這個(gè)想法。
這次重寫的內(nèi)容是 RAGAS 自帶的 faithfullness(答案忠誠(chéng)度)荒揣。
faithfullness
還是推薦各位不太理解概念的篷角,先讀一下這篇文章高級(jí)RAG(四):RAGAs評(píng)估-CSDN博客。
答案忠誠(chéng)度系任,是指程序給出的答案恳蹲,是否可以在背景知識(shí)中找到虐块,能找到多少,找到的越多嘉蕾,分?jǐn)?shù)越高贺奠,最高1分,最低0分错忱。
源碼很長(zhǎng)儡率,就不單獨(dú)上了,想要深入了解的可以自己去 GitHub 查看以清。
在源碼中可以看到儿普,FaithFullness
類是繼承自 MetricWithLLM
類的,里面只是將 _score_batch
方法進(jìn)行了重寫掷倔,而重寫的內(nèi)容也非常簡(jiǎn)單眉孩,就是將答案分成了幾個(gè)部分,然后分別針對(duì)這些內(nèi)容去判斷是否是上下文中包含的內(nèi)容勒葱,如果是則算1分浪汪,不是算0分,然后算平均值凛虽,就得到了這一條數(shù)據(jù)的忠誠(chéng)度死遭。
邏輯很簡(jiǎn)單,只是這個(gè)分?jǐn)?shù)都是通過(guò) GPT 的答案來(lái)的凯旋,也算是某種意義上的自適應(yīng)了呀潭。
而要改寫的話也很簡(jiǎn)單,因?yàn)橛?jì)算邏輯很簡(jiǎn)單瓦阐,也很有效蜗侈,我們肯定就不需要再去改了。只需要修改 Prompt 中的內(nèi)容睡蟋,讓得到的結(jié)果更符合我們需要的踏幻。
所以接下來(lái)要去了解一下 Faithfullness
的 Prompt 中都寫了什么。
Prompt
這里的 Prompt 分成了兩部分戳杀。
第一部分是將你的問題和回答傳入该面,GPT 將答案解構(gòu)成多個(gè)部分。
question: Who was Albert Einstein and what is he best known for?
answer: He was a German-born theoretical physicist, widely acknowledged to be one of the greatest and most influential physicists of all time. He was best known for developing the theory of relativity, he also made important contributions to the development of the theory of quantum mechanics.
statements in json:
{{
"statements": [
"Albert Einstein was born in Germany.",
"Albert Einstein was best known for his theory of relativity."
]
}}
然后是第二部分信卡,將你解構(gòu)后的內(nèi)容與上下文對(duì)比隔缀,讓 GPT 來(lái)判斷,這部分的答案是否符合上下文的含義傍菇。
Context:
Photosynthesis is a process used by plants, algae, and certain bacteria to convert light energy into chemical energy.
statement_1: Albert Einstein was a genius.
Answer:
[
{{
"statement_1": "Albert Einstein was a genius.",
"reason": "The context and statement are unrelated"
"verdict": "No"
}}
]
符合的話猾瘸,verdict
就是 Yes
,否則就是No
。
從 Prompt 示例中可以看到牵触,舉得例子都是偏問答類淮悼、解釋類的,核心面向的場(chǎng)景就是問答揽思。
但是我們自己的產(chǎn)品或功能袜腥,如果直接套用這個(gè)示例的話,很可能會(huì)變得不倫不類钉汗,得不到想要的回答羹令。
重寫
比如,我們公司有一個(gè)功能损痰,是想要利用 GPT 來(lái)給用戶反饋進(jìn)行分類和打標(biāo)簽福侈,大致的內(nèi)容可能類似如下:
問題:可以幫我將下面的內(nèi)容打上符合的標(biāo)簽或者確認(rèn)所屬模塊嗎?
用戶反饋:簡(jiǎn)書的關(guān)注列表是按我最近關(guān)注的來(lái)排序的徐钠,經(jīng)常讓我錯(cuò)失一些非常棒的更新癌刽。
返回的標(biāo)簽或模塊:["關(guān)注列表", "功能優(yōu)化", "BUG"]
我想利用原生的 faithfullness
去生成第一部分(即役首,將答案解構(gòu)成多個(gè)描述)會(huì)得到如下結(jié)果:
{
"statements": [
"將下面的內(nèi)容打上符合的標(biāo)簽",
"確認(rèn)所屬模塊"
]
}
emmm尝丐,看得出來(lái),這是把我的問題給梳理成了多段了衡奥,并沒有把我的答案梳理成多段爹袁。可見矮固,在這個(gè)場(chǎng)景下失息,使用原生的 faithfullness
并不能得到我們想要的結(jié)果。
而出現(xiàn)這個(gè)問題的原因用很簡(jiǎn)單——Prompt中的示例在作怪档址。
第一部分的示例很明顯是將問題+答案整合在一起盹兢,產(chǎn)生了一個(gè)返回結(jié)果,而我們只需要修改這個(gè)示例守伸,讓示例中的解構(gòu)內(nèi)容符合我們的期望绎秒,就可以避開這個(gè)問題。
question: Please help me label this sentence or distinguish the modules it belongs to?
answer: "Bugs", "Work List Module"
statements in json:
{{
"statements": [
"This sentence seems to be describing a bug.",
"This sentence seems to belong to the work list module"
]
}}
這樣尼摹,再下一次生成解構(gòu)內(nèi)容時(shí)见芹,就會(huì)參考我們示例中的邏輯進(jìn)行拆分。
這里其實(shí)暗含了一個(gè)不好理解的點(diǎn)蠢涝,就是用戶反饋都沒有放進(jìn)去玄呛,就直接放答案,那GPT怎么理解這個(gè)答案是怎么來(lái)的呢和二?
其實(shí)這個(gè)就牽扯到了第二部分了徘铝,第一部分GPT其實(shí)不需要理解上下文,只需要按照我們示例的格式去將內(nèi)容解構(gòu),而上下文是在第二部分發(fā)揮作用惕它。
當(dāng)然场晶,這部分馬上介紹,先貼一下修改后得到的結(jié)果怠缸。(源碼中不止這一個(gè)地方要改诗轻,詳細(xì)內(nèi)容仔細(xì)翻看一下源碼。)
{
"statements": [
"這句話似乎描述了一個(gè)關(guān)注列表",
"這句話似乎屬于功能優(yōu)化模塊",
"這句話似乎描述了一個(gè)BUG"
]
}
OK揭北,非常符合我的預(yù)期扳炬。繼續(xù)。
按照相同的邏輯搔体,只需要修改第二部分的示例為如下內(nèi)容(源碼不止一個(gè)地方)
Context:
It's obviously unreasonable that deleting posts cannot be done in bulk.
statement_1: This sentence seems to be describing a design issue.
statement_2: This sentence seems to belong to the work list module.
Answer:
[
{{
"statement_1": "This sentence seems to be describing a design issue.",
"reason": "The context seems to be complaining about the lack of corresponding functions, so it is a functional design issue",
"verdict": "Yes"
}},
{{
"statement_2": "This sentence seems to belong to the work list module.",
"reason": "The context mainly points out the issue of post management, not the work list.",
"verdict": "No"
}}
]
再次 Debug 查看第二段 Prompt 返回的內(nèi)容如下:
[
{
"statement_1": "這句話似乎描述了一個(gè)關(guān)注列表",
"reason": "The context is complaining about the sorting of the follow list, so it is related to the follow list module",
"verdict": "Yes"
},
{
"statement_2": "這句話似乎屬于功能優(yōu)化模塊",
"reason": "The context is not discussing functional optimization, but rather the issue with the follow list sorting",
"verdict": "No"
},
{
"statement_3": "這句話似乎描述了一個(gè)BUG",
"reason": "The context is not explicitly mentioning a bug, but rather a dissatisfaction with the follow list sorting",
"verdict": "No"
}
]
誒恨樟,可以看到,已經(jīng)可以返回我們期望的內(nèi)容了疚俱,但是中間還有一個(gè)小問題劝术,就是把功能優(yōu)化識(shí)別成了模塊,所以判定為錯(cuò)了呆奕。針對(duì)這個(gè)我們养晋,我們可以在第一步的時(shí)候給出 Prompt 去告知 GPT 模塊通常只能有一個(gè),就會(huì)大大減少這種情況的出現(xiàn)梁钾,當(dāng)然绳泉,作為文檔,這里就不去糾結(jié)了姆泻。
總之零酪,通過(guò)改寫 faithfullness
,終于可以利用 RAGAS 去正確的判斷打標(biāo)簽這個(gè)功能的效果了拇勃。
后記
雖然自己已經(jīng)比較確定 Metric 是可以自定義的四苇,但是沒想到過(guò)程如此順利,只需要簡(jiǎn)單的修改 Prompt 方咆,保證改寫后的輸出內(nèi)容和此前一致月腋,無(wú)需修改計(jì)算規(guī)則,即可順利的得到結(jié)果峻呛。
而且從 RAGAS 這里罗售,還看到了一些自適應(yīng)的影子,由 GPT 去判斷 GPT 的效果钩述,哈哈寨躁,感覺大家都想到一塊去了。這里面還能做特別多的拓展牙勘,留待后續(xù)慢慢研究了职恳。