Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

This article is a Private article. Only a writer and users who know the URL can access it.
Please change open range to public in publish setting if you want to share this article with other users.

生成AI (大規模言語モデル: Large Language Model: LLM) に自社の業務や制度、ルールなどを語らせたり、お客様対応を任せるには、いくつか方式があると思います。

  1. LLM にユーザーメッセージとプロンプトで必要な情報を与えて回答を生成させる方式 (プロンプトエンジニアリングによる解決)
  2. LLM をトレーニングデータと検証データを用いてあらかじめ学習し、回答を生成させる方式 (機械学習: ファインチューニング: FT による解決)
  3. LLMにユーザーメッセージと、それに関連するデータを与えて回答を生成させる方式 (コンテキストエンジニアリングによる解決)

RAG は「ラグ」と呼ばれていますが、Retrieval-Augmented Generation (検索拡張生成) の略です。上記の 3. の方式を実現するものになります。

さて、本資料のタイトル「RAGパイプライン」とはなにか? といいますと、RAGジャーニーと言いますか、RAGがユーザーに回答するまでの工程をご説明する必要があります。

  1. ユーザーの入力を受け付ける (「休暇の取得方法を教えて」)
  2. システムが 1. の入力を、データベースで検索可能な値に変換する (「休暇の取得方法を教えて」という自然言語を数値 (数千次元のベクトル値) に変換する)
  3. システムが 2. の検索クエリ (数千次元のベクトル値) を用いてデータベースに問い合わせを行う
  4. データベースから top-k (検索クエリとの類似性が高い順に n 件) の検索結果を取得する
    1. で得たユーザー入力と 4. で得た検索結果、その他必要に応じたプロンプトなどを LLM (Large Language Model:大規模言語モデル) に入力する
  5. LLM から返却された出力を、ユーザーに RAG の回答として画面に表示する (休暇の取得には勤怠管理システム (接続情報などが続く...) にログインし、メニューの「休暇の申請」を選択して必要事項を入力してください)

RAG はこのような処理を行うシステムです (実際にはもっと複雑な工程、例えば 2. で行なっているベクトル検索以外の検索手法を併用したり、6. で得られたユーザーへの回答を再評価して、回答として不十分と判断した場合の振る舞いを定義するなど行なっています)。

RAG はこのように、ユーザーへの回答に必要なデータを、あらかじめ DB に「検索可能な状態」で格納しておく必要があります。

このデータは、関連性の高い情報をまとめた「かたまり (チャンク)」として用意され、関連性が低い情報とは分割して管理することで、ユーザーの問い合わせに対して関連性が高い情報を使って回答することが可能になります。

これらの流れ (パイプライン) を、Ingestion (データ投入) と、Query (DB検索と回答生成) としてまとめたものが以下になります。

技術者向けの記載にはなりますが、ご参考になれば幸いです。 (RAG には教科書はありません。弊社ではこう考えています、という内容です)

Ingestion パイプライン(投入系)

# ステージ 責務
I1 Load ファイル/テキストの取り込み、ソースメタデータ付与
I2 Preprocess 正規化(文字コード、空白、不要要素の除去)
I3 Chunk セクション見出し付き段落分割(500文字方式がベース)
I4 Embed エンベディングモデルによるベクトル化(複数モデルを切替・比較可能)
I5 Index ベクトルストア(PostgreSQL + pgvector)への登録

Query パイプライン(検索・生成系)

# ステージ 責務
Q1 Query Transform ユーザー入力から検索クエリを作る(素通し / LLMによる書き換えを選択可能)
Q2 Retrieve 多段検索(メタデータ+ベクトル / ベクトルのみ / 全文検索、recall-first)
Q3 Context Build 検索結果のリランク・整形・件数制御・ゼロ件判定
Q4 Generate プロンプト組み立て + 閉域LLMによる生成(「生成で制御」の実体)
Q5 Log 全段トレーシング(クエリ・スコア・採否・応答・所要時間)→ 評価の基盤

I1. Load、I2. Preprocess

RAG に投入するデータを用意する工程です。

データが頻繁に変化し、その鮮度が重要な場合には、元データを直接参照する仕組みを設ける、など、お客様要件に従った機能を検討します。

I3. Chunk

RAG に投入するデータを分割する工程です。

検索する単位として、意味のある単位で分割することと、システムで取り扱い可能な文字数 (トークン) の範囲で分割しなければなりません。

お客様要件に従った自動処理や、区切り文字 (------ とか) を指定してもらって、そこで区切る、といった対応を検討します。

I4. Embed

データとして投入される自然言語を、ベクトル (数値) に変換する工程です。

この変換はプログラムを通じて実施され、これらのプログラムは Embedding model と呼ばれています。

モデル 発音 特徴
bge-m3 ビージーイー・エムスリー 多言語対応の定番。MITライセンス
multilingual-e5-large マルチリンガル・イーファイブ bge-m3の最有力対抗馬。MITライセンス
Ruri ルリ 日本語の「瑠璃」由来
PLaMo-Embedding プラモ Preferred Networks公式が「プラモ」と読んでいる
sarashina-embedding サラシナ 「更級日記」の更級が由来
nomic-embed-text ノミック 英語中心だが多言語版あり
OpenAI text-embedding-3 OpenAI(米国) 高性能だがAPI経由のみなので閉域要件では使えない点に注意
モデル 開発元 補足
bge-m3 BAAI(中国) dense/sparse/multi-vector を1モデルで出せる
multilingual-e5-large Microsoft 多言語対応で日本語性能も高い
Ruri 名古屋大学(日本) 日本製の日本語特化エンベディングモデル。日本語ベンチマーク(JMTEB)で上位。「国産」を求める顧客に最適
PLaMo-Embedding Preferred Networks(日本) こちらも国産。PFNブランドはSIer系顧客に知名度あり
sarashina-embedding SB Intuitions(ソフトバンク系、日本) 日本語特化の国産モデル
nomic-embed-text Nomic AI(米国) 完全オープン

