コンテンツにスキップ

クイックスタート

テキスト要約&キーワード抽出プロンプトを作成する

まずは、プロンプトを作成してみましょう。このクイックスタートガイドでは、テキストを入力として受け取り、そのテキストの要約文とキーワードを出力するプロンプトを作成します。

つまり、 (text: str) -> (summary: str, keywords: List[str]) という関数を実現するプロンプトを作成します。

graph TD
    Input("text: str") --> Function["テキスト要約&キーワード抽出"]
    Function --> Output1("summary: str")
    Function --> Output2("keywords: List[str]")

PromptoGenには、プロンプトを表現するためのデータクラス(pg.Prompt)が用意されています。 このデータクラスを使って、プロンプトを作成します。 このデータクラスは pydantic.BaseModel を継承しています。

プロンプトを作成するには、以下の情報が必要です。

項目 引数名
プロンプトの名前 name str
プロンプトの説明 description str
入力パラメータのリスト input_parameters List[pg.ParameterInfo]
出力パラメータのリスト output_parameters List[pg.ParameterInfo]
入出力のテンプレート template pg.IOExample
入出力の例のリスト examples List[pg.IOExample]

これらの情報を使って、プロンプトを作成します。

quickstart.py
import promptogen as pg

summarizer = pg.Prompt(
    name="Text Summarizer and Keyword Extractor",
    description="Summarize text and extract keywords.",
    input_parameters=[
        pg.ParameterInfo(name="text", description="Text to summarize"),
    ],
    output_parameters=[
        pg.ParameterInfo(name="summary", description="Summary of text"),
        pg.ParameterInfo(name="keywords", description="Keywords extracted from text"),
    ],
    template=pg.IOExample(
        input={'text': "This is a sample text to summarize."},
        output={
            'summary': "This is a summary of the text.",
            'keywords': ["sample", "text", "summarize"],
        },
    ),
    examples=[
        pg.IOExample(
            input={
                'text': "One sunny afternoon, a group of friends decided to gather at the nearby park to engage in various games and activities. They played soccer, badminton, and basketball, laughing and enjoying each other's company while creating unforgettable memories together."},
            output={
                'summary': "A group of friends enjoyed an afternoon playing sports and making memories at a local park.",
                'keywords': ["friends", "park", "sports", "memories"],
            },
        )
    ],
)

プロンプトを入力パラメータなしで文字列にフォーマットする

まずは、プロンプトを入力パラメータなしで文字列にフォーマットしてみましょう。

PromptoGenでは、プロンプトを文字列にするためのフォーマッターを柔軟に作成できます。

ここでは、入出力変数のキーとバリューを key: value の形式で出力する KeyValuePromptFormatter というフォーマッターを使用します。

入力パラメータなしで文字列にフォーマットするには、フォーマッターの format_prompt_without_input メソッドを使用します。 このメソッドは、プロンプトとフォーマッターを引数に取り、プロンプトを文字列にフォーマットします。

quickstart.py
import promptogen as pg

summarizer = pg.Prompt(
    name="Text Summarizer and Keyword Extractor",
    # ...(other parameters omitted)...
)

formatter = pg.KeyValuePromptFormatter()
print(formatter.format_prompt_without_input(summarizer))
コンソール出力
Summarize text and extract keywords.

Input Parameters:
  - text: Text to summarize

Output Parameters:
  - summary: Summary of text
  - keywords: Keywords extracted from text

Template:
Input:
text: "This is a sample text to summarize."
Output:
summary: """This is a summary of the text."""
keywords: [
 "sample",
 "text",
 "summarize"
]

Example 1:
Input:
text: "One sunny afternoon, a group of friends decided to gather at the nearby park to engage in various games and activities. They played soccer, badminton, and basketball, laughing and enjoying each other's company while creating unforgettable memories together."
Output:
summary: """A group of friends enjoyed an afternoon playing sports and making memories at a local park."""
keywords: [
 "friends",
 "park",
 "sports",
 "memories"
]

プロンプトを入力パラメータありで文字列にフォーマットする

続いて、プロンプトを入力パラメータありで文字列にフォーマットしてみましょう。

入力パラメータは、 dict を使用して指定します。

プロンプトを入力パラメータ込みで文字列にフォーマットするには、format_prompt メソッドを使用します。

quickstart.py
import promptogen as pg

summarizer = pg.Prompt(
    name="Text Summarizer and Keyword Extractor",
    # ...(other parameters omitted)...
)

input_value = {
    'text': "In the realm of software engineering, developers often collaborate on projects using version control systems like Git. They work together to create and maintain well-structured, efficient code, and tackle issues that arise from implementation complexities, evolving user requirements, and system optimization.",
}
print(formatter.format_prompt(summarizer, input_value))
コンソール出力
Summarize text and extract keywords.

Input Parameters:
  - text: Text to summarize

Output Parameters:
  - summary: Summary of text
  - keywords: Keywords extracted from text

Template:
Input:
text: "This is a sample text to summarize."
Output:
summary: """This is a summary of the text."""
keywords: [
 "sample",
 "text",
 "summarize"
]

Example 1:
Input:
text: "One sunny afternoon, a group of friends decided to gather at the nearby park to engage in various games and activities. They played soccer, badminton, and basketball, laughing and enjoying each other's company while creating unforgettable memories together."
Output:
summary: """A group of friends enjoyed an afternoon playing sports and making memories at a local park."""
keywords: [
 "friends",
 "park",
 "sports",
 "memories"
]

--------

Input:
text: "In the realm of software engineering, developers often collaborate on projects using version control systems like Git. They work together to create and maintain well-structured, efficient code, and tackle issues that arise from implementation complexities, evolving user requirements, and system optimization."
Output:

大規模言語モデルを用いて出力を生成する

続いて、大規模言語モデルからの出力を生成してみましょう。

PromptoGen において、大規模言語モデルとの通信は TextLLM という抽象クラスを介して行います。

TextLLM は、PromptoGen で大規模言語モデルを統一的に扱うための抽象クラスです。 pg.FunctionBasedTextLLM は、関数を用いて大規模言語モデルからの出力を生成する TextLLM の実装です。

import promptogen as pg

def generate_text_by_text(text: str) -> str:
    # ここで大規模言語モデルからの出力を生成する
    return "<generated text>"

text_llm = pg.FunctionBasedTextLLM(
    generate_text_by_text=generate_text_by_text,
) 

例: OpenAI ChatGPT API を用いて出力を生成する

このライブラリでは、大規模言語モデルからの出力を生成するための機能は提供していませんが、OpenAI ChatGPT API などを用いることで実現できます。

ここでは、OpenAI ChatGPT API を用いて、入力テキストを要約したテキストを生成してみましょう。

あらかじめ、OpenAI API Key と Organization ID を環境変数に設定しておきます。

import promptogen as pg

import openai
import os

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


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

続いて、プロンプトを入力パラメータ込みで文字列にフォーマットし、大規模言語モデルからの出力を生成してみましょう。

quickstart.py
import promptogen as pg

# ...(omitted)...

text_llm = pg.FunctionBasedTextLLM(
    # ...(omitted)...
)

summarizer = pg.Prompt(
    name="Text Summarizer and Keyword Extractor",
    # ...(other parameters omitted)...
)

raw_req = formatter.format_prompt(summarizer, input_value)
print(raw_req)

raw_resp = text_llm.generate(raw_req)
print(raw_resp)
コンソール出力
summary: """Software engineers collaborate using Git to create and maintain efficient code, and address implementation issues and user requirements."""
keywords: [
 "software engineering",
 "developers",
 "collaborate",
 "projects",
 "version control systems",
 "Git",
 "code",
 "implementation complexities",
 "user requirements",
 "system optimization"
]

出力をPythonオブジェクトに変換する

続いて、LLM出力は単なる文字列なので、Pythonオブジェクトに変換してみましょう。 formatter.parse メソッドを使用することで、LLMからの出力文字列をプロンプトの出力パラメータを用いてパースできます。パースの結果はPythonの dict に格納されます。

quickstart.py
import promptogen as pg

# ...(omitted)...

text_llm = pg.FunctionBasedTextLLM(
    # ...(omitted)...
)

summarizer = pg.Prompt(
    name="Text Summarizer and Keyword Extractor",
    # ...(other parameters omitted)...
)

raw_req = formatter.format_prompt(summarizer, input_value)
print(raw_req)

raw_resp = text_llm.generate(raw_req)
print(raw_resp)

summarized_resp = formatter.parse(summarizer, raw_resp)
print(summarized_resp)
コンソール出力
{'summary': 'Software engineers collaborate using Git to create and maintain efficient code, and address implementation issues and user requirements.', 'keywords': ['software engineering', 'developers', 'collaborate', 'projects', 'version control systems', 'Git', 'code', 'implementation complexities', 'user requirements', 'system optimization']}

この出力は、LLM出力の文字列をパースした結果である dict です。

まとめ

以上、PromptoGen の基本的な使い方を紹介しました。

ここまでの流れは、以下のようになります。

  1. プロンプトを定義する
  2. フォーマッターを定義する
  3. フォーマッターを使って、プロンプトと入力パラメータを文字列にフォーマットする
  4. 大規模言語モデルを用いて、出力を生成する
  5. 出力をPythonオブジェクトに変換する

ここで紹介したのはシンプルな例ではありますが、PromptoGen を用いることで、より複雑なプロンプトや入出力パラメータを簡単に扱うことができます。

また、入力パタメータや出力パラメータとしてプロンプトそのものを指定することができるため、プロンプトを動的に生成することも可能です。