Magentic: Python開発者のためのシームレスなLLM連携

Magentic

プロジェクト概要

Magenticは、大規模言語モデル(LLM)をPythonコードにシームレスに統合するためのPythonライブラリです。@prompt@chatpromptデコレータを用いて、LLMから構造化された出力を返す関数を簡単に作成できます。また、LLMへの問い合わせとツール利用を従来のPythonコードと組み合わせることで、複雑なエージェントシステムを構築することも可能です。

利用方法

  1. インストール:
    pip install magentic
    # または uv を使用
    uv add magentic
    
  2. 設定: OPENAI_API_KEY環境変数を設定して、OpenAIのAPIキーを指定します。他のLLMプロバイダーの設定については、ドキュメントを参照してください。
  3. @promptを使った基本的な利用
    from magentic import prompt
    
    @prompt('「{phrase}」にもっと「ダチ」っぽさを加えてください。')
    def dudeify(phrase: str) -> str: ...
    
    dudeify("Hello, how are you?")
    # 戻り値: "やあ、ダチ!調子どう?元気にしてたか?"
    
  4. @promptを使った構造化出力
    from magentic import prompt
    from pydantic import BaseModel
    
    class Superhero(BaseModel):
        name: str
        age: int
        power: str
        enemies: list[str]
    
    @prompt("「{name}」という名前のスーパーヒーローを作成してください。")
    def create_superhero(name: str) -> Superhero: ...
    
    create_superhero("Garden Man")
    # 戻り値: Superhero(name='Garden Man', age=30, power='Control over plants', enemies=['Pollution Man', 'Concrete Woman'])
    
  5. @chatpromptを使ったチャットプロンプト
    from magentic import chatprompt, AssistantMessage, SystemMessage, UserMessage
    from pydantic import BaseModel
    
    class Quote(BaseModel):
        quote: str
        character: str
    
    @chatprompt(
        SystemMessage("あなたは映画好きです。"),
        UserMessage("ハリー・ポッターで一番好きなセリフは何ですか?"),
        AssistantMessage(
            Quote(
                quote="夢にとらわれて、生きることを忘れてはいけない。",
                character="アルバス・ダンブルドア",
            )
        ),
        UserMessage("「{movie}」で一番好きなセリフは何ですか?"),
    )
    def get_movie_quote(movie: str) -> Quote: ...
    
    get_movie_quote("Iron Man")
    # 戻り値: Quote(quote='I am Iron Man.', character='Tony Stark')
    
  6. FunctionCallを使った関数呼び出し
    from typing import Literal
    from magentic import prompt, FunctionCall
    
    def search_twitter(query: str, category: Literal["latest", "people"]) -> str:
        """Twitterでクエリを検索します。"""
        print(f"Twitterでカテゴリ「{category!r}」の「{query!r}」を検索しています")
        return "<twitter results>"
    
    @prompt(
        "適切な検索関数を使って、次の質問に答えてください: {question}",
        functions=[search_twitter],
    )
    def perform_search(question: str) -> FunctionCall[str]: ...
    
    output = perform_search("LLMに関する最新ニュースは何ですか?")
    # output: FunctionCall(search_twitter, 'LLMs', 'latest')
    output()
    # 出力: Twitterでカテゴリ「latest」の「LLMs」を検索しています
    # 戻り値: '<twitter results>'
    
  7. @prompt_chainを使ったプロンプトチェーン
    from magentic import prompt_chain
    
    def get_current_weather(location, unit="fahrenheit"):
        """指定された場所の現在の天気を取得します。"""
        return {"temperature": "72", "forecast": ["sunny", "windy"]}
    
    @prompt_chain(
        "{city}の天気はどうですか?",
        functions=[get_current_weather],
    )
    def describe_weather(city: str) -> str: ...
    
    describe_weather("Boston")
    # 戻り値: 'ボストンの現在の天気は72°Fで、晴れ時々風が強いです。'
    

主な機能

  • 構造化出力: PydanticモデルやPythonの組み込み型を構造化出力に対応しています。
  • ストリーミング: 生成中に構造化出力や関数呼び出しのストリーミングが可能です。
  • LLMを活用したリトライ: 複雑な出力スキーマに対するLLMの順守を向上させます。
  • オブザーバビリティ: OpenTelemetryと統合し、ログ記録とトレースをサポート。Pydantic Logfireとのネイティブ統合も含まれます。
  • 型アノテーション: リンターやIDEとの連携が良好です。
  • 設定: OpenAI、Anthropic、Ollamaなど、複数のLLMプロバイダーに対応しています。
  • チャットプロンプト: 複数ターンでの会話やFew-shotプロンプトが可能です。
  • 並列関数呼び出し: 複数の関数を並行して呼び出すのをサポートします。
  • Vision: LLMによる画像・視覚処理機能を提供します。
  • フォーマット: 出力形式を制御するためのツールがあります。
  • Asyncioサポート: 非同期処理に対応しています。
  • 関数チェーン: LLM駆動の関数を他のLLM関数へのツールとして提供し、複雑なエージェントフローを可能にします。

ターゲットユーザー

大規模言語モデルをPythonアプリケーションに統合したい開発者やエンジニア、特に以下の分野に注力している方に最適です。 * エージェントシステムの構築 * LLMからの構造化データ生成 * LLM駆動の関数によるタスク自動化 * 自然言語入力に基づく動的な関数呼び出しへのLLMの活用

プロジェクトリンク

アプリケーションシナリオ

  • データ抽出と変換: 非構造化テキストから構造化情報(例:名前、住所、製品詳細)を抽出します。
  • コンテンツ自動生成: 製品説明、要約、特定の形式のクリエイティブな文章など、動的なコンテンツを生成します。
  • インテリジェントエージェントとチャットボット: ユーザーの意図を理解し、外部ツール(API、データベース)を呼び出し、構造化された応答を返す会話型エージェントを開発します。
  • ワークフロー自動化: LLMが意思決定を行ったり、定義済みのPython関数を呼び出してアクションを実行したりする自動化されたワークフローを作成します。
  • 自然言語インターフェース: ユーザーが自然言語を使って複雑なシステムと対話できるインターフェースを構築し、Magenticがこれらの入力を関数呼び出しに変換します。
  • コード生成支援: プロンプトに基づいてコードスニペットや関数定義を生成し、構造化出力機能を活用することができます。

この記事を共有