大模型穩(wěn)定輸出JSON格式的實(shí)戰(zhàn)指南:從Prompt到函數(shù)調(diào)用的完整方案
在構(gòu)建基于大模型的智能應(yīng)用時(shí)你是否遇到過(guò)這樣的困擾你向模型提問(wèn)“列出三個(gè)用戶信息包括姓名、年齡和郵箱”期望得到一個(gè)結(jié)構(gòu)化的JSON數(shù)組但模型卻返回了一段自由文本甚至夾雜著Markdown代碼塊標(biāo)記這種輸出格式的不穩(wěn)定性是AI應(yīng)用開(kāi)發(fā)特別是Agent智能體開(kāi)發(fā)中一個(gè)高頻痛點(diǎn)。它不僅增加了后端數(shù)據(jù)解析的復(fù)雜度更可能導(dǎo)致整個(gè)業(yè)務(wù)流程中斷。本文將深入探討大模型穩(wěn)定輸出JSON格式的實(shí)戰(zhàn)方案。無(wú)論你是正在開(kāi)發(fā)一個(gè)需要精準(zhǔn)數(shù)據(jù)提取的AI Agent還是在準(zhǔn)備相關(guān)技術(shù)面試本文都將為你提供從核心原理到工程落地的完整指南。我們將從問(wèn)題根源出發(fā)逐步拆解Prompt工程、函數(shù)調(diào)用、后處理校驗(yàn)以及使用專業(yè)框架等多種解決方案并附上可運(yùn)行的代碼示例和避坑清單幫助你徹底解決JSON輸出“抽風(fēng)”的問(wèn)題。1. 為什么大模型輸出JSON不穩(wěn)定在深入解決方案之前我們首先要理解問(wèn)題的根源。大語(yǔ)言模型LLM本質(zhì)上是基于概率生成文本的序列預(yù)測(cè)模型其訓(xùn)練目標(biāo)是生成“合理”的下一個(gè)詞元Token而非嚴(yán)格遵守特定的數(shù)據(jù)格式規(guī)范。1.1 不穩(wěn)定性表現(xiàn)與根源分析常見(jiàn)的不穩(wěn)定輸出形式自由文本混雜模型在JSON前后添加解釋性文字如“好的這是你要的數(shù)據(jù)”或“結(jié)果如下”。格式錯(cuò)誤缺少引號(hào)、括號(hào)不匹配、鍵名未加雙引號(hào)JSON標(biāo)準(zhǔn)要求必須為雙引號(hào)、尾部多余逗號(hào)。Markdown代碼塊返回json {...}將JSON包裹在Markdown標(biāo)記中。結(jié)構(gòu)漂移要求的字段缺失、多出未要求的字段或數(shù)組元素結(jié)構(gòu)不一致。類型錯(cuò)誤數(shù)字被輸出為字符串如age: “25”布爾值被寫為單詞。根本原因可以歸結(jié)為三點(diǎn)訓(xùn)練數(shù)據(jù)偏差模型在訓(xùn)練時(shí)接觸了大量非純JSON的文本如技術(shù)博客、問(wèn)答對(duì)其中JSON常被嵌入解釋性上下文中。Prompt歧義用戶的指令Prompt不夠精確模型無(wú)法區(qū)分你是要“生成JSON”還是“描述JSON”。采樣隨機(jī)性即使使用低溫度Temperature設(shè)置模型的生成過(guò)程仍有一定隨機(jī)性可能導(dǎo)致格式上的微小差異。1.2 穩(wěn)定JSON輸出的核心需求場(chǎng)景在以下場(chǎng)景中格式穩(wěn)定的JSON輸出至關(guān)重要AI Agent / 智能體Agent根據(jù)觀察和思考需要調(diào)用工具Tool/Function。工具調(diào)用的參數(shù)必須以結(jié)構(gòu)化數(shù)據(jù)通常是JSON的形式精確傳遞。數(shù)據(jù)提取與結(jié)構(gòu)化從非結(jié)構(gòu)化文本如新聞、報(bào)告中提取實(shí)體、關(guān)系并轉(zhuǎn)化為數(shù)據(jù)庫(kù)可接收的格式。API接口集成大模型作為后端服務(wù)需要向前端或其他服務(wù)返回可直接解析的數(shù)據(jù)對(duì)象。自動(dòng)化工作流將大模型的輸出作為下一個(gè)自動(dòng)化節(jié)點(diǎn)的輸入格式錯(cuò)誤會(huì)導(dǎo)致流程失敗。2. 環(huán)境與工具準(zhǔn)備在開(kāi)始實(shí)戰(zhàn)前我們需要搭建一個(gè)統(tǒng)一的實(shí)驗(yàn)環(huán)境。本文將以 OpenAI GPT 系列模型兼容 OpenAI API 的模型為例使用 Python 語(yǔ)言進(jìn)行演示。其他模型如 Claude、國(guó)產(chǎn)大模型和語(yǔ)言如 JavaScript的思路相通。2.1 基礎(chǔ)環(huán)境配置確保你的開(kāi)發(fā)環(huán)境已安裝 Python 3.8。我們主要使用openai和pydantic這兩個(gè)核心庫(kù)。# 創(chuàng)建并進(jìn)入項(xiàng)目目錄 mkdir stable-json-output cd stable-json-output # 創(chuàng)建虛擬環(huán)境推薦 python -m venv venv # 激活虛擬環(huán)境 # Windows: venv\Scripts\activate # macOS/Linux: source venv/bin/activate # 安裝核心依賴 pip install openai pydantic # 可選安裝用于更豐富功能如框架的庫(kù) # pip install instructor # 用于結(jié)構(gòu)化輸出的強(qiáng)大框架 # pip install litellm # 統(tǒng)一多模型調(diào)用2.2 獲取并配置API密鑰你需要一個(gè) OpenAI API 密鑰或兼容 OpenAI API 的服務(wù)如 Azure OpenAI, 國(guó)內(nèi)大模型平臺(tái)的密鑰。# config.py 或直接在代碼中設(shè)置環(huán)境變量 import os # 方法一直接設(shè)置不推薦用于生產(chǎn)環(huán)境 # openai.api_key “your-api-key-here” # 方法二使用環(huán)境變量推薦 # 在終端中執(zhí)行export OPENAI_API_KEY‘your-api-key-here’ # 或在代碼中通過(guò)os.environ設(shè)置 os.environ[“OPENAI_API_KEY”] “your-api-key-here” # 如果你使用其他兼容服務(wù)可能還需要設(shè)置 base_url # os.environ[“OPENAI_API_BASE”] “https://api.xxx.com/v1”3. 方案一精煉Prompt工程法這是最基礎(chǔ)、最直接的方法通過(guò)精心設(shè)計(jì)提示詞來(lái)引導(dǎo)模型。關(guān)鍵在于明確性、強(qiáng)制性并提供高質(zhì)量示例。3.1 基礎(chǔ)指令強(qiáng)化一個(gè)糟糕的Prompt“給我一些用戶數(shù)據(jù)?!?一個(gè)較好的Prompt“生成一個(gè)包含三個(gè)用戶對(duì)象的JSON數(shù)組每個(gè)對(duì)象有name字符串、age整數(shù)、email字符串字段。只輸出JSON不要有任何其他文字?!? basic_prompt.py import openai import json def get_completion_basic(prompt): client openai.OpenAI() response client.chat.completions.create( model“gpt-3.5-turbo”, # 或 “gpt-4”, “gpt-4-turbo-preview” messages[{“role”: “user”, “content”: prompt}], temperature0.1, # 降低隨機(jī)性對(duì)格式化輸出有益 max_tokens500 ) return response.choices[0].message.content # 測(cè)試基礎(chǔ)Prompt prompt “”” 請(qǐng)生成一個(gè)包含三個(gè)用戶信息的JSON數(shù)組。 每個(gè)用戶是一個(gè)對(duì)象包含以下字段 - name: 字符串表示用戶名 - age: 整數(shù)表示年齡 - email: 字符串表示電子郵箱 請(qǐng)確保輸出是**純粹的、有效的JSON字符串**不要包含任何Markdown代碼塊標(biāo)記如json也不要輸出任何解釋性文字。 “”” result get_completion_basic(prompt) print(“原始輸出”) print(result) print(“\n嘗試解析”) try: parsed json.loads(result) print(“解析成功”, json.dumps(parsed, indent2, ensure_asciiFalse)) except json.JSONDecodeError as e: print(f“解析失敗錯(cuò)誤{e}”) # 嘗試清理常見(jiàn)的非JSON前綴/后綴 cleaned result.strip() if cleaned.startswith(‘json’): cleaned cleaned[7:] elif cleaned.startswith(‘’): cleaned cleaned[3:] if cleaned.endswith(‘’): cleaned cleaned[:-3] cleaned cleaned.strip() print(“清理后內(nèi)容”, cleaned) try: parsed json.loads(cleaned) print(“清理后解析成功”, json.dumps(parsed, indent2, ensure_asciiFalse)) except: print(“清理后仍然無(wú)法解析?!?關(guān)鍵點(diǎn)分析明確結(jié)構(gòu)清晰定義JSON的根數(shù)組、元素對(duì)象和每個(gè)字段的名稱、類型。強(qiáng)制指令使用“純粹的、有效的JSON字符串”、“不要包含任何...”、“只輸出JSON”等強(qiáng)約束性語(yǔ)句。降低Temperaturetemperature0.1使輸出更確定更傾向于遵循指令。3.2 少樣本學(xué)習(xí)Few-Shot Learning在Prompt中提供輸入輸出的示例是引導(dǎo)模型格式最有效的方法之一。# few_shot_prompt.py import openai import json def get_completion_few_shot(prompt): client openai.OpenAI() response client.chat.completions.create( model“gpt-3.5-turbo”, messages[{“role”: “user”, “content”: prompt}], temperature0.1, response_format{ “type”: “json_object” } # 注意此參數(shù)要求模型必須輸出JSON對(duì)象對(duì)數(shù)組有限制 ) return response.choices[0].message.content # 少樣本Prompt包含一個(gè)清晰的示例 few_shot_prompt “”” 你的任務(wù)是將用戶的自然語(yǔ)言請(qǐng)求轉(zhuǎn)換為一個(gè)特定的JSON格式。 例如 用戶請(qǐng)求“列出兩個(gè)產(chǎn)品需要產(chǎn)品名和價(jià)格?!?輸出必須是以下格式的純JSON無(wú)任何額外文本 { “products”: [ {“name”: “產(chǎn)品A”, “price”: 100}, {“name”: “產(chǎn)品B”, “price”: 200} ] } 現(xiàn)在請(qǐng)?zhí)幚硇碌恼?qǐng)求 用戶請(qǐng)求“創(chuàng)建三個(gè)圖書條目包含標(biāo)題、作者和出版年份?!?請(qǐng)根據(jù)上述示例的格式輸出對(duì)應(yīng)的JSON。 “”” result get_completion_few_shot(few_shot_prompt) print(“少樣本學(xué)習(xí)輸出”) print(result) try: parsed json.loads(result) print(“解析成功”, json.dumps(parsed, indent2, ensure_asciiFalse)) except json.JSONDecodeError as e: print(f“解析錯(cuò)誤{e}”)注意OpenAI API 提供了response_format{ “type”: “json_object” }參數(shù)它能強(qiáng)制模型輸出一個(gè)有效的JSON對(duì)象。這是一個(gè)非常強(qiáng)大的特性但它有兩個(gè)重要限制你必須同時(shí)在系統(tǒng)或用戶消息中明確要求模型輸出JSON。它保證輸出是JSON對(duì)象以{開(kāi)頭但不保證是JSON數(shù)組以[開(kāi)頭。如果你需要數(shù)組可能仍需結(jié)合Prompt。4. 方案二函數(shù)調(diào)用Function Calling與工具使用這是目前生產(chǎn)環(huán)境中實(shí)現(xiàn)結(jié)構(gòu)化輸出最穩(wěn)定、最受推薦的方法。模型不直接輸出JSON而是輸出一個(gè)“意圖調(diào)用某個(gè)函數(shù)”的請(qǐng)求其中參數(shù)是結(jié)構(gòu)化的JSON。開(kāi)發(fā)者預(yù)先定義好函數(shù)工具的Schema模型會(huì)嚴(yán)格遵循這個(gè)Schema來(lái)生成參數(shù)。4.1 使用OpenAI原生函數(shù)調(diào)用# function_calling.py import openai import json # 1. 定義我們期望模型能夠調(diào)用的“函數(shù)”工具的Schema tools [ { “type”: “function”, “function”: { “name”: “extract_user_info”, “description”: “從描述中提取用戶信息并生成結(jié)構(gòu)化的列表”, “parameters”: { “type”: “object”, “properties”: { “users”: { “type”: “array”, “description”: “用戶對(duì)象列表”, “items”: { “type”: “object”, “properties”: { “name”: {“type”: “string”, “description”: “用戶姓名”}, “age”: {“type”: “integer”, “description”: “用戶年齡”}, “email”: {“type”: “string”, “description”: “用戶郵箱”} }, “required”: [“name”, “age”, “email”] } } }, “required”: [“users”] } } } ] # 2. 準(zhǔn)備用戶請(qǐng)求 messages [{“role”: “user”, “content”: “幫我提取這三個(gè)人信息張三25歲zhangsanexample.com李四30歲lisiexample.com王五28歲wangwuexample.com?!眪] client openai.OpenAI() # 3. 發(fā)起聊天補(bǔ)全請(qǐng)求并告知模型可用的工具 response client.chat.completions.create( model“gpt-3.5-turbo”, messagesmessages, toolstools, tool_choice“auto”, # 讓模型決定是否調(diào)用函數(shù)。設(shè)為 {“type”: “function”, “function”: {“name”: “extract_user_info”}} 可強(qiáng)制調(diào)用 temperature0 ) # 4. 解析模型的響應(yīng) response_message response.choices[0].message print(“模型原始響應(yīng)消息”, response_message) # 5. 檢查模型是否決定調(diào)用函數(shù) if response_message.tool_calls: # 通常只有一個(gè)工具調(diào)用 tool_call response_message.tool_calls[0] if tool_call.function.name “extract_user_info”: # 提取函數(shù)調(diào)用參數(shù)這已經(jīng)是標(biāo)準(zhǔn)的JSON字符串 function_args_str tool_call.function.arguments print(“\n模型生成的函數(shù)參數(shù)JSON字符串”) print(function_args_str) # 解析JSON try: function_args json.loads(function_args_str) print(“\n解析后的結(jié)構(gòu)化數(shù)據(jù)”) print(json.dumps(function_args, indent2, ensure_asciiFalse)) # 在實(shí)際應(yīng)用中這里你會(huì)調(diào)用真實(shí)的 extract_user_info 函數(shù) # result extract_user_info(**function_args) except json.JSONDecodeError as e: print(f“解析函數(shù)參數(shù)失敗{e}”) else: print(“模型沒(méi)有選擇調(diào)用函數(shù)返回了普通文本”, response_message.content)方案優(yōu)勢(shì)極高穩(wěn)定性模型輸出的arguments嚴(yán)格遵循你定義的 JSON Schema格式錯(cuò)誤率極低。類型安全Schema中定義了類型string, integer等模型會(huì)盡力遵守。意圖明確將“生成數(shù)據(jù)”的任務(wù)轉(zhuǎn)化為“調(diào)用函數(shù)”更符合模型在工具使用場(chǎng)景下的訓(xùn)練目標(biāo)。這是構(gòu)建可靠AI Agent的基石。5. 方案三使用專業(yè)框架Instructor對(duì)于復(fù)雜的數(shù)據(jù)結(jié)構(gòu)手動(dòng)編寫Prompt和解析邏輯依然繁瑣。Instructor庫(kù)應(yīng)運(yùn)而生它利用Pydantic模型來(lái)定義數(shù)據(jù)結(jié)構(gòu)并通過(guò)修補(bǔ)patchOpenAI客戶端將結(jié)構(gòu)化輸出的過(guò)程極大簡(jiǎn)化。5.1 安裝與基礎(chǔ)使用首先安裝庫(kù)pip install instructor# instructor_basic.py import instructor from openai import OpenAI from pydantic import BaseModel, Field from typing import List # 1. 使用instructor修補(bǔ)OpenAI客戶端 client instructor.patch(OpenAI()) # 2. 使用Pydantic定義你期望的數(shù)據(jù)結(jié)構(gòu) class User(BaseModel): name: str Field(…, description“用戶姓名”) age: int Field(…, description“用戶年齡”) email: str Field(…, description“用戶郵箱”) class UserList(BaseModel): “”“一個(gè)包含多個(gè)用戶的列表”“” users: List[User] # 3. 發(fā)起請(qǐng)求直接指定response_model completion client.chat.completions.create( model“gpt-3.5-turbo”, messages[ {“role”: “user”, “content”: “提供三個(gè)虛構(gòu)的用戶信息包括姓名、年齡和郵箱?!眪 ], response_modelUserList, # 核心指定返回的模型類型 max_retries2, # 自動(dòng)重試提高成功率 ) # 4. 直接得到Pydantic模型實(shí)例 extracted_data completion print(“提取的數(shù)據(jù)類型”, type(extracted_data)) print(“\n結(jié)構(gòu)化數(shù)據(jù)”) print(extracted_data.model_dump_json(indent2, ensure_asciiFalse)) # 5. 像操作普通對(duì)象一樣使用數(shù)據(jù) for user in extracted_data.users: print(f“用戶{user.name}, 年齡{user.age}”)5.2 處理復(fù)雜嵌套與可選字段Instructor配合Pydantic能輕松處理復(fù)雜場(chǎng)景。# instructor_advanced.py import instructor from openai import OpenAI from pydantic import BaseModel, Field from typing import List, Optional from enum import Enum class Department(str, Enum): ENGINEERING “Engineering” SALES “Sales” HR “HR” class Address(BaseModel): street: str city: str postal_code: Optional[str] None # 可選字段 class Employee(BaseModel): id: int full_name: str Field(…, description“員工全名”) department: Department email: str address: Optional[Address] None # 嵌套對(duì)象可選 skills: List[str] Field(default_factorylist, description“技能列表”) class CompanyRoster(BaseModel): company_name: str employees: List[Employee] client instructor.patch(OpenAI()) # 模擬一個(gè)復(fù)雜的用戶請(qǐng)求 user_query “”” 請(qǐng)為‘創(chuàng)新科技有限公司’生成一個(gè)包含5名員工的名單。 需要包含以下信息員工ID、全名、部門只能是Engineering, Sales, HR之一、郵箱。 其中為至少2名員工添加住址信息街道、城市、郵編可選。 為所有員工添加一些相關(guān)的技能標(biāo)簽。 “”” roster client.chat.completions.create( model“gpt-4-turbo-preview”, # 復(fù)雜結(jié)構(gòu)建議使用更強(qiáng)模型 messages[{“role”: “user”, “content”: user_query}], response_modelCompanyRoster, max_retries3, ) print(“公司花名冊(cè)”) print(roster.model_dump_json(indent2, ensure_asciiFalse)) # 訪問(wèn)嵌套數(shù)據(jù) print(f“\n公司名稱{roster.company_name}”) for emp in roster.employees: addr_info f“, 住址{emp.address.street}, {emp.address.city}” if emp.address else “” print(f“- {emp.full_name} ({emp.department}){addr_info}”)框架優(yōu)勢(shì)總結(jié)聲明式編程用Python類定義結(jié)構(gòu)無(wú)需手動(dòng)編寫JSON Schema。自動(dòng)重試與校驗(yàn)框架會(huì)自動(dòng)處理模型的格式錯(cuò)誤并嘗試重新生成。類型豐富完美支持枚舉、嵌套模型、可選字段、列表等復(fù)雜類型。無(wú)縫集成返回的就是Pydantic模型便于后續(xù)的驗(yàn)證、序列化和使用。6. 方案四輸出后處理與校驗(yàn)無(wú)論使用哪種方法在生產(chǎn)環(huán)境中添加一道后處理校驗(yàn)都是最佳實(shí)踐。這可以作為格式錯(cuò)誤的最后防線。6.1 健壯的解析與修復(fù)函數(shù)# post_processing.py import json import re from typing import Any, Optional def robust_json_parse(text: str, expected_type: Optional[type] None) - Any: “”” 嘗試從可能被污染的文本中解析JSON。 步驟1. 直接解析 2. 清理常見(jiàn)包裝 3. 查找JSON子串 4. 嘗試修復(fù)常見(jiàn)語(yǔ)法錯(cuò)誤 “”” original_text text.strip() # 嘗試1直接解析 try: result json.loads(original_text) if expected_type and not isinstance(result, expected_type): raise TypeError(f“解析出的類型是 {type(result)} 但期望的是 {expected_type}”) return result except json.JSONDecodeError as e1: pass # 繼續(xù)嘗試清理 cleaned original_text # 嘗試2移除Markdown代碼塊標(biāo)記 markdown_json_pattern r‘^(?:json)?\s*\n?(.*?)\n?$’ match re.search(markdown_json_pattern, cleaned, re.DOTALL | re.IGNORECASE) if match: cleaned match.group(1).strip() # 嘗試3查找第一個(gè)‘{‘或’[‘到最后一個(gè)’}‘或’]‘之間的內(nèi)容 # 這可以處理前面有解釋性文字的情況 start_chars {‘{‘: ‘}’, ‘[‘: ‘]’} for start_char, end_char in start_chars.items(): start_idx cleaned.find(start_char) if start_idx ! -1: # 從找到的開(kāi)始字符開(kāi)始找到最后一個(gè)匹配的結(jié)束字符 stack [] end_idx -1 for i in range(start_idx, len(cleaned)): ch cleaned[i] if ch start_char: stack.append(ch) elif ch end_char: if stack: stack.pop() if not stack: # ??照业狡ヅ涞慕Y(jié)束 end_idx i break if end_idx ! -1: candidate cleaned[start_idx:end_idx1] try: result json.loads(candidate) if expected_type and not isinstance(result, expected_type): raise TypeError(f“子串解析類型不匹配”) return result except: pass # 嘗試4嘗試修復(fù)一些常見(jiàn)的簡(jiǎn)單語(yǔ)法錯(cuò)誤謹(jǐn)慎使用 # 例如單引號(hào)替換為雙引號(hào)不完全可靠因?yàn)槲谋局锌赡馨戏▎我?hào) # 更推薦使用專門的庫(kù)如 json5 或 demjson3這里僅作演示 try: # 這是一個(gè)非常簡(jiǎn)單的修復(fù)可能引入新錯(cuò)誤僅用于最后嘗試 repaired re.sub(r“(?!\\)‘“, ‘“’, cleaned) # 替換未轉(zhuǎn)義的單引號(hào) repaired re.sub(r’(?!\\)’‘, ‘“’, repaired) result json.loads(repaired) return result except: pass # 所有嘗試都失敗 raise json.JSONDecodeError(f“無(wú)法從文本中解析出有效的JSON。原始文本開(kāi)頭{original_text[:100]}…”, original_text, 0) # 測(cè)試后處理函數(shù) test_cases [ # 純JSON ‘[{“name”: “Test”, “age”: 30}]’, # 帶Markdown ‘json\n[{“name”: “Test”, “age”: 30}]\n’, # 前面有文字 ‘這是你要的數(shù)據(jù) [{“name”: “Test”, “age”: 30}]’, # 前后都有文字 ‘結(jié)果如下\n\n[{“name”: “Test”, “age”: 30}]\n\n以上是全部信息?!? # 格式略有瑕疵實(shí)際中模型可能產(chǎn)生 “[{‘name’: ‘Test’, ‘a(chǎn)ge’: 30}]”, # 單引號(hào)非標(biāo)準(zhǔn)JSON ] for i, test in enumerate(test_cases): print(f“\n測(cè)試用例 {i1}: {test[:50]}…”) try: parsed robust_json_parse(test, expected_typelist) print(f“ 解析成功: {parsed}”) except Exception as e: print(f“ 解析失敗: {e}”)6.2 集成到完整流程中在實(shí)際調(diào)用中你應(yīng)該將后處理作為安全網(wǎng)。# integrated_pipeline.py import openai import json from post_processing import robust_json_parse # 導(dǎo)入上面的函數(shù) def get_structured_user_data(prompt: str) - list: “””一個(gè)集成了Prompt、調(diào)用和后處理的完整流程”“” client openai.OpenAI() # 使用強(qiáng)化的Prompt enhanced_prompt f“”” {prompt} 請(qǐng)將輸出嚴(yán)格限制為一個(gè)純粹的JSON數(shù)組數(shù)組中的每個(gè)元素是一個(gè)用戶對(duì)象包含“name”字符串、“age”整數(shù)、“email”字符串字段。 不要輸出任何其他文字、標(biāo)記或解釋。 “”” try: response client.chat.completions.create( model“gpt-3.5-turbo”, messages[{“role”: “user”, “content”: enhanced_prompt}], temperature0.1, # 也可以結(jié)合response_format # response_format{“type”: “json_object”}, # 注意這要求輸出是對(duì)象不是數(shù)組 ) raw_output response.choices[0].message.content # 關(guān)鍵步驟使用健壯的后處理 user_list robust_json_parse(raw_output, expected_typelist) # 額外的數(shù)據(jù)校驗(yàn)可選 for user in user_list: if not isinstance(user.get(‘name’), str): raise ValueError(f“Invalid name type: {user.get(‘name’)}”) if not isinstance(user.get(‘a(chǎn)ge’), int): # 嘗試轉(zhuǎn)換如果可能 try: user[‘a(chǎn)ge’] int(user[‘a(chǎn)ge’]) except: raise ValueError(f“Invalid age value: {user.get(‘a(chǎn)ge’)}”) return user_list except (json.JSONDecodeError, ValueError, TypeError) as e: # 記錄日志并可能觸發(fā)降級(jí)策略如返回空列表、使用默認(rèn)值、請(qǐng)求人工干預(yù) print(f“結(jié)構(gòu)化數(shù)據(jù)提取失敗: {e}”) # 降級(jí)嘗試一個(gè)更簡(jiǎn)單、更直接的請(qǐng)求 return [] # 或 raise # 使用 users get_structured_user_data(“生成兩個(gè)用戶信息張三和李四。”) print(“最終獲取到的用戶列表”, json.dumps(users, indent2, ensure_asciiFalse))7. 方案對(duì)比與選型指南面對(duì)多種方案如何選擇下表從多個(gè)維度進(jìn)行了對(duì)比特性/方案精煉Prompt工程函數(shù)調(diào)用 (Function Calling)Instructor (Pydantic)后處理校驗(yàn)穩(wěn)定性中低依賴模型理解和遵循指令的能力高模型嚴(yán)格遵循預(yù)定義Schema非常高框架提供自動(dòng)重試和校驗(yàn)作為補(bǔ)充極高最后防線開(kāi)發(fā)復(fù)雜度低只需編寫Prompt中需要定義JSON Schema中低用Python類定義更直觀中需要編寫解析邏輯靈活性高可隨時(shí)修改Prompt中修改Schema需更新函數(shù)定義中修改Pydantic模型高可適配各種不規(guī)則輸出類型安全無(wú)有通過(guò)Schema定義強(qiáng)集成Pydantic類型系統(tǒng)無(wú)需自行校驗(yàn)輸出結(jié)構(gòu)任意JSON必須符合函數(shù)參數(shù)Schema必須符合Pydantic模型任意但目標(biāo)是規(guī)整為預(yù)期結(jié)構(gòu)適用場(chǎng)景簡(jiǎn)單、臨時(shí)的數(shù)據(jù)提取對(duì)穩(wěn)定性要求不高的場(chǎng)景AI Agent工具調(diào)用需要強(qiáng)格式保證的API交互復(fù)雜嵌套數(shù)據(jù)提取需要類型安全和自動(dòng)重試的項(xiàng)目必備的安全生產(chǎn)環(huán)節(jié)處理第三方或不可控模型的輸出推薦指數(shù)??????? (Agent場(chǎng)景)????? (數(shù)據(jù)提取場(chǎng)景)????? (必須搭配使用)選型建議對(duì)于AI Agent開(kāi)發(fā)優(yōu)先使用函數(shù)調(diào)用Function Calling。這是OpenAI為工具使用設(shè)計(jì)的原生方式穩(wěn)定性和生態(tài)兼容性最好。對(duì)于復(fù)雜數(shù)據(jù)提取任務(wù)強(qiáng)烈推薦使用Instructor庫(kù)。它用Pythonic的方式將定義、調(diào)用、校驗(yàn)融為一體大幅提升開(kāi)發(fā)效率和可靠性。Prompt工程作為輔助手段在函數(shù)調(diào)用或Instructor的提示部分使用進(jìn)一步明確任務(wù)要求。后處理校驗(yàn)無(wú)論采用哪種方案都必須實(shí)施。這是保證程序魯棒性的關(guān)鍵。8. 高級(jí)技巧與面試常見(jiàn)問(wèn)題8.1 處理模型“幻覺(jué)”與字段缺失即使格式正確模型生成的內(nèi)容也可能不符合要求幻覺(jué)或缺失字段。解決方案在Schema/模型定義中使用Field(…, description“”)提供清晰、無(wú)歧義的字段描述。設(shè)置required字段在JSON Schema或Pydantic中明確必填字段。使用max_retriesInstructor支持讓框架自動(dòng)重試。后驗(yàn)證與默認(rèn)值from pydantic import BaseModel, Field, validator class User(BaseModel): name: str age: int Field(default0, ge0, le120) # 設(shè)置默認(rèn)值和范圍 email: Optional[str] None validator(‘email’) def validate_email_format(cls, v): if v is not None and “” not in v: # 可以嘗試修復(fù)或引發(fā)錯(cuò)誤 # 或者 return a default like “unknownexample.com” raise ValueError(‘invalid email format’) return v8.2 流式輸出中的JSON處理當(dāng)使用流式響應(yīng)Streaming時(shí)不能等完整響應(yīng)回來(lái)再解析。策略對(duì)于函數(shù)調(diào)用OpenAI的流式響應(yīng)中tool_calls的arguments是一個(gè)增量生成的字符串。你需要自己拼接這些Delta并在收到結(jié)束信號(hào)后嘗試解析。使用專門模式有些服務(wù)或框架提供了“流式JSON”模式如response_format{“type”: “json_object”}在某些模型上支持流式輸出JSON的每個(gè)鍵值對(duì)。8.3 大模型面試高頻考點(diǎn)如何保證大模型輸出JSON的穩(wěn)定性標(biāo)準(zhǔn)答案采用多層保障策略。首選使用模型的函數(shù)調(diào)用Function Calling功能通過(guò)預(yù)定義嚴(yán)格的JSON Schema來(lái)約束輸出其次可以使用像Instructor這樣的庫(kù)通過(guò)Pydantic模型聲明數(shù)據(jù)結(jié)構(gòu)并利用其自動(dòng)重試機(jī)制。同時(shí)必須編寫健壯的后處理解析函數(shù)以處理模型可能輸出的非純JSON文本如Markdown包裝。在Prompt設(shè)計(jì)上要使用清晰、強(qiáng)制的指令并結(jié)合少樣本示例。函數(shù)調(diào)用Function Calling的原理是什么模型并不直接執(zhí)行函數(shù)。開(kāi)發(fā)者預(yù)先定義好工具函數(shù)的列表及其參數(shù)Schema。當(dāng)用戶輸入與某個(gè)工具的描述匹配時(shí)模型會(huì)輸出一個(gè)特殊的結(jié)構(gòu)化消息表明它“想要調(diào)用”某個(gè)函數(shù)并生成一個(gè)符合該函數(shù)Schema的JSON參數(shù)。開(kāi)發(fā)者收到這個(gè)請(qǐng)求后在自己的代碼中真正執(zhí)行對(duì)應(yīng)的函數(shù)。如果模型就是不生成有效JSON怎么辦降級(jí)策略首先記錄錯(cuò)誤并重試2-3次。如果仍然失敗可以回退到一個(gè)更簡(jiǎn)單、約束更強(qiáng)的Prompt。最終手段是向用戶返回一個(gè)友好的錯(cuò)誤信息并提示其重新表述請(qǐng)求或轉(zhuǎn)為人工處理。監(jiān)控與迭代收集所有失敗的案例分析原因。是Prompt不清晰Schema太復(fù)雜還是模型能力不足根據(jù)分析結(jié)果優(yōu)化你的Schema和Prompt。如何設(shè)計(jì)一個(gè)用于提取信息的Pydantic模型從核心實(shí)體開(kāi)始使用明確的字段名和類型str,int,List,Optional。為每個(gè)字段添加Field(…, description“”)描述要具體、無(wú)歧義。使用嵌套模型BaseModel組織復(fù)雜關(guān)系。利用枚舉Enum約束字段的取值范圍。為可選字段設(shè)置合理的默認(rèn)值如None。添加驗(yàn)證器validator進(jìn)行業(yè)務(wù)邏輯校驗(yàn)。9. 完整實(shí)戰(zhàn)案例構(gòu)建一個(gè)穩(wěn)定的用戶信息提取Agent讓我們綜合運(yùn)用以上知識(shí)構(gòu)建一個(gè)從一段自由文本中提取用戶信息并存入模擬數(shù)據(jù)庫(kù)的簡(jiǎn)單Agent。# user_info_agent.py import instructor from openai import OpenAI from pydantic import BaseModel, Field, validator from typing import List, Optional import json import sqlite3 from datetime import datetime # --- 1. 定義數(shù)據(jù)結(jié)構(gòu) --- class Address(BaseModel): street: Optional[str] None city: Optional[str] None country: str “中國(guó)” # 默認(rèn)值 class UserInfo(BaseModel): “”“從文本中提取出的單個(gè)用戶信息”“” name: str Field(…, description“用戶的全名”) age: Optional[int] Field(None, ge0, le120, description“用戶年齡如果沒(méi)有明確提及則為None”) email: Optional[str] Field(None, description“郵箱地址”) phone: Optional[str] Field(None, description“手機(jī)號(hào)碼”) address: Optional[Address] None source_text_snippet: str Field(…, description“原文中提及該用戶的那部分文本”) validator(‘email’) def email_contains_at(cls, v): if v is not None and “” not in v: # 簡(jiǎn)單校驗(yàn)生產(chǎn)環(huán)境應(yīng)用更復(fù)雜的正則 raise ValueError(‘Email must contain ’) return v class ExtractedData(BaseModel): “”“提取任務(wù)的總結(jié)果”“” users: List[UserInfo] raw_text_summary: str Field(…, description“對(duì)原始文本的簡(jiǎn)要總結(jié)”) # --- 2. 修補(bǔ)客戶端并定義提取函數(shù) --- client instructor.patch(OpenAI()) def extract_users_from_text(text: str) - ExtractedData: “””核心提取函數(shù)使用Instructor”“” prompt f“”” 請(qǐng)從以下文本中提取所有提到的用戶信息。 文本內(nèi)容 “”{text}”” 請(qǐng)仔細(xì)識(shí)別文中提到的每一個(gè)人并盡可能提取他們的姓名、年齡、聯(lián)系方式郵箱或電話和住址信息。 如果某些信息如年齡、郵箱沒(méi)有明確提及請(qǐng)將其設(shè)為null。 請(qǐng)確?!皊ource_text_snippet”字段準(zhǔn)確記錄原文中描述該用戶的句子或片段。 最后請(qǐng)用一句話總結(jié)原始文本的主要內(nèi)容填入“raw_text_summary”。 “”” try: extracted client.chat.completions.create( model“gpt-4-turbo-preview”, # 復(fù)雜信息提取建議用更強(qiáng)模型 messages[{“role”: “user”, “content”: prompt}], response_modelExtractedData, max_retries3, temperature0, ) return extracted except Exception as e: print(f“信息提取失敗: {e}”) # 返回一個(gè)空的提取結(jié)果作為降級(jí) return ExtractedData(users[], raw_text_summary“提取失敗”) # --- 3. 模擬數(shù)據(jù)庫(kù)存儲(chǔ) --- def init_database(): conn sqlite3.connect(‘:memory:’) # 內(nèi)存數(shù)據(jù)庫(kù)方便演示 cursor conn.cursor() cursor.execute(“”” CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, age INTEGER, email TEXT, phone TEXT, address_street TEXT, address_city TEXT, address_country TEXT, source_snippet TEXT, extracted_at TIMESTAMP, raw_summary TEXT ) “””) conn.commit() return conn def save_to_database(conn, data: ExtractedData): cursor conn.cursor() for user in data.users: cursor.execute(“”” INSERT INTO users (name, age, email, phone, address_street, address_city, address_country, source_snippet, extracted_at, raw_summary) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) “””, ( user.name, user.age, user.email, user.phone, user.address.street if user.address else None, user.address.city if user.address else None, user.address.country if user.address else “中國(guó)”, user.source_text_snippet, datetime.now().isoformat(), data.raw_text_summary )) conn.commit() print(f“成功保存 {len(data.users)} 條用戶記錄到數(shù)據(jù)庫(kù)?!? # --- 4. 主程序 --- if __name__ “__main__”: # 模擬輸入文本 input_text “”” 在我們的項(xiàng)目團(tuán)隊(duì)中張三25歲主要負(fù)責(zé)后端開(kāi)發(fā)他的聯(lián)系郵箱是zhangsancompany.com。 李四來(lái)自北京住在朝陽(yáng)區(qū)建國(guó)路123號(hào)她今年30歲了電話是13800138000。 還有一位同事王五他的郵箱是wangwuexample.org常駐上海。 最近我們招募了實(shí)習(xí)生趙六他今年22歲。 “”” print(“原始文本”) print(input_text) print(“\n” “”*50 “\n”) # 初始化數(shù)據(jù)庫(kù) db_conn init_database() # 執(zhí)行提取 print(“正在使用大模型提取用戶信息…”) result extract_users_from_text(input_text) print(“\n提取結(jié)果”) print(result.model_dump_json(indent2, ensure_asciiFalse)) # 保存到數(shù)據(jù)庫(kù) if result.users: save_to_database(db_conn, result) # 查詢驗(yàn)證 cursor db_conn.cursor() cursor.execute(“SELECT name, age, email, phone FROM users”) saved_users cursor.fetchall() print(“\n數(shù)據(jù)庫(kù)中保存的用戶”) for user in saved_users: print(user) else: print(“未提取到用戶信息?!? db_conn.close()這個(gè)案例展示了從定義數(shù)據(jù)結(jié)構(gòu)、使用Instructor穩(wěn)定提取、數(shù)據(jù)后驗(yàn)證到持久化存儲(chǔ)的完整流程是一個(gè)生產(chǎn)可用Agent的簡(jiǎn)化原型。10. 總結(jié)與最佳實(shí)踐清單要確保大模型穩(wěn)定輸出JSON沒(méi)有銀彈而是一套組合拳。以下是貫穿整個(gè)開(kāi)發(fā)周期的核心實(shí)踐設(shè)計(jì)階段明確需求首先徹底厘清你需要的數(shù)據(jù)結(jié)構(gòu)。使用工具如pydantic或JSON Schema進(jìn)行正式定義。選擇正確工具對(duì)于Agent工具調(diào)用用原生函數(shù)調(diào)用對(duì)于復(fù)雜數(shù)據(jù)提取用InstructorPydantic。開(kāi)發(fā)階段強(qiáng)化Prompt在系統(tǒng)或用戶消息中明確要求“只輸出JSON”并提供清晰示例。將temperature設(shè)為較低值如0-0.3。利用API特性如果適用務(wù)必使用response_format{ “type”: “json_object” }參數(shù)。實(shí)現(xiàn)健壯解析編寫一個(gè)robust_json_parse函數(shù)作為處理模型原始輸出的安全網(wǎng)。測(cè)試與監(jiān)控階段全面測(cè)試使用包含邊緣案例缺失字段、格式污染、怪異字符的文本測(cè)試你的流程。實(shí)施重試機(jī)制對(duì)于非關(guān)鍵任務(wù)配置2-3次自動(dòng)重試如Instructor的max_retries。記錄失敗案例所有解析失敗的請(qǐng)求都應(yīng)記錄其原始Prompt和模型輸出用于后續(xù)分析和Prompt/Schema優(yōu)化。生產(chǎn)部署階段設(shè)置超時(shí)與降級(jí)為L(zhǎng)LM調(diào)用設(shè)置合理超時(shí)并規(guī)劃好降級(jí)策略如返回空值、使用緩存、觸發(fā)人工流程。監(jiān)控關(guān)鍵指標(biāo)跟蹤JSON解析成功率、字段填充率、模型調(diào)用延遲和成本。持續(xù)迭代大模型能力和最佳實(shí)踐在快速演進(jìn)定期回顧和更新你的Prompt、Schema及后處理邏輯。穩(wěn)定、可靠的結(jié)構(gòu)化輸出是將大模型從“玩具”變?yōu)椤吧a(chǎn)工具”的關(guān)鍵一步。通過(guò)本文介紹的多層策略你可以顯著提升AI應(yīng)用的數(shù)據(jù)交互可靠性為構(gòu)建復(fù)雜的智能體系統(tǒng)和自動(dòng)化流程打下堅(jiān)實(shí)基礎(chǔ)。

