ホームページ > バックエンド開発 > Python チュートリアル > RAG でクエリ応答をマスターする: 大規模な会議データの主要な課題を克服する

RAG でクエリ応答をマスターする: 大規模な会議データの主要な課題を克服する

DDD
リリース: 2024-11-27 03:25:11
オリジナル
176 人が閲覧しました

情報過多のデジタル時代では、大規模なデータセットから実用的な洞察を抽出することがこれまで以上に重要になっています。最近、私は検索拡張生成 (RAG) を活用して、会議メモの膨大なコレクションから正確な回答を提供するという大きな課題に対処する旅に乗り出しました。このブログでは、私の RAG ベースのクエリ応答システムを、非構造化会議データから洞察を抽出するための堅牢なツールに変えた障害、解決策、成果について探ります。

問題ステートメント: RAG によるクエリ応答の課題
主な課題の 1 つは、会議メモの大規模なリポジトリ内で、複雑な意図固有のクエリを処理できるシステムを構築することでした。従来の RAG クエリ応答モデルは、無関係または不完全な情報を返すことが多く、ユーザーの意図を捉えることができませんでした。会議データの構造化されていない性質と多様なクエリ タイプの組み合わせにより、より洗練されたソリューションが必要になりました。

最初のアプローチ: 効果的なクエリ応答のための基盤の構築
私は、取得と応答生成を組み合わせるように設計された基本的な RAG モデルから始めました。最初に使用された 2 つのテクニックは次のとおりです:

  1. チャンク: 大きなドキュメントを文の境界で小さなセグメントに分割すると、検索範囲が狭まり、検索が向上しました。

  2. 埋め込みとベクトル ストレージ: チャンク化後、各セグメントはベクトル データベースに埋め込まれて保存され、効率的な検索が可能になりました。

ただし、この設定には制限がありました。最初のチャンク化アプローチでは、多くの場合、無関係な情報が取得され、生成された回答には精度や各クエリの意図との整合性が欠けていました。

大規模な RAG クエリ応答における課題

  • 複雑なクエリの処理: 特定の複雑な質問には、基本的な意味検索を超えたより深い意味理解が必要です。
  • コンテキストの不一致: 取得されたチャンクは多くの場合、コンテキスト的に類似していますが、クエリの要件を満たすほど正確ではありません。
  • 検索精度の制限: 少数のドキュメント セット (例: 5 ~ 10) を取得すると、関連性のない限られた結果が得られることがよくあります。

これらの課題は、RAG クエリ応答の精度を向上させるためのより高度なアプローチの必要性を浮き彫りにしました。

クエリ精度を向上させるための高度な RAG テクニック (ソリューション)
これらの問題に対処するために、私はいくつかの高度な方法論を適用し、システムを繰り返し改良しました。
セマンティックチャンキング
従来のチャンクとは異なり、セマンティック チャンクでは各セグメント内の意味に優先順位が付けられ、取得した情報をクエリの意図と一致させることで関連性が高まります。

Mastering Query Answering with RAG: Overcoming Key Challenges in Large-Scale Meeting Data

from langchain_experimental.text_splitter import SemanticChunker
from langchain_openai.embeddings import OpenAIEmbeddings
from langchain.schema import Document

# Initialize OpenAI Embeddings with API key
openai_api_key = ""
embedder = OpenAIEmbeddings(openai_api_key=openai_api_key)
text_splitter = SemanticChunker(embedder)

def prepare_docs_for_indexing(videos):
    all_docs = []

    for video in videos:
        video_id = video.get('video_id')
        title = video.get('video_name')
        transcript_info = video.get('details', {}).get('transcript_info', {})
        summary = video.get('details', {}).get('summary')
        created_at = transcript_info.get('created_at')  # Getting the created_at timestamp

        # Get the full transcription text
        transcription_text = transcript_info.get('transcription_text', '')

        # Create documents using semantic chunking
        docs = text_splitter.create_documents([transcription_text])

        for doc in docs:
            # Add metadata to each document
            doc.metadata = {
                "created_at": created_at,
                "title": title,
                "video_id": video_id,
                "summary": summary
            }
            all_docs.append(doc)

    return all_docs


docs = prepare_docs_for_indexing(videos)

# Output the created documents
for doc in docs:
    print("____________")
    print(doc.page_content)
ログイン後にコピー

最大証拠金の取得
この方法では、関連するデータと無関係なデータを区別し、最も一致するデータ チャンクのみが確実に取得されるようにすることで、取得の精度が向上しました。

ラムダスコアリング
Lambda スコアリングを使用すると、関連性に基づいて結果をランク付けし、クエリの意図とより密接に一致する応答を優先して、回答の品質を向上させることができました。

from langchain_community.vectorstores import OpenSearchVectorSearch
from langchain_openai import OpenAIEmbeddings

embeddings = OpenAIEmbeddings()

