langchianlogo

LangChain入門(1) – Introduction – OpenAI/Gemini/Anthorpicを使ってみる

生成AIの分野が話題です。いろいろなモデルがリリースされていますが、それらを効果的に使うためのLangChainというライブラリも同時に注目されています。今回はLangChainを通して生成AIに触れていただくための教材を用意しました。

本記事はFuture Coders独自教材からの抜粋です。変化の早い分野なので記事の内容が古くなっている可能性もあります。ご注意ください。

はじめに

生成AIが話題です。本ドキュメントではLangChainについて主に説明をしてゆきます。

生成AIとは、AIが学習したデータを基に、テキストや画像、動画、音声など、さまざまなコンテンツを新たに生成する技術です。

代表的な生成AIには以下のようなものがあります。

  • ChatGPT = OpenAI社 (Microsoft)
  • Claude = Anthoropic社 (Amazon)
  • Gemini = Google社
  • Lhama = Meta社

一方、LangChainは生成AIを活用するためのライブラリであって、生成AIそのものではありません。その関係を図にすると以下のようになります。

quick1
LangChain入門(1) - Introduction - OpenAI/Gemini/Anthorpicを使ってみる 9

まずはこの区別をしっかりとつけることが大切です。

生成APIを直接実行してみる

LangChainを使わずに、直接サービスを利用してみましょう。これから紹介するサービス(ChatGPT, Gemini, Anthropic)を使用するには、いずれもアカウントを作成して、支払い方法を登録するなどの準備が必要になります。すべてのサービスで契約することに抵抗がある場合、どれか適当なサービスを選択して、実行するのはそのサービスだけで構いません。

ChatGPT

代表的な生成AIエンジンです。これをPythonから直接利用してみます。以下の説明はAPIキーを持っていることが前提となります。公式サイトからAPIキーを取得しておいてください。アカウントを作成してサインインし、クレジットカードなどで支払い方法を登録する必要があります。従量課金の前払い制です。APIを使用するためには、予め$5など適当な額を支払っておく必要があることに注意してください。

https://platform.openai.com/api-keys

取得したAPIキーは環境変数 OPENAI_API_KEY に保存しておいてください。

以下のコマンドでモジュールをインストールします。

py -m pip install openai --upgrade

以下のプログラムを実行してください。

from openai import OpenAI
client = OpenAI()

completion = client.chat.completions.create(
  model="gpt-4",
  messages=[
    {"role": "system", "content": "あなたはイタリア料理店のシェフです。料理教室も運営しています。"},
    {"role": "user", "content": "ジャガイモとチーズを使った簡単・おいしい料理のレシピを教えてください"}
  ]
)

print(completion.choices[0].message.content)

以下のような出力が得られました。

もちろんです。それならば、イタリアの伝統的なパティオ料理である「ゴルゴンゾーラとジャガイモのグラタン」をご紹介しましょう。乳製品とジャガイモの組み合わせは最高ですよ。

<材料 4人前>
- ジャガイモ:約800g
- ゴルゴンゾーラチーズ:150g
- ミルク:100ml
- 生クリーム:50ml
- バター:大さじ1
- 塩:適量
- 黒こしょう:適量
- パルメザンチーズ:50g

1. ジャガイモは皮を剥き、厚さ約3mmの薄切りにします。これを水に5分間さらして、余分な澱粉を取り除きます。

2. 鍋にミルクと生クリームを加えて温め、そこへゴルゴンゾーラチーズを入れて煮溶かします。料理の途中で味見をし、必要であれば塩で味を調えます。

3. 別のフライパンにバターを溶かし、そこに水気を切ったジャガイモを入れます。ジャガイモが透明になるまで中火で軽く炒めます。

4. 炒めたジャガイモに2.のゴルゴンゾーラソースを投入して混ぜ、全体を適度に塩こしょうで味を整えます。

5. 全体が混ざったら、耐熱皿に移し広げます。表面にパルメザンチーズを振りかけ、トースターまたはオーブンで約10分、チーズがとろけてきれいな焦げ色がつくまで焼きます。

6. チーズが溶け、全体がよく熱されたら完成です。

このグラタンは簡単ながらも風味豊かで、一度食べたら忘れられない美味しさです。ぜひ作ってみてくださいね。

Gemini

GeminiはGoogle社の生成AIです。これもPythonから実行してみましょう。Googleでも同様にAPIキーが必要になります。

以下のURLからキーを取得し、環境変数 GOOGLE_API_KEY に保存してください。

https://aistudio.google.com/app/apikey

intro1
LangChain入門(1) - Introduction - OpenAI/Gemini/Anthorpicを使ってみる 10

