okpy

Pythonエンジニア兼テックリーダーが、多くのプロジェクトとチーム運営から得た実践的な知識を共有するブログです。

PythonでChatGPT活用、まだ手作業でプロンプトを書いていますか? `langchain`で開発を爆速化しよう!

PythonでChatGPT活用、まだ手作業でプロンプトを書いていますか? langchainで開発を爆速化しよう!

📝 TL;DR (3行要約)

langchainは、ChatGPTのような大規模言語モデル(LLM)を使ったアプリ開発を劇的に簡単にするための「道具箱(ツールキット)」です。 複数の処理を鎖(chain)のようにつなぎ、複雑なタスク(例: PDFの内容を読み込んで質問に答える)を自動化できます。 これを使えば、LLMのAPIを直接扱うよりも、はるかに少ないコードで高機能なAIアプリケーションを構築できます。


1. 🤔 一体langchainとは何?(核心的な役割と主な使用例)

最近、ChatGPTをはじめとする大規模言語モデル(LLM)が大きな話題ですよね。Pythonを使えば、これらのAIに様々な仕事をお願いできます。しかし、少し複雑なことをさせようとすると、途端にコードがごちゃごちゃしてきませんか?

「ユーザーからの質問に、手元の資料を参考にして答えさせたい」 「ウェブで最新情報を検索させて、その結果を要約させたい」

こんな時、APIと直接やり取りするだけでは、たくさんの「お膳立て」が必要になり、非常に手間がかかります。ここで登場するのが、今回ご紹介するlangchainです!

  • 核心的な役割: LLMの超有能な「アシスタント」

langchainの役割を理解するために、一つ比喩を使ってみましょう。

LLM(ChatGPTなど)を、「世界中の知識を持つが、一度に一つの指示しかこなせない天才シェフ」だと想像してください。このシェフに「最高のカルボナーラを作って」と頼めば、素晴らしい一皿をすぐに作ってくれます。これは、LLMに「〇〇について教えて」と単純な質問をするのと同じです。

では、「前菜にカプレーゼ、メインにカルボナーラ、デザートにティラミスという構成で、ディナーコースを準備して」と頼んだらどうでしょう?天才シェフは少し困ってしまいます。彼は一度に一つの料理しか作れないからです。コース料理を作るには、誰かが手順を考え、食材を準備し、適切なタイミングでシェフに指示を出す必要があります。

この「コース料理のレシピを考え、シェフの作業を管理する超有能なアシスタント(スーシェフ)」こそが、langchainなのです。

langchainは、 1. レシピの作成(プロンプトテンプレート): シェフへの指示書(プロンプト)を、再利用可能なテンプレートとして管理します。 2. 食材の準備(データ連携): 外部のデータ(PDF、ウェブサイト、データベースなど)をシェフが調理しやすい形に整えます。 3. 調理手順の管理(チェーン): 「まず前菜を作る」「次にメインを作る」といった一連の作業の流れ(チェーン)を定義し、自動で実行します。 4. 特殊な調理器具の提供(エージェント): シェフが自分で「Google検索」や「電卓」といった外部ツールを使えるように、道具を提供し、使い方を教えます。

このように、langchainはLLMという天才シェフの能力を最大限に引き出し、単なる「物知りなAI」から、複雑なタスクをこなす「自律的な問題解決エージェント」へと進化させるための、強力なフレームワークなのです。

  • 主な使用例

