Project Icon

super-json-mode

以并行方式高效生成JSON结构化输出的Python框架

Super JSON Mode 是一个通过将目标结构分解为原子组件来并行生成JSON输出的Python框架。相比传统的JSON生成方法,该框架提高了生成速度达10倍,同时减少了解析问题。它支持包括OpenAI和Hugging Face Transformers在内的主流LLM, 以及开源LLM如vLLM。安装只需运行pip命令,详细的使用说明和示例代码请参见项目文档。

项目介绍:Super JSON Mode

Super JSON Mode 是一款Python框架,旨在通过将目标模式分解为原子组件,并行生成,从而高效创建结构化输出。它支持最先进的大型语言模型(LLM),如通过OpenAI的旧式API和开源的大型语言模型,比如通过Hugging Face TransformersvLLM。更多的LLM支持也即将上线!

与依赖于提示和HF Transformers的简单JSON生成管道相比,Super JSON Mode能够快10倍地生成输出。在确定性和解析问题上,它也比简单生成方法表现得更好。

工作原理

结构化输出格式,比如JSON或YAML,具有固有的并行或层次结构。考虑以下由GPT-4生成的非结构化段落:

欢迎来到123 Azure Lane,这是一套位于旧金山的令人惊叹的住宅,以其绝妙的现代设计,售价2,500,000美元。占地豪华3000平方英尺,这处房产结合了精致和舒适,创造了独特的生活体验。

对于家庭或专业人士来说,这是一处理想的家园。我们的独家住宅设有五间宽敞的卧室,每一间都散发着温暖和现代优雅。卧室经过精心设计,以便自然光充足,还有充裕的储物空间。住宅中有三间精美设计的全套浴室,为住户提供便利与隐私。

宏大的入口将您引入宽敞的生活区域,提供了举办聚会或享受宁静夜晚的绝佳氛围。厨师级厨房配备最先进的电器、定制橱柜和美丽的花岗岩台面,梦想成真。

如果我们希望使用LLM提取地址平方英尺卧室数量浴室数量以及价格,可以请模型根据描述填写进一个模式。

一个可能的模式(如Pydantic对象生成的)可能如下:

{
    "address": {
        "type": "string"
    },
    "price": {
        "type": "number"
    },
    "square_feet": {
        "type": "integer"
    },
    "num_beds": {
        "type": "integer"
    },
    "num_baths": {
        "type": "integer"
    }
}

一个有效的输出可能是:

{
  "address": "123 Azure Lane",
  "price": 2500000,
  "square_feet": 3000,
  "num_beds": 5,
  "num_baths": 3
}

通常的方法是将该模式嵌入提示中,请模型填写。然而,这种方法在几个方面效率不高。

  1. 各个键值对是彼此独立的。Super JSON Mode利用提示并行性,将每个键值对视为独立查询。例如,可以在不生成地址的情况下提取浴室数量

  2. 请求模型从头生成JSON,徒然耗费了预测的语法,如大括号和键名,这些在输出中是已知的。我们可以利用此强先验来提高延迟。

  3. LLMs能在并行运行时大幅度提高速度,因此,我们可以将模式分割为多个查询,让LLM并行填充每个独立键的模式,减少单次传递的标记数量,从而达到更快的推理时间。

安装指南

通过 PyPI

运行以下命令:

pip install super-json-mode

手动安装

  1. 创建一个conda环境
conda create --name superjsonmode python=3.10 -y
conda activate superjsonmode
  1. 克隆并安装依赖
git clone https://github.com/varunshenoy/super-json-mode
cd superjsonmode
pip install -r requirements.txt

使用示例

我们努力让Super JSON Mode变得超级易于使用。查看examples文件夹以获取更多示例和vLLM的用法。

使用OpenAI和gpt-3-instruct-turbo

from superjsonmode.integrations.openai import StructuredOpenAIModel
from pydantic import BaseModel
import time

model = StructuredOpenAIModel()

class Character(BaseModel):
    name: str
    genre: str
    age: int
    race: str
    occupation: str
    best_friend: str
    home_planet: str

prompt_template = """{prompt}

Please fill in the following information about this character for this key. Keep it succinct. It should be a {type}.

{key}: """

prompt = """Luke Skywalker is a famous character."""

start = time.time()
output = model.generate(
    prompt,
    extraction_prompt_template=prompt_template,
    schema=Character,
    batch_size=7,
    stop=["\n\n"],
    temperature=0,
)

print(f"Total time: {time.time() - start}")
# Total Time: 0.409s

print(output)

使用Mistral 7B结合HuggingFace Transformers:

from transformers import AutoTokenizer, AutoModelForCausalLM
from superjsonmode.integrations.transformers import StructuredOutputForModel
from pydantic import BaseModel

device = "cuda"
model = AutoModelForCausalLM.from_pretrained("mistralai/Mistral-7B-Instruct-v0.2").to(device)
tokenizer = AutoTokenizer.from_pretrained("mistralai/Mistral-7B-Instruct-v0.2")

structured_model = StructuredOutputForModel(model, tokenizer)

class QuarterlyReport(BaseModel):
    company: str
    stock_ticker: str
    date: str
    reported_revenue: str
    dividend: str

prompt_template = """[INST]{prompt}

Based on this excerpt, extract the correct value for "{key}". Keep it succinct. It should have a type of `{type}`.[/INST]

{key}: """

output = structured_model.generate(passage,
                                   extraction_prompt_template=prompt_template,
                                   schema=QuarterlyReport,
                                   batch_size=6)

print(json.dumps(output, indent=2))

未来计划

还有许多功能可以改进Super JSON Mode,以下是一些想法:

  • 定性输出分析:我们进行了性能基准测试,但希望提出更严格的方法来评估Super JSON Mode的定性输出。
  • 结构化采样:理想情况下,我们应屏蔽LLM的对数几率以支持类型限制,类似于JSONFormer。
  • 依赖图支持:处理思考回应这种需要依赖关系的键。应能传递一个依赖关系图并以特定顺序完成提示。
  • 本地模型支持:Super JSON Mode在本地环境,尤其是在批量大小为1的情况下表现更佳。
  • TRT-LLM支持:尽管vLLM不错且易于使用,我们理想上希望与更高性能的框架集成。

引用

如果您在工作中发现此库有用,我们将非常感谢您引用此仓库:

@misc{ShenoyDerhacobian2024,
  author = {Shenoy, Varun and Derhacobian, Alex},
  title = {Super JSON Mode: A Framework for Accelerated Structured Output Generation},
  year = {2024},
  publisher = {GitHub},
  journal = {GitHub repository},
  howpublished = {\url{https://github.com/varunshenoy/super-json-mode}}
}

该项目为CS 229: Systems for Machine Learning的一部分,由指导教师和助教的指导下完成。

项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

AIWritePaper论文写作

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号