クイックスタート
テキスト要約&キーワード抽出プロンプトを作成する¶
まずは、プロンプトを作成してみましょう。このクイックスタートガイドでは、テキストを入力として受け取り、そのテキストの要約文とキーワードを出力するプロンプトを作成します。
つまり、 (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] |
これらの情報を使って、プロンプトを作成します。
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
メソッドを使用します。
このメソッドは、プロンプトとフォーマッターを引数に取り、プロンプトを文字列にフォーマットします。
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
メソッドを使用します。
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"),
)
続いて、プロンプトを入力パラメータ込みで文字列にフォーマットし、大規模言語モデルからの出力を生成してみましょう。
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
に格納されます。
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 の基本的な使い方を紹介しました。
ここまでの流れは、以下のようになります。
- プロンプトを定義する
- フォーマッターを定義する
- フォーマッターを使って、プロンプトと入力パラメータを文字列にフォーマットする
- 大規模言語モデルを用いて、出力を生成する
- 出力をPythonオブジェクトに変換する
ここで紹介したのはシンプルな例ではありますが、PromptoGen を用いることで、より複雑なプロンプトや入出力パラメータを簡単に扱うことができます。
また、入力パタメータや出力パラメータとしてプロンプトそのものを指定することができるため、プロンプトを動的に生成することも可能です。