では、具体的にlangchainはどのような場面で活躍するのでしょうか?代表的な例を3つ見てみましょう。

  1. 💬 RAG (Retrieval-Augmented Generation) による社内文書チャットボット これが最も代表的で強力な使用例です。あなたの会社に、大量のマニュアルや仕様書がPDFやWord文書で眠っているとします。新入社員が「〇〇の申請方法を教えて」と質問したとき、これらの文書から答えを探すのは大変ですよね。

    langchainを使えば、これらの文書をAIが読み込める形(VectorDBなど)で「記憶」させることができます。そして、ユーザーから質問が来た際に、 ① 質問に最も関連性の高い部分を文書データベースから検索(Retrieval) ② 見つけてきた文書の内容をヒントとしてLLMに渡し、「この情報を元に回答してください」とお願いする ③ LLMがその情報に基づいて自然な文章を生成(Generation) という流れを自動で実行するチャットボットを簡単に作れます。これにより、ChatGPTが元々知らないはずの社内情報についても、正確に答えられるようになります。

  2. 🤖 思考するAIエージェント (Agent) LLMに単純なタスクを依頼するのではなく、「目的」だけを与えて、達成までの道のりをAI自身に考えさせるのが「エージェント」です。

    例えば、「今日の東京の天気予報を調べて、その情報に基づいて友人に送るランチのお誘いメールを書いて」というタスクをlangchainのエージェントに与えたとします。するとエージェントは、 ①「天気予報を調べる」というタスクを達成するためには「ウェブ検索」ツールが必要だと判断する。 ② 実際にウェブ検索ツールを使って「今日の東京の天気」を検索する。 ③ 得られた「晴れ、最高気温25度」という情報と、元の目的「ランチのお誘いメール作成」を組み合わせて、最終的なメール文面を生成する。 といった思考と行動を自律的に行います。langchainは、LLMに様々なツール(Google検索、Python実行環境、APIなど)を使わせるための「接着剤」の役割を果たし、まるで人間のように考えて行動するAIを実現します。

  3. 📚 長文の要約・分析 LLMには一度に入力できる文字数(トークン数)に上限があります。そのため、何百ページもあるような長いPDFや、ウェブサイトの記事全体を一度に要約させることはできません。

    langchainには、このような長文を扱うための便利な機能(Summarization Chain)が用意されています。これは、 ① 長い文章を、LLMが処理できるサイズのかたまり(チャンク)に自動で分割する。 ② 分割したチャンクを一つずつLLMに渡して、それぞれの中間的な要約を作成させる。 ③ すべての中間的な要約が完成したら、それらをさらにまとめて最終的な全体の要約を生成する。 という多段階の処理を自動で行ってくれます。これにより、人間が手作業で分割・要約を繰り返す手間を省き、どんなに長い文章でも効率的に要約することが可能になります。

これらの例からわかるように、langchainは「LLMに何かをさせる」ためのあらゆる面倒な準備や手順を肩代わりしてくれる、非常に頼もしいライブラリなのです。


2. 💻 インストール方法

langchainのインストールは、他のPythonライブラリと同様にpipコマンドで簡単に行えます。ここでは、langchain本体と、最も一般的に使われるOpenAIのモデルを扱うためのライブラリを一緒にインストールします。

ターミナル(WindowsならコマンドプロンプトPowerShell)で、以下のコマンドを実行してください。

pip install langchain langchain-openai

これだけで準備は完了です。とても簡単ですね!


3. 🛠️ 実際に動作するサンプルコード

それでは、langchainがどれだけシンプルに使えるのか、実際に動くコードを見てみましょう。 ここでは、langchainの最も基本的な機能であるLLMChainを使って、「指定したトピックに関するブログ記事のタイトルを3つ提案してもらう」プログラムを作成します。

⚠️ 事前準備 このコードを実行するには、OpenAIのAPIキーが必要です。以下のサイトから取得してください。 - OpenAI API Keys

取得したAPIキーは、コードに直接書き込むのではなく、環境変数として設定することが推奨されますが、ここでは簡単のため、コード内で直接設定する方法を示します。

import os
from langchain_openai import ChatOpenAI
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain

# 1. APIキーの設定
# 実行前に "YOUR_API_KEY" をご自身のAPIキーに置き換えてください。
# (セキュリティ上、本来は環境変数として設定することが推奨されます)
os.environ["OPENAI_API_KEY"] = "YOUR_API_KEY"

