はじめに
前にLangChainを使って簡単なチャットボットを作ったので、メモがてら紹介したいと思います。
LangChainとは?
LangChainは、生成AIアプリケーションを簡単に開発するためのPythonライブラリ。生成AI(例:ChatGPTやClaudeなど)を簡単に呼び出し、より便利に利用することができるので様々なツールに使用されています。
ちなみに、Chainは「鎖」を意味し、様々なものを連鎖させて動かすことを表しています。
LangChainとPythonとの比較
例えば、Pythonだと
# OpenAI APIを直接使う場合
import openai
response = openai.ChatCompletion.create(
model="gpt-4o-mini",
messages=[
{"role": "system", "content": "あなたは親切なアシスタントです。"},
{"role": "user", "content": "カナダの首都を教えてください。"}
]
)
print(response.choices[0].message.content)
LangChainを使うと:
# LangChainを使う場合
from langchain_openai import ChatOpenAI
chat_model = ChatOpenAI(model="gpt-4o-mini")
result = chat_model.invoke("カナダの首都を教えてください。")
print(result.content)
このようにLangChainを使うとより直感的で拡張しやすいコードが書けるようになります。
LangChainで何ができるか?
次に、LangChainの主な機能を3つ紹介します。
1. プロンプトテンプレート管理
プロンプトをテンプレート化して再利用できます。
from langchain_core.prompts import ChatPromptTemplate
# テンプレートの定義
template = ChatPromptTemplate.from_messages([
("system", "あなたは{role}です。"),
("human", "{question}")
])
# 使い回せる
prompt1 = template.format(role="料理の先生", question="カレーの作り方は?")
prompt2 = template.format(role="旅行ガイド", question="京都のおすすめは?")
このコードでは、テンプレートに{role}と{question}という2つの変数を定義しています。
1つ目は「あなたは料理の先生です」+「カレーの作り方は?」というプロンプトを生成します。
2つ目は「あなたは旅行ガイドです」+「京都のおすすめは?」というプロンプトを生成します。
テンプレートの構造(system + human)は同じまま、中身だけを変えて使い回せるので、毎回プロンプト全体を書き直す必要がありません。
これにより、プロンプト管理が楽になり、コードの保守性が上がります。
2. チェーン(処理の連結)
複数の処理を繋げて、複雑なワークフローを構築できます。
# プロンプト → LLM → 出力解析 を一連の流れに
chain = prompt_template | chat_model | output_parser
result = chain.invoke({"input": "質問内容"})
3. RAG(Retrieval-Augmented Generation)
外部データを参照しながら回答を生成できます。
# ドキュメントを検索 → 関連情報をLLMに渡す → 回答生成
from langchain.chains import RetrievalQA
qa_chain = RetrievalQA.from_chain_type(
llm=chat_model,
retriever=vector_store.as_retriever()
)
answer = qa_chain.invoke("社内規定について教えて")
これらの機能により、単なるAPI呼び出し以上の高度なAIアプリケーションを構築できます。
今回作るもの:簡易チャットボット
次は、実際にLangChainを使って国の首都を教えてくれるシンプルなチャットボットを作ってみたので紹介します。
完成イメージ
ユーザー: 「カナダ」
ボット: 「カナダの首都はオタワです。」
環境準備
1. 仮想環境の作成(推奨)
Pythonの仮想環境を作成して有効化します。
# 仮想環境の作成
python -m venv venv
# 仮想環境の有効化(Windows)
venv\Scripts\activate
# 仮想環境の有効化(Mac/Linux)
source venv/bin/activate
2. 必要なライブラリのインストール
下記、requirements.txtの内容をコピペして、仮想環境が有効な状態でpip installでインストールしてください。
requirements.txt:
langchain-core
langchain-openai
インストール:
pip install -r requirements.txt
3. OpenAI APIキーの準備
- OpenAI Platformにアクセス
- アカウント作成・ログイン
- 「API keys」から新しいキーを作成
- 作成されたキーをコピー(一度しか表示されないので注意)
- 発行したAPIキーを環境変数
OPENAI_API_KEYに設定する
※すでにOpenAI APIを持っている方はそのまま上記5の処理をします。
環境変数の設定方法:
import os
# APIキーを環境変数に設定
os.environ["OPENAI_API_KEY"] = "APIキーをここに入力"
ここでAPIキーを記憶させます。
コード実装
それでは、実際にチャットボットを作っていきます。
from langchain_openai.chat_models import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
# 1. ChatModelの初期化
chat_model = ChatOpenAI(model="gpt-4o-mini")
# 2. プロンプトテンプレートの作成
prompt_txt = ChatPromptTemplate.from_messages(
[
("system", "あなたは親切なアシスタントです。"),
("human", "{country}の首都をおしえてください。"),
]
)
# 3. 出力パーサーの準備
output_parser = StrOutputParser()
# 4. チェーンの構築(処理の流れを定義)
chain = prompt_txt | chat_model | output_parser
# 5. 実行
result = chain.invoke({"country": "カナダ"})
print(result)
実行結果:
カナダの首都はオタワです。
ここで、LangChainは環境変数OPENAI_API_KEYに設定された値を自動で取得し動かしています。
コードの解説
それぞれのステップを詳しく見ていきます。
1. ChatModelの初期化
chat_model = ChatOpenAI(model="gpt-4o-mini")
役割: OpenAIのGPTモデルを使うための準備
ポイント:
-
model="gpt-4o-mini": コストパフォーマンスに優れたモデル - 他の選択肢:
gpt-4o,gpt-4-turboなど - APIキーは環境変数から自動的に読み込まれる
2. プロンプトテンプレートの作成
prompt_txt = ChatPromptTemplate.from_messages(
[
("system", "あなたは親切なアシスタントです。"),
("human", "{country}の首都をおしえてください。"),
]
)
役割: AIへの指示内容を定義
構成:
-
("system", "..."): AIの役割・性格を指定 -
("human", "{country}..."): ユーザーの質問({country}は変数)
メリット:
- プロンプトを再利用できる
- 変数部分だけ変えて何度も使える
- プロンプトの管理が楽になる
3. 出力パーサーの準備
output_parser = StrOutputParser()
役割: AIの出力を文字列として取り出す
なぜ必要?:
- LLMの出力は複雑なオブジェクト
-
StrOutputParser()で文字列だけを抽出 - そのまま
print()で表示できる
4. チェーンの構築
chain = prompt_txt | chat_model | output_parser
役割: 処理の流れを定義
|(パイプ)演算子の意味:
プロンプト作成 → LLMに送信 → 出力を解析
これはLangChainの重要な概念:
- 各処理を
|で繋げる - 左から右へ順番に実行される
- 前の処理の出力が次の処理の入力になる
5. 実行
result = chain.invoke({"country": "カナダ"})
役割: チェーンを実行して結果を取得
invoke()メソッド:
- 辞書形式で変数を渡す
-
{"country": "カナダ"}→ プロンプトの{country}に代入される - 最終的な結果が
resultに格納される
応用例:複数の国を調べる
少し応用して、複数の国の首都を調べてみましょう。
countries = ["カナダ", "オーストラリア", "ブラジル", "日本"]
for country in countries:
result = chain.invoke({"country": country})
print(f"{country}: {result}")
実行結果:
カナダ: カナダの首都はオタワです。
オーストラリア: オーストラリアの首都はキャンベラです。
ブラジル: ブラジルの首都はブラジリアです。
日本: 日本の首都は東京です。
テンプレートを使うことで、同じプロンプト構造を繰り返し使えるのがLangChainの強みです。
プロンプトをカスタマイズしてみる
システムメッセージを変更
# フレンドリーなアシスタント
prompt_friendly = ChatPromptTemplate.from_messages([
("system", "あなたは明るく元気なアシスタントです。絵文字も使ってください!"),
("human", "{country}の首都をおしえてください。"),
])
chain_friendly = prompt_friendly | chat_model | output_parser
result = chain_friendly.invoke({"country": "フランス"})
print(result)
実行結果:
フランスの首都はパリです!🇫🇷✨ とっても素敵な街ですよね!
より詳しい情報を求める
prompt_detailed = ChatPromptTemplate.from_messages([
("system", "あなたは地理の専門家です。"),
("human", "{country}の首都について、場所、人口、特徴を簡潔に教えてください。"),
])
chain_detailed = prompt_detailed | chat_model | output_parser
result = chain_detailed.invoke({"country": "ドイツ"})
print(result)
実行結果:
ドイツの首都はベルリンです。
- 場所: ドイツ北東部
- 人口: 約370万人
- 特徴: 歴史的建造物と現代文化が融合した都市。ベルリンの壁跡やブランデンブルク門が有名。
LangChainのメリット
従来の方法と比べて、LangChainを使うメリットをまとめます。
| 項目 | 従来の方法 | LangChain |
|---|---|---|
| コードの見やすさ | APIの詳細を毎回記述 | 高レベルな抽象化 |
| 再利用性 | プロンプトをコピペ | テンプレート化 |
| 拡張性 | 処理追加が大変 | チェーンで簡単に追加 |
| メンテナンス | 変更箇所が多い | 一箇所修正で対応 |
| 学習コスト | API仕様の理解が必要 | 直感的なAPI |
まとめ
この記事では、LangChainの基本的な使い方を学びました。
学んだこと:
- LangChainは生成AIアプリ開発を簡単にするライブラリ
- プロンプトテンプレートで再利用可能なコードを書ける
- チェーン(
|)で処理を繋げられる - 出力パーサーで結果を使いやすい形に変換できる
次のステップ:
- 会話履歴を保持するチャットボット
- RAG(文書検索 + AI回答)の実装
- Streamlitでのウェブアプリ化
LangChainを使えば、より高度で実用的なAIアプリケーションを効率的に開発できることが分かりました。
色々と面白そうです!