top of page

【note更新!】LangChain始めました!〜初心者だって楽に大規模言語モデル(LLM)を実装したい〜

  • iLect
  • 7月10日
  • 読了時間: 8分
ree

近年、ChatGPTをはじめとする大規模言語モデル(LLM)の進化は目覚ましく、私たちの生活やビジネスに大きな変化をもたらしています。しかし、「LLMを自分のアプリケーションに組み込みたいけど、何から始めればいいのかわからない…」と感じている方も多いのではないでしょうか?

そんなLLM実装初心者にもおススメしたいのがLangChainです!今回は、LLMの実装を劇的に簡単にしてくれる強力なツール、LangChainをご紹介します。

  • LLM実装、何が大変なの?

  • LangChainがあなたのLLM実装を楽にしてくれる

  • LangChain実装 超入門編


LLM実装、何が大変なの?

LLM実装に取りかかると、いくつか壁にぶつかります。


  1. プロンプトエンジニアリングの複雑さ:LLMから期待する回答を得るためには、適切な指示(プロンプト)を与えることが非常に重要です。しかし、このプロンプトを効果的に設計するのは意外と難しいものです。最近ではこのプロンプト自体を生成AIに手伝ってもらうことも多かったりします。

  2. 外部データとの連携:LLMは学習したデータに基づいた知識を持っていますが、常に最新の情報や、社外秘データなどの独自データにアクセスできるわけではありません。そのため、いわゆるネット上などで検索すればある程度出てくる程度の「一般的な知識」を元に回答を生成することが多いのです。ビジネス活用などを目指す際に「ChatGPTって思ってたより使い勝手が悪いな」と感じる原因のひとつであったりします。このギャップを解消するためにLLMは「適切な外部データ」と連携する必要があるのです。

  3. 複数のLLM機能の組み合わせ:LLMは日々進化しており、特定のタスクに特化したモデルや、汎用的に高い性能を発揮するモデルなど、様々な種類が登場しています。単一のLLMでは精度が上がらないタスクでも、複数のLLMを連携させることで精度を向上させることが望めます。

これらをイチから自力で実装しようとすると、かなりの時間と労力がかかります。


LangChainがあなたのLLM実装を楽にしてくれる

LangChainは、LLMアプリケーション開発のためのフレームワークであり、上記のような課題を解決し、LLMの実装を驚くほど簡単にしてくれます。

LangChainを使う主なメリットは以下の通りです。


1.プロンプト管理の効率化

LangChainは、プロンプトのテンプレート化や、複数のプロンプトを組み合わせる機能を提供します。これにより、複雑なプロンプトも簡単に管理・再利用できるようになり、プロンプトエンジニアリングの試行錯誤が格段に楽になります。


2.外部ツールとの連携を容易に

LLMの能力を最大限に引き出すためには、ウェブ検索、データベース、APIなどの外部ツールと連携することが不可欠です。LangChainは、これらの外部ツールとLLMをシームレスに接続するための豊富な機能(エージェント、ツールなど)を提供します。これにより、LLMが「自分で考えて」必要な情報を取得し、タスクを完了するような、まるで人間のような振る舞いをさせることができます。


3.チェーン構造によるワークフローの構築

LangChainの名の通り、複数のLLM機能や外部ツールを「チェーン」のように連結し、一連の複雑なワークフローを構築することができます。例えば、「ユーザーの質問を受け取る→質問に関連する情報をウェブ検索で取得する→取得した情報を元にLLMが回答を生成する」といった一連の流れを、コード数行で実装することが可能になります。


では、どのように実装するのか試してみましょう。今回の実装では特に「3.チェーン構造によるワークフローの構築」について実感していただくために一番シンプルなLLMの実装例をご紹介します。


LangChain実装 超入門編


準備

以下2つを準備していることを想定して以下を実装していきます。

  • APIキー :OpenAI

  • 実装環境 :GoogleClabratory


実装内容の確認

今から「料理名を入力すると材料とレシピを教えてくれる」生成AIを実装していきます。

LLM実装に必要な主要なパーツとして、

  • プロンプトの定義 :LLMに「こういうことをして!」と指示するパーツ

  • モデルの定義 :LLM本体、今回はレシピを考えてくれる脳みそ部分

  • 出力形式の定義 :モデルが出力した結果を使いやすい形式に整えるためのルール

があります。

これらを下の図のようなイメージで一連の流れとしてつなげるように実装していきます。

ree

APIキーの管理方法

GoogleColaboratoryでAPIキーを使用する際はセキュリティリスクの観点から「シークレット機能」を使用することを強く推奨します。以下の実装についても「シークレット機能」を使用していることが前提となったコードとなっておりますのでご注意ください。


【シークレットへのAPIキー登録方法】

①左のアイコンから「シークレット」を開く。

②「新しいシークレットを追加」をクリック。

③プログラム内で使用する名称を「名前」に入力(GOOGLE_API_KEY)

④所持しているAPIキーを「値」に入力(OpenAIのAPIキー)

⑤「ノートブックからのアクセス」を有効にする

ree

実装

  1. 必要なライブラリのインストール・インポート

始めに実装に必要なライブラリを準備します。


!pip install langchain_openai
from google.colab import userdata
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from pydantic import BaseModel, Field
  1. APIキーの取得

「シークレット機能」に登録したAPIキーを「API_KEY」という変数に用意しておきます。


# API_KEYの取得
API_KEY = userdata.get("GOOGLE_API_KEY")

