【RAG Fusion】LLMのハルシネーションを防ぐRAGの進化版!その効果を徹底検証

押さえておきたいポイント
  • RAG Fusionは、1つの質問を複数のクエリに言い換えて検索し、結果を「RRF」でリランク統合してから回答するRAGの進化版
  • あいまいな質問や表記ゆれに強く、より正確で網羅的な回答が得られる
  • PythonでもDifyなどのノーコードでも実装可能

ITエンジニアのみなさん!生成AIに学習範囲外の知識を与える「RAG Fusion」はご存知ですか?

RAG Fusionは、AIチャットボットに用いられるRAGの進化形。結果を「リランク」でまとめ直すことで、従来型RAGよりも深く知識を反映できます。

このように、質問の意図をよく理解するAIチャットボットが作れちゃうんです!当記事では、そんなRAG Fusionの仕組みや従来RAGからの改善点はもちろん、心臓部である「Reciprocal Rank Fusion(RRF)」の中身まで掘り下げて解説。加えて記事の後半では、Pythonでの実演とDifyを使ったノーコード実装の両方をご紹介します。

完読いただくと、かしこいAIチャットボットが作れちゃう……かもです!ぜひ最後までお読みくださいね。

\生成AIを活用して業務プロセスを自動化/

tamura

監修者田村 洋樹

株式会社WEEL代表取締役 / 累計25社以上のAIアドバイザリーを担当 / 企業向けセミナー・大学講義でのべ10,000人超に登壇 / 日本HP・インテルなど、大手企業主催カンファレンスへの登壇実績多数。AI導入支援・生成AIを活用した業務改革のプロとして、アドバイザリー・PM・講演者など多面的な立場から企業を支援中。

RAG Fusionとは

「RAG Fusion」はLLM(大規模言語モデル)のハルシネーションを防ぐ方法の一種。学習範囲外の事実をプロンプトに挿入するRAG(Retrieval Augmented Generation)の進化版にあたります。

そもそもRAGのしくみは、

  1. ユーザーが質問を入力
  2. 質問に関連する事実をベクトルデータベースから検索
  3. 検索結果をプロンプト経由でLLMに提示(Few-shot Learning)
  4. LLMが事実を踏まえた回答を生成

というものでした。対してその進化版・RAG Fusionでは……

RAG Fusion概念
参考:https://blog.langchain.dev/query-transformations/
  1. ユーザーがオリジナルの質問を入力
  2. LLMが質問に関連する新たな質問を複数生成
  3. オリジナルの質問・新たな質問それぞれで、ベクトルデータベースから事実を検索
  4. 複数の質問で得られた検索結果をまとめて順位付け(リランキング)
  5. 上位の検索結果をプロンプト経由でLLMに提示(Few-shot Learning)
  6. LLMが事実を踏まえた回答を生成

以上のとおり、「LLMによる追加質問の生成」と「リランキング」の手順が加わっています。(※1、2)

手順4「複数の検索結果をまとめて順位付け」は、一般にリランキング(再順位付け)と呼ばれるRAG Fusionの中心。その中身が、実践編で使うreciprocal_rank_fusion関数、すなわちReciprocal Rank Fusion(RRF)です。

RRFは下記のスコア計算に集約されます。

fused_scores[doc_str] += 1 / (rank + k)

やっていることは、文書が各検索で「何位だったか(rank)」だけを見てスコアを付け直すというもの。上位ほど高いスコアが入り、複数の質問分を足し合わせて並べ替えます。

ポイントは、検索スコアをそのまま合算しないことです。ベクトル検索とキーワード検索では尺度がバラバラで、単純に足すとスコアの大きい手法に引きずられてしまいます。そこでRRFは絶対値を捨てて「順位」だけで採点し直す、いわば審査員の順位を合議制でまとめる方式です。

なお、RAG-Fusionは2024年公開の論文で体系化された手法になります。RRFでリランキングしてから回答生成に回すことで、正確性・関連性・網羅性が改善すると報告されています。(※6)

ただし、生成クエリが元の質問からズレると回答も脇道に逸れる場合がある、という注意点もあわせて押さえておきましょう。

RAGの基本「Embedding」について詳しく知りたい方は、下記の記事をあわせてお読みください。

従来型RAG比でのRAG Fusionの長所

