LLM2Json:实现 ERNIE Bot 稳定输出结构化 JSON 数据
介绍 LLM2Json 工具,用于解决大语言模型输出格式不稳定的问题。通过自动构建 Prompt 引导模型输出符合 JSON 语法的结构数据,简化下游程序交互。涵盖安装配置、Schema 定义、模板构造及解析方法,提供情感分类、地址提取等实战案例,并包含最佳实践与故障排查指南,助力开发者高效构建 LLM 应用。

介绍 LLM2Json 工具,用于解决大语言模型输出格式不稳定的问题。通过自动构建 Prompt 引导模型输出符合 JSON 语法的结构数据,简化下游程序交互。涵盖安装配置、Schema 定义、模板构造及解析方法,提供情感分类、地址提取等实战案例,并包含最佳实践与故障排查指南,助力开发者高效构建 LLM 应用。

随着大型语言模型(LLM)技术的飞速发展,其在自然语言处理领域的表现令人瞩目。然而,当开发者将 LLM 集成到实际业务应用中时,面临着一个核心挑战:LLM 生成的文本内容往往具有高度的不确定性,包括格式混乱、键值对缺失或非标准 JSON 结构等问题。这导致下游系统难以直接解析和处理这些数据,通常需要编写复杂的正则表达式进行清洗,甚至出现程序报错。
为了解决这一痛点,我们开发了 LLM2Json 工具包。该工具旨在帮助开发者构建高质量的 Prompt,引导大语言模型输出严格符合 JSON 语法规范的结构化数据,从而确保数据能够无缝对接下游应用程序、数据库或 API 接口。
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛应用于 Web 开发和 API 通信中。它具备以下显著优势:
在 LLM 应用场景中,使用 JSON 作为输出格式可以极大地降低后续数据处理的成本,提高系统的稳定性和可维护性。
以下我们以'小红书营销内容生成'为例,演示如何使用 LLM2Json 配合 ERNIE Bot 生成结构化数据。假设我们需要从 LLM 获取三个字段:标题(title)、正文内容(context)和关键词(keywords)。
首先,需要安装必要的 Python 依赖包。请确保您的 Python 环境版本符合要求。
pip install llm2json
pip install erniebot
安装完成后,建议重启开发环境内核以确保新安装的包生效。
在使用 ERNIE Bot 之前,需要配置访问令牌(Token)。如果您使用的是其他大模型,此步骤可跳过,但需相应调整 SDK 配置。
Token 获取路径请参考百度智能云官方文档。在代码中设置如下:
ERNIETOKEN = "your_access_token_here"
为了便于调用,我们将 ERNIE Bot 的聊天接口封装为一个函数。这里以 ernie-3.5 模型为例。
import erniebot
erniebot.api_type = "aistudio"
erniebot.access_token = ERNIETOKEN
def ernie_chat(content):
response = erniebot.ChatCompletion.create(
model="ernie-3.5",
messages=[{"role": "user", "content": content}]
)
return response.get_result()
利用 llm2json 提供的 BaseModel 和 Field,我们可以清晰地定义期望输出的数据结构。这有助于模型理解任务目标。
from llm2json.prompts.schema import BaseModel, Field
class Xiaohongshu(BaseModel):
title: str = Field(description="文章标题")
context: str = Field(description="正文内容")
keywords: list = Field(description="关键词")
使用 Templates 类来构造 Prompt。您可以传入具体的业务逻辑描述,以及可选的正确示例(Few-Shot),以提高生成的准确性。
from llm2json.prompts import Templates
correct_example = '{"title":"文章标题", "context":"正文内容", "keywords":["关键词 1","关键词 2"]}'
t = Templates(
prompt="""
请你为商品:<topic>写一篇小红书文案。
包括文章标题、正文内容和关键词,同时正文需要包含 emoji 表情
""",
field=Xiaohongshu,
correct_example=correct_example
)
template = t.invoke(topic="文心牌润唇膏")
调用模型后,使用 JSONParser 对返回的原始文本进行解析,将其转换为字典或 JSON 对象。
from pprint import pprint
from llm2json.output import JSONParser
ernie_result = ernie_chat(template)
parser = JSONParser()
# 转换为字典
result_dict = parser.to_dict(ernie_result)
pprint(result_dict)
# 或者转换为 JSON 字符串
# result_json = parser.to_json(ernie_result)
成功解析后,您将得到一个标准的字典类型数据,可以直接访问其中的键值对。
为了展示 LLM2Json 的通用性,以下提供三个不同场景的实战案例。
任务:判断用户评论的情感倾向(正面或负面)。
from pprint import pprint
class Senta(BaseModel):
sentiment: str = Field(description="情感倾向,取值为 positive 或 negative")
t = Templates(
prompt="""
我会给你一段评论,请你判断这段评论是正面还是负面的。
评论内容是:{sentiment}
""",
field=Senta
)
template = t.invoke(sentiment="蛋糕味道不错,店家服务也很热情")
ernie_result = ernie_chat(template)
parser = JSONParser()
pprint(parser.to_dict(ernie_result))
输出结果示例:
{'sentiment': 'positive'}
任务:从非结构化文本中提取地级市名称。
from pprint import pprint
class Address(BaseModel):
city: str = Field(description="地级市")
t = Templates(
prompt="""
我会给你一个地址,请你从中提取出地级市名称。
地址是:{address}
""",
field=Address
)
template = t.invoke(address="湖北省武汉市汉阳区琴台大道附近")
ernie_result = ernie_chat(template)
parser = JSONParser()
pprint(parser.to_dict(ernie_result))
输出结果示例:
{'city': '武汉市'}
任务:根据预设模板生成测试用的入职人员数据。
from pprint import pprint
class Data(BaseModel):
name: str = Field(description="姓名")
idcode: str = Field(description="18 位数的身份证号")
sex: str = Field(description="性别")
phone: str = Field(description="手机号")
email: str = Field(description="邮箱")
address: str = Field(description="居住地址")
date: str = Field(description="入职日期")
t = Templates(
prompt="""
请你根据模板生成入职人员测试数据
""",
field=Data
)
template = t.invoke()
ernie_result = ernie_chat(template)
parser = JSONParser()
pprint(parser.to_dict(ernie_result))
输出结果示例:
{
'address': '北京市朝阳区 XXX 路 XXX 号',
'date': '2023-06-25',
'email': '[email protected]',
'idcode': '110101199003077777',
'name': '张三',
'phone': '13800000000',
'sex': '男'
}
为了确保 LLM2Json 在实际生产环境中发挥最大效能,建议遵循以下最佳实践。
LLM 的随机性由 Temperature 参数控制。对于结构化数据生成任务,建议将 Temperature 设置为较低的值(如 0.1 或 0.2),以减少模型的创造性发散,确保输出格式的稳定性。
尽管 LLM2Json 提高了成功率,但在高并发场景下仍可能出现解析失败的情况。建议在代码中加入重试逻辑。当 JSONParser 抛出异常时,可以捕获异常并重新调用模型,同时适当增加 Few-Shot 示例的数量。
""" 或 ---)将指令与变量内容分开,防止注入攻击。在处理用户输入时,注意防范 Prompt 注入攻击。不要直接将不可信的用户输入拼接到系统指令中,而应将其作为变量传递给模板。此外,对于敏感数据(如身份证、手机号),应在生成后进行脱敏处理或验证其合法性。
LLM2Json 是一款专注于提升大语言模型输出稳定性的实用工具。通过标准化的 Schema 定义和智能的 Prompt 构建,它有效解决了 LLM 输出格式不可控的问题。无论是简单的分类任务,还是复杂的数据生成,该工具都能提供可靠的 JSON 结构化支持。希望开发者能基于此工具,构建更多高质量、可落地的 AI 应用。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online