Hanah

Hanah

wow-agent day06 RAG接入エージェント

Reference:Datawhale wow agent day06

RAG とは何ですか?#

私たちは豆包から以下の回答を得ました:
自然言語処理の分野では、言語モデルは通常、大規模なテキストコーパスで訓練され、言語のパターンや意味情報を学習します。しかし、これらのモデルには知識の更新が遅れたり、生成されたコンテンツに誤った情報(例えば、幻覚現象)が含まれる可能性があるという問題があります。RAG 技術の登場は、これらの問題を解決するためです。
それは情報検索とテキスト生成を組み合わせます。簡単に言えば、回答を生成する前に、外部の知識ベース(文書データベースや知識グラフなど)から関連情報を検索し、その検索結果を利用して言語モデルがより正確でターゲットを絞った回答を生成するのを助けます。まるで質問に答える際に、まず関連する書籍資料を調べ、その調べた内容に基づいてより良い回答を組織するようなものです。
作業フロー

  1. 検索段階
    ユーザーの質問(例えば、問答システムで)を受け取ると、システムは何らかの検索メカニズム(ベクトル空間モデルや逆インデックスなど)を使用して知識ベース内で質問に関連するテキスト片を探します。例えば、質問が「風邪の治療法は?」であれば、システムは医学知識ベース内で「風邪治療法」に関連する内容を含む文書段落を検索します。
    これらの検索されたテキスト片は、完全な文や段落、さらには複数の文書の一部内容である可能性があり、回答生成の参考情報として使用されます。
  2. 生成段階
    検索された情報と元の質問を言語生成モデル(例えば、Transformer アーキテクチャの生成型言語モデル)に入力します。言語モデルはこれらの入力に基づいて、学習した言語知識を組み合わせて最終的な回答を生成します。例えば、言語モデルは検索された風邪治療法に関連するテキストを分析・統合し、「風邪は水を多く飲み、休息を取り、適切な薬を服用することで治療できます」といった回答を生成します。

インデックスの構築#

# 指定されたファイルから読み込み、入力はList
from llama_index.core import SimpleDirectoryReader,Document
documents = SimpleDirectoryReader(input_files=['../docs/問答手册.txt']).load_data()

# ノードの構築
from llama_index.core.node_parser import SentenceSplitter
transformations = [SentenceSplitter(chunk_size = 512)]

from llama_index.core.ingestion.pipeline import run_transformations
nodes = run_transformations(documents, transformations=transformations)

# インデックスの構築
from llama_index.vector_stores.faiss import FaissVectorStore
import faiss
from llama_index.core import StorageContext, VectorStoreIndex

emb = embedding.get_text_embedding("こんにちは")
vector_store = FaissVectorStore(faiss_index=faiss.IndexFlatL2(len(emb)))
storage_context = StorageContext.from_defaults(vector_store=vector_store)

index = VectorStoreIndex(
    nodes = nodes,
    storage_context=storage_context,
    embed_model = embedding,
)

コードの詳細:このコードの目的は、テキストデータをベクトル表現に変換し、高速検索に使用できるベクトルインデックスを構築することです。この方法により、高効率のテキスト検索と類似性マッチングを実現できます。

  • SimpleDirectoryReader を使用して、指定されたパス docs\ 問答手册.txt からデータを読み込みます。load_data () メソッドはファイル内容を Document オブジェクトのリストとしてロードします。
  • SentenceSplitter を使用して、テキストを 512 文字の小さなブロックに分割します。transformations は分割ルールを含むリストです。
  • run_transformations 関数は、以前に定義された transformations を適用し、documents を nodes に変換します。これらのノードはインデックスの構築に使用されます。
  • FaissVectorStore と faiss ライブラリを使用してベクトルストレージを作成します。IndexFlatL2 は L2 距離に基づくインデックスです。
    StorageContext はストレージコンテキストを管理し、from_defaults メソッドはデフォルト設定を使用してコンテキストを作成します。
    VectorStoreIndex はノード、ストレージコンテキスト、および埋め込みモデルを使用してインデックスを構築します。

Q&A エンジンの構築#

# 検索器の構築
from llama_index.core.retrievers import VectorIndexRetriever
# カスタムパラメータを設定したい場合は、パラメータ辞書を構築できます
kwargs = {'similarity_top_k': 5, 'index': index, 'dimensions': len(emb)} # 必要なパラメータ
retriever = VectorIndexRetriever(**kwargs)

# 合成器の構築
from llama_index.core.response_synthesizers  import get_response_synthesizer
response_synthesizer = get_response_synthesizer(llm=llm, streaming=True)

# Q&Aエンジンの構築
from llama_index.core.query_engine import RetrieverQueryEngine
engine = RetrieverQueryEngine(
      retriever=retriever,
      response_synthesizer=response_synthesizer,
        )

コードの詳細:このコードスニペットの主な機能は、ベクトル検索器と応答合成器を利用して対話応答を処理・生成する Q&A システムを構築することです。

  1. モジュールのインポート:
  • llama_index ライブラリから VectorIndexRetriever クラスをインポートし、ベクトルインデックス検索器を作成します。
  • パラメータ辞書を構築:
    kwargs = {'similarity_top_k': 5, 'index': index, 'dimensions': len (emb)}:検索器のパラメータを格納する辞書 kwargs を作成します。
    similarity_top_k: 5 に設定し、検索時に最も類似した 5 つの結果を返すことを示します。
    index: 以前に構築した index オブジェクトを使用します。
    dimensions: len (emb) に設定し、埋め込みベクトルの次元を示します。
    検索器の作成:
    retriever = VectorIndexRetriever (**kwargs):パラメータ辞書 kwargs を使用して VectorIndexRetriever オブジェクト retriever を作成し、ベクトル検索を実行します。
  1. llama_index ライブラリから get_response_synthesizer 関数をインポートし、応答合成器を取得します。
    合成器の作成:get_response_synthesizer 関数を呼び出し、llm(言語モデル)と streaming=True のパラメータを渡して、対話応答を生成するための応答合成器 response_synthesizer を作成します。
  2. モジュールのインポート:llama_index ライブラリから RetrieverQueryEngine クラスをインポートし、Q&A エンジンを作成します。
    Q&A エンジンの作成:
    以前に作成した retriever と response_synthesizer オブジェクトを使用して RetrieverQueryEngine オブジェクト engine を作成し、Q&A クエリを処理します。

テスト結果#

# 質問
question = "エージェントAIシステムの応用は何ですか?"
response = engine.query(question)
for text in response.response_gen:
    print(text, end="")
読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。