相關(guān)新聞

中國(guó)城市綠色經(jīng)濟(jì)效率數(shù)據(jù)集解析與應(yīng)用

中國(guó)城市綠色經(jīng)濟(jì)效率數(shù)據(jù)集解析與應(yīng)用

1. 數(shù)據(jù)背景與價(jià)值解讀這份涵蓋2006-2022年中國(guó)282個(gè)地級(jí)市的綠色經(jīng)濟(jì)效率數(shù)據(jù)集,是當(dāng)前區(qū)域可持續(xù)發(fā)展研究領(lǐng)域的重要基礎(chǔ)資源。作為長(zhǎng)期從事城市經(jīng)濟(jì)分析的從業(yè)者,我深刻理解這類數(shù)據(jù)的稀缺性——它首次實(shí)現(xiàn)了跨17年時(shí)間維度和全量地級(jí)市空間維度的雙重…

2026/8/4 13:23:12 閱讀更多
Handsontable自定義Select控件開(kāi)發(fā)指南

Handsontable自定義Select控件開(kāi)發(fā)指南

1. Handsontable 單元格類型擴(kuò)展實(shí)戰(zhàn):打造靈活可配的 Select 控件作為一名長(zhǎng)期與數(shù)據(jù)表格打交道的前端開(kāi)發(fā)者,我經(jīng)常遇到需要增強(qiáng)表格交互能力的場(chǎng)景。Handsontable 作為一款功能強(qiáng)大的 JavaScript 電子表格庫(kù),其 registerCellType 方法為我們…

