以前、シリコンクラウドは、その言語モデルでオンラインになった。オンラインLoRA微調整機能.コーパスデータをアップロードし、ファインチューニングタスクを作成するだけで、独自にファインチューニングされた言語モデルを得ることができる。
最近、SiliconCloudのLLMオンラインLoRAファインチューニングは、ファインチューニングのベースモデルとしてQwen2.5-32B、Qwen2.5-14B、Llama-3.1-8Bモデルを拡張し、ファインチューニングのプレイアビリティをさらに向上させ、ファインチューニングモデルのトレーニングと使用コストをさらに削減しました。
実際、独自のビッグ言語モデルの微調整は非常に簡単です。SiliconCloudのファインチューニング機能を使えば、数十個のトレーニング・コーパスを用意するだけで、ベースモデルからモデルを「大幅に」変更することができます。
事前準備
まず、微調整が何を達成しようとしているのかを明確にする必要がある。多くの場合、ファインチューニングは、モデルがトレーニングに含まれていなかった何かを学習したり、ある独特の言語スタイルを身につけたりするのに役立つ。
目的が異なれば、アプローチも異なる。例えば、モデルに特定のドメイン知識を学習させたいのであれば、それに基づいた質問と回答を含む学習データが必要ですし、モデルに特定の典型的な言語スタイルを学習させたいのであれば、そのスタイルを持つ対話データが必要です。
データ準備
LLMモデルのファインチューニングでは、LLMの呼び出しメッセージと本質的に同じデータ構造を持つダイアログの形でデータを提供する必要がある。テキスト生成インターフェースは、微調整されたデータを構築するために呼び出されると言える。
以下は、微調整されたデータの典型的な例である:
{ "messages": [{ "role": "system", "content": "あなたは火災システムの専門家です"}, { "role": "user", "content": "自宅に火災警報器を設置するにはどうすればよいですか?}{ "role": "assistant", "content": "家庭用火災安全システム(GB22370-2008)によると、家庭用火災警報器はメーカーの要求に従って設置されるべきである。具体的には、装置が正常な監視状態にあり、適切な火災感知器やその他の部品に接続されていることを確認する。設置場所は、装置の正常な動作を確保するために、高温、多湿、埃っぽい場所を避けるべきである。}
微調整を行うには、通常、このようなデータを数十個用意し、1行1行の形式で「jsonl」ファイルとして保存する必要がある:
{ "messages": [{ "role": "system", "content": "あなたは火災システムの専門家です"}, { "role": "user", "content": "自宅に火災警報器を設置するにはどうすればよいですか?}{ "role": "assistant", "content": "家庭用火災安全システム(GB22370-2008)によると、家庭用火災警報器はメーカーの要求に従って設置する必要があります。具体的には、装置が正常な監視状態にあり、適切な火災感知器やその他の部品に接続されていることを確認する。設置場所は、装置の適切な動作を確保するために、高温、多湿、埃っぽい場所を避けるべきである。} {"messages": [{"role": "system", "content": "あなたは火災システムの専門家です"}, {"role": "user", "content": "火災報知器に必要な電源は何ですか?}役割": "アシスタント", "内容": "家庭用火災安全システム(GB22370-2008)の規定によると、家庭用火災警報器のコントローラの主電源は、220V、50HzのAC電源でなければなりません。バックアップ電源は、何度でも充放電可能な電池とし、製造者が指定する放電限度を超えない場合、24時間以内に定格容量80%以上に充電でき、48時間後に満充電できるものとする。} {"messages": [{"role": "system", "content": "あなたは防火システムの専門家です"}, {"role": "user", "content": "火災報知器の音響信号と視覚信号の要件は何ですか?}{ "role": "assistant", "content": "家庭用火災安全システム(GB22370-2008)によると、火災報知器の音響信号の音圧レベルは、少なくとも一方向の3メートルにおいて75dB(A加重)以上でなければならず、いかなる方向の3メートルにおいても120dB(A加重)以上であってはならない。また、いかなる方向においても、3m の距離で 120dB(A加重)以下でなければならない。火災報知灯の光信号は、100lxから500lxの周囲光の下で、25mの距離ではっきりと見えること。} {"messages": [{"role": "system", "content": "あなたは防火システムの専門家です"}, {"role": "user", "content": "火災報知器の故障信号をどうしますか?"}]。{"role": "assistant", "content": "家庭用火災安全システム(GB22370-2008)によると、接続部品との通信障害、待機用充電器と待機用電源の間の接続線の断線または短絡、待機用電源とその負荷の間の接続線の断線または短絡が発生した場合。接続機器間の通信障害、待機用充電器と待機用電源間の接続線の断線・短絡、待機用電源とその負荷間の接続線の断線・短絡、主電源の電圧不足が発生した場合、住宅用火災警報制御装置は、100秒以内に障害の音声信号と光信号を発信し、障害の種類を表示すること。可聴故障信号は手動で解除でき、別の故障信号が入力されたときに再び作動できること。} {"messages": [{"role": "system", "content": "あなたは防火システムの専門家です"}, {"role": "user", "content": "火災報知機の自己診断機能はどのように機能しますか?}役割": "アシスタント", "内容": "家庭用火災安全システム(GB22370-2008)によると、家庭用火災警報器のコントローラは、ユニットの機能チェック(セルフテスト)を実行できる必要があります。セルフテスト機能の実行中は、それによって制御される外部機器も出力接点も動作してはならない。自己試験時間が1分を超える場合、または自己試験機能を自動的に停止できない場合、自己試験を行っていない部分の火災警報機能およびコントローラ自体に影響を及ぼしてはならない。} {"messages": [{"role": "system", "content": "You are a fire system expert"}, {"role": "user", "content": "What are the requirements for display messages on a fire alarm?}, {"role": "assistant", "content": "家庭用火災安全システム(GB22370-2008)の規定に従って、数字と文字を使って作業状態を表示する家庭用火災警報器のコントローラは、火災警報、監視警報、その他の状態を、情報表示のレベルが高いものから低いものの順に表示するように配置する。上位の状態情報を優先的に表示し、下位の状態情報の表示が上位の状態情報の表示に影響を与えないようにする。表示されるメッセージは、対応するステータスと一致し、容易に認識できるものでなければならない。} {"messages": [{"role": "system", "content": "You are a fire system expert"}, {"role": "user", "content": "What is the sound pressure level of the fire alarm?}{"role": "assistant", "content": "家庭用火災安全システム(GB22370-2008)によると、様々な警報状態(真正面1メートル)における家庭用火災警報器のコントローラーの音圧レベルは75dB(A特性)以上でなければなりません。} {"messages": [{"role": "system", "content": "あなたは火災システムの専門家です"}, {"role": "user", "content": "How to install a combustible gas detector?}{"role": "assistant", "content": "「可燃性ガス警報コントローラー」(GB16808-2008)によると、可燃性ガス検知器は製造者の要求に従って設置し、可燃性ガス警報コントローラーに接続する。設置場所は高温、多湿、粉塵の多い場所を避け、機器の正常な作動を確保すること。} {"messages": [{"role": "system", "content": "あなたは防火システムの専門家です"}, {"role": "user", "content": "可燃性ガス検知器の警報機能の要件は何ですか?}{"role": "assistant", "content": "可燃性ガス警報コントローラー(GB16808-2008)によると、可燃性ガス検知器は低限警報または低限警報と高限警報の2セグメント警報の機能を持たなければならない。可燃性ガス警報信号が入力された場合、コントローラは10秒以内に警報音と光信号を発し、手動でリセットするまで保持しなければならない。} {"messages": [{"role": "system", "content": "You are a fire system expert"}, {"role": "user", "content": "How to check the insulation of a fire alarm?}{"role": "assistant", "content": "家庭用火災安全システム"(GB22370-2008)に従い、絶縁抵抗試験装置を通して供試品の外部活線端子とシャーシにそれぞれ500V±50Vの直流電圧を60秒±5秒間印加した後、絶縁抵抗値を測定する。絶縁抵抗値を測定する。絶縁要求のある供試品の外部活線端子とシャーシ間の絶縁抵抗値は 20MΩ以上でなければならない。供試品の電源入力端子とシャーシ間の絶縁抵抗値は 50MΩ以上でなければならない。}
日常業務で比較的多くの高品質なデータが蓄積されている場合は、簡単なデータクリーニングを行い、フォーマット要件を満たすデータファイルを構築することで、ファインチューニングを開始することができる。データの蓄積が不足していたり、クリーニングのプロセスが複雑であったりする場合は、ビッグモデルの助けを借りて微調整を試みたり、モデルを用いてデータを構築したりすることができる。
次に、データを構築するプロセスを練習するために例を使用します。消防の基準で質問と回答を構成し、「消防の専門家」の大規模モデルを訓練してみよう。
テクトニック・ファインチューニング・データ
SiliconCloudは128Kのコンテクストを持つQwen2.5モデルを提供しており、これはかなりリッチなコンテンツをカバーするには十分すぎるほどだ。
まず、データを作成するために使用するファイルをローカルに用意する必要があります。例えば、"GB22370-2008 Domestic Fire Safety Systems.pdf "です。
次に、ファイルの内容を抽出し、プロンプトを書き込み、Qwen Big Model に上記の要件を満たすデータを生成させる必要がある。これはコードで行うか、あるいは ダイファイ などのインターフェイスツールが完成する。
Difyでワークフローを構成する例を見てみましょう:
1.スタートノード設定ファイルがアップロードされ、トレーニングコーパスのシステムプロンプトフィールドが入力されます;
2.Difyに付属しているドキュメント抽出ノードとコードノードを使って、ファイルの内容をテキストにマージします;
3.LLMノードを使用して、SiliconCloudのQwen/Qwen2.5-72B-Instruct-128Kモデルを呼び出します(ファイルの長さが32K以内の場合は、プラットフォームが提供する別のモデルを選択できます):
-
-
- Settings - Model VendorでSiliconFlowを選択します;
- Add Modelをクリックし、画像を参照して必要なパラメータを入力し、保存する。
-
- マクロモデルの出力をワークフローの出力として使用することで、実行後にコーパスデータのバッチを得ることができる;
- 次に、この内容をコピーして.jsonlファイルとして保存し、SiliconCloudにアップロードするだけで、微調整タスクが作成される。
一度に生成されるデータが十分でない場合は、複数回実行してより多くのデータを構築することができる。
注意しなければならないのは、より細かく調整されたデータが必ずしも良いとは限らないということだ。たとえデータが1つしかなくても、ファインチューニングを始めることができる。たとえデータが1つしかなくても、微調整を始めることができる。逆に、質が十分でないデータがたくさんあれば、微調整の効果は期待通りにならないかもしれない。
アプリ 説明: 「ファイルをアップロードし、SiliconCloud 128KコンテキストのQwen2.5モデルを使用して、ファイルの内容に基づいて毎日のQ&Aコンテンツを生成します。 ⚠️ メモ: - Difyの制限により、80,000文字以上のファイル内容は切り捨てられます。 - 生成されたコンテンツは参考用であり、錯覚やコンテンツエラー、フォーマットエラーがあるかもしれません。 icon: 🤖アイコン icon_background: '#FFEAD5' モード:ワークフロー name: コーパスビルダーの微調整 use_icon_as_answer_icon: false 種類: app バージョン: 0.1.5 ワークフロー 会話変数: []. 環境変数: []. 機能 file_upload: [] environment_variables: [] features. 許可されるファイル拡張子。 - .JPG - .JPG - .JPG - .GIF - .WEBP - .SVG 許可されるファイルタイプ - .GIF .WEBP .SVG 許可されるファイルアップロードメソッド。 - ローカルファイル - リモートURL 有効: false fileUploadConfig: audio_file_size_limit: 50 オーディオファイルのサイズ制限: 50 バッチ数制限: 5 ファイルサイズの上限: 15 画像ファイルのサイズ制限: 10 ビデオファイルのサイズ制限: 100 ワークフローファイルのアップロードリミット: 10 画像ファイル 有効: false number_limits: 3 workflow_file_upload_limit: 10 image: enabled: false number_limits: 3 transfer_methods. - ローカルファイル - リモートURL 数リミット: 3 オープニングステートメント: '' retriever_resource. 有効: true sensitive_word_avoidance: 有効: false 有効: false speech_to_text. 有効: false suggested_questions: [] (提案された質問) suggested_questions_after_answer: [enabler: false speech_to_text: false 有効: false speech_to_text: 有効: false suggested_questions: [] suggested_questions_after_answer: 有効: false 有効: false language: '' voice: '' グラフ: false edges: false - data: isInIteration: false isInIteration: false sourceType: start targetType: document-extractor id: 1735807686274-source-1735807758092-target ソース: '1735807686274' ソースハンドル: ソース ターゲット: '1735807758092' targetHandle: ターゲット タイプ: カスタム zIndex: 0 - targetHandle: target type: custom zIndex: 0 data. isInIteration: false sourceType: ドキュメント抽出 targetType: code id: 1735807758092-source-1735807761855-target ソース: '1735807758092' ソースハンドル: ソース ターゲット: '1735807761855' targetHandle: ターゲット タイプ: カスタム zIndex: 0 - targetHandle: target type: custom zIndex: 0 data. isInIteration: false sourceType: code targetType: llm id: 1735807761855-source-1735807764975-target ソース: '1735807761855' sourceHandle: ソース ターゲット: '1735807764975' targetHandle: ターゲット タイプ: カスタム zIndex: 0 - targetHandle: target type: custom zIndex: 0 data. isInIteration: false sourceType: llm targetType: end id: 1735807764975-source-1735807769820-target ソース: '1735807764975' sourceHandle: ソース ターゲット: '1735807769820' targetHandle: ターゲット タイプ: カスタム zIndex: 0 targetHandle: ターゲットタイプ: カスタム zIndex: 0 - target type: custom zIndex: 0 nodes: 0 data. desc: '' 選択された: false タイトル: スタート タイプ: スタート 変数: allowed_file_extensions: []. - 許可されるファイル拡張子: []. 許可されるファイルタイプ: [] - 許可されるファイルタイプ: document allowed_file_upload_methods: [] allowed_file_types: document - ローカルファイル - リモートURL ラベル: コーパス文書 最大長: 10 オプション: []. 必須: true タイプ: ファイルリスト 変数: 添付ファイル - 許可されるファイル拡張子: []. allowed_file_types. - image allowed_file_upload_methods: [] allowed_file_types: image - ローカルファイル - リモートURL label: トリガーとなる単語(トレーニング時のシステムプロンプト) 最大長: 48 オプション: []. 必須: true タイプ: テキスト入力 変数: トリガー 高さ: 116 id: '1735807686274' 位置 x: 30 y: 258 positionAbsolute. x: 30 y: 258 selected: false ソース位置: 右 targetPosition: 左 タイプ: カスタム data: data: y: 258 selected: false sourcePosition: right targetPosition: left type: custom - data: y: 258 selected: false source: right targetPosition: left type: custom is_array_file: true is_array_file: true 選択された: false タイトル: ドキュメント抽出 タイプ: ドキュメント抽出 variable_selector. - '1735807686274' - 添付ファイル 高さ: 92 id: '1735807758092' 位置 x: 334 y: 258 positionAbsolute. x: 334 y: 258 selected: false ソース位置: 右 targetPosition: 左 タイプ: カスタム data: data: y: 258 selected: false sourcePosition: right targetPosition: left type: custom - data: "def main(articleSections:) code: "def main(articleSections: list) -> dict:¦ try:¦ # リストアイテムを文字列に結合する。 \ 結合_text = ¦"¦".join(articleSections)¦n \\ # 最初の80,000文字をインターセプトする。 \return {n "result": truncated_text}n {n "result": truncated_text}n \}n except Exception as e:¦#エラー処理¦ return {n ¦"result": truncated_text \ result」: 「result」: 「result」: 「result」: 「result」: 「result」 }" code_language: python3 desc: '' outputs. children: null 子供: null タイプ: 文字列 selected: false title: コード実行 タイプ: コード 変数: value_selector: value_selector - value_selector. - '1735807758092' - テキスト 変数: articleSections 高さ: 54 id: '1735807761855' 位置 x: 638 y: 258 positionAbsolute. x: 638 y: 258 selected: false ソース位置: 右 targetPosition: 左 タイプ: カスタム data: data: y: 258 selected: false sourcePosition: right targetPosition: left type: custom - data: y: 258 selected: false source: right targetPosition: left type: custom. context: false 有効: false variable_selector: [] 変数セレクタ desc: '' model: [] desc: '' completion_params: [] desc: '' model: [] completion_params. frequency_penalty: 0.5 max_tokens: 4096 温度: 0.3 モード: チャット 名前: Qwen/Qwen2.5-72B-Instruct-128K プロバイダ: Qwen/Qwen2.5-72B-Instruct-128K シリコンフロー prompt_template. - id: b6913d40-d173-45d8-b012-98240d42a196 役割: システム text: '[役割 あなたはLLMのラージ・ランゲージ・モデリング・サイエンティストで、ユーザーが提供した内容を考慮し、仕様に準拠した微調整されたデータを構築する手助けをします! タスク - 与えられたコンテンツに対して、一度に10個の一般的な質問を挙げてください; - それぞれの質問に対して、そのコンテンツの原文を引用し、合理的な説明や推論を加えて答えを提示する; - そして、質問と回答を標準化されたJSONLフォーマットに整理する。 [要求事項 1.質問は「コンテンツ」から直接引用するのではなく、現代の実生活に近いものであること; 2.設問は俗語で、「嘘、大げさ、空虚」を避けること; 3.解答は原文に忠実であるべきで、原文の解釈が原文の主旨や思想から離れてはならない; 出力仕様 * 出力仕様 JSONL、1行に1データ * 各行のデータにはメッセージの配列が含まれ、各メッセージにはシステム、ユーザー、アシスタントの役割を持つ3つの行が含まれる。 * ロールがsystemのデータは、トレーニングのシステムプロンプトとして特に重要であり、その内容はユーザーが指定した「トリガーワード」を使用する。 * ロールが user のデータは、リストされた「質問」に対応する。 * 役割がアシスタントのデータは、「質問」に対する「答え」に対応する。 * 以下はその例である: ``` {"messages": [{"role": "system", "content": "You are a contemporary scholar"}, {"role": "user". "内容": "どのように勉強すべきですか?" } , {"role": "assistant".役割": "アシスタント", "内容": "賢賢は色に易く、親に仕えれば全力を尽くすことができ、君主に仕えれば全力を尽くすことができ、友人に仕えれば約束を守ることができる。学ばないと言っても、学んだと言おう。} ```'' - ID: 61530521-14cf-4eaf-8f06-a4bc89db3cb1 role: ユーザー text: '``コンテンツ'' {{#1735807761855.result#}} "トリガーワード" {{#1735807686274.trigger#}}' selected: false タイトル: LLM タイプ: llm 変数: []. ビジョン 有効: false 高さ: 98 id: '1735807764975' position. x: 942 y: 258 positionAbsolute. x: 942 y: 258 selected: true ソース位置: 右 ターゲット位置: 左 タイプ: カスタム data: データ: y: 258 - data: y: 258 desc: '' 出力: value_selector: '' - value_selector. - '1735807764975' - テキスト 変数: text selected: false タイトル: end タイプ: end 高さ: 90 id: '1735807769820' position: '1735807769820' x: 1246 y: 258 positionAbsolute. x: 1246 y: 258 selected: false ソース位置: 右 targetPosition: 左 タイプ: カスタム data: data: y: 258 selected: false sourcePosition: right targetPosition: left type: custom - data: y: 258 author: Dify desc: '' 高さ: 88 selected: false showAuthor: true text: '{"root": {"children":[{"detail": 0, "format": 0, "mode": "normal", "style": "", "text": "出力形式の安定性を向上させるために温度を低く設定する。 出力フォーマットの安定性を向上させるための温度", "type": "text", "version":1}], "direction": "ltr", "format": "", "indent":0, "type": "paragraph", "version":1,"textFormat":0}], "direction": "ltr", "format":", "indent":0, "type": "root", "version":1}}' テーマ: 青 タイトル: '' タイプ: '' 幅: 240 高さ: 88 id: '1735808753316' 位置 x: 951.4285714285714 y: 375.7142857142857 positionAbsolute. x: 951.4285714285714 y: 375.7142857142857 y: 375.7142857142857 selected: false ソース位置: 右 ターゲット位置: 左 タイプ: カスタムノート 幅: 240 - データ 作成者: Dify desc: '' 高さ: 88 selected: false showAuthor: true text: '{"root": {"children":[{"children":[{"detail": 0, "format": 0, "mode": "normal", "style":", "text": "複数のドキュメントの内容をマージし、最初の8W文字をインターセプトする。 8W文字", "type": "text", "version": 1}], "direction": "ltr", "format": "", "indent": 0, "type": "paragraph", "version": 1, "textFormat": 0}], "direction": "ltr", "format": "", "indent":0, "type": "root", "version":1}}'. テーマ: 青 タイトル: '' タイプ: '' 幅: 240 高さ: 88 id: '1735808799815' 位置 x: 640 y: 338.5714285714286 positionAbsolute. x: 640 y: 338.5714285714286 selected: false ソース位置: 右 ターゲット位置: 左 タイプ: カスタムノート 幅: 240 ビューポート x: 0 y: 0 ズーム: 0.7
Difyのようなツールの使用に加えて、Qwen/Qwen2.5-Coder-32B-Instructのようなモデルを直接使用して、実行するスクリプトの作成を支援することも、微調整されたデータを構築する効率的な方法であり、3者間プラットフォームのいくつかの制限を回避することができます。データである。
トレーニングと検証の微調整
SiliconCloudプラットフォームで新しい微調整タスクを作成し、先ほど保存した.jsonlファイルをアップロードして選択し、Start Fine-Tuningをクリックします。 ファインチューニング・タスクのキューイングが終了するのを待ち、実行が完了したら、ファインチューニングされたモデルを使用するか、オンライン・エクスペリエンスやAPIを通じて結果を検証することができる。 ダイアログ・モデルのオンライン・エクスペリエンスの比較機能では、複数のチェックポイント・モデルとベース・モデルでモデルの応答と出力を比較し、最も効果的なモデルを選択して使い続けることもできます。微調整モデルとベースモデルの比較 複数のチェックポイント間の比較: この時点で、ローカルファイルを使ってLLMファインチューニングデータを構築し、ファイヤーエキスパートLLMをファインチューニングした。もちろん、上記の手順で、独自のドメイン固有のLLMを構築してみることもできる。