结构化JSON输出库

structsure是一个简单可靠的库,用于从大型语言模型(LLMs)获取结构化JSON输出,并具有自我修正功能。

  • by BodieCoding
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 BodieCoding/structsure

使用说明

结构

一个简单、可靠的库,用于从LLM中获取具有自校正功能的结构化JSON输出。

注意:此存储库是社区版(CE)。专业功能(云提供商、云保存/历史记录、托管API)在存在许可证时被关闭并解锁。

安装

  • 确保你有Python 3.8+
  • 在可编辑模式下本地安装:
pip install -e .

可选后端(通过额外功能推荐):

  • 当地(Ollama): pip install -e .[ollama] 并安装一个类似的模型 ollama pull llama3
  • OpenAI: pip install -e .[openai]

示例

  • 本地任务提取(无API密钥): python examples/local_tasks_demo.py
  • 本地简历提取(无API密钥): python examples/resume_extraction_demo.py
  • 混合简单用法(自动检测提供程序):请参阅 examples/simple_usage.py

模式设计器(GUI)

设计模式、提示模型,并在本地或云中获得具有自校正功能的有效JSON。

  • 安装附加组件: pip install -e .[streamlit,ollama]
  • 运行: streamlit run structsure/schema_designer_app.py
  • 特征:
    • 定义字段,请参阅实时JSON模式
    • 拆分输入:指令、源文本、JSON示例
    • 选择后端(Ollama/OpenAI)、型号、重试次数
    • 2列或3列布局,带实时输出
  • 在CE中,只有Ollama供应商可用。设置环境变量 STRUCTSURE_LICENSE=... 解锁专业版功能(或安装私人版 structsure_pro 包装(如有)。

选择本地模型(与Ollama一起)

Ollama是本地运行时;你仍然选择一个模型。良好的默认值:

  • 微小/快速(CPU友好): gemma2:2b, phi3:mini (占用空间最小;适用于简单模式)
  • 中等尺寸(精度更高): mistral:7b, qwen2.5:7b, gemma2:7b
  • 平衡默认值: llama3 (8B指示)

拉模型(示例):

ollama pull llama3
ollama pull gemma2:2b
ollama pull phi3:mini
ollama pull mistral:7b
ollama pull qwen2.5:7b

然后跑步 --provider ollama --model <name> 或者在示例中设置模型。

命令行用法

安装所需的附加组件(示例:仅限本地):

pip install -e .[ollama]

基本用法(自动检测提供者:OpenAI,如果 OPENAI_API_KEY 集,否则Ollama):

structsure "Extract a bullet list of tasks from: ..."

指定提供程序/型号并重试:

structsure "Extract JSON for ..." --provider ollama --model llama3 --retries 3

使用输入文件和JSON模式文件(由Pydantic生成):

structsure @prompt.txt --schema schema.json

MCP 服务器

额外安装MCP(和后端):

pip install -e .[mcp,ollama]

启动服务器:

structsure-mcp

外露工具: generate_structured

  • 参数: prompt (str), schema_json (str,可选), model (可选), provider (可选;“openai”或“ollama”), max_retries (int)
  • 自动检测提供程序并默认为 llama3 (Ollama)或 gpt-4o (OpenAI)未提供时

快速示例

import os
from pydantic import BaseModel, Field
from structsure import generate

provider = "openai" if os.environ.get("OPENAI_API_KEY") else "ollama"
client = None
if provider == "openai":
    from openai import OpenAI
    client = OpenAI(api_key=os.environ["OPENAI_API_KEY"])  # or OpenAI()

class UserProfile(BaseModel):
    name: str
    age: int
    is_active: bool
    email: str

prompt = "Create a profile for John Doe..."

user_profile = generate(
    client=client,
    model=("gpt-4o" if provider == "openai" else "llama3"),
    response_model=UserProfile,
    prompt=prompt,
    provider=provider,
)
print(user_profile.model_dump_json(indent=2))