# 取得できていなかった時にメッセージを表示
if API_KEY is None:
    raise ValueError("OPENAI_API_KEYが設定されていません。")
  1. 必要なパーツの定義

前述した「プロンプト」「モデル」「出力形式」をそれぞれ定義していきます。


# プロンプト(指示)の定義
prompt = ChatPromptTemplate.from_template("{dish} のレシピを考えてください。")

# モデルの定義
model = ChatOpenAI(model="gpt-4o-mini", api_key=API_KEY)

# 出力形式の定義
class Recipe(BaseModel):
    ingredients: list[str] = Field(description="レシピの材料")
    steps: list[str] = Field(description="レシピの手順")

それぞれ定義した内容を解説していきます。



プロンプト

ree





ChatPromptTemplate.from_template():プロンプトのテンプレートを作成するクラス

丸かっこの中にAIへの指示文のテンプレートを設定することができます。

今回は「"{dish}のレシピを考えてください。"」とAIへの指示を設定しています。{dish}の部分は「ここに後で具体的な料理名が入りますよ」という目印です。


モデル

ree





  • ChatOpenAI():OpenAIのチャットAPIを呼び出すためのクラス

    • model="gpt-4o-mini":使用するモデルの種類の指定

    • api_key=API_KEY:APIキーの認証

なお、「gpt-4o-mini」は比較的新しい、コンパクトなモデルです。OpenAIでは他にも様々なモデルが提供されていますので、ぜひどのようなモデルがあるか調べてみてください。


出力形式

ree





AIがレシピを回答する際に「どんな形(フォーマット)で教えてほしいか」を設定するクラスを定義しています。

今回は「AIがレシピを回答するときには【材料のリスト】と【手順のリスト】の2つを作ってね」といった意味合いになります。

  • classRecipe(BaseModel)Recipeという名前でクラスを定義

    • BaseModelRecipeが継承しているクラスPythonでデータの形をきっちり定義するのに便利な設定です。

    • ingredients:list[str]:データの項目名とデータ形式を設定この場合、ingredientsという名前のデータは「文字列を要素とするリスト」の形式であると設定しています。

Field(description="レシピの材料"):項目の説明を設定


この場合、「レシピの材料」であることをAIに対して説明するためのものです。AIがこの情報を見て、どのようなデータを生成すべきかを理解するのに役立ちます。



  1. パーツを連結して「Chain」を作成


# 上記3つの機能を連結
chain = prompt | model.with_structured_output(Recipe)
  • prompt|model:「|」で複数の処理をつなげる

  • with_structured_output():モデルの出力を定義するメソッド出力形式を定めた「Recipe」クラスをここで設定しています。


これで図のような3つの処理の連結が完成です。

ree






  1. 作成した「Chain」を動かしてみる


# モデルの実行
DISH = input("レシピを知りたい料理名:")
output = chain.invoke({"dish": DISH})

# 結果を表示
print(f"{output.ingredients}\n{output.steps}")
  • input("レシピを知りたい料理名:"):ユーザーからの入力を受け取る実行するとセルの下にこのような出力が表示されるので任意の料理名を入力して「Enterキー」を押してください

ree
  • invoke()chainに入力を渡して、内にある処理を順番に実行するメソッド今回はプロンプト生成・モデル処理・出力の整形といった各ステップを実行します。

  • {"dish":DISH}:プロンプトのテンプレートにある可変部分への入力指示プロンプトのテンプレートを設定した際に「ここに後で具体的な料理名が入りますよ」という目印(dish)にinputで入力した料理名が入ります。


print()によって必要な材料と調理手順が表示されたら見事成功です!(以下はは出力の一例です。)


['玉ねぎ 1個',
 'にんじん 1本',
 'じゃがいも 2個',
 '鶏肉 または 牛肉 300g',
 'カレールウ 1箱 (約100g)',
 '水 800ml',
 '油 大さじ2',
 '塩 少々',
 'こしょう 少々']

['玉ねぎを薄切りにする。',
 'にんじんを乱切りにする。',
 'じゃがいもは皮をむいて一口大に切る。',
 '鶏肉または牛肉を一口大に切る。',
 '鍋に油を熱し、玉ねぎを透明になるまで炒める。',
 '肉を加えて表面が白くなるまで炒める。',
 'にんじんとじゃがいもを加え、軽く炒める。',
 '水を加え、煮立たせる。',
 'アクを取り除き、中火で約15分煮る。',
 'カレールウを加え、溶かしながらよく混ぜる。',
 'さらに10分煮込んで、とろみが出るまで煮続ける。',
 '塩とこしょうで味を整える。',
 'ご飯と一緒に盛り付けて完成。']

LLM実装の第一歩は意外と簡単に実現できたのではないでしょうか?


実のところLangChainの本領発揮はまだこれからです!次の記事では外部データとの連携にフォーカスしてRAGをLangChainで実装していきたいと思います!



LangChainは、LLMを使ったアプリケーション開発を「より簡単に」「より賢く」「より多機能に」するためのフレームワークです。LLMの力を引き出し、現実世界の問題解決に役立つAIアプリケーションを構築したい初心者の方にとって、非常に強力な味方となるでしょう。

この記事がLLMアプリケーション開発に挑む皆様の助けになれば幸いです。





本記事はiLectが提供する新講座【ゼロから始めるRAG:開発・改善・運用まで】から一部抜粋したものです。講座内ではさらに実践的な内容を経験豊富な講師・メンターのサポートのもと学ぶことができます。

ree

コメント


bottom of page