llm構建資料標註助手

深度学习机器發表於2024-03-10

為什麼要用LLM構建資料標註工具

在LLM出現之前,傳統的深度學習模型(包括CV和NLP)就已經需要大量的資料進行訓練和微調。沒有足夠的資料,或者資料需要進行二次加工(比如標籤標註),這些問題都成為限制深度學習模型泛化的關鍵。對於第一個問題,一般就是從網路上爬蟲或者花大價錢從資料供應商購買資料;對於第二種情況,一般是找外包進行標註,這在業界非常普遍。

種類 優點 缺點
爬蟲 成本幾乎可以忽略 質量參差不齊
買資料 質量符合要求 價格昂貴
標註 準確性足夠 昂貴、容易洩露資料資訊

自從Chatgpt3.5誕生以來,已經有不少公司使用Chatgpt的介面來標註自己的資料了,甚至國內知名的大模型公司也有這些操作,這是因為大家逐漸發現LLM已經可以達到和人類資料標註者相同的水平。

大模型現在已經不是什麼稀罕之物了,但是為什麼有的大模型效果就比別人的好很多呢?一般認為是資料質量起到決定性的作用。據網上流傳的訊息,OpenAI資料標註過程可是非常昂貴的,簡單理解就是模型訓練用到的資料可以分成好幾個檔次,比如生活常識、基礎知識、高階知識等。對於生活常識,可能一個普通的工人就能標註,而且這類標註往往只是選擇一個正確的選項即可。而基礎知識類可能需要有義務教育才能解決,而且需要寫出簡短的解題理由。而高階知識往往是某個領域專屬的資料,比如醫療、法律等,往往是需要這些專業的研究生及以上學歷的人來標註,而且需要寫出完整的解題思路。正因為花了大量的時間和金錢在構建高質量的資料上,才有了OpenAI如今碾壓別人的表現。

話說回來,既然已經有如此多優秀的大模型開源出來了,那麼對於普羅大眾來說,就可以用這些模型來幫助自己、提升效率,只要不違反相應的協議即可。

用LLM構建資料標註助手

在網上找了一箇中文的酒店住宿評價資料集用於本次驗證模型標註能力,資料下載地址:住宿評論資料

資料預覽:

# 好評,用1表示
1,在宜昌應該是排名前三位的酒店了,希望能繼續得到保持,應該會成為宜昌的首選
1,外觀看起來不是很起眼,房間不是很大,但是很乾淨,服務也不錯,早餐也很豐富,比較喜歡。
1,環境優美,設施齊全,服務周到,房間舒適。
1,員工服務好,房間舒適如家,硬體設施應有盡有,保持。
...

# 差評,用0表示
0,看到網友的點評還有些不信,去了以後才知道什麼叫全世界最髒,最差的酒店。
0,超級噁心的一家賓館,入住後發現寫字檯窗臺上到處是灰塵,非常噁心,向總檯投訴後,才打掃乾淨!服務非常差,房間也非常差,進去後還有異味,而且床非常不舒服,感覺床單也不乾淨,個人感覺根本夠不上星級!太噁心了,這麼破的地方,晚上竟然還有人打騷擾電話,問要不要服務,什麼破地方!早餐也非常噁心,根本沒什麼吃的!!
0,一個字,差啊,冷啊,暖氣沒有.空調太差!
0,服務極差,價格高,地點環境偏,房間條件能有一星..

本次使用了Chatglm3-6b-32k的模型搭建了一個本地的服務,如果用的是其他廠商提供的API,只需要修改url的內容以及傳輸的引數即可。如果用的是本地的模型,就把post請求替換為模型的呼叫即可。而且為了加快處理,用了程序池,如果用的是買的API,可能需要加個延遲防止短時間內發起太多請求。

import pandas as pd
import requests
import json
from multiprocessing import Pool

df = pd.read_csv('ChnSentiCorp_htl_all.csv')
url = 'your_llm_serve_api'

def process_text(t):
    try:
        prompt = f"""\
            你是一個精通酒店使用者評論的標註員,能準確辨別出使用者的評價是正面的還是負面的。
            你的任務是從使用者的角度分析以下文字中的情緒,並僅用兩個標籤中的一個標籤進行標記。
            不要提供任何解釋,只返回標籤:正面、負面

            例子:
            文字: 早餐很豐富,服務也熱情,早上很早退房時,前臺值此人員辦理手續也非常快.
            標籤: 正面
            文字: 離機場很近,房間裡的床很大,裡面還有一面鏡子
            標籤: 正面
            文字: 可能是酒店比較老的緣故,房間看起來很一般,設施也比較一般.
            標籤: 負面
            文字: 房間太小。設施太簡單。服務太冷淡。不會再住。
            標籤: 負面

            你需要標註的評論:
            文字: {t}
            標籤: """

        d = {"messages": prompt}
        response = requests.post(url, data=json.dumps(d), stream=False)
        r = json.loads(response.text)
        return r
    except Exception:
        return 'ERROR'

if __name__ == '__main__':
    texts = df['review'].tolist()
    with Pool(processes=4) as pool:  # 根據需要設定程序數量
        results = pool.map(process_text, texts)

    tmp = []
    for t, r in zip(texts, results):
        tmp.append(f"{r}[<>]{t}") # 加個符號區分標籤和文字

    with open('./save_res.txt', 'w') as f:
        f.write('\n'.join(tmp))

效果評估

實際\預測
4266 1056
230 2215

綜合來看準確率只有83%,初步看起來不高。

距離川沙公路較近,但是公交指示不對,如果是"蔡陸線"的話,會非常麻煩.建議用別的路線.房間較為簡單
早餐太差,無論去多少人,那邊也不加食品的。酒店應該重視一下這個問題了。房間本身很好。
鬧中取靜的一個地方,在窗前能看到不錯的風景。酒店價格的確有些偏高
價格偏高,好象連雲港這地方的酒店都偏貴.早飯不好.房間還不錯,窗外風景還行.最重要是房間的窗戶很隔音.床小,還是明珠萬豪的床好些.
房間裝置太破,連噴頭都是不好用,空調幾乎感覺不到,雖然我開了最大另外就是裝置維修不及時,洗澡用品感覺都是廉價貨,味道很奇怪的洗頭液等等...總體感覺服務還可以,裝置招待所水平...

隨機檢視了5條模型標註為負面但標籤是正面的評論,實際上這幾條都沒有完全好評的內容,基本上都是中性甚至偏向負面。因此實際上準確率應該在83%以上才對,這裡主要還是受到資料集本身都影響。

本次雖然只測試了Chatglm3-6b-32k的模型,其他的模型如千問、llama等雖然沒測,但應該都可以滿足標註需求了,說明用現在的大模型來標註資料是完全可行的,能節省成本。如果怕洩漏資料那把模型部署到本地即可,這些大模型在消費級顯示卡上完全是跑得動的。

相關文章