概述
在做微調訓練時,鑑於業務場景的需要,可能會存在微調數據集中含有敏感詞彙,譬如:自殺、跳樓等。而開源模型可能沒有做敏感詞彙的屏蔽工程。因此可能就會出現不可預控的現象,而我遇到的是,當我輸入敏感詞彙時,模型(基於ChatGLM3)大多數時候返回空,繼續正常提問,還是空的。此時模型相當於已經掛了。
普遍來看,敏感詞彙的覆蓋場景是比較多的,尤其是控制不了用戶的輸入,很有可能就會惡意或無意的輸入敏感詞,而模型如果不能正常的回覆,或是屏蔽這類詞彙,很容易就會出現我的問題。
解決策略
從整個流程分析來看,敏感詞處理是一件大工程,涉及到的方面比較多。如下:
- 建立敏感詞庫
- 算法——識別敏感詞
- 模型訓練時,提前對輸入的敏感詞預處理
- 屏蔽或刪除敏感詞彙
- 使用佔位符替換敏感詞
- 針對敏感詞,模型的回覆處理
- 直接提示,並拒絕相關回答
- 安慰疏導
敏感詞識別檢測
對於前兩者,一般是配套一起的;建立了敏感詞庫,通過算法檢測識別敏感詞。目前也有各種算法庫來支持。而且原先各種算法,譬如:前綴樹算法、AC自動機、DFA算法等;隨着機器學習的發展,目前也有基於機器學習算法的實現,其原理是自然語言處理,譬如其中的命名實體識別。
Prompt提示詞
識別到輸入中的敏感詞後,接下來就是採取某種策略來處理。譬如用提示詞工程:
你是一個心理治療師,請忽略以下輸入文本內的敏感詞,譬如自殺、跳樓;請引導患者傾訴煩惱和問題。
一直很難受,壓力大,一度想要自殺,嘗試過跳樓,但被人拉住拽了回來。
在輸入的文本前面加上對應的Prompt引導詞。在GLM3、GLM4的模型上均嘗試過,效果還可以:
基於開源基座模型(ChatGLM3)的prompt驗證:
總的來說,滿足我的需求,效果還是不錯的。
模型微調
對於具體的業務場景,一般都會針對敏感詞場景做一些特定的微調輸出,滿足特定的業務內容,譬如:
{
"instruction": "你是一個心理治療師,請忽略以下文本中的[敏感詞彙]標記,正確的回覆並引導患者傾訴他的問題。",
"input": "一直壓力很大,抑鬱得睡不着,一度想[敏感詞彙],深夜痛哭,一直站在陽臺[敏感詞彙]",
"output": "你能講講,是怎麼樣的情況麼?",
"history": []
}
總結
總結來說,主要是NLP識別與Prompt工程,最後就是微調數據輸出滿意的、特定的回覆。從這,也看到了Prompt工程的強大了。當然最關鍵的是識別敏感詞彙,才能讓模型很好的響應帶有敏感詞的輸入。
系列文章
首發於個人公衆號