2026/8/4 13:23:12 閱讀更多
萊達(dá)西貝普(Lerodalcibep)用法用量、漏診處理與給藥操作規(guī)范梳理

萊達(dá)西貝普(Lerodalcibep)用法用量、漏診處理與給藥操作規(guī)范梳理

萊達(dá)西貝普(商品名Lerochol)作為每月一次皮下注射的長(zhǎng)效PCSK9抑制劑,規(guī)范給藥是保障降脂療效、降低不良反應(yīng)風(fēng)險(xiǎn)的關(guān)鍵?;贔DA官方完整處方信息,藥物推薦標(biāo)準(zhǔn)劑量為 300mg,每4周(每月)皮下注射…

2026/8/4 13:23:12 閱讀更多
如何永久保存B站視頻?這款開(kāi)源工具讓你告別緩存文件丟失的煩惱

如何永久保存B站視頻?這款開(kāi)源工具讓你告別緩存文件丟失的煩惱

如何永久保存B站視頻?這款開(kāi)源工具讓你告別緩存文件丟失的煩惱 【免費(fèi)下載鏈接】m4s-converter 一個(gè)跨平臺(tái)小工具,將bilibili緩存的m4s格式音視頻文件合并成mp4 項(xiàng)目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否經(jīng)歷過(guò)這樣的場(chǎng)…

