🗒️ LLM の構造化出力 🗒️
❤👷️ とともに、.txt チームが作成しました
NVIDIA、Cohere、HuggingFace、vLLM などから信頼されています。
.txt API は現在早期アクセス段階です。こちらからアクセスをリクエストしてください →
選定されたパートナーと共に、構造化生成向けの新しいインターフェースを開発中です。
XML、FHIR、カスタムスキーマまたはグラマーが必要ですか?お問い合わせください。
スキーマを監査します:1 つのスキーマを共有していただければ、生成中に何が破損するか、それを修正する制約、修正前後のコンプライアンス率を表示します。こちらからサインアップしてください。
LLM は強力ですが、その出力は予測不可能です。ほとんどのソリューションは、解析、正規表現、または簡単に壊れやすいコードを使用して、生成後に悪い出力を修正しようとしています。
Outlines は、生成中に構造化出力を保証します — 任意の LLM から直接。
- 任意のモデルで動作 - 同じコードが OpenAI、Ollama、vLLM など複数で実行されます
- シンプルな統合 - 希望の出力タイプを渡すだけです:
model(prompt, output_type) - 保証された有効な構造 - 解析の問題や壊れた JSON はもうありません
- プロバイダの独立性 - コードを変更せずにモデルを切り替えます
Outlines は、Python 独自の型システムを反映したシンプルなパターンに従います。希望の出力タイプを指定するだけで、Outlines はデータがその構造と正確に一致することを保証します:
- はい/いいえの応答の場合、
Literal["Yes", "No"]を使用します - 数値の場合、
intを使用します - 複雑なオブジェクトの場合、Pydantic モデルで構造を定義します
Outlinesの始め方は簡単です。
pip install outlinesimport 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)
)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) # 100from 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)

