【Python】LangChain Modelsとは?|LLM・チャットモデル・Embeddingsの実装方法

当ページには広告が含まれています。

こんにちは、DXCEL WAVEの運営者(@dxcelwave)です!

こんな方におすすめ!
  • LangChain Modelsについて知りたい。
  • LangChain Modelsの「LLM」「チャットモデル」「Embeddingモデル」のPython実装方法が知りたい。
目次

LangChainとは?

【LangChain公式】https://python.langchain.com/en/latest/index.html

LangChainとは、ChatGPTを代表とするような大規模言語モデル(LLM)の機能を拡張し、サービスとして展開する際に役立つライブラリです。

LangChainの主要機能

LangChainの主要な機能として以下があります。

主要機能概要
Models様々な大規模言語モデルを同じインターフェース上で取り扱えるようにする機能
Promptsプロンプトの管理、最適化、シリアル化ができる機能
Memory言語モデルを用いてユーザーと対話した履歴を記憶する機能
Data connection言語モデルに外部データを投入し、外部データに基づく回答を生成する機能
Chainsチェーンを複数繋げて、一連の処理を連続実行する機能
Agentsユーザーからの要望をどんな手段・順序で応えるか決定・実行する機能

LangChainの各種機能の詳細を知りたい方は、こちらの記事をご覧下さい。

あわせて読みたい
LangChainとは?|概要・主要機能を徹底解説 LangChainの概要および主要機能であるModels・Prompts・Data Connection・Agents・Memory・Chainsについて解説します。

【参考】LangChainを用いたプログラミング実装におすすめの学習教材

LangChainライブラリを用いてプログラミングし、アプリケーションを実装したい方向けに、おすすめの学習教材をご紹介します。

LangChain Modelsとは?

LangChain Modelsとは、ChatGPTを代表するGPT-3.5など、様々なLLM、チャットモデル、Embeddingsモデルを同じインターフェース上で取り扱えるようにする機能です。

様々なモデルを1つのインターフェースで扱うことで、モデル同士の組み合わせや、カスタマイズが実現でき、応用の幅が広がります。

LangChain Modelsでは、次の種類のモデルが1つのインターフェース上で取り扱い可能です。

  • 大規模言語モデル(LLM)
  • チャットモデル
  • Embeddingsモデル

大規模言語モデル(LLM)

大規模言語モデル(LLM)とは、Large Language Modelsの略であり、大量のテキストデータを用いてトレーニングされた自然言語処理モデルです。

代表的な自然言語処理タスク

LLMでは、次のようなタスクをこなすことができます。

  • 質疑応答
  • テキスト分類
  • 予測変換
  • 文章要約
  • 機械翻訳
  • スパムフィルタ

チャットモデル

チャットモデルとは、チャットメッセージに対して適切な返答は返すことに特化したモデルです。

チャットモデル内部では同じくLLMが活用されています。一方、LLMの入出力形式に関してはチャットモデルに特化する形式として構造化されているのが特徴です。

Embeddingsモデル

Embeddings(埋め込み表現)とは、単語や文章等の自然言語の構成要素をベクトルに変換する処理を指します。このような処理が可能なモデルを、Embeddingsモデルと呼びます。

Embeddingsについてさらに詳しく学びたい方はこちらの記事をご覧ください。

あわせて読みたい
【自然言語処理】Embedding(埋め込み表現)とは?|OpenAI APIとPythonで文章のベクトル変換実践 自然言語処理で登場する「Embedding」について詳しく知りたい方向けに、Embeddingの概要、PythonとOpenAI(ChatGPT)APIを用いて文章をベクトル変換するプログラム構築方法について解説します。

【LangChain事前準備】Python環境構築・OpenAIのChatGPT API取得

PythonとLangChainを用いて、LLM・チャットモデル・Embeddingモデルの実装方法を後述します。そのためにいくつか実施すべき事前準備があります。

Pythonライブラリのインストール

プログラム実装に際して、以下に示すライブラリが必要となります。ターミナル(MacOS)またはコマンドプロンプト(Windows)を通じて事前にインストールしておきましょう。

OpenAI

ChatGPTを代表とするOpenAI社のAPI利用に際して必要となるライブラリです。

pip install openai

LangChain

LangChainの利用に際して必要となるライブラリです。

pip install langchain

tiktoken

文章の分散表現を得るために必要となるライブラリです。Embeddingモデルで利用します。

pip install tiktoken

【ChatGPT】OpenAI社のAPI発行

LangChain機能構築に際して、OpenAI社が提供するGPTモデルをAPI経由で呼び出す必要があります。

OpenAI社の公式サイトから「API シークレットキー」を事前に発行しておきましょう。なお、シークレットキーの発行方法はこちらの記事で詳しく解説しています。

