GPT-4のようなほとんどの大規模な言語モデル(LLM)は、一般化された、しばしば時代遅れのデータセットでトレーニングされています。彼らは一般的な質問への回答に優れている間、彼らは最近のニュース、最新の開発、ドメイン固有のトピックについての質問と格闘しています。そのような場合、彼らは幻覚を起こすか、不正確な反応を提供するかもしれません。
Claude 3.5ソネットのようなより優れたパフォーマンスモデルの出現にもかかわらず、カスタマイズされた応答を生成するために微調整をモデル化するか、Baseモデルに追加のコンテキストを提供するために検索された生成(RAG)システムを使用する必要があります。 このチュートリアルでは、LLM応答を改善するために使用される2つの異なる手法であるRAGと微調整を検討します。結果を評価することにより、それらの違いを調べ、理論を実践します。
さらに、さらに、微調整されたモデルとRAGシステムを組み合わせて、両方の最高の世界を活用するハイブリッドテクニックに飛び込みます。最後に、特定のユースケースと要件に基づいて、これら3つのアプローチを選択する方法を学びます。
ragと微調整の概要ragおよび微調整技術は、ドメイン固有のクエリの応答生成を改善しますが、それらは本質的に完全に異なる手法です。それらについて学びましょう。
検索された生成(rag)
詳細については、記事を読んでください、検索拡張生成(RAG)とは何ですか?基本のガイドであり、RAGアプリケーションの内部の仕組みとさまざまなユースケースを理解します。
微調整は、ドメイン固有のデータセットを使用して、事前に訓練されたモデルをチューニングするプロセスです。事前に訓練されたモデルは、インターネットから廃棄された一般的なデータセットの複数の大きな死体でトレーニングされています。彼らは一般的な質問に答えるのが得意ですが、ドメイン固有の質問に応答しながら苦労したり、幻覚したりすることさえあります。
たとえば、
事前に訓練されたモデルは、一般的な会話能力に熟練している可能性がありますが、複雑な医療処置や法的先例について尋ねられた場合、間違った答えを生み出す可能性があります。微調整LLMSチュートリアルの入門ガイドに従って、視覚ガイドで事前に訓練されたモデルのカスタマイズについて学びます。
LLMSの応答生成を改善するための各方法論について学びました。違いを調べて、それらをよりよく理解しましょう。
RAGは動的学習スタイルを使用します。これにより、言語モデルは、データベース、インターネット、またはAPIの最新かつ最も正確なデータにアクセスして使用できます。このアプローチにより、生成された応答が常に最新かつ関連性があることが保証されます。
微調整には静的学習が含まれ、モデルはトレーニングフェーズ中に新しいデータセットを介して学習します。この方法により、モデルはドメイン固有の応答生成に適応できますが、再トレーニングなしでトレーニング後に新しい情報を統合することはできません。2。適応性
微調整はモデル出力をカスタマイズし、トレーニングデータセットに密接に関連する特別なドメインのモデルパフォーマンスを向上させます。また、応答生成のスタイルを変更し、RAGシステムよりも関連性の高い回答を提供する場合があります。
3。リソース強度
微調整は計算集約型ですが、一度実行されます。トレーニングプロセス中に複数のGPUと高いメモリが必要ですが、その後、RAGシステムと比較して非常にリソースに優しいです。
4。コスト
全体として、全体として、すべてが考慮された場合、平均して微調整はぼろきれよりも高くなります。
5。実装の複雑さ
RAGシステムはソフトウェアエンジニアによって構築され、中程度の技術的専門知識が必要です。 LLMのデザイン、ベクトルデータベース、埋め込み、プロンプトエンジニアなどについて学ぶ必要がありますが、時間がかかりますが、1か月で簡単に学ぶことができます。
を使用したRAGアプリケーションの構築
Llama 3とLangchain Ecosystemを使用してRAGアプリケーションを構築することから始めます。1。必要なすべてのPythonパッケージをインストールします
2。 LangchainおよびTransformersライブラリから必要な機能をロードします。
3。制限されたモデルとデータセットにアクセスするには、APIキーを使用して抱きしめるフェイスハブにログインすることをお勧めします。
%%capture %pip install -U langchain langchainhub langchain_community langchain-huggingface faiss-gpu transformers accelerate
4。データセット名と列名をHuggingFaceDataSetLoaderに提供して、データセットをロードします。 「医師」の列が私たちの主な文書であり、残りの列はメタデータになります。
from langchain.document_loaders import HuggingFaceDatasetLoader from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain.embeddings import HuggingFaceEmbeddings from langchain.vectorstores import FAISS from transformers import AutoTokenizer, AutoModelForCausalLM,pipeline from langchain_huggingface import HuggingFacePipeline from langchain.chains import RetrievalQA
5。データセットを最初の1000行に制限します。データセットを削減すると、ベクトルデータベースのデータストレージ時間を短縮できます。
from huggingface_hub import login from kaggle_secrets import UserSecretsClient user_secrets = UserSecretsClient() hf_token = user_secrets.get_secret("HUGGINGFACE_TOKEN") login(token = hf_token)
ご覧のとおり、「医師」列はページの内容であり、残りはメタデータと見なされます。
# Specify the dataset name dataset_name = "ruslanmv/ai-medical-chatbot" # Create a loader instance using dataset columns loader_doctor = HuggingFaceDatasetLoader(dataset_name,"Doctor") # Load the data doctor_data = loader_doctor.load() # Select the first 1000 entries doctor_data = doctor_data[:1000] doctor_data[:2]
6。 GPU加速度の有効化などの特定のパラメーターを使用して、埋め込みモデルを顔から抱きしめます。
7。サンプルテキストで提供して、埋め込みモデルをテストします。
8。データを埋め込みに変換し、それらをベクトルデータベースに保存します。
9。ローカルディレクトリにベクトルデータベースを保存します。
# Define the path to the embedding model modelPath = "sentence-transformers/all-MiniLM-L12-v2" # GPU acceleration model_kwargs = {'device':'cuda'} # Create a dictionary with encoding options encode_kwargs = {'normalize_embeddings': False} # Initialize an instance of HuggingFaceEmbeddings with the specified parameters embeddings = HuggingFaceEmbeddings( model_name=modelPath, model_kwargs=model_kwargs, encode_kwargs=encode_kwargs ) text = "Why are you a doctor?" query_result = embeddings.embed_query(text) query_result[:3]
[-0.059351932257413864, 0.08008933067321777, 0.040729623287916183]
11。 VectorデータベースインスタンスをRetriverに変換します。これにより、RAGチェーンの作成に役立ちます。
vector_db = FAISS.from_documents(doctor_data, embeddings) vector_db.save_local("/kaggle/working/faiss_doctor_index") question = "Hi Doctor, I have a headache, help me." searchDocs = vector_db.similarity_search(question) print(searchDocs[0].page_content)
12。 llama 3 8bチャットモデルを使用してトークネイザーとモデルをロードします。
14。パイプラインをLangchain LLMクライアントに変換します。
retriever = vector_db.as_retriever()
15。 Retriver、ユーザークエリ、RAGプロンプト、およびLLMを使用して、質問と回答チェーンを作成します。
16。医師に質問をしてQ&Aチェーンをテストします。
import torch base_model = "/kaggle/input/llama-3/transformers/8b-chat-hf/1" tokenizer = AutoTokenizer.from_pretrained(base_model) model = AutoModelForCausalLM.from_pretrained( base_model, return_dict=True, low_cpu_mem_usage=True, torch_dtype=torch.float16, device_map="auto", trust_remote_code=True, ) pipe = pipeline( "text-generation", model=model, tokenizer=tokenizer, max_new_tokens=120 ) llm = HuggingFacePipeline(pipeline=pipe)
データセットに非常に似ていますが、スタイルを拾いません。それはコンテキストを理解し、それを使用してそれ自体のスタイルで応答を書きました。
別の質問でもう一度やりましょう。
%%capture %pip install -U langchain langchainhub langchain_community langchain-huggingface faiss-gpu transformers accelerate
これは非常に直接的な答えです。医師と患者のチャットボットにRAGアプローチを使用する代わりに、モデルを微調整する必要があるかもしれません。
コードの実行が困難になっている場合は、Kaggleノートブックを参照してください。Llama3を使用してRAGアプリケーションを構築してください。
ラグパフォーマンスを向上させる方法に従って、チャンク、再ランキング、クエリ変換などのテクニックを使用してRAGシステムのパフォーマンスを改善する方法を学ぶ:5つの重要なテクニックの例チュートリアル。医療データに関するラマ3を微調整します
出典:Kingabzpro/llama-3-8b-chat-doctor
1。トランスライブラリを使用してトークン剤とモデルをロードします。
2。正しいパラメーターを使用して、Kaggle GPU T4 X2環境にモデルをロードしてください。
3。チャットテンプレートをメッセージに適用します。
4。モデルとトークンザーを使用してテキスト生成パイプラインを作成します。
from langchain.document_loaders import HuggingFaceDatasetLoader from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain.embeddings import HuggingFaceEmbeddings from langchain.vectorstores import FAISS from transformers import AutoTokenizer, AutoModelForCausalLM,pipeline from langchain_huggingface import HuggingFacePipeline from langchain.chains import RetrievalQA
応答はデータセットと非常に似ています。スタイルは同じですが、直接的な答えを与える代わりに、患者がさらなるテストを受けることを示唆しています。
from huggingface_hub import login from kaggle_secrets import UserSecretsClient user_secrets = UserSecretsClient() hf_token = user_secrets.get_secret("HUGGINGFACE_TOKEN") login(token = hf_token)
スタイルは同じであり、応答は非常に共感的で説明的です。
# Specify the dataset name dataset_name = "ruslanmv/ai-medical-chatbot" # Create a loader instance using dataset columns loader_doctor = HuggingFaceDatasetLoader(dataset_name,"Doctor") # Load the data doctor_data = loader_doctor.load() # Select the first 1000 entries doctor_data = doctor_data[:1000] doctor_data[:2]
ハイブリッドアプローチ(rag微調整)
微調整されたモデルに、応答をさらに調整してバランスを見つけるための追加のコンテキストを提供します。
すべてのコードを再度書き込む代わりに、Q&Aチェーンを使用して応答生成に直接飛び込みます。微調整されたモデルとRag Q&Aチェーンをどのように組み合わせたかについての完全なコードを表示したい場合は、ハイブリッドアプローチ(ラグファインチューニング)Kaggleノートブックをご覧ください。
チェーンに、ぼろきれモデルと微調整されたモデルを尋ねたのと同じ質問を提供します。
%%capture %pip install -U langchain langchainhub langchain_community langchain-huggingface faiss-gpu transformers accelerate
答えは非常に正確であり、応答は医師のスタイルで生成されます。
2番目の質問をしましょう。
from langchain.document_loaders import HuggingFaceDatasetLoader from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain.embeddings import HuggingFaceEmbeddings from langchain.vectorstores import FAISS from transformers import AutoTokenizer, AutoModelForCausalLM,pipeline from langchain_huggingface import HuggingFacePipeline from langchain.chains import RetrievalQA
これは奇妙です。にきびが膿に満ちているかどうかについて、追加のコンテキストを提供しませんでした。ハイブリッドモデルがいくつかのクエリには適用されない可能性があります。
医師と患者のチャットボットの場合、微調整されたモデルはスタイルの採用と精度に優れています。ただし、これは他のユースケースで異なる場合があります。そのため、特定のユースケースに最適な方法を決定するために広範なテストを実施することが重要です。
ハイブリッドアプローチの公式用語はRAFTです(検索された微調整)。 RAFTとは何ですか?ラグと微調整を組み合わせて、LLMSを専門ドメインブログに適応させます。rag vs微調整とraft
を選択する方法あなたが中間レベルの会社であり、応答の精度を向上させ、クラウドにオープンソースモデルを展開するために微調整したい場合は、データサイエンティストや機械学習運用エンジニアなどの専門家を雇う必要があります。微調整には、クラスの最高のGPU、大きなメモリ、クリーン化されたデータセット、およびLLMSを理解する技術チームが必要です。
ハイブリッドソリューションは、リソースであり、集中的に計算されます。また、微調整とぼろきれのバランスを取ることができるLLMOPSエンジニアも必要です。 RAGの優れた品質と微調整されたモデルを利用して、応答生成をさらに改善したい場合は、これを考慮する必要があります。
ぼろ、微調整、ラフトソリューションの概要については、以下の表を参照してください。
rag |
| 微調整
| raft
|
コンテキストの理解、幻覚を最小限に抑え、新しいデータに簡単に適応する、費用対効果が高い。 |
タスク固有の専門知識、カスタマイズ、精度の向上、堅牢性の向上 |
ぼろと微調整の両方の強度を組み合わせ、より深い理解とコンテキスト。
|
|
短所
| データソース管理、複雑さ。
| データバイアス、リソース集中、高い計算コスト、実質的なメモリ要件、時間と専門知識が集中しています。
実装の複雑さでは、検索と微調整プロセスのバランスをとる必要があります |
|
迅速なエンジニアリングよりも高い。 |
ラグよりも高い。高度に技術的な専門家が必要です。 |
3つの中で最も複雑です。 |
|
dynamic |
static |
動的静的 |
|
新しいデータと進化する事実に簡単に適応します。 |
特定のタスクとドメインに出力をカスタマイズします |
リアルタイムデータと特定のタスクの両方に適応します
|
コスト |
low 中程度 |
high |
|
リソースの強度 |
低い。リソースは、推論中に使用されます。 中程度。リソースは微調整中に使用されます。 |
high |
|
結論 大規模な言語モデルは、今日のAI開発の中心にあります。企業は、トレーニングに数百万ドルを費やすことなく、これらのモデルを改善およびカスタマイズするさまざまな方法を探しています。パラメーターの最適化と迅速なエンジニアリングから始めます。彼らはラグを選択するか、モデルを微調整してさらに良い反応を得て幻覚を減らします。応答を改善するための他の手法はありますが、これらは利用可能な最も人気のあるオプションです。 このチュートリアルでは、理論と実用的な例の両方を使用して、ぼろと微調整の違いについて学びました。また、ハイブリッドモデルを調査し、どの方法が最適かを比較しました。 LLMSと関連するさまざまな手法の展開の詳細については、llamaindexでragでコードをチェックし、langchainでLLMアプリケーションを展開するコースをご覧ください。 |
以上がRag vs微調整:実用的な例を備えた包括的なチュートリアルの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。