この記事では、最新の変圧器ベースのモデルを組み合わせた、単純かつ効果的な質問応答システムの実装について説明します。このシステムは、回答生成に T5 (Text-to-Text Transfer Transformer) を使用し、意味的類似性のマッチングに Sentence Transformer を使用します。
前回の記事では、無料の基本的な LLM モデルを使用して、Web インターフェイスを備えた単純な翻訳 API を作成する方法を説明しました。今回は、無料のトランスフォーマーベースの LLM モデルとナレッジ ベースを使用した検索拡張生成 (RAG) システムの構築について詳しく見ていきましょう。
RAG (検索拡張生成) は、2 つの主要なコンポーネントを組み合わせた技術です。
検索: まず、ナレッジ ベース (ドキュメント、データベースなど) を検索して、指定されたクエリに関連する情報を見つけます。これには通常、以下が含まれます:
生成: 次に、言語モデル (コード内の T5 など) を使用して、次のように応答を生成します。
取得した情報を元の質問と組み合わせる
このコンテキストに基づいて自然言語応答を作成する
コード内:
RAG の利点:
実装は、2 つの主要コンポーネントを調整する SimpleQASystem クラスで構成されます。
ソース コードの最新バージョンはここからダウンロードできます: https://github.com/alexander-uspenskiy/rag_project
このガイドは、macOS と Windows の両方で取得拡張生成 (RAG) プロジェクトをセットアップするのに役立ちます。
macOS の場合:
Homebrew をインストールします (まだインストールされていない場合):
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
Homebrew
を使用して Python 3.8 をインストールする
醸造インストール Python@3.10
Windows の場合:
Python 3.8 を python.org
からダウンロードしてインストールします。
インストール時に必ず「Add Python to PATH」にチェックを入れてください
macOS:
mkdir RAG_project
cd RAG_プロジェクト
Windows:
mkdir RAG_project
cd RAG_プロジェクト
ステップ 2: 仮想環境をセットアップする
macOS:
python3 -m venv venv
ソース venv/bin/activate
Windows:
python -m venv venv
venvScriptsactivate
**コアコンポーネント
def __init__(self): self.model_name = 't5-small' self.tokenizer = T5Tokenizer.from_pretrained(self.model_name) self.model = T5ForConditionalGeneration.from_pretrained(self.model_name) self.encoder = SentenceTransformer('paraphrase-MiniLM-L6-v2')
システムは 2 つの主要モデルで初期化されます:
T5-small: 回答を生成するための T5 モデルの小さいバージョン
paraphrase-MiniLM-L6-v2: テキストを意味のあるベクトルにエンコードするための文変換モデル
2.データセットの準備
def prepare_dataset(self, data: List[Dict[str, str]]): self.answers = [item['answer'] for item in data] self.answer_embeddings = [] for answer in self.answers: embedding = self.encoder.encode(answer, convert_to_tensor=True) self.answer_embeddings.append(embedding)
データセットの準備フェーズ:
1.質問処理
ユーザーが質問を送信すると、システムは次の手順に従います:
埋め込み生成: 質問は、回答に使用されたものと同じ文変換モデルを使用してベクトル表現に変換されます。
セマンティック検索: システムは、次の方法で最も関連性の高い保存された回答を見つけます。
2.回答の生成
def get_answer(self, question: str) -> str: # ... semantic search logic ... input_text = f"Given the context, what is the answer to the question: {question} Context: {context}" input_ids = self.tokenizer(input_text, max_length=512, truncation=True, padding='max_length', return_tensors='pt').input_ids outputs = self.model.generate(input_ids, max_length=50, num_beams=4, early_stopping=True, no_repeat_ngram_size=2
回答生成プロセス:
3.回答 クリーニング
def __init__(self): self.model_name = 't5-small' self.tokenizer = T5Tokenizer.from_pretrained(self.model_name) self.model = T5ForConditionalGeneration.from_pretrained(self.model_name) self.encoder = SentenceTransformer('paraphrase-MiniLM-L6-v2')
最新バージョンのソース コードはここからダウンロードできます: https://github.com/alexander-uspenskiy/rag_project
def prepare_dataset(self, data: List[Dict[str, str]]): self.answers = [item['answer'] for item in data] self.answer_embeddings = [] for answer in self.answers: embedding = self.encoder.encode(answer, convert_to_tensor=True) self.answer_embeddings.append(embedding)
システムはメモリの問題を回避するために CPU を明示的に使用します
エンベディングは必要に応じて CPU テンソルに変換されます
入力長は 512 トークンに制限されています
使用例
def get_answer(self, question: str) -> str: # ... semantic search logic ... input_text = f"Given the context, what is the answer to the question: {question} Context: {context}" input_ids = self.tokenizer(input_text, max_length=512, truncation=True, padding='max_length', return_tensors='pt').input_ids outputs = self.model.generate(input_ids, max_length=50, num_beams=4, early_stopping=True, no_repeat_ngram_size=2
ターミナルで実行
スケーラビリティ:
現在の実装では、すべての埋め込みがメモリ内に保持されます
大規模アプリケーション用のベクトルデータベースを使用すると改善できる可能性があります
回答の質:
提供される回答データセットの品質に大きく依存します
T5-small
のコンテキスト ウィンドウによる制限
回答の検証や信頼スコアリングから恩恵を受ける可能性があります
パフォーマンス:
この実装は、セマンティック検索とトランスフォーマーベースのテキスト生成の長所を組み合わせた、質問応答システムの強固な基盤を提供します。モデル パラメーター (max_length、num_beams、early_stopping、no_repeat_ngram_size など) を自由に試して、より一貫性のある安定した答えを得るより良い方法を見つけてください。改善の余地はありますが、現在の実装では複雑さと機能性のバランスが取れており、教育目的や小規模から中規模のアプリケーションに適しています。
コーディングを楽しんでください!
以上が無料の LLM モデルとナレッジベースを使用して独自の RAG を作成する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。