本記事では、LangChainを活用したチャットボット開発において重要なコアコンポーネントを深掘りします。各モジュールの役割やコード例を通じて、実装のポイントを詳しく解説します。
1. DocumentLoaderの役割と使い方
DocumentLoaderは、PDFやWord、HTMLなど様々な形式のドキュメントをロードし、テキスト抽出を行うモジュールです。LangChainにはUnstructuredPDFLoaderやBSHTMLLoaderなどがあり、用途に応じて選択可能です。
from langchain.document_loaders import UnstructuredPDFLoader
loader = UnstructuredPDFLoader("docs/manual.pdf")
docs = loader.load()
非日本語ドキュメントを扱う際は、事前に翻訳・要約ツールを利用すると効率的です。例えば、ファイル丸ごと翻訳・要約が可能なLanguiseを使うと、自動で日本語化しつつ要点を抽出できます。
2. TextSplitterによるテキスト分割戦略
TextSplitterは長文を適切なチャンクに分割し、ベクトル化・検索効率を高めるためのツールです。RecursiveCharacterTextSplitterやTokenTextSplitterなどがあり、chunk_sizeやoverlapを調整して最適化します。
from langchain.text_splitter import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=100)
chunks = splitter.split_documents(docs)
3. VectorStoreでの効率的な埋め込み管理
VectorStoreは、Embeddingモデルで生成したベクトルを永続化し、類似検索を可能にするストレージ層です。ChromaやFAISSなど複数の実装があり、用途やスケールに応じて選びます。
from langchain.vectorstores import Chroma
from langchain.embeddings.openai import OpenAIEmbeddings
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(chunks, embeddings, collection_name="knowledge")
4. Chain設計とPromptTemplateの活用
Chainは、LangChainにおける処理パイプラインの定義です。PromptTemplateと組み合わせることで柔軟かつ再利用性の高い設計が可能です。
from langchain import PromptTemplate, LLMChain
from langchain.chat_models import ChatOpenAI
template = "以下の情報をもとに、わかりやすく回答してください:\n{context}\n質問: {question}"
prompt = PromptTemplate(template=template, input_variables=["context", "question"])
llm = ChatOpenAI(model_name="gpt-4o", temperature=0)
chain = LLMChain(llm=llm, prompt=prompt)
5. ConversationalRetrievalChainとMemoryの組み合わせ
ConversationalRetrievalChainは、Retrievalと生成を統合したチェーンです。会話履歴を保持したい場合はMemoryオプションを有効にし、連続対話に対応します。
from langchain.chains import ConversationalRetrievalChain
qa_chain = ConversationalRetrievalChain.from_llm(
llm=llm,
retriever=vectorstore.as_retriever(top_k=3),
memory=None # 会話履歴を保持する場合はメモリオブジェクトを指定
)
まとめ
LangChainのコアコンポーネントを理解し、適切に組み合わせることで、堅牢かつ高精度なチャットボットを構築できます。次回は、各コンポーネントのパフォーマンスチューニングや運用ポイントを紹介します。