_featured.png?width=736&disable=upscale&auto=webp)
世界中でAIへの移行が進む中、大規模言語モデル(LLM)は今日、多くの組織のバックボーンになりつつあります。LLMは優れたツールであり、多くのメリットがあるため人気が高まっていますが、適切に使用しないとデメリットも生じます。確かに、LLMは予期しない応答を生成することがあり、それらは偽物、捏造された情報、あるいは偏ったものになることもあります。これはさまざまな理由で発生する可能性があります。私たちは、LLMによるこの誤情報生成のプロセスをハルシネーションと呼んでいます。LLMのハルシネーションを軽減するための注目すべきアプローチとして、ファインチューニング、プロンプトエンジニアリング、検索拡張生成(RAG)などが挙げられ、モデルのパフォーマンスを大幅に向上させます。検索拡張生成(RAG)は、大規模言語モデルが直面するハルシネーションを軽減するアプローチとして最も話題になっています。今日は、RAGアプローチの仕組みをご紹介します。
RAGとそれが実装する検索プロセスは、ユーザーのクエリに応じてデータソースから関連情報を検索・収集するための体系的な手法です。このプロセスは、医療などの分野におけるアプリケーションの強化に不可欠であり、最新の研究成果と 医療情報を統合することで、病状の正確な診断や治療計画の策定を支援します。
検索拡張生成 (RAG) とは何ですか?
検索拡張生成(Retrieval Augmented Generation、略して「RAG」)についてさらに詳しく説明すると、これは人工知能(AI)における最先端技術であり、従来の言語モデルの強みと、関連する外部データを動的に取り込む能力を組み合わせたものです。この革新的なアプローチは、機械生成の応答をリアルタイム情報に基づかせることで、その精度と関連性を大幅に向上させます。検索拡張生成を活用することで、AIシステムはより正確で文脈に適した回答を提供できるようになり、様々なアプリケーションにおいて信頼性と有用性を高めます。
RAGの定義と目的
RAGは、大規模言語モデル(LLM)のパフォーマンスを向上させるために、検索プロセスと生成プロセスを統合した特殊なモデルです。RAGの主な目的は、AI生成コンテンツの文脈的精度と関連性を向上させることです。RAGはリアルタイムの外部データを組み込むことで、LLMによって生成される応答が正確であるだけでなく、最新かつ文脈的に適切なものになることを保証します。つまり、プロンプトなどのメカニズムを介して最新のデータを挿入し、モデルがそれにアクセスできるようにするのです。その結果、挿入されたデータは動的であるため、モデルのトレーニングに用いられる静的データと比較して、より情報に基づいた応答が得られます。そのため、RAGは正確で最新の情報を必要とするアプリケーションにとって非常に貴重なツールとなります。
RAGが外部データへのアクセスを可能にする仕組み
RAGは、様々なデータソースから関連情報を検索する高度な検索コンポーネントを通じて、外部データへのアクセスを可能にします。RAGで使用されるデータは、テキストプロンプトに挿入されたプレーンテキストのような単純なものであっても構いませんが、高度なユースケースにはこれでは単純すぎます。一般的に、関連データはベクトル埋め込みに変換され、ベクトルデータベースに保存されます。ユーザーからのクエリを受信すると、検索コンポーネントがそれをベクトル表現に変換し、保存されているデータと照合して、最も関連性の高い情報を見つけます。次に、生成コンポーネントが、この取得された情報を使用して、正確で文脈的に正しい応答を生成します。このプロセスにより、AIシステムはベクトルデータベースの力を活用して情報を効率的に保存および取得し、関連性と正確性を兼ね備えた回答を提供できるようになります。
RAGの主要概念
RAG パイプラインには基本的に、検索コンポーネント、拡張コンポーネント、生成コンポーネントという 3 つの重要なコンポーネントが含まれます。
- 検索:このコンポーネントは、任意のユーザークエリに対して、ベクトルデータベースなどの外部ナレッジベースから関連情報を取得するのに役立ちます。これは、意味があり文脈的に正しい応答をキュレーションするための最初のステップであるため、非常に重要です。
- 拡張: この部分では、ユーザー クエリに対して取得された応答に関連性の高いコンテキストを強化して追加します。
- 生成:最後に、大規模言語モデル(LLM)の助けを借りて、最終的な出力がユーザーに提示されます。LLMは独自の知識と提供されたコンテキストを活用し、ユーザーのクエリに適切な応答を生成します。
これら3つのコンポーネントは、ユーザーが求めている文脈に即した正確な回答を得るためのRAGパイプラインの基盤です 。チャットボットや質問応答システムなどの構築において、RAGが非常に優れているのはそのためです。
RAGシステムは、中程度の技術的専門知識を持つソフトウェアエンジニアでも構築できますが、より優れた応答生成には、最高クラスの埋め込みモデルとLLMが必要です。しかし、RAGはリソースを大量に消費し、自然言語処理と情報検索システムの両方の専門知識を必要とします。これらの課題にもかかわらず、RAGはLLMのパフォーマンスを大幅に向上させることができる強力な手法であり、チャットボットやバーチャルアシスタントから言語翻訳システムやヘルスケアに至るまで、幅広いアプリケーションにとって貴重なツールとなっています。
大規模言語モデル(LLM)は幻覚的な回答を生成することがありますが、こうしたハルシネーションを軽減する手法の一つがRAGです。ユーザーからのクエリに対して、RAGはベクトルデータベースに格納されている提供されたソース/情報/データから情報を取得する傾向があります。ベクトルデータベースとは、ベクトルデータが格納される従来のデータベースとは異なる特殊なデータベースです。ベクトルデータは、オブジェクトのコンテキストと意味を捉える埋め込み形式です。
RAGの実践
例えば、AIアプリケーションからカスタムレスポンスを取得したいシナリオを考えてみましょう。まず、組織のドキュメントは埋め込みモデルによって埋め込みに変換され、ベクトルデータベースに保存されます。クエリがAIアプリケーションに送信されると、ベクトルクエリ埋め込みに変換され、ベクトルデータベースを検索して、ベクトル類似度検索によって最も類似するオブジェクトを検索します。このプロセスでは、ユーザー入力が重要な役割を果たします。ユーザー入力は検索クエリの生成と最適化に役立ち、取得されたドキュメントの関連性を高めます。このように、LLMを利用したアプリケーションは、カスタムレスポンスを提供するように既に指示されており、カスタムデータが入力されているため、幻覚的な動作をしません。
シンプルなユースケースの一つとして、顧客サポートアプリケーションが挙げられます。カスタムデータがベクトルデータベースに保存されたアプリケーションに入力され、ユーザーからのクエリに対して、一般的な回答ではなく、製品やサービスに関連する最適な応答が生成されます。このように、RAGは世界中の多くの分野に革命をもたらしています。
RAGの主な利点は、モデルが外部ソースからリアルタイムの情報を取得できるため、より動的で新しい情報への適応性が高まることです。これ は、ファクトチェックや最近の出来事に関する質問への回答など、事前学習済みの知識には含まれていない可能性のある特定の詳細をモデルが参照する必要があるタスクに特に役立ちます。
検索拡張生成の利点
RAG を実装する開発者やデータサイエンティストにとって、RAG には驚くべきメリットがいくつかあります。いくつか注目すべき点を挙げてみましょう。
- スケーラビリティ。RAGアプローチは、外部データベース (ベクトルデータベース) に外部/カスタム データを更新または追加するだけで、スケール モデルの作成に役立ちます。
- メモリ効率。GPTのような従来のモデルは、最新かつ更新された情報を取得する際に限界があり、メモリ効率に欠けます。RAGはベクトルデータベースなどの外部データベースを活用することで、必要なときに最新、更新、または詳細な情報を高速に取得できます。
- ハルシネーションを最小限に抑える。RAGで使用されるトレーニングデータは、モデルの微調整とパフォーマンスの向上に不可欠であり、バイアスやモデルのハルシネーションといった問題に対処します。
- 柔軟性。外部ナレッジソースを更新または拡張することで、RAG を適応させ、あらゆる AI アプリケーションを柔軟に構築できます。
検索拡張生成(RAG)アプリケーション
RAG は、次のような詳細かつコンテキストに応じた回答が必要なシナリオで非常に役立ちます。
- 質問応答システム。広範な知識ベースから情報を取得し、ユーザーの質問に対して詳細かつ文脈に沿った正確な回答を提供します。
- コンテンツ作成。ライター、著者、クリエイターに関連性の高い最新情報や事実を提供し、コンテンツ作成プロセスを充実させることを支援します。
- 研究支援。インターネット上の膨大な関連文書やウェブサイトを検索する代わりに、RAGは研究者が検索クエリに関連するデータや研究に迅速にアクセスできるよう支援します。
RAGリアルタイムユースケースの例
RAGには幅広い応用分野があり、実際のユースケースの一つとしてチャットアプリケーション分野が挙げられます。RAGはリアルタイムデータを統合することでチャットボットの機能を強化します。例えば、スポーツリーグのチャットボットを考えてみましょう。従来のLLMは過去の出来事に関する質問には答えられますが、昨夜の試合の詳細といった最近の出来事には対応が困難です。
RAGは、チャットボットが最新のデータベース、ニュースフィード、選手の経歴にアクセスできるようにします。これにより、システムはユーザーの質問を処理し、最近の試合や選手の負傷に関するタイムリーで正確な回答を提供します。例えば、Cohereのチャットボットは、カナリア諸島のバケーションレンタルに関する詳細情報(ビーチへのアクセスから近くのバレーボールコートまで)をリアルタイムで提供します。RAGは、静的なLLMの知識と動的で最新の情報との間のギャップを埋める役割を果たします。
LangChainを使用したRAG
LangChainは、膨大なデータリポジトリと大規模言語モデル(LLM)間のインターフェースを合理化することで、RAGに革命をもたらします。膨大なデータを処理可能なベクトルに断片化することで、LangChainは迅速な検索を最適化します。ユーザーがプロンプトを入力すると、LangChainはベクトルストアに迅速にクエリを実行し、関連データを特定します。
この焦点を絞ったデータはLLMに送られ、LLMは正確でコンテキストに富んだレスポンスを生成します。LangChainの効率的なデータ管理とLLMの生成機能の相乗効果により、ユーザーは正確でデータに基づいたレスポンスを受け取ることができます。オープンソースプラットフォームであるLangChainのRAGへのアプローチは、AI主導のコンテキストアウェアなコンテンツ生成と検索における新時代の到来を告げています。
SingleStore と LangChain の統合をご覧ください。

この図は、AIアプリケーションのRAGプロセスを表しています。フローは、ステップ1で示されているように、エンドユーザーがクエリ(質問)を投げかけることから始まります。この問い合わせは生成AIアプリに送られ、ステップ2で示されているように、企業データリポジトリから関連情報を検索・取得します。取得されたデータは、ステップ3でLLMに指示するためのプロンプトとして使用されます。
LLMはプロンプトと最初のクエリに基づいて適切な応答を生成し、取得したデータを統合して、エンドユーザーに一貫性のある情報に基づいた回答を提供します。このRAGプロセスは、情報検索機能と言語モデルの高度な生成機能を組み合わせ、詳細かつ文脈的に正確な回答を提供します。
ファインチューニング vs. 検索拡張生成
ファインチューニングとは、既存の広範に学習されたモデルを特定のタスクまたは領域に適応させるプロセスを指します。LLMはまず、膨大なデータコーパスを用いて言語構造、パターン、ニュアンスを理解するための学習を行います。この段階はしばしば「事前学習」と呼ばれます。
この一般化された理解が確立されると、モデルは、特定のアプリケーション、例えば医療テキスト生成、法務文書分析、顧客サポート対応などに特化した、より小規模で専門的なデータセットを用いて、さらに改良・ファインチューニングすることができます。このファインチューニング ステップにより、モデルは事前学習で得た幅広い知識を活用しながら、対象ドメインのニュアンスや詳細に特化することができ、目的のタスクにおいてより優れたパフォーマンスを発揮できるようになります。
RAGとファインチューニングはどちらも、事前学習済みの言語モデルを特定のタスクや領域に適応させる手法です。以下に両者の比較を示します。
| 検索拡張生成(RAG) | ファインチューニング | |
| 定義 | 大規模な知識検索とシーケンス生成を組み合わせます。関連する文書を取得し、それらを使用して回答を生成します。 | より小規模なデータセットを用いて、特定のタスク向けに事前学習済みモデルを改良します。モデルの重みを調整することで、特定のタスクに特化します。 |
| 利点 | 膨大な外部知識を活用できます | 特定のタスクで強力なパフォーマンスを達成できます。 特にタスクに利用できるデータが限られている場合に効率的。 |
| 課題 | 効率的な検索メカニズムが必要。 無関係な文書を検索する可能性があります。 計算負荷が高い。 | 十分なデータがない場合、またはトレーニングが積極的すぎる場合、過剰適合のリスクがあります。 知識は最後のトレーニングのカットオフまでに制限されています。 |
| ユースケース | オープンドメインの質問応答(QA)。 チャットボットにおける動的応答。 新しいデータが頻繁に出現する状況。 | 感情分析などのタスク固有のアプリケーション。 独自のデータセットを持つニッチなドメイン。 |
| 例 | OpenAIのQA向けRAGモデル | 特定の ドメインまたはタスクに合わせて GPT モデルをファインチューニングする |
Launch AI-driven features. Without hitting limits.
- Free to start.
- Start building in minutes.
- Run transactions, analytics & AI.
SingleStoreDB
AIアプリケーションにおいて、SingleStoreとRAGモデルを統合することで、強力な組み合わせを実現できます。SingleStoreDBは、高性能なリアルタイム分析に優れた分散型リレーショナルデータベースです。SingleStoreDBを統合することで、RAGモデルは膨大なデータに高速かつ効率的にアクセスできるようになります。これは、リアルタイムのレスポンス生成に不可欠な要素となります。
SingleStoreDB を RAG モデルと統合することで、リアルタイム分析と高速データ取得のパワーを活用し、チャット アプリケーションがユーザーのクエリに対してタイムリーで適切な応答を提供できるようになります。
さらに深く理解するには、SingleStore CMO の Madhukar Kumar による講演「検索拡張生成 (RAG) を使用してプライベート エンタープライズ データ上に生成 AI アプリを構築する」をご覧ください。
また、Unstrucutured.io (SingleStore パートナー) の DevRel エンジニアである Ronny Hoesada による、 Unstructured と SingleStoreDB を使用して Slack データで Q+A 検索拡張生成 (RAG) システムを構築する方法に関する記事もご覧ください。
RAGチュートリアル
特定のユーザークエリに対して、独自のデータからコンテキストに関連する情報を取得するシンプルな AI アプリケーションを構築してみましょう。
SingleStore にサインアップして、AI データベースとしてご利用ください。サインアップ後、ワークスペースを作成する必要があります。これは簡単で無料です。
.png?width=1024&disable=upscale&auto=webp)





必要なライブラリのインストール
1!pip install openai numpy pandas singlestoredb langchain==0.1.8 langchain-community==0.0.21 langchain-core==0.1.25 langchain-openai==0.0.6
1def word_to_vector(word):2 # Define some basic rules for our vector components3 vector = [0] * 5 # Initialize a vector of 5 dimensions4 5 # Rule 1: Length of the word (normalized to a max of 10 characters for simplicity)6 vector[0] = len(word) / 107 8 # Rule 2: Number of vowels in the word (normalized to the length of the word)9 vowels = 'aeiou'10 vector[1] = sum(1 for char in word if char in vowels) / len(word)11 12 # Rule 3: Whether the word starts with a vowel (1) or not (0)13 vector[2] = 1 if word[0] in vowels else 014 15 # Rule 4: Whether the word ends with a vowel (1) or not (0)16 vector[3] = 1 if word[-1] in vowels else 017 18 # Rule 5: Percentage of consonants in the word19 vector[4] = sum(1 for char in word if char not in vowels and char.isalpha()) / len(word)20 21 return vector22 23# Example usage24word = "example"25vector = word_to_vector(word)26print(f"Word: {word}\nVector: {vector}")
1import numpy as np2 3def cosine_similarity(vector_a, vector_b):4 # Calculate the dot product of vectors5 dot_product = np.dot(vector_a, vector_b)6 7 # Calculate the norm (magnitude) of each vector8 # Calculate the norm (magnitude) of each vector9 norm_a = np.linalg.norm(vector_a)10 norm_b = np.linalg.norm(vector_b)11 12 # Calculate cosine similarity13 similarity = dot_product / (norm_a * norm_b)14 return similarity15 16# Example usage17word1 = "example"18word2 = "sample"19vector1 = word_to_vector(word1)20vector2 = word_to_vector(word2)21 22# Calculate and print cosine similarity23similarity_score = cosine_similarity(vector1, vector2)24print(f"Cosine similarity between '{word1}' and '{word2}': {similarity_score}")25
1OPENAI_KEY = "INSERT OPENAI KEY"2from openai import OpenAI3client = OpenAI(api_key=OPENAI_KEY)4 5def openAIEmbeddings(input):6 response = client.embeddings.create(7 input="input",8 model="text-embedding-3-small"9 )10 return response.data[0].embedding11 12print(openAIEmbeddings("Golden Retreiver"))
SingleStore でベクトル データベースを作成する
LangChain フレームワークを使用し、埋め込みとシャーロック ホームズの物語に関する公開 .txt ファイル リンクを保存するためのベクトル データベースとして SingleStore を使用します。
OpenAI API キーを環境変数として追加します。
1import os2os.environ['OPENAI_API_KEY'] = 'mention your openai api key'
1import openai2from langchain.text_splitter import CharacterTextSplitter3from langchain_community.document_loaders import TextLoader4from langchain_community.embeddings import OpenAIEmbeddings5from langchain_community.vectorstores.singlestoredb import SingleStoreDB6import os7import pandas as pd8import requests9 10# URL of the public .txt file you want to use11file_url = "https://sherlock-holm.es/stories/plain-text/stud.txt"12 13# Send a GET request to the file URL14response = requests.get(file_url)15 16# Proceed if the file was successfully downloaded17if response.status_code == 200:18 file_content = response.text19 20 # Save the content to a file21 file_path = 'downloaded_example.txt'22 with open(file_path, 'w', encoding='utf-8') as f:23 f.write(file_content)24 25 # Now, you can proceed with your original code using 'downloaded_example.txt'26 # Load and process documents27 loader = TextLoader(file_path) # Use the downloaded document28 29 documents = loader.load()30 text_splitter = CharacterTextSplitter(chunk_size=2000, chunk_overlap=0)31 docs = text_splitter.split_documents(documents)32 33 # Generate embeddings and create a document search database34 OPENAI_KEY = "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" 35 # Replace with your OpenAI API key36 embeddings = OpenAIEmbeddings(api_key=OPENAI_KEY)37 38 # Create Vector Database39 vector_database = SingleStoreDB.from_documents(docs, embeddings, table_name="scarlet")40 # Replace "your_table_name" with your actual table name41 42 query = "which university did he study?"43 docs = vector_database.similarity_search(query)44 print(docs[0].page_content)45 46else:47 print("Failed to download the file. Please check the URL and try again.")

提供されたデータから関連情報を取得し、それを用いて回答生成プロセスを導きました。ファイルを埋め込み情報に変換し、SingleStoreデータベースに保存することで、検索可能な情報コーパスを作成しました。これにより、回答は関連性が高いだけでなく、提供されたデータセットから得られた豊富なコンテンツも確保されます。
結論
検索拡張生成(RAG)は、言語モデルの進化における大きな飛躍を表しています。検索メカニズムの力とシーケンス生成を組み合わせることで、RAGモデルはより豊かで詳細、かつ文脈に即した出力を提供できます。この分野が発展するにつれて、これらのコンポーネントのより洗練された統合が見られるようになり、知識だけでなくリソースも豊富なAIモデルの実現への道が開かれると期待されます。

Explore our Developers Hub
- Developer tools
- Step-by-step guides
- APIs
- Integrations
Frequently Asked Questions




