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)
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("あいうえおかきくけこさしすせそ")
'あいうえおかきくけこ'
次回
この記事が気に入ったらサポートをしてみませんか?