OSS Agents JP
オープンソース AI エージェント 日本語ガイド
← 一覧へ
Outlines
OTHER

Outlines

Outlines

LLMの出力をJSON、XML、正規表現などの構造化フォーマットに制約できるPythonフレームワーク。プロンプトエンジニアリングの精度を高め、データ抽出やAPI連携を確実にします。

#構造化生成#Python#スキーマ
EDITOR'S TAKE

編集部メモ

生成中にLLM出力を構造化制約。後処理パスを廃絶

Outlinesは、LLM出力の不確実性を生成段階で解決するPythonフレームワークです。従来のregex検証やパース失敗と異なり、生成過程そのものに制約を組み込むため、JSONやXML、カスタムスキーマが確実に得られます。Pydanticモデルで複雑な型定義も簡潔に書でき、OpenAIから自社運用のvLLMまで複数モデル対応が強み。本番環境でLLMを動かすデータエンジニアやバックエンド開発者にとって、出力の予測可能性と信頼性を飛躍的に高める選択肢になります。

USE CASES

こんな場面で使う

  • カスタマーサポートシステムで、チャットボットの回答を定義済みカテゴリから選ばせ、自動ルーティング失敗を防ぐ
  • ECサイト商品ページから価格・在庫・仕様をLLMで抽出し、JSON形式で確実にデータベースに保存する
  • 営業提案書から会議日時・参加者・決定事項を抽出し、構造化スケジュールデータへ直結させる
DIFFERENTIATOR

類似ツールとの違い

LangChainやLlamaIndexは上位レイヤーの使いやすさを重視するのに対し、Outlinesは構造化出力に特化。パース後修正ではなく生成制約そのものに投資し、vLLMやオンプレLLMでも動く点で、大規模・自主運用環境の信頼性要件に応える
CAVEAT

注意点・向かない用途

⚠️ Pythonフレームワークのため他言語統合は限定的。スキーマが複雑化すると生成速度低下の可能性があり、自然言語的な微細なニュアンス出力には向きません
BEST FOR

向いている読者

LLMアプリケーション開発者データエンジニア・API開発者本番環境の信頼性重視な企業システム構築者

— OSS Agents JP 編集部による独自評価(Outlines に関する観察)

REPO STATS

リポジトリ統計

⭐ Stars
-
🍴 Forks
-
⚠️ Open Issues
-
🌿 Language
-
📄 License
-
🕒 最終更新
-
📅 公開日
-
🌿 Branch
-
REFERENCE

公式ドキュメント(README)

本ハブの独自評価は上記「編集部メモ」が一次情報です。以下は GitHub README の参考転載(折りたたみ)。

📖 GitHub README の日本語訳を読む(AI 自動翻訳 / 参考情報)

— AI による自動翻訳 (2026.05.21 更新)。正確な情報は GitHub の原文 をご確認ください。

Outlines Logo Outlines Logo

🗒️ LLM の構造化出力 🗒️

❤👷️ とともに、.txt チームが作成しました
NVIDIA、Cohere、HuggingFace、vLLM などから信頼されています。

PyPI Version Downloads Stars

Discord Blog Twitter


.txt API は現在早期アクセス段階です。こちらからアクセスをリクエストしてください →

🚀 構造化生成の未来を築く

選定されたパートナーと共に、構造化生成向けの新しいインターフェースを開発中です。

XML、FHIR、カスタムスキーマまたはグラマーが必要ですか?お問い合わせください。

スキーマを監査します:1 つのスキーマを共有していただければ、生成中に何が破損するか、それを修正する制約、修正前後のコンプライアンス率を表示します。こちらからサインアップしてください

目次

Outlines を選ぶ理由

LLM は強力ですが、その出力は予測不可能です。ほとんどのソリューションは、解析、正規表現、または簡単に壊れやすいコードを使用して、生成後に悪い出力を修正しようとしています。

Outlines は、生成中に構造化出力を保証します — 任意の LLM から直接。

  • 任意のモデルで動作 - 同じコードが OpenAI、Ollama、vLLM など複数で実行されます
  • シンプルな統合 - 希望の出力タイプを渡すだけです:model(prompt, output_type)
  • 保証された有効な構造 - 解析の問題や壊れた JSON はもうありません
  • プロバイダの独立性 - コードを変更せずにモデルを切り替えます

Outlines の哲学

Outlines は、Python 独自の型システムを反映したシンプルなパターンに従います。希望の出力タイプを指定するだけで、Outlines はデータがその構造と正確に一致することを保証します:

  • はい/いいえの応答の場合、Literal["Yes", "No"] を使用します
  • 数値の場合、int を使用します
  • 複雑なオブジェクトの場合、Pydantic モデルで構造を定義します

クイックスタート

Outlinesの始め方は簡単です。

1. Outlinesをインストール

pip install outlines

2. 好みのモデルに接続

import outlines
from transformers import AutoTokenizer, AutoModelForCausalLM


MODEL_NAME = "microsoft/Phi-3-mini-4k-instruct"
model = outlines.from_transformers(
    AutoModelForCausalLM.from_pretrained(MODEL_NAME, device_map="auto"),
    AutoTokenizer.from_pretrained(MODEL_NAME)
)

3. シンプルな構造化出力から始める

from typing import Literal
from pydantic import BaseModel


# Simple classification
sentiment = model(
    "Analyze: 'This product completely changed my life!'",
    Literal["Positive", "Negative", "Neutral"]
)
print(sentiment)  # "Positive"

# Extract specific types
temperature = model("What's the boiling point of water in Celsius?", int)
print(temperature)  # 100

4. 複雑な構造を作成

from pydantic import BaseModel
from enum import Enum

class Rating(Enum):
    poor = 1
    fair = 2
    good = 3
    excellent = 4

class ProductReview(BaseModel):
    rating: Rating
    pros: list[str]
    cons: list[str]
    summary: str

review = model(
    "Review: The XPS 13 has great battery life and a stunning display, but it runs hot and the webcam is poor quality.",
    ProductReview,
    max_new_tokens=200,
)

review = ProductReview.model_validate_json(review)
print(f"Rating: {review.rating.name}")  # "Rating: good"
print(f"Pros: {review.pros}")           # "Pros: ['great battery life', 'stunning display']"
print(f"Summary: {review.summary}")     # "Summary: Good laptop with great display but thermal issues"

実世界の例

以下は、Outlines が一般的な問題をどのように解決するかを示す本番対応例です。

🙋‍♂️ カスタマーサポート トリアージ
この例は、自由形式のカスタマーメールを構造化されたサービスチケットに変換する方法を示しています。優先度、カテゴリ、エスカレーションフラグなどの属性を解析することで、サポート問題の自動ルーティングと処理が可能になります。
import outlines
from enum import Enum
from pydantic import BaseModel
from transformers import AutoTokenizer, AutoModelForCausalLM
from typing import List


MODEL_NAME = "microsoft/Phi-3-mini-4k-instruct"
model = outlines.from_transformers(
    AutoModelForCausalLM.from_pretrained(MODEL_NAME, device_map="auto"),
    AutoTokenizer.from_pretrained(MODEL_NAME)
)


def alert_manager(ticket):
    print("Alert!", ticket)


class TicketPriority(str, Enum):
    low = "low"
    medium = "medium"
    high = "high"
    urgent = "urgent"

class ServiceTicket(BaseModel):
    priority: TicketPriority
    category: str
    requires_manager: bool
    summary: str
    action_items: List[str]


customer_email = """
Subject: URGENT - Cannot access my account after payment

I paid for the premium plan 3 hours ago and still can't access any features.
I've tried logging out and back in multiple times. This is unacceptable as I
have a client presentation in an hour and need the analytics dashboard.
Please fix this immediately or refund my payment.
"""

prompt = f"""
<|im_start|>user
Analyze this customer email:

{customer_email}
<|im_end|>
<|im_start|>assistant
"""

ticket = model(
    prompt,
    ServiceTicket,
    max_new_tokens=500
)

# Use structured data to route the ticket
ticket = ServiceTicket.model_validate_json(ticket)
if ticket.priority == "urgent" or ticket.requires_manager:
    alert_manager(ticket)
📦 E コマース商品カテゴリ化
このユースケースは、Outlines が商品説明を構造化されたカテゴリ化データ(メインカテゴリ、サブカテゴリ、属性など)に変換して、在庫管理などのタスクを効率化する方法を示しています。各商品説明は自動的に処理され、手動カテゴリ化の手間が削減されます。
import outlines
from pydantic import BaseModel
from transformers import AutoTokenizer, AutoModelForCausalLM
from typing import List, Optional


MODEL_NAME = "microsoft/Phi-3-mini-4k-instruct"
model = outlines.from_transformers(
    AutoModelForCausalLM.from_pretrained(MODEL_NAME, device_map="auto"),
    AutoTokenizer.from_pretrained(MODEL_NAME)
)


def update_inventory(product, category, sub_category):
    print(f"Updated {product.split(',')[0]} in category {category}/{sub_category}")


class ProductCategory(BaseModel):
    main_category: str
    sub_category: str
    attributes: List[str]
    brand_match: Optional[str]

# Process product descriptions in batches
product_descriptions = [
    "Apple iPhone 15 Pro Max 256GB Titanium, 6.7-inch Super Retina XDR display with ProMotion",
    "Organic Cotton T-Shirt, Men's Medium, Navy Blue, 100% Sustainable Materials",
    "KitchenAid Stand Mixer, 5 Quart, Red, 10-Speed Settings with Dough Hook Attachment"
]

template = outlines.Template.from_string("""
<|im_start|>user
Categorize this product:

{{ description }}
<|im_end|>
<|im_start|>assistant
""")

# Get structured categorization for all products
categories = model(
    [template(description=desc) for desc in product_descriptions],
    ProductCategory,
    max_new_tokens=200
)

# Use categorization for inventory management
categories = [
    ProductCategory.model_validate_json(category) for category in categories
]
for product, category in zip(product_descriptions, categories):
    update_inventory(product, category.main_category, category.sub_category)
📊 不完全なデータでイベント詳細を解析
この例は、Outlines を使用してイベント説明を構造化された情報(イベント名、日付、場所、タイプ、トピックなど)に解析し、データが不完全な場合でも対応します。ユニオン型を活用して、構造化されたイベントデータまたはフォールバックの「わかりません」のいずれかを返し、様々なシナリオでの堅牢な抽出を確保します。