I5. Index

ベクトル (数値) に変換されたデータを、データベースに格納する工程です。

今のところですが、PostgreSQL / pgvector への格納を想定しています。

Q1. Query Transform

ユーザー入力から検索クエリ (検索文字列) をつくる工程です。

この時に、ユーザーメッセージを加工なしで素通しするだけでなく、以下の用語で説明するような加工を行うことで、意図する情報を取得できるように調整していきます。

クエリ処理に関連する用語の整理

用語 発音 内容
query rewriting クエリ・リライティング LLMでクエリを検索向きに書き換える。口語→明確な質問文、会話履歴を踏まえた代名詞の解決など
query expansion クエリ・エクスパンション 同義語や関連語を足して検索の網を広げる。「有給」→「有給休暇 年休 休暇申請」
query decomposition クエリ・ディコンポジション 複合質問を分割。「AとBの違いと申請方法は?」→「Aとは」「Bとは」「申請方法」の3検索に
HyDE ハイド Hypothetical Document Embeddings。後述
query routing クエリ・ルーティング クエリの種類に応じて検索先や処理方式を振り分ける

HyDEだけ少し詳しく、発想が面白い手法です:質問文と回答文書は文体が違うので、ベクトル空間上で意外と遠いことがある。そこでLLMにまず仮の回答を生成させ、その仮回答をエンベディングして検索する。「質問で探す」のではなく「答えっぽい文章で答えを探す」わけです。仮回答の内容が間違っていても、文体と語彙が正解文書に近ければ検索としては機能する、という割り切り。

Q2. Retrieve

ユーザーメッセージとの類似性が高い情報を DB から取得する工程です。

ベクトル検索を行うため、ユーザーメッセージ (チャットにおけるユーザーの入力) をベクトル値に変換します。これには、データ投入時に採用した Embedding model を用いて変換する必要があります。

また、ベクトル検索で期待される検索が実現できない場合には、以下の用語にある手法や、データセットに対するメタデータの付与と検索条件を追加するなどの対応や、全文検索などの異なる検索方式の併用を検討することが考えられます。

検索方式に関連する用語の整理

用語 発音 意味
dense retrieval デンス・リトリーバル ベクトル検索のこと
sparse retrieval スパース・リトリーバル キーワードベースの検索(BM25等)
BM25 ビーエム・にじゅうご 古典的なキーワードスコアリング。今も現役
hybrid search ハイブリッド・サーチ dense + sparse の併用
reranker / cross-encoder リランカー / クロス・エンコーダー 検索結果を精密に並べ替える後段モデル
cosine similarity コサイン類似度 ベクトル間の近さの計算方法。距離スコアの正体
HNSW エイチ・エヌ・エス・ダブリュー pgvector 等のベクトルDBが内部で使う

Q3. Context Build

検索結果のリランク、整形、件数制御、ゼロ件判定などを行う工程です。

Q4. Generate

Generate に関連する用語の整理

用語 発音 意味
context augmentation コンテキスト・オーグメンテーション 取得チャンクをプロンプトに組み込むこと。RAGの「A(Augmented)」の正体
grounding グラウンディング 回答を検索結果に「接地」させること。「グラウンディングされた回答」=根拠に基づく回答
hallucination ハルシネーション LLMが事実にない内容を生成すること。RAG導入の最大動機の一つ
citation / attribution サイテーション / アトリビューション 回答に出典(どのチャンク由来か)を付けること
lost in the middle ロスト・イン・ザ・ミドル 長いコンテキストの中間部分をLLMが見落としやすい現象。チャンクの並べ順が効く理由

この工程では、どの LLM 実行環境を選択するかも重要となる。

reasoning model (推論モデル)

  • DeepSeek
  • gpt-oss

non-reasoning model (非推論モデル)

  • Gemma
  • Llama
  • Qwen

Q5. Log

I1 から I5 の工程と、Q1 から Q4 の工程は、パイプラインとしてそれぞれ 1 つのまとまったログとして記録され、参照可能な状態である必要がある。

このために必要なログの生成を行う工程である。

この資料で取り扱っていないこと

RAG の回答に対する評価については、本資料では取り扱っていません。

評価としてまず最初に行われるのは、いくつか質問してみて、意図した回答が得られか確認するんだと思います。

意図した回答が得られなかった場合は、パイプラインを通じて問題箇所を特定することになりますが、その際に Q5. で記録しているログを確認する、というのが出発点になると思います。

実際の運用では、RAG の回答に対してユーザーが評価できる仕組みが必要になります。

どの程度のユーザーが満足しているか、という値を定量的に取得する仕組みが必要で、その値と目標値を近づけることが当面の課題になります。また、ユーザーの評価が低いケースを確認し、データやプロンプト、パイプラインそのものを追加、変更する「改善フロー」が必要になります。

0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?