docsearch = OpenSearchVectorSearch.from_documents(
    docs, embeddings, opensearch_url="http://localhost:9200"
)

query = "your query"
docs = docsearch.max_marginal_relevance_search(query, k=2, fetch_k=10, lambda_param=0.25)
ログイン後にコピー

マルチクエリと RAG Fusion
複雑な質問の場合、システムは複数のサブクエリを生成します。 RAG Fusion は、多様な回答を 1 つのまとまりのある回答に統合し、回答の品質を向上させ、エラーを削減します。

def generate_multi_queries(question: str):
    # Template to generate multiple queries
    template = """You are an AI language model assistant. Your task is to generate five 
    different versions of the given user question to retrieve relevant documents from a vector 
    database. By generating multiple perspectives on the user question, your goal is to help
    the user overcome some of the limitations of the distance-based similarity search. 
    Provide these alternative questions separated by newlines. Original question: {question}"""

    # Creating a prompt template for query generation
    prompt_perspectives = ChatPromptTemplate.from_template(template)

    # Generate the queries using ChatOpenAI and output parser
    generate_queries = (
        prompt_perspectives 
        | ChatOpenAI(temperature=0, openai_api_key=openai_api_key) 
        | StrOutputParser() 
        | (lambda x: x.split("\n"))
    )

    # Invoke the chain to generate queries
    multi_queries = generate_queries.invoke({"question": question})

    return multi_queries
ログイン後にコピー
def reciprocal_rank_fusion(results: list[list], k=60):
    """Applies Reciprocal Rank Fusion (RRF) to fuse ranked document lists."""
    fused_scores = {}
    for docs in results:
        for rank, doc in enumerate(docs):
            doc_str = dumps(doc)  # Convert to a serializable format
            if doc_str not in fused_scores:
                fused_scores[doc_str] = 0
            fused_scores[doc_str] += 1 / (rank + k)  # RRF formula

    # Sort documents by the fused score
    reranked_results = [
        (loads(doc), score)
        for doc, score in sorted(fused_scores.items(), key=lambda x: x[1], reverse=True)
    ]
    return reranked_result
ログイン後にコピー

Mastering Query Answering with RAG: Overcoming Key Challenges in Large-Scale Meeting Data

強化されたインデックス作成と最適化されたベクトル検索
インデックス作成メカニズムを改善し、ベクター検索パラメーターを改良することで、特に大規模なデータセットの検索がより高速かつ正確になりました。

結果: RAG クエリ応答における主な成果
これらの手法を実装すると、大幅な改善がもたらされました。

  • 取得精度の向上: セマンティック チャンキングや最大マージン取得などの技術により、データ取得が洗練され、最も関連性の高いチャンクのみが返されるようになりました。
  • 関連性の強化: Lambda スコアリングにより、関連する結果に効果的に優先順位が付けられ、応答がクエリの意図と厳密に一致します。
  • 複雑なクエリの処理の改善: マルチクエリ生成と RAG Fusion により、システムは複雑な質問を管理し、包括的な回答を提供できるようになりました。
  • システムの堅牢性の向上: これらの改良により、システムは基本モデルから、大規模な非構造化会議データに対する洗練された信頼性の高いクエリ応答ツールに昇格しました。

重要なポイントと学んだ教訓
この旅を通じて、私はいくつかの核となる洞察を特定しました。

  1. 適応性が鍵: 最初の試みで効果的な解決策が現れることはほとんどありません。反復的な改善と柔軟性が不可欠です。
  2. 階層化手法により堅牢性が向上: 複数のアプローチ (セマンティック チャンキング、最大マージン取得、ラムダ スコアリング) を統合することで、より強力で効果的なシステムが作成されました。
  3. 徹底的なクエリ処理: マルチクエリ生成と RAG Fusion は、複数の観点から質問に対処することの重要性を強調しました。
  4. セマンティクスに焦点を当てる: 構造のみではなくデータ内の意味を強調することで、検索精度が大幅に向上しました。

結論: RAG ベースのシステムの将来の展望
高度な技術で RAG モデルを強化することで、単純な検索システムが、複雑で微妙なクエリに答えるための強力なツールに変わりました。将来的には、リアルタイム学習機能を組み込み、システムが新しいデータに動的に適応できるようにすることを目指しています。この経験により、私の技術スキルが深まり、データ検索システムにおける柔軟性、セマンティックな焦点、反復的な改善の重要性が強調されました。

最終考察: 高度な RAG システムの実装ガイド
RAG の課題を克服した私の経験を共有することで、同様のソリューションを実装するためのガイドを提供できればと考えています。戦略的手法と反復的な改善を組み合わせることで、当面の問題を解決できるだけでなく、クエリ応答システムの将来の進歩のための強力な基盤も築きました。

以上がRAG でクエリ応答をマスターする: 大規模な会議データの主要な課題を克服するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート