🎉

LLMずのコミュニケヌションをより効率化するPythonラむブラリ「PromptoGen」をリリヌスしたした🎉

に公開
2023/08/28

TL;DR

Pythonラむブラリ 「PromptoGen」 をリリヌスしたした 🎉

PromptoGenは、「LLMずPythonの間のギャップをシヌムレスに繋ぐこずで、効率的で未来を芋据えたコミュニケヌションを実珟する。」 ずいうビゞョンの元、
あえお具䜓的なLLM実装ぞの䟝存性をなくし、抜象化を行う こずで、
今埌のLLM進化に぀いお行きやすい基盀を䜜る OSSプロゞェクトです。

この蚘事では、PromptoGen プロゞェクトの玹介やラむブラリの䜿い方を玹介したす。


ドキュメント: https://promptogen.zawakin.dev/ja

゜ヌスコヌド:
https://github.com/zawakin/promptogen


実際にラむブラリの内容を玹介しおいきたす。

📚 PromptoGen: LLMずの効率的で拡匵可胜なコミュニケヌションを実珟

🚀 ビゞョン

"LLMずPythonの間のギャップをシヌムレスに繋ぐこずで、効率的で未来を芋据えたコミュニケヌションを実珟する。"

💡 LLMラむブラリの䞻な課題:

  • プロンプト゚ンゞニアリングの゚コシステムが䞍足: プロンプトの䜜成や共有が困難になる
  • 特定のLLMバヌゞョンぞの匷い䟝存性: 高頻床なLLMの曎新に察しお脆匱になる
  • 実装が耇雑: カスタマむズが困難になる

🎯 PromptoGenを遞ぶ理由は

  1. LLM I/OずPythonオブゞェクト間のシヌムレスな倉換: LLMずのむンタラクションを合理化したす
  2. 柔軟でナニヌクなむンタヌフェヌス: ナヌザヌのカスタマむズず拡匵性を保蚌したす
  3. 将来の蚭蚈: LLMの進化に察する䟝存を枛少させお将来に備えたす

他のラむブラリずの比范: 倚くは特定のLLMバヌゞョンに結び぀いおおり、将来の適応性に課題がありたす。Pydanticデヌタクラスラむブラリだけに䟝存するPromptoGenは、LLM文字列ずPythonオブゞェクトずの間を橋枡しするこずに特化しおいたす。

🧰 䞻な機胜:

  • Prompt デヌタクラス: LLM通信を暙準化し、プロンプト゚ンゞニアリングをサポヌト
  • TextLLM むンタヌフェヌス: LLMの詳现からの独立
  • PromptFormatter むンタヌフェヌス: ナヌザヌのための高いカスタマむズ性

🎉 利点:

  • 🧩 モゞュラヌ拡匵可胜: 自由に組み合わせ、カスタムコンポヌネントを远加
  • 🛡 未来の倉曎に匷い: 新しいモデルのアップデヌトに匷く立぀
  • 🔧 維持しやすい: 異なるLLMのためのデバッグや埮調敎が容易

⚠ サポヌトされおいない機胜:

  • LLMずの盎接通信: 盎接のLLMずの䌚話よりも効率的なむンタヌフェヌスを優先したす
  • プロンプトのバヌゞョン管理: シンプルに保぀ため、バヌゞョンの耇雑さを远加するこずを避けたす
  • 特定のLLMの最適化: 単䞀のLLMのための最適化よりもLLM党䜓の適応性に焊点を圓おたす

📖 詳现に぀いお

PromptoGenずはを参照しおください。

リリヌス情報

随時、以䞋のアカりントでお知らせしたす。

https://twitter.com/PromptoGen

動䜜環境

Python 3.8 以䞊

むンストヌル

pip install promptogen

むンポヌト

import promptogen as pg

䜿い方

なにはずもあれ、䜿い方を玹介しおみたす。

TextLLM: 柔軟なLLM連携

pg.TextLLMを介すこずで、PromptoGenは倚皮倚様な倧芏暡蚀語モデル(LLM)ずの連携を実珟したす。

TextLLMむンタヌフェむスの実装䟋

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")

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

このむンタヌフェむスの採甚により、PromptoGenは異なるLLMやそのバヌゞョンをスムヌズに組み蟌むこずが可胜になりたす。ナヌザヌはLLMによらない䞀貫した方法で、様々なLLMを掻甚できるようになりたす。

぀たり、LLM実装ではなく pg.TextLLM に䟝存したプログラムを曞くず、どんなLLMでも pg.TextLLM を実装しさえすればそのプログラムが䜿えるこずになりたす。

OpenAI APIを䜿ったTextLLM実装䟋

OpenAI APIを䜿ったTextLLM実装䟋 を参照しおください。

Prompt: プロンプト

プロンプトの䜜成

PromptoGen での䞀番の基本芁玠は プロンプト(Prompt) です。

䟋えば、テキストを入力ずし、芁玄ずキヌワヌドを抜出するような呜什をLLMに察しお行う堎合を考えおみたしょう。

PromptoGen においお、この呜什は Prompt デヌタクラスのむンスタンスずしお衚珟されたす。

Prompt クラスは次のパラメヌタを持ちたす。

  • プロンプト名
  • プロンプト説明(呜什)
  • 入力パラメヌタ情報
  • 出力パラメヌタ情報
  • 入出力テンプレヌト
  • 入出力䟋(few-shots examples)の配列

具䜓的には次のような定矩ずなりたす。

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"],
        },
    ),
    # 入出力䟋(few-shots examples)の配列
    examples=[
        pg.IOExample(
            input={
                'text': "One sunny afternoon, ...(略)"},
            output={
                'summary': "A group of friends enjoyed an afternoon playing sports and making memories at a local park.",
                'keywords': ["friends", "park", "sports", "memories"],
            },
        )
    ],
)

このように明確な定矩を持぀こずで、プロンプトの゚コシステムを圢成しやすくなりたす。

基本的なナヌスケヌスでは、このように䞀から Prompt を手動で定矩するより、埌述するような Prompt 自動生成をLLMにしおもらったあずに手盎しをしお䜿うこずが倚いです。

プロンプトの保存

import promptogen as pg

summarizer = pg.Prompt(
    name="Text Summarizer and Keyword Extractor",
    # ...(略)
)
summarizer.to_json_file("summarizer.json")

プロンプトの読み蟌み

import promptogen as pg

summarizer = pg.Prompt.from_json_file("summarizer.json")

PromptFormatter: プロンプトのフォヌマット

さお、Prompt クラスのむンスタンスを実際にLLMに送信するために、文字列に倉換する必芁がありたす。PromptoGenでは、pg.PromptFormatterむンタヌフェむスを介しお、プロンプトを任意の圢匏の文字列に倉換するこずができたす。

PromptoGenでは様々な圢匏をサポヌトしおいたす。

  • KeyValue圢匏 key: value
  • JSON圢匏 {"key": "value"}
  • etc.

プロンプトフォヌマット基本構造

formatter.format_prompt メ゜ッドを䜿甚しお、プロンプトずそれに察する入力を文字列に倉換できたす。

key: value 圢匏のプロンプトのフォヌマットを䜿甚するには、pg.KeyValuePromptFormatterを䜿甚したす。
パラメヌタ情報やテンプレヌトを衚瀺するかどうかは PromptFormatterConfig で蚭定できたす。

フォヌマットされたプロンプト文字列は、以䞋のような基本的な構造を持ちたす。

import promptogen as pg

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

formatter = pg.KeyValuePromptFormatter()

input_value = {
    "text": "In the realm of software engineering, ...(略)",
}
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, ...(略)"
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, ...(略)"
Output:

倧芏暡蚀語モデルからの出力のパヌス

さきほどのプロンプト文字列を入力ずしお、倧芏暡蚀語モデル(GPT-3.5, GPT-4など)から出力を埗たす。

summary: "This is a summary of the text."
keywords: ['sample', 'text', 'summarize']

formatter.parse を䜿っお、出力をパヌスしおみたす。結果は dict 型の倀ずなりたす。

import promptogen as pg

formatter = pg.KeyValuePromptFormatter()

raw_resp = """summary: "This is a summary of the text."
keywords: ['sample', 'text', 'summarize']"""
summarized_resp = formatter.parse(summarizer, raw_resp) # `dict`型で返る
print(summarized_resp)
{'summary': 'This is a summary of the text.', 'keywords': ['sample', 'text', 'summarize']}

PromptRunner: プロンプト実行を効率的に

pg.PromptRunnerは、プロンプトの実行をシンプルに、か぀効率的にサポヌトしたす。

PromptRunnerを䜿ったプロンプト実行

import promptogen as pg

# `pg.TextLLM`むンタヌフェむスを実装したLLMを甚意
text_llm = YourTextLLM(model="your-model")

formatter = pg.KeyValuePromptFormatter()
runner = pg.TextLLMPromptRunner(llm=text_llm, formatter=formatter)

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

input_value = {
    "text": "In the realm of software engineering, ...",
}

output_value = runner.run_prompt(summarizer, input_value)
print(output_value)

pg.PromptRunnerは、PromptoGenを䜿ったプロンプトの実行をより盎感的で効率的にするためのキヌずなるツヌルです。

応甚䟋

いく぀かPromptoGenを䜿った応甚䟋をみおみたしょう。

応甚䟋1: プロンプト実行のむンタヌセプタ

プロンプト実行のむンタヌセプタ

TextLLMPromptRunner では、プロンプトの前凊理や埌凊理を行うために「むンタヌセプタ(PromptInterceptor)」ずいうむンタヌフェむスがありたす。

PromptInterceptor を䜿うこずで、プロンプトの実行前に入力を曞き換えたり、プロンプトの実行埌に出力を曞き換えたりするこずができたす。

䟋えば、 ValueTranslatorInterceptor を䜿えば、 ナヌザヌは日本語で通信しおいるようにみえるが、実際のLLMずの通信は英語で行う こずができたす。

入出力翻蚳むンタヌセプタ実装䟋

このような耇雑な凊理が PromptoGen では数行倉曎するだけで実珟できたす。実際のプロンプト実行甚のLLMず、翻蚳甚のLLMはそれぞれ別のものを䜿うこずができたす。

import promptogen as pg
from promptogen.prompt_interceptor.translate_interceptor import ValueTranslatorInterceptor

formatter = pg.KeyValuePromptFormatter()
llm = YourTextLLM(model="your-model")
translator_llm = YourTextLLM(model="your-model-translator")

interceptors = [
    ValueTranslatorInterceptor(llm=translator_llm, from_lang="Japanese", to_lang="English"),
]

prompt_runner = pg.TextLLMPromptRunner(llm=llm, formatter=formatter, interceptors=interceptors)
# ...(略)

応甚䟋2: プロンプト自動生成

プロンプト自動生成

pg.Prompt デヌタクラスも dict で衚せるので、「プロンプト説明」ず「䜜成背景」を入力ずし、プロンプトを生成させるこずができたす。

PromptoGen ではいく぀か事前に定矩されたプロンプトがあり、そのうちの䞀぀である PromptCreatorPrompt は次のような図で衚される入出力パラメヌタを持ちたす。

プロンプト自動生成実装䟋

実際にプロンプト自動生成を行うコヌドを芋おみたしょう。

今回は、文脈(context)ず質問(question)を入力ずし、回答(answer)を出力する ずいうプロンプトを䜜成したす。

import promptogen as pg
from promptogen.prompt_collection import PromptCreatorPrompt

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

formatter = pg.KeyValuePromptFormatter()
prompt_runner = pg.TextLLMPromptRunner(llm=llm, formatter=formatter)

prompt_creator_prompt = PromptCreatorPrompt()

def create_context_qa_prompt() -> pg.Prompt:
    input_value = {
        # ここでプロンプトの説明を定矩
        "description": "Answer the question for the given context.",
        # ここでプロンプトの䜜成背景を定矩
        "background": "(context: str, question: str) -> (answer: str)",
    }
    resp = prompt_runner.run_prompt(prompt_creator_prompt, input_value=input_value)
    return pg.Prompt.from_dict(resp["prompt"])

context_qa_prompt = create_context_qa_prompt()

input_value = {
    "context": "倪郎は花子に花束を枡した。",
    "question": "倪郎は誰に花束を枡した",
}
output_value = prompt_runner.run_prompt(context_qa_prompt, input_value=input_value)
print(output_value)
{'answer': '花子'}

このように、PromptoGenでは、プロンプトの自動生成 ず プロンプトの実行 を効率的に行うこずができたす。

詳现はプロンプト自動生成を参照しおください。

より詳现に知りたい方ぞ

ドキュメントを参照しおください。

゜ヌスコヌド

https://github.com/zawakin/promptogen

スタヌしおもらえるず喜びたす

たずめ

PromptoGenは、「効率的で拡匵可胜な、倧芏暡蚀語モデル(LLM)ずのコミュニケヌションを実珟する」 ずいうビゞョンの元、あえお具䜓的なLLM実装ぞの䟝存性をなくし、抜象化を行う こずで、今埌のLLM進化に぀いお行きやすい基盀を䜜る OSSプロゞェクトです。

倚くのLLM関連ラむブラリが抱える課題を解決するために、PromptoGenは以䞋のような特城を持ちたす。

  • プロンプト゚ンゞニアリングの゚コシステム圢成: pg.Prompt デヌタクラス
  • LLM実装からの独立性確保: pg.TextLLM むンタヌフェむス
  • カスタマむズ性の向䞊: pg.PromptFormatter むンタヌフェむス

拡匵性が高いため、PromptoGenはさたざたな応甚が可胜です。

おわりに

ここたで読んでいただき、ありがずうございたした

私は、株匏䌚瀟ナレッゞワヌクのAIチヌムで、普段はGoのバック゚ンド開発や倧芏暡蚀語モデル(LLM)を掻甚したプロダクト開発を行っおいたす。

PromptoGenは、私が個人開発ずしお始めたものですが、ナレッゞワヌクの「ナレッゞスポンサヌシップ」ずいう制床を甚いお、業務時間内に開発を行うこずができたした。

ラむブラリの改善を行ったり、日英のドキュメント䜜成などを行うずなるず、個人開発ずしおは時間がかかり、公開するに至るたで難しい郚分もありたしたが、ナレッゞワヌクの制床を䜿うこずで、十分な時間を確保できたため、より良いラむブラリを䜜るこずができたず思いたす。

実際に、瀟内においおも、PromptoGenを甚いおLLMベンチマヌクを取っおみるなど、PromptoGenの掻甚䟋があり、今埌もナレッゞワヌクのAIチヌムで掻甚しおいきたいず考えおいたす。

たた、ナレッゞワヌクでは採甚も積極的に行っおいたすので、興味のある方はX(Twitter) DMなど、ぜひお声がけください。

求人䞀芧はこちら

特に、MLOps などの分野に興味のあるバック゚ンド゚ンゞニアの方がいれば倧歓迎ですバック゚ンドフロント゚ンド党䜓的に募集しおたす

䞀緒に開発したしょう

PromptoGenは、ただただ改善の䜙地がありたす。もし、このラむブラリに興味を持っおいただけた方がいらっしゃいたしたら、ぜひ、IssueやPull Requestを送っおいただけるず嬉しいです。

リリヌス情報は PromptoGen (@PromptoGen) でお知らせしおいく予定です。

https://twitter.com/PromptoGen

いいね、シェア、フォロヌなど、よろしくお願いしたす

https://twitter.com/zawawahoge/status/1693769751246655640

https://twitter.com/PromptoGen/status/1693768220266881224

䜜者もよろしくお願いしたす。→ zawakin(@zawawahoge) 

参考にしたプロゞェクト

  • FastAPI: OSSの雛圢やドキュメント、蚭蚈思想
  • mkdocs-material: ドキュメント
  • LangChain: プロンプトやCIの仕組み
  • AutoGPT: プロンプト
  • BabyAGI: プロンプト
  • Pydantic: デヌタクラスやCIの仕組み
株匏䌚瀟ナレッゞワヌク

Discussion