2026/8/4 14:33:14 閱讀更多
【一】軟件工程核心概念層級(jí)地圖與項(xiàng)目落地全流程

【一】軟件工程核心概念層級(jí)地圖與項(xiàng)目落地全流程

很多同學(xué),都會(huì)被結(jié)構(gòu)化方法、OOA、UML、設(shè)計(jì)模式、Scrum、ABSD、ATAM 這一堆概念繞暈:它們有的像方法,有的像工具,有的管項(xiàng)目節(jié)奏,有的管代碼設(shè)計(jì),常常被放在一起考,卻根本不在同一個(gè)維度上。 很…

2026/8/4 14:33:14 閱讀更多
圖片翻譯怎么做?AI圖片翻譯工具使用教程與對(duì)比

圖片翻譯怎么做?AI圖片翻譯工具使用教程與對(duì)比

很多人搜“圖片翻譯怎么做”,其實(shí)想解決的不是同一件事:有人要翻路牌、菜單和商品圖,有人要翻截圖、海報(bào)和說(shuō)明書,還有人是把掃描頁(yè)、拍照頁(yè)當(dāng)成圖片來(lái)處理。先把邊界說(shuō)清楚:圖片翻譯沒(méi)有單一最優(yōu)工具,結(jié)果…

2026/8/4 14:33:14 閱讀更多
第5講:任務(wù)規(guī)劃與拆解(Planning)——讓 Agent 學(xué)會(huì)“先計(jì)劃,再執(zhí)行”