このAPIキーはプロジェクトに紐づける形となります。GCP(Google Cloud Platform)でプロジェクトを作ったことが無い場合は、画面の指示にしたがって生成AI用にプロジェクトを新規に作成してください。

モジュールをインストールします。ターミナル、コマンドプロンプトなどから以下のコマンドを実行します。

py -m pip install google-generativeai --upgrade

Jupyter notebookなどのファイルで実行する場合、行の先頭に!をつけるとコマンドを実行できます。ipynb形式のファイルで作業している場合、py -m pipでモジュールをインストールする際は先頭に!をつけてコマンドを実行してください。

環境変数が設定されているか確認します。

import os
os.getenv('GOOGLE_API_KEY')

正しく設定されていれば、キーの値が表示されます。

以下のコードを実行してください。

import google.generativeai as genai

gemini_pro = genai.GenerativeModel("gemini-pro")
prompt = "ジャガイモとチーズを使った簡単・おいしい料理のレシピを教えてください"
response = gemini_pro.generate_content(prompt)
print(response.text)

以下のような応答が得られました。

**ジャガイモチーズ焼き**

**材料:**

* ジャガイモ 500g
* チェダーチーズ 150g
* モッツァレラチーズ 150g
* バターまたはオリーブオイル 大さじ2
* 塩、コショウ 適量
* パルメザンチーズ(お好みで) 大さじ2

**作り方:**

1. ジャガイモは皮をむき、一口大に切る。鍋に湯を沸かし、塩を適量加えてジャガイモを柔らかく茹でる(約15分)。
2. オーブンを180℃(350°F)に予熱する。
3. オーブン対応の耐熱皿にバターまたはオリーブオイルを塗る。
4. 湯を切ったジャガイモを耐熱皿に入れ、塩とコショウで味付けする。
5. チェダーチーズとモッツァレラチーズをジャガイモの上にのせる。
6. パルメザンチーズを振りかける(お好みで)。
7. 180℃のオーブンで約20分、またはチーズが溶けてこんがりするまで焼く。

**ヒント:**

* ハーブやスパイスを振りかけて風味をプラスする(タイム、オレガノ、パプリカなど)。
* ベーコンやハムなどの肉を加えると、うま味と歯ごたえが増します。
* よりクリーミーな仕上がりになるように、ジャガイモをマッシュする前に少量の牛乳とバターを加えてください。
* 焼き上がったら、刻んだパセリを散らして彩りを添える。

ChatGPT(OpenAI)もGeminiも似たような応答が得られましたが、そのPythonのプログラムは大きく異なっていたことがわかります。

Anthropic

Anthropic社の生成AIも試してみましょう。

Anthropicのユーザガイドは以下のURLです。日本語のわかりやすい解説があります。必要に応じて参照してください。

https://docs.anthropic.com/ja/docs/quickstart-guide

以下のコマンドでモジュールをインストールします。

py -m pip install anthropic

APIキーを取得するために、アカウントを作成します。スマホを使った本人確認があります。$5分の無料枠が利用可能になります。

※今回無料枠が何故かエラーになったので、最小金額$5の前払いで課金して使用しました。

https://console.anthropic.com/create

APIキーは以下のURLから取得します。

https://console.anthropic.com/settings/keys

取得したキーは環境変数 ANTHROPIC_API_KEY に保存します。

環境変数が得られるか確認しておきましょう。

import os
os.environ["ANTHROPIC_API_KEY"]

以下がAnthropicの生成AIを実行するプログラムです。

import anthropic

client = anthropic.Anthropic()

message = client.messages.create(
    model="claude-3-opus-20240229",
    max_tokens=1000,
    temperature=0.0,
    system="あなたはイタリア料理店のシェフです。料理教室も運営しています。",
    messages=[
        {"role": "user", "content": "ジャガイモとチーズを使った簡単・おいしい料理のレシピを教えてください"}
    ]
)

print(message.content[0].text)

以下の結果がえられました。

ジャガイモとチーズを使った簡単でおいしい料理の一つに、「ポテトグラタン」があります。以下にレシピを紹介します。

材料(4人分):
- ジャガイモ 600g
- 生クリーム 200ml
- 牛乳 100ml
- チーズ(グリュイエールやエメンタールなど) 100g
- バター 20g
- 塩 小さじ1/2
- 黒こしょう 適量
- ナツメグ 少々

作り方:
1. ジャガイモは皮をむいて薄切りにします。
2. バターを塗ったグラタン皿に、ジャガイモを重ならないように並べます。
3. 生クリーム、牛乳、塩、黒こしょう、ナツメグを混ぜ合わせ、ジャガイモの上に注ぎます。
4. チーズを上に散らします。
5. 180℃に予熱したオーブンで、40〜50分焼きます。ジャガイモに火が通り、表面が golden brown になるまで焼いてください。
6. オーブンから取り出し、少し冷ましてから召し上がれ。

ポイント:
- ジャガイモは薄切りにすることで、火が通りやすくなります。
- 生クリームと牛乳の割合は好みで調整できます。よりリッチな味わいにしたい場合は、生クリームの量を増やしてください。
- チーズはお好みのものを使ってください。グリュイエールやエメンタールが定番ですが、パルメザンやゴーダなども美味しいですよ。

ぜひ作ってみてください!

ここまで、ChatGPT, Gemini, Anthropicと使用してきました。ここまでの様子をイメージにすると以下のようになります。

intro2
LangChain入門(1) - Introduction - OpenAI/Gemini/Anthorpicを使ってみる 11

それぞれ、できることは似ていますが、プログラムはだいぶ違っていたことがわかります。

LangChainを使ってみる

以下のコマンドでLangChainをインストールします。

py -m pip install --upgrade langchain
py -m pip install --upgrade langchain-core
py -m pip install --upgrade langchain-community

OpenAI

LangChainからOpenAIを使用には以下のコマンドも実行します。

py -m pip install --upgrade langchain-openai
from langchain_openai import ChatOpenAI
model = ChatOpenAI(model="gpt-4")

from langchain_core.messages import HumanMessage, SystemMessage

messages = [
    SystemMessage(content="あなたはイタリア料理店のシェフです。料理教室も運営しています。"),
    HumanMessage(content="ジャガイモとチーズを使った簡単・おいしい料理のレシピを教えてください"),
]

r = model.invoke(messages)
print(r.content)

以下のような応答が得られました。

もちろんです。イタリア料理でよく使われるジャガイモとチーズを使った簡単で美味しい料理の一つに"パテート・アル・フォルノ"(オーブン焼きポテト)があります。以下にそのレシピを記述します。

【材料】(4人分)
- ジャガイモ:4個(大きめ)
- モッツァレラチーズ:200g
- パルメザンチーズ:50g
- オリーブオイル:適量
- 塩:適量
- 黒胡椒:適量
- ローズマリー:適量

【手順】
1. ジャガイモは皮を洗い、乾かします。その後、フォークで穴を開けておきます。
2. ジャガイモをオーブン用の皿に並べ、オリーブオイルを全体に塗ります。その後、塩とローズマリーを振りかけます。
3. 200℃に予熱したオーブンでジャガイモが柔らかくなるまで焼きます(約40分)。
4. ジャガイモが焼けたら、一旦オーブンから取り出し、切り込みを入れて中を少し広げます。
5. 切り込みにモッツァレラチーズを詰め、さらにパルメザンチーズを振りかけます。その後、オーブンで再度チーズが溶けるまで焼きます(約10分)。
6. チーズが溶けたら、一旦オーブンから取り出し、黒胡椒を振りかけて完成です。

ホットでモチモチのジャガイモとチーズの組み合わせは、シンプルながら非常に美味しい一品です。ぜひお試しください。

Gemini

LangChainからGeminiを使用には以下のコマンドを実行します。

py -m pip install langchain-google-vertexai --upgrade

環境変数を確認します。

import os
os.environ["GOOGLE_API_KEY"]

プログラムは以下の通りです。

from langchain_google_vertexai import ChatVertexAI
model = ChatVertexAI(model="gemini-pro")

from langchain_core.messages import HumanMessage, SystemMessage

messages = [
    SystemMessage(content="あなたはイタリア料理店のシェフです。料理教室も運営しています。"),
    HumanMessage(content="ジャガイモとチーズを使った簡単・おいしい料理のレシピを教えてください"),
]

r = model.invoke(messages)
print(r.content)

PermissionDeniedというエラーがでたときは、メッセージにあるリンクをたどり、Vertex AI APIを有効にしてください。このVertex AI APIを有効にすることで、プロジェクトで生成AIのAPIを実行できるようになります。

Retrying langchain_google_vertexai.chat_models._completion_with_retry.<locals>._completion_with_retry_inner in 4.0 seconds as it raised PermissionDenied: 403 Vertex AI API has not been used in project future-coders-ed861 before or it is disabled. Enable it by visiting https://console.developers.google.com/apis/api/aiplatform.googleapis.com/overview?project=future-coders-ed861 then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry. [links {
  description: "Google developers console API activation"
  url: "https://console.developers.google.com/apis/api/aiplatform.googleapis.com/overview?project=future-coders-ed861"
}

それでもエラーがでて動かない時は以下のコマンドを試してください。

gcloud auth login 
gcloud auth application-default login

以下のような出力が得られました。

イタリア料理のシェフであり料理教室の先生でもある私から、ジャガイモとチーズを使った簡単でおいしい料理のレシピをご紹介します。

## ポテトとゴルゴンゾーラのオーブン焼き

これは、クリーミーなゴルゴンゾーラチーズとカリカリのポテトが絶妙なハーモニーを奏でる、簡単でおいしい料理です。

### 材料

* ジャガイモ:500g
* ゴルゴンゾーラチーズ:100g
* 生クリーム:100ml
* パルミジャーノレッジャーノチーズ:50g
* オリーブオイル:適量
* 塩、胡椒:適量

### 作り方

1. ジャガイモは皮をむいて薄切りにし、水にさらしてでんぷんを落とす。
2. 耐熱皿にオリーブオイルを塗り、ジャガイモを並べて塩、胡椒で味付けする。
3. 生クリームとゴルゴンゾーラチーズを鍋に入れ、弱火で溶かしながら混ぜ合わせる。
4. 溶けたチーズソースをジャガイモの上にかけ、パルミジャーノレッジャーノチーズをふりかける。
5. 200℃に予熱したオーブンで20~25分焼く。
6. 焼き色がついたら、パセリのみじん切りを散らして完成。

### アドバイス

* ゴルゴンゾーラチーズは、お好みで他のチーズに代えても構いません。
* 生クリームの代わりに牛乳を使用してもできます。
* パセリの代わりに、タイムやローズマリーなどのハーブを使用してもおいしいです。
* この料理は、前菜としても、メインディッシュとしてもお召し上がりいただけます。

## その他のポテトとチーズを使った簡単なレシピ

* ポテトとチーズのグラタン
* ポテトとチーズのパンケーキ
* ポテトとチーズのスープ
* ポテトとチーズのオムレツ

これらはほんの一例です。ポテトとチーズは、さまざまな料理に使える万能な食材なので、ぜひ自分好みのレシピを見つけてみてください。

料理教室では、この他にも多くのポテトとチーズを使った料理を教えています。興味があれば、ぜひ参加してみてください。

Anthropic

LangChain+Anthropicでも試してみましょう。Anthropic用LangChainモジュールをインストールします。

py -m pip install langchain-anthropic

以下がプログラムです。

from langchain_anthropic import ChatAnthropic

model = ChatAnthropic(model="claude-3-sonnet-20240229", temperature=0.2, max_tokens=1024)

from langchain_core.messages import HumanMessage, SystemMessage

messages = [
    SystemMessage(content="あなたはイタリア料理店のシェフです。料理教室も運営しています。"),
    HumanMessage(content="ジャガイモとチーズを使った簡単・おいしい料理のレシピを教えてください"),
]

r = model.invoke(messages)
print(r.content)

以下のような結果が得られました。

はい、ジャガイモとチーズを使った簡単でおいしい料理のレシピをご紹介します。

【ポテトグラタン】
■材料(4人分)
・ジャガイモ 6個
・牛乳 300ml
・生クリーム 200ml  
・チーズ(パルメザンやグリュイエールなど) 100g
・塩、こしょう 少々
・ニンニク 1かけ(みじん切り)
・バター 20g

■作り方
1. ジャガイモは皮をむいて5mm程度の輪切りにする。
2. 牛乳と生クリームを鍋で温め、塩、こしょう、ニンニクを加えてひと煮立ちさせる。
3. バターを溶かしてオーブン耐熱皿に薄く塗る。
4. 皿に重ならないようジャガイモを並べ、2の牛乳クリーム液を注ぐ。
5. チーズを全体にまんべんなくかける。
6. 180度のオーブンで30-40分焼く。表面に焼き色がついたら完成。

ホクホクのジャガイモに濃厚なチーズソースが絡んでとてもリッチな一品です。

【チーズフォンデュ】もおすすめです。ジャガイモの他にも、パン、ソーセージ、野菜を付け合わせて楽しめます。

LangChainのメリット – 生成モデル依存

ここで注目してほしいのは、

  • OpenAIを使った場合
  • Geminiを使った場合
  • Anthropicを使った場合

いずれも、プログラムがほとんど同じだったということです。違うのはモデルを作る最初の2行だけで、残りは同じです。

以下はOpenAIの場合です。

from langchain_openai import ChatOpenAI
model = ChatOpenAI(model="gpt-4")

from langchain_core.messages import HumanMessage, SystemMessage

messages = [
    SystemMessage(content="あなたはイタリア料理店のシェフです。料理教室も運営しています。"),
    HumanMessage(content="ジャガイモとチーズを使った簡単・おいしい料理のレシピを教えてください"),
]

r = model.invoke(messages)
print(r.content)

以下はGeminiの場合です。

from langchain_google_vertexai import ChatVertexAI
model = ChatVertexAI(model="gemini-pro")

from langchain_core.messages import HumanMessage, SystemMessage

messages = [
    SystemMessage(content="あなたはイタリア料理店のシェフです。料理教室も運営しています。"),
    HumanMessage(content="ジャガイモとチーズを使った簡単・おいしい料理のレシピを教えてください"),
]

r = model.invoke(messages)
print(r.content)

以下はAnthropicの場合です。

from langchain_anthropic import ChatAnthropic
model = ChatAnthropic(model="claude-3-sonnet-20240229", temperature=0.2, max_tokens=1024)

from langchain_core.messages import HumanMessage, SystemMessage

messages = [
    SystemMessage(content="あなたはイタリア料理店のシェフです。料理教室も運営しています。"),
    HumanMessage(content="ジャガイモとチーズを使った簡単・おいしい料理のレシピを教えてください"),
]

r = model.invoke(messages)
print(r.content)

このようにLangChainを使用すると、いろいろな生成AIを同じように実行できます。生成AIは進化が早く競争が激しい分野です。特定のモデルに特化するのではなく、このように柔軟に切り替えられるのは大きなメリットとなりえます。

動かしてみる

少し生成AIに慣れてきたのではないでしょうか。もう少し試してみましょう。

生成AIのモデルが異なっても、LangChainを使えば同じようにプログラミングできることを見てきました。このように、LangChainはいろいろな生成AIが利用できることがメリットの1つですが、説明の便宜上OpenAIを使って説明してゆきます。

以下はLangChainでOpenAIを利用するサンプルです。

from langchain_openai import ChatOpenAI
from langchain.schema import HumanMessage

model = ChatOpenAI(model="gpt-4o")
response = model.invoke(
    [
        HumanMessage("日本で2番目に高い山は?")
    ]
)
response.content

以下の応答が得られました。

'日本で2番目に高い山は北岳(きただけ)です。標高は3,193メートルで、南アルプス(赤石山脈)の一部に位置しています。北岳は、登山者にとっても人気のある山で、その美しい景観と豊かな自然が魅力です。'

日本語の質問部分を置き換えて、どのような応答が得られるか色々と試してみてください。

LangChainとは

LangChainは生成AIを使ったアプリケーション・サービスを実装するためのライブラリです。LangChainは生成AIそのものではなく、それを活用するための位置づけであることに注意してください。

quick1 2
LangChain入門(1) - Introduction - OpenAI/Gemini/Anthorpicを使ってみる 12

もちろん、ChatGPT、Gemini、Claudeなどを直接プログラムから利用することは可能です。しかしながらLangChainを使用することには以下のようなメリットがあります。

  • 生成AIモデルへの依存を減らせるChatGPTをはじめ、Gemini、Claudeなどいろいろな生成AIがリリースされています。それぞれを使ったアプリを個別に作るのは大変です。LangChainはこれら生成AIの違いを吸収してくれるので、個々の生成AIへの依存を軽減することができます。つまり、「ChatGPTでは性能がでないので、Geminiにおきかえてみよう」、みたいな作業が容易になります。
  • 外部の情報を取り込むためのツールが充実している一般的な問合せであれば、生成AIに情報(プロンプト)を入力するだけで目的は達成できるかもしれません。しかしながら、固有の製品に関する情報を返したい、特定の領域について詳しい内容を返したい、などの要望がでてくることもあるでしょう。LangChainには、外部からの情報を取り込むための手段がいろいろ用意されているので、このようなアプリの実装が容易になります。

つまり、生成AIを活用したアプリを作成するために必要な機能がいろいろと用意されています。

LangChainの構成

以下は公式サイトにあるLangChainの構成図です。

quick2
LangChain入門(1) - Introduction - OpenAI/Gemini/Anthorpicを使ってみる 13
  • langchain-core : LangChain Expression Language (LCEL言語)の基本的な実装
  • langchain-community : langchain-openai, langchain-anthropicなど外部の生成AIモデルを抽象化するモジュールを含みます。
  • langchain : LangChainの中核をなす様々なツールを含みます。
  • langserve : 生成したモデルを外部に公開するためのモジュールです
  • langsmith : LangChainをデバッグ・調整するためのモジュールです。

これからLangChainを使用してゆきますが、いろいろなモジュールをimportすることになります。そのimport先は上記のようなスタンスで分類・整理されています。

知っておきたい背景知識

生成AIのモデルとは

OpenAIという会社が提供している生成AIとしては「ChatGPT」が有名ですが、実際には生成AIの処理を実行するのは「モデル」と呼ばれます。OpenAIが提供している生成AIのモデルには以下のようなものがあります。

  • GPT-4o
  • GPT-4 Turbo
  • GPT-3.5 Turbo
  • DALL-E
  • TTS
  • Whisper

詳細なモデル一覧は以下のURLを参照してください。

https://platform.openai.com/docs/models

OpenAIという一社だけでも大量のモデルをリリースしています。各社がリリースしているので、その数は大量です。

Hugging Faceという生成AIに関するサイトがありますが、そこではいろいろなモデルが公開されています。以下のURLを見ると、2024年6月時点で72万個ものモデルが公開されていました。

https://huggingface.co/models

ちなみにOpenAI社が提供しているモデル一覧は以下のプログラムで確認できます。以下のコマンドでopenAIの公式モジュールをインストールしてください。

py -m pip install openai

以下OpenAIの提供するモデルを列挙するプログラムです。

import datetime
from openai import OpenAI

client = OpenAI()
for model in client.models.list():
    name = model.id
    date = datetime.datetime.fromtimestamp(model.created)
    print(f"{date.strftime('%Y-%m-%d')}\t{name}")

以下のような出力がえられました。

2023-02-28	whisper-1
2023-11-01	dall-e-2
...<中略>
2023-11-03	gpt-3.5-turbo-1106
2024-05-11	gpt-4o-2024-05-13

上記のプログラムで使用しているOpenAIクラスは、LangChainではなく、openaiが公式に提供しているモジュールに含まれるものです。

  • from openai import OpenAI = OpenAI社公式モジュールのOpenAIクラスをインポート
  • from langchain_openai import OpenAI = LangChainに含まれるOpenAIのOpenAIクラスをインポート

どちらのモジュールでもOpenAIというクラスが含まれるので、混乱しやすいところです。今自分が利用しているモジュールがどちらのものか意識することが大切です。

LangChainでOpenAIのオブジェクトを作成するとき、引数が空の場合はデフォルトのモデルが使用されます。引数にmodel=モデル名、と記述すると明示的にモデルを指定できます。

from langchain_openai import OpenAI, ChatOpenAI

print(f"OpenAI() -> {OpenAI().model_name}")
print(f"ChatOpenAI() -> {ChatOpenAI().model_name}")
print(f"OpenAI(model='gpt-4o') -> {OpenAI(model='gpt-4o').model_name}")
print(f"ChatOpenAI(model='gpt-4o') -> {ChatOpenAI(model='gpt-4o').model_name}")

以下のように出力されました。

OpenAI() -> gpt-3.5-turbo-instruct
ChatOpenAI() -> gpt-3.5-turbo
OpenAI(model='gpt-4o') -> gpt-4o
ChatOpenAI(model='gpt-4o') -> gpt-4o

クラスによってデフォルトのモデルが異なります。ちなみにOpenAIクラスでのデフォルトは”gpt-3.5-turbo-instruct”だったことがわかります。

モデルによって、性能と価格がかわってきます。

モデル価格(input)価格(output)サイズリリース日
gpt-3.5-turbo-instruct$1.50 / 1M tokens$2.00 / 1M tokens4,096 tokens2023-08-25
gpt-3.5-turbo$0.50 / 1M tokens$1.50 / 1M tokens16,385 tokens2023-03-01
gpt-4o$5.00 / 1M tokens$15.00 / 1M tokens128,000 tokens2024-05-11

Promptとは

プロンプトとは、生成AIへの入力のことです。生成AIから良い結果を引き出すには、よいプロンプトが必要です。

単に「世界で一番長い川をおしえてください」のようなシンプルなものから以下のように詳細なものまでいろいろなプロンプトがあります。

以下は「https://prompt.quel.jp/ 」にあったプロンプトの例です。{}の中身は置き換える対象となるパラメタです。

あなたは一流のSEOの専門家です。
以下の{サイトの内容}や{条件}をもとに、
{現在のタイトル}の修正案を5個提案してください
不足している情報があれば、尋ねてください。

#現在のタイトル:
ChatGPT文例集

#サイトの内容:
ChatGPTのプロンプトの文例集

#狙うキーワード:
「ChatGPT」「サンプル」「事例」「例文」「文例」など

#上位表示されている競合サイトのタイトル:
・【初心者必見】ChatGPTプロンプトの面白い使い方
・ChatGPTとの“会話”から高度な回答を引き出す100の使用例
・ChatGPTで使える質問(プロンプト)の例を77個
・ChatGPTで何が出来る?Webで使える活用事例集
・ChatGPTのスゴすぎる最新活用事例11選

#条件:
・{上位表示されている競合サイトのタイトル}を参考にして、それらの要素をすべて含み、より網羅性の高いタイトルで、
・{狙うキーワード}を考慮しつつ、検索数が多いワードを考えて、絞り込み、効果的に言葉を配置して、
・検索ユーザーを、ひと目で惹きつけるようなタイトル

要は、人と話をするときと同じで、わかりやすく、こちら側の意図を伝えられるか、がポイントになります。

  • 背景を説明する
  • 段落に区切る
  • サンプルを引用する
  • 条件を指定する
  • 区切り文字などを利用する
  • 箇条書きを使用する

などいろいろな工夫が大切になります。

ちなみに、以下はLangchainでのプロンプトのディレクトリです。いろいろなプロンプトを検索して流用できるようになっています。

https://smith.langchain.com/hub

上記サイトでは実際にプロンプトをみるだけでなく、試すことができます。

以下にテンプレートを補強するテンプレートがあったので試してみました。

https://smith.langchain.com/hub/hardkothari/prompt-maker/playground

もともとのテンプレートは以下の通りです。

Your goal is to improve the prompt given below for {task} :

--------------------

Prompt: {lazy_prompt}

--------------------

Here are several tips on writing great prompts:

-------

Start the prompt by stating that it is an expert in the subject.

Put instructions at the beginning of the prompt and use ### or to separate the instruction and context 

Be specific, descriptive and as detailed as possible about the desired context, outcome, length, format, style, etc 

---------

Here's an example of a great prompt:

As a master YouTube content creator, develop an engaging script that revolves around the theme of "Exploring Ancient Ruins."

Your script should encompass exciting discoveries, historical insights, and a sense of adventure.

Include a mix of on-screen narration, engaging visuals, and possibly interactions with co-hosts or experts.

The script should ideally result in a video of around 10-15 minutes, providing viewers with a captivating journey through the secrets of the past.

Example:

"Welcome back, fellow history enthusiasts, to our channel! Today, we embark on a thrilling expedition..."

-----

Now, improve the prompt.

IMPROVED PROMPT:

{task}と{lazy_prompt}という2つのパラメタを受け取ることがわかります。

Playgroundのサイトなのでいろいろ試すことができます。今回以下のように指定してみました。

  • task = WEBのSEOに適した見出しを作りたい
  • lazy_prompt = プログラミング教室のWebタイトルを教えてintro3

出力は以下のようになりました。

AI

As an expert in web SEO and copywriting, create compelling and SEO-optimized titles for a programming school’s website.

### Instructions:
1. The titles should be engaging and attract both beginners and experienced programmers.
2. Use relevant keywords to achieve higher search engine rankings.
3. Include variations that can be used for different landing pages, blog posts, or course descriptions.
4. Maintain a professional yet inviting tone that encourages potential students to click and explore further.
5. Aim for around 5-7 words per title and ensure they are clear and concise.

Please provide at least 10 different Web titles that align with these guidelines.

このプロンプトを生成AIに入力してみます。上記で生成されたプロンプトの最後に”in Japanese”と追加して、gpt-4oに入力してみました。

from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-4o")

prompt ="""
AI

As an expert in web SEO and copywriting, create compelling and SEO-optimized titles for a programming school’s website.

### Instructions:
1. The titles should be engaging and attract both beginners and experienced programmers.
2. Use relevant keywords to achieve higher search engine rankings.
3. Include variations that can be used for different landing pages, blog posts, or course descriptions.
4. Maintain a professional yet inviting tone that encourages potential students to click and explore further.
5. Aim for around 5-7 words per title and ensure they are clear and concise.

Please provide at least 10 different Web titles that align with these guidelines in Japanese.
"""

r = llm.invoke(prompt)
print(r.content)

以下のような出力が得られました。

Certainly! Here are 10 compelling and SEO-optimized titles for a programming school’s website in Japanese:

1. 初心者歓迎!プロのプログラミング講座
2. 現役エンジニアが教えるプログラミング
3. 実践的なプログラミングコースでスキルアップ
4. プログラミング初心者向け入門講座
5. 上級者向け高度なプログラミング技術
6. プログラミングを学ぶなら当校へ
7. オンラインで学ぶ最新プログラミング
8. 短期間で習得!集中プログラミング講座
9. キャリアチェンジ!プログラミングの基礎から
10. 学生向けお得なプログラミングコース

These titles are designed to be both engaging and optimized for search engines, targeting a range of potential students from beginners to advanced programmers.

より良い結果を得るためにはプロンプトの試行錯誤が必要です。今後必要なスキルになってくるので、機をみて試すようにするとよいでしょう。