ユーザーの質問のみで検索を行っていた従来型RAGと異なり、RAG Fusionは「ユーザーの質問+LLMによる追加質問」でベクトルデータベースを検索します。そんなRAG Fusionには……

専門分野でも、深い回答が得られる:質問の不足箇所を追加質問で補うため
質問ミスがフォローできる:質問中のあいまいな表現やタイプミスを追加質問で補うため

といった長所があります。つまりは従来比で、より正確かつ包括的な回答が得られるということです。

RAG Fusionの短所

RAGの進化形・RAG Fusionも完璧ではありません。一度、「LLMに追加質問を生成させる工程」がはさまるため……

  • 従来型RAG比で、トークン数の消費が増える
  • 従来型RAG比で、回答速度が落ちる
  • 意図から外れた回答や冗長な回答が返ってくることもある

という短所があるんです。

さて次項からは実際にPythonを使って、このRAG Fusionの効果を検証していきます。AIチャットボットの自社開発を目指すエンジニアのみなさんはぜひ、続きをご覧ください!

トークン数を節約するテクニックについて詳しく知りたい方は、下記の記事をあわせてお読みください。

PythonでのRAG Fusion実践編

ここからは、Google Colaboratory(Google Colab)とPythonを駆使して、RAG Fusionの効果を検証していきます。途中経過のスクリーンショットや使用したソースコードも掲載しておりますので、エンジニアのみなさんは必見です!

RAG Fusionに使用した環境・準備物

RAG Fusionの実践にあたって、今回使用した環境・準備物は以下の4点です。

  • Python 3(Python 3.12.13以上)
  • OpenAI Pythonライブラリ(openai)
  • ChatGPTの有料アカウント
  • Pineconeのアカウント(無料版も可)

あわせてPythonコードを実行するための場として、

  • Google Colaboratory(Google Colab)
  • Visual Studio Code
  • Jupyter Notebook

以上のいずれかがあると、RAG Fusionが簡単に試せます。こちらについてはGoogle Colabを使用しました。

Pythonライブラリの用意

RAG Fusionを構築するにあたっては、LLMとベクトルデータベース、そして両者をつなぐフレームワークが必須。今回は……

  • LLM:GPT-3.5
  • ベクトルデータベース:Pinecone
  • 連結用のフレームワーク:Langchain

を、以下のソースコードを使って用意しました。

!pip install -U langchain langchain-community langchain-openai langchain-text-splitters langchain-pinecone

こちらのコードをGoogle Colabで実行すると……

ライブラリインストール画面

以上のとおり、必要なPythonライブラリがインストールされます。

APIとモジュールの下準備

続けてChatGPT APIとPineconeのそれぞれで、APIキーを発行して実行環境に反映します。

まず、PineconeのAPIキーについては、Pinecone Consoleから発行できます。同時に、後で使用するインデックスについても……

Pinecone設定完了画面
  • インデックス名:rag-fusion
  • 次元数:1536

という条件で作成しておきましょう。作成は下記の設定にすればOKです。

Pinecone設定画面1
Pinecone設定画面2

次にChatGPT APIに関しては、こちらのAPIキー作成画面から発行が可能。それぞれ発行後は、以下のコードにペーストしてください。(※3)

#APIキー入力

import os

os.environ["OPENAI_API_KEY"] = "ChatGPT APIのAPIキー"

os.environ["PINECONE_API_KEY"] = "PineconeconeのAPIキー"

あわせてRAG Fusionに使用するモジュールも、以下のコードを使ってインポートします。

#モジュールインポート
from langchain_community.document_loaders import TextLoader
from langchain_openai import OpenAIEmbeddings
from langchain_openai import OpenAI
from langchain_text_splitters import CharacterTextSplitter
from langchain_pinecone import PineconeVectorStore

以上2つのコードをそれぞれGoogle Colabで実行すると……

APIキーとモジュール設定画面

というふうに、APIとモジュールの準備が完了します。

記事の分割とエンベディング

ここからは、RAG Fusionの組み立て作業に移ります。

まずはRAG Fusionで示したい知識を用意する工程から、なのですが……

今回は当メディアの生成AIずかん全記事をスクレイピングして、テキストファイル「WEEL_Zenkiji.txt」にまとめました。まとめたテキストファイルは……

