ChatGPTのファインチューニング、やっぱ難しいんじゃないのお?
と思ったそこのあなた!実はとっても簡単なんです!!
ではまず手順について説明していきます
手順
- モデルの決定(chatモデルではない)
- プロンプトの作成
- キャッシュDBの割り当て
- データの収集
- jsonlファイルの作成・正例と負例の分類
- ファインチューニング
たったの6ステップ!しかもファインチューニングだけなら無料でできます
それでは詳しく説明していきます
手順1
まず最初に適当なモデルの決定を行なってください。
ここではchatモデルは使いません。理由としましては、手順3のキャッシュDBを使えないからです。今回、このキャッシュDBを使うことでデータの整形がさらに簡単になることを説明していきたいので、キャッシュDBを使うことを想定して説明を続けていきます。
chatモデルではないモデルの例) text-davinci-003,text-davinci-002
手順2
プロンプトの作成を行います。
好きなプロンプトを書いてください。後々整形したい場合も出てくる可能性もあるので、最初は短めで書いてみるといいかもしれません。(json形式にするとちょっと崩れる)
手順3
キャッシュDBの割り当てを行います。
と言っても既存のLLMモデルを扱うコードに以下の数行を書き加えるだけです。
from langchain.cache import SQLiteCache
langchain.llm_cache = SQLiteCache(database_path="langchain_cache.db")
また、この際、VSCodeで実行している方は、SQLite Viewerという拡張機能を追加することで、簡単に中身を見ることができます。そこで何となく、どんな感じで入るかを確認しておいてください。
手順4
データの収集を行います。
これはただ何度も実行していただくだけで結構です。
正例と負例を大体それぞれ50個ずつくらいになるように集めると良いでしょう。
手順5
続いてjsonlファイルの作成・正例と負例の分類を行なっていきます。
簡単に言うとfine-tuningに用いる学習データのためのデータの整形です。
まず、sqlitedatastore.pyというファイルを作り、以下のコードを貼り付けます
こちらはキャッシュDBを操作するためのSQLのコードを集めておくためのファイルになります
import json
import sqlite3
conn = None
def connect(db_name="langchain_cache.db"):
global conn
conn = sqlite3.connect(db_name)
def close():
conn.close()
def get(id, fl):
row_ls = conn.execute("SELECT {} FROM full_llm_cache WHERE rowid = ?".format(",".join(fl)), (id,)).fetchone()
row_dict = {}
if row_ls is None:
return None
for key, value in zip(fl, row_ls):
row_dict[key] = value
return row_dict
def get_all_ids(limit, offset=0):
return [record[0] for record in conn.execute("SELECT rowid FROM full_llm_cache LIMIT ? OFFSET ?", (limit, offset))]
続いて、sqlitedatastore.pyのコードを使ってキャッシュDBを扱うためのファイルを作ります。ファイル名は何でもいいですが、ここではcache_db.pyとしておきます。
そしてcache_db.pyに以下のコードを貼り付けてください。
import sqlitedatastore as datastore
import json
class Cache_db:
def connect(self):
datastore.connect()
def close(self):
datastore.close()
def get(self, id):
return datastore.get(id, fl=["prompt", "response"])
def get_all(self):
json_data_list = []
for ID in datastore.get_all_ids(limit=-1):
json_data = self.get(ID)
json_data_format = {
"prompt": json_data.get("prompt"),
"completion": json_data.get("response")
}
json_data_list.append(json_data_format)
return json_data_list
if __name__=="__main__":
dc = Cache_db()
dc.connect()
jsonl_data = dc.get_all()
with open('training_data.jsonl', 'w') as f:
f.writelines([json.dumps(l, ensure_ascii=False)+"\n" for l in jsonl_data])
dc.close()
上記のcache_db.pyを実行することで、jsonlファイルの作成は完了です。
続いて正例と負例の分類ですが、こちらは自身が持つ正解を元に、training_data.jsonlをsuccessful.jsonlとfailed.jsonlに仕分けてもらえれば大丈夫です。
コードでできる場合は、コードで。難しそうであれば手作業でも問題ないです。
手順6
最後にfine-tuningを行なっていきます。
こちらはOpenAIのサイトに行って、successful.jsonlとfailed.jsonlをアップするだけで終わります
いかがだったでしょうか!
以上でfine-tuningは完了です。手順は6つと少ないステップで簡単にできてしまうのがChatGPTのすごいところです。
しかし、fine-tuningには少し時間がかかってしまうので、時間がある時にやっておくと良いでしょう。
また、ローカルで今回fine-tuningをしたモデルを使いたい方、そしてローカルからfine-tuningをしたい方は以下のサイトを参考にすると良いかもしれません
url: https://qiita.com/ksonoda/items/b9fd3e709aeae79629ff