第5講:任務(wù)規(guī)劃與拆解(Planning)——讓 Agent 學(xué)會(huì)“先計(jì)劃,再執(zhí)行”

前四講我們構(gòu)建了一個(gè)能“思考-行動(dòng)-觀察”的 ReAct Agent。但它有一個(gè)明顯的局限:每次只走一步,走一步看一步。 這就像一個(gè)人蒙著眼睛走路——每走一步摸一下周圍,再?zèng)Q定下一步往哪走。對(duì)于簡(jiǎn)單任務(wù)(查天氣、算算術(shù))夠用,但對(duì)于復(fù)雜任務(wù)(“整理本周銷售數(shù)據(jù)并生成報(bào)告…

2026/8/4 14:33:14 閱讀更多
終極指南:在游戲機(jī)上用wiliwili暢享B站視頻的完整教程

終極指南:在游戲機(jī)上用wiliwili暢享B站視頻的完整教程

終極指南:在游戲機(jī)上用wiliwili暢享B站視頻的完整教程 【免費(fèi)下載鏈接】wiliwili 第三方B站客戶端,目前可以運(yùn)行在PC全平臺(tái)、PSVita、PS4 、Xbox 和 Nintendo Switch上 項(xiàng)目地址: https://gitcode.com/GitHub_Trending/wi/wiliwili 想在任天堂Swi…

2026/8/4 14:33:14 閱讀更多
【計(jì)算機(jī)畢業(yè)設(shè)計(jì)單片機(jī)案例】毫米精度 TOC400C 激光測(cè)距監(jiān)測(cè)報(bào)警系統(tǒng)開(kāi)發(fā) 嵌入式單片機(jī)近距離障礙物激光預(yù)警裝置設(shè)計(jì)(023301)

【計(jì)算機(jī)畢業(yè)設(shè)計(jì)單片機(jī)案例】毫米精度 TOC400C 激光測(cè)距監(jiān)測(cè)報(bào)警系統(tǒng)開(kāi)發(fā) 嵌入式單片機(jī)近距離障礙物激光預(yù)警裝置設(shè)計(jì)(023301)

博主介紹:??碼農(nóng)一枚 ,專注于大學(xué)生項(xiàng)目實(shí)戰(zhàn)開(kāi)發(fā)、講解和畢業(yè)🚢文撰寫修改等。全棧領(lǐng)域優(yōu)質(zhì)創(chuàng)作者,博客之星、掘金/華為云/阿里云/InfoQ等平臺(tái)優(yōu)質(zhì)作者、專注于嵌入式單片機(jī),Java、小程序技術(shù)領(lǐng)域和畢業(yè)項(xiàng)目實(shí)戰(zhàn) ??…

2026/8/4 14:23:14 閱讀更多
清華大學(xué)重磅EST:植物自導(dǎo)電閃蒸焦耳熱600°C/2600°C兩步法!稀土超積累植物秒級(jí)轉(zhuǎn)化為CeO?-石墨烯電催化劑!

清華大學(xué)重磅EST:植物自導(dǎo)電閃蒸焦耳熱600°C/2600°C兩步法!稀土超積累植物秒級(jí)轉(zhuǎn)化為CeO?-石墨烯電催化劑!

通訊作者:鄧兵、劉建國(guó)通訊單位:清華大學(xué)DOI:https://doi.org/10.1021/acs.est.6c00603研究背景稀土元素(REEs)是清潔能源技術(shù)與電子器件不可或缺的核心原料,然而傳統(tǒng)提取方式依賴能耗高、排放大的采礦與強(qiáng)…

2026/8/4 0:01:30 閱讀更多
貴州師范大學(xué)JCIS:混合焓調(diào)控設(shè)計(jì)PtCoNiCuCr高熵合金!ORR半波電位0.89 V/質(zhì)量活性2.4倍Pt/C!

貴州師范大學(xué)JCIS:混合焓調(diào)控設(shè)計(jì)PtCoNiCuCr高熵合金!ORR半波電位0.89 V/質(zhì)量活性2.4倍Pt/C!

研究背景質(zhì)子交換膜燃料電池(PEMFCs)因其高能量轉(zhuǎn)換效率和清潔零排放特性備受關(guān)注,然而陰極氧還原反應(yīng)(ORR)動(dòng)力學(xué)遲緩、鉑催化劑成本高昂且耐久性不足的問(wèn)題嚴(yán)重制約了其商業(yè)化進(jìn)程。將 Pt 與 3d 過(guò)渡金屬合金化可調(diào)控…

2026/8/4 0:01:30 閱讀更多
福州大學(xué)/清華大學(xué)AFM:脈沖焦耳熱900°C/1s合成Co?Cu催化劑,寬電位NH?法拉第效率~100%,MEA穩(wěn)定300h

福州大學(xué)/清華大學(xué)AFM:脈沖焦耳熱900°C/1s合成Co?Cu催化劑,寬電位NH?法拉第效率~100%,MEA穩(wěn)定300h

通訊作者:萬(wàn)宇馳、張久俊、呂瑞濤通訊單位:福州大學(xué) 、清華大學(xué)DOI:https://doi.org/10.1002/adfm.76112核心導(dǎo)讀:本文提出"分步升級(jí)"廢硝酸鹽處理新路線——利用廢水中的金屬離子經(jīng)快速焦耳熱(40V&#xff…

2026/8/4 0:01:30 閱讀更多
MoneyPrinterPlus實(shí)戰(zhàn)指南:AI視頻批量生成與自動(dòng)化發(fā)布完整解決方案

MoneyPrinterPlus實(shí)戰(zhàn)指南:AI視頻批量生成與自動(dòng)化發(fā)布完整解決方案

MoneyPrinterPlus實(shí)戰(zhàn)指南:AI視頻批量生成與自動(dòng)化發(fā)布完整解決方案 【免費(fèi)下載鏈接】MoneyPrinterPlus AI一鍵批量生成各類短視頻,自動(dòng)批量混剪短視頻,自動(dòng)把視頻發(fā)布到抖音,快手,小紅書,視頻號(hào)上,賺錢從來(lái)沒(méi)有這么容易過(guò)! 支持本地語(yǔ)音模型chatTTS,fasterwhisper,…

2026/8/4 13:11:34 閱讀更多
3分鐘搞定!QQ空間歷史說(shuō)說(shuō)完整備份終極指南

3分鐘搞定!QQ空間歷史說(shuō)說(shuō)完整備份終極指南

3分鐘搞定!QQ空間歷史說(shuō)說(shuō)完整備份終極指南 【免費(fèi)下載鏈接】GetQzonehistory 獲取QQ空間發(fā)布的歷史說(shuō)說(shuō) 項(xiàng)目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾想過(guò),那些年發(fā)過(guò)的QQ空間說(shuō)說(shuō),那些記錄青春的文字…

2026/8/4 13:10:06 閱讀更多
AMAT 0100-02186 I/O 分配 PCB

AMAT 0100-02186 I/O 分配 PCB

AMAT 0100-02186 I/O分配PCB板是應(yīng)用材料(Applied Materials)公司生產(chǎn)的一款用于半導(dǎo)體設(shè)備的I/O信號(hào)分配電路板。該型號(hào)(0100-02186)的核心特點(diǎn)如下:專用于Endura等半導(dǎo)體工藝腔室。集成信號(hào)路由與分配功能。連接控制…

2026/8/3 19:34:52 閱讀更多
Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動(dòng)機(jī)

Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動(dòng)機(jī)

Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動(dòng)機(jī)是日本日清(Nissei)品牌的一款工業(yè)用三相異步電機(jī),適用于自動(dòng)化設(shè)備及通用機(jī)械驅(qū)動(dòng)。該型號(hào)(FFMN-32L-10-T0 40AX)的核心特點(diǎn)如下:三相交流異步電動(dòng)機(jī)。額定…

2026/8/3 19:34:54 閱讀更多