この記事では、最新の変圧器ベースのモデルを組み合わせた、単純かつ効果的な質問応答システムの実装について説明します。このシステムは、回答生成に T5 (Text-to-Text Transfer Transformer) を使用し、意味的類似性のマッチングに Sentence Transformer を使用します。
前回の記事では、無料の基本的な LLM モデルを使用して、Web インターフェイスを備えた単純な翻訳 API を作成する方法を説明しました。今回は、無料のトランスフォーマーベースの LLM モデルとナレッジ ベースを使用した検索拡張生成 (RAG) システムの構築について詳しく見ていきましょう。
RAG (検索拡張生成) は、2 つの主要なコンポーネントを組み合わせた技術です。
検索: まず、ナレッジ ベース (ドキュメント、データベースなど) を検索して、指定されたクエリに関連する情報を見つけます。これには通常、以下が含まれます:
- テキストを埋め込み (意味を表す数値ベクトル) に変換する
- 類似性尺度 (コサイン類似度など) を使用した類似コンテンツの検索
- 最も関連性の高い情報を選択する
生成: 次に、言語モデル (コード内の T5 など) を使用して、次のように応答を生成します。
取得した情報を元の質問と組み合わせる
このコンテキストに基づいて自然言語応答を作成する
コード内:
- SentenceTransformer は、埋め込みを作成することで検索部分を処理します
- T5 モデルは、回答を作成することで生成部分を処理します
RAG の利点:
- 特定の知識に基づいているため、より正確な応答
- 純粋な LLM 反応と比較して幻覚が減少しました
- 最新情報またはドメイン固有の情報にアクセスする機能
- 純粋な生成よりも制御可能で透明性が高い
システムアーキテクチャの概要
実装は、2 つの主要コンポーネントを調整する SimpleQASystem クラスで構成されます。
- Sentence Transformers を使用した意味検索システム
- T5 を使用した回答生成システム
ソース コードの最新バージョンはここからダウンロードできます: https://github.com/alexander-uspenskiy/rag_project
システム図
RAG プロジェクト セットアップ ガイド
このガイドは、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」にチェックを入れてください
プロジェクトのセットアップ
ステップ 1: プロジェクト ディレクトリを作成する
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.質問処理
ユーザーが質問を送信すると、システムは次の手順に従います:
埋め込み生成: 質問は、回答に使用されたものと同じ文変換モデルを使用してベクトル表現に変換されます。
セマンティック検索: システムは、次の方法で最も関連性の高い保存された回答を見つけます。
- 質問の埋め込みとすべての回答の埋め込みの間のコサイン類似度を計算します
- 類似性スコアが最も高い回答を選択する コンテキストの形成: 選択した回答は、T5 が最終応答を生成するためのコンテキストになります。
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
回答生成プロセス:
- 質問とコンテキストを T5 のプロンプトに結合します
- 入力テキストを最大 512 トークンの長さでトークン化します
- 次のパラメータを使用してビーム検索を使用して答えを生成します:
- max_length=50: 回答の長さを制限します
- num_beams=4: 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 トークンに制限されています
エラー処理:
- コード全体にわたる包括的な try-excel ブロック
- デバッグに役立つエラー メッセージ
- 初期化されていないコンポーネントの検証チェック
使用例
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
のコンテキスト ウィンドウによる制限
回答の検証や信頼スコアリングから恩恵を受ける可能性があります
パフォーマンス:
- 大規模なアプリケーションでは CPU のみを使用すると速度が遅くなる可能性があります
- バッチ処理で最適化可能
- よくある質問のキャッシュを実装できます
結論
この実装は、セマンティック検索とトランスフォーマーベースのテキスト生成の長所を組み合わせた、質問応答システムの強固な基盤を提供します。モデル パラメーター (max_length、num_beams、early_stopping、no_repeat_ngram_size など) を自由に試して、より一貫性のある安定した答えを得るより良い方法を見つけてください。改善の余地はありますが、現在の実装では複雑さと機能性のバランスが取れており、教育目的や小規模から中規模のアプリケーションに適しています。
コーディングを楽しんでください!
以上が無料の LLM モデルとナレッジベースを使用して独自の RAG を作成する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

