ChatGPTのファインチューニング、やっぱ難しいんじゃないのお?

と思ったそこのあなた!実はとっても簡単なんです!!

ではまず手順について説明していきます


手順

  1. モデルの決定(chatモデルではない)
  2. プロンプトの作成
  3. キャッシュDBの割り当て
  4. データの収集
  5. jsonlファイルの作成・正例と負例の分類
  6. ファインチューニング

たったの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