有时,我们需要LLM(大型语言模型)来产生结构信息,而不是自然语言。最简单的方法是使用JSON。
但是,在收到最后一个响应令牌之前,json被打破了,这意味着您不能使用JSON.parse对其进行解码。但是我们仍然想将数据流式传输给用户。
partial-json-parser是一个轻巧且可自定义的库,用于解析部分JSON字符串。这是一个演示。
(请注意,也有JavaScript实现)
pip install partial-json-parser # or poetry / pdm / uv partial-json-parser纯粹在Python中实现,具有良好的提示。它是零依赖性,与Python 3.6+一起使用。
您可以通过安装rich安装运行演示游乐场或:
pip install partial-json-parser[playground]然后在终端中运行json-playground ,您可以进行交互尝试。
from partial_json_parser import loads
> >> loads ( '{"key": "v' ) # {'key': 'v'}另外,您可以使用ensure_json获取完成的JSON字符串:
from partial_json_parser import ensure_json
> >> ensure_json ( '{"key": "v' ) # '{"key": "v"}'您可以从库中导入loads功能和Allow对象:
from partial_json_parser import loads , Allow Allow对象只是选项的枚举。它决定哪种类型可以部分。仅在完成后才出现未allow的类型才能确保。
loads功能就像内置的json.loads一样,在解析完整的JSON字符串时可以工作:
result = loads ( '{"key":"value"}' )
print ( result ) # Outputs: {'key': 'value'}您可以通过将附加参数传递到loads函数来解析部分JSON字符串。此参数是从Allow标志的位或常数的。
(请注意,您可以直接从partial-json-parser中导入所需的常数)
from partial_json_parser import loads , Allow , STR , OBJ
result = loads ( '{"key": "v' , STR | OBJ )
print ( result ) # Outputs: {'key': 'v'}在此示例中, Allow.STR告诉解析器,如果字符串不完整, Allow.OBJ可以。然后,解析器尝试返回尽可能多的数据。
如果您不允许部分字符串,那么它不会在对象中添加"key"因为"v不近:
result = loads ( '{"key": "v' , OBJ )
print ( result ) # Outputs: {}
result = loads ( '{"key": "value"' , OBJ )
print ( result ) # Outputs: {'key': 'value'}相似性,如果允许,则可以分析部分列表,甚至可以分析部分特殊值:
(请注意, allow默认值Allow.ALL 。
result = loads ( '[ {"key1": "value1", "key2": [ "value2' )
print ( result ) # Outputs: [{'key1': 'value1', 'key2': ['value2']}]
result = loads ( "-Inf" )
print ( result ) # Outputs: -inf如果JSON字符串畸形, parse功能将丢弃错误:
loads ( "wrong" ) # MalformedJSON: Malformed node or string on line 1 json_string <string> :(不完整的)JSON字符串到解析。allow_partial <Allow | int> :指定在JSON解析过程中允许哪种偏差(默认: Allow.ALL )。parser (str) -> JSON :普通的JSON解析器。默认值为json.loads 。完成JSON字符串并使用parser功能解析。
返回解析的Python值。
别名: decode , parse_json 。
json_string <string> :要完成的(不完整)JSON字符串。allow_partial <Allow | int> :指定在JSON解析过程中允许哪种偏差(默认: Allow.ALL )。返回完成的JSON字符串。
json_string <string> :要完成的(不完整)JSON字符串。allow_partial <Allow | int> :指定在JSON解析过程中允许哪种偏差(默认: Allow.ALL )。返回输入字符串切片的元组和完成。
请注意,这是一个低级API,仅对调试和演示有用。
枚举课程指定在JSON解析过程中允许哪种偏见。它有以下成员:
STR :允许部分字符串。NUM :允许部分号码。ARR :允许部分数组。OBJ :允许部分对象。NULL :允许部分空。BOOL :允许部分布尔值。NAN :允许部分nan。INFINITY :允许部分无限。_INFINITY :允许部分 - infinity。INF :同时允许部分无限和 - 内度。SPECIAL :允许所有特殊值。ATOM :允许所有原子值。COLLECTION :允许所有收集值。ALL :允许所有值。 要运行此库的测试,您应该克隆存储库并安装依赖项:
git clone https://github.com/promplate/partial-json-parser.git
cd partial-json-parser
pdm install然后,您可以使用假设和pytest进行测试:
pdm test请注意,虽然我们努力涵盖尽可能多的边缘案例,但总是有可能不涵盖某些情况。
该项目已根据MIT许可获得许可。