# 2. LLMモデルの準備
# ここでは、OpenAIの "gpt-3.5-turbo" モデルを使用します。
# temperatureは、数値が低いほど回答のランダム性が低くなります。
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0.7)

# 3. プロンプトテンプレートの作成
# {topic} という部分が、後で具体的な文字列に置き換えられる変数です。
prompt = PromptTemplate.from_template(
    "{topic}についてのブログ記事のタイトルを、読者の興味を引くようなキャッチーなものを3つ提案してください。"
)

# 4. チェーンの作成
# LLM(天才シェフ)とプロンプト(レシピ)を「鎖」で繋ぎます。
chain = LLMChain(llm=llm, prompt=prompt)

# 5. チェーンの実行
# プロンプトの{topic}に具体的な値を渡して、AIに指示を出します。
topic_idea = "Python初心者が学ぶべき次のステップ"
response = chain.invoke({"topic": topic_idea})

# 6. 結果の表示
print(f"トピック: 「{topic_idea}」")
print("--- AIが提案したブログタイトル ---")
# responseは辞書形式で、キー'text'にAIの生成した文章が入っています。
print(response['text'])

実行結果の例:

トピック: 「Python初心者が学ぶべき次のステップ」
--- AIが提案したブログタイトル ---
1. 「print('Hello, World!')の次は何?Python初心者がレベルアップするための最短ロードマップ」
2. 「ただ書けるだけじゃもったいない!Pythonistaになるための3つの実践的ネクストステップ」
3. 「『Pythonの基礎はわかった』あなたが次に挑戦すべきライブラリとプロジェクト完全ガイド」

どうでしょうか?わずかなコードで、AIとの対話を見事に構造化できているのがわかると思います。これがlangchainの力です。


4. 🔍 コードの詳細説明

上記のサンプルコードが何をしているのか、少し詳しく見ていきましょう。コードを意味のあるかたまり(チャンク)に分けて解説します。

チャンク1: APIキーの設定とライブラリのインポート

import os
from langchain_openai import ChatOpenAI
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain

# 1. APIキーの設定
os.environ["OPENAI_API_KEY"] = "YOUR_API_KEY"
  • import: まず、langchainから必要な部品をインポートしています。ChatOpenAIはOpenAIのモデルを扱うための部品、PromptTemplateは指示書のテンプレートを作る部品、LLMChainはそれらを繋ぐ鎖の役割をする部品です。
  • os.environ[...]: これは、プログラムを実行している環境に「OPENAI_API_KEY」という名前の環境変数を設定しています。langchainをはじめ多くのAI関連ライブラリは、この名前の環境変数から自動でAPIキーを読み取るように作られています。これにより、大切なキーをコードの中に直接書かずに済み、安全性が高まります。(今回は説明のため直接代入していますが、将来的にはお使いのOSの機能で環境変数を設定する方法を学ぶことをお勧めします。)

チャンク2: LLMモデルの準備

# 2. LLMモデルの準備
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0.7)
  • ここでは、先ほどの比喩でいう「天才シェフ」を呼んできています。ChatOpenAIクラスのインスタンスを作成することで、プログラムからChatGPTのモデルと対話できるようになります。
  • model="gpt-3.5-turbo": 使用するAIモデルの種類を指定しています。gpt-3.5-turboは、コストと性能のバランスが良い人気のモデルです。他にもgpt-4など、より高性能なモデルを指定することも可能です。
  • temperature=0.7: これはAIの「創造性」や「奔放さ」を調整するパラメータです。0に近いほど、毎回同じような決まった答えを返しやすくなり(確実性が高い)、1に近いほど、より多様でクリエイティブな答えを返すようになります(ランダム性が高い)。今回はブログタイトルのような創造性が求められるタスクなので、少し高めの0.7に設定しています。

