LangChain を始める方法:実践ガイド
初めて LangChain のドキュメントを眺めた時のことを覚えています。まるで、半分しか理解できない言語で書かれた本ばかりの図書館に足を踏み入れたような気分でした。約束された内容は魅力的でした。LLM を連鎖させ、メモリやツールを追加し、実際のアプリケーションを構築する。しかし現実は、しっくりこない「Hello World」サンプルの連続でした。そこで、3ヶ月前の自分のためにこの記事を書いています。実際にうまくいった方法をお伝えします。
LangChain とは何か(そして誰が気にするべきか)
LangChain は、別の AI モデルではありません。これはフレームワークです。大型言語モデル上にアプリケーションを構築するためのスイスアーミーナイフのようなものだと考えてください。あなたがモデル(OpenAI、Anthropic、ローカルの Llama など)を持ち込み、LangChain がチェーン、エージェント、メモリ、ツールといったコネクタを提供します。対象となるのは、「PDF とチャットする」以上のことを目指し、注文を確認できるカスタマーサポートボットや、複数のソースを読んで要約を作成するリサーチアシスタントのようなものを構築したい開発者です。
Python に慣れており、LLM API を直接呼び出したことがあるなら、あなたは対象ユーザーです。スクリプトを書いたことがないなら、LangChain はクラッチとは何かを知る前にマニュアル車の運転を学ぶようなものです。まずは API から始めて、その後戻ってきてください。
セットアップ:私がつまずいた部分
正直に言うと、セットアップ自体は簡単ですが、細かい部分を読まなかったために1時間を無駄にしました。
ステップ 1:インストール
pip install langchain langchain-community langchain-openai
この langchain-community パッケージに、ほとんどの統合機能が含まれています。最初は langchain だけをインストールして、なぜ何も動かないのか不思議に思っていました。
ステップ 2:API キーの取得
LLM プロバイダーが必要です。私は最も簡単な方法である OpenAI を使いました。platform.openai.com にアクセスし、API キーを作成して、環境変数として設定します:
export OPENAI_API_KEY="sk-..."
ステップ 3:最初のチェーン
以下が最小限の「生きている」テストです:
from langchain.chat_models import ChatOpenAI
from langchain.schema import HumanMessage
llm = ChatOpenAI(model="gpt-4", temperature=0)
response = llm.invoke([HumanMessage(content="スペイン語で'Hello World'と言って")])
print(response.content)
「Hola mundo」と表示されれば成功です。
私が構築した実際のタスク(あなたが推測しなくて済むように)
タスク 1:ドキュメントに対するシンプルな Q&A ボット
50ページの PDF を読まずに質問したかったのです。典型的なユースケースです。以下がうまくいったパターンです:
from langchain.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.chains import RetrievalQA
# 読み込みと分割
loader = PyPDFLoader("my_report.pdf")
documents = loader.load()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
docs = text_splitter.split_documents(documents)
# 埋め込みと保存
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(docs, embeddings)
# Q&A チェーンの作成
qa = RetrievalQA.from_chain_type(
llm=ChatOpenAI(model="gpt-3.5-turbo", temperature=0),
chain_type="stuff",
retriever=vectorstore.as_retriever()
)
# 質問
answer = qa.run("セクション3の主な発見は何ですか?")
print(answer)
学んだこと: chunk_size と chunk_overlap は思っている以上に重要です。小さすぎると(500未満)モデルがコンテキストを失います。大きすぎると(2000以上)トークンを消費しすぎます。ほとんどのドキュメントでは、チャンクサイズ1000、オーバーラップ200に落ち着きました。
タスク 2:メモリ付き会話エージェント
シンプルな Q&A も良いですが、私が言ったことを覚えているチャットが欲しかったのです。ここで LangChain のメモリモジュールが威力を発揮します:
from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationChain
memory = ConversationBufferMemory()
conversation = ConversationChain(
llm=ChatOpenAI(model="gpt-3.5-turbo", temperature=0)
)