RAG構築の始め方|Python×LangChainで社内文書検索を作る

RAG構築の始め方|Python×LangChainで社内文書検索を作るのアイキャッチ画像

※ 本記事にはアフィリエイトリンクが含まれています。

LangChain
RAG構築
$0/月
無料プラン
$0〜
有料プラン
100万+
ユーザー数
主な機能
文書検索
埋め込み生成
ベクトル検索
チャット機能
API連携
Good
オープンソース
豊富なライブラリ
Python対応
Note
学習コストあり
設定が複雑
社内文書検索
AI開発者
データ分析チーム

導入文

RAG(Retrieval-Augmented Generation)は、大規模言語モデルに外部知識を組み合わせて、より正確で具体的な回答を生成する技術です。LangChainとPythonを組み合わせることで、社内文書検索システムや知識ベースの構築が効率的に行えます。

この記事で分かること:

  • RAG構築の基本概念と実装手順
  • Python × LangChainでの具体的なコード例
  • ベクトルデータベースの選び方と設定方法

RAG(Retrieval-Augmented Generation)とは?

RAGは、情報検索(Retrieval)と文章生成(Generation)を組み合わせた機械学習技術です。2020年にFacebookのAI研究部門が発表した手法で、現在では企業の知識管理システムやカスタマーサポートなど幅広い分野で活用されています。

従来のLLM(大規模言語モデル)との最大の差別化ポイントは、リアルタイムで外部データベースから関連情報を取得し、その情報を基に回答を生成する点です。これにより、学習データにない最新情報や企業固有の知識についても正確な回答が可能になります。

RAGシステムの特徴:

  • 動的な知識更新: 文書を追加するだけで知識ベースを拡張可能
  • 情報源の明示: 回答の根拠となった文書を特定できる
  • 幻覚(Hallucination)の軽減: 実際の文書に基づく回答で信頼性向上
  • コスト効率: 巨大なモデルを再学習せずに知識を拡張
  • プライバシー保護: 機密文書を社内環境で処理可能

RAGシステムの主要コンポーネント

ドキュメント処理と分割

Document Loading & Splittingは、RAG構築の第一段階となる重要な処理です。PDF、Word、テキストファイルなど様々な形式の文書を読み込み、検索に適したサイズに分割します。

例えば、100ページの製品マニュアルがある場合、このマニュアル全体を一つの検索単位にするのではなく、章や節ごとに500-1000文字程度のチャンクに分割します。これにより、ユーザーの質問に最も関連性の高い部分だけを抽出し、より精度の高い回答生成が可能になります。

LangChainでは、RecursiveCharacterTextSplitterMarkdownHeaderTextSplitterなど、文書の構造を考慮した分割手法を提供しています。

エンベディング(埋め込み)生成

Embedding Generationでは、分割されたテキストチャンクを数値ベクトルに変換します。これにより、意味的に類似したテキスト同士を数学的に比較できるようになります。

OpenAIのtext-embedding-ada-002やHugging Faceのsentence-transformersなどのモデルを使用して、各チャンクを1536次元や768次元のベクトルに変換します。例えば、「製品の価格について」と「料金プランの詳細」は、表現は異なっても意味的に近いため、類似したベクトル値を持つことになります。

ベクトルデータベース

Vector Databaseは、生成されたエンベディングを効率的に保存・検索するための専用データベースです。従来のリレーショナルデータベースとは異なり、ベクトル間の類似度検索に最適化されています。

主要な選択肢として、Chroma(ローカル開発に最適)、Pinecone(フルマネージドサービス)、Weaviate(オープンソース)、FAISS(Meta開発のライブラリ)があります。例えば、1万件の社内文書がある企業なら、Chromaで十分な性能を得られますが、100万件を超える大規模データの場合はPineconeなどのクラウドサービスが推奨されます。

検索と生成の統合

Retrieval & Generationでは、ユーザーの質問に対して関連文書を検索し、その内容を基にLLMが回答を生成します。質問も同様にエンベディングに変換され、ベクトルデータベース内で最も類似度の高い文書チャンクを特定します。

通常、上位3-5件の関連文書を取得し、これらをコンテキストとしてGPT-4やClaude、LlamaなどのLLMに送信します。LLMは提供された文書情報のみを基に回答を生成するため、推測による不正確な回答を大幅に削減できます。

プロンプトエンジニアリング

Prompt Engineeringは、LLMに適切な指示を与えてRAGシステムの性能を最大化する技術です。検索された文書とユーザーの質問を組み合わせた効果的なプロンプトテンプレートを設計します。

例えば、「以下の文書情報のみを参考にして回答してください。文書に記載されていない情報については『記載されていません』と回答してください」といった制約を設けることで、より信頼性の高いシステムを構築できます。また、回答形式の指定(箇条書き、表形式など)により、ユーザビリティも向上します。

RAG構築にかかるコストと時間

コンポーネント個人開発中小企業大企業
LLMコスト月$10-50月$100-500月$1,000+
ベクトルDB無料(Chroma)月$50-200月$500+
開発時間2-4週間1-3ヶ月3-6ヶ月
こんな方向けプロトタイプ作成社内ツール構築エンタープライズ導入

まずは個人開発レベルから始めて、ChromaとOpenAI APIで基本システムを構築することをおすすめします。月$10-30程度で十分なプロトタイプが作成できます。

Python × LangChainでRAGシステムの実装手順

LangChainの画面

ステップ1: 環境設定とライブラリのインストール

目的: RAG開発に必要なPythonライブラリを一括インストールし、開発環境を整備します。

まず、新しいPythonプロジェクトディレクトリを作成し、以下のコマンドで必要なライブラリをインストールします:

pip install langchain openai chromadb pypdf sentence-transformers python-dotenv

次に、.envファイルを作成してAPIキーを設定します:

OPENAI_API_KEY=your_openai_api_key_here

環境変数の管理が重要: APIキーは絶対にコードに直接記載せず、.envファイルで管理してください。本番環境では追加のセキュリティ対策が必要です。

ステップ2: 文書の読み込みと前処理

目的: PDF、テキスト、Wordファイルなどの社内文書を読み込み、RAGシステムで処理可能な形式に変換します。

from langchain.document_loaders import PyPDFLoader, TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
import os

# 文書の読み込み
documents = []
doc_directory = "./documents"

for filename in os.listdir(doc_directory):
    if filename.endswith(".pdf"):
        loader = PyPDFLoader(f"{doc_directory}/{filename}")
        documents.extend(loader.load())
    elif filename.endswith(".txt"):
        loader = TextLoader(f"{doc_directory}/{filename}")
        documents.extend(loader.load())

# テキストの分割
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=1000,
    chunk_overlap=200,
    length_function=len,
)
splits = text_splitter.split_documents(documents)

重要な設定項目: chunk_size=1000は一つの検索単位のサイズ、chunk_overlap=200は隣接チャンク間の重複文字数です。日本語文書の場合、500-800文字程度が最適とされています。

ステップ3: エンベディングモデルの設定

目的: テキストを数値ベクトルに変換するためのエンベディングモデルを初期化し、文書の意味検索を可能にします。

from langchain.embeddings import OpenAIEmbeddings
from langchain.embeddings import HuggingFaceEmbeddings
import openai
import os

# OpenAI APIキーの設定
openai.api_key = os.getenv('OPENAI_API_KEY')

# エンベディングモデルの選択(2つのオプション)
# オプション1: OpenAI(有料、高精度)
embeddings = OpenAIEmbeddings(
    model="text-embedding-ada-002"
)

# オプション2: HuggingFace(無料、日本語対応)
embeddings_hf = HuggingFaceEmbeddings(
    model_name="sentence-transformers/all-MiniLM-L6-v2"
)

コスト vs 精度のトレードオフ: OpenAIの埋め込みモデルは1000トークンあたり$0.0001と安価ですが、完全無料を希望する場合はHuggingFaceモデルも十分な性能があります。

ステップ4: ベクトルデータベースの構築

目的: エンベディング化された文書をベクトルデータベースに保存し、高速な類似度検索を可能にします。

from langchain.vectorstores import Chroma
from langchain.vectorstores import FAISS

# Chromaを使用(推奨:永続化対応)
vectorstore = Chroma.from_documents(
    documents=splits,
    embedding=embeddings,
    persist_directory="./chroma_db"  # データベースの永続化
)
vectorstore.persist()

# 検索機能のテスト
query = "売上目標について教えてください"
docs = vectorstore.similarity_search(query, k=3)
for i, doc in enumerate(docs):
    print(f"文書{i+1}: {doc.page_content[:200]}...")

データベースの永続化: persist_directoryを指定することで、一度構築したベクトルデータベースを再利用できます。大量の文書がある場合、この設定により2回目以降の起動時間が大幅に短縮されます。

ステップ5: RAG構築チェーンの作成

目的: 検索と生成を統合したRAGチェーンを構築し、ユーザーの質問に対して文書ベースの回答を生成します。

from langchain.llms import OpenAI
from langchain.chains import RetrievalQA
from langchain.prompts import PromptTemplate

# LLMの初期化
llm = OpenAI(
    temperature=0.1,  # 回答の一貫性を重視
    model_name="gpt-3.5-turbo-instruct"
)

# カスタムプロンプトテンプレートの作成
template = """以下の文書情報を参考にして、質問に回答してください。
文書に記載されていない情報については「記載されていません」と回答してください。

文書情報:
{context}

質問: {question}

回答:"""

prompt = PromptTemplate(
    template=template,
    input_variables=["context", "question"]
)

# RAGチェーンの作成
qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    chain_type="stuff",
    retriever=vectorstore.as_retriever(search_kwargs={"k": 3}),
    chain_type_kwargs={"prompt": prompt}
)

ステップ6: システムのテストと評価

目的: 構築したRAGシステムが適切に動作するかテストし、回答品質を評価します。

# テスト質問の実行
test_questions = [
    "会社の売上目標はいくらですか?",
    "新人研修の期間はどのくらいですか?",
    "テレワークポリシーについて教えてください"
]

for question in test_questions:
    print(f"質問: {question}")
    answer = qa_chain.run(question)
    print(f"回答: {answer}")
    print("-" * 50)

# 検索精度の評価
def evaluate_retrieval(query, expected_doc_keywords):
    retrieved_docs = vectorstore.similarity_search(query, k=3)
    scores = []
    for doc in retrieved_docs:
        score = sum(1 for keyword in expected_doc_keywords 
                   if keyword in doc.page_content)
        scores.append(score / len(expected_doc_keywords))
    return max(scores)  # 最高スコアを返す

継続的な改善: 初期構築後も、ユーザーからのフィードバックを基にプロンプトやチャンク設定を調整していくことが重要です。

ステップ7: ウェブインターフェースの実装

目的: StreamlitまたはGradioを使用して、非技術者でも使いやすいウェブUIを提供します。

import streamlit as st
import time

# Streamlitアプリの基本設定
st.title("社内文書検索システム")
st.write("RAG技術を活用した知識ベース検索")

# ユーザー入力
user_question = st.text_input(
    "質問を入力してください:",
    placeholder="例: 年次休暇の申請方法を教えてください"
)

if st.button("検索"):
    if user_question:
        with st.spinner("回答を生成中..."):
            # RAGチェーンで回答生成
            answer = qa_chain.run(user_question)
            
            # 参考文書も表示
            source_docs = vectorstore.similarity_search(user_question, k=2)
            
        st.success("回答完了")
        st.write("### 回答")
        st.write(answer)
        
        st.write("### 参考文書")
        for i, doc in enumerate(source_docs):
            with st.expander(f"参考文書 {i+1}"):
                st.write(doc.page_content)

UI設計のポイント: 回答だけでなく参考文書も表示することで、情報の信頼性とトレーサビリティを確保します。ローディング表示により、ユーザーエクスペリエンスも向上します。

RAG構築の活用事例・成功事例

現時点でこのツールのG2レビューは確認できていません。最新のユーザー評価については、各レビューサイトをご確認ください。

活用シーン1:想定される主な利用パターン

このツールは、チームの業務効率化やワークフロー改善を目的として導入されるケースが想定されます。

活用シーン2:導入前に確認すべきポイント

無料プランやトライアル期間を活用し、自社の要件に合致するか検証してから本格導入することが推奨されます。

RAG構築のメリット・デメリット

メリット

  • リアルタイム知識更新: 新しい文書を追加するだけで、再学習なしに知識ベースを拡張可能
  • 高い回答精度: 実際の文書に基づく回答のため、推測による誤答が大幅に削減される
  • コスト効率: 大規模言語モデルの再学習に比べて、1/10以下のコストでカスタマイズが可能
  • 透明性の確保: 回答の根拠となった文書を特定できるため、監査や品質管理がしやすい
  • プライバシー保護: 機密文書を外部に送信せず、社内環境で完結した処理が可能

デメリット

  • 初期構築の複雑さ: エンベディング、ベクトルDB、プロンプト設計など多岐にわたる技術知識が必要
  • 文書品質への依存: 元文書が不正確または古い情報の場合、回答品質も低下する
  • 計算リソースの消費: 大量文書の処理時に高いCPU・メモリリソースが必要(AWS EC2 t3.large以上推奨)
  • 日本語対応の限界: 一部のエンベディングモデルでは、日本語の意味理解精度が英語より劣る場合がある
  • 運用・保守コスト: APIコスト、サーバー維持費、定期的な文書更新作業などの継続的な費用

競合ツールとの簡易比較

項目LangChain + PythonLlamaIndexHaystack
学習難易度中級初級上級
日本語対応良好良好限定的
カスタマイズ性
月額コスト$20-100$50-200$30-150
こんな方向け柔軟性重視簡単導入重視高度なカスタマイズ

使い分けガイド: 簡単にRAGを試したい場合はLlamaIndex細かいカスタマイズが必要な場合はLangChain大規模な本格運用ならHaystackがおすすめです。

よくある質問(FAQ)

Q. RAGシステムは日本語文書に対応していますか?

A. はい、対応しています。ただし、エンベディングモデルの選択が重要です。OpenAIのtext-embedding-ada-002は日本語に対応していますが、より高精度を求める場合は日本語特化モデルのsentence-transformers/all-MiniLM-L6-v2やリクルート社のjapanese-sentence-bert-baseの使用を推奨します。

Q. 構築にかかる初期費用はどの程度ですか?

A. 個人レベルの小規模システムなら月$10-30程度です。OpenAI APIの使用料(月$10-20)とChromaDB(無料)で基本システムを構築できます。企業レベルの本格運用では、サーバー費用やエンタープライズ向けベクトルDBの費用を含めて月$100-500程度が目安です。

Q. どのような文書形式に対応していますか?

A. PDF、Word(.docx)、テキストファイル(.txt)、Markdown(.md)、CSV、JSON形式に標準対応しています。LangChainのUnstructuredLoaderを使用することで、PowerPoint(.pptx)やExcel(.xlsx)も処理可能です。画像内のテキストを処理したい場合は、OCR処理が別途必要になります。

Q. セキュリティ面での注意点はありますか?

A. 重要な注意点が3つあります。1)APIキーの適切な管理(環境変数での設定)、2)機密文書を外部APIに送信する場合のデータ保護、3)ベクトルデータベースへのアクセス制御です。特に機密性の高い文書を扱う場合は、ローカル環境でのLLM(Llama 2、Code Llama等)の使用を検討してください。

Q. システム導入にかかる期間はどのくらいですか?

A. プロトタイプレベル(50-100文書)なら1-2週間本格運用システム(1000文書以上)なら1-3ヶ月が目安です。期間の大部分は文書の前処理とプロンプトの調整に費やされます。既存システムとの連携や認証機能の実装が必要な場合は、さらに1-2ヶ月の追加期間を見込んでください。

Q. 他のシステムとの連携は可能ですか?

A. はい、多くのシステムと連携できます。SlackやTeams bot、Webアプリケーション、既存のCRMシステムなどとAPI経由で接続可能です。LangChainはREST API化も簡単で、FastAPIやFlaskを使用してWebサービス化できます。Zapier連携により、ノーコードでの業務フロー統合も実現できます。

まとめ + CTA


まとめ:RAG構築は実用的な知識管理システムを求める方におすすめ

  • 高い実用性: 社内文書検索から顧客サポートまで、幅広い業務で即戦力となる
  • 適切なコスト: 月$20-100程度で本格的なAIシステムを構築可能
  • 技術習得価値: AI活用の実践的スキルが身につき、キャリアアップにも直結

LangChain公式ドキュメントで詳細な実装方法を確認する

参考・情報ソース

次のステップ

最適なツールを見つけましょう

カテゴリ別に厳選された比較記事をチェック

記事一覧を見る 同じカテゴリの記事