LangChainでRAGシステム構築に役立つ10の必須コンポーネント

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4068926/118b470f-784a-4940-801d-85500919ff29.png)

LangChainは、大規模言語モデル（LLM）を活用したアプリケーション開発をシンプルにするための堅牢なフレームワークです。その多機能なコンポーネントにより、外部のドキュメントベースとLLMを組み合わせる「検索拡張生成（Retrieval Augmented Generation, RAG）」システムなど、多様なワークフローへの統合が可能です。これにより、最新の情報や関連性の高いデータをドキュメントベースから取得し、より正確かつ文脈に即した回答を実現できます。

この記事では、LangChainを活用してRAGシステムを構築する際に知っておきたい10の主要コンポーネントを解説します。

---

## 📂 1. ドキュメントローダー（Document Loaders）

**ドキュメントローダー**は、TXTやPDF、Webページ、CSVなど、様々なソースからデータを取り込むためのLangChainコンポーネントです。ストレージシステムやデータベースからのAPI経由でのファイル読み込みもサポートしています。代表的な例には、*PyPDFLoader*、*UnstructuredFileLoader*、*WebBaseLoader*などがあります。

## ✂️ 2. テキストスプリッター（Text Splitters）

**テキストスプリッター**は、大きなドキュメントをより扱いやすい「チャンク（chunk）」に分割する役割を担います。これにより、効率的な処理や高速なインデックス化が可能になります。LangChainのテキストスプリッターは、チャンクサイズのカスタマイズやチャンク間のオーバーラップ（文脈の損失防止）もサポートしています。主な例は*RecursiveCharacterTextSplitter*や*TokenTextSplitter*です。

## 🔢 3. エンベディング（Embeddings）

**エンベディング**は、テキストを数値ベクトル（高次元ベクトル）に変換し、意味的な特徴を保持するための手法です。RAGシステムでは、エンベディングが類似検索の基盤となります。LangChainは、OpenAIのAPIやHugging FaceのSentence Transformersなど、主要なエンベディングモデルとの連携をサポートしています。クラス例は*OpenAIEmbeddings*や*HuggingFaceEmbeddings*です。

## 🗄️ 4. ベクターストア（Vector Stores）

**ベクターストア**は、エンベディングを保存・検索するためのコンポーネントです。類似検索の基盤となるベクターデータベース（例：*Pinecone*、*Chroma*、*FAISS*）を管理するための専用コンポーネントが用意されています。

## 🔍 5. リトリーバー（Retrievers）

**リトリーバー**はRAGシステムの中核となるコンポーネントで、ベクターストアから入力クエリに関連するチャンクを検索・取得します。LangChainでは、スパース検索とダイブ検索を組み合わせたハイブリッド検索など、柔軟なチューニングが可能です。代表的なクラスは*SimilarityRetriever*や*HybridRetriever*です。

## 🤖 6. LLMラッパー（LLM Wrappers）

**LLMラッパー**は、RAGシステムでテキスト生成を行うLLMとのインターフェースです。OpenAIのGPTモデルやAnthropicのClaudeモデル、Hugging Faceのローカル事前学習済みモデル（例：*HuggingFaceHub*）など、多様なモデルをAPI経由で呼び出せます。

## ⛓️ 7. チェーン（Chains）

**チェーン**は、複数のNLPコンポーネントを組み合わせてワークフローを構築するLangChainのキー要素です。例えば、リトリーバーとLLMを連携させて、検索した知識をもとに回答を生成する「質問応答チェーン（question-answering chain）」などがあります。代表的なクラスは*RetrievalQA*や*ConversationalRetrievalChain*です。

## 🧠 8. メモリ利用（Memory Usage）

**メモリ利用**コンポーネントは、チャットベースのRAGシステムで、会話の状態や文脈を複数回のやり取りにわたって管理するために不可欠です。*ConversationBufferMemory*や*VectorStoreMemory*などの抽象化クラスが用意されています。

## 🛠️ 9. インタラクション・ツール＆エージェント（Interaction Tools & Agents）

**インタラクション・ツール＆エージェント**は、RAGシステム内のLLMが外部システムと連携して、より複雑なタスクに対応するための高度なコンポーネントです。*Tool*や*ZeroShotAgent*などのクラスが利用されます。

## 📊 10. 評価（Evaluation）

**評価**は、RAGパイプラインの性能を測定・改善するためのプロセスです。LangChainの*QA Eval Chain*などのコンポーネントを利用し、検索・生成メカニズムのチューニングやベンチマークが可能です。

## 🧑‍💻 実践例：RAGワークフローをPythonで実装

以下は、LangChainの主要コンポーネントを組み合わせた簡易的な質問応答RAGワークフローのPythonコード例です。

```python
from langchain.document_loaders import TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import FAISS
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI

# 1. ドキュメントの読み込み
loader = TextLoader("sample.txt")
documents = loader.load()

# 2. ドキュメントの分割
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
chunks = text_splitter.split_documents(documents)

# 3. チャンクのエンベディング化とベクターストアへの保存
embeddings = OpenAIEmbeddings()
vector_store = FAISS.from_documents(chunks, embeddings)

# 4. リトリーバーの初期化
retriever = vector_store.as_retriever(search_type="similarity", search_kwargs={"k": 3})

# 5. QAチェーンの構築
llm = OpenAI(model="gpt-3.5-turbo")
qa_chain = RetrievalQA.from_chain_type(llm=llm, retriever=retriever, return_source_documents=True)

# 6. 質問の実行
query = "ドキュメントの主なポイントは？"
result = qa_chain.run(query)

# 7. 結果の表示
print("回答:", result["result"])
print("ソース:", [doc.metadata["source"] for doc in result["source_documents"]])
```

**注意点：**
- ノートブックで実行する場合、`!pip install -U langchain-community`で最新版LangChainをインストールしてください。
- `sample.txt`など、独自のテキストドキュメントが必要です。
- *OpenAIEmbeddings*など一部クラスはOpenAI APIキーが必要です。

---

LangChainのこれらのコンポーネントを活用することで、RAGシステムの設計・構築がより簡単かつ効果的になります。ぜひ実践してみてください！