自然言語ではなく構造情報を作成するには、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文字列を解析するときに組み込みのjson.loadsと同じように機能します。
result = loads ( '{"key":"value"}' )
print ( result ) # Outputs: {'key': 'value'}追加のパラメーターをloads関数に渡すことにより、部分的なJSON文字列を解析できます。このパラメーターは、 BITWISEまたは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パーサーにDICTとして指示します。パーサーは、できるだけ多くのデータを返しようとします。
部分的な文字列を許可しない場合、 "v近づいていないため、オブジェクトに"key"を追加しません。
result = loads ( '{"key": "v' , OBJ )
print ( result ) # Outputs: {}
result = loads ( '{"key": "value"' , OBJ )
print ( result ) # Outputs: {'key': 'value'}類似性では、許可する場合は、部分的なリストを解析したり、部分的な特別な値を解析したりできます。
(Allowがデフォルトallowことに注意してくださいAllow.ALL )
result = loads ( '[ {"key1": "value1", "key2": [ "value2' )
print ( result ) # Outputs: [{'key1': 'value1', 'key2': ['value2']}]
result = loads ( "-Inf" )
print ( result ) # Outputs: -infJSON文字列が奇形である場合、 parse機能はエラーをスローします。
loads ( "wrong" ) # MalformedJSON: Malformed node or string on line 1 json_string <string> :(不完全)JSON文字列を解析します。allow_partial <Allow | int> :JSONの解析中に許可される部分性の種類を指定します(default: Allow.ALL )。parser (str) -> JSON :通常のjsonパーサー。デフォルトはjson.loadsです。 JSON文字列を完成させ、 parser関数で解析します。
解析されたPython値を返します。
エイリアス: decode 、 parse_json 。
json_string <string> :(不完全な)JSON文字列が完了します。allow_partial <Allow | int> :JSONの解析中に許可される部分性の種類を指定します(default: Allow.ALL )。完了したJSON文字列を返します。
json_string <string> :(不完全な)JSON文字列が完了します。allow_partial <Allow | int> :JSONの解析中に許可される部分性の種類を指定します(default: Allow.ALL )。入力文字列のスライスと完了のタプルを返します。
これは低レベルのAPIであり、デバッグとデモンストレーションにのみ役立つことに注意してください。
JSONの解析中に許可される部分性の種類を指定する列挙クラス。次のメンバーがいます。
STR :部分文字列を許可します。NUM :部分数を許可します。ARR :部分配列を許可します。OBJ :部分オブジェクトを許可します。NULL :部分ヌルを許可します。BOOL :部分ブールを許可します。NAN :部分的なナンを許可します。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ライセンスの下でライセンスされています。