「.NET 開発基盤部会 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。
目次 †
概要 †
RAG(Retrieval-Augmented Generation)
- LLMと情報検索を組み合わせた技術。
- 情報取得や質問応答の分野で強力。
開発方法 †
フレームワークやVDBを使用する。
機能・コンポーネント †
チャンク(Chunk) †
- Chunkは、大量のデータを小さなSegment(Chunk)に分割する。
- このプロセスにより、特定の情報を検索し易くなる。
- 各Chunkは、独立して検索可能な単位となる。
埋め込み(Embedding) †
- Embeddingは、テキストデータを数値ベクトルに変換するプロセス。
- ベクトル化により、テキストデータの意味的な類似性を計算が容易になる。
- RAGでは、Embeddingを使用して、検索QueryとDB内のChunkとの類似性を計算し、最も関連性の高いChunkを特定する。
検索(Retrieval) †
- 検索部分では、Queryに対して関連性の高い情報をDBから取得する。
- 具体的には、プロンプトに対して最も関連性の高いChunkを検索エンジンや埋め込みベクトルの類似性に基づいて見つけ出す。
拡張(Augmented) †
ユーザ入力+取得した情報を統合して拡張。
生成(Generation) †
生成部分では、統合情報を入力し、LLMがユーザーに回答を提供する。
プロセス †
知識情報の分割 †
ユーザーが知識情報を入力
知識情報の埋め込み †
Embeddingで知識情報を埋め込みベクトルに変換
質問の入力(Query Input) †
ユーザーが質問を入力
質問の埋め込み(Query Embedding) †
Embeddingで質問を埋め込みベクトルに変換
情報の検索(Information Retrieval) †
質問の埋め込みベクトルを使用して、DB内の関連Chunkを検索
情報の生成(Information Generation) †
- 検索されたChunkを基にプロンプトを生成
- LLMが生成されたプロンプトを元に回答を生成
回答の提供(Answer Delivery) †
最終的にユーザーに回答を提供
キーワード †
埋め込みベクトル(Embedding Vector) †
Embeddingで、テキストをベクトルに変換した表現方法。
類似性計算(Similarity Calculation) †
埋め込みベクトル間の類似性を内積、距離などで計算するプロセス。
詳細 †
RAGの拡張手法について
手法 †
代表的な手法
ハイブリッドサーチ †
- 性質の異なる複数の検索方式(例えばベクトル検索とキーワード検索)を組み合わせて検索精度を向上させる手法
- キーワードベースの検索とベクトル検索を組み合わせたハイブリッド検索で精度が高く出るという結果が報告されている。
- ベクトル検索は
- BERT
- Sentence-Transformers
リランキング †
- 検索で得たチャンクに対して、クエリとの類似度が高い順に並び変え再度ランク付けをする手法
- 検索はベクトルの内積計算にして、リランキングでTransformerやLLMを使用する。
- これにより、
サブクエリ †
- 入力クエリが複雑な場合や、複合的な意味を持っている場合に有効な手法
- 入力クエリをサブクエリに分解し、それぞれのサブクエリでのレスポンスを最後に合成して回答する
- サブクエリ1
Xの詳細な定義とその意味は何ですか?
- サブクエリ2
Yの詳細な定義とその意味は何ですか?
- 最終レスポンス
サブクエリ1への回答+サブクエリ2への回答
HyDE †
- Hypothetical Document Embeddingsの略で、LLMに仮の回答を作らせて、その仮の回答をベクトル化して検索に使うという方法。
- 本来はQ&AでQからA(が書かれているだろうチャンク)を当てに行くが、QからLLMで生成したA'を使用してAを当てに行く。
- LLMが「A」についての基礎知識を有しており「A'」を肉付けしたものが「A」になるようなケースで利用できる可能性がある。
ステップバックプロンプト †
- 入力クエリを一段抽象化させたステップバック質問を用いてチャンク検索した結果と合成する。
- 入力クエリに対してピンポイントなチャンクがないケースでも推論が可能になるケースがある。
- ステップバック質問で定義、歴史、計算式などの「基礎的なチャンク」を取得して回答を行う。
- 入力クエリでチャンク検索した結果の「派生のチャンク」を使用すると不適切な回答が生成される事がある。
- 例
- X氏は19XX年のY月~Z月まで何をしていたか?と言う質問があったとする。
- X氏に関して、19XX年と言う文字列に該当する経歴の情報が無い場合がある。
- ステップバック質問でX氏の経歴情報を取得する。ココに 19YY < 19XX < 19ZZ の情報が書かれていれば回答可能。
RAG Fusion †
- 入力クエリに類似したクエリをLLMにより幾つか生成し、それぞれのクエリの検索結果を統合する方法。
- 類似クエリでも上位に来るチャンクは重要なチャンクだと言う仮定の投票制で重要なチャンクを取得する。
マルチステップクエリ †
- クエリの分解と段階的な推進により、複数のチャンクを取得して回答を洗練させる手法
- 入力クエリ: 著者が始めた事業共創プログラムの最初のメンバーには誰が参加しましたか?
- クエリの分解1:
- Q:著者はどのような事業共創プログラムを開始しましたか?
- A:著者は、Y Combinator (YC) という事業共創プログラムを開始しました。
- クエリの分解2:
- Q:Y Combinator の事業共創プログラムの最初のメンバーは誰ですか?
- 2005 年に開始された Y Combinator の事業共創プログラムの最初のバッチには、次のようなスタートアップ企業が含まれていました。
- 最終的な回答:
Y Combinator 事業共創プログラムの最初のバッチには、
Reddit (Steve Huffman と Alexis Ohanian によって設立)、
Loopt、Weebly、Twitch (Justin Kan によって設立) などのスタートアップが含まれていました。
チャンク拡張 †
- 非常に単純な手法ですが、検索でヒットしたチャンクの前後のチャンクもコンテキストに含めてLLMに渡すという方法
- チャンクサイズを大きくする場合と効果は似ているが、チャンクサイズを大きくすると、検索精度が落ちる問題があった。
Pandas Dataframe †
- PandasのDFをチャンクに分割せず、テーブル構造を保持したまま処理する。
- また、文字列として処理するのではなく、PandasQueryEngin?によって
LLM を使用してプロンプトからPandas Pythonコードに変換して実行する。
TextToSQL †
体系 †
Indexing †
- Chunk Optimization
文書Indexing時のChunk最適化
- Fixed Size Chunking
文書を固定長でチャンク分割
- Recursive Chunking
設定サイズを下回るまで再帰的にチャンク分割
- Document Based Chunking
文書ごと(MarkdownやPythonプログラムなど)にチャンク分割分割
- Semantic Chunking
文単位で分割・Embeddingをして、次の文との類似度が大きく「異なる」箇所でチャンク分割
- Agentic Chunking
LLMで文書から命題を作り、命題内容に応じたチャンク作成(Dense Xと同じ)
- Multi-representation indexing
文書を複数種類にIndexing
- Summary Embedding
LLMが元文書を要約し要約をIndex。
- Parent Document Indexing
LLMへ渡す文書(Parent)とIndexする文書(Child)に分割
- Dense X Indexing
LLMが元文書を命題に変換し命題をIndex。
- Specialized Embeddings
特別なEmbedding方法
- Fine-tuning Indexing
クエリと文書をEmbeddingするモデルをFine-Tune
- ColBERT Indexing
クエリと文書をToken単位でEmbeddingし、両者の最大類似度でスコアリング
- Hierarchical Indexing
階層的なIndex作成
- RAPTOR Indexing
元文書をEmbeddingすると同時にクラスタリング・要約を繰り返して各要約もEmbedding
Retrieval †
- Routing
クエリ内容に応じたRetrieve方法のルーティング
- Query Construction
自然言語をクエリ言語に変換(text2SQL等)
- Retrieval
最終的にLLMに渡すRetrieveした文書内容最適化
- Generation
- Generation
モデルをRAG内で使用(既存モデルでもファインチューニングでも)
GraphRAG †
参考 †
理論 †
実装 †