見出し画像

LangChain の HOW-TO EXAMPLES (1) - LLM

「LangChain」の「LLM」が提供する機能を紹介する  HOW-TO EXAMPLES をまとめました。

前回

1. LLMの機能

LLMの機能について説明します。

1-1. LLMの生成

LLMの生成手順は、次のとおりです。

from langchain.llms import OpenAI

# OpenAIのLLMの生成
llm = OpenAI(model_name="text-davinci-003", n=2, best_of=2)

・model_name: str = "text-davinci-003" - モデル名
・temperature: float = 0.7 - サンプリング温度
・max_tokens: int = 256 - 最大トークン(-1:できるだけ多く)
・top_p: float = 1 - ステップ毎で考慮するトークンの総確率質量
・frequency_penalty: float = 0 - トークンの繰り返し頻度のペナルティ
・presence_penalty: float = 0 - トークンの繰り返しのペナルティ
・n: int = 1 - プロンプト毎とに生成するCompletion数
・best_of: int = 1 - 最善のCompletionを返す
・model_kwargs: Dict[str, Any] = Field(default_factory=dict) - 明示されてない「create」のモデルパラメータ
・openai_api_key: Optional[str] = None - OpenAI APIキー
・batch_size: int = 20 - バッチサイズ
・request_timeout: Optional[Union[float, Tuple[float, float]]] = None - タイムアウト (デフォルト600秒)

1-2. LLMの呼び出し

llm()でLLMを呼び出します。(※ llmはOpenAI()の戻り値)

# LLMの呼び出し
result = llm("ネコの鳴き声は?")
print(result)
ネコの鳴き声は「ニャー」という音です。

1-2. 高度なLLMの呼び出し

llm()ではなく、llm.generation()を使うことで、複数のテキストをまとめて推論できるだけでなく、使用したトークン数などの情報を取得することもできます。

# 高度なLLMの呼び出し
result = llm.generate(["猫の鳴き声は?", "カラスの鳴き声は?"])
print(result)
LLMResult(
    generations=[
        [Generation(
            text='\n\nネコの鳴き声は「ニャー」という音です。',
            generation_info={'finish_reason': 'stop', 'logprobs': None}
        )],
        [Generation(
            text='\n\nカラスの鳴き声は「カーカー」という鳴き声です。',
            generation_info={'finish_reason': 'stop', 'logprobs': None}
        )]
    ],
    llm_output={'token_usage': {'prompt_tokens': 26, 'completion_tokens': 55, 'total_tokens': 81}}
)

戻り値はLLMResultで、出力テキストと使用したトークン数を以下のように取得することができます。

# 出力テキスト
print("response0:", result.generations[0][0].text)
print("response1:", result.generations[1][0].text)

# 使用したトークン数
print("llm_output:", result.llm_output)
response0:

ネコの鳴き声は「ニャー」という音です。
response1:

カラスの鳴き声は「カーカー」という鳴き声です。
llm_output: {'token_usage': {'prompt_tokens': 25, 'completion_tokens': 55, 'total_tokens': 80}}

2. LLMのシリアライズ

LLMの情報は、ファイル (json or yaml) で保持することができます。

2-1. LLMファイルの読み込み

LLMファイルの読み込み手順は、次のとおりです。

(1) LLMファイルの準備。

・my_llm.json

{
    "model_name": "text-davinci-003",
    "temperature": 0.7,
    "max_tokens": 256,
    "top_p": 1,
    "frequency_penalty": 0,
    "presence_penalty": 0,
    "n": 1,
    "best_of": 1,
    "_type": "openai"
}

(2) LLMファイルの読み込み。

from langchain.llms import OpenAI
from langchain.llms.loading import load_llm

# LLMファイルの読み込み
llm = load_llm("my_llm.json")

2-2. LLMファイルの書き込み

LLMファイルの書き込み手順は、次のとおりです。

# LLMファイルの書き込み
llm.save("my_llm.json")

3. LLMのキャッシュ

LLMのキャッシュについて説明します。

3-1. インメモリキャッシュ

インメモリキャッシュの利用手順は、次のとおりです。

(1) インメモリキャッシュの準備。

import langchain
from langchain.cache import InMemoryCache

# インメモリキャッシュの準備
langchain.llm_cache = InMemoryCache()

(2) 1回目のLLMの呼び出し。

%%time
llm("好きな色は?")
CPU times: user 8.37 ms, sys: 183 µs, total: 8.56 ms
Wall time: 1.29 s
'\n\n私の好きな色は、紫と緑です。'

(3) 2回目のLLM呼び出し。
キャッシュしてるため高速で応答の内容は同じことを確認します。

%%time
llm("好きな色は?")
CPU times: user 71 µs, sys: 11 µs, total: 82 µs
Wall time: 85.1 µs
'\n\n私の好きな色は、紫と緑です。

3-2. SQLiteキャッシュ

SQLiteキャッシュの利用手順は、次のとおりです。

(1) SQLiteキャッシュの準備。

from langchain.cache import SQLiteCache

# SQLiteキャッシュの準備
langchain.llm_cache = SQLiteCache(database_path=".langchain.db")

3-3. Redisキャッシュ

Redisキャッシュの利用手順は、次のとおりです。

(1) Redisキャッシュの準備
この例を実行する前に、ローカルの Redis インスタンスが最初に実行されていることを確認してください。

from redis import Redis
from langchain.cache import RedisCache

# Redisキャッシュの準備
langchain.llm_cache = RedisCache(redis_=Redis())

3-4. SQLAlchemyキャッシュ

SQLAlchemyキャッシュの利用手順は、次のとおりです。

(1) SQLAlchemyキャッシュの準備。
SQLAlchemyCacheで、SQLAlchemyでサポートされている任意のSQL データベースでキャッシュできます。

from langchain.cache import SQLAlchemyCache
from sqlalchemy import create_engine

# SQLAlchemyキャッシュの準備
engine = create_engine("postgresql://postgres:postgres@localhost:5432/postgres")
langchain.llm_cache = SQLAlchemyCache(engine)

3-5. 特定のLLMのキャッシュのオフ

グローバルキャッシュが有効にしている場合、必要に応じて、特定のLLMのキャッシュをオフにすることができます。

(1) 特定のLLMのキャッシュのオフ。

# 特定のLLMのキャッシュのオフ
llm = OpenAI(model_name="text-davinci-002", cache=False)

4. カスタムLLM

カスタムLLMの実装手順は、次のとおりです。

(1) カスタムLLMの定義。

# パッケージのインポート
from langchain.llms.base import LLM
from typing import Optional, List, Mapping, Any

# カスタムLLMの定義
class CustomLLM(LLM):
    n: int

    # LLM種別を返す
    @property
    def _llm_type(self) -> str:
        return "custom"

    # プロンプトとストップワードを受け取り応答を返す
    def _call(self, prompt: str, stop: Optional[List[str]] = None) -> str:
        if stop is not None:
            raise ValueError("stop kwargs are not permitted.")
        return prompt[:self.n]  # 入力の最初のN文字を返す

    # IDパラメータの辞書を返す
    @property
    def _identifying_params(self) -> Mapping[str, Any]:
        return {"n": self.n}

(2) カスタムLLMの利用

# カスタムLLMの利用
llm = CustomLLM(n=10)
llm("あいうえおかきくけこさしすせそ")
'あいうえおかきくけこ'

次回



この記事が気に入ったらサポートをしてみませんか?