ホームページ >バックエンド開発 >Python チュートリアル >無料の LLM モデルとナレッジベースを使用して独自の RAG を作成する方法

無料の LLM モデルとナレッジベースを使用して独自の RAG を作成する方法

DDD
DDDオリジナル
2024-12-28 08:49:11262ブラウズ

この記事では、最新の変圧器ベースのモデルを組み合わせた、単純かつ効果的な質問応答システムの実装について説明します。このシステムは、回答生成に T5 (Text-to-Text Transfer Transformer) を使用し、意味的類似性のマッチングに Sentence Transformer を使用します。

前回の記事では、無料の基本的な LLM モデルを使用して、Web インターフェイスを備えた単純な翻訳 API を作成する方法を説明しました。今回は、無料のトランスフォーマーベースの LLM モデルとナレッジ ベースを使用した検索拡張生成 (RAG) システムの構築について詳しく見ていきましょう。

RAG (検索拡張生成) は、2 つの主要なコンポーネントを組み合わせた技術です。

検索: まず、ナレッジ ベース (ドキュメント、データベースなど) を検索して、指定されたクエリに関連する情報を見つけます。これには通常、以下が含まれます:

  • テキストを埋め込み (意味を表す数値ベクトル) に変換する
  • 類似性尺度 (コサイン類似度など) を使用した類似コンテンツの検索
  • 最も関連性の高い情報を選択する

生成: 次に、言語モデル (コード内の T5 など) を使用して、次のように応答を生成します。

取得した情報を元の質問と組み合わせる

このコンテキストに基づいて自然言語応答を作成する

コード内:

  • SentenceTransformer は、埋め込みを作成することで検索部分を処理します
  • T5 モデルは、回答を作成することで生成部分を処理します

RAG の利点:

  • 特定の知識に基づいているため、より正確な応答
  • 純粋な LLM 反応と比較して幻覚が減少しました
  • 最新情報またはドメイン固有の情報にアクセスする機能
  • 純粋な生成よりも制御可能で透明性が高い

システムアーキテクチャの概要

How to Create Your Own RAG with Free LLM Models and a Knowledge Base

実装は、2 つの主要コンポーネントを調整する SimpleQASystem クラスで構成されます。

  • Sentence Transformers を使用した意味検索システム
  • T5 を使用した回答生成システム

ソース コードの最新バージョンはここからダウンロードできます: https://github.com/alexander-uspenskiy/rag_project

システム図

How to Create Your Own RAG with Free LLM Models and a Knowledge Base

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

**コアコンポーネント

  1. 初期化**
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

ターミナルで実行

How to Create Your Own RAG with Free LLM Models and a Knowledge Base

制限事項と改善の可能性

スケーラビリティ:

現在の実装では、すべての埋め込みがメモリ内に保持されます
大規模アプリケーション用のベクトルデータベースを使用すると改善できる可能性があります

回答の質:

提供される回答データセットの品質に大きく依存します
T5-small
のコンテキスト ウィンドウによる制限 回答の検証や信頼スコアリングから恩恵を受ける可能性があります

パフォーマンス:

  • 大規模なアプリケーションでは CPU のみを使用すると速度が遅くなる可能性があります
  • バッチ処理で最適化可能
  • よくある質問のキャッシュを実装できます

結論

この実装は、セマンティック検索とトランスフォーマーベースのテキスト生成の長所を組み合わせた、質問応答システムの強固な基盤を提供します。モデル パラメーター (max_length、num_beams、early_stopping、no_repeat_ngram_size など) を自由に試して、より一貫性のある安定した答えを得るより良い方法を見つけてください。改善の余地はありますが、現在の実装では複雑さと機能性のバランスが取れており、教育目的や小規模から中規模のアプリケーションに適しています。

コーディングを楽しんでください!

以上が無料の LLM モデルとナレッジベースを使用して独自の RAG を作成する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。