コンテンツにスキップ

TextLLMインターフェイス

TextLLM: 大規模言語モデルの抽象化

PromptoGen では、 pg.TextLLMを介して、大規模言語モデル(LLM)とのテキスト生成を行います。このインターフェイスを理解し、適切に利用することは、このライブラリを最大限に活用するための鍵となります。

使用例:

import promptogen as pg

class YourTextLLM(pg.TextLLM):
    def __init__(self, model: str):
        self.model = model

    def generate(self, text: str) -> str:
        return generate_by_your_text_llm(text, self.model)

text_llm = YourTextLLM(model="your-model")

上記の例では、任意のLLMを使用するためのYourTextLLMクラスを定義しています。実際のLLMへの接続やテキスト生成ロジックは、generate_by_your_text_llmメソッドに委譲されています。

なぜ pg.TextLLM インターフェイスは重要か?

PromptoGenは、具体的なLLM (例: gpt-3.5-turbo, gpt-4) の実装から独立して設計されています。これにより、異なるLLMのバージョンや他の言語モデルを簡単に取り替えられるようになっています。この独立性を実現するために、pg.TextLLMインターフェイスが中心的な役割を果たしています。ユーザーはこのインターフェイスを通して、独自のLLM実装をPromptoGenに注入することができます。

このように、pg.TextLLMインターフェイスを通じて、PromptoGenは柔軟性と拡張性を保持しています。

TextLLM について

TextLLM 抽象クラスは、テキストからテキストを生成する大規模言語モデル(LLM)のインターフェースです。

TextLLMgenerate メソッドを持ちます。このメソッドは、テキストを受け取り、テキストを返します。

class LLM(ABC):
    """Language model interface."""

    pass

class TextLLM(LLM, ABC):
    """Language model interface that generates text from text."""

    @abstractmethod
    def generate(self, input_text: str) -> str:
        pass

Promptogenは、具体的なLLMに依存しないように設計されています。 TextLLM はその代表的な例です。 このようなインターフェースを定義することで、様々な大規模言語モデルを統一的に扱うことができます。

実装例1: 自作クラスを使った例

たとえば、 OpenAI API を使用した TextLLM の実装例を紹介します。 例えば、以下のような generate_chat_completion 関数を定義しておきます。

import openai

openai.api_key = os.getenv("OPENAI_API_KEY")
openai.organization = os.getenv("OPENAI_ORG_ID")

def generate_chat_completion(text: str, model: str) -> str:
    resp = openai.ChatCompletion.create(
        model=model,
        messages=[{"role": "user", "content": text}],
        max_tokens=2048,
        stream=True,
    )
    raw_resp = ""
    for chunk in resp:
        chunk_content = chunk["choices"][0]["delta"].get("content", "")
        raw_resp += chunk_content

    return raw_resp

TextLLM クラスを継承することで、TextLLM を実装することができます。

import promptogen as pg

class OpenAITextLLM(pg.TextLLM):
    def __init__(self, model: str):
        self.model = model

    def generate(self, text: str) -> str:
        return generate_chat_completion(text, self.model)

実装例2: 関数を元にして TextLLM を実装する例

FunctionBasedTextLLM クラスは、テキストからテキストを生成する大規模言語モデル(LLM)の実装の一つです。

(input_text: str) -> str の関数を指定することで、TextLLM を実装することができます。

クラスを自作する場合に比べて、簡単に TextLLM を実装することができます。

text_llm = FunctionBasedTextLLM(
    generate_text_by_text=lambda input_text: generate_chat_completion(input_text, "gpt-3.5-turbo"),
)

使い方

text_llm = OpenAITextLLM("gpt-3.5-turbo")

print(text_llm.generate("Hello, I'm a human."))
# Hello! How can I assist you today as an AI?

基本的に、 pg.TextLLM に依存するように実装を進めることで、 LLMに依存しない汎用的なシステム を構築しやすくなります。