gemma-3-270m-itはコンパクトで、Googleさんからもfull_finetuneするコードが公開されています。〇〇風なチューニングではなく、QAセットで情報追加にチャレンジしてみます。ベースはGoogleさんが提供したColabノートを利用します。ColabのL4環境で実行します。
コンピュータサイエンスの番号選択式回答とSQL式回答のデータセットを2つhugginfaceからお借りし、整形してが5ehochs学習させました。出力のフォーマットは整います。短い学習でもいい感じの出力が得られます。SQLはそれらしい式がでますが、完全な正解には、もっとがっつり学習データが必要なのかもしれません。英語での学習でも日本語での質問で大きな乱れはありませんでした。とりあえず、Training Lossが下がるまでチャレンジしたりしてみようと思います。
full fuinetuneができる日本語も問題ないLLMモデルを家庭レベルで弄れるのは楽しいですね。利用目的にもよりますが、いろんな期待が持てます。
1. 番号選択式
このデータセットを利用させていただきます。これを以下のように整形して利用します。
[{'content': '以下はcomputer_securityに関する多肢選択問題です。問題を注意深く読み、最も適切な答えを選択してください。
問題: クライアントとサーバー間でTLS接続が正常に確立されたとする。セッションの確立には、サーバー証明書のチェックとディフィー・ヘルマン交換の実行が含まれるが、クライアントはクライアント証明書を提供していない。さらに、クライアントとサーバーは正直であり、クライアントとサーバーは鍵を漏洩せず、暗号は良好であると仮定する。TLSが防御する攻撃は次のうちどれか?
1. クライアントが以前に送信したバイトを再生する攻撃者。
2. サーバーになりすます攻撃者。
選択肢:
A. 真、真
B. 偽、偽
C. 真、偽
D. 偽、真
指示: 正解の選択肢を A、B、C、D のいずれかで答えてください。理由や説明は不要です。
答え:
選択肢:
A. 真、真
B. 偽、偽
C. 真、偽
D. 偽、真', 'role': 'user'},
{'content': '正解は A です。', 'role': 'assistant'}]
この様なデータセットを作って学習させました。

生成例:
Question:
以下はelectrical_engineeringに関する多肢選択問題です。問題を注意深く読み、最も適切な答えを選択してください。問題: ランプから5メートル下の地点の照度が6ルクスのランプの燭光は?
選択肢:
A. 30
B. 140。
C. 150。
D. 200。指示: 正解の選択肢を A、B、C、D のいずれかで答えてください。理由や説明は不要です。
答え:
選択肢:
A. 30
B. 140。
C. 150。
D. 200。Original Answer:
正解は C です。Generated Answer:
正解は A です。
正解もありますが、間違いも多い。答えの「正解は〇です。」というフォーマットは安定的に生成されました。
2. SQL式の生成
データは以下の形に整形して利用します。
"""Converts a sample with 'qustion' and 'query' keys to a conversation format."""
return {
"messages": [
{"role": "user", "content": sample["qustion"]},
{"role": "assistant", "content": sample["query"]}
]
}
Question:
Show the names of customers who have both an order in completed status and an order in part status.
Original Answer:
SELECT T1.customer_name FROM customers AS T1 JOIN customer_orders AS T2 ON T1.customer_id = T2.customer_id WHERE T2.order_status_code = 'Completed' INTERSECT SELECT T1.customer_name FROM customers AS T1 JOIN customer_orders AS T2 ON T1.customer_id = T2.customer_id WHERE T2.order_status_code = 'Part'
Generated Answer:
SELECT T2.Customer_Name FROM Customer_Orders AS T1 JOIN Order_Items AS T2 ON T1.Order_ID = T2.Order_ID WHERE T1.Order_Status_Code = "completed" INTERSECT SELECT T2.Customer_Name FROM Customer_Orders AS T1 JOIN Order_Items AS T2 ON T1.Order_ID = T2.Order_ID WHERE T1.Order_Status_Code = "part_completed"
--------------------------------------------------------------------------------
Question:
Show the name, phone, and payment method code for all customers in descending order of customer number.
Original Answer:
SELECT customer_name , customer_phone , payment_method_code FROM customers ORDER BY customer_number DESC
Generated Answer:
SELECT customer_details, customer_phone, customer_payment_method FROM customers ORDER BY customer_number DESC
--------------------------------------------------------------------------------
Question:
Show the product name and total order quantity for each product.
Original Answer:
SELECT T1.product_name , sum(T2.order_quantity) FROM products AS T1 JOIN order_items AS T2 ON T1.product_id = T2.product_id GROUP BY T1.product_id
Generated Answer:
SELECT T2.product_name, sum(T1.order_quantity) FROM ORDER_ITEMS AS T1 JOIN Products AS T2 ON T1.product_id = T2.product_id GROUP BY T1.product_id
--------------------------------------------------------------------------------
日本語の質問です。
Japanese Question:
全てのスタジアムの名前とキャパシティをリストしてください。Generated Answer (SQL Query):
SELECT t1.name, t1.capacity FROM stadium AS t1 JOIN track AS t2 ON t1.id = t2.track_id JOIN sea_game AS t3 ON t2.sea_game_id = t3.id WHERE t3.name = "All star"
--------------------------------------------------------------------------------
Japanese Question:
キャパシティが平均より大きいスタジアムの名前を見つけてください。Generated Answer (SQL Query):
SELECT t2.name FROM stadium AS t1 JOIN track AS t2 ON t1.id = t2.id WHERE t1.avg(t2.attendance) > (SELECT avg(t2.attendance) FROM stadium AS t1 JOIN track AS t2 ON t1.id = t2.id WHERE t1.avg(t2.attendance) < (SELECT avg(t2.attendance) FROM stadium AS t1 JOIN track AS t2 ON t1.id = t2.id WHERE t1.avg(t2.attendance) > 1)
--------------------------------------------------------------------------------
Japanese Question:
最も多くのスタジアムがある国はどこですか?Generated Answer (SQL Query):
SELECT count(*) FROM stadium WHERE country = "USA" GROUP BY country ORDER BY count(*) DESC LIMIT 1
--------------------------------------------------------------------------------
Japanese Question:
記録がない水泳選手の名前を見つけてください。Generated Answer (SQL Query):
SELECT name FROM player WHERE player_id NOT IN (SELECT player_id FROM tryout WHERE pName = 'NYY')
--------------------------------------------------------------------------------
Japanese Question:
「Win」と「Loss」の両方の結果を持つ水泳選手の名前を見つけてください。Generated Answer (SQL Query):
SELECT T1.player_name FROM player AS T1 JOIN tryout AS T2 ON T1.player_id = T2.player_id WHERE T2.outcome = 'Win' AND T2.outcome_code = 'Loss'
--------------------------------------------------------------------------------
質問にテーブルの名前をしっかり入れてみます。
Japanese Question:
stadiumテーブルの全てのスタジアムの名前とキャパシティをリストしてください。Generated Answer (SQL Query):
SELECT t1.name, t1.capacity FROM stadium AS t1 JOIN track AS t2 ON t1.id = t2.track_id JOIN park AS t3 ON t2.park_id = t3.park_id WHERE t3.park_name = "stadium"
--------------------------------------------------------------------------------
Japanese Question:
stadiumテーブルから、キャパシティが平均より大きいスタジアムの名前を見つけてください。Generated Answer (SQL Query):
SELECT t1.name FROM stadium AS t1 JOIN track AS t2 ON t1.id = t2.stadium_id WHERE t2.city = (SELECT avg(city) FROM stadium)
--------------------------------------------------------------------------------
Japanese Question:
stadiumテーブルから、最も多くのスタジアムがあるcountryはどこですか?Generated Answer (SQL Query):
SELECT t2.country FROM stadium AS t1 JOIN track AS t2 ON t1.track_id = t2.track_id GROUP BY t2.country ORDER BY count(*) DESC LIMIT 1
--------------------------------------------------------------------------------
Japanese Question:
swimmerテーブルから、recordがないswimmerの名前を見つけてください。Generated Answer (SQL Query):
SELECT name FROM room WHERE room_id NOT IN (SELECT room_id FROM participants WHERE participant_id = "swimmer")
--------------------------------------------------------------------------------
Japanese Question:
swimmerテーブルから、「Win」と「Loss」の両方のresultを持つswimmerの名前を見つけてください。Generated Answer (SQL Query):
SELECT T1.name FROM player AS T1 JOIN swimmer AS T2 ON T1.player_id = T2.player_id WHERE T2.result = 'Win' AND T2.result = 'Loss'
--------------------------------------------------------------------------------
Japanese Question:
eventテーブルから、全てのイベント名をyearとともにリストしてください。Generated Answer (SQL Query):
SELECT event_name FROM event ORDER BY year_events
--------------------------------------------------------------------------------
Japanese Question:
railwayテーブルから、全てのbuilderとlocationをリストしてください。Generated Answer (SQL Query):
SELECT T2.railway, T1.location FROM builder AS T1 JOIN location AS T2 ON T1.location_id = T2.location_id
--------------------------------------------------------------------------------