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未来を自分で切り開いていく勇気を持つことができる。', # ・・・・
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つの種類があります。

# =============================================================================
# チャットモデル実行
# =============================================================================
# 入力文章
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