1、事情經過
這段時間在研究智能聊天機器人的需求,對聊天機器人的期望是能瞭解語義,理解溝通者提出的問題,並做流暢合理的回答,溝通過程中還能記錄歷史對話作爲回答的語料,對標最近很火的chatgpt來想就知道老闆想要什麼效果。chatgpt固然很強大,原始訓練有豐富的樣本,但是對標自己公司的業務還是有盲點的。所以需要在chatgpt的基礎上加入自己公司的語料內容微調模型,剛好openai文檔上有這個功能fine-tuning就興奮的試了一起來,從ada -> babbage -> curie -> davinci這四種base模型的基礎上加入自己公司的訓練樣本進行微調,最後發現效果都不行,模型表現的效果是很傻,呆呆的,不理解語義,只會從樣本問答對中提取固定的回答,不會自己組織語言,看起來是根據訓練時的文本標識去找固定的答案,跟chatgpt表現的效果天差地別。一開始以爲是樣本格式的問題,因爲openai文檔關於fine-tuning的樣本模版有很多種,都試了一遍發現還是不行,後來才發現原來想要達到chatgpt的效果根本不能用這個fine-tuning,而要用text-davinci-003模型加向量搜索背景內容進行嵌入的模式,且看下面講解來龍去脈。
2、chatgpt的模型歷史
1、text-davinci-003是2022年最新版的基於指令的gpt-3模型,英文:Instruct GPT-3 models,這個能根據用戶的指令進行場景代入,所謂指令就是輸入的prompt裏面用戶有要求模型怎麼回答問題,你要當一個老師還是一個學生或者是一個科學家。這個模型是不能用於微調(目前還沒開放)的,跟davinci基礎模型有很大區別,text-davinci-003的prompt能輸入4096個token,而davinci只能輸入2048個token,一箇中文佔兩個token。text-davinci-003能閱讀理解,理解語義,可以作出類似人類的回答
2、fine-tuning開放的a、b、c、d用於微調的基礎模型是2020開源的老版本Base GPT-3 models,這些模型是不懂用戶輸入的指令的,即不會角色扮演,也不能對用戶輸入的文本進行閱讀理解作出類似人類的回答
原文:https://help.openai.com/en/articles/5832130-what-s-changed-with-engine-names-and-best-practices
Type |
Old engine name |
New engine name |
Latest Instruct GPT-3 models |
davinci-instruct-beta-v3 curie-instruct-beta-v2 babbage-instruct-beta ada-instruct-beta |
text-davinci-001 text-curie-001 text-babbage-001 text-ada-001 |
Older Instruct GPT-3 models |
davinci-instruct-beta curie-instruct-beta |
No change |
Base GPT-3 models |
davinci curie babbage ada |
No change |
3、官方推薦的方案
1、使用text-davinci-003模型,並優化prompt輸入,具體是當一個問題進入模型時把這個問題應該對應的背景資料也一起拼好,然後輸入模型,模型是能理解輸入的背景並很好的問答這個問題
2、背景資料怎麼跟問題匹配呢,假設你有1000條背景資料,當一個用戶的問題來了,需要想把這個問題轉爲向量Embeddings,然後你的背景資料得先初始化好把1000條背景資料對應的向量先提前轉化好存着, 一個問題向量來了需要跟1000條向量一一比對,餘弦距離算出後,根據自己的需求取相識度最高的N條,把相似度最高的背景資料取出和問題一起輸入模型
3、當然了prompt輸入的時候格式是有講究的,具體那種格式最好,看下篇博文openai prompt最佳實踐
4、官方有提供在線調試prompt輸入並得到completions回答,把註冊的key放進去就能調用,自己可以在線調試那種格式的prompt適合自己https://gpttools.com/comparisontool?from_wecom=1
5、問題轉向量並且跟背景資料向量組對比這個代碼官方是有提供python腳本的,具體可以看下代碼鏈接,下下篇博文將會具體講解一下這份代碼
原文:https://help.openai.com/en/articles/6643167-how-to-use-openai-api-for-q-a-and-chatbot-apps
官方推薦方案的一些注意事項,可以看作是高級教程:https://help.openai.com/en/articles/6824809-embeddings-frequently-asked-questions