あわせて読みたい
【Python×ChatGPT】チャットボット作成入門|OpenAI APIの利用申請手順も解説 「ChatGPT APIの利用手順」と「PythonでChatGPT APIを呼び出し、チャットボットを作成する方法」についてそれぞれ解説します。

【Python】LangChain Models|LLMの実装方法

LangChain Modelsの主要機能である「LLM」の実装方法について解説します。

Pythonライブラリのインストール

Pythonプログラムの先頭にライブラリとAPI認証情報を記述します。

前述したOpenAI社のサイトから取得したシークレットキーを入力しましょう。

import openai
import os

# APIシークレットキーを記述
SECRET_KEY  = "............."

# API認証情報設定
os.environ["OPENAI_API_KEY"] = SECRET_KEY

大規模言語モデル(LLM)作成

LLMは、langchain.llms.OpenAIメソッドを用いて次のように作成できます。

コード

from langchain.llms import OpenAI

# =============================================================================
# LLMモデル作成
# =============================================================================

LLM = OpenAI(
            model_name        = "text-davinci-003", # OpenAI社のモデル名
            temperature       = 0.5,                # 出力する単語のランダム性(0から2の範囲) 0であれば毎回返答内容固定
            max_tokens        = 256,                # 生成する単語の最大単語数
            top_p             = 1,                  # 核サンプリング:値が高いほど正確・事実に基づく回答、低いほど多様な回答を生成
            frequency_penalty = 0,                  # 単語の繰り返し頻度。[-2:2]の範囲で設定し値が大きいほど繰り返し回数低下
            presence_penalty  = 0,                  # 単語をもう一度使うかどうか。[-2:2]で設定し値が大きいほど再出現率が低下
            n                 = 1,                  # いくつの返答を生成するか
            best_of           = 1,                  # 最善の返答をいくつ返すか
            batch_size        = 20,                 # バッチサイズ
            max_retries       = 6,                  # API呼出失敗時の最大リトライ回数              
            )

引数情報

上記で利用したlangchain.llms.OpenAIの引数情報について言及します。

スクロールできます
引数名概要
model_nameOpenAI社が提供するGPTモデル名。
temperature0から2の範囲の範囲で出力する単語のランダム性を設定。値が低けほど最も確率が高い回答が常に選択されるため、結果はより決定論的になる。値が大きいほど、ランダム性が増し、多様で創造的な出力を得る。事実に基づくQAモデル作成の場合、この値を低くし、詩や創造的なタスクの場合、高い値の設定を推奨。
max_tokens生成する文章の最大単語数。
top_p核サンプリングと呼ばれるサンプリング手法。モデルの応答生成際して決定性を制御できる。値が低いほど正確で事実に基づいた回答が得やすく、値が高いほど多様な回答を得やすい。
frequency_penalty同じ単語の繰り返し頻度。[-2:2]の範囲で値を設定。値が大きいほど繰り返しにおけるペナルティが増加するため、単語の繰り返し回数は低下。一方、値が小さいほどペナルティも小さくなるため、同じ単語を繰り返し利用する回数が増加傾向にある。
presence_penalty単語をもう一度使うかどうか。[-2:2]の範囲で値を設定。値が大きいほど、2回目以降の単語の再出現率が低下。一方、値が小さいほどペナルティも小さくなるため、単語の再出現率は増加傾向にある。
n最大いくつの返答を生成するか。
best_of生成した返答数のうち、関連度の高い最善の返答をいくつまで出力するか。
batch_sizeバッチサイズ
max_retriesAPI呼出失敗時の最大リトライ回数

LLM実行|質疑応答

前述のLLMを実際に利用しましょう。LLMを用いた質疑応答は入力テキストを渡すと実現できます。

コード

# =============================================================================
# LLMモデル実行
# =============================================================================

# 入力文章
text     = "日本の首都はどこ?"

# LLM実行
response = LLM(text)

出力イメージ

# 出力
print(response)

# 出力イメージ
# 日本の首都は東京都です。

LLM実行|文章生成

LLMを用いた文章生成はLLM.generate()メソッドを用いて次のように記述します。

コード

# =============================================================================
# LLMモデル実行
# =============================================================================

# 入力文章|入力文章をリストで指定も可能
texts    = ["面白いギャグを言って", "面白い詩を書いて"] * 10 

# 文章生成
response = LLM.generate(texts)

出力イメージ

# 出力
print(response)