Pythonに工場パターンを実装すると、統一されたインターフェイスを作成することにより、さまざまな種類のオブジェクトを作成できます。特定の手順は次のとおりです。1。車両、車、飛行機、列車などの基本クラスと複数の継承クラスを定義します。 2。Factory Class CheerFactoryを作成し、Create_Vehicleメソッドを使用して、型パラメーターに従って対応するオブジェクトインスタンスを返します。 3。my_car = factory.create_vehicle( "car"、 "tesla"など、工場クラスを介してオブジェクトをインスタンス化します。このパターンは、コードのスケーラビリティと保守性を向上させますが、その複雑さに注意を払う必要があります

Pythonでは、RまたはRプレフィックスを使用して元の文字列を定義し、逃げたすべての文字を無視し、文字列を文字通り解釈します。 1)脱出キャラクターの誤解を避けるために、正規表現とファイルパスに対処するために適用されます。 2)ラインブレークなど、逃げたキャラクターを保存する必要がある場合には適用されません。予期しない出力を防ぐために使用する場合は、慎重なチェックが必要です。

Pythonでは、__del__メソッドはオブジェクトの破壊者であり、リソースのクリーンアップに使用されます。 1)不確実な実行時間:ごみ収集メカニズムに依存します。 2)循環参照:それにより、コールを迅速にできなくなり、weakRefモジュールを使用して処理することがあります。 3)例外処理:__del__でスローされた例外は、Try-Exectブロックを使用して無視され、キャプチャされる場合があります。 4)リソース管理のためのベストプラクティス:リソースを管理するためにステートメントとコンテキストマネージャーで使用することをお勧めします。

POP()関数は、Pythonで使用され、リストから要素を削除し、指定された位置を返します。 1)インデックスが指定されていない場合、POP()はデフォルトでリストの最後の要素を削除および返します。 2)インデックスを指定するとき、POP()はインデックス位置で要素を削除および返します。 3)インデックスエラー、パフォーマンスの問題、代替方法、および使用時のリストの変動に注意してください。

Pythonは、主に2つの主要なライブラリピローとOpenCVを使用して画像処理に使用しています。枕は、透かしの追加などの単純な画像処理に適しており、コードはシンプルで使いやすいです。 OpenCVは、優れたパフォーマンスを備えたエッジ検出などの複雑な画像処理とコンピュータービジョンに適していますが、メモリ管理に注意が必要です。

PythonでPCAの実装は、手動でコードを書くか、Scikit-Learnライブラリを使用して実行できます。 PCAの手動での実装には、次の手順が含まれます。1)データの集中、2)共分散行列の計算、3)固有値と固有ベクトルを計算し、4)主成分をソートして選択し、5)データを新しいスペースに投影します。手動の実装は、アルゴリズムを深く理解するのに役立ちますが、Scikit-Learnはより便利な機能を提供します。

Pythonでの対数計算は非常にシンプルですが興味深いことです。最も基本的な質問から始めましょう:Pythonで対数を計算する方法は? Pythonで対数を計算する基本的な方法PythonのMath Moduleは、計算するための関数を提供します。簡単な例を見てみましょう:Importmath#自然対数(base is e)x = 10natural_log = math.log(x)print(f "natural log({x})= {natural_log}")#を計算します。

Pythonで線形回帰を実装するには、複数の視点から開始できます。これは単なる機能呼び出しであるだけでなく、統計、数学的最適化、機械学習の包括的なアプリケーションを伴います。このプロセスに深く飛び込みましょう。 Pythonで線形回帰を実装する最も一般的な方法は、簡単で効率的なツールを提供するScikit-Learnライブラリを使用することです。ただし、線形回帰の原則と実装の詳細をより深く理解したい場合は、独自の線形回帰アルゴリズムをゼロから書くこともできます。 Scikit-Learnの線形回帰実装により、Scikit-Learnを使用して線形回帰の実装をカプセル化し、簡単にモデル化および予測できるようになります。これがSCの使用です


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

SublimeText3 Linux 新バージョン
SublimeText3 Linux 最新バージョン

SublimeText3 英語版
推奨: Win バージョン、コードプロンプトをサポート!

VSCode Windows 64 ビットのダウンロード
Microsoft によって発売された無料で強力な IDE エディター

MantisBT
Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

ZendStudio 13.5.1 Mac
強力な PHP 統合開発環境
