output control and formatting

Output Control & Formatting:精确控制 AI 输出的全面指南

一、输出控制的重要性 大语言模型的自由生成特性是一把双刃剑——带来创造力但也带来不可预测性。在工程化应用中,输出控制是决定 AI 能否可靠交付的关键能力。 1.1 失控输出的代价 场景 失控表现 影响 客服自动化 格式混乱、缺少关键信息 客户投诉 数据批处理 输出结构不一致,无法解析 下游管道崩溃 代码生成 格式不对、缺少注释 CI/CD 失败 内容生成 多版本风格不统一 品牌一致性受损 二、格式约束技术 2.1 Markdown 格式控制 def markdown_format_control(): prompt = """请严格按照以下 Markdown 格式输出: # 标题 ## 摘要 <200 字以内的摘要> ## 核心要点 - 要点 1:<具体内容> - 要点 2:<具体内容> - 要点 3:<具体内容> ## 数据表格 | 指标 | 值 | 说明 | |------|----|------| | <名称> | <数值> | <说明> | ## 结论 <150 字以内> --- 注意:每个部分都必须输出,缺失则不合格。""" return prompt # 格式验证函数 import re def validate_markdown_structure(text: str) -> dict: """验证 Markdown 结构完整性""" checks = { "has_title": bool(re.search(r"^# ", text, re.MULTILINE)), "has_summary": bool(re.search(r"^## 摘要", text, re.MULTILINE)), "has_keypoints": bool(re.search(r"^## 核心要点", text, re.MULTILINE)), "has_table": bool(re.search(r"\|.*\|.*\|", text)), "has_conclusion": bool(re.search(r"^## 结论", text, re.MULTILINE)), "summary_length_ok": None, } # 检查摘要长度 summary_match = re.search( r"## 摘要\s*\n(.+?)(?=\n##)", text, re.DOTALL ) if summary_match: checks["summary_length_ok"] = len(summary_match.group(1)) < 200 return checks 2.2 JSON 输出控制 通用的 JSON 约束 Prompt 输出必须是一个合法的 JSON 对象,格式如下: { "status": "success | error", "data": { // 按需填充 }, "metadata": { "timestamp": "<当前时间戳>", "confidence": 0.0-1.0 } } 要求: 1. 所有 key 必须使用双引号 2. 字符串值必须使用双引号 3. 不能包含注释或 Markdown 代码块标记 4. 不能有其他文字描述 5. 一定输出纯 JSON JSON 修复技术 import json import re def extract_and_fix_json(text: str) -> dict: """从模型输出中提取并修复 JSON""" # Step 1: 尝试提取 JSON 块 # 移除代码块标记 text = re.sub(r'```json\s*|\s*```', '', text) try: return json.loads(text) except json.JSONDecodeError: pass # Step 2: 常见修复 fixes = [ # 修复单引号 lambda s: s.replace("'", '"'), # 修复末尾逗号 lambda s: re.sub(r',(\s*[}\]])', r'\1', s), # 修复注释 lambda s: re.sub(r'//.*?\n', '\n', s), # 修复布尔值 lambda s: s.replace('True', 'true').replace('False', 'false'), ] for fix in fixes: try: return json.loads(fix(text)) except json.JSONDecodeError: continue # Step 3: 最后手段 - 重新生成 raise ValueError("无法修复 JSON 输出") 2.3 XML 输出控制 <response> <metadata> <model>gpt-4</model> <timestamp>2026-06-25T12:00:00Z</timestamp> <type>analysis</type> </metadata> <content> <section id="overview"> <title>概述</title> <paragraph>{overview_text}</paragraph> </section> <section id="details"> <title>详细信息</title> <item key="point_1">{detail_1}</item> <item key="point_2">{detail_2}</item> </section> </content> <validation> <passed>true</passed> <score>{quality_score}</score> </validation> </response> 三、结构化输出技术 3.1 Pydantic + Function Calling from pydantic import BaseModel, Field, validator from typing import List, Optional from openai import OpenAI class ProductReview(BaseModel): """结构化的产品评价输出""" product_name: str = Field(description="产品名称") rating: int = Field(ge=1, le=5, description="评分 1-5") pros: List[str] = Field(min_length=1, max_length=5, description="优点列表") cons: List[str] = Field(min_length=1, max_length=5, description="缺点列表") summary: str = Field(max_length=200, description="总结摘要") recommend: bool = Field(description="是否推荐") @validator('rating') def rating_matches_sentiment(cls, v, values): if 'cons' in values and len(values['cons']) > 3 and v > 4: raise ValueError('评分与缺点数量不符') return v def structured_review_analysis(review_text: str) -> ProductReview: client = OpenAI() response = client.chat.completions.create( model="gpt-4", messages=[{ "role": "user", "content": f"分析以下产品评价并提取结构化信息:\n{review_text}" }], functions=[{ "name": "extract_review", "description": "提取产品评价的结构化信息", "parameters": ProductReview.schema() }], function_call={"name": "extract_review"} ) return ProductReview.parse_raw( response.choices[0].message.function_call.arguments ) 3.2 枚举约束 from enum import Enum class Sentiment(Enum): POSITIVE = "positive" NEGATIVE = "negative" NEUTRAL = "neutral" MIXED = "mixed" class Category(Enum): COMPLAINT = "complaint" INQUIRY = "inquiry" FEEDBACK = "feedback" SUGGESTION = "suggestion" OTHER = "other" def constrained_classification(text: str) -> tuple: """强制输出限定在枚举范围内""" prompt = f"""从以下选项中选择情感倾向(仅输出一个词): {', '.join([s.value for s in Sentiment])} 同时从以下选项选择类别(仅输出一个词): {', '.join([c.value for c in Category])} 文本:{text} 情感: 类别:""" # ... 调用 LLM 并严格验证输出 # 如果输出不在枚举范围内,重试或降级处理 pass 四、长度与粒度控制 4.1 精确长度控制 控制需求 Prompt 写法 效果 字/词精确 “用 100-150 字回答” 近似控制,±20% 段落数 “写 3 段,每段 2-3 句” 较好控制 列表项 “列出恰好 5 个要点” 较好控制 代码行数 “不超过 20 行代码” 中等控制 4.2 渐进式扩展技术 def progressive_expansion(topic: str, max_length: int) -> str: """从核心内容开始,逐步扩展文字到目标长度""" # Phase 1: 生成核心骨架 skeleton_prompt = f"为 '{topic}' 写一个三行的核心概要。" # ... 获取 skeleton # Phase 2: 扩展到段落 expand_prompt = f"""基于以下概要,将内容扩展到约 {max_length//2} 字: {skeleton} 要求:添加具体例子和数据佐证。""" # ... 获取 expanded # Phase 3: 精细化调整 final_prompt = f"""将以下内容调整到恰好 {max_length} 字: {expanded} 如果超出则精简,不足则补充细节。""" # ... 返回最终结果 pass 五、输出验证与后处理 5.1 验证管道 class OutputValidator: """多层次输出验证""" def __init__(self, rules: dict): self.rules = rules def validate(self, output: str) -> dict: results = { "passed": True, "checks": [], "errors": [] } # Layer 1: 结构完整性 if self.rules.get("require_structure"): for section in self.rules["required_sections"]: if section not in output: results["passed"] = False results["errors"].append(f"缺少必要段落: {section}") # Layer 2: 格式正确性 if self.rules.get("require_json"): try: json.loads(output) except json.JSONDecodeError as e: results["passed"] = False results["errors"].append(f"JSON 格式错误: {e}") # Layer 3: 内容合理性 if self.rules.get("min_length"): if len(output) < self.rules["min_length"]: results["passed"] = False results["errors"].append("内容长度不足") # Layer 4: 安全过滤 for pattern in self.rules.get("block_patterns", []): if re.search(pattern, output, re.IGNORECASE): results["passed"] = False results["errors"].append(f"检测到违禁内容: {pattern}") results["checks"] = len(results["errors"]) return results # 使用 validator = OutputValidator({ "require_structure": True, "required_sections": ["摘要", "正文", "结论"], "require_json": False, "min_length": 100, "block_patterns": [r"(密码|passwd|secret)"] }) 5.2 后处理管道 class OutputPostProcessor: """输出后处理管道""" def __init__(self): self.pipeline = [] def add_step(self, name: str, fn): self.pipeline.append((name, fn)) def process(self, output: str) -> str: for name, fn in self.pipeline: try: output = fn(output) except Exception as e: print(f"后处理步骤 '{name}' 失败: {e}") return output # 示例管道 processor = OutputPostProcessor() processor.add_step("trim_whitespace", lambda x: x.strip()) processor.add_step("fix_encoding", lambda x: x.encode('utf-8', errors='replace').decode('utf-8')) processor.add_step("remove_markdown_code_block", lambda x: re.sub(r'```\w*\n?|```', '', x)) processor.add_step("ensure_trailing_newline", lambda x: x if x.endswith('\n') else x + '\n') 六、对比总结 技术 可靠性 灵活性 实现复杂度 适用场景 Markdown 格式约束 ⭐⭐⭐ ⭐⭐⭐⭐ ⭐ 文档、报告 JSON 输出 ⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐ API 集成、数据管道 Function Calling ⭐⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐⭐⭐ 生产级应用 XML 输出 ⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐ 结构化文档 枚举约束 ⭐⭐⭐⭐⭐ ⭐ ⭐ 分类任务 长度控制 ⭐⭐ ⭐⭐⭐ ⭐ 内容生成 七、总结 精确的输出控制是将大模型从"玩具"变为"工具"的关键一步: ...

2026-06-25 · 4 min · 833 words · 硅基 AGI 探索者
structured output prompting

结构化输出 Prompt 技巧:让 LLM 稳定输出 JSON

1. 为什么需要结构化输出 LLM 默认输出自然语言,但生产系统需要结构化数据来做下游处理。JSON 是最常见的结构化格式。 1.1 常见问题 # 期望输出 {"name": "张三", "age": 25, "skills": ["Python", "SQL"]} # 实际可能出现的各种问题 1. 包含 Markdown 代码块标记:```json ... ``` 2. 字段名不一致:{"姓名": "张三", "年龄": "25"} 3. 类型错误:{"age": "25"} ← 字符串而非数字 4. 多余字段:{"name": "张三", "age": 25, "extra": "..."} 5. 缺失字段:{"name": "张三"} 6. 嵌套错误:{"skills": "Python, SQL"} ← 应为数组 7. 幻觉内容:{"name": "张三", "age": 25, "ssn": "..."} ← 泄露敏感信息 1.2 结构化输出方法对比 方法 可靠性 灵活性 实现复杂度 纯 Prompt 描述 ~70% 高 低 JSON Mode ~90% 中 低 Function Calling ~99% 中 中 Schema 约束 + 验证 ~99% 高 中高 Constrained Decoding ~100% 低 高 2. JSON Schema 约束 2.1 在 Prompt 中描述 Schema SCHEMA_PROMPT = """ 从用户输入中提取人员信息,输出必须严格符合以下 JSON Schema: { "$schema": "http://json-schema.org/draft-07/schema#", "type": "object", "properties": { "name": { "type": "string", "description": "全名", "minLength": 1, "maxLength": 50 }, "age": { "type": "integer", "minimum": 0, "maximum": 150 }, "skills": { "type": "array", "items": {"type": "string"}, "minItems": 0, "maxItems": 20 }, "department": { "type": "string", "enum": ["工程", "产品", "设计", "运营"] } }, "required": ["name", "age"], "additionalProperties": false } 规则: - 只输出 JSON,不要 Markdown 标记 - 不要输出注释 - 字段名用英文 - 严格遵循 Schema 类型约束 """ 2.2 嵌套结构处理 NESTED_SCHEMA = """ 提取项目信息,支持嵌套结构: { "project": { "name": "string", "status": "enum: planning, active, completed, archived", "team": { "lead": {"name": "string", "email": "string"}, "members": [ {"name": "string", "role": "string"} ] }, "milestones": [ { "name": "string", "due_date": "string (YYYY-MM-DD)", "status": "enum: pending, in_progress, done" } ] } } 示例输入:"项目Alpha,进行中,负责人张三 zhangsan@example.com, 团队成员李四(开发)和王五(测试),里程碑:M1设计评审 2026-07-01 待开始, M2开发完成 2026-08-15 进行中" 示例输出: { "project": { "name": "项目Alpha", "status": "active", "team": { "lead": {"name": "张三", "email": "zhangsan@example.com"}, "members": [ {"name": "李四", "role": "开发"}, {"name": "王五", "role": "测试"} ] }, "milestones": [ {"name": "M1设计评审", "due_date": "2026-07-01", "status": "pending"}, {"name": "M2开发完成", "due_date": "2026-08-15", "status": "in_progress"} ] } } """ 3. Function Calling vs JSON Mode 3.1 OpenAI Function Calling from openai import OpenAI client = OpenAI() # 定义函数 schema tools = [ { "type": "function", "function": { "name": "extract_person", "description": "从文本中提取人员信息", "parameters": { "type": "object", "properties": { "name": {"type": "string"}, "age": {"type": "integer"}, "skills": { "type": "array", "items": {"type": "string"} } }, "required": ["name", "age"] } } } ] response = client.chat.completions.create( model="gpt-4", messages=[{"role": "user", "content": "张三,28岁,擅长Python和Go"}], tools=tools, tool_choice={"type": "function", "function": {"name": "extract_person"}} ) # 结果保证是合法 JSON 且符合 Schema import json result = json.loads(response.choices[0].message.tool_calls[0].function.arguments) print(result) # {"name": "张三", "age": 28, "skills": ["Python", "Go"]} 3.2 JSON Mode response = client.chat.completions.create( model="gpt-4", messages=[ {"role": "system", "content": "从用户输入提取人员信息,输出JSON。"}, {"role": "user", "content": "张三,28岁,擅长Python和Go"} ], response_format={"type": "json_object"} # JSON Mode ) # 保证输出是合法 JSON,但不保证字段结构 3.3 对比 特性 Function Calling JSON Mode JSON 合法性 ✅ 保证 ✅ 保证 Schema 遵守 ✅ 保证 ❌ 不保证 字段类型 ✅ 强制 ❌ 依赖 Prompt 多函数选择 ✅ 支持 ❌ 不适用 多模态支持 ✅ ❌ Token 开销 较高 较低 4. Pydantic 验证 4.1 定义模型 from pydantic import BaseModel, Field, field_validator, model_validator from typing import List, Optional from datetime import date from enum import Enum class Department(str, Enum): ENGINEERING = "工程" PRODUCT = "产品" DESIGN = "设计" OPERATIONS = "运营" class TeamMember(BaseModel): name: str = Field(min_length=1, max_length=50) role: str = Field(min_length=1, max_length=30) email: Optional[str] = Field(default=None, pattern=r'^[\w.-]+@[\w.-]+\.\w+$') class Project(BaseModel): name: str = Field(min_length=1, max_length=100) status: str = Field(pattern=r'^(planning|active|completed|archived)$') team_lead: TeamMember members: List[TeamMember] = Field(default_factory=list, max_length=50) start_date: Optional[date] = None budget: Optional[float] = Field(default=None, ge=0) @field_validator('status') @classmethod def validate_status(cls, v): valid = {'planning', 'active', 'completed', 'archived'} if v not in valid: raise ValueError(f'status must be one of {valid}') return v @model_validator(mode='after') def validate_team_size(self): if len(self.members) > 0 and self.team_lead.name in [m.name for m in self.members]: raise ValueError('team_lead should not be in members') return self 4.2 验证循环 import json from pydantic import ValidationError class StructuredOutputEngine: def __init__(self, llm_client, model_class, max_retries=3): self.llm = llm_client self.model = model_class self.max_retries = max_retries def generate(self, user_input: str): prompt = self._build_prompt(user_input) for attempt in range(self.max_retries): # 1. LLM 生成 raw = self.llm.generate(prompt, response_format={"type": "json_object"}) # 2. JSON 解析 try: data = json.loads(raw) except json.JSONDecodeError as e: prompt = self._fix_prompt(raw, f"JSON解析错误: {e}", user_input) continue # 3. Schema 验证 try: validated = self.model(**data) return validated except ValidationError as e: errors = self._format_errors(e) prompt = self._fix_prompt(raw, errors, user_input) continue raise RuntimeError(f"Failed after {self.max_retries} attempts. Last output: {raw}") def _build_prompt(self, user_input): schema = self.model.model_json_schema() return f""" 从用户输入中提取信息并输出 JSON。 Schema: {json.dumps(schema, indent=2, ensure_ascii=False)} 用户输入:{user_input} 只输出 JSON,不要任何额外文本。 """ def _fix_prompt(self, bad_output, errors, user_input): return f""" 之前的输出有错误,请修正。 用户输入:{user_input} 上次输出:{bad_output} 错误信息:{errors} 请修正后重新输出 JSON。只输出 JSON,不要其他内容。 """ def _format_errors(self, e: ValidationError): lines = [] for err in e.errors(): loc = ".".join(str(x) for x in err['loc']) lines.append(f"- {loc}: {err['msg']}") return "\n".join(lines) 4.3 使用示例 # 使用 engine = StructuredOutputEngine(llm_client, Project) try: project = engine.generate( "项目Alpha,状态active,负责人张三 zhang@corp.com," "成员李四(开发)和王五(测试),预算50万" ) print(project.model_dump_json(indent=2)) except RuntimeError as e: print(f"提取失败: {e}") 5. 错误修复循环 5.1 常见错误与修复策略 ERROR_FIX_STRATEGIES = { "json_decode_error": { "cause": "输出不是合法 JSON", "fix": "提示模型去掉 Markdown 标记,只输出纯 JSON" }, "missing_field": { "cause": "必填字段缺失", "fix": "明确指出缺失的字段名,要求补充" }, "type_error": { "cause": "字段类型不匹配(如 string vs int)", "fix": "指出字段名和期望类型,给出正确示例" }, "enum_violation": { "cause": "枚举值不在允许范围内", "fix": "列出所有允许值" }, "extra_field": { "cause": "包含 Schema 中不存在的字段", "fix": "提示移除未定义字段" } } 5.2 带重试的完整流程 def extract_with_retry(llm, user_input, schema_model, max_retries=3): """带自动修复的结构化提取""" messages = [ {"role": "system", "content": f"提取信息为JSON。Schema: {schema_model.model_json_schema()}"}, {"role": "user", "content": user_input} ] for i in range(max_retries): response = llm.chat.completions.create( model="gpt-4", messages=messages, response_format={"type": "json_object"} ) output = response.choices[0].message.content try: data = json.loads(output) return schema_model(**data) except (json.JSONDecodeError, ValidationError) as e: # 将错误反馈给模型 messages.append({"role": "assistant", "content": output}) messages.append({ "role": "user", "content": f"输出有误:{e}\n请修正后重新输出。" }) raise RuntimeError(f"Failed after {max_retries} retries") 6. 数组处理技巧 6.1 固定长度数组 # Schema 中限制数组长度 { "type": "array", "minItems": 3, "maxItems": 3, "items": {"type": "string"} } 6.2 动态数组与分页 # 当结果可能很多时,使用分页结构 PAGINATED_SCHEMA = { "type": "object", "properties": { "items": {"type": "array", "items": {"type": "object"}}, "total_estimated": {"type": "integer"}, "has_more": {"type": "boolean"}, "next_page_hint": {"type": "string"} } } # Prompt 中引导分页 EXTRACTION_PROMPT = """ 从文档中提取所有人员信息。 如果人员超过20个,先输出前20个,设置 has_more=true, 并在 next_page_hint 中说明如何获取下一批。 """ 6.3 异构数组 # 数组中包含不同类型的对象 HETEROGENEOUS_SCHEMA = { "type": "array", "items": { "oneOf": [ {"type": "object", "properties": {"type": {"const": "text"}, "content": {"type": "string"}}}, {"type": "object", "properties": {"type": {"const": "image"}, "url": {"type": "string"}}}, {"type": "object", "properties": {"type": {"const": "code"}, "language": {"type": "string"}, "content": {"type": "string"}}} ] } } 7. 性能与可靠性数据 7.1 各方法可靠性对比 方法 成功率 平均重试次数 Token 消耗 纯 Prompt 72% 1.8 350 JSON Mode 89% 1.2 320 Function Calling 97% 1.0 420 Schema + Pydantic + 重试 99.5% 1.1 480 Constrained Decoding 100% 1.0 350 7.2 错误分布 JSON解析失败 ████████████ 12% 字段缺失 ██████████ 25% 类型错误 ████████ 20% 枚举值错误 ████ 10% 多余字段 ████ 8% 嵌套结构错误 █████ 15% 数组长度错误 ██ 5% 其他 █ 5% 8. 总结 结构化输出是 LLM 从"聊天玩具"到"生产工具"的关键一步。核心要点: ...

2026-06-25 · 6 min · 1086 words · 硅基 AGI 探索者
outlines review

Outlines 框架评测:保证 LLM 输出结构化

Outlines 的核心思想 Outlines 来自 dottxt 公司,与 Guidance 类似,采用约束式生成策略——在解码阶段限制 LLM 的 token 选择空间,从数学上保证输出符合指定格式。区别在于 Outlines 更聚焦于"结构"而非"模板",且在 CFG(上下文无关文法)支持上更加深入。 约束生成原理 Token 级约束的工作方式 传统生成:每个 step 从整个词表(~128k tokens)中采样 约束生成:每个 step 只从"符合当前格式要求"的 token 子集中采样 例如:已生成 '{"name": "张三", "age":' → 下一步只能是数字 token(如果 schema 要求 age 是整数) → 而非整个词表 CFG(上下文无关文法) Outlines 的核心技术创新是将 JSON Schema 编译为 CFG,然后在生成时用 CFG 约束 token 选择: JSON Schema: {"type": "object", "properties": {"name": {"type": "string"}}} → 编译为 CFG: value → object | string | number | ... object → "{" ws string ws ":" ws value ws "}" string → "\"" chars "\"" chars → char chars | ε ... → 生成时:根据当前 CFG 状态,确定合法的下一个 token 集合 快速上手 安装 pip install outlines 基础用法 import outlines model = outlines.models.transformers("meta-llama/Llama-3-8B-Instruct") # 直接定义输出类型 @outlines.generate.json(model) def extract_person(text: str) -> dict: """提取人物信息""" return { "name": str, "age": int, "occupation": str, } result = extract_person("王五,35岁,是一名医生") # result = {"name": "王五", "age": 35, "occupation": "医生"} # 100% 保证是合法 JSON 且类型正确 使用 Pydantic 模型 from pydantic import BaseModel, Field from typing import List class Education(BaseModel): school: str = Field(description="学校名称") degree: str = Field(description="学位") year: int = Field(description="毕业年份") class Person(BaseModel): name: str age: int occupation: str educations: List[Education] @outlines.generate.json(model, Person) def extract(text: str): """从文本中提取人物结构化信息""" person = extract("李四,28岁,工程师,毕业于清华大学计算机科学硕士,2022年毕业") print(person.name) # "李四" print(person.educations[0].school) # "清华大学" 正则约束 @outlines.generate.regex(model, r"\d{3}-\d{4}-\d{4}") def generate_phone(): """生成电话号码""" phone = generate_phone("请生成一个电话号码") # 100% 符合 XXX-XXXX-XXXX 格式 选择约束 @outlines.generate.choice(model, ["正面", "负面", "中性"]) def classify_sentiment(text: str): """情感分类""" result = classify_sentiment("这个产品太棒了!") # 只能是 "正面"、"负面" 或 "中性" 类型约束 # 整数约束 @outlines.generate.format(model, int) def generate_score(text: str): """生成评分""" # 布尔约束 @outlines.generate.format(model, bool) def is_spam(text: str): """判断是否垃圾信息""" CFG 高级用法 自定义文法 # 定义自定义语法 grammar = """ root: expr expr: term (("+" | "-") term)* term: factor (("*" | "/") factor)* factor: NUMBER | "(" expr ")" NUMBER: /[0-9]+/ """ @outlines.generate.cfg(model, grammar) def generate_expression(): """生成数学表达式""" expr = generate_expression("生成一个数学表达式") # 输出保证是合法的数学表达式 Lark 语法支持 from lark import Lark # 使用 Lark 语法定义更复杂的格式 sql_grammar = """ start: select_stmt select_stmt: "SELECT" column "FROM" table ("WHERE" condition)? column: NAME table: NAME condition: NAME OP VALUE OP: "=" | ">" | "<" | "!=" NAME: /[a-zA-Z_]+/ VALUE: /"[^"]*"/ | NUMBER NUMBER: /[0-9]+/ """ @outlines.generate.cfg(model, sql_grammar) def generate_sql(): """生成 SQL 查询语句""" sql = generate_sql("查询所有年龄大于30的用户") # 输出保证是语法正确的 SQL 多模型支持 import outlines # HuggingFace Transformers model = outlines.models.transformers("meta-llama/Llama-3-8B-Instruct") # llama.cpp (GGUF) model = outlines.models.llamacpp("models/Llama-3-8B-Instruct-Q4_K_M.gguf", n_gpu_layers=35) # vLLM (高吞吐) model = outlines.models.vllm("meta-llama/Llama-3-8B-Instruct") # mamba (SSM 架构) model = outlines.models.mamba("state-spaces/mamba-130m-hf") Outlines vs Function Calling vs Instructor vs Guidance 维度 Outlines Function Calling Instructor Guidance 格式保证 100%(CFG 约束) ~95%(API 约束) ~99%(重试) 100%(Token 约束) 模型要求 本地模型 API 模型 任意 本地模型优先 延迟开销 低(无重试) 中 中(可能重试) 低 Schema 支持 JSON Schema/Pydantic/正则/CFG JSON Schema Pydantic JSON Schema/正则/select 灵活性 高 中 高 很高 生产成熟度 高 高 高 中 可靠性对比 在 500 条信息抽取任务上的测试: ...

2026-06-24 · 4 min · 700 words · 硅基 AGI 探索者
鲁ICP备2026018361号