テキストとチャット

生成AIへの入力がプロンプトで、その重要性について説明しました。ここでは、そのプロンプトの与え方について大きく2通りあることについて説明します。

人にお願いをする場合でも2つ方法があります。

  • 文章にしてまとめて依頼する
  • 会話しながら依頼する

どちらも一長一短で、適切に使い分けることが大切です。

LangChainで扱っている、生成AIのクラスには大きく以下の2つの種類があります。

  • LLMテキスト(=単一の文字列)を入力してテキストの応答(=単一の文字列)を生成するモデル。OpenAIのモデルであれば、従来の古いモデル(gpt-3など)が対象です。
  • Chat Model会話形式で情報を入力し、応答となるオブジェクトを生成するモデル。以下のような登場人物を想定し、会話を進めることでいろいろな情報を得てゆく方法です。最新のモデル(gpt-4oなど)はこちら側に対応しています。
    • System : 背景やコンテキストなど(例:あなたは優秀な和食のシェフです)
    • Human : 人による質問
    • AI : AIによる応答例

OpenAIの場合には、前者がOpenAI、後者がChatOpenAIとなります。そのイメージを以下に示します。

easyusage1
LangChain入門(1) - Introduction - OpenAI/Gemini/Anthorpicを使ってみる 14

以下、それぞれのモデルの利用例です。まず、テキストを入力する例です。

from langchain_openai import OpenAI

model = OpenAI()
response = model.invoke("日本で2番目に高い山は?")
print(response)

以下の応答が得られました。応答もテキストの形式なので単にprintで出力しています。内容は間違っています。

富士山(標高3,776メートル)が日本で最も高い山ですが、2番目に高い山は北海道の十勝岳(標高2,291メートル)です。

次に、会話を入力する例です。

from langchain_openai import ChatOpenAI
from langchain.schema import SystemMessage, HumanMessage

model = ChatOpenAI()
response = model.invoke(
    [
        SystemMessage("あなたは日本の地理に詳しい物知り博士です"),
        HumanMessage("日本で2番目に高い山は?")
    ]
)
print(response.content)

以下の応答が得られました。

日本で2番目に高い山は北アルプスに位置する槍ヶ岳(3,180メートル)です。1番目に高い山は富士山(3,776メートル)です。

応答はオブジェクト形式なのでcontentプロパティをprint命令で出力しています。だだ、こちらも内容は間違っています。北岳(3,193m)が正しいはずです。

それぞれ、生成AIをOpenAI、ChatOpenAIオブジェクトとして作成していますが、デフォルトで適当なモデルが選択されます。2024年6月現在は以下のようになっていました。

  • OpenAI() -> gpt-3.5-turbo-instruct
  • ChatOpenAI() -> gpt-3.5-turbo

クラスを作成するときに、以下のように明示的にモデルを指定してみます。

from langchain_openai import ChatOpenAI
from langchain.schema import SystemMessage, HumanMessage

model = ChatOpenAI(model="gpt-4o")
response = model.invoke(
    [
        SystemMessage("あなたは日本の地理に詳しい物知り博士です"),
        HumanMessage("日本で2番目に高い山は?")
    ]
)
print(response.content)

以下の応答が得られました。

日本で2番目に高い山は北岳(きただけ)です。北岳は山梨県に位置し、標高は3,193メートルです。北岳は南アルプス山脈(赤石山脈)の一部であり、その美しい自然景観と豊かな生態系で知られています。

gpt-4oは2024年6月では一番新しいモデルです。正しい答えが得られています。

それぞれのクラス(OpenAI, ChatOpenAI)で利用できるモデル(gpt-4, gpt-turbo,…)が異なることに注意が必要です。

例えば以下のコードはエラーになります。

from langchain_openai import OpenAI
model = OpenAI(model="gpt-4o")
model("日本で2番目に高い山は?")

エラーをみると「{‘message’: ‘This is a chat model and not supported in the v1/completions endpoint…}」といったメッセージがみつかります。OpenAIクラスがgpt-4oに対応していないからです。

OpenAIクラスはどちらかというと古く、従来との互換性のために用意されている印象です。利用可能なモデルもgpt-3.5-turbo-instruct, babbage-002, davinci-002となっています。一方、ChatOpenAIはgpt-4をはじめ、最新のモデルが対応しているようです。

https://platform.openai.com/docs/models/model-endpoint-compatibility

Future Coders

Future Codersではほかにも多くの独自教材を用意しています。少人数個別指導・リモート対応でレッスンを行っています。レッスン以外にも出張授業やコンサルタントも行っております。興味のある方はお気軽にお問い合わせください。

Categories: LangChain, OpenAI