メインコンテンツへスキップ
見出し画像

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("あいうえおかきくけこさしすせそ")
    'あいうえおかきくけこ'

    次回



     
     

    npaka

     
     
    プログラマー。iPhone / Android / Unity / ROS / AI / AR / VR / RasPi / ロボット / ガジェット。年2冊ペースで技術書を執筆。アニソン / カラオケ / ギター / 猫 twitter : @npaka123

    あなたへのおすすめ