บางครั้งเราต้องการ 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 เป็นเพียง enum สำหรับตัวเลือก มันกำหนดประเภทที่สามารถเป็นบางส่วน ประเภทที่ไม่รวมอยู่ใน allow จะปรากฏขึ้นหลังจากเสร็จสิ้นการเสร็จสิ้น
ฟังก์ชั่น loads ทำงานเหมือนกับ json.loads ในตัวเมื่อแยกวิเคราะห์สตริง JSON ที่สมบูรณ์:
result = loads ( '{"key":"value"}' )
print ( result ) # Outputs: {'key': 'value'} คุณสามารถแยกวิเคราะห์สตริง JSON บางส่วนโดยส่งพารามิเตอร์เพิ่มเติมไปยังฟังก์ชัน loads พารามิเตอร์นี้เป็น bitwise หรือ ของค่าคงที่จาก Allow Flag:
(โปรดทราบว่าคุณสามารถนำเข้าค่าคงที่ที่คุณต้องการโดยตรงจาก 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 . 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
ส่งคืนค่างูหลามที่แยกวิเคราะห์
นามแฝง: 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 )ส่งคืน tuple ของชิ้นส่วนของสตริงอินพุตและความสมบูรณ์
โปรดทราบว่านี่เป็น API ระดับต่ำซึ่งมีประโยชน์สำหรับการดีบักและการสาธิตเท่านั้น
คลาส Enum ที่ระบุว่าบางส่วนได้รับอนุญาตบางส่วนในระหว่างการแยกวิเคราะห์ JSON มีสมาชิกต่อไปนี้:
STR : อนุญาตให้ใช้สตริงบางส่วนNUM : อนุญาตหมายเลขบางส่วนARR : อนุญาตอาร์เรย์บางส่วนOBJ : อนุญาตให้วัตถุบางส่วนNULL : อนุญาตให้บางส่วนเป็นโมฆะBOOL : อนุญาตให้บูลีนบางส่วนNAN : อนุญาตน่านบางส่วนINFINITY : อนุญาตให้อินฟินิตี้บางส่วน_INFINITY : อนุญาตบางส่วน -infinityINF : อนุญาตทั้งอินฟินิตี้บางส่วนและ -infinitySPECIAL : อนุญาตให้มีค่าพิเศษทั้งหมดATOM : อนุญาตค่าอะตอมทั้งหมดCOLLECTION : อนุญาตให้ค่าการรวบรวมทั้งหมดALL : อนุญาตค่าทั้งหมด ในการเรียกใช้การทดสอบสำหรับไลบรารีนี้คุณควรโคลนที่เก็บและติดตั้งการอ้างอิง:
git clone https://github.com/promplate/partial-json-parser.git
cd partial-json-parser
pdm installจากนั้นคุณสามารถเรียกใช้การทดสอบโดยใช้สมมติฐานและ pytest:
pdm testโปรดทราบว่าในขณะที่เรามุ่งมั่นที่จะครอบคลุมกรณีขอบมากที่สุดเท่าที่จะเป็นไปได้อาจเป็นไปได้เสมอว่าบางกรณีอาจไม่ครอบคลุม
โครงการนี้ได้รับใบอนุญาตภายใต้ใบอนุญาต MIT