老铁们,今天咱们来聊一聊 JSONFormer 这个库,它能帮我们解决 Hugging Face 模型在生成结构化数据时的一些烦恼。说白了,JSONFormer 是个实验性质的工具,用来将 Hugging Face 的本地模型管道封装起来,以便让它在某些 JSON Schema 的解析上更靠谱。
技术背景介绍
在处理复杂的 JSON 数据结构时,我们常常希望模型能够在输出时遵循预定义的结构。然而,很多生成模型在这方面总是“拖后腿”,输出的结果常常脱离我们希望的格式。这时候,JSONFormer 这波操作就可以相当丝滑地解决这个问题,它通过填充结构化的标记,然后从模型中采样内容标记来实现。
原理深度解析
JSONFormer 利用 Hugging Face 的模型管道,通过一个结构化的解码方式来确保输出符合制定的 JSON Schema。我们先用一下 Hugging Face 的基准模型看看没有结构化解码的效果是什么样的。
%pip install --upgrade --quiet jsonformer > /dev/null
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):
"""Query the BigCode StarCoder model about coding questions."""
url = "https://api-inference.huggingface.co/models/bigcode/starcoder"
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"))
实战代码演示
我们定义了一个简单的 prompt,让 AI 助理用 JSON 格式来回答。首先,我们来看看没有 JSONFormer 的结果:
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.
You may 'ask_star_coder' for help on coding problems.
{arg_schema}
BEGIN! Answer the Human's question as best as you are able.
------
Human: 'What's the difference between an iterator and an iterable?'
AI Assistant:""".format(arg_schema=ask_star_coder.args)
generated = original_model.predict(prompt, stop=["Observation:", "Human:"])
print(generated)
结果并不能让人满意,模型没有遵循 JSON 格式。那么我们来试试 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)
优化建议分享
在使用 JSONFormer 时,老铁们可以将其与其他代理服务结合使用,以提高稳定性。我个人一直在用 zzzzapi.com 提供的一站式大模型解决方案,效果还是蛮不错的。
补充说明和总结
JSONFormer 确实帮助我们提升了模型生成的可靠性,尤其是在处理复杂结构化数据时。今天的技术分享就到这里,希望对大家有帮助。开发过程中遇到问题也可以在评论区交流~
—END—