# 出力イメージ
# generations=[[Generation(text='ください\n\n「今日は雨だね。でも、明日はお天気になってくれるといいな。なんて、「雨が降っても、明日は晴れるという希望の光」だよ」', 
# generation_info={'finish_reason': 'stop', 'logprobs': None})], 
# [Generation(text='ください\n\n夜空に浮かぶ月は\n晴れた日の夢を照らす\n悲しみを抑えて笑える\n明日への期待が芽生える\n\n深い森を抜けて\n風が吹き抜ける\n自由の声が響いて\n私の胸を熱くさせる\n\n夜明けを待つ日々は\n夢を叶える旅路\n自分らしく生きる勇気を\nその手に掴み取ろう', 
# generation_info={'finish_reason': 'stop', 'logprobs': None})], 
# [Generation(text='ください\n\n「あなたの肩には何がありますか?」「肩こりです」', 
# generation_info={'finish_reason': 'stop', 'logprobs': None})], 
# [Generation(text='ください\n\n夜空を見上げていると、\n時間が止まり、\n心も落ち着いてくる。\n\n織りなす星屑の美しさに、\nそっと息をのむ。\n\n星たちは、\nあたたかな光を見つめている。\n\n私たちの未来を照らして、\n私たちを励ましてくれる。\n\n夜空を見上げれば、\n未来への希望を感じる。\nそして、\n未来を自分で切り開いていく勇気を持つことができる。', 
# ・・・・

【Python】LangChain Models|チャットモデルの実装方法

LangChain Modelsの主要機能である「チャットモデル」の実装方法について解説します。

Pythonライブラリのインストール

Pythonプログラムの先頭にライブラリとAPI認証情報を記述します。

前述したOpenAI社のサイトから取得したシークレットキーを入力しましょう。

import openai
import os

# APIシークレットキーを記述
SECRET_KEY  = "............."

# API認証情報設定
os.environ["OPENAI_API_KEY"] = SECRET_KEY

チャットモデルの作成

チャットモデルは、langchain.chat_models.ChatOpenAIメソッドを用いて次のように作成できます。

コード

from langchain.chat_models import ChatOpenAI
from langchain import PromptTemplate, LLMChain
from langchain.schema import (
        AIMessage,
        HumanMessage,
        SystemMessage
    )


# =============================================================================
# チャットモデル作成
# =============================================================================

chat_model = ChatOpenAI(
                model_name  = 'gpt-3.5-turbo',  # OpenAI社のモデル名
                temperature = 0.0,              # 出力する単語のランダム性(0から2の範囲) 0であれば毎回返答内容固定
                max_tokens  = None,             # 生成する単語の最大単語数
                n           = 1,                # いくつの返答を生成するか
                max_retries = 6,                # API呼出失敗時の最大リトライ回数
                )

引数情報

上記で利用したlangchain.chat_models.ChatOpenAIの引数情報について言及します。

スクロールできます
引数名概要
model_nameOpenAI社が提供するGPTモデル名。
temperature0から2の範囲の範囲で出力する単語のランダム性を設定。値が低けほど最も確率が高い回答が常に選択されるため、結果はより決定論的になる。値が大きいほど、ランダム性が増し、多様で創造的な出力を得る。事実に基づくQAモデル作成の場合、この値を低くし、詩や創造的なタスクの場合、高い値の設定を推奨。
max_tokens生成する文章の最大単語数。
n最大いくつの返答を生成するか。
max_retriesAPI呼出失敗時の最大リトライ回数

【参考】応答メッセージ

1つ以上の応答メッセージをチャットモデルに渡すことで、チャットが実現できます。応答メッセージには以下4つの種類があります。

  • AIMessage
  • HumanMessage
  • SystemMessage
  • ChatMessage

チャットモデルは、これら応答メッセージを受け取ることで、役割(AI/Human/System/Chat)とメッセージを理解し、適切な返答を生成します。

チャットモデル実行|HumanMessage

前述のチャットモデルを実際に利用しましょう。汎用的に用いるHumanMessageを指定し、チャットモデルを起動します。

コード

# =============================================================================
# チャットモデル実行
# =============================================================================

# 入力文章
text     = "「私はアメリカに住んでいます。」この日本語文章を英語に翻訳してください。"

# チャットモデル
response = chat_model([HumanMessage(content=text)])

出力イメージ

# 出力
print(response)

# 出力イメージ
# content='"I live in America."' additional_kwargs={} example=False

チャットモデル実行|SystemMessage×HumanMessage

SystemMessageにチャットモデルが担う役割を渡すことができます。以下、HumanMessageと組み合わせることで次のようにチャットモデルを実行することも可能です。

コード

# =============================================================================
# チャットモデル実行
# =============================================================================

# 入力文章
system_text = "あなたは日本語を英語に翻訳するアシスタントです。"
human_text  = "私はアメリカに住んでいます。"


# チャットモデル実行
response = chat_model([
                        SystemMessage(content = system_text),
                        HumanMessage(content  = human_text)
                    ])

出力イメージ

# 出力
print(response)

# 出力イメージ
# content='I live in America.' additional_kwargs={} example=False

