0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

LangChainで始める生成AI活用:簡易チャットボットを作ってみた

0
Posted at

はじめに

前に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キーの準備

  1. OpenAI Platformにアクセス
  2. アカウント作成・ログイン
  3. 「API keys」から新しいキーを作成
  4. 作成されたキーをコピー(一度しか表示されないので注意
  5. 発行した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アプリケーションを効率的に開発できることが分かりました。
色々と面白そうです!

参考資料

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?