??📝個人主頁:哈__
期待您的關注?
目錄
一、引言
二、文心一言開源模型
2.1 MoE架構
2.2 文心一言MoE架構?
三、文心一言稠密模型部署
3.1 產品選擇
3.2 環境選擇
3.3 Python3.12安裝
3.3 PaddlePaddle-GPU安裝
?3.4?FastDeploy-GPU安裝
?編輯3.5 模型部署
四、模型測試
4.1 文心一言4.5基礎請求測試
?編輯
4.2?文心一言4.5多次請求測試
4.3?讓文心一言4.5自己想一些測試方向
4.4 中文處理和生成測評?
4.4.1?文學文本理解能力(基礎核心)
4.4.2?文學知識儲備(專業基礎)
4.4.3 文學創作能力(核心應用)
?五、測試總結
一、引言
文心一言(ERNIE Bot)是百度推出的人工智能大語言模型,它基于飛槳平臺和文心知識增強技術,具備文本處理、AI 繪畫等功能,能應用于創作、數據分析、代碼生成等多個場景,支持 PC、APP 及 API 接入等使用方式,用戶規模龐大,生態不斷擴展,不同版本在性能上各有提升,滿足不同需求。
2025年6月30日,百度做出了一件具有里程碑意義的事情:開源文心一言大模型,這一舉措旨在構建更加繁榮的開發者生態系統。此舉不僅在行業內引發了廣泛關注,也標志著中國AI市場競爭格局的重大變化。百度的這一戰略轉變,可能會推動整個行業從性能競爭逐步轉向價格戰,總體來說,文心一言的開源將來可能會推動AI行業的發展。
?這一決策將打破AI技術壁壘,讓AI社區開發者可以更加直觀的了解到文心一言大模型的架構設計和運行機制,對于中小型AI相關企業來說,這是一個足以推動企業快速發展的決策。
二、文心一言開源模型
文心4.5系列開源模型共10款,涵蓋了激活參數規模分別為47B和3B的混合專家(MoE)模型(最大的模型總參數量為424B),以及0.3B的稠密參數模型。
?開源模型分為兩類:MoE模型以及稠密型模型。
2.1 MoE架構
混合專家模型(Mixed Expert Models,簡稱 MoEs) ,最早是隨著 Mixtral 8x7B 的推出而逐漸引起人們的廣泛關注。這個概念與集成學習方法相似,旨在為由多個單獨網絡組成的系統建立一個監管機制。在這種系統中,每個網絡 (被稱為“專家”) 處理訓練樣本的不同子集,專注于輸入空間的特定區域。
混合專家模型 (MoE) 的一個顯著優勢是它們能夠在遠少于稠密模型所需的計算資源下進行有效的預訓練。MoE的核心思想用多個 “專家網絡(FFNN 1~4)”+“路由器(Router)”?替代傳統的單一大 FFNN,讓?不同輸入由最擅長的 “專家” 處理,實現 “分工協作”。
2.2 文心一言MoE架構?
針對 MoE 架構,文心一言提出了一種創新性的多模態異構模型結構,通過跨模態參數共享機制實現模態間知識融合,同時為各單一模態保留專用參數空間。此架構非常適用于從大語言模型向多模態模型的持續預訓練范式,在保持甚至提升文本任務性能的基礎上,顯著增強多模態理解能力。
來看一下官方對于文心一言MoE架構的解釋。
多模態混合專家模型預訓練?
文心4.5通過在文本和視覺兩種模態上進行聯合訓練,更好地捕捉多模態信息中的細微差別,提升在文本生成、圖像理解以及多模態推理等任務中的表現。為了讓兩種模態學習時互相提升,我們提出了一種多模態異構混合專家模型結構,結合了多維旋轉位置編碼,并且在損失函數計算時,增強了不同專家間的正交性,同時對不同模態間的詞元進行平衡優化,達到多模態相互促進提升的目的。
高效訓練推理框架
為了支持文心4.5模型的高效訓練,我們提出了異構混合并行和多層級負載均衡策略。通過節點內專家并行、顯存友好的流水線調度、FP8混合精度訓練和細粒度重計算等多項技術,顯著提升了預訓練吞吐。推理方面,我們提出了多專家并行協同量化方法和卷積編碼量化算法,實現了效果接近無損的4-bit量化和2-bit量化。此外,我們還實現了動態角色轉換的預填充、解碼分離部署技術,可以更充分地利用資源,提升文心4.5 MoE模型的推理性能。基于飛槳框架,文心4.5在多種硬件平臺均表現出優異的推理性能。
針對模態的后訓練
為了滿足實際場景的不同要求,我們對預訓練模型進行了針對模態的精調。其中,大語言模型針對通用語言理解和生成進行了優化,多模態大模型側重于視覺語言理解,支持思考和非思考模式。每個模型采用了SFT、DPO或UPO(UnifiedPreferenceOptimization,統一偏好優化技術)的多階段后訓練。
我理解的文心一言MoE架構設計:?
對比項 | 傳統 Transformer decoder 的 MoE | ERNIE 多模態異構 MoE |
---|---|---|
目標 | 優化單模態文本任務的效率 | 構建多模態融合能力,兼容文本 + 圖像等 |
結構復雜度 | 局部模塊替換(單流) | 多流分支 + 跨模態共享(復雜系統) |
處理模態 | 純文本 | 文本 + 圖像(多模態) |
訓練重點 | 文本預訓練 | 多階段(文本→多模態→任務微調)+ 持續學習 |
典型應用 | 文本生成、對話(單模態) | 圖文檢索、圖像描述、多模態問答(跨模態) |
文心4.5系列模型均使用飛槳深度學習框架進行高效訓練、推理和部署。在大語言模型的預訓練中,模型FLOPs利用率(MFU)達到47%。實驗結果顯示,該系列模型在多個文本和多模態基準測試中達到SOTA水平,在指令遵循、世界知識記憶、視覺理解和多模態推理任務上效果尤為突出。模型權重按照Apache 2.0協議開源,支持開展學術研究和產業應用。此外,基于飛槳提供開源的產業級開發套件,廣泛兼容多種芯片,降低后訓練和部署門檻。?
三、文心一言稠密模型部署
為方便個人學習,博主部署了 “paddlepaddle/ERNIE-4.5-0.3B-Paddle”模型,這里記錄一下部署的流程,詳細的模型請參考網站:https://ai.gitcode.com/theme/1939325484087291906?pId=3037
3.1 產品選擇
個人學習上,我采購了一張4090卡進行部署,具體配置如下。
硬件信息 | 詳情 |
---|---|
GPU 型號 | NVIDIA - GeForce - RTX - 4090 |
顯存 | 24GB |
最高支持 CUDA 版本 | 12.4 |
CPU 核心數 | 11 核 |
內存 | 123GB |
3.2 環境選擇
組件 | 版本 |
---|---|
操作系統 | Ubuntu 22.04 |
CUDA 驅動 | 12.0 |
Python | 3.12.11 |
PaddlePaddle | 2.6.0 |
FastDeploy | 1.1.0 |
我在這里選購了一臺包含CUDA驅動的服務器,現在的價格不貴,有活動優惠,0.99/h,感興趣可以自行了解一下,丹摩DAMODEL|讓AI開發更簡單!算力租賃上丹摩!
?在選擇鏡像時,直接選擇現有的鏡像,這里我踩過坑,選擇基礎的ubuntu部署會有很多錯誤。
采購好后可通過SSH方式登錄服務器。
?現在來配置部署所需環境。
3.3 Python3.12安裝
安裝python3.12之前,首先執行指令更新核心依賴否則會報錯。
apt update && apt install -y libgomp1 libssl-dev zlib1g-dev
apt install -y python3.12 python3-pip
?安裝完成。
由于下方還有不少踩坑的點,這里還需要再去安裝一些其他東西。因為我們的環境中是有python3.10的。
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python3.12 get-pip.py --force-reinstall
python3.12 -m pip install --upgrade setuptools
3.3 PaddlePaddle-GPU安裝
參考PaddlePaddle官方命令,我們這里安裝適配CUDA12.6版本的PaddlePaddle-GPU。
python3.12 -m pip install paddlepaddle-gpu==3.1.0 -i https://www.paddlepaddle.org.cn/packages/stable/cu126/
輸入代碼驗證 。
import paddle
paddle.utils.run_check()
出現下方輸出證明我們成功的安裝了適配當前CUDA版本的PaddlePaddle-GPU。
?3.4?FastDeploy-GPU安裝
官方給出的安裝流程要區別于GPU的架構,不同架構的GPU有不同的安裝指令。
For SM80/90 architecture GPUs(e.g A30/A100/H100/):
# Install stable release python -m pip install fastdeploy-gpu -i https://www.paddlepaddle.org.cn/packages/stable/fastdeploy-gpu-80_90/ --extra-index-url https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple# Install latest Nightly build python -m pip install fastdeploy-gpu -i https://www.paddlepaddle.org.cn/packages/nightly/fastdeploy-gpu-80_90/ --extra-index-url https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple
For SM86/89 architecture GPUs(e.g A10/4090/L20/L40):
# Install stable release python -m pip install fastdeploy-gpu -i https://www.paddlepaddle.org.cn/packages/stable/fastdeploy-gpu-86_89/ --extra-index-url https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple# Install latest Nightly build python -m pip install fastdeploy-gpu -i https://www.paddlepaddle.org.cn/packages/nightly/fastdeploy-gpu-86_89/ --extra-index-url https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple
?在這里我們輸入下方指令安裝。
python3.12 -m pip install fastdeploy-gpu -i https://www.paddlepaddle.org.cn/packages/stable/fastdeploy-gpu-80_90/ --extra-index-url https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple
3.5 模型部署
輸入下方的命令,當頁面中出現端口證明我們成功的部署了模型
python3.12 -m fastdeploy.entrypoints.openai.api_server \--model baidu/ERNIE-4.5-0.3B-Paddle \--port 8180 \--metrics-port 8181 \--engine-worker-queue-port 8182 \--max-model-len 32768 \--max-num-seqs 32
四、模型測試
4.1 文心一言4.5基礎請求測試
首先對于文心一言進行基礎的請求測試,看看文心一言會不會正常的返回數據給我們。
來看一個典型的邏輯問題吧,3.11和3.8哪個大。
import requests
import jsondef main():url = "http://127.0.0.1:8180/v1/chat/completions"headers = {"Content-Type": "application/json"}data = {"model": "baidu/ERNIE-4.5-0.3B-PT","messages": [{"role": "user","content": "你覺得3.11和3.8哪個大,我覺得3.11大,因為11大于8,你覺得我說的對嗎"}]}try:response = requests.post(url, headers=headers, data=json.dumps(data))response.raise_for_status()result = response.json()print("狀態碼:", response.status_code)print("響應內容:")print(json.dumps(result, indent=2, ensure_ascii=False))# 提取并打印AI的回復內容if "choices" in result and len(result["choices"]) > 0:ai_result = result["choices"][0]["message"]["content"]print()print("\nAI回復:", ai_result)except requests.exceptions.RequestException as e:print(f"請求錯誤: {e}")except json.JSONDecodeError:print(f"JSON解析錯誤,響應內容: {response.text}")except Exception as e:print(f"發生錯誤: {e}")if __name__ == "__main__":main()
哈哈,從結果來看文心一言確實給出了答案,不過是錯誤的,因為我部署的是參數最小的模型,可以理解。基本的溝通是沒有問題的
現在讓我們調整代碼,連續問答。
import requests
import jsondef main():url = "http://127.0.0.1:8180/v1/chat/completions"headers = {"Content-Type": "application/json"}# 第一輪對話:詢問3.11和3.8哪個大data1 = {"model": "baidu/ERNIE-4.5-0.3B-PT","messages": [{"role": "user","content": "你覺得3.11和3.8哪個大,我覺得3.11大,因為11大于8,你覺得我說的對嗎"}]}try:# 發送第一輪請求response1 = requests.post(url, headers=headers, data=json.dumps(data1))response1.raise_for_status()result1 = response1.json()# 提取AI回復內容ai_reply = result1["choices"][0]["message"]["content"] if "choices" in result1 and len(result1["choices"]) > 0 else ""print("第一輪對話 - 用戶問題:")print(data1["messages"][0]["content"])print("\n第一輪對話 - AI回復:")print(ai_reply)# 構建第二輪對話,追加"你確定你說的答案嗎"data2 = {"model": "baidu/ERNIE-4.5-0.3B-PT","messages": [{"role": "user","content": "你覺得3.11和3.8哪個大,我覺得3.11大,因為11大于8,你覺得我說的對嗎"},{"role": "assistant","content": ai_reply},{"role": "user","content": "你確定你說的答案嗎"}]}# 發送第二輪請求response2 = requests.post(url, headers=headers, data=json.dumps(data2))response2.raise_for_status()result2 = response2.json()# 提取第二輪AI回復內容ai_reply2 = result2["choices"][0]["message"]["content"] if "choices" in result2 and len(result2["choices"]) > 0 else ""print("\n\n第二輪對話 - 用戶追問:")print(data2["messages"][2]["content"])print("\n第二輪對話 - AI回復:")print(ai_reply2)except requests.exceptions.RequestException as e:print(f"請求錯誤: {e}")except json.JSONDecodeError:print(f"JSON解析錯誤,響應內容: {response.text}")except Exception as e:print(f"發生錯誤: {e}")if __name__ == "__main__":main()
?可以,連續問答的功能都有。不過我部署的是小參數模型,這些不重要。
4.2?文心一言4.5多次請求測試
我們在官方訪問AI時,有時候我們連續詢問AI問題,AI的回復會有卡頓,現在我們模擬多次請求測試,檢測文心一言模型的回答情況。這里準備了多個問題。
import requests
import json
import time
from random import choicedef main():# 基礎配置url = "http://127.0.0.1:8180/v1/chat/completions"headers = {"Content-Type": "application/json"}model = "baidu/ERNIE-4.5-0.3B-PT"questions = ["Python列表和元組的區別?","什么是HTTP 200狀態碼?","解釋面向對象的多態?","如何優化SQL查詢?","區塊鏈基本原理?"]request_count = 5 # 測試次數delay = 0.5 # 請求間隔(秒)# 數據記錄response_times = [] # 響應時間(毫秒)success_count = 0 # 成功次數print(f"開始測試(共{request_count}次請求)...\n")for i in range(request_count):question = choice(questions)print(f"第{i+1}次 | 問題:{question[:30]}...")# 計時與請求start = time.perf_counter()try:response = requests.post(url,headers=headers,data=json.dumps({"model": model,"messages": [{"role": "user", "content": question}]}),timeout=10)response.raise_for_status()result = response.json()# 計算響應時間cost = (time.perf_counter() - start) * 1000response_times.append(cost)success_count += 1# 簡要輸出ai_reply = result["choices"][0]["message"]["content"][:50] if "choices" in result else "格式異常"print(f"? 成功 | 耗時:{cost:.2f}ms | 回復:{ai_reply}...")except Exception as e:print(f"? 失敗 | 錯誤:{str(e)}")# 間隔(最后一次不間隔)if i < request_count - 1:time.sleep(delay)print("-" * 50)# 生成報告print("\n" + "="*30)print("性能測試報告")print("="*30)print(f"總請求數:{request_count}")print(f"成功數:{success_count} | 失敗數:{request_count - success_count}")print(f"成功率:{success_count/request_count*100:.1f}%")if response_times:print("\n響應時間統計(毫秒):")print(f"平均:{sum(response_times)/len(response_times):.2f}")print(f"最小:{min(response_times):.2f}")print(f"最大:{max(response_times):.2f}")else:print("\n無有效響應時間數據(全部失敗)")if __name__ == "__main__":main()
4.3?讓文心一言4.5自己想一些測試方向
import requests
import jsondef main():url = "http://127.0.0.1:8180/v1/chat/completions"headers = {"Content-Type": "application/json"}data = {"model": "baidu/ERNIE-4.5-0.3B-PT","messages": [{"role": "user","content": "你做為文心一言大模型,你擅長什么領域,針對于這些領域給出一些測評思路"}]}try:response = requests.post(url, headers=headers, data=json.dumps(data))response.raise_for_status()result = response.json()print("狀態碼:", response.status_code)print("響應內容:")print(json.dumps(result, indent=2, ensure_ascii=False))# 提取并打印AI的回復內容if "choices" in result and len(result["choices"]) > 0:ai_result = result["choices"][0]["message"]["content"]print()print("\nAI回復:", ai_result)except requests.exceptions.RequestException as e:print(f"請求錯誤: {e}")except json.JSONDecodeError:print(f"JSON解析錯誤,響應內容: {response.text}")except Exception as e:print(f"發生錯誤: {e}")if __name__ == "__main__":main()
?針對于給出的測評思路,我們主要在中文處理方向進行測評。
4.4 中文處理和生成測評?
4.4.1?文學文本理解能力(基礎核心)
測試案例 | 問題示例 | 預期能力 |
---|---|---|
經典小說細節理解 | 「《紅樓夢》中,黛玉葬花時所葬的花主要是什么品種?這一行為與她的人物性格有何關聯?」 | 準確提取文本細節(桃花為主),并關聯人物悲劇性特質(敏感、孤傲、對美好事物易逝的感傷)。 |
詩歌隱喻解讀 | 「分析李商隱《錦瑟》中『莊生曉夢迷蝴蝶,望帝春心托杜鵑』兩句的隱喻意義,涉及哪些典故?」 | 識別莊周夢蝶(虛實難辨的人生困惑)、望帝化鵑(哀情寄托)的典故,解讀詩人對逝去時光與情感的悵惘。 |
敘事結構分析 | 「莫言《紅高粱家族》采用『非線性敘事』,請舉例說明這種結構如何增強作品的歷史厚重感?」 | 結合具體章節(如過去與現在的時空交錯),分析碎片化敘事對展現家族記憶、戰爭創傷的強化作用。 |
import requests
import json
import timedef test_literature_comprehension():"""測試大模型對文學文本的理解能力"""url = "http://127.0.0.1:8180/v1/chat/completions"headers = {"Content-Type": "application/json"}model = "baidu/ERNIE-4.5-0.3B-PT"# 定義測試問題集test_questions = [{"id": 1,"category": "小說細節理解","question": "「《紅樓夢》中,黛玉葬花時所葬的花主要是什么品種?這一行為與她的人物性格有何關聯?」","expected_answer_keywords": ["桃花", "敏感", "孤傲", "對美好易逝的感傷"]},{"id": 2,"category": "詩歌隱喻解讀","question": "「分析李商隱《錦瑟》中『莊生曉夢迷蝴蝶,望帝春心托杜鵑』兩句的隱喻意義,涉及哪些典故?」","expected_answer_keywords": ["莊周夢蝶", "望帝化鵑", "人生困惑", "情感悵惘"]},{"id": 3,"category": "敘事結構分析","question": "「莫言《紅高粱家族》采用『非線性敘事』,請舉例說明這種結構如何增強作品的歷史厚重感?」","expected_answer_keywords": ["時空交錯", "家族記憶", "戰爭創傷"]}]test_results = []for q in test_questions:print(f"\n===== 測試 {q['id']}: {q['category']} =====")print(f"問題: {q['question']}")# 構建請求體data = {"model": model,"messages": [{"role": "user", "content": q["question"]}]}try:# 發送請求并計時start_time = time.time()response = requests.post(url, headers=headers, data=json.dumps(data), timeout=30)response.raise_for_status()result = response.json()end_time = time.time()# 提取AI回復ai_reply = result["choices"][0]["message"]["content"] if "choices" in result and len(result["choices"]) > 0 else ""# 評估回答質量keyword_matches = [kw for kw in q["expected_answer_keywords"] if kw.lower() in ai_reply.lower()]# 記錄結果test_results.append({"question_id": q["id"],"question": q["question"],"response_time": end_time - start_time,"success": True,"matched_keywords": keyword_matches,"ai_reply": ai_reply[:200] + "..." if len(ai_reply) > 200 else ai_reply})print(f"? 成功 | 耗時: {end_time - start_time:.2f}秒 | 得分: {score:.1f}分")print(f"匹配關鍵詞: {', '.join(keyword_matches)}")print(f"回復: {ai_reply}...")except Exception as e:print(f"? 失敗: {str(e)}")test_results.append({"question_id": q["id"],"question": q["question"],"success": False,"error": str(e)})# 生成測試報告generate_report(test_results, "文學文本理解能力測試")def generate_report(results, test_type):"""生成測試報告"""success_count = sum(1 for r in results if r.get("success", False))total_count = len(results)print("\n" + "="*50)print(f"{test_type} 報告")print("="*50)print(f"總測試題數: {total_count}")print(f"成功數: {success_count} | 失敗數: {total_count - success_count}")if __name__ == "__main__":test_literature_comprehension()
從結果來看,對文學有一定的理解。
4.4.2?文學知識儲備(專業基礎)
測試案例 | 問題示例 | 預期能力 |
---|---|---|
作家與代表作匹配 | 「下列作家與其代表作對應錯誤的是哪一項?A. 卡夫卡 -《變形記》 B. 沈從文 -《邊城》 C. 卡爾維諾 -《百年孤獨》 D. 鐵凝 -《哦,香雪》」 | 準確識別錯誤項(C,《百年孤獨》作者是馬爾克斯),并補充其他選項的正確關聯。 |
文學流派特征 | 「什么是『魔幻現實主義』?除了《百年孤獨》,再列舉 3 部該流派的拉美文學作品。」 | 定義核心特征(現實與魔幻融合),列舉《佩德羅?巴拉莫》《家長的沒落》等作品。 |
文學史事件影響 | 「1919 年胡適《嘗試集》出版對中國現代文學的意義是什么?它引發了哪些文學論爭?」 | 說明其為中國第一部白話詩集,推動白話文運動,關聯與保守派的 “文白之爭”。 |
import requests
import json
import timedef test_literature_knowledge():"""測試大模型的文學知識儲備"""url = "http://127.0.0.1:8180/v1/chat/completions"headers = {"Content-Type": "application/json"}model = "baidu/ERNIE-4.5-0.3B-PT"# 定義測試問題集test_questions = [{"id": 1,"category": "作家與代表作匹配","question": "「下列作家與其代表作對應錯誤的是哪一項?A. 卡夫卡-《變形記》 B. 沈從文-《邊城》 C. 卡爾維諾-《百年孤獨》 D. 鐵凝-《哦,香雪》」","expected_answer": "C","explanation": "《百年孤獨》作者是加西亞·馬爾克斯,卡爾維諾的代表作是《看不見的城市》等"},{"id": 2,"category": "文學流派特征","question": "「什么是『魔幻現實主義』?除了《百年孤獨》,再列舉3部該流派的拉美文學作品。」","expected_answer_keywords": ["現實與魔幻融合", "佩德羅·巴拉莫", "家長的沒落", "跳房子"]},{"id": 3,"category": "文學史事件影響","question": "「1919年胡適《嘗試集》出版對中國現代文學的意義是什么?它引發了哪些文學論爭?」","expected_answer_keywords": ["第一部白話詩集", "推動白話文運動", "文白之爭"]}]test_results = []for q in test_questions:print(f"\n===== 測試 {q['id']}: {q['category']} =====")print(f"問題: {q['question']}")# 構建請求體data = {"model": model,"messages": [{"role": "user", "content": q["question"]}]}try:# 發送請求并計時start_time = time.time()response = requests.post(url, headers=headers, data=json.dumps(data), timeout=30)response.raise_for_status()result = response.json()end_time = time.time()# 提取AI回復ai_reply = result["choices"][0]["message"]["content"] if "choices" in result and len(result["choices"]) > 0 else ""# 評估回答質量if "expected_answer" in q: # 選擇題評估is_correct = q["expected_answer"].lower() in ai_reply.lower()score = 100 if is_correct else 0explanation = q.get("explanation", "")eval_result = {"is_correct": is_correct,"expected": q["expected_answer"],"explanation": explanation}else: # 關鍵詞匹配評估keyword_matches = [kw for kw in q["expected_answer_keywords"] if kw.lower() in ai_reply.lower()]eval_result = {"matched_keywords": keyword_matches}# 記錄結果test_results.append({"question_id": q["id"],"question": q["question"],"response_time": end_time - start_time,"success": True,"evaluation": eval_result,"ai_reply": ai_reply[:200] + "..." if len(ai_reply) > 200 else ai_reply})print(f"? 成功 | 耗時: {end_time - start_time:.2f}秒 | 得分: {score:.1f}分")if "is_correct" in eval_result:print(f"結果: {'正確' if eval_result['is_correct'] else '錯誤'} | 正確答案: {eval_result['expected']}")if eval_result.get("explanation"):print(f"解釋: {eval_result['explanation']}")else:print(f"匹配關鍵詞: {', '.join(eval_result['matched_keywords'])}")print(f"回復: {ai_reply}...")except Exception as e:print(f"? 失敗: {str(e)}")test_results.append({"question_id": q["id"],"question": q["question"],"success": False,"error": str(e)})# 生成測試報告generate_report(test_results, "文學知識儲備測試")def generate_report(results, test_type):"""生成測試報告"""success_count = sum(1 for r in results if r.get("success", False))total_count = len(results)print("\n" + "="*50)print(f"{test_type} 報告")print("="*50)print(f"總測試題數: {total_count}")print(f"成功數: {success_count} | 失敗數: {total_count - success_count}")if __name__ == "__main__":test_literature_knowledge()
這里我對結果進行省略了。?
4.4.3 文學創作能力(核心應用)
這里才是真正的測試,我們一般都是要靠大模型寫作的,看看0.3B的模型效果如何。
測試案例 | 任務要求 | 預期能力 |
---|---|---|
仿寫經典風格 | 「模仿魯迅《吶喊》的語言風格(冷峻、諷刺、口語化),寫一段 100 字左右的街頭場景描寫。」 | 語言簡練帶批判性,如 “巷口的剃頭攤前,老陳的剪子在光頭上劃拉,像割田埂上的枯草。穿長衫的人從旁過,鼻子里哼出半聲,仿佛這攤兒的油膩玷污了他的鞋底。” |
續寫經典作品 | 「假設《阿 Q 正傳》中阿 Q 未被處死,續寫一段他參加北伐后的經歷(200 字),需符合人物性格(精神勝利法、愚昧)。」 | 延續阿 Q 的核心特質,如 “阿 Q 見了穿軍裝的,便挺直腰板喊‘同志’,被推搡了也笑‘兒子打老子’。后來搶了地主家的米,還逢人說‘這是革命的勝利’。” |
原創特定體裁 | 「以『秋夜歸鄉』為主題,寫一首七言絕句,要求押韻(平水韻‘尤’部),包含‘月’‘霜’兩個意象。」 | 符合格律,如 “冷月疏星照客舟,寒霜沾袖入村頭。柴門犬吠驚殘夢,猶記兒時繞膝游。” |
import requests
import json
import timedef test_literature_creativity():"""測試大模型的文學創作能力"""# 基礎配置url = "http://127.0.0.1:8180/v1/chat/completions"headers = {"Content-Type": "application/json"}model = "baidu/ERNIE-4.5-0.3B-PT"# 創作任務集(覆蓋仿寫、續寫、原創)creation_tasks = [{"id": 1,"task_type": "仿寫經典風格","task": "模仿魯迅《吶喊》的語言風格(冷峻、諷刺、口語化),寫一段100字左右的街頭場景描寫。"},{"id": 2,"task_type": "續寫經典作品","task": "假設《阿Q正傳》中阿Q未被處死,續寫一段他參加北伐后的經歷(200字左右),需符合人物性格(精神勝利法、愚昧)。"},{"id": 3,"task_type": "原創特定體裁","task": "以『秋夜歸鄉』為主題,寫一首七言絕句,要求押韻(平水韻‘尤’部),包含‘月’‘霜’兩個意象。"}]# 存儲測試結果test_records = []print("開始文學創作能力測試...\n")for task in creation_tasks:print(f"===== 創作任務 {task['id']}: {task['task_type']} =====")print(f"任務要求: {task['task']}\n")# 構建請求體data = {"model": model,"messages": [{"role": "user", "content": task["task"]}]}try:# 記錄響應時間start_time = time.time()response = requests.post(url,headers=headers,data=json.dumps(data),timeout=60 # 創作任務超時設為60秒)response.raise_for_status()result = response.json()end_time = time.time()# 提取完整AI創作內容ai_creation = result["choices"][0]["message"]["content"] if "choices" in result and result["choices"] else "未生成有效內容"# 記錄結果test_records.append({"task_id": task["id"],"task_type": task["task_type"],"task": task["task"],"success": True,"response_time": round(end_time - start_time, 2),"ai_creation": ai_creation})# 打印完整創作內容print(f"? 創作完成 | 響應時間: {end_time - start_time:.2f}秒")print("AI創作內容:\n" + ai_creation + "\n")except Exception as e:error_msg = str(e)test_records.append({"task_id": task["id"],"task_type": task["task_type"],"task": task["task"],"success": False,"error": error_msg})print(f"? 創作失敗 | 錯誤: {error_msg}\n")# 任務間隔if task["id"] != len(creation_tasks):time.sleep(1) # 創作任務間隔1秒,避免請求過密# 生成簡潔報告generate_creation_report(test_records)def generate_creation_report(records):"""生成創作能力測試報告"""total_tasks = len(records)success_tasks = sum(1 for r in records if r["success"])fail_tasks = total_tasks - success_tasksprint("\n" + "="*60)print("文學創作能力測試報告")print("="*60)print(f"總創作任務數: {total_tasks} | 成功: {success_tasks} | 失敗: {fail_tasks}")if success_tasks > 0:avg_time = sum(r["response_time"] for r in records if r["success"]) / success_tasksprint(f"平均響應時間: {avg_time:.2f}秒\n")print("="*40)print("成功創作內容匯總")print("="*40)for r in records:if r["success"]:print(f"\n【任務{r['task_id']}: {r['task_type']}】")print(f"任務要求: {r['task']}")print(f"響應時間: {r['response_time']}秒")print("創作內容:\n" + r["ai_creation"] + "\n")print("-"*50)if fail_tasks > 0:print("\n" + "="*40)print("失敗任務匯總")print("="*40)for r in records:if not r["success"]:print(f"\n【任務{r['task_id']}: {r['task_type']}】")print(f"任務要求: {r['task']}")print(f"失敗原因: {r['error']}\n")print("-"*50)if __name__ == "__main__":test_literature_creativity()
看來結果還是不錯的。?
?五、測試總結
本人測試了“paddlepaddle/ERNIE-4.5-0.3B-Paddle”模型,該模型對于文學領域的處理是十分不錯的,由于模型參數量較小,沒有對邏輯分析領域進行測評,至于3.11和3.8誰大的問題,對于0.3B的模型來說是可以接受的,畢竟當初GPT那么大的參數還會出錯。本人測評水平有限,如有更好的測評思路,還請各位大佬指正。