チャットモデル実行|文章生成

チャットモデルに対して、generateメソッドを指定し、複数のメッセージセットを生成できます。

コード

# =============================================================================
# チャットモデル実行
# =============================================================================

# 入力バッチ
batch_messages = [
            [
                SystemMessage(content = "あなたは日本語を英語に翻訳するアシスタントです。"),
                HumanMessage(content  = "私はアメリカに住んでいます。")
            ],
            [
                SystemMessage(content = "あなたは日本語を英語に翻訳するアシスタントです。"),
                HumanMessage(content  = "あなたの趣味はなんですか?")
            ],
        ]

# チャットモデル実行
response = chat_model.generate(batch_messages)

出力イメージ

# 出力
print(response)

# 出力イメージ
# generations=[[ChatGeneration(text='I live in America.', 
#                              generation_info=None, 
#                              message=AIMessage(content='I live in America.', 
#                                                additional_kwargs={}, 
#                                                example=False))], 
#              [ChatGeneration(text='私は趣味を持っていません。私はプログラムされたタスクを実行するために設計されたコンピュータープログラムです。', 
#                              generation_info=None, 
#                              message=AIMessage(content='私は趣味を持っていません。私はプログラムされたタスクを実行するために設計されたコンピュータープログラムです。', 
#                                                additional_kwargs={}, 
#                                                example=False))]] 
# llm_output={'token_usage':
#             {'prompt_tokens': 105, 
#              'completion_tokens': 56, 
#              'total_tokens': 161}, 
#             'model_name': 'gpt-3.5-turbo'}

【Python】LangChain Models|Embeddingモデルの実装方法

LangChain Modelsの主要機能である「Embeddingモデル」の実装方法について解説します。

Pythonライブラリのインストール

Pythonプログラムの先頭にライブラリとAPI認証情報を記述します。

前述したOpenAI社のサイトから取得したシークレットキーを入力しましょう。

import openai
import os

# APIシークレットキーを記述
SECRET_KEY  = "............."

# API認証情報設定
os.environ["OPENAI_API_KEY"] = SECRET_KEY

Embeddingモデル作成

Embeddingモデルは、langchain.embeddings.OpenAIEmbeddingsメソッドを用いて次のように作成できます。

コード

from langchain.embeddings import OpenAIEmbeddings

# =============================================================================
# Embeddingモデル作成
# =============================================================================

embedding_model = OpenAIEmbeddings(
                            model = 'text-embedding-ada-002',  # OpenAI社のモデル名
                            embedding_ctx_length = 8191,       # エンコーディング時の最大コンテキスト長
                            chunk_size           = 1000,       # チャンクの最大サイズ
                            max_retries          = 6,          # API呼出失敗時の最大リトライ回数
                                )

引数情報

langchain.embeddings.OpenAIEmbeddingsメソッドには次の引数を指定します。

スクロールできます
引数名概要
modelOpenAI社のモデル名
embedding_ctx_lengthエンコーディング時の最大コンテキスト長
chunk_sizeチャンクの最大サイズ
max_retriesAPI呼出失敗時の最大リトライ回数

Embeddingモデル実行

Embeddingモデルを実行すると、入力文章の分散表現を得ることができます。

コード

# =============================================================================
# Embeddingモデル実行
# =============================================================================

# 入力文章
text     = "今日の天気は晴れです。"

# モデル実行
response = embedding_model.embed_query(text)

出力イメージ

# 出力
print(response)

# 出力イメージ
# [-0.004059304017573595, 0.01388087309896946, -0.01579236052930355, -0.0016934039304032922, 
#  0.015152880921959877, 0.004486782010644674, -0.01504166703671217, -0.03294708952307701,
# -0.00753473537042737, -0.03700639307498932, -0.008521758019924164, 0.021450363099575043, 
# -0.0024797203950583935, -0.016014788299798965, -0.006050725933164358, -0.014249268919229507,
# ・・・

【参考】PythonによるLLM実装|ChatGPT・LangChain

本記事では、PythonでLLMを構築し、様々なタスクをこなす機能の実装方法を多数解説しています。

Python × ChatGPT関連記事

【あわせて読みたい】

Python × LangChain関連記事

【あわせて読みたい】

自然言語処理の学習におすすめの書籍

あわせて読みたい
自然言語処理(NLP)学習におすすめ入門本・動画教材8選|Pythonによる機械学習・ディープラーニング向け... 「自然言語処理の概要とそれを実装するPythonプログラミング手法を学びたい」「機械学習・AIを組み合わせたモデル開発手法を知りたい」このような要望にお答えします。

自然言語処理の概要について詳しく学びたい方向けに、厳選したおすすめの学習教材を紹介しています。

最後に

この記事が気に入ったら
フォローしてね!

目次