大規模言語モデル(LLM)の性能が急速に進化する中、自社データを活用した独自のAIシステムを構築したいエンジニアは増えています。しかし、実装となると「LangChainって複雑では?」「日本語対応は大丈夫?」「実際にどうコードを書くんだろう」といった悩みがつきまとうのではないでしょうか。
このチュートリアルでは、LangChain と Anthropic Claude を組み合わせた日本語 RAG(Retrieval-Augmented Generation)システムの構築方法を、実際のコード例を交えてステップバイステップで解説します。2026年現在の最新実装方法を身につけることで、あなたの企業や案件でも即座に活用できるようになります。
そもそも日本語RAGとは?LangChainが必要な理由
RAG(Retrieval-Augmented Generation)は、外部知識ベースから関連情報を取得し、それをLLMの入力として活用することで、より正確で信頼性の高い回答を生成する技術です。
従来のLLMは学習データの知識に依存しますが、RAGなら自社ドキュメント、製品マニュアル、顧客データなどの独自情報を直接参照させることができます。これにより、ハルシネーション(LLMが事実でない情報を生成してしまう現象)を大幅に削減できるのです。
LangChainが重宝される理由は、複雑なRAGパイプラインを簡潔に構築できるフレームワークだからです。特に日本語処理においては、分かち書きやトークン化など複数のステップが必要ですが、LangChainを使えば数行のコードで実装できます。
前提条件と環境構築
このチュートリアルを進める前に、以下の環境が整っていることを確認してください。
- Python 3.9以上
- pip(Pythonパッケージマネージャー)
- Anthropic のAPIキー(console.anthropic.comで取得可能)
- 基本的なPythonの知識
まず、必要なライブラリをインストールします。
pip install langchain langchain-anthropic langchain-community faiss-cpu python-dotenv
各ライブラリの役割は以下の通りです。
- langchain:LLMアプリケーション開発フレームワーク
- langchain-anthropic:Claude統合用プラグイン
- langchain-community:ベクトルストアなど外部サービス連携
- faiss-cpu:高速ベクトル検索ライブラリ
- python-dotenv:環境変数管理
次に、プロジェクトディレクトリに.envファイルを作成し、APIキーを設定します。
ANTHROPIC_API_KEY=your-api-key-here
ステップ1:日本語テキストの準備と分割
RAGの第一段階は、知識ベースとなるテキストを準備することです。このチュートリアルでは、サンプルドキュメントを用意します。
from langchain.text_splitter import CharacterTextSplitter
from langchain.document_loaders import TextLoader
# サンプルドキュメント(実際にはテキストファイルを読み込むことも可能)
sample_documents = [
"弊社の製品『CloudSync Pro』は、クラウドストレージとローカルファイルを自動的に同期するソフトウェアです。",
"CloudSync Proは Windows、Mac、Linux の3つのプラットフォームに対応しています。",
"サポートについては、メール(support@example.com)または電話(0120-XXX-XXXX)でお問い合わせいただけます。",
"CloudSync Pro のライセンス料金は、個人向けが月額980円、企業向けが月額4,980円です。"
]
# テキストを適切なサイズに分割
text_splitter = CharacterTextSplitter(
chunk_size=200,
chunk_overlap=50,
separator="。"
)
docs = []
for text in sample_documents:
split_docs = text_splitter.split_text(text)
docs.extend(split_docs)
print(f"分割後のドキュメント数:{len(docs)}")
日本語処理のポイントは、文末の句読点(。)で分割することです。英語の場合は単語単位で分割しますが、日本語は文字数と句点を考慮することが重要です。
ステップ2:ベクトル埋め込み(Embeddings)の生成
テキストを検索可能にするため、ベクトル埋め込みに変換する必要があります。LangChainではOpenAI Embeddings などが一般的ですが、ここではHuggingFace の日本語特化モデルを使用します。
from langchain_community.embeddings import HuggingFaceEmbeddings
# 日本語対応の埋め込みモデルを初期化
embeddings = HuggingFaceEmbeddings(
model_name="intfloat/multilingual-e5-small"
)
# テキストをベクトル化
embedded_texts = embeddings.embed_documents(docs)
print(f"ベクトル次元数:{len(embedded_texts[0])}")
intfloat/multilingual-e5-small は、日本語を含む多言語対応の高速埋め込みモデルです。これにより、日本語テキストを384次元のベクトルに変換できます。
ステップ3:ベクトルストアの構築
生成したベクトルを高速に検索するため、ベクトルストアに保存します。FAISS(Facebook AI Similarity Search)は軽量で高速な選択肢です。
from langchain_community.vectorstores import FAISS
# FAISSベクトルストアを初期化
vectorstore = FAISS.from_texts(
texts=docs,
embedding=embeddings
)
# ベクトルストアをローカルに保存
vectorstore.save_local("vector_store")
print("ベクトルストアの保存完了")
これにより、テキスト検索時には全文を走査するのではなく、効率的にベクトル距離で関連度の高い情報を取得できるようになります。
ステップ4:LangChain × Claude によるRAG パイプラインの実装
ここが本チュートリアルの核となる部分です。保存したベクトルストアとClaudeを連携させ、ユーザーの質問に対して知識ベースを参照した回答を生成します。
from langchain_anthropic import ChatAnthropic
from langchain.chains import RetrievalQA
from langchain.prompts import PromptTemplate
import os
from dotenv import load_dotenv
load_dotenv()
# 保存されたベクトルストアを読み込み
vectorstore = FAISS.load_local(
"vector_store",
embeddings
)
# Claude モデルを初期化
llm = ChatAnthropic(
model="claude-3-5-sonnet-20241022",
api_key=os.getenv("ANTHROPIC_API_KEY"),
temperature=0.7
)
# RAG用のプロンプトテンプレートを定義
prompt_template = PromptTemplate(
input_variables=["context", "question"],
template="""以下の知識ベースを参照して、質問に日本語で答えてください。
知識ベース:
{context}
質問:{question}
回答:"""
)
# RetrievalQAチェーンを構築
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=vectorstore.as_retriever(search_kwargs={"k": 3}),
prompt=prompt_template,
return_source_documents=True
)
# 質問を入力
question = "CloudSync Pro の価格と対応プラットフォームは?"
result = qa_chain.invoke({"query": question})
print("質問:", question)
print("回答:", result["result"])
print("参照ドキュメント:", result.get("source_documents", []))
このコードのポイントは、retriever=vectorstore.as_retriever(search_kwargs={“k”: 3}) の部分です。ユーザーの質問に対し、ベクトルストアから最も関連性の高い上位3件のドキュメントを取得し、Claudeへの入力に含めます。
ステップ5:対話的な質問応答システムへの拡張
単一の質問応答だけでなく、複数の質問に対応する対話システムに拡張することで、ユーザーエクスペリエンスが大幅に向上します。
from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationalRetrievalChain
# メモリを初期化(会話履歴を保持)
memory = ConversationBufferMemory(
memory_key="chat_history",
return_messages=True
)
# ConversationalRetrievalChainで対話機能を追加
conversational_qa = ConversationalRetrievalChain.from_llm(
llm=llm,
retriever=vectorstore.as_retriever(search_kwargs={"k": 3}),
memory=memory,
verbose=True
)
# 複数の質問をループで処理
questions = [
"CloudSync Pro とは何ですか?",
"対応OSを教えてください",
"サポート連絡先はどこですか?"
]
for question in questions:
result = conversational_qa.invoke({"question": question})
print(f"\n質問:{question}")
print(f"回答:{result['answer']}")
ConversationalRetrievalChain により、前回の会話を記憶して、次の質問に文脈を反映させることができます。これにより、「対応OS を教えてください」という省略的な質問に対しても「CloudSync Pro の対応OS は…」と明確に答えられるようになります。
ステップ6:実装の検証とトラブルシューティング
構築したRAGシステムの精度を確認することは非常に重要です。以下のポ