有時,我們需要LLM(大型語言模型)來產生結構信息,而不是自然語言。最簡單的方法是使用JSON。
但是,在收到最後一個響應令牌之前,json被打破了,這意味著您不能使用JSON.parse
對其進行解碼。但是我們仍然想將數據流式傳輸給用戶。
partial-json
是一個輕巧且可自定義的圖書館,用於解析部分JSON字符串。這是一個演示。
(請注意,也有Python實施)
npm i partial-json # or pnpm / bun / yarn
partial-json
僅在JavaScript中實現,並且具有commonjs
和esm
構建。
您可以從庫中導入parse
功能和Allow
對象:
import { parse , Allow } from "partial-json" ;
Allow
對像只是選項的枚舉。它決定哪種類型可以部分。僅在完成後才出現allow
包含的類型才能確保。
解析完整的JSON字符串時, parse
功能就像內置的JSON.parse
一樣工作:
let result = parse ( '{"key":"value"}' ) ;
console . log ( result ) ; // Outputs: { key: 'value' }
您可以通過將附加參數傳遞到parse
功能來解析部分JSON字符串。此參數是從Allow
對象的位或常數的。
(請注意,您可以直接從partial-json
導入所需的常數)
import { parse , STR , OBJ } from "partial-json" ;
result = parse ( '{"key": "v' , STR | OBJ ) ;
console . log ( result ) ; // Outputs: { key: 'v' }
在此示例中, Allow.STR
告訴解析器,如果字符串不完整, Allow.OBJ
可以。然後,解析器嘗試返回盡可能多的數據。
如果您不允許部分字符串,那麼它不會在對像中添加"key"
,因為"v
不近:
result = parse ( '{"key": "v' , OBJ ) ;
console . log ( result ) ; // Outputs: {}
result = parse ( '{"key": "value"' , OBJ ) ;
console . log ( result ) ; // Outputs: { key: 'value' }
相似性,如果允許,則可以分析部分陣列甚至部分特殊值:
(請注意, allow
默認Allow.ALL
。
result = parse ( '[ {"key1": "value1", "key2": [ "value2' ) ;
console . log ( result ) ; // Outputs: [ { key1: 'value1', key2: [ 'value2' ] } ]
result = parse ( "-Inf" ) ;
console . log ( result ) ; // Outputs: -Infinity
如果JSON字符串畸形, parse
功能將丟棄錯誤:
parse ( "wrong" ) ; // MalformedJSON [Error]: SyntaxError: Unexpected token 'w', "wrong" is not valid JSON at position 0
jsonString
<string>
:解析的JSON字符串。allowPartial
<number>
:指定在JSON解析過程中允許哪種偏差(默認: Allow.ALL
)。返回解析的JavaScript值。
一個指定在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-js.git
cd partial-json-parser-js
npm i
然後,您可以使用Vitest進行測試:
npm run test
請注意,雖然我們努力涵蓋盡可能多的邊緣案例,但總是有可能不涵蓋某些情況。
該項目已根據MIT許可獲得許可。