チャンク3: プロンプトテンプレートの作成

# 3. プロンプトテンプレートの作成
prompt = PromptTemplate.from_template(
    "{topic}についてのブログ記事のタイトルを、読者の興味を引くようなキャッチーなものを3つ提案してください。"
)
  • これが「レシピ」の部分です。AIへの指示書をテンプレートとして作成しています。
  • {topic}: この波括弧で囲まれた部分が「変数」です。後でこの{topic}の部分に具体的な文字列(例えば「AIの未来」や「美味しいパスタの作り方」など)を埋め込むことで、同じ指示書を使い回して様々なトピックのタイトルを生成させることができます。このようにプロンプトをテンプレート化することは、langchainの非常に基本的で強力な機能の一つです。

チャンク4: チェーンの作成と実行

# 4. チェーンの作成
chain = LLMChain(llm=llm, prompt=prompt)

# 5. チェーンの実行
topic_idea = "Python初心者が学ぶべき次のステップ"
response = chain.invoke({"topic": topic_idea})
  • chain = LLMChain(...): ここで、これまで準備してきた部品を一つに繋ぎ合わせます。LLMChainに、llm(天才シェフ)とprompt(レシピ)を渡すことで、一つの連続した処理の流れ(チェーン)が完成します。
  • chain.invoke(...): 作成したチェーンを実行する命令です。invokeメソッドの引数に辞書{"topic": topic_idea}を渡しています。これにより、langchainはプロンプトテンプレート内の{topic}"Python初心者が学ぶべき次のステップ"という文字列に置き換えてから、完成したプロンプトをLLMに送信してくれます。

チャンク5: 結果の表示

# 6. 結果の表示
print(f"トピック: 「{topic_idea}」")
print("--- AIが提案したブログタイトル ---")
print(response['text'])
  • chain.invokeが返すresponseは、いくつかの情報を含む辞書形式になっています。AIが生成したメインのテキストは、'text'というキーに対応する値として格納されています。
  • ここでは、そのresponse['text']を取り出して、コンソールに表示しています。

このように、langchainは「モデル」「プロンプト」「チェーン」といった役割の明確な部品を組み合わせることで、複雑になりがちなAIとのやり取りを、非常に整理された見通しの良いコードで記述できるようにしてくれるのです。


5. ⚠️ 注意点またはヒント

langchainは非常に便利ですが、初心者が陥りがちな罠や、知っておくと役立つヒントがあります。ここでは特に重要なものを2つだけご紹介します。

  1. ⚠️ 罠: 意図しないAPI料金の発生 langchainを使う上で最も注意すべき点は、APIの利用料金です。OpenAIなどのLLMは、APIを呼び出すたびに(つまり、AIに何かをお願いするたびに)料金が発生します。langchainは処理を自動化してくれる分、裏側でどれだけAPIが呼ばれているのかが見えにくくなることがあります。

    特に、先ほど紹介した「エージェント」や、複数のLLM呼び出しを伴う複雑なチェーンを使う場合、1回の実行で何十回もAPIを呼び出し、気づかないうちに高額な料金が発生してしまう可能性があります。

    【対策】

    • シンプルな処理から始める: まずは今回のようなLLMChainなど、API呼び出しが1回で済むような単純なチェーンから慣れていきましょう。
    • コスト管理を意識する: OpenAIのサイトで利用料金をこまめにチェックする習慣をつけましょう。
    • LangSmithの活用: langchainの開発元が提供しているLangSmithというツールを使うと、チェーンのどの部分で何回APIが呼ばれたかを視覚的に追跡・デバッグできます。開発が本格的になってきたら、導入を検討すると良いでしょう。
  2. 💡 ヒント: 出力の品質は「プロンプト」で決まる langchainはあくまでAIを使いやすくするための「フレームワーク(骨組み)」です。最終的にAIが生み出すアウトプットの質を決定づけるのは、あなたが書く「プロンプト(指示書)」です。

    サンプルコードのプロンプトを、例えば「{topic}のタイトルを3つ」のように非常にシンプルにすると、おそらくありきたりで魅力のないタイトルしか返ってこないでしょう。今回は「読者の興味を引くようなキャッチーなものを」という一文を加えることで、AIに対してより具体的な期待を伝え、結果の質を向上させています。

    【良いプロンプトのコツ】

    • 具体的であること: 「良い感じに」ではなく、「〇〇という観点で」「△△のような文体で」と具体的に指示しましょう。
    • 役割を与えること: 「あなたはプロのコピーライターです。その視点で…」のように、AIに役割(ペルソナ)を与えると、出力のトーンが安定しやすくなります。
    • 例を示すこと (Few-shot prompting): 良い例と悪い例をいくつかプロンプトに含めてあげることで、AIはあなたの意図をより正確に学習します。

    langchainを使いこなすことは、プロンプトエンジニアリングの技術を磨くこととほぼ同義です。ぜひ色々なプロンプトを試して、AIとの対話を楽しんでみてください。


6. 🔗 一緒に見ておくと良いライブラリ

langchainを学んだあなたが次に触れてみると、学習効果が非常に高いライブラリを一つご紹介します。

  • Streamlit Streamlitは、Pythonだけで驚くほど簡単にインタラクティブなWebアプリケーションを作成できるライブラリです。langchainでAIのロジック(バックエンド)を作り、Streamlitでユーザーが操作する画面(フロントエンド)を作る、という組み合わせは非常に強力です。

    例えば、langchainで作ったチャットボットのロジックを、Streamlitを使えばわずか数十行のコードでWeb上のチャット画面として公開できます。自分の作ったAIアプリが、実際にブラウザ上で動くのを見ると、プログラミングの楽しさが倍増すること間違いなしです。

    langchainで「AIの頭脳」を、Streamlitで「AIの顔」を作る、というイメージで、ぜひ次のステップとして挑戦してみてください。


7. 🎉 まとめ

今回は、LLMアプリケーション開発の強力な味方、langchainについてご紹介しました。

  • langchainは、LLMを「天才シェフ」、自身を「超有能なアシスタント」として、複雑なタスクの実行をサポートするライブラリであること。
  • 「RAGによるチャットボット」や「自律型エージェント」など、LLMの能力を飛躍的に高める様々な応用例があること。
  • LLMChainを使えば、「モデル」「プロンプト」といった部品を組み合わせて、簡単かつ構造的にAIとの対話を自動化できること。
  • 利用する際は「API料金」に注意しつつ、「プロンプトの工夫」が出力の質を左右する重要な鍵であること。

langchainを学ぶことは、単にAIを呼び出す方法を知るだけでなく、AIにどのように仕事を任せるか、その「思考のプロセス」を設計するスキルを身につけることに繋がります。

さあ、この記事を読み終えたあなたも、ぜひlangchainの世界に飛び込んでみましょう!

【今日の挑戦課題】 まずは、学んだことをすぐに試してみるのが上達への一番の近道です。 1. 記事中のサンプルコードをコピー&ペーストして、実際に動かしてみましょう。YOUR_API_KEYの部分を書き換えるのを忘れずに! 2. topic_ideaの変数を、あなたの好きなこと(例えば「趣味のキャンプ」や「最近読んだ漫画」など)に変えて実行し、結果がどう変わるか観察してみましょう。 3. さらに一歩進んで、PromptTemplateの中身を改造してみましょう。「タイトル」ではなく、「{topic}についてのブログ記事の、読者の心を掴む書き出しの文章を150字で作成してください。」のように、お願いする内容を変えてみてください。AIはあなたの期待に応えてくれるでしょうか?

この小さな一歩が、あなたをAIアプリケーション開発者へと導く大きな飛躍になります。楽しんで挑戦してみてくださいね!