支持大模型流式輸出的JSON提取工具 原創(chuàng)
在我們?nèi)粘L幚泶竽P偷妮敵鰰r(shí),經(jīng)常希望輸出的結(jié)果為結(jié)構(gòu)化的(例如輸出json格式),這樣有助于我們進(jìn)行結(jié)果的后處理。但是在模型輸出超過(guò)限制和流式輸出時(shí)就會(huì)遇到問(wèn)題了,由于答案沒(méi)完全輸出,轉(zhuǎn)json就存在問(wèn)題。
大型語(yǔ)言模型(LLMs)產(chǎn)生結(jié)構(gòu)化輸出的原因包括:
- 提高可讀性:結(jié)構(gòu)化輸出使得信息以一種邏輯清晰、易于理解的方式呈現(xiàn),提高了信息的可讀性和用戶體驗(yàn)。
- 便于處理:結(jié)構(gòu)化數(shù)據(jù)可以更容易地被機(jī)器讀取和處理,有助于后續(xù)的數(shù)據(jù)分析、存儲(chǔ)和檢索。
- 支持自動(dòng)化:結(jié)構(gòu)化輸出可以方便地與自動(dòng)化工具和流程集成,例如自動(dòng)填充表格、數(shù)據(jù)庫(kù)錄入或觸發(fā)特定的業(yè)務(wù)流程。
- 增強(qiáng)一致性:通過(guò)規(guī)定輸出的格式和結(jié)構(gòu),可以確保不同時(shí)間或不同情境下產(chǎn)生的輸出具有一致性。
- 促進(jìn)數(shù)據(jù)交換:結(jié)構(gòu)化數(shù)據(jù)遵循特定的標(biāo)準(zhǔn)和格式,便于在不同的系統(tǒng)和應(yīng)用程序之間進(jìn)行數(shù)據(jù)交換。
- 改善信息檢索:結(jié)構(gòu)化輸出使得搜索引擎和檢索系統(tǒng)能夠更準(zhǔn)確地索引和檢索信息。
- 適應(yīng)多種用途:結(jié)構(gòu)化數(shù)據(jù)可以根據(jù)需要被轉(zhuǎn)換成不同的格式,以適應(yīng)報(bào)告、分析、可視化等多種用途。
- 減少歧義:明確的結(jié)構(gòu)有助于減少對(duì)輸出內(nèi)容的誤解或歧義。
- 促進(jìn)多模態(tài)交互:結(jié)構(gòu)化輸出可以支持與視覺(jué)、聲音等多種模態(tài)的交互,提高多模態(tài)應(yīng)用的體驗(yàn)。
- 提高可維護(hù)性:當(dāng)需要更新或維護(hù)輸出內(nèi)容時(shí),結(jié)構(gòu)化數(shù)據(jù)更容易管理和修改。
工具功能介紹:
- json補(bǔ)全
- 配合流式輸出
- 解析markdown格式
- 字段校驗(yàn)
效果展示
部分輸出的
text = '''{"name":"張三", "age":'''
print(parse_json_markdown(text))
# {'name': '張三'}
markdown格式
text = '''```json\n{"name":"張三", "age":27'''
print(parse_json_markdown(text))
# {'name': '張三', 'age': 27}
多維嵌套
text = '''```json\n{"name":"張三", "age": 27, "愛(ài)好": ["羽毛球'''
print(parse_json_markdown(text))
# {'name': '張三', 'age': 27, '愛(ài)好': ['羽毛球']}
核心代碼介紹
核心處理代碼如下:
new_chars = []
stack = []
is_inside_string = False
escaped = False
# Process each character in the string one at a time.
for char in s:
if is_inside_string:
if char == '"' and not escaped:
is_inside_string = False
elif char == "\n" and not escaped:
char = "\\n" # Replace the newline character with the escape sequence.
elif char == "\\":
escaped = not escaped
else:
escaped = False
else:
if char == '"':
is_inside_string = True
escaped = False
elif char == "{":
stack.append("}")
elif char == "[":
stack.append("]")
elif char == "}" or char == "]":
if stack and stack[-1] == char:
stack.pop()
else:
# Mismatched closing character; the input is malformed.
return None
本文轉(zhuǎn)載自公眾號(hào)哎呀AIYA
原文鏈接:??https://mp.weixin.qq.com/s/-I3wXkRGgyEuRYUQa84AEQ??
?著作權(quán)歸作者所有,如需轉(zhuǎn)載,請(qǐng)注明出處,否則將追究法律責(zé)任
贊
收藏
回復(fù)
分享
微博
QQ
微信
舉報(bào)

回復(fù)
相關(guān)推薦