テキストファイルアップ画面

このように、ディレクトリ「sample_data」に収めています。

続けて生成AIずかん全記事を……

  1. チャンクに分ける(長文を細切れにする)
  2. Embeddingする(ベクトルに変換する)
  3. Pineconeのインデックスに格納する(先ほどのrag-fusionを使用)

という手順で加工して、ベクトルデータベースを作成します。うち、チャンク分けとEmbeddingについては……

%cd sample_data
# テキストをチャンクに分けて埋め込む
from langchain_text_splitters import RecursiveCharacterTextSplitter

loader = TextLoader("WEEL_Zenkiji.txt", encoding="utf-8")
documents = loader.load()

text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=1000,      # 日本語なら1チャンク約1000文字(≒40KB未満に収まる)
    chunk_overlap=100,    # 文脈が途切れないよう前後を少し重ねる
)
docs = text_splitter.split_documents(documents)

embeddings = OpenAIEmbeddings(disallowed_special=())

こちらのコードで可能。(※4、5)実行すると……

チャンクわけ画面

このように記事全文が加工されます。

続けて、加工した記事全文を……

index_name = "rag-fusion"

vectorstore = PineconeVectorStore.from_documents(docs, embeddings, index_name=index_name)

以上のコードで、先ほどのPineconeインデックス「rag-fusion」へ格納します。実行すると……

Pineconeへの格納

このように、生成AIずかん全記事を格納したベクトルデータベースが完成しました。

Chainの作成

最後に……

  • GPT-3.5で追加質問を生成する工程
  • 得られた複数の検索結果に順位をつける工程
  • 上位の検索結果をもとにGPT-3.5に回答させる工程

をコーディングして、RAG Fusionを完成させます。今回は各工程を一連で実行できるLangchainの機能「Chain」を活用して、下記のコードを用意しました。(※4、5)

クリックで表示
# 複数クエリの生成
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import (
    ChatPromptTemplate,
    HumanMessagePromptTemplate,
    AIMessagePromptTemplate,
)
from langchain_core.load import dumps, loads
from langchain_openai import ChatOpenAI

# hub.pull を使わず、クエリ生成プロンプトを直接定義(キー不要・安定)
query_gen_prompt = ChatPromptTemplate.from_template(
    """You are a helpful assistant that generates multiple search queries based on a single input query.
Generate 4 search queries related to: {original_query}
Output (4 queries):"""
)

generate_queries = (
    query_gen_prompt
    | ChatOpenAI(temperature=0)
    | StrOutputParser()
    | (lambda x: [q for q in x.split("\n") if q.strip()])  # 空行を除去
)

# 関連度の高い順に「上位N件だけ」返す(RRF)
def reciprocal_rank_fusion(results: list[list], k=60, top_n=4):
    fused_scores = {}
    for docs in results:
        for rank, doc in enumerate(docs):
            doc_str = dumps(doc)
            fused_scores[doc_str] = fused_scores.get(doc_str, 0) + 1 / (rank + k)
    reranked = [
        (loads(doc), score)
        for doc, score in sorted(fused_scores.items(), key=lambda x: x[1], reverse=True)
    ]
    return reranked[:top_n]          # ← 上位だけに絞る

# 上位文書の本文だけを連結して context にする
def format_docs(reranked):
    return "\n\n".join(doc.page_content for doc, _ in reranked)

retrieve_chain = (
    {"original_query": lambda x: x}
    | generate_queries
    | retriever.map()
    | reciprocal_rank_fusion
    | format_docs                    # ← (doc, score)の羅列ではなく本文テキストに整形
)

# 10個の関連文書を取ってくる
retriever = vectorstore.as_retriever(search_kwargs={"k": 10})

# 回答生成用プロンプト
template = """You are an expert of world knowledge. I am going to ask you a question. Your response should be comprehensive and not contradicted with the following context if they are relevant. Otherwise, ignore them if they are not relevant.
{context}
Question: {question}
"""
prompt2 = ChatPromptTemplate.from_messages(
    [
        HumanMessagePromptTemplate.from_template(template),
        AIMessagePromptTemplate.from_template(""),
    ]
)

retrieve_chain = (
    {"original_query": lambda x: x}
    | generate_queries
    | retriever.map()
    | reciprocal_rank_fusion
)

chain = (
    {"context": retrieve_chain, "question": lambda x: x}
    | prompt2
    | ChatOpenAI(temperature=0)
    | StrOutputParser()
)

こちらをGoogle Colabで実行すると……

RAG Fusionの流れ

以上のとおり、RAG Fusionの流れが完成しました。ではさっそく、次項からRAG Fusionの効果を試していきましょう!

RAG Fusionの効果検証

LangChainで構築したRAG Fusionを使ってGPTに質問する際は……

for s in chain.stream("任意の質問"):

    print(s, end="", flush=True)

以上のコードを実行するだけでOK。まずは下記の質問について、RAG Fusion経由でGPTから回答を得てみましょう!

オンプレミスで使えるおすすめの小型LLMについて、具体的なモデル名を教えて
出力結果

するとこのように、学習範囲外の具体的なツール名が回答に反映されています。従来型RAGの回答と比較してみると……

RAG Fusionでの回答

LLM(Large Language Model)は、与えられた文脈に基づいて次に来る単語を予測するためのモデルです。特に小型のLLMモデルは、オンプレミス環境での利用に適しています。具体的なおすすめの小型LLMモデルとしては、Hugging FaceのDistilBERTやGoogleのMobileBERTなどが挙げられます。これらのモデルは、比較的軽量でありながら高い性能を持ち、オンプレミス環境での導入や運用が容易です。また、これらのモデルは、自然言語処理タスクにおいて幅広く活用されており、多くの研究や実務で利用されています。そのため、オンプレミス環境での小型LLMモデルとしては、DistilBERTやMobileBERTなどがおすすめです。

従来型RAGでの回答

申し訳ありませんが、具体的なモデル名については情報が得られませんでした。お探しの情報を提供できず申し訳ありません。

以上のとおり、違いは一目瞭然。RAG Fusionは元記事に一句もない表現「オンプレミス」を理解して、具体的なツール名を引用してくれているんです!

ちなみに以下の質問についても、RAG Fusionと従来型RAGでGPT-3.5の回答を比較してみると……

GPT-4を無料で使えるツールって知ってる?日本語で教えて。

RAG Fusionでの回答

GPT-4を無料で使用できるツールとしては、Duolingo Maxが挙げられます。Duolingo Maxは、大規模言語モデルであるGPT-4を搭載した無料語学アプリであり、ユーザーの理解度を高める機能や会話スキルを向上させる機能が追加されています。このアプリは、生成AIを活用してユーザーの語学学習を効果的に支援しています。初期リリース時は一部地域で提供されていましたが、現在は対応地域や言語が拡大しており、無料で利用することができます。Duolingo Maxを通じて、GPT-4を無料で活用して日本語学習を行うことが可能です。

もう一つの無料ツールであるGPT4FREEは、GPT-4などの言語モデルにアクセスを提供するプロジェクトです。テキスト生成、チャットボット作成、言語生成、翻訳、コード支援など、多様な用途で利用可能であり、Pythonパッケージを介してインストールすることができます。ただし、GPT4FREEはアクセス制御と利用規約を回避することにより、倫理的及び法的問題が議論されている点に留意する必要があります。

これらのツールを利用することで、GPT-4を無料で活用することが可能です。ただし、利用する際には各ツールの利用規約や倫理的な観点に留意することが重要です。

従来型RAGでの回答

はい、GPT-4を無料で使えるツールにはGPT4FREEやGPT Engineerなどがあります。これらはオープンソースのプロジェクトで、テキスト生成やチャットボット作成など多様な用途で利用可能です。ただし、正規のGPT-4を利用するよりも安全性が低いため、利用には注意が必要です。

このようにRAG Fusionのほうで、より具体的な回答が返ってきています。

従来型RAGのPythonコードについて詳しく知りたい方は、下記の記事をあわせてお読みください。

Difyでノーコード実装する方法

続いてノーコードツールのDifyで実装していきます。Difyで作っていくには、ナレッジ作成とアプリ作成の二段階になります。

まずは通常のRAGを作成し、その後にそれをベースにRAG Fusionを作っていきます。

最初に「ナレッジ」からナレッジベースを作成し、テキストファイルを取り込みます。ここで設定するのは、Python編のRecursiveCharacterTextSplitterに相当するチャンク分割です。

Dify設定画面1
Dify設定画面2

ここまでできたら、保存して処理を実行します。その後チャットボットアプリを作っていきます。

スタジオでチャットアプリを作り、次のようにノードをつなぎます。

  1. スタート(ユーザー入力)
  2. 知識検索ノード(クエリに sys.query、ナレッジに先ほどのベースを指定)
  3. LLMノード(コンテキストに知識検索のresultを渡し、プロンプトにコンテキスト変数を明記)
  4. 回答
Difyノード作成

ここで一つハマりやすいのが、LLMノードのコンテキスト欄に結果をセットしただけでは、中身がLLMに渡らないという点です。プロンプト本文に {{#context#}} のようなコンテキスト変数を書いて、はじめて反映されます。

実際に動かしている様子が下記です。

これで通常のRAGが実装できました。ここからRAG Fusionに変更していきます。先ほど作った通常RAGのフローに、ノードを足していきます。変更点は次の通りです。

通常RAGRAG Fusion
知識検索×1知識検索 ×複数(並列)
クエリ生成LLMノードを追加
クエリ整形・RRF統合のCodeノードを追加
RAG Fusion構成

最終的なノード構成はこうなります。

  1. スタート(ユーザー入力)
  2. クエリ生成LLM(質問を3つの言い換えクエリにする)
  3. Codeノード
  4. 知識検索 ×4
  5. Codeノード
  6. LLMノード
  7. 回答
RAG Fusionノード構成

Codeノード(クエリ整形)はPythonのコードが必要になるので、下記を記載します。

クリックで表示
import json

def main(raw, fallback) -> dict:

    text = (raw or "").strip()

    try:

        s, e = text.find("["), text.rfind("]")

        arr = json.loads(text[s:e + 1]) if s != -1 else []

    except Exception:

        arr = []

    arr = [str(x).strip() for x in arr if str(x).strip()]

    fb = (fallback or "").strip()

    while len(arr) < 3:

        arr.append(fb)  # 生成に失敗しても元の質問で検索できるようフォールバック

    return {"q1": arr[0], "q2": arr[1], "q3": arr[2]}

またもう一つのCodeノード(RRF統合)では下記のように記載をします。

クリックで表示
def main(list0, list1, list2, list3) -> dict:

    k = 60

    lists = [list0 or [], list1 or [], list2 or [], list3 or []]

    scores, store = {}, {}

    for lst in lists:

        for rank, item in enumerate(lst):

            content = item.get("content", "") if isinstance(item, dict) else str(item)

            key = content[:120]

            if not key:

                continue

            scores[key] = scores.get(key, 0.0) + 1.0 / (k + rank + 1)

            store.setdefault(key, content)

    ranked = sorted(scores.items(), key=lambda kv: kv[1], reverse=True)

    context = "\n\n---\n\n".join(store[key] for key, _ in ranked[:6])  # 上位6件

    return {"context": context}

複数の検索で上位に来た文書ほどスコアが高くなり、自然と「みんなが拾った重要な文書」が上位に集まる、という仕組みです。

これで、通常RAGをベースにRAG Fusionへ拡張できました。

Pythonでゼロから書くとクエリ生成・並列検索・RRF・LLM呼び出しを全部自前で実装する必要がありますが、Difyなら大部分はノードを並べるだけ、統合ロジックだけCodeノードに数行、という手軽さで組めます。

実際に動いている様子は下記です。

RAGの種類

RAG(Retrieval-Augmented Generation)は、テキスト生成プロセスに外部情報の検索・取得を組み込む先進的な手法です。注目すべきは、従来の生成モデルとは異なり、RAGはリアルタイムで外部情報源にアクセスし、その情報を元に出力を生成できる点でしょう。これにより、より正確で状況に適した回答が可能となりました。

では、RAGは実際どのような種類があるのでしょうか。ここでは、LangChainで実装されている「Self-RAG」「Adaptive RAG」「CRAG」の3点を紹介します。

Self-RAG(Self-Retrieval-Augmented Generation)

スクロールできます
特長内容
自動検索機能モデルが自律的に必要な情報を検索し、生成プロセスに活用
リアルタイム情報更新最新のデータや状況に応じた情報を動的に取得し、生成に反映
高度な検索能力モデルが自ら適切な検索クエリを生成し、関連情報を効果的に抽出
Self-RAGの主な特長一覧

Self-RAGの利点は、まずユーザー入力の簡素化が挙げられます。事前に情報を提供する必要がなく、モデルが自動的に必要な情報を収集するため、ユーザーの手間が大幅に軽減できるでしょう。

そして、柔軟な対応も可能になります。常に最新の情報を参照するため、刻々と変化する状況にも適応できるのが特徴です。さらに、知識の拡張も重要な利点です。外部ソースから情報を取得することで、モデルの知識ベースにない情報も活用できるようになります。

Self-RAGの応用分野は幅広く、インテリジェントなカスタマーサポートシステム、動的なドキュメント生成、リアルタイムのニュース分析や解説など、様々な分野で活用されています。

 Adaptive RAG(Adaptive Retrieval-Augmented Generation)

Adaptive RAGは、RAGのひとつの進化形です。検索と生成プロセスを動的に調整する先進的な技術といえるでしょう。

スクロールできます
特長内容
動的な検索クエリ生成ユーザー入力とコンテクストに基づき検索クエリを適応的に生成し、関連性の高い情報を効率的に取得
柔軟な生成プロセス検索結果に応じて生成方法を調整。結果が豊富なら詳細に、少なければ既存知識に基づいて生成
学習と最適化能力経験を通じて最適な戦略を学習し、時間とともにパフォーマンスが向上
コンテクスト適応ユーザーの意図や過去の対話を考慮し、検索・生成戦略を継続的に調整
Adaptive RAGの主な特長一覧

Adaptive RAGの活躍の場として、カスタマーサポートが挙げられます。的確な回答を動的に生成し、ユーザーの好みに合わせたパーソナライズドコンテンツを提供が可能です。

また、ニュースやドキュメントの更新において最新情報を反映できる点も注目です。この技術は、複雑なユーザーニーズに対応し、より関連性の高い出力を実現します。ビジネスシーンで活躍できる場がまだまだありそうです。

種類に応じて、とてもニーズの多い技術ですので、今後の発展に注視したいですね。これにより、AIによる情報処理の質が大幅に向上し、様々な分野での活用が期待されています。

 CRAG(Corrective-Retrieval-Augmented Generation)

CRAGは、RAGの一種で、生成された出力の正確性と信頼性を向上させるための訂正・修正プロセスを組み込んだ技術です。

スクロールできます
特長内容
訂正メカニズムの統合生成テキストを外部データベースと照合し、誤りを検出して適切な情報で修正
フィードバックループ初期生成結果が不正確な場合は再検索と修正を実施し、最終出力の正確性を向
エラーチェックと修正一貫性や正確性を評価するアルゴリズムを搭載し、モデルが自律的に誤りを修正
信頼性の向上正確で信頼できる情報提供を主目的とし、医療・法律・技術文書など重要分野での応用に期待
CRAGの主な特長一覧

CRAGは、正確性を求められる医療分野での活躍が期待されています。医療分野での診断や治療情報の正確性を確保し、法律分野では法的文書の正確性を確認・訂正します。

また、教育分野では学習教材やテストの信頼性を向上させられる点において適性があるでしょう。この技術のメリットとしては、訂正プロセスによる情報の質向上、高い信頼性、誤情報リスクの軽減、自動訂正による効率的な正確情報の提供などが挙げられます。

正確性は、生成AIにとって重要な課題ですので、CRAGも今後のAIの発展を担う技術なのではないでしょうか。

GraphRAG

先の3種類に加えて、近年注目を集めているのがGraphRAGです。Microsoft Researchが提案した手法で、テキストから知識グラフを抽出し、コミュニティ要約や関係性を使って検索・要約する構造化RAGにあたります。

通常のベクトル検索型RAGが苦手とする、「文書のあちこちに散らばった情報をつないで考える」「巨大な文書や大規模コーパスを全体像として理解する」といった場面で効果を狙った設計です。Global Search / Local Search / DRIFT Searchという検索モードを使い分けられる点も特徴。

GraphRAGについては下記で詳しく解説

Agentic RAG

もう一つの潮流がAgentic RAG。検索するかどうか、どう検索するか、取ってきた文書が妥当か、質問を書き換えるべきか、といった判断を、AIエージェント自身が行うRAGです。

従来のRAGが「まず検索してから答える」固定フローだったのに対し、Agentic RAGは「必要に応じて考えながら取りに行く」のが特徴。

検索要否の判断、文書の関連性採点、質問の書き換え、再検索、最終回答生成までを一連の流れとして組み立てます。

ここまでを整理すると、RAG Fusionは検索の「広げ方」GraphRAGは関係性の「つなぎ方」Agentic RAGは検索の「意思決定」を、それぞれ強化する手法と並べると分かりやすいのではないでしょうか。

RAG Fusionのよくある質問

ここではRAG Fusionのよくある質問について回答していきます。導入を検討している方は、ぜひ参考にしてみてください。

RAG Fusionでは、いくつくらいのクエリを生成するのが最適ですか?

明確な「正解の数」は決まっていません。原論文や一般的な実装では、元の質問に加えて3〜4件前後の関連クエリを生成する例がよく見られます。多くすれば網羅性は上がりますが、そのぶんトークンと検索回数が増えてコスト・遅延も膨らむため、精度とコストのバランスを見ながら調整するのが現実的でしょう。

スコア計算式の k(コードでは60)は変更してもいいですか?

変更しても問題ありません。kは順位差の効き方をなだらかにする調整値で、慣例的に60が使われることが多い数値です。小さくすると上位文書がより強く優遇され、大きくすると順位差の影響が薄まります。

クエリ生成と回答生成で、別々のLLMを使ってもいいですか?

使えます。クエリ生成は比較的軽い処理のため、生成には安価で高速なモデル、最終回答には高性能なモデル、と役割で使い分ける構成も可能です。この分担はコスト最適化の常套手段で、RAG Fusionのように呼び出し回数が増える構成ほど効果が出やすいといえます。

RAG Fusionは日本語のデータでも使えますか?

使えます。ただし精度は、日本語に対応した埋め込み(Embedding)モデルと生成LLMを選べているかに大きく左右されます。日本語特有の表記ゆれや専門用語の言い換えを吸収できる構成にしておくと、RAG Fusionの「あいまいな質問に強い」という長所を活かしやすくなるでしょう。

RAG Fusionなら深い回答が得られる!

当記事ではRAGの進化版「RAG Fusion」について解説を行いました。RAGと比べたときのRAG Fusionの強みは……

専門分野でも、深い回答が得られる:質問の不足箇所を追加質問で補うため
質問ミスがフォローできる:質問中のあいまいな表現やタイプミスを追加質問で補うため

以上のとおり。実践編でも、引用元にない「オンプレミス」の意味まで踏まえた回答が返ってきていました。チャットボットで高度な知識を扱いたい場合はぜひ、このRAG Fusionをお試しください!

最後に

RAG Fusionを効果的に活用するには、検索精度だけでなく、クエリ設計やデータ整備、運用方法まで含めた設計が重要です。RAG環境の構築から精度改善、業務への定着まで一貫して支援します。

株式会社WEELは、自社・業務特化の効果が出るAIプロダクト開発が強みです!

開発実績として、

・新規事業室での「リサーチ」「分析」「事業計画検討」を70%自動化するAIエージェント
・社内お問い合わせの1次回答を自動化するRAG型のチャットボット
・過去事例や最新情報を加味して、10秒で記事のたたき台を作成できるAIプロダクト
・お客様からのメール対応の工数を80%削減したAIメール
・サーバーやAI PCを活用したオンプレでの生成AI活用
・生徒の感情や学習状況を踏まえ、勉強をアシストするAIアシスタント

などの開発実績がございます。

生成AIを活用したプロダクト開発の支援内容は、以下のページでも詳しくご覧いただけます。
➡株式会社WEELのサービスを詳しく見る。

まずは、「無料相談」にてご相談を承っておりますので、ご興味がある方はぜひご連絡ください。
➡︎生成AIを使った業務効率化、生成AIツールの開発について相談をしてみる。

生成AIを社内で活用していきたい方へ
無料相談

「生成AIを社内で活用したい」「生成AIの事業をやっていきたい」という方に向けて、生成AI社内セミナー・勉強会をさせていただいております。

セミナー内容や料金については、ご相談ください。

また、サービス紹介資料もご用意しておりますので、併せてご確認ください。

タイトルとURLをコピーしました