はじめに
仕事の中で、こんな「知識の断絶(ナレッジギャップ)」を感じたことはありませんか?
- 新入社員:「有休に関する情報」を探そうとしても、社内規定集がどこにあるかわかりません。
- 熟練エンジニア:当社の製品でよくあるエラーに直面し、毎回調べている気がするが、今回はチャット履歴やドキュメントを探しても見つからない。
- 営業・カスタマーサポートチーム:顧客から製品に関する非常に具体的で、少し突っ込んだ技術仕様の質問を受けたが、その答えは、製品マニュアルのどこかで見た記憶がある。しかし、いざ探してみると見つからない。
生成AIのチャットに聞いてみても、「わかりません」と返されたり、一般的で的外れな答えしか返ってこないことも多いでしょう。
なぜ、あれほど「賢い」AIたちが、私たち自身の「社内の知恵」を理解できないのでしょうか? それはAIが「十分に賢くない」からではなく、従来の言語モデル(LLM)自体の設計に根本的な制約があるからです。 LLMは、学習データの外にある私的でリアルタイムな情報にはアクセスできません。 言ってみれば、記憶力と知識は抜群だけれど、あなたの会社の内部事情をまったく知らない「外部の専門家」のような存在なのです。
では、この「外部の専門家」を社内に招き入れ、社内知識を素早く学習させ、いつでも正確に答えられるようにすることはできないのでしょうか? ――その答えは「Yes」です。そして、それを実現する中核技術こそが、今回の主役 RAG(Retrieval-Augmented Generation/検索拡張生成) なのです。
なぜ今、多くの企業が外部のクラウドAIサービスではなく、自社環境で動作するローカルLLMに注目しているのでしょうか? それは、機密情報を外部に送信しないという高度なセキュリティ、外部APIの利用料に依存しないコスト管理、そして自社業務に特化したカスタマイズが可能になるからです。
なぜあなたのAIは新しい知識を「学べない」のか?──LLMの限界とRAGの誕生
RAGがなぜこれほど重要なのかを理解するためには、まずLLM(大規模言語モデル)の「弱点」を知る必要があります。
一般的なLLMは、その知識を膨大な学習データから得ています。この学習プロセスには莫大なコストがかかり、数か月、場合によってはそれ以上の時間を要します。そのため、新しい情報が出るたびにモデルを再学習させることは現実的ではありません。
この構造的な制約により、LLMには次の2つの大きな限界があります:
知識が静的であること:
学習データの最終更新日以降に起きた出来事を知ることはできません。
情報が隔離されていること:
個人ファイル、社内ナレッジベース、非公開データベースなどにはアクセスできません。
このような状況で、AIが知らない情報を尋ねると、LLMはしばしば「ハルシネーション(幻覚)」と呼ばれる、もっともらしい嘘を生成する現象を引き起こします。 ハルシネーションは、正確な情報が求められるビジネスの現場では非常に問題です。
この問題を解決するために登場したのが、RAG技術です。 その核心的な発想はとてもシンプルです: モデルが知らないなら、外部の情報を調べてから答えさせればいい。
RAGは、賢いLLMに「外付けのハードディスク」と「検索エンジン」を持たせるようなものです。 つまり、必要に応じてインターネットや社内文書を検索し、その情報を参照して答えを導き出せるようにするのです。
3ステップで理解するRAG──AIはどのように「調べてから答える」のか?
RAGのワークフローは、次の3つの主要なステップに分解して理解することができます: すなわち、それぞれの頭文字である、検索(Retrieval)、拡張(Augmentation)、 生成(Generation)です。
それでは、このプロセスを図でわかりやすく見てみましょう。
- 検索(Retrieval): ユーザーが質問を入力すると、システムはまず指定されたナレッジベース(PDFやドキュメントライブラリなど)の中から、その質問に最も関連性の高い情報の断片を検索します。
- 拡張(Augmentation): ここがRAGの“核心”です。 システムはユーザーの元の質問と、先ほど検索で得られた情報断片をひとつにまとめ、より内容が具体的で文脈が明確な「拡張プロンプト(Augmented Prompt)」(※検索結果を付与した、より具体的な指示書)を作成します。
- 生成(Generation): 最後に、システムはこの「拡張プロンプト」を大規模言語モデル(LLM)に送信します。 このときのLLMは、記憶だけに頼らず、提供された新しく正確な“参照資料(検索結果)”を参照しながら、高品質な回答を生成します。
これにより、LLMは「記憶だけ」で答える必要がなくなり、 検索によって得た「具体的な情報」を参照しながら、正確かつ関連性の高い回答を導き出せるようになります。
LLMが知らないことにはプロンプトを通じて情報を伝える。これがRAGの技術的な仕組みです。
性能デモ:RAGと実際のAIモデルを組み合わせたとき
ここまでRAGの仕組みを紹介しました。 RAGを実際に体感していただくために、非常に簡単なプログラムを使って、試してみましょう。
デモ環境構成:
大規模言語モデル(LLM):
qwen3:8bモデルを Ollama を使って接続します。質問の理解と最終的な回答生成を行います。埋め込みモデル(Embeddingモデル):
intfloat/multilingual-e5-base。 テキストの「意味」を正確にベクトル(数値表現)へ変換する多言語対応の高精度モデル。 (LLMの学習データに含まれていない)情報をナレッジベースから検索するために使用します。
今回用意する「ナレッジベース」:
LLMが知りえない、プロジェクト・ノヴァという架空のプロジェクトの情報としてテキストファイル my_knowledge.txt を用意しました。
1「プロジェクト・ノヴァ」は、次世代の再生可能エネルギー源として、深海熱水噴出孔の地熱を利用する画期的な研究開発プロジェクトです。2このプロジェクトの責任者は、海洋物理学の権威である佐藤博士です。3プロジェクトは2023年第4四半期に正式に開始され、初期段階の予算は5億円です。4主な研究施設は沖縄県の沖合に設置されています。5目標は、5年以内に商業利用可能なプロトタイプを完成させることです。
サンプルプログラム:
LangChainのようなフレームワークを活用することで、RAGの複雑な処理を数行のコードで実現でき、迅速な開発が可能になります。
1import re2from langchain_community.document_loaders import TextLoader3from langchain.text_splitter import CharacterTextSplitter4from langchain_community.vectorstores import FAISS5from langchain_huggingface import HuggingFaceEmbeddings6from langchain_ollama import OllamaLLM7from langchain_core.embeddings import Embeddings8from langchain_core.prompts import ChatPromptTemplate9from langchain_core.runnables import RunnablePassthrough, RunnableParallel10from langchain_core.output_parsers import StrOutputParser1112# E5モデルは入力テキストの前にquery: passage: を付ける必要があるため、カスタムEmbeddingsクラスを作成13class E5Embeddings(Embeddings):14 def __init__(self, model_name="intfloat/multilingual-e5-base"):15 self.embedder = HuggingFaceEmbeddings(16 model_name=model_name,17 encode_kwargs={"normalize_embeddings": True}18 )19 def embed_documents(self, texts):20 return self.embedder.embed_documents([f"passage: {t}" for t in texts])21 def embed_query(self, text):22 return self.embedder.embed_query(f"query: {text}")2324def setup_rag_chain():25 loader = TextLoader("my_knowledge.txt", encoding="utf-8")26 docs = loader.load()27 text_splitter = CharacterTextSplitter(chunk_size=400, chunk_overlap=50)28 split_docs = text_splitter.split_documents(docs)2930 embeddings = E5Embeddings()31 vectorstore = FAISS.from_documents(split_docs, embeddings)32 retriever = vectorstore.as_retriever(search_kwargs={"k": 1})3334 llm = OllamaLLM(model="qwen3:8b")35 prompt = ChatPromptTemplate.from_template(36 "以下の情報のみに基づいて、質問に答えてください。\n\n{context}\n\n質問:{question}"37 )3839 rag_chain = (40 RunnableParallel(41 {"context": retriever, "question": RunnablePassthrough()}42 )43 | prompt44 | llm45 | StrOutputParser()46 )47 return rag_chain4849def main():50 rag_chain = setup_rag_chain()51 question = "「プロジェクト・ノヴァ」の責任者は誰ですか?"52 answer = rag_chain.invoke(question)53 cleaned_answer = re.sub(r"<think>.*?</think>", "", answer, flags=re.DOTALL).strip()5455 print("質問:", question)56 print("回答:", cleaned_answer)5758if __name__ == "__main__":59 main()
このコードでは、専用の埋め込みモデル(Embeddingモデル)を定義し、さらに OllamaでQwen3:8b を頭脳(LLM)として指定し、 それらを組み合わせてひとつの RAGアプリケーション を構築しています。
実行と結果:
このスクリプトを実行すると、RAGシステムは「プロジェクト・ノヴァ(Project Nova)」に関する質問に正確に回答します。
1質問: 「プロジェクト・ノヴァ」の責任者は誰ですか?2回答: 「プロジェクト・ノヴァ」の責任者は、海洋物理学の権威である**佐藤博士**です。
このデモはRAGの基本的な仕組みを示したものですが、実際のビジネスで活用するには、多様なファイル形式(PDF, Word, PowerPoint等)への対応、より高度な検索精度のチューニング、ユーザーごとのアクセス権限管理といった、多くの実践的な課題が存在します。弊社の『ローカルLLM PoCサービス』では、これらの課題を包括的に解決し、お客様の既存のナレッジ資産を最大限に活用できる、セキュアで高精度なRAGシステムを迅速に構築します。
まとめと展望:RAGが切り拓く、企業AI活用の新たな章
今回のコラムを通して、RAGは決して難解な技術ではなく、「検索」と「生成」を巧みに組み合わせた実践的なフレームワークであることを紹介しました。 それは、LLMが学習データにない情報を答えられない、という根本的な課題を解決します。
この技術を使うことで、次のような利用用途が可能となります。
- 社内ナレッジベース: 社員が自然言語で会社の規程、技術ドキュメント、プロジェクト履歴を素早く検索できる。
- インテリジェントカスタマーサポート: AIが最新の製品マニュアルやヘルプドキュメントを基に、正確で的確な回答を提供できる。
- パーソナルナレッジアシスタント: 自分のノート、メール、ファイルを整理し、「自分専用の万能AIアシスタント」を構築できる。
しかし、企業において本格的に RAG を導入・運用するためには、多様なファイル形式への対応や、高度な検索精度のチューニングなど、多くの実践的な課題を解決する必要があります。もし、貴社でセキュアかつ高精度なRAGシステムを構築したいとお考えでしたら、弊社の『ローカルLLM PoCサービス』にご相談ください。お客様の既存のナレッジ資産を最大限に活用できる、最適なソリューションを迅速にご提案します。