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

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

Dec 28, 2024 am 08:49 AM

この記事では、最新の変圧器ベースのモデルを組み合わせた、単純かつ効果的な質問応答システムの実装について説明します。このシステムは、回答生成に 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 までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Python vs. C:曲線と使いやすさの学習 Python vs. C:曲線と使いやすさの学習 Apr 19, 2025 am 12:20 AM

Pythonは学習と使用が簡単ですが、Cはより強力ですが複雑です。 1。Python構文は簡潔で初心者に適しています。動的なタイピングと自動メモリ管理により、使いやすくなりますが、ランタイムエラーを引き起こす可能性があります。 2.Cは、高性能アプリケーションに適した低レベルの制御と高度な機能を提供しますが、学習しきい値が高く、手動メモリとタイプの安全管理が必要です。

Pythonの学習:2時間の毎日の研究で十分ですか? Pythonの学習:2時間の毎日の研究で十分ですか? Apr 18, 2025 am 12:22 AM

Pythonを1日2時間学ぶだけで十分ですか?それはあなたの目標と学習方法に依存します。 1)明確な学習計画を策定し、2)適切な学習リソースと方法を選択します。3)実践的な実践とレビューとレビューと統合を練習および統合し、統合すると、この期間中にPythonの基本的な知識と高度な機能を徐々に習得できます。

Python vs. C:パフォーマンスと効率の探索 Python vs. C:パフォーマンスと効率の探索 Apr 18, 2025 am 12:20 AM

Pythonは開発効率でCよりも優れていますが、Cは実行パフォーマンスが高くなっています。 1。Pythonの簡潔な構文とリッチライブラリは、開発効率を向上させます。 2.Cのコンピレーションタイプの特性とハードウェア制御により、実行パフォーマンスが向上します。選択を行うときは、プロジェクトのニーズに基づいて開発速度と実行効率を比較検討する必要があります。

Python vs. C:重要な違​​いを理解します Python vs. C:重要な違​​いを理解します Apr 21, 2025 am 12:18 AM

PythonとCにはそれぞれ独自の利点があり、選択はプロジェクトの要件に基づいている必要があります。 1)Pythonは、簡潔な構文と動的タイピングのため、迅速な開発とデータ処理に適しています。 2)Cは、静的なタイピングと手動メモリ管理により、高性能およびシステムプログラミングに適しています。

Python Standard Libraryの一部はどれですか:リストまたは配列はどれですか? Python Standard Libraryの一部はどれですか:リストまたは配列はどれですか? Apr 27, 2025 am 12:03 AM

PythonListSarePartOfThestAndardarenot.liestareBuilting-in、versatile、forStoringCollectionsのpythonlistarepart。

Python:自動化、スクリプト、およびタスク管理 Python:自動化、スクリプト、およびタスク管理 Apr 16, 2025 am 12:14 AM

Pythonは、自動化、スクリプト、およびタスク管理に優れています。 1)自動化:OSやShutilなどの標準ライブラリを介してファイルバックアップが実現されます。 2)スクリプトの書き込み:Psutilライブラリを使用してシステムリソースを監視します。 3)タスク管理:スケジュールライブラリを使用してタスクをスケジュールします。 Pythonの使いやすさと豊富なライブラリサポートにより、これらの分野で優先ツールになります。

科学コンピューティングのためのPython:詳細な外観 科学コンピューティングのためのPython:詳細な外観 Apr 19, 2025 am 12:15 AM

科学コンピューティングにおけるPythonのアプリケーションには、データ分析、機械学習、数値シミュレーション、視覚化が含まれます。 1.numpyは、効率的な多次元配列と数学的関数を提供します。 2。ScipyはNumpy機能を拡張し、最適化と線形代数ツールを提供します。 3. Pandasは、データ処理と分析に使用されます。 4.matplotlibは、さまざまなグラフと視覚的な結果を生成するために使用されます。

Web開発用のPython:主要なアプリケーション Web開発用のPython:主要なアプリケーション Apr 18, 2025 am 12:20 AM

Web開発におけるPythonの主要なアプリケーションには、DjangoおよびFlaskフレームワークの使用、API開発、データ分析と視覚化、機械学習とAI、およびパフォーマンスの最適化が含まれます。 1。DjangoandFlask Framework:Djangoは、複雑な用途の迅速な発展に適しており、Flaskは小規模または高度にカスタマイズされたプロジェクトに適しています。 2。API開発:フラスコまたはdjangorestFrameworkを使用して、Restfulapiを構築します。 3。データ分析と視覚化:Pythonを使用してデータを処理し、Webインターフェイスを介して表示します。 4。機械学習とAI:Pythonは、インテリジェントWebアプリケーションを構築するために使用されます。 5。パフォーマンスの最適化:非同期プログラミング、キャッシュ、コードを通じて最適化

See all articles