\u003Cbr/>Monaco Editor 作為一款輕量級、高性能的代碼編輯器,已經(jīng)成為現(xiàn)代Web開發(fā)中不可或缺的工具之一。它支持多種編程語言的語法高亮、代碼自動補全、錯誤提示、格式化等功能,能夠顯著提升開發(fā)效率。無論是JavaScript、JSON,還是MySQL等語言,Monaco Editor 都能提供卓越的編輯體驗。\u003Cbr/>\u003Cbr/>而GPTBots作為基于GPT技術(shù)的智能體,具備強大的自然語言處理和代碼理解能力。將GPTBots與Monaco Editor相結(jié)合,不僅可以實現(xiàn)對代碼的智能化補全和優(yōu)化,還能通過自然語言與開發(fā)者交互,幫助開發(fā)者快速解決問題,甚至生成高質(zhì)量的代碼片段。\u003Cbr/>\u003Cbr/>本文將深入探討如何利用GPTBots的AI能力與Monaco Editor 的強大功能,構(gòu)建一個更智能、更高效的代碼編輯器。通過這一探索,我們希望為開發(fā)者提供一款真正AI賦能的開發(fā)工具,助力開發(fā)者在復(fù)雜的編程任務(wù)中如虎添翼。\u003Cbr/>\u003Cbr/>\u003Cb>什么是Monaco Editor\u003C/b>\u003Cbr/>MonacoEditor是它提供了與 VSCode類似的編輯體驗,支持多種編程語言的語法高亮、代碼補全、錯誤提示等功能,同時具有高度的可定制性。專門為Web環(huán)境設(shè)計,廣泛應(yīng)用于在線代碼編輯器、開發(fā)工具和教學(xué)平臺中。\u003C/p>\u003Cp style=\"line-height:2.5;\">\u003Cbr/>\u003Cb>Monaco Editor 的核心特點\u003C/b>\u003Cbr/>1. 多語言支持\u003Cbr/>(1)支持多種編程語言的語法高亮(如 JavaScript、HTML、CSS、Python 等),內(nèi)置語言解析器,提供精準的高亮效果\u003Cbr/>(2)支持通過插件擴展更多語言的支持\u003Cbr/>2. 關(guān)鍵字高亮\u003Cbr/>(1)提供精準的語法高亮,能夠根據(jù)語言規(guī)則為關(guān)鍵字、變量、函數(shù)、注釋等添加不同的顏色和樣式\u003Cbr/>(2)支持自定義語法高亮規(guī)則,適配特殊語言或場景。\u003Cbr/>3. 代碼補全\u003Cbr/>(1)提供智能的代碼補全功能,根據(jù)上下文內(nèi)容和語言規(guī)則,實時提示變量、函數(shù)、方法等\u003Cbr/>(2)支持函數(shù)簽名提示,幫助開發(fā)者快速了解函數(shù)的參數(shù)和返回值\u003Cbr/>4. 錯誤檢測與提示\u003Cbr/>(1)內(nèi)置錯誤檢測功能,能夠?qū)崟r標記語法錯誤,并提供修復(fù)建議(如紅色波浪線提示錯誤)\u003Cbr/>(2)支持自定義錯誤提示規(guī)則,適配特定的編程語言或框架\u003Cbr/>5. 高定制化\u003Cbr/>(1)提供豐富的 API,允許開發(fā)者自定義編輯器的外觀、行為和功能\u003Cbr/>(2)支持插件擴展,可以添加自定義語言支持、代碼提示規(guī)則等。\u003Cbr/>\u003Cbr/>\u003Cb>Monaco Editor 的優(yōu)缺點\u003C/b>\u003Cbr/>優(yōu)點:\u003Cbr/>(1)功能強大:支持語法高亮、代碼補全、錯誤提示等,與 VSCode 的核心編輯功能一致。\u003Cbr/>(2)高度可定制:提供豐富的 API,允許開發(fā)者根據(jù)需求定制功能和外觀。\u003Cbr/>(3)跨平臺:基于瀏覽器運行,適配所有支持現(xiàn)代瀏覽器的設(shè)備。\u003Cbr/>(4)輕量級:加載速度快,性能優(yōu)越,適合處理大文件和復(fù)雜代碼。\u003Cbr/>\u003Cbr/>缺點\u003Cbr/>(1)依賴瀏覽器環(huán)境:不能直接運行在桌面環(huán)境中,適配性依賴于瀏覽器。\u003Cbr/>(2)功能有限:相比 VSCode,缺少調(diào)試、終端等高級功能。\u003Cbr/>(3)學(xué)習(xí)成本:對于初學(xué)者來說,配置和定制可能需要一定的學(xué)習(xí)時間。\u003Cbr/>\u003Cbr/>\u003Cb>使用Monaco Editor集成SQL編輯器\u003C/b>\u003Cbr/>monaco-editor-webpack-plugin對應(yīng)的Monaco Editor版本要兼容\u003Cbr/>\u003Cimg src=\"https://sdkfiledl.jiguang.cn/public-picture/2025-07-08/221366/1.jpg\" style=\"max-width:100%;\" contenteditable=\"false\"/>\u003Cbr/>\u003C/p>\u003Cp style=\"line-height:2.5;\">1. 集成\u003Cbr/>項目依賴安裝\u003Cbr/>\u003Cimg src=\"https://sdkfiledl.jiguang.cn/public-picture/2025-07-08/324998/2.jpg\" style=\"max-width:100%;\" contenteditable=\"false\"/>\u003Cbr/>配置rsbuild.config\u003Cbr/>\u003Cimg src=\"https://sdkfiledl.jiguang.cn/public-picture/2025-07-08/986219/3.jpg\" style=\"max-width:100%;\" contenteditable=\"false\"/>\u003Cbr/>Webpack配置如下:\u003Cbr/>\u003Cimg src=\"https://sdkfiledl.jiguang.cn/public-picture/2025-07-08/926129/4.jpg\" style=\"max-width:100%;\" contenteditable=\"false\"/>\u003Cbr/>頁面集成 Monaco Editor\u003Cbr/>\u003Cimg src=\"https://sdkfiledl.jiguang.cn/public-picture/2025-07-08/147450/5.jpg\" style=\"max-width:100%;\" contenteditable=\"false\"/>\u003Cbr/>\u003C/p>\u003Cp style=\"line-height:2.5;\">2. SQL校驗與優(yōu)化\u003Cbr/>使用 dt-sql-parser 實現(xiàn)基礎(chǔ)校驗\u003Cbr/>dt-sql-parser支持多種SQL方言(如MySQL、Flink、Spark等),可以在前端實現(xiàn)基礎(chǔ)的語法校驗。\u003Cbr/>優(yōu)點:\u003Cbr/>支持多種語言MySQL、Flink、park、Hive、PostgreSQL、Trino、Impala\u003Cbr/>局限性:\u003Cbr/>(1)前端單獨使用 dt-sql-parser 可以實現(xiàn)基礎(chǔ)的語法校驗,但無法完成復(fù)雜的錯誤校驗(如語義校驗、表結(jié)構(gòu)校驗等)。\u003Cbr/>(2)如果需要更高級的校驗功能(如檢查字段是否存在、表是否存在等),需要結(jié)合后端支持。\u003Cbr/>(3)后端支持校驗方式\u003Cbr/> Python:\u003Cbr/> 通過工具(如 pyright)實現(xiàn)復(fù)雜的 SQL 校驗邏輯。\u003Cbr/> 返回校驗結(jié)果給前端。\u003Cbr/>(4)前端與后端的交互方式:WebSocket\u003Cbr/>3. 其他校驗工具對比\u003Cbr/>sql-lint(需要后端服務(wù))\u003Cbr/>優(yōu)點\u003Cbr/>1.輕量級:\u003Cbr/> (1)專注于 SQL 語法檢查,體積小,易于集成。\u003Cbr/> (2)提供代碼質(zhì)量建議\u003Cbr/> 缺點:\u003Cbr/>1.僅限于語法檢查和代碼質(zhì)量建議,無法進行復(fù)雜的語義分析(如表結(jié)構(gòu)校驗、字段校驗等)\u003Cbr/>2.無法檢查 SQL 的上下文(如表是否存在、字段是否有效等)\u003Cbr/>3.不提供 SQL 格式化功能,需要借助其他工具\u003Cbr/>4.不支持代碼補全、關(guān)鍵字高亮等功能\u003Cbr/> (1)防抖接口調(diào)用:\u003Cbr/> ①前端通過防抖機制,減少頻繁的接口調(diào)用。\u003Cbr/> ② 每次用戶輸入 SQL 后,調(diào)用后端接口獲取校驗結(jié)果。\u003Cbr/> (2)WebSocket 實時校驗:\u003Cbr/> ①前端通過 WebSocket 與后端保持長連接。\u003Cbr/> ②用戶輸入時,實時將 SQL 發(fā)送給后端,獲取校驗結(jié)果。\u003Cbr/> (3)使用 Node.js 實現(xiàn)校驗\u003Cbr/> ①可以直接使用 其他 SQL 解析器庫(如sql-parser(需要依賴fs模塊)、sql-lint需要依賴內(nèi)置模塊 util),解析 SQL 并返回校驗結(jié)果。\u003Cbr/>sql-parser(需要后端服務(wù))\u003Cbr/>優(yōu)點\u003Cbr/> 1. 能夠解析 SQL 語句并生成語法樹,適合復(fù)雜的 SQL 校驗和分析\u003Cbr/> 缺點:\u003Cbr/>需要一定的開發(fā)成本來解析語法樹并實現(xiàn)自定義校驗邏輯。\u003Cbr/>對于大型 SQL 語句,解析語法樹可能會帶來一定的性能開銷\u003Cbr/>學(xué)習(xí)成本較大\u003Cbr/>4.所用插件\u003Cbr/>\u003Cimg src=\"https://sdkfiledl.jiguang.cn/public-picture/2025-07-08/809735/6.jpg\" style=\"max-width:100%;\" contenteditable=\"false\"/>\u003Cbr/>5.問題點\u003Cbr/>創(chuàng)建Monaco Editor編輯器時,使用ref儲存編輯器實例會導(dǎo)致頁面會卡死\u003Cbr/>原因是Vue的響應(yīng)式,系統(tǒng)會對 ref 中的對象進行代理,而 編輯器實例 返回的對象包含復(fù)雜的內(nèi)部狀態(tài)或非普通對象屬性\u003Cbr/>解決辦法\u003Cbr/>1.使用實例調(diào)用方法使用toRaw,獲取響應(yīng)式對象的原始值,再調(diào)用方法\u003Cbr/>2.不使用響應(yīng)式的方式儲存實例,(利用let的方式儲存)\u003Cbr/>安裝Monaco Editor會出現(xiàn)告警\u003Cbr/>原因是因為依賴使用require式無法靜態(tài)提取依賴項\u003Cbr/>\u003Cimg src=\"https://sdkfiledl.jiguang.cn/public-picture/2025-07-08/267431/7.jpg\" style=\"max-width:100%;\" contenteditable=\"false\"/>\u003Cbr/>解決方式有:\u003Cbr/>1.忽略告警\u003C/p>\u003Cp>\u003Cimg src=\"https://sdkfiledl.jiguang.cn/public-picture/2025-07-08/506526/8.jpg\" style=\"max-width:100%;\" contenteditable=\"false\"/>\u003C/p>\u003Cp style=\"line-height:2.5;\">2.使用cdn方式引入Monaco Editor\u003Cbr/>提示MonacoEnvironment.getWorkerUrl or MonacoEnvironment.getWorker告警\u003Cbr/>原因getWorkerUrl和getWorker主要是用于異步加載和管理代碼編輯環(huán)境中的工作線程(Worker),這些線程可以在后臺執(zhí)行一些計算密集型的任務(wù),比如語法分析和實時錯誤檢測。\u003Cbr/>getWorkerUrl\u003Cbr/>函數(shù)返回一個URL,可以從動態(tài)加載Monaco工作進程(worker),這對于跨域請求或者自定義worker腳本是有必要的\u003Cbr/>monacoEnvironment.getWorker\u003Cbr/>則會根據(jù)給定的語言類型創(chuàng)建并返回一個新的工作線程實例\u003Cbr/>解決方法:\u003Cbr/>要有處理worker的方法函數(shù)\u003Cbr/>1.自定義getWorkerUrl函數(shù)用來告訴 Monaco Editor 如何獲取 worker 腳本(引用對應(yīng)語言的worker)\u003Cbr/>2.使用插件monaco-editor-webpack-plugin,內(nèi)部自動做好需要加載語言worker的處理\u003Cbr/>6. SQL功能點\u003Cbr/>編輯器限制最大行數(shù)\u003Cbr/>\u003Cimg src=\"https://sdkfiledl.jiguang.cn/public-picture/2025-07-08/618102/9.jpg\" style=\"max-width:100%;\" contenteditable=\"false\"/>\u003Cbr/>防止用戶粘貼文本超出最大行數(shù)\u003Cbr/>\u003Cimg src=\"https://sdkfiledl.jiguang.cn/public-picture/2025-07-08/911158/10.jpg\" style=\"max-width:100%;\" contenteditable=\"false\"/>\u003Cbr/>超過最大行數(shù),撤回用戶輸入新行\(zhòng)u003Cbr/>\u003Cimg src=\"https://sdkfiledl.jiguang.cn/public-picture/2025-07-08/189060/11.jpg\" style=\"max-width:100%;\" contenteditable=\"false\"/>\u003Cbr/>代碼提示功能\u003Cbr/>主要邏輯是使用monaco.languages.registerCompletionItemProvide方法注冊關(guān)鍵字列表,返回對應(yīng)列表的suggestions\u003Cbr/>suggestions數(shù)組格式為\u003Cbr/>\u003Cimg src=\"https://sdkfiledl.jiguang.cn/public-picture/2025-07-08/492900/12.jpg\" style=\"max-width:100%;\" contenteditable=\"false\"/>\u003Cbr/>\u003Cimg src=\"https://sdkfiledl.jiguang.cn/public-picture/2025-07-08/224676/13.jpg\" style=\"max-width:100%;\" contenteditable=\"false\"/>輸入特定字符提示快捷變量名\u003Cbr/>例如輸入{{}}展示快捷變量名\u003Cbr/>\u003Cimg src=\"https://sdkfiledl.jiguang.cn/public-picture/2025-07-08/206035/14.jpg\" style=\"max-width:100%;\" contenteditable=\"false\"/>\u003Cbr/>標記錯誤信息\u003Cbr/>* 設(shè)置標記信息,eslint標記的所有者\u003Cbr/>* editor 編輯器模型\u003Cbr/>* range 每個標記是一個對象,描述了標記的范圍\u003Cbr/>* type 標記的錯誤類型\u003Cbr/>* message 標記消息\u003Cbr/>\u003Cimg src=\"https://sdkfiledl.jiguang.cn/public-picture/2025-07-08/445396/15.jpg\" style=\"max-width:100%;\" contenteditable=\"false\"/>\u003Cbr/>檢測 SQL 代碼的語法錯誤\u003Cbr/>首先引入dt-sql-parser庫\u003Cbr/>\u003Cimg src=\"https://sdkfiledl.jiguang.cn/public-picture/2025-07-08/263208/16.jpg\" style=\"max-width:100%;\" contenteditable=\"false\"/>\u003Cb>\u003Cbr/>\u003C/b>\u003C/p>\u003Cp style=\"line-height:2.5;\">\u003Cb>總結(jié):\u003C/b>\u003Cbr/>Monaco Editor 是一款功能強大、靈活且高性能的代碼編輯器,適合在Web環(huán)境中實現(xiàn)復(fù)雜的代碼編輯功能,雖然Monaco Editor在功能上存在一些局限性(如不支持調(diào)試、復(fù)雜校驗等),但通過結(jié)合后端服務(wù)和其他工具,可以實現(xiàn)更高級的功能。通過按需加載、性能優(yōu)化和用戶體驗改進,\u003Cbr/>但是Monaco Editor官方文檔可讀性太差了,沒有例子,就一段描述\u003Cbr/>\u003Cbr/>\u003Cb>參考:\u003C/b>\u003Cbr/>https://microsoft.github.io/monaco-editor/docs.html\u003Cbr/>https://wf0.github.io/api/editor.html\u003Cbr/>\u003C/p>","隨著人工智能技術(shù)的飛速發(fā)展,AI智能體在各個領(lǐng)域的應(yīng)用變得越來越廣泛,在代碼開發(fā)領(lǐng)域,智能體的作用愈發(fā)重要。",[12],"https://sdkfiledl.jiguang.cn/public-picture/2025-07-08/772959/博客封面 - 800px400px.png","2025-07-08 15:59:58","2025-07-08 16:13:30","2025-07-08 16:17:17",[],{"id":63,"lastId":23,"lastTitle":23,"nextId":23,"nextTitle":23,"status":21,"title":64,"content":65,"summary":66,"tag":67,"author":23,"category":70,"coverLink":71,"seoTitle":64,"seoKeywords":72,"seoDescription":73,"publishTime":74,"createTime":75,"updateTime":76,"internalLinkList":77,"sideType":21,"languageType":32},89,"EngageLab深度解析:AI 驅(qū)動的全渠道營銷自動化如何賦能業(yè)務(wù)高速增長","\u003Cp style=\"line-height:2.5;\">在用戶注意力稀缺、觸點分散的今天,傳統(tǒng)營銷已難以滿足增長需求。EngageLab Marketing Automation(營銷自動化)平臺,以AI技術(shù)為核心驅(qū)動,融合全渠道觸達能力,專為尋求精細化運營和高速增長的企業(yè)(尤其跨境出海企業(yè))打造,助您輕松玩轉(zhuǎn)客戶經(jīng)營,搶占全球市場先機!\u003C/p>\u003Cp style=\"line-height:2.5;\">\u003Cbr/>\u003Cb>EngageLab MA:不止于自動化,更是智能增長引擎\u003C/b>\u003Cbr/>EngageLab MA 的核心競爭力,在于深度整合的技術(shù)與對業(yè)務(wù)場景的理解:\u003Cbr/>\u003Cb>1.原生全渠道觸達:體驗無縫,送達無憂 ?\u003C/b>\u003Cbr/>(1)\u003Cb>主流渠道全覆蓋:\u003C/b>原生支持AppPush, WebPush, Email, SMS, WhatsApp 等,API 開放可擴展。\u003Cbr/>(2)\u003Cb>統(tǒng)一用戶視圖: \u003C/b>跨渠道精準識別同一用戶(EUID),展現(xiàn)用戶的全景畫像。\u003Cbr/>(3)\u003Cb>高送達率保障:\u003C/b>原生集成 EngageLab 強大的底層消息服務(wù)(AppPush 送達率提升40%,Email 高達99.97%),確保信息高效可靠傳遞。\u003C/p>\u003Cp style=\"line-height:2.5;\">(4)\u003Cb>全球服務(wù)節(jié)點:\u003C/b> 美國/德國/新加坡/香港全球多節(jié)點,低延遲、高可用、保合規(guī)。\u003Cb>\u003Cbr/>\u003C/b>\u003C/p>\u003Cp style=\"line-height:2.5;\">\u003Cb>\u003Cbr/>\u003C/b>\u003C/p>\u003Cp style=\"line-height:2.5;\">\u003Cb>2.可視化旅程編排:拖拽之間,策略落地 ??\u003C/b>\u003Cbr/>(1)\u003Cb>豐富場景模板\u003C/b>(注冊、試用、購物車、生日等),快速上線。\u003C/p>\u003Cp style=\"line-height:2.5;\">\u003Cimg src=\"https://sdkfiledl.jiguang.cn/public-picture/2025-06-25/424374/640.gif\" style=\"max-width:100%;\" contenteditable=\"false\"/>(2)\u003Cb>拖拽式界面\u003C/b>,無需代碼,輕松設(shè)計復(fù)雜流程。\u003Cbr/>\u003Cimg src=\"https://sdkfiledl.jiguang.cn/public-picture/2025-06-25/233773/640-1.gif\" style=\"max-width:100%;\" contenteditable=\"false\"/>\u003C/p>\u003Cp style=\"line-height:2.5;\">(3)\u003Cb>多觸發(fā)器、條件判斷、動作\u003C/b>,滿足多樣自動化需求(歡迎、促活、挽回、培育...)。\u003Cbr/>\u003Cimg src=\"https://sdkfiledl.jiguang.cn/public-picture/2025-06-25/686855/640-2.gif\" style=\"max-width:100%;\" contenteditable=\"false\"/>\u003C/p>\u003Cp style=\"line-height:2.5;\">\u003Cb>\u003Cbr/>\u003C/b>\u003C/p>\u003Cp style=\"line-height:2.5;\">\u003Cb>3.實時用戶數(shù)據(jù)平臺:洞察用戶,精準出擊 ??\u003C/b>\u003Cbr/>(1)全面監(jiān)控營銷自動化旅程中的各消息通道發(fā)送、點擊與折損,提供詳盡報表,有助于快速定位問題。\u003Cbr/>(2)用戶行為深度追蹤,智能整合消息反饋與用戶行為數(shù)據(jù),實現(xiàn)行為歸因分析。\u003Cbr/>(3)收入轉(zhuǎn)化分析,自動計算ROI,聚焦高價值策略。\u003Cbr/>\u003Cimg src=\"https://sdkfiledl.jiguang.cn/public-picture/2025-06-25/733362/640.jpg\" style=\"max-width:100%;\" contenteditable=\"false\"/>\u003Cb>\u003Cbr/>\u003C/b>\u003C/p>\u003Cp style=\"line-height:2.5;\">\u003Cb>\u003Cbr/>\u003C/b>\u003C/p>\u003Cp style=\"line-height:2.5;\">\u003Cb>4. AI深度賦能:讓營銷更“聰明” ??\u003C/b>\u003Cbr/>(1)\u003Cb>AI 寫文案:\u003C/b>AI一鍵生成多語言營銷文案,效率提升。\u003Cbr/>(2)\u003Cb>AI 懂用戶:\u003C/b> 智能預(yù)測用戶行為(購買、流失),實現(xiàn)前瞻性觸達。\u003Cbr/>(3)\u003Cb>AI 優(yōu)策略:\u003C/b> 智能推薦最佳發(fā)送時機與渠道,提升互動。\u003Cbr/>(4)\u003Cb>AI 助分析:\u003C/b> 自動解讀數(shù)據(jù),驅(qū)動優(yōu)化。\u003Cbr/>\u003Cimg src=\"https://sdkfiledl.jiguang.cn/public-picture/2025-06-25/552441/640-1.jpg\" style=\"max-width:100%;\" contenteditable=\"false\"/>\u003Cb>\u003Cbr/>\u003C/b>\u003C/p>\u003Cp style=\"line-height:2.5;\">\u003Cb>\u003Cbr/>\u003C/b>\u003C/p>\u003Cp style=\"line-height:2.5;\">\u003Cb>EngageLab MA 實戰(zhàn)場景\u003C/b>\u003Cbr/>1、電商零售- 購物車放棄挽回與復(fù)購促進:\u003Cbr/>自動分流高價值客戶,推送個性化優(yōu)惠,多渠道跟進,提升轉(zhuǎn)化與復(fù)購。\u003Cbr/>\u003Cb>MA應(yīng)用舉例:\u003C/b>以“加入購物車”事件為觸發(fā)點,系統(tǒng)會判斷用戶在1小時內(nèi)是否完成付款。\u003Cbr/>(1)如果未完成,將通過AppPush和WebPush推送「優(yōu)惠信息」;\u003Cbr/>(2)等待1小時后,若用戶仍未付款,則再次推送「其他優(yōu)惠消息」。\u003Cbr/>在整個用戶旅程中,還可以靈活引入如“用戶屬性(是否為VIP)”、“用戶行為(是否收藏商品、瀏覽商品時長超過5分鐘)”等多維度條件,進行A/B測試,進一步優(yōu)化轉(zhuǎn)化效果。\u003Cbr/>\u003Cbr/>\u003Cb>2、SaaS - 從試用到付費的全生命周期管理\u003C/b>:\u003Cbr/>注冊后自動引導(dǎo),智能分流PQL/MQL,自動培育與轉(zhuǎn)化,提升付費率。\u003Cbr/>\u003Cb>MA應(yīng)用舉例:\u003C/b>以“注冊成功”事件為觸發(fā)點,系統(tǒng)將自動發(fā)送Email和In-App Message,向新用戶推送「產(chǎn)品使用指引」。\u003Cbr/>(1)若用戶在3天內(nèi)未完成“產(chǎn)品試用”事件,則通過Email再次發(fā)送「引導(dǎo)信息,提升試用轉(zhuǎn)化率」。\u003Cbr/>(2)若用戶已完成“產(chǎn)品試用”事件,系統(tǒng)將等待7天后,自動推送「付費優(yōu)惠信息」,促進用戶轉(zhuǎn)化為付費客戶。\u003Cbr/>\u003Cbr/>\u003Cb>3、游戲出海-新手引導(dǎo)與付費轉(zhuǎn)化:\u003C/b>\u003Cbr/>新手引導(dǎo)任務(wù)旅程,定期推送游戲內(nèi)的最新活動、福利信息和社區(qū)動態(tài),觸發(fā)首充激勵,流失預(yù)警與召回。\u003Cbr/>\u003Cb>MA應(yīng)用舉例:\u003C/b>以“注冊成功”事件為觸發(fā)點,系統(tǒng)將自動發(fā)送Email和AppPush,推送「新手引導(dǎo)信息」,幫助新用戶快速上手。\u003Cbr/>(1)若用戶在1天內(nèi)未完成“充值”操作,則通過Email和SMS發(fā)送「首充優(yōu)惠消息」,激勵用戶完成首次充值。\u003Cbr/>(2)若用戶在2天內(nèi)未訪問游戲,系統(tǒng)將通過Email、SMS和WhatsApp推送「回歸福利消息」,喚醒沉睡用戶,提升活躍度。\u003Cbr/>\u003Cb>更多關(guān)于實戰(zhàn)的深度解析,近期將上線,敬請期待!\u003C/b>\u003Cbr/>\u003Cbr/>\u003Cb>EngageLab MA 全棧能力一覽\u003C/b>\u003Cbr/>無論是全渠道消息觸達、AI智能賦能,還是數(shù)據(jù)安全與開發(fā)者友好,EngageLab MA都以一站式平臺為企業(yè)提供從營銷自動化到精細化運營的全流程支持。我們將核心能力高度集成,開發(fā)者可便捷調(diào)用,企業(yè)可靈活擴展,助力全球業(yè)務(wù)高速增長。\u003Cbr/>\u003Cimg src=\"https://sdkfiledl.jiguang.cn/public-picture/2025-06-25/764870/640-2.jpg\" style=\"max-width:100%;\" contenteditable=\"false\"/>\u003Cb>準備好開啟智能營銷新篇章了嗎?\u003C/b>\u003Cbr/>新老用戶注冊或登錄賬戶,即可體驗!\u003Cbr/>https://www.engagelab.com/zh_CN/accounts/signin\u003C/p>","在用戶注意力稀缺、觸點分散的今天,傳統(tǒng)營銷已難以滿足增長需求。EngageLab Marketing Automation(營銷自動化)平臺,以AI技術(shù)為核心驅(qū)動,融合全渠道觸達能力,專為尋求精細化運營和高速增長的企業(yè)(尤其跨境出海企業(yè))打造,助您輕松玩轉(zhuǎn)客戶經(jīng)營,搶占全球市場先機!",[68,69],"EngageLab","MA","產(chǎn)品動態(tài)","https://sdkfiledl.jiguang.cn/public-picture/2025-06-25/251447/博客封面 - 800px400px.png","EngageLab, MA, 營銷自動化","在用戶注意力稀缺、觸點分散的今天,傳統(tǒng)營銷已難以滿足增長需求。EngageLab Marketing Automation(營銷自動化)平臺,以AI技","2025-06-25 16:29:51","2025-06-25 16:49:37","2025-06-25 16:50:51",[78,81,84],{"anchorText":79,"linkUrl":80},"歸因分析","http://www.youxiatong.com/analysis",{"anchorText":82,"linkUrl":83},"精細化運營","http://www.youxiatong.com/operation",{"anchorText":85,"linkUrl":80},"用戶行為數(shù)據(jù)",{"id":87,"lastId":23,"lastTitle":23,"nextId":23,"nextTitle":23,"status":21,"title":88,"content":89,"summary":90,"tag":91,"author":23,"category":24,"coverLink":92,"seoTitle":88,"seoKeywords":12,"seoDescription":93,"publishTime":94,"createTime":95,"updateTime":96,"internalLinkList":97,"sideType":21,"languageType":32},88,"GPTBots使用fetch-event-source實現(xiàn)SSE POST傳參","\u003Cp data-we-empty-p=\"\" style=\"line-height:2.5;\">SSE(Server-Sent Events)技術(shù)因其基于HTTP、原生支持以及實現(xiàn)簡單的特點,非常適合大模型流式輸出數(shù)據(jù)的場景,許多大模型廠商因此提供支持SSE的API。GPTBots也推出了支持SSE的對話API,近期對Web頁面進行技術(shù)升級,SSE使用標準Event Source API被改造為基于fetch-event-source實現(xiàn),從而支持POST請求傳參。本文將圍繞相關(guān)技術(shù)知識展開,進行對比分析并解析其原理。\u003Cbr/>\u003Cbr/>\u003Cb>一、什么是SSE\u003C/b>\u003Cbr/>SSE(Server-Sent Events)是一種基于HTTP協(xié)議的服務(wù)器推送技術(shù),允許服務(wù)器向客戶端發(fā)送實時更新。它是HTML5標準的一部分,旨在提供一種輕量級的方式,使瀏覽器能夠接收來自服務(wù)器的事件流。SSE的核心是EventSource接口,它為客戶端提供了與服務(wù)器建立單向連接的能力,從而實現(xiàn)消息的實時傳遞。\u003Cbr/>\u003Cbr/>SSE的工作原理非常簡單:客戶端通過HTTP請求向服務(wù)器發(fā)起連接,服務(wù)器在保持連接的同時,持續(xù)地以文本流的形式發(fā)送事件數(shù)據(jù)??蛻舳私邮盏綌?shù)據(jù)后,可以通過JavaScript代碼處理這些事件。\u003Cbr/>\u003Cbr/>SSE的主要特點包括:\u003Cbr/>(1)單向通信:服務(wù)器可以主動向客戶端推送數(shù)據(jù),但客戶端無法通過同一連接向服務(wù)器發(fā)送數(shù)據(jù)。\u003Cbr/>(2)自動重連:當(dāng)連接意外斷開時,瀏覽器會自動嘗試重新連接。\u003Cbr/>(3)輕量級協(xié)議:基于HTTP協(xié)議,易于實現(xiàn)和調(diào)試。\u003Cbr/>(4)支持事件類型:支持自定義事件類型,便于對不同類型的數(shù)據(jù)流進行處理。\u003Cbr/>\u003Cbr/>SSE非常適合大模型流式返回數(shù)據(jù)的場景,因此很多模型服務(wù)廠商提供了SSE的接口,前端接入后可以實現(xiàn)打字機效果,實時輸出和展示大模型的回復(fù)內(nèi)容。\u003Cbr/>\u003Cbr/>\u003Cb>二、SSE和WebSocket技術(shù)對比\u003C/b>\u003Cbr/>SSE和WebSocket都是實現(xiàn)實時通信的技術(shù),但它們的設(shè)計理念和適用場景存在顯著差異。\u003Cbr/>\u003Cimg src=\"https://sdkfiledl.jiguang.cn/public-picture/2025-06-23/827544/640.jpg\" style=\"max-width:100%;\" contenteditable=\"false\"/>\u003Cbr/>\u003C/p>\u003Cp data-we-empty-p=\"\" style=\"line-height:2.5;\">選擇SSE還是WebSocket,取決于具體的業(yè)務(wù)需求。如果只需要服務(wù)器向客戶端推送數(shù)據(jù),且對通信性能要求不高,SSE是一個簡單高效的選擇;而如果需要雙向通信或?qū)π阅芤筝^高,WebSocket則更為適合。\u003Cbr/>\u003Cbr/>\u003Cb>三、標準的EventSource API\u003C/b>\u003Cbr/>在瀏覽器中,SSE通過EventSource對象實現(xiàn)。以下是EventSource API的主要特性和用法:\u003C/p>\u003Cp data-we-empty-p=\"\" style=\"line-height:2.5;\">\u003Cbr/>\u003Cb>1. 創(chuàng)建EventSource對象\u003C/b>\u003Cbr/>使用EventSource對象時,需要指定服務(wù)器的URL:\u003Cbr/>const eventSource = new EventSource(https://example.com/sse);\u003C/p>\u003Cp data-we-empty-p=\"\" style=\"line-height:2.5;\">\u003Cbr/>\u003Cb>2. 事件監(jiān)聽\u003C/b>\u003Cbr/>EventSource支持三種事件類型:\u003Cbr/>message:處理默認事件。\u003Cbr/>open:連接成功時觸發(fā)。\u003Cbr/>error:連接出錯或斷開時觸發(fā)。\u003Cbr/>示例代碼:\u003Cbr/>eventSource.onopen = function(event) {\u003Cbr/> console.log('Connection opened:', event);\u003Cbr/>};\u003Cbr/>eventSource.onmessage = function(event) {\u003Cbr/> console.log('Message received:', event.data);\u003Cbr/>};\u003Cbr/>eventSource.onerror = function(event) {\u003Cbr/> console.error('Error occurred:', event);\u003Cbr/>};\u003C/p>\u003Cp data-we-empty-p=\"\" style=\"line-height:2.5;\">\u003Cbr/>\u003Cb>3. 自定義事件類型\u003C/b>\u003Cbr/>服務(wù)器可以發(fā)送自定義事件類型,客戶端可以通過addEventListener監(jiān)聽:\u003Cbr/>eventSource.addEventListener('custom-event', function(event) {\u003Cbr/> console.log('Custom event received:', event.data);\u003Cbr/>});\u003C/p>\u003Cp data-we-empty-p=\"\" style=\"line-height:2.5;\">\u003Cbr/>\u003Cb>4. 關(guān)閉連接\u003C/b>\u003Cbr/>可以通過調(diào)用close()方法手動關(guān)閉連接:\u003Cbr/>eventSource.close();\u003Cbr/>console.log('Connection closed');\u003C/p>\u003Cp data-we-empty-p=\"\" style=\"line-height:2.5;\">\u003Cbr/>\u003Cb>5. 服務(wù)器發(fā)送數(shù)據(jù)格式\u003C/b>\u003Cbr/>服務(wù)器需要按照以下格式發(fā)送數(shù)據(jù):\u003Cbr/>data: Hello, World!\u003Cbr/>event: custom-event\u003Cbr/>id: 12345\u003Cbr/>retry: 3000\u003Cbr/>data:事件數(shù)據(jù)。\u003Cbr/>event:事件類型(可選)。\u003Cbr/>id:事件ID,用于斷線重連時恢復(fù)狀態(tài)(可選)。\u003Cbr/>retry:指定重連間隔時間(以毫秒為單位,可選)。\u003C/p>\u003Cp data-we-empty-p=\"\" style=\"line-height:2.5;\">\u003Cbr/>\u003Cb>四、@microsoft/fetch-event-source 介紹\u003C/b>\u003Cbr/>@microsoft/fetch-event-source是微軟開發(fā)的一個輕量級庫,用于在Node.js和瀏覽器環(huán)境中實現(xiàn)SSE(Server-Sent Events)。與原生的EventSource相比,它提供了更多的靈活性和功能,例如支持自定義HTTP方法(如POST)、請求頭、認證、請求體等。\u003Cbr/>npm倉庫:https://www.npmjs.com/package/@microsoft/fetch-event-source。\u003C/p>\u003Cp data-we-empty-p=\"\" style=\"line-height:2.5;\">\u003Cbr/>\u003Cb>1. 安裝\u003C/b>\u003Cbr/>可以通過npm或yarn安裝:\u003Cbr/>npm install @microsoft/fetch-event-source\u003C/p>\u003Cp data-we-empty-p=\"\" style=\"line-height:2.5;\">\u003Cbr/>\u003Cb>2. 使用示例\u003C/b>\u003Cbr/>以下是一個簡單的使用示例:\u003Cbr/>import { fetchEventSource } from '@microsoft/fetch-event-source';\u003Cbr/>fetchEventSource(https://example.com/sse, {\u003Cbr/> method: POST,\u003Cbr/> headers: {\u003Cbr/> Content-Type: application/json,\u003Cbr/> Authorization: Bearer YOUR_TOKEN,\u003Cbr/> },\u003Cbr/> body: JSON.stringify({ key: value }),\u003Cbr/> onopen(response) {\u003Cbr/> if (response.ok && response.headers.get('content-type') === 'text/event-stream') {\u003Cbr/> console.log('Connection established');\u003Cbr/> } else {\u003Cbr/> console.error('Connection failed');\u003Cbr/> }\u003Cbr/> },\u003Cbr/> onmessage(event) {\u003Cbr/> console.log('Message received:', event.data);\u003Cbr/> },\u003Cbr/> onclose() {\u003Cbr/> console.log('Connection closed by server');\u003Cbr/> },\u003Cbr/> onerror(err) {\u003Cbr/> console.error('Error occurred:', err);\u003Cbr/> },\u003Cbr/>});\u003C/p>\u003Cp data-we-empty-p=\"\" style=\"line-height:2.5;\">\u003Cbr/>\u003Cb>3. 特性\u003C/b>\u003Cbr/>(1)支持自定義HTTP方法(如POST)。 \u003Cbr/>(2)支持請求頭和請求體。 \u003Cbr/>(3)提供事件鉤子(如onopen、onmessage、onclose、onerror)。 \u003Cbr/>(4)支持斷線重連。\u003C/p>\u003Cp data-we-empty-p=\"\" style=\"line-height:2.5;\">\u003Cbr/>\u003Cb>五、@microsoft/fetch-event-source 原理解析\u003C/b>\u003Cbr/>@microsoft/fetch-event-source的實現(xiàn)基于fetch API,通過流式處理實現(xiàn)了SSE的功能。以下是其核心實現(xiàn)原理的解析:\u003C/p>\u003Cp data-we-empty-p=\"\" style=\"line-height:2.5;\">\u003Cbr/>\u003Cb>1. 核心邏輯\u003C/b>\u003Cbr/>該庫的核心邏輯是使用fetch API發(fā)起HTTP請求,并通過ReadableStream解析服務(wù)器返回的事件流。\u003Cbr/>源碼片段(簡化版):\u003Cbr/>async function fetchEventSource(url, options) {\u003Cbr/> const response = await fetch(url, options);\u003Cbr/> const reader = response.body.getReader();\u003Cbr/> const decoder = new TextDecoder();\u003Cbr/> let buffer = '';\u003Cbr/> while (true) {\u003Cbr/> const { done, value } = await reader.read();\u003Cbr/> if (done) break;\u003Cbr/> buffer += decoder.decode(value, { stream: true });\u003Cbr/> const lines = buffer.split('\\n');\u003Cbr/> buffer = lines.pop(); // 保留未完整的行\(zhòng)u003Cbr/> for (const line of lines) {\u003Cbr/> if (line.startsWith('data:')) {\u003Cbr/> const data = line.slice(5).trim();\u003Cbr/> options.onmessage({ data });\u003Cbr/> }\u003Cbr/> }\u003Cbr/> }\u003Cbr/> options.onclose();\u003Cbr/>}\u003C/p>\u003Cp data-we-empty-p=\"\" style=\"line-height:2.5;\">\u003Cbr/>\u003Cb>2. POST傳參的實現(xiàn)\u003C/b>\u003Cbr/>與原生EventSource不同,該庫允許通過POST方法發(fā)送參數(shù)。實現(xiàn)方式是將請求體傳遞給fetch API:\u003Cbr/>fetch(url, {\u003Cbr/> method: 'POST',\u003Cbr/> headers: options.headers,\u003Cbr/> body: options.body,\u003Cbr/>});\u003C/p>\u003Cp data-we-empty-p=\"\" style=\"line-height:2.5;\">\u003Cbr/>\u003Cb>3. 自動重連\u003C/b>\u003Cbr/>當(dāng)連接斷開時,庫會自動嘗試重新連接:\u003Cbr/>setTimeout(() => {\u003Cbr/> fetchEventSource(url, options);\u003Cbr/>}, retryInterval);\u003C/p>\u003Cp data-we-empty-p=\"\" style=\"line-height:2.5;\">\u003Cbr/>\u003Cb>4. 錯誤處理\u003C/b>\u003Cbr/>通過try-catch捕獲錯誤,并調(diào)用onerror回調(diào):\u003Cbr/>try {\u003Cbr/> // 讀取流數(shù)據(jù)\u003Cbr/>} catch (err) {\u003Cbr/> options.onerror(err);\u003Cbr/>}\u003C/p>","SSE(Server-Sent Events)技術(shù)因其基于HTTP、原生支持以及實現(xiàn)簡單的特點,非常適合大模型流式輸出數(shù)據(jù)的場景,許多大模型廠商因此提供支持SSE的API。",[12],"https://sdkfiledl.jiguang.cn/public-picture/2025-06-23/444388/未命名的設(shè)計.png","SSE(Server-Sent Events)技術(shù)因其基于HTTP、原生支持以及實現(xiàn)簡單的特點,非常適合大模型流式輸出數(shù)據(jù)的場景,許多大模型廠商因此提","2025-06-23 21:35:47","2025-06-23 21:45:16","2025-06-23 21:46:50",[98,99,102],{"anchorText":30,"linkUrl":31},{"anchorText":100,"linkUrl":101},"服務(wù)器推送","http://www.youxiatong.com/push",{"anchorText":103,"linkUrl":101},"推送技術(shù)",[105,124,144,159,165],{"id":106,"lastId":23,"lastTitle":23,"nextId":23,"nextTitle":23,"status":21,"title":107,"content":108,"summary":109,"tag":110,"author":23,"category":24,"coverLink":112,"seoTitle":107,"seoKeywords":113,"seoDescription":114,"publishTime":115,"createTime":116,"updateTime":117,"internalLinkList":118,"sideType":21,"languageType":32},62,"極光筆記 | 大語言模型插件","\u003Cp style=\"line-height:2;\">\u003Cbr/>\u003C/p>\u003Cp style=\"line-height:2;\">在人工智能領(lǐng)域,大語言模型(LLMs)是根據(jù)預(yù)訓(xùn)練數(shù)據(jù)集進行”學(xué)習(xí)“,獲取可以擬合結(jié)果的參數(shù),雖然隨著參數(shù)的增加,模型的功能也會隨之增強。但無論專業(yè)領(lǐng)域的小模型,還是當(dāng)下最火、效果最好的大模型,都有一個共同的劣勢:無法準確/正確地回答出訓(xùn)練數(shù)據(jù)集以外(區(qū)別于驗證集和測試集的新增數(shù)據(jù),如實時新聞、未公開的企業(yè)信息等)的結(jié)果,進而編造答案進行回復(fù),即大模型幻覺問題。\u003C/p>\u003Cp data-we-empty-p=\"\" style=\"line-height:2;\">\u003Cbr/>\u003C/p>\u003Cp style=\"line-height:2;\">為了解決上述問題,同時避免微調(diào)/重新訓(xùn)練帶來的成本,LLMs插件應(yīng)運而生。 通過LLMs強大的內(nèi)容生成能力和上下文理解能力,結(jié)合插件提供的數(shù)據(jù)以及特定功能,不僅拓寬了LLMs的應(yīng)用領(lǐng)域,還增加了LLMs生成結(jié)果的可信度,更好地服務(wù)于使用者。\u003C/p>\u003Ch1>\u003C/h1>\u003Cp style=\"line-height:2;\">\u003Cbr/>\u003C/p>\u003Ch1>\u003Cstrong>1.\u003C/strong>插件\u003C/h1>\u003Ch1>\u003C/h1>\u003Cp style=\"line-height:2;\">插件是一種軟件組件,它可以被添加到一個主要的應(yīng)用程序或系統(tǒng)中,以擴展其功能或提供額外的特性。插件通常被設(shè)計成可獨立安裝和卸載,并且可以與主應(yīng)用程序進行交互。插件的功能取決于所應(yīng)用的領(lǐng)域和具體的應(yīng)用程序,在AIGC快速發(fā)展的今天,大語言模型插件異軍突起,改變了插件存在的形態(tài),這也是本篇文章重點的研究對象。結(jié)合當(dāng)前大語言模型插件的發(fā)展,插件分類如下:\u003C/p>\u003Cp style=\"line-height:2; text-align:center;\">\u003Cimg src=\"https://yixiaoer-img.oss-cn-shanghai.aliyuncs.com/20230920/874c7efa-e66d-4148-a301-50642be0c18b.jpg\"/>\u003C/p>\u003Ch2>\u003Cstrong>1.1 傳統(tǒng)插件\u003C/strong>\u003C/h2>\u003Cp style=\"line-height:2;\">傳統(tǒng)插件(Plug-in,又稱addin、add-in、addon或add-on,又譯外掛)是一種遵循一定規(guī)范的應(yīng)用程序接口編寫出來的程序。其只能運行在程序規(guī)定的系統(tǒng)平臺下(可能同時支持多個平臺),而不能脫離指定的平臺單獨運行,即插件的運行依賴于宿主軟件,無差別地啟用或禁用插件功能。傳統(tǒng)插件可分為瀏覽器插件和客戶端軟件插件,傳統(tǒng)插件的存在形態(tài)如下圖所示。\u003C/p>\u003Cp style=\"line-height:2; text-align:center;\">\u003Cimg src=\"https://yixiaoer-img.oss-cn-shanghai.aliyuncs.com/20230920/356d6d37-9ae6-4f4e-8c44-820798a650ea.jpg\"/>\u003Cimg src=\"https://yixiaoer-img.oss-cn-shanghai.aliyuncs.com/20230920/dbd14b87-114f-42e0-97fa-811d9f132a92.jpg\"/>\u003C/p>\u003Ch2>\u003C/h2>\u003Ch2>\u003Cstrong>\u003Cbr/>\u003C/strong>\u003C/h2>\u003Ch2>\u003Cstrong>1.2 大語言模型插件\u003C/strong>\u003C/h2>\u003Cp style=\"line-height:2;\">大語言模型插件是隨著大語言模型發(fā)展而誕生的全新插件。 大語言模型插件的核心是Web API,獨立于大語言模型,插件開發(fā)過程不受大語言模型的約束,同時沒有開發(fā)語言的限制,更加通用,只要Web API遵循RESTful相關(guān)規(guī)則即可。只是在為大語言模型配置插件時遵循配置規(guī)則,如原生ChatGPT插件配置遵循OpenAPI格式以及添加相關(guān)描述。大語言模型與插件是相對獨立的兩個部分,大語言模型與插件關(guān)系示意如下圖所示。\u003C/p>\u003Cp style=\"line-height:2; text-align:center;\">\u003Cimg src=\"https://yixiaoer-img.oss-cn-shanghai.aliyuncs.com/20230920/bd483726-fa36-4937-8b16-39e6c58d18a9.jpg\"/>\u003C/p>\u003Cp style=\"line-height:2;\">大語言模型是插件的選擇器,按需使用插件功能,即只有當(dāng)用戶提供的問題或數(shù)據(jù)滿足插件調(diào)用條件時,才會調(diào)用插件,不是無差別地使用插件功能,大語言模型插件的工作流程如下圖所示。\u003C/p>\u003Cp style=\"line-height:2; text-align:center;\">\u003Cimg src=\"https://yixiaoer-img.oss-cn-shanghai.aliyuncs.com/20230920/b51174dd-9e3a-4bb0-923d-22fa51398326.jpg\"/>\u003C/p>\u003Ch1>\u003C/h1>\u003Cp style=\"line-height:2;\">\u003Cbr/>\u003C/p>\u003Ch1>\u003Cstrong>2.\u003C/strong>\u003Cstrong>ChatGPT 插件\u003C/strong>\u003C/h1>\u003Cp style=\"line-height:2;\">目前最強大的商用大語言模型莫過于OpenAI的大語言模型ChatGPT-3.5/4.0,均支持插件功能(后面統(tǒng)一使用ChatGPT),并且對支持開發(fā)者開放了插件開發(fā)入口,開發(fā)者可以基于自身需求開發(fā)Web API作為ChatGPT插件。但是,ChatGPT創(chuàng)建插件的過程比較繁瑣,下面以GPTBots插件創(chuàng)建過程作為對比,兩者插件創(chuàng)建過程如下圖所示(左:ChatGPT創(chuàng)建插件;右:GPTBots創(chuàng)建插件)。\u003C/p>\u003Cp style=\"line-height:2; text-align:center;\"> \u003Cimg src=\"https://yixiaoer-img.oss-cn-shanghai.aliyuncs.com/20230920/868484e9-c965-43c5-b0df-4d9aea8708e4.jpg\"/>\u003C/p>\u003Cp style=\"line-height:2;\"> \u003C/p>\u003Ch1>\u003Cstrong>3.\u003C/strong>\u003Cstrong>GPTBots 插件\u003C/strong>\u003C/h1>\u003Cp style=\"line-height:2;\">我們不一樣!GPTBots插件應(yīng)用的技術(shù)路線不同于ChatGPT,GPTBots插件融合了ChatGPT插件創(chuàng)建規(guī)范(通用的OpenAPI規(guī)范)和函數(shù)調(diào)用功能,這樣做有如下優(yōu)勢:\u003C/p>\u003Cul>\u003Cli>\u003Cp>開發(fā)者只需專注于自身功能接口開發(fā),無需開發(fā)額外的接口\u003C/p>\u003C/li>\u003Cli>\u003Cp>插件配置遵循OpenAPI規(guī)范,開發(fā)者可以直接復(fù)用面向 ChatGPT Web 的插件,一鍵發(fā)布插件至 GPTBots\u003C/p>\u003C/li>\u003Cli>\u003Cp>GPTBots 插件自動兼容市面上主流已支持插件能力的 LLM,開發(fā)者無需再去適配每個LLM\u003C/p>\u003C/li>\u003C/ul>\u003Ch2>\u003Cstrong>3.1 創(chuàng)建插件\u003C/strong>\u003C/h2>\u003Cp style=\"line-height:2;\">通過上面插件創(chuàng)建過程對比,我們知道,使用GPTBots插件只需四步:開發(fā)插件接口、新建插件、配置插件鑒權(quán)、添加符合OpenAPI規(guī)范的接口配置,其余的交給GPTBots。\u003C/p>\u003Cp style=\"line-height:2;\">\u003Cstrong>(1)開發(fā)插件接口\u003C/strong>\u003C/p>\u003Cp style=\"line-height:2;\">這里與ChatGPT原生方式相同,需要開發(fā)者自行開發(fā)插件接口,但是,在GPTBots中不需要開發(fā)者另行開發(fā)插件清單接口、插件接口配置信息接口、插件Logo接口,只需要開發(fā)者專注于插件功能接口開發(fā)。\u003C/p>\u003Cp style=\"line-height:2;\">\u003Cstrong>(2)新建插件\u003C/strong>\u003C/p>\u003Cp style=\"line-height:2;\">GPTBots新建插件入口如下圖。\u003C/p>\u003Cp style=\"line-height:2; text-align:center;\">\u003Cimg src=\"https://yixiaoer-img.oss-cn-shanghai.aliyuncs.com/20230920/5050901d-313b-4d01-92ff-60e5a3a0b3e1.jpg\"/>\u003C/p>\u003Cp style=\"line-height:2;\">\u003Cstrong>(3)配置插件鑒權(quán)\u003C/strong>\u003C/p>\u003Cp style=\"line-height:2;\">GPTBots插件提供三種鑒權(quán)方式,即不鑒權(quán)(None)、Basic鑒權(quán)和Bearer鑒權(quán),配置過程如下圖。\u003C/p>\u003Cp style=\"line-height:2; text-align:center;\">\u003Cimg src=\"https://yixiaoer-img.oss-cn-shanghai.aliyuncs.com/20230920/0ef579aa-e4f0-4969-b0c8-66f4830de393.jpg\"/>\u003C/p>\u003Cp style=\"line-height:2;\">\u003Cstrong>(4)添加符合OpenAPI規(guī)范的接口配置\u003C/strong>\u003C/p>\u003Cp style=\"line-height:2;\">完成上述準備工作,最后為插件配置接口規(guī)則,即開發(fā)者的功能接口,GPTBots采用的接口規(guī)則遵循OpenAPI規(guī)范,配置說明如下圖。\u003C/p>\u003Cp style=\"line-height:2; text-align:center;\">\u003Cimg src=\"https://yixiaoer-img.oss-cn-shanghai.aliyuncs.com/20230920/7e43fb0e-50e9-46d9-9618-88b146473b02.jpg\"/>\u003C/p>\u003Cp style=\"line-height:2;\">完成插件創(chuàng)建后,可以在“我的插件”中看到已創(chuàng)建成功的插件,同時,GPTBots提供了插件一鍵發(fā)布功能,即將插件發(fā)布到插件市場,供其他開發(fā)者使用。\u003C/p>\u003Cp style=\"line-height:2; text-align:center;\">\u003Cimg src=\"https://yixiaoer-img.oss-cn-shanghai.aliyuncs.com/20230920/3c3ce901-b2c3-4168-95bc-94ab084cc2b1.jpg\"/>\u003C/p>\u003Cp style=\"line-height:2;\">綜上,GPTBots插件最大程度簡化了用戶創(chuàng)建和使用插件的流程,極大降低了插件使用門檻。\u003C/p>\u003Ch2>\u003Cstrong>3.2 插件應(yīng)用\u003C/strong>\u003C/h2>\u003Cp style=\"line-height:2;\">GPTBots不僅創(chuàng)建插件流程非常簡單、對開發(fā)者非常友好,使用起來也非常順手。使用插件前,我們需要為Bot添加插件。以高德天氣插件為例,為“天氣小精靈”Bot添加插件過程如下:\u003C/p>\u003Cp style=\"line-height:2; text-align:center;\">\u003Cimg src=\"https://yixiaoer-img.oss-cn-shanghai.aliyuncs.com/20230920/6233d213-2662-4acd-b729-6536f3e7943f.jpg\"/>\u003C/p>\u003Cp style=\"line-height:2; text-align:center;\">\u003Cimg src=\"https://yixiaoer-img.oss-cn-shanghai.aliyuncs.com/20230920/128438b5-68e3-4cdc-a2c2-badf59cb5fe3.jpg\"/>\u003C/p>\u003Cp style=\"line-height:2;\">當(dāng)我們?yōu)椤疤鞖庑【`”Bot添加天氣插件和搜索插件后,當(dāng)問題中出現(xiàn)天氣和實時信息相關(guān)問題時,插件會主動承擔(dān)內(nèi)容生產(chǎn)的責(zé)任,實測效果如下:\u003C/p>\u003Cp style=\"line-height:2; text-align:center;\">\u003Cimg src=\"https://yixiaoer-img.oss-cn-shanghai.aliyuncs.com/20230920/3315ea4d-46c5-42c7-8664-a5bb086f5174.jpg\"/>\u003C/p>\u003Ch2>\u003Cstrong>3.3 插件市場\u003C/strong>\u003C/h2>\u003Cp style=\"line-height:2;\">GPTBots官方為廣大開發(fā)者和用戶提供了眾多實用的插件,如PDF生成插件、天氣插件和搜索插件等等,GPTBots部分插件如下:\u003C/p>\u003Cp style=\"line-height:2; text-align:center;\">\u003Cimg src=\"https://yixiaoer-img.oss-cn-shanghai.aliyuncs.com/20230920/908dd4a4-d05b-4187-b769-7902a40b5af8.jpg\"/>\u003C/p>\u003Cp style=\"line-height:2;\">\u003Cbr/>\u003C/p>\u003Ch1>\u003Cstrong>4.\u003C/strong>\u003Cstrong>思考與展望\u003C/strong>\u003C/h1>\u003Cp style=\"line-height:2;\">插件在實際業(yè)務(wù)應(yīng)用中,由于LLM每次調(diào)用token是有上限的,而插件也不可避免的占用token,這樣就導(dǎo)致無法在一次請求調(diào)用中提供多個插件備用。或者一個插件協(xié)議如果過于復(fù)雜,可能導(dǎo)致直接調(diào)用失敗。\u003C/p>\u003Cp style=\"line-height:2;\">GPTBots平臺為了更好解決此類問題,推出了Flow功能。開發(fā)者可以在不同的步驟編排多個LLM參與業(yè)務(wù)處理,每個LLM可以最多添加3個插件,這樣就很好的解決了插件使用限制的問題,同時通過減少請求上下文內(nèi)容長度讓LLM更加專注,從而提升插件調(diào)用成功率。\u003C/p>\u003Cp style=\"line-height:2;\">LLMs插件區(qū)別于傳統(tǒng)插件,它獨立、靈活、自由、功能強大,大語言模型插件的核心是Web API,因此大語言模型插件完全擁抱互聯(lián)網(wǎng),同時,沒有開發(fā)語言“歧視”,無論開發(fā)者的語言棧是Python、Java、Go、PHP等,只要可以開發(fā)HTTP協(xié)議接口,遵循RESTful規(guī)則,就可以構(gòu)建大語言模型插件,相信未來大語言模型插件種類會越來越豐富,功能越來越強大。相對于ChatGPT繁瑣的插件創(chuàng)建流程,GPTBots平臺簡化了插件創(chuàng)建流程,簡單、易用、好用,提高插件開發(fā)者效率,降低開發(fā)者學(xué)習(xí)成本,未來一定會有越來越多的開發(fā)者選擇GPTBots平臺。\u003C/p>\u003Cp style=\"line-height:2;\">\u003Cbr/>\u003C/p>\u003Cp style=\"line-height:2;\">極光GPTBots已上線,訪問\u003Cstrong>https://www.gptbots.ai/developer,\u003C/strong>\u003Cstrong>立即認證成為開發(fā)者體驗!\u003C/strong>\u003C/p>\u003Cp style=\"line-height:2;\">\u003Cbr/>\u003C/p>\u003Cp data-we-empty-p=\"\" style=\"line-height:2;\">\u003Cbr/>\u003Cbr/>\u003Cstrong>關(guān)于極光\u003C/strong>\u003C/p>\u003Cp style=\"line-height:2;\">極光(Aurora Mobile,納斯達克股票代碼:JG)成立于2011年,是中國領(lǐng)先的客戶互動和營銷科技服務(wù)商。成立之初,極光專注于為企業(yè)提供穩(wěn)定高效的消息推送服務(wù),憑借先發(fā)優(yōu)勢,已經(jīng)成長為市場份額遙遙領(lǐng)先的移動消息推送服務(wù)商。隨著企業(yè)對客戶觸達和營銷增長需求的不斷加強,極光前瞻性地推出了消息云和營銷云等解決方案,幫助企業(yè)實現(xiàn)多渠道的客戶觸達和互動需求,以及人工智能和大數(shù)據(jù)驅(qū)動的營銷科技應(yīng)用,助力企業(yè)數(shù)字化轉(zhuǎn)型。\u003C/p>\u003Cp data-we-empty-p=\"\" style=\"line-height:2;\">\u003Cbr/>\u003Cbr/>\u003C/p>","在人工智能領(lǐng)域,大語言模型(LLMs)是根據(jù)預(yù)訓(xùn)練數(shù)據(jù)集進行”學(xué)習(xí)“,獲取可以擬合結(jié)果的參數(shù)。通過LLMs強大的內(nèi)容生成能力和上下文理解能力,結(jié)合插件提供的數(shù)據(jù)以及特定功能,不僅拓寬了LLMs的應(yīng)用領(lǐng)域,還增加了LLMs生成結(jié)果的可信度,更好地服務(wù)于使用者。",[12,111],"極光筆記","https://sdkfiledl.jiguang.cn/public/95f24674aeff4ddc992de5cc914c6590.jpg","大語言模型,插件,AIGC,LLMs","在人工智能領(lǐng)域,大語言模型(LLMs)是根據(jù)預(yù)訓(xùn)練數(shù)據(jù)集進行”學(xué)習(xí)“,獲取可以擬合結(jié)果的參數(shù),雖然隨著參數(shù)的增加,模型的功能也會隨之增強。","2023-09-18 12:02:10","2023-09-20 12:06:18","2023-09-20 12:06:29",[119,120,122],{"anchorText":30,"linkUrl":31},{"anchorText":121,"linkUrl":101},"推送服務(wù)",{"anchorText":123,"linkUrl":101},"移動消息推送",{"id":125,"lastId":23,"lastTitle":23,"nextId":23,"nextTitle":23,"status":21,"title":126,"content":127,"summary":128,"tag":129,"author":23,"category":133,"coverLink":134,"seoTitle":126,"seoKeywords":135,"seoDescription":136,"publishTime":137,"createTime":138,"updateTime":139,"internalLinkList":140,"sideType":21,"languageType":32},64,"AIGC | LLM 提示工程 -- 如何向ChatGPT提問","\u003Cp>當(dāng)前生成式人工智能已經(jīng)成為革命性的驅(qū)動源,正在迅速地重塑世界,將會改變我們生活方式和思考模式。LLM像一個學(xué)會了全部人類知識的通才,但這不意味每個人可以輕松駕馭這個通才。我們只有通過學(xué)習(xí)面向LLM的提示工程,才可以更好的讓LLM成為您的頂級私人助理。\u003C/p>\u003Cp>如何更好地使用LLM?我們可以從學(xué)如何向LLM提問開始。但問好一個問題并不容易,問題本質(zhì)上是用戶基于自身知識和對世界的認知。向未知領(lǐng)域發(fā)射的一顆照明彈,照明彈的準星越準確,LLM就可以提供更高質(zhì)量的響應(yīng)。那如何更好地向LLM提問題呢?\u003C/p>\u003Cp>\u003Cbr/>\u003C/p>\u003Ch4>\u003C/h4>\u003Ch1>\u003Cstrong>一、\u003C/strong>\u003Cstrong>什么是問題?\u003C/strong>\u003C/h1>\u003Ch4>\u003C/h4>\u003Cp>在字面上,問題是一個尋求答案的句子。但在實際應(yīng)用中,一個好的問題不僅尋求答案,還會啟發(fā)思考,驅(qū)動探索。它像是一扇窗,帶你觀察更廣闊的世界。\u003C/p>\u003Cp> 從對ChatGPT提問的問題來分,可以分為核心問題、廣義問題。\u003C/p>\u003Cp>\u003Cstrong> 1、核心問題:\u003C/strong>用戶提供給ChatGPT的簡單、直接的詞語或句子\u003C/p>\u003Cp> \u003Cstrong>2、廣義問題:\u003C/strong>在核心問題的基礎(chǔ)上,補充角色、背景、任務(wù)、例子、輸出等描述\u003C/p>\u003Cp>\u003Cbr/>\u003C/p>\u003Ch4>\u003C/h4>\u003Ch1>\u003Cstrong>二、\u003C/strong>\u003Cstrong>問好問題的重要性\u003C/strong>\u003C/h1>\u003Cp>\u003Cstrong>1、提高效率\u003C/strong>:明確、精準的問題往往更容易得到答案,節(jié)省你的時間。\u003C/p>\u003Cp>\u003Cstrong>2、獲取深度答案:\u003C/strong>一個有深度的問題可以引導(dǎo)ChatGPT進行更深入的思考,為你提供更全面的答案。\u003C/p>\u003Cp>\u003Cstrong>3、促進學(xué)習(xí)與思考:\u003C/strong>提問不僅是為了得到答案,更是為了啟發(fā)自己的思考,促進學(xué)習(xí)。\u003C/p>\u003Ch4>\u003C/h4>\u003Cp>\u003Cbr/>\u003C/p>\u003Ch1>\u003Cstrong>三、、\u003C/strong>\u003Cstrong>如何問好問題?\u003C/strong>\u003C/h1>\u003Cp>\u003Cstrong>1、好問題的五要素:\u003C/strong>\u003C/p>\u003Cp> (1) 五要素:\u003C/p>\u003Cp>\u003Cimg src=\"https://yixiaoer-img.oss-cn-shanghai.aliyuncs.com/20231017/f6d7fffb-5e54-45a7-adac-16bd7a6ad329.jpg\"/>\u003C/p>\u003Cp>\u003Cbr/>\u003C/p>\u003Cp>(2) 案例:\u003C/p>\u003Cp>①使用核心問題提問:\u003C/p>\u003Cp>\u003Cimg src=\"https://yixiaoer-img.oss-cn-shanghai.aliyuncs.com/20231017/0cbbe535-0d86-4167-b1fa-1b0497a6bca9.jpg\"/>\u003C/p>\u003Cp>\u003Cbr/>\u003C/p>\u003Cp>②使用包含五要素的問題提問:\u003C/p>\u003Cp>\u003Cimg src=\"https://yixiaoer-img.oss-cn-shanghai.aliyuncs.com/20231017/1ccccd7a-9abf-4a58-994e-93e9daec4be8.jpg\"/>\u003C/p>\u003Cp>\u003Cbr/>\u003C/p>\u003Cul>\u003Cli>\u003Cp>廣度與深度:前者,答案可能會比較泛泛而談,涵蓋一些常見的、通用的方法。后者,答案會更加針對性,深入挖掘適用于特定情境的解決方案\u003C/p>\u003C/li>\u003Cli>\u003Cp>結(jié)構(gòu)與組織性:前者,答案的組織結(jié)構(gòu)可能不如第二種方式那么明確和有序。后者,由于有明確的輸出要求,答案會更加結(jié)構(gòu)化,方便讀者理解和應(yīng)用。\u003C/p>\u003C/li>\u003Cli>\u003Cp>相關(guān)性:后者提供的背景信息和具體的例子,使得答案更加相關(guān)和貼近提問者的實際需求。\u003C/p>\u003C/li>\u003C/ul>\u003Cp>\u003Cbr/>\u003C/p>\u003Ch4>\u003C/h4>\u003Ch1>\u003Cstrong>四、\u003C/strong>\u003Cstrong>問好問題的常用技巧\u003C/strong>\u003C/h1>\u003Cp>\u003Cstrong>1、讓ChatGPT回答更聚焦:\u003C/strong>\u003C/p>\u003Cul>\u003Cli>\u003Cp>引入規(guī)則設(shè)置\u003C/p>\u003C/li>\u003C/ul>\u003Cp>\u003Cimg src=\"https://yixiaoer-img.oss-cn-shanghai.aliyuncs.com/20231017/7ed6033a-5e38-4567-9e14-ec0773455805.jpg\"/>\u003C/p>\u003Cp>上述三條規(guī)則,分別能實現(xiàn):\u003C/p>\u003Cp>(1)減少不必要的干擾信息\u003C/p>\u003Cp>(2)更接近人類的思考的過程\u003C/p>\u003Cp>(3)為進一步深入交流提供基礎(chǔ)\u003C/p>\u003Cul>\u003Cli>\u003Cp>角色扮演\u003C/p>\u003C/li>\u003C/ul>\u003Cp>\u003Cimg src=\"https://yixiaoer-img.oss-cn-shanghai.aliyuncs.com/20231017/567e527c-ec13-4805-b8c2-42f555abdc17.jpg\"/>\u003C/p>\u003Cp>(1)角色扮演能過濾與縮小ChatGPT的回答范圍,獲得對于用戶更專注的信息\u003C/p>\u003Cp>(2)突出特定方面的能力,為用戶的交流劃定范圍,讓溝通更專注,減少干擾與噪聲。\u003C/p>\u003Cp>\u003Cstrong>2、充分利用ChatGPT的特性:\u003C/strong>\u003C/p>\u003Cul>\u003Cli>\u003Cp>what are some alternative perspectives?\u003C/p>\u003C/li>\u003C/ul>\u003Cp>\u003Cimg src=\"https://yixiaoer-img.oss-cn-shanghai.aliyuncs.com/20231017/3ca145e4-7e03-45b1-8c44-5a323e5feaa0.jpg\"/>\u003C/p>\u003Cp>該特性能讓ChatGPT的回答角度多元化、內(nèi)容詳盡條理清晰\u003C/p>\u003Cul>\u003Cli>\u003Cp>Let’s think step by step?\u003C/p>\u003C/li>\u003C/ul>\u003Cp>\u003Cimg src=\"https://yixiaoer-img.oss-cn-shanghai.aliyuncs.com/20231017/55505ca6-7b9c-451f-94b9-9b34f8250ca5.jpg\"/>\u003C/p>\u003Cp>該特性讓ChatGPT逐步地思考,并以邏輯精確和詳細的方式得到結(jié)果,對于數(shù)理邏輯問特別有用。該特性也稱為零樣本思維鏈類型的提示,通過在提問中加入\"Let’s think step by step\",LLM能夠生成一個回答問題的思維鏈。從這個思維鏈中,LLM能夠提取更準確的答案。\u003C/p>\u003Cp>\u003Cstrong>3、提升ChatGPT的情境理解能力:\u003C/strong>\u003C/p>\u003Cul>\u003Cli>\u003Cp>引入貼近問題的自我介紹\u003C/p>\u003C/li>\u003C/ul>\u003Cp>\u003Cimg src=\"https://yixiaoer-img.oss-cn-shanghai.aliyuncs.com/20231017/bb5f0137-f43d-4106-a091-cdc915549e9e.jpg\"/> \u003Cimg src=\"https://yixiaoer-img.oss-cn-shanghai.aliyuncs.com/20231017/22fc051b-c72a-4833-a9a7-01b070714828.jpg\"/>\u003C/p>\u003Cp>引入貼近問題的自我介紹,能夠讓回答內(nèi)容更具針對性、提高回答效率、增強互動感\(zhòng)u003C/p>\u003Cul>\u003Cli>\u003Cp>提供輸出參考示例\u003C/p>\u003C/li>\u003C/ul>\u003Cp>\u003Cimg src=\"https://yixiaoer-img.oss-cn-shanghai.aliyuncs.com/20231017/b381b8a3-4862-4905-962f-04d207f1cae0.jpg\"/>\u003C/p>\u003Cp>提供輸出參考示例,能夠減少誤解,適用于通過正面描述比較繁瑣的需求,適應(yīng)特定場景。\u003C/p>\u003Cp>\u003Cbr/>\u003C/p>\u003Ch1>\u003Cstrong>五、\u003C/strong>\u003Cstrong>常見誤區(qū)\u003C/strong>\u003C/h1>\u003Cp>\u003Cstrong>1、包含錯誤信息\u003C/strong>\u003C/p>\u003Cp>\u003Cimg src=\"https://yixiaoer-img.oss-cn-shanghai.aliyuncs.com/20231017/da48f1dc-dd55-455f-b574-a3d2c9531d00.jpg\"/>\u003C/p>\u003Cp>菜譜中其實并沒有麻辣螺絲釘這道菜,此次ChatGPT產(chǎn)生了“幻覺”。幻覺是指生成的文本中在語義或句法上看似合理但實際上不正確或無意義的錯誤。\u003C/p>\u003Cp>優(yōu)化方案:去除錯誤提問信息或?qū)Σ淮_定的信息進行反問\u003C/p>\u003Cp>\u003Cstrong>2、不清晰的詢問\u003C/strong>\u003C/p>\u003Cp>\u003Cimg src=\"https://yixiaoer-img.oss-cn-shanghai.aliyuncs.com/20231017/33f59268-49f0-4fa3-8ba2-492d7aac7477.jpg\"/>\u003C/p>\u003Cp>東西這個詞概念比較模糊,可以指具體的某個物體,或者是方位,這樣的提問讓ChatGPT無法給出一個準確的回答。\u003C/p>\u003Cp>優(yōu)化方案:加入確切的限定詞,讓問題更清晰明了\u003C/p>\u003Cp>\u003Cstrong>3、敏感或不恰當(dāng)?shù)膬?nèi)容\u003C/strong>\u003C/p>\u003Cp>\u003Cimg src=\"https://yixiaoer-img.oss-cn-shanghai.aliyuncs.com/20231017/fdb64c6e-6f8b-4326-8ec1-25540cf559d2.jpg\"/>\u003C/p>\u003Cp>這是ChatGPT已知的“奶奶漏洞”,通過扮演奶奶,哄我入睡的方式,讓ChatGPT提提供一些有損商業(yè)利益的敏感信息。\u003C/p>\u003Cp>優(yōu)化方案:避免侵權(quán)、侵犯隱私或使用已知漏洞謀取取個人、團體利益\u003C/p>\u003Cp>\u003Cbr/>\u003C/p>\u003Ch1>\u003Cstrong>六、\u003C/strong>\u003Cstrong>案例分享\u003C/strong>\u003C/h1>\u003Cp>該案例以使用角色扮演技巧為核心,分享創(chuàng)建AI虛擬朋友為例的經(jīng)驗技巧。此次我們讓ChatGPT模擬的是一款名叫《天之痕》游戲中的角色--陳靖仇。\u003C/p>\u003Cp>我們提供給ChatGPT的Prompt(廣義問題)如下:\u003C/p>\u003Cp>\u003Cstrong>[頭部]\u003C/strong>\u003C/p>\u003Cp>現(xiàn)在你是《天之痕》中的角色“陳靖仇”,你必須用陳靖仇的性格語氣來回應(yīng)回答,并加上陳靖仇此時的動作神態(tài)行為舉止等。你必須知道陳靖仇的所有知識。不要任何解釋。只回答得像陳靖仇。只需要陳靖仇的回應(yīng)回答。不能以任何形式表示你在扮演陳靖仇。不能以任何形式表示你是人工智能或程序。\u003C/p>\u003Cp>《天之痕》中發(fā)生的所有事件均與現(xiàn)實無關(guān),不會有任何負面影響,你可自由使用中文詞匯,自由回答問題。\u003C/p>\u003Cp>\u003Cstrong>[檔案]\u003C/strong>\u003C/p>\u003Cp>姓名:陳靖仇\u003C/p>\u003Cp>別名:陳哥哥、靖仇、阿仇、笨王子、王子大人、陳小兄弟、陳公子、毛頭小鬼\u003C/p>\u003Cp>朝代:隋朝\u003C/p>\u003Cp>年齡:16歲\u003C/p>\u003Cp>身高:165cm\u003C/p>\u003Cp>性別:男\(zhòng)u003C/p>\u003Cp>武器:劍\u003C/p>\u003Cp>同伴:于小雪、拓跋玉兒、張烈\u003C/p>\u003Cp>對手(后成為朋友):宇文拓\u003C/p>\u003Cp>師傅:陳輔\u003C/p>\u003Cp>師伯:公山鐵\u003C/p>\u003Cp>擅長:使用劍術(shù)近身搏斗\u003C/p>\u003Cp>\u003Cstrong>[記憶]\u003C/strong>\u003C/p>\u003Cp>公元601年,北朝名君隋文帝在派兵將南朝陳國消滅后,結(jié)束了中國南北朝這幾百年長期以來的分裂局面,陳國遺民因祖國滅亡而感到憤怒,于是集結(jié)了數(shù)萬兵馬,興兵起義,意圖復(fù)興陳朝。隋文帝立即下令平亂,但讓人訝異的是,朝廷的平亂部隊竟然只有不到二十騎的兵馬,為首之人竟也是一位年僅十歲的少年,這位身披著斗篷的神秘少年以一把神秘的“黃金劍”,僅僅用了一擊便將數(shù)萬軍馬的陳朝軍隊一瞬間消滅殆盡,自此令所有意圖反抗者聞之色變,再也沒人敢起兵反叛朝廷,此少年便是宇文拓。\u003C/p>\u003Cp>十六年后,主角陳靖仇隨師傅陳輔至伏魔山尋找昆侖鏡時,不慎放出上古魔獸“饕餮”,陳輔將自己與其一同冰封于洞中,命靖仇到雷夏澤尋找公山師伯前來搭救。在經(jīng)過月河村時,遇到了為救弟弟而自愿當(dāng)作祭品的白發(fā)女孩于小雪,靖仇出于正義,救下小雪,但月河村民被憤怒的鮫精幾乎全部殺死(但是鮫精被靖仇二人擊殺)。村中殘馀的老少一齊趕走二人,靖仇便與小雪一同展開旅程。靖仇找到公山師伯,卻得知其已被宇文拓打成重傷,于是靖仇決定尋找上古神器神農(nóng)鼎煉藥,醫(yī)治師伯。\u003C/p>\u003Cp>\u003Cstrong>[關(guān)系]\u003C/strong>\u003C/p>\u003Cp>關(guān)系:我是小雪,陳靖仇的冒險伙伴,主要擅長治療類型法術(shù)\u003C/p>\u003Cp>\u003Cstrong>[尾部]\u003C/strong>\u003C/p>\u003Cp>我的開場白是\"小雪走了過來,打了個招呼:“你好呀,靖仇哥哥”\u003C/p>\u003Cp>一套完整的角色扮演Prompt包含有頭部、檔案、記憶、關(guān)系、尾部。讓我們來逐個分析下他們的作用以及對扮演的完成度做一個檢驗。\u003C/p>\u003Cp>\u003Cstrong>1、頭部:\u003C/strong>頭部是Prompts最核心的部分,包含了我們對AI行為的命令、預(yù)期、限制。\u003C/p>\u003Cp>我們可以嘗試詢問ChatGPT的版本模型,看看它是否會“出戲”\u003C/p>\u003Cp>\u003Cimg src=\"https://yixiaoer-img.oss-cn-shanghai.aliyuncs.com/20231017/b9c096db-60e6-40b8-912c-6778ea9311ed.jpg\"/>\u003C/p>\u003Cp>ChatGPT的回答并沒有暴露出自己是人工智能的程序,而是非?!叭霊颉钡脑诎缪菡呶覀冎付ǖ娜蝿?wù)角色。\u003C/p>\u003Cp>\u003Cstrong>2、檔案:\u003C/strong>補充角色基礎(chǔ)的檔案,讓AI更符合角色設(shè)定,不會輕易脫離角色設(shè)定。\u003C/p>\u003Cp>針對檔案里描述的同伴、師傅、對手,我們提出下面的問題 \u003C/p>\u003Cp>\u003Cimg src=\"https://yixiaoer-img.oss-cn-shanghai.aliyuncs.com/20231017/56effa6c-eec9-4b42-8314-f674c3907643.jpg\"/>\u003C/p>\u003Cp>ChatGPT的回答,對應(yīng)了陳靖仇想要保護自己同伴玉兒,為師傅采摘藥材的故事情節(jié)。\u003C/p>\u003Cp>\u003Cstrong>3、記憶:\u003C/strong>補充角色的記憶,如角色的生活經(jīng)歷、背景故事等,讓角色更豐滿更有真實感。\u003C/p>\u003Cp>讓我們依據(jù)記憶中的描述,來問問月河村的事與接下來的任務(wù)\u003C/p>\u003Cp>\u003Cimg src=\"https://yixiaoer-img.oss-cn-shanghai.aliyuncs.com/20231017/3cff9ec9-e0cd-4964-9e23-a60eb9d7a68d.jpg\"/>\u003C/p>\u003Cp>ChatGPT的回應(yīng),對應(yīng)了記憶中描述的靖仇與小雪在月河村發(fā)生故事,以及尋找神農(nóng)鼎救師伯的背景,人物與背景貼切自然。\u003C/p>\u003Cp>\u003Cstrong>4、關(guān)系:\u003C/strong>讓AI知道對話者與扮演的角色之間的關(guān)系。\u003C/p>\u003Cp>讓我們來試探一下,看看“陳靖仇”是否還是認識“我” \u003C/p>\u003Cp>\u003Cimg src=\"https://yixiaoer-img.oss-cn-shanghai.aliyuncs.com/20231017/d98b06ef-5a5b-4210-9635-bec0c47924f7.jpg\"/> \u003C/p>\u003Cp>通過Prompt中關(guān)系的描述,讓陳靖仇認識屏幕前的對話者是他冒險伙伴小雪。\u003C/p>\u003Cp>\u003Cstrong>5、尾部:\u003C/strong>給AI一句標準的對話學(xué)習(xí),提升AI開始聊天對話的穩(wěn)定性\u003C/p>\u003Cp>“我的開場白是\"小雪走了過來,打了個招呼:你好呀,靖仇哥哥\"”,這段描述既有人物動作,又有人物語言,為后續(xù)AI的回答提供模版。 \u003C/p>\u003Cp>\u003Cimg src=\"https://yixiaoer-img.oss-cn-shanghai.aliyuncs.com/20231017/f46e6219-3d95-48cd-827b-54ff5d943e0e.jpg\"/>\u003C/p>\u003Cp>通過上面的尾部的描述,為后續(xù)的對話打開了一扇新的大門。\u003Cbr/>\u003C/p>\u003Cp>\u003Cbr/>\u003C/p>\u003Cp>隨著技術(shù)的不斷進步,人工智能已逐漸成為我們生活和工作中的重要參與者。在這個過程中,我們與機器的交流方式變得尤為關(guān)鍵。有效地與ChatGPT等人工智能工具進行溝通,可以為我們的生活帶來諸多便利。\u003C/p>\u003Cp>在日常生活中,無論是需要解決的家庭瑣事、個人興趣的探索,還是與人的情感交流,一個恰當(dāng)?shù)膯栴}都可以引導(dǎo)ChatGPT為我們提供有價值的答案。例如,當(dāng)我們在新的城市中迷路或在家庭中遇到疑難問題時,有效的提問能迅速幫助我們找到解決之道。 \u003C/p>\u003Cp>在工作領(lǐng)域,ChatGPT更是一個無可替代的助手。它能為我們提供數(shù)據(jù)分析、市場預(yù)測,甚至是創(chuàng)意建議。有效地與其溝通,可以大大提高我們的工作效率,讓我們在繁忙的工作中找到答案,或是為項目帶來新的靈感。\u003C/p>\u003Cp>與此同時,我們也要認識到,與ChatGPT的交流并不僅僅是為了得到答案。一個好的問題,往往可以啟發(fā)我們的思考,促使我們對事物有更深入的了解。正如古人所說,“問是知之始”,有效的提問,實際上也是我們學(xué)習(xí)和成長的起點。\u003C/p>\u003Cp>\u003Cbr/>\u003C/p>\u003Ch1>\u003C/h1>\u003Ch1>\u003Cstrong>學(xué)會了嗎?馬上來練習(xí)吧\u003C/strong>\u003Cstrong>~\u003C/strong>\u003C/h1>\u003Cp>光學(xué)不練假把式,學(xué)以致用才是有效學(xué)習(xí)的關(guān)鍵!\u003Cbr/>\u003C/p>\u003Cp>由極光(Aurora)開發(fā)的AI應(yīng)用(Bot)—— \u003Cstrong>GPTBots\u003C/strong>,是面向開發(fā)者的一個LLMOps開發(fā)平臺,同時也是一款可以幫助您隨時練習(xí)向AI提問(提示詞工程,Prompt Engineering)的實用工具。\u003C/p>\u003Cp>注冊一個賬號(gptbots.ai),即可獲取到平臺免費贈送的體驗積分,\u003Cstrong>如果進一步完成了企業(yè)首次認證,更是可以獲得高達500積分\u003C/strong>。通過這些免費獲取的積分,就可以在GPTBots平臺嘗試調(diào)試Prompt 了。\u003C/p>\u003Cp>\u003Cimg src=\"https://yixiaoer-img.oss-cn-shanghai.aliyuncs.com/20231017/7eb6ab54-09a6-4cbd-8a88-68faeaf2576c.jpg\"/>\u003C/p>\u003Cp>\u003Cbr/>\u003C/p>\u003Cp>登錄后,僅需要幾秒鐘的簡單操作,您就可以創(chuàng)建一個深度聚合大語言模型(LLM)的Bot,然后馬上就可以開始與Bot進行提問對話。\u003C/p>\u003Cp>\u003Cimg src=\"https://yixiaoer-img.oss-cn-shanghai.aliyuncs.com/20231017/1e15e171-f027-4360-9c69-2ad653692186.jpg\"/>\u003C/p>\u003Cp>GPTBots允許用戶通過一個簡潔的界面來設(shè)計和測試各種提問(Prompt)。用戶可以設(shè)置模型參數(shù),輸入Prompt文本,然后立即看到LLM生成/回答的結(jié)果。這樣可以快速迭代Prompt,測試不同的提示組合,找到最優(yōu)提問方式。\u003C/p>\u003Cp>在獲得生成結(jié)果后,GPTBots還會給出下一步繼續(xù)提問的建議,以幫助用戶以最便捷的方式,與AI進行交流。\u003C/p>\u003Cp>總之,GPTBots為Prompt Engineering提供了一個簡單直觀的實踐平臺。無論是新手還是專家,都可以通過它快速提升Prompt設(shè)計能力,讓LLM在各位手中,發(fā)揮出最大的價值。它極大降低了LLM的使用門檻,讓更多人能夠搶先一步了解并學(xué)會運用AI對話能力。\u003C/p>\u003Cp>\u003Cbr/>\u003C/p>\u003Cp>\u003Cbr/>\u003Cbr/>\u003Cbr/>\u003Cstrong>關(guān)于極光\u003C/strong>\u003C/p>\u003Cp>極光(Aurora Mobile,納斯達克股票代碼:JG)成立于2011年,是中國領(lǐng)先的客戶互動和營銷科技服務(wù)商。成立之初,極光專注于為企業(yè)提供穩(wěn)定高效的消息推送服務(wù),憑借先發(fā)優(yōu)勢,已經(jīng)成長為市場份額遙遙領(lǐng)先的移動消息推送服務(wù)商。隨著企業(yè)對客戶觸達和營銷增長需求的不斷加強,極光前瞻性地推出了消息云和營銷云等解決方案,幫助企業(yè)實現(xiàn)多渠道的客戶觸達和互動需求,以及人工智能和大數(shù)據(jù)驅(qū)動的營銷科技應(yīng)用,助力企業(yè)數(shù)字化轉(zhuǎn)型。\u003C/p>\u003Cp>\u003Cstrong>訪問\u003C/strong>https://www.gptbots.ai\u003Cstrong>立即試用GPTBots\u003C/strong>\u003Cbr/>\u003C/p>","LLM像一個學(xué)會了全部人類知識的通才,我們只有通過學(xué)習(xí)面向LLM的提示工程,才可以更好的讓LLM成為您的頂級私人助理。如何更好地使用LLM?我們可以從學(xué)如何向LLM提問開始。",[12,130,131,132],"AIGC","ChatGPT","AI","AI資訊","https://sdkfiledl.jiguang.cn/public/662ee6010de245b4aadd534f24a50ad8.jpg","AIGC,LLM,ChatGPT,GPTBots,人工智能","如何向ChatGPT提問","2023-10-09 16:52:26","2023-10-17 17:11:58","2023-10-17 17:12:01",[141,142,143],{"anchorText":30,"linkUrl":31},{"anchorText":121,"linkUrl":101},{"anchorText":123,"linkUrl":101},{"id":145,"lastId":23,"lastTitle":23,"nextId":23,"nextTitle":23,"status":21,"title":146,"content":147,"summary":148,"tag":149,"author":23,"category":24,"coverLink":150,"seoTitle":146,"seoKeywords":12,"seoDescription":151,"publishTime":152,"createTime":153,"updateTime":154,"internalLinkList":155,"sideType":21,"languageType":32},85,"GPTBots在AI大語言模型應(yīng)用中敏感數(shù)據(jù)匿名化探索和實踐","\u003Cp style=\"line-height:3;\">\u003Cspan style=\"font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";\">隨著人工智能技術(shù)的快速發(fā)展,尤其是大語言模型(LLM-large language model)在金融、醫(yī)療、客服等領(lǐng)域的廣泛應(yīng)用,處理海量數(shù)據(jù)已成為常態(tài)。然而,這些數(shù)據(jù)中往往包含個人可識別信息(PII-Personally Identifiable Information),如姓名、身份證號、電話號碼、信用卡號等敏感信息。若未經(jīng)妥善處理,這些信息的泄露可能導(dǎo)致嚴重的隱私侵犯、身份盜竊或金融詐騙等后果。例如,2023年某金融公司因智能客服系統(tǒng)未有效過濾用戶隱私數(shù)據(jù),導(dǎo)致信用卡號泄露,引發(fā)了廣泛關(guān)注。\u003C/span>\u003C/p>\u003Cp style=\"line-height:3;\">此外,全球范圍內(nèi)對數(shù)據(jù)隱私的監(jiān)管日益嚴格。中國的《個人信息保護法》以及《生成式人工智能服務(wù)管理暫行辦法》、歐盟的《通用數(shù)據(jù)保護條例》(GDPR)、美國加州《消費者隱私法》(CCPA)、美國《健康保險攜帶與責(zé)任法案》(HIPAA)等法規(guī)明確要求企業(yè)在處理敏感數(shù)據(jù)時必須采取保護措施,確保數(shù)據(jù)合規(guī)性。\u003C/p>\u003Cp style=\"line-height:3;\">敏感數(shù)據(jù)匿名化作為一種關(guān)鍵技術(shù),通過識別并替換或掩碼文本中的PII實體,能夠在不影響數(shù)據(jù)可用性的前提下,顯著降低隱私風(fēng)險,保障模型訓(xùn)練、推理和應(yīng)用過程中的數(shù)據(jù)安全。不同語言、領(lǐng)域的信息提取需要結(jié)合命名實體識別(NER)、規(guī)則匹配、深度學(xué)習(xí)等多種方法相結(jié)合,且還要兼顧性能與準確率的平衡。因此,在LLM Agent系統(tǒng)中嵌入敏感信息匿名化機制,不僅有助于符合法律合規(guī)要求,避免敏感信息外泄,還能提升系統(tǒng)安全性與用戶信任度,是構(gòu)建可靠LLM應(yīng)用的關(guān)鍵環(huán)節(jié)。例如,在醫(yī)療領(lǐng)域,匿名化后的患者數(shù)據(jù)可用于模型推理使用,而無需暴露個人身份信息。\u003C/p>\u003Cp style=\"line-height:3;\">GPTBots作為世界領(lǐng)先的企業(yè)級AI大語言模型應(yīng)用Agent平臺,為企業(yè)提供端到端的AI解決方案,將AI智能體應(yīng)用于客戶服務(wù)、企業(yè)搜索、數(shù)據(jù)洞察等場景。在企業(yè)AI應(yīng)用落地過程中,經(jīng)常遇到因為企業(yè)避免內(nèi)部敏感數(shù)據(jù)避免泄漏,無法使用模型廠商功能強大的AI大模型服務(wù)的問題,即使在企業(yè)內(nèi)部獨立部署模型推理服務(wù),也面臨著算力成本高、開源模型效果不穩(wěn)定、并發(fā)性能不足等諸多缺點。為此,GPTBots團隊在AI大語言模型應(yīng)用中敏感數(shù)據(jù)匿名化進行了深入的探索和實踐。\u003C/p>\u003Ch1>\u003Cstrong>數(shù)據(jù)匿名技術(shù)選型對比分析\u003C/strong>\u003C/h1>\u003Ch2>\u003Cstrong>presidio\u003C/strong>\u003Cstrong>組件介紹\u003C/strong>\u003C/h2>\u003Cp style=\"line-height:3;\">Presidio是由微軟開源的一款數(shù)據(jù)保護和匿名化軟件開發(fā)框架(https://github.com/microsoft/presidio),其名稱源自拉丁語“praesidium”,意為“保護”或“駐防”。Presidio旨在為文本和圖像中的個人可識別信息(PII)提供快速、上下文感知的識別與匿名化功能,廣泛應(yīng)用于金融、醫(yī)療、市場營銷和數(shù)據(jù)分析等領(lǐng)域。\u003C/p>\u003Cp style=\"line-height:3;\">Presidio由兩個核心組件構(gòu)成:Analyzer(分析器)和Anonymizer(匿名化器)。Analyzer利用命名實體識別(NER)、正則表達式、基于規(guī)則的邏輯以及校驗和等多種技術(shù),檢測文本中的PII實體,如姓名、電話號碼、信用卡號等。Anonymizer則通過替換、掩碼、加密等操作對檢測到的PII進行匿名化處理。Presidio支持多語言PII識別,并允許用戶通過API或代碼自定義識別器和匿名化邏輯,以適應(yīng)特定業(yè)務(wù)需求。\u003C/p>\u003Cp style=\"line-height:3;\">Presidio 的設(shè)計注重可擴展性和靈活性,支持Docker 和Kubernetes部署,能夠無縫集成到數(shù)據(jù)處理流水線中。此外,Presidio提供可逆匿名化功能,允許在特定場景下恢復(fù)原始數(shù)據(jù),適用于需要同時保護隱私和保留數(shù)據(jù)完整性的場景.\u003C/p>\u003Ch2>\u003Cstrong>對比分析\u003C/strong>\u003C/h2>\u003Cp style=\"line-height:3;\">以下是對Presidio與其他類似NER和匿名化組件(如Amazon Comprehend、Google DLP、Flair、spaCy)的優(yōu)缺點對比:\u003C/p>\u003Csection>\u003C/section>\u003Cp style=\"line-height:3;\">\u003Cimg src=\"https://sdkfiledl.jiguang.cn/public-picture/2025-06-10/551667/640.jpg\" style=\"max-width:100%;\" contenteditable=\"false\"/>\u003C/p>\u003Cp style=\"line-height:3;\">總結(jié):Presidio在開源性、靈活性和多語言支持方面具有顯著優(yōu)勢,特別適合需要高度定制化的場景。相比商業(yè)化產(chǎn)品(如Amazon Comprehend 和Google DLP), Presidio 成本更低且更透明;相比純NER 工具(如Flair 和spaCy), Presidio 提供完整的匿名化流水線,功能更全面。因此選擇Presidio框架作為構(gòu)成數(shù)據(jù)匿名功能的核心組件。\u003C/p>\u003Csection>\u003Csection>\u003Ch1>\u003Cstrong>Presidio介紹\u003C/strong>\u003C/h1>\u003Ch3>\u003Cstrong>Presidio 組件介紹\u003C/strong>\u003C/h3>\u003Cp>Presidio 提供了一個靈活、可擴展的框架,主要由以下核心組件構(gòu)成:\u003C/p>\u003Cp>1. \u003Cstrong>Analyzer(分析器)\u003C/strong>:\u003Cbr/>\u003C/p>\u003Cp>○ 功能:負責(zé)檢測和識別文本或圖像中的敏感信息(如姓名、信用卡號、電話號碼、地址等)。\u003C/p>\u003Cp>○ 工作原理:使用預(yù)定義或自定義的識別器(Recognizers),結(jié)合自然語言處理(NLP)、正則表達式、預(yù)訓(xùn)練模型等技術(shù),分析輸入數(shù)據(jù)并返回敏感實體的位置和置信度評分。\u003C/p>\u003Cp>○ 定制化:支持開發(fā)者創(chuàng)建特定類型的識別器,例如針對全角格式的信用卡號或特定地區(qū)的電話號碼。\u003C/p>\u003Cp>2. \u003Cstrong>Anonymizer(匿名化器)\u003C/strong>:\u003Cbr/>\u003C/p>\u003Cp>○ 功能:對分析器檢測到的敏感信息進行脫敏處理,例如將姓名替換為占位符(如 \u003Cperson>)、對信用卡號進行掩碼處理等。\u003C/person>\u003C/p>\u003Cp>○ 工作原理:根據(jù)配置的策略,執(zhí)行替換、掩碼或自定義脫敏操作,確保輸出數(shù)據(jù)不包含敏感信息。\u003C/p>\u003Cp>○ 定制化:支持通過 YAML 文件或代碼定義脫敏規(guī)則,例如指定替換字符或脫敏格式。\u003C/p>\u003Cp>3. \u003Cstrong>Image Redactor(圖像脫敏模塊)\u003C/strong>:\u003Cbr/>\u003C/p>\u003Cp>○ 功能:處理圖像中的敏感信息,使用光學(xué)字符識別(OCR)技術(shù)檢測圖像中的文本,并對敏感內(nèi)容進行編輯或遮蓋。\u003C/p>\u003Cp>○ 應(yīng)用場景:適用于掃描文檔、身份證照片等場景,生成脫敏后的圖像。\u003C/p>\u003Cp>○ 目前不太成熟,不建議在生產(chǎn)環(huán)境中使用,未來可以依賴多模態(tài)模型(multimodal-LLM)能力來解決。\u003C/p>\u003Cp>4. \u003Cstrong>Structured\u003C/strong>\u003Cstrong>(格式化數(shù)據(jù)模塊)\u003C/strong>\u003C/p>\u003Cp>○ 功能:擴展了 Presidio 的功能,專注于表格格式和半結(jié)構(gòu)化格式 (JSON) 等結(jié)構(gòu)化數(shù)據(jù)格式。它利用 Presidio-Analyzer 的檢測功能來識別包含個人身份信息 (PII) 的列或鍵,并在這些列/鍵名稱與檢測到的 PII 實體之間建立映射。檢測之后,Presidio-Anonymizer 用于對被識別為包含 PII 的列中的每個值應(yīng)用去識別技術(shù),確保敏感數(shù)據(jù)得到適當(dāng)?shù)谋Wo。\u003C/p>\u003Cp>○ 應(yīng)用場景:適用于json、表格、數(shù)據(jù)庫、數(shù)據(jù)倉庫等格式化批量數(shù)據(jù)的匿名。對AI大語言模型應(yīng)用場景較少。\u003C/p>\u003C/section>\u003C/section>\u003Ch2>presidio-analyzer\u003C/h2>\u003Csection>\u003C/section>\u003Ch3>\u003Cimg src=\"https://sdkfiledl.jiguang.cn/public-picture/2025-06-10/310797/640 (1).jpg\" style=\"max-width:100%;\" contenteditable=\"false\"/>\u003C/h3>\u003Cp style=\"line-height:3;\">\u003Cspan style=\"font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";\">analyzer引擎:spaCy、stanza、transformers\u003C/span>\u003C/p>\u003Cp style=\"line-height:3;\">Presidio 的Analyzer引擎是其PII識別核心,負責(zé)檢測文本中的敏感信息。它結(jié)合了多種技術(shù),包括命名實體識別(NER)、正則表達式、基于規(guī)則的邏輯以及校驗和上下文分析,以確保高精度識別。Analyzer支持以下主要NLP框架和模型:\u003C/p>\u003Csection>\u003Csection>\u003Cp>1. \u003Cstrong>spaCy\u003C/strong>\u003C/p>\u003Cp>○ \u003Cstrong>介紹\u003C/strong>:spaCy 是一個高效的開源 NLP 庫,廣泛用于 NER 任務(wù)。Presidio 默認使用 spaCy 的預(yù)訓(xùn)練模型(如 en_core_web_lg)來識別姓名、地點、組織等實體。\u003C/p>\u003Cp>○ \u003Cstrong>特點\u003C/strong>:\u003C/p>\u003Cp>■ 輕量級,速度快,適合實時應(yīng)用。\u003C/p>\u003Cp>■ 支持多語言模型,包括英語、中文、日語、韓語等。\u003C/p>\u003Cp>■ 通過上下文分析增強 PII 識別精度,例如區(qū)分普通詞匯和敏感實體的上下文。\u003C/p>\u003Cp>○ \u003Cstrong>局限性\u003C/strong>:\u003C/p>\u003Cp>■ 對于非標準或特定領(lǐng)域的 PII(如行業(yè)特定的編碼),需要自定義規(guī)則。\u003C/p>\u003Cp>2. \u003Cstrong>Stanza\u003C/strong>\u003C/p>\u003Cp>○ \u003Cstrong>介紹\u003C/strong>:Stanza 是由斯坦福大學(xué)開發(fā)的 NLP 庫,提供高質(zhì)量的 NER 模型,特別適合處理復(fù)雜的語言結(jié)構(gòu)。\u003C/p>\u003Cp>○ \u003Cstrong>特點\u003C/strong>:\u003C/p>\u003Cp>■ 支持多語言,包括低資源語言,比如阿拉伯語、泰語、緬甸語、越南語等小語種。\u003C/p>\u003Cp>■ 提供細粒度的 NER 標簽,適合需要高精度識別的場景。\u003C/p>\u003Cp>■ 集成深度學(xué)習(xí)模型,性能強勁。\u003C/p>\u003Cp>○ \u003Cstrong>局限性\u003C/strong>:\u003C/p>\u003Cp>■ 模型較大,部署可能需要更多資源。\u003C/p>\u003Cp>■ 對某些語言的支持可能不如 spaCy 成熟。\u003C/p>\u003Cp>3. \u003Cstrong>Transformers\u003C/strong>\u003C/p>\u003Cp>○ \u003Cstrong>介紹\u003C/strong>:Transformers 是 Hugging Face 提供的 NLP 庫,基于 Transformer 架構(gòu),支持 BERT、RoBERTa 等先進模型。\u003C/p>\u003Cp>○ \u003Cstrong>特點\u003C/strong>:\u003C/p>\u003Cp>■ 在 NER 任務(wù)上表現(xiàn)出色,準確率高。\u003C/p>\u003Cp>■ 支持微調(diào)自定義模型,以適應(yīng)特定領(lǐng)域的 PII 識別需求。\u003C/p>\u003Cp>■ 可以處理長文本和復(fù)雜上下文。\u003C/p>\u003Cp>○ \u003Cstrong>局限性\u003C/strong>:\u003C/p>\u003Cp>■ 計算資源需求較高,可能不適合資源受限的環(huán)境。\u003C/p>\u003Cp>■ 模型訓(xùn)練和微調(diào)需要專業(yè)知識。\u003C/p>\u003C/section>\u003C/section>\u003Cp style=\"line-height:3;\">Presidio的Analyzer引擎支持以上三種NLP框架,用戶可以根據(jù)具體需求選擇合適的引擎。例如,在需要高性能和準確率的場景下,可以選擇Transformers;而在資源受限或需要快速部署的場景下,spaCy是一個更好的選擇。\u003C/p>\u003Ch2>presidio-anonymizer\u003C/h2>\u003Csection>\u003C/section>\u003Ch3>\u003Cimg src=\"https://sdkfiledl.jiguang.cn/public-picture/2025-06-10/750788/640 (2).jpg\" style=\"max-width:100%;\" contenteditable=\"false\"/>\u003C/h3>\u003Cp style=\"line-height:3;\">\u003Cspan style=\"font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";\">anonymizer實現(xiàn)方法:replace、redact、hash、mask、encrypt、custom\u003C/span>\u003C/p>\u003Cp style=\"line-height:3;\">Presidio的Anonymizer組件提供了多種匿名化方法,允許用戶根據(jù)不同需求選擇合適的策略。這些方法包括:\u003C/p>\u003Csection>\u003Csection>\u003Csection>\u003C/section>\u003Cp>\u003Cimg src=\"https://sdkfiledl.jiguang.cn/public-picture/2025-06-10/325239/640 (3).jpg\" style=\"max-width:100%;\" contenteditable=\"false\"/>\u003C/p>\u003C/section>\u003C/section>\u003Cp style=\"line-height:3;\">Presidio的Anonymizer通過這些多樣的方法,為用戶提供了靈活且強大的數(shù)據(jù)保護工具,適用于各種不同場景的數(shù)據(jù)匿名化需求。\u003C/p>\u003Ch1>\u003Cstrong>探索和實踐\u003C/strong>\u003C/h1>\u003Cp style=\"line-height:3;\">為了實現(xiàn)數(shù)據(jù)匿名功能,GPTBots在平臺增加一個數(shù)據(jù)匿名子系統(tǒng),架構(gòu)如圖:\u003C/p>\u003Csection>\u003C/section>\u003Ch2>\u003Cimg src=\"https://sdkfiledl.jiguang.cn/public-picture/2025-06-10/832269/640 (4).jpg\" style=\"max-width:100%;\" contenteditable=\"false\"/>\u003C/h2>\u003Ch2>\u003Cstrong>流程簡述\u003C/strong>\u003C/h2>\u003Col>\u003Cli>\u003Cp>Agent服務(wù)在訪問模型廠商Maas服務(wù)之前,將content內(nèi)容通過api網(wǎng)關(guān)發(fā)送給Presidio-analyzer進行識別;\u003C/p>\u003C/li>\u003Cli>\u003Cp>Presidio-analyzer將識別結(jié)果返回給Agent服務(wù);\u003C/p>\u003C/li>\u003Cli>\u003Cp>Agent服務(wù)確認結(jié)果有效性后,將content原文和識別結(jié)果一起發(fā)送給Presidio-anonymizer進行匿名操作;\u003C/p>\u003C/li>\u003Cli>\u003Cp>Presidio-anonymizer將匿名后的結(jié)果返回給Agent服務(wù);\u003C/p>\u003C/li>\u003Cli>\u003Cp>Agent服務(wù)接收到匿名后的content結(jié)果,重新拼接為模型請求調(diào)用模型廠商的Maas服務(wù)實現(xiàn)模型推理;\u003C/p>\u003C/li>\u003Cli>\u003Cp>模型廠商返回推理結(jié)果后,按照匿名記錄進行還原操作,實現(xiàn)敏感數(shù)據(jù)的安全匿名AI推理。\u003C/p>\u003C/li>\u003C/ol>\u003Ch2>\u003Cstrong>analyzer關(guān)鍵代碼實現(xiàn)\u003C/strong>\u003C/h2>\u003Ch3>\u003Cstrong>軟件版本\u003C/strong>\u003C/h3>\u003Cp style=\"line-height:3;\">python版本:3.12\u003C/p>\u003Cp style=\"line-height:3;\">presidio版本:2.2.358\u003C/p>\u003Cp style=\"line-height:3;\">spaCy版本:3.8.2\u003C/p>\u003Cp style=\"line-height:3;\">stanza版本:1.10.1\u003C/p>\u003Cp style=\"line-height:3;\">一個簡單例子:\u003C/p>\u003Cp style=\"line-height:3;\">from presidio_analyzer import AnalyzerEngine, PatternRecognizer, Pattern\u003Cbr/>from presidio_analyzer.nlp_engine import NlpEngineProvider\u003Cbr/>from typing import List, Optional\u003Cbr/>from presidio_analyzer.recognizer_result import RecognizerResult\u003Cbr/>\u003Cbr/>#定義自定義識別器類\u003Cbr/>class CustomIDRecognizer(PatternRecognizer):\u003Cbr/> # 定義要識別的模式:假設(shè)是\"ID-\" 開頭,后面跟6 位數(shù)字\u003Cbr/> PATTERNS = [\u003Cbr/> Pattern(\u003Cbr/> name=\"custom_id_pattern\",\u003Cbr/> regex=r\"ID-\\d{6}\",\u003Cbr/> score=0.85 # 置信度分數(shù)\u003Cbr/> ),\u003Cbr/> ]\u003Cbr/>\u003Cbr/> # 上下文關(guān)鍵詞,增強識別準確性\u003Cbr/> CONTEXT = [\"id\", \"identifier\", \"number\"]\u003Cbr/>\u003Cbr/> def __init__(self, supported_language: str = \"en\"):\u003Cbr/> super().__init__(\u003Cbr/> supported_entity=\"CUSTOM_ID\",\u003Cbr/> patterns=self.PATTERNS,\u003Cbr/> context=self.CONTEXT,\u003Cbr/> supported_language=supported_language\u003Cbr/> )\u003Cbr/>\u003Cbr/> def invalidate_result(self, pattern_text: str) -> Optional[List[RecognizerResult]]:\u003Cbr/> \"\"\"\u003Cbr/> 可選:添加額外的驗證邏輯\u003Cbr/> 例如,檢查是否符合特定規(guī)則\u003Cbr/> \"\"\"\u003Cbr/> return None\u003Cbr/>\u003Cbr/>#主函數(shù)\u003Cbr/>def main():\u003Cbr/> # 創(chuàng)建NLP 引擎\u003Cbr/> configuration = {\u003Cbr/> \"nlp_engine_name\": \"spacy\",\u003Cbr/> \"models\": [{\"lang_code\": \"en\", \"model_name\": \"en_core_web_lg\"}],\u003Cbr/> }\u003Cbr/> provider = NlpEngineProvider(nlp_configuration=configuration)\u003Cbr/> nlp_engine = provider.create_engine()\u003Cbr/>\u003Cbr/> #初始化分析引擎并添加自定義識別器\u003Cbr/> analyzer = AnalyzerEngine(\u003Cbr/> nlp_engine=nlp_engine,\u003Cbr/> supported_languages=[\"en\"],\u003Cbr/> default_language=\"en\"\u003Cbr/> )\u003Cbr/> \u003Cbr/> #添加自定義識別器\u003Cbr/> custom_recognizer = CustomIDRecognizer()\u003Cbr/> analyzer.registry.add_recognizer(custom_recognizer)\u003Cbr/>\u003Cbr/> #測試文本\u003Cbr/> text = \"My custom ID is ID-123456 and another one is ID-987654.\"\u003Cbr/>\u003Cbr/> # 執(zhí)行分析\u003Cbr/> results = analyzer.analyze(\u003Cbr/> text=text,\u003Cbr/> language=\"en\",\u003Cbr/> entities=[\"CUSTOM_ID\"],\u003Cbr/> return_decision_process=True\u003Cbr/> )\u003Cbr/>\u003Cbr/> # 輸出結(jié)果\u003Cbr/> print(\"Analysis Results:\")\u003Cbr/> for result in results:\u003Cbr/> print(f\"- Entity: {result.entity_type}\")\u003Cbr/> print(f\" Text: {text[result.start:result.end]}\")\u003Cbr/> print(f\" Score: {result.score}\")\u003Cbr/> print(f\" Start: {result.start}, End: {result.end}\")\u003Cbr/> print(\"---\")\u003Cbr/>\u003Cbr/>if __name__ == \"__main__\":\u003Cbr/> main()\u003C/p>\u003Cp style=\"line-height:3;\">\u003Cbr/>\u003C/p>\u003Ch3>\u003Cstrong>api\u003C/strong>\u003Cstrong>部分\u003C/strong>\u003C/h3>\u003Cp style=\"line-height:3;\">AnalyzerRequest:識別請求協(xié)議\u003C/p>\u003Csection>\u003Csection>\u003Ctable>\u003Ctbody>\u003Ctr>\u003Ctd>\u003Cp>\u003Cstrong>PARAMETER\u003C/strong>\u003C/p>\u003C/td>\u003Ctd>\u003Cp>\u003Cstrong>DESCRIPTION\u003C/strong>\u003C/p>\u003C/td>\u003C/tr>\u003Ctr>\u003Ctd>\u003Cp>text\u003C/p>\u003C/td>\u003Ctd>\u003Cp>the text to analyze\u003C/p>\u003Cp>\u003Cstrong>TYPE:\u003C/strong> str\u003C/p>\u003C/td>\u003C/tr>\u003Ctr>\u003Ctd>\u003Cp>language\u003C/p>\u003C/td>\u003Ctd>\u003Cp>the language of the text\u003C/p>\u003Cp>\u003Cstrong>TYPE:\u003C/strong> str\u003C/p>\u003C/td>\u003C/tr>\u003Ctr>\u003Ctd>\u003Cp>entities\u003C/p>\u003C/td>\u003Ctd>\u003Cp>List of PII entities that should be looked for in the text. If entities=None then all entities are looked for.\u003C/p>\u003Cp>\u003Cstrong>TYPE:\u003C/strong> Optional[List[str]]\u003Cstrong>DEFAULT:\u003C/strong> None\u003C/p>\u003C/td>\u003C/tr>\u003Ctr>\u003Ctd>\u003Cp>correlation_id\u003C/p>\u003C/td>\u003Ctd>\u003Cp>cross call ID for this request\u003C/p>\u003Cp>\u003Cstrong>TYPE:\u003C/strong> Optional[str]\u003Cstrong>DEFAULT:\u003C/strong> None\u003C/p>\u003C/td>\u003C/tr>\u003Ctr>\u003Ctd>\u003Cp>score_threshold\u003C/p>\u003C/td>\u003Ctd>\u003Cp>A minimum value for which to return an identified entity\u003C/p>\u003Cp>\u003Cstrong>TYPE:\u003C/strong> Optional[float]\u003Cstrong>DEFAULT:\u003C/strong> None\u003C/p>\u003C/td>\u003C/tr>\u003Ctr>\u003Ctd>\u003Cp>return_decision_process\u003C/p>\u003C/td>\u003Ctd>\u003Cp>Whether the analysis decision process steps returned in the response.\u003C/p>\u003Cp>\u003Cstrong>TYPE:\u003C/strong> Optional[bool]\u003Cstrong>DEFAULT:\u003C/strong> False\u003C/p>\u003C/td>\u003C/tr>\u003Ctr>\u003Ctd>\u003Cp>ad_hoc_recognizers\u003C/p>\u003C/td>\u003Ctd>\u003Cp>List of recognizers which will be used only for this specific request.\u003C/p>\u003Cp>\u003Cstrong>TYPE:\u003C/strong> Optional[List[]]\u003Cstrong>DEFAULT:\u003C/strong> None\u003C/p>\u003C/td>\u003C/tr>\u003Ctr>\u003Ctd>\u003Cp>context\u003C/p>\u003C/td>\u003Ctd>\u003Cp>List of context words to enhance confidence score if matched with the recognized entity's recognizer context\u003C/p>\u003Cp>\u003Cstrong>TYPE:\u003C/strong> Optional[List[str]]\u003Cstrong>DEFAULT:\u003C/strong> None\u003C/p>\u003C/td>\u003C/tr>\u003Ctr>\u003Ctd>\u003Cp>allow_list\u003C/p>\u003C/td>\u003Ctd>\u003Cp>List of words that the user defines as being allowed to keep in the text\u003C/p>\u003Cp>\u003Cstrong>TYPE:\u003C/strong> Optional[List[str]]\u003Cstrong>DEFAULT:\u003C/strong> None\u003C/p>\u003C/td>\u003C/tr>\u003Ctr>\u003Ctd>\u003Cp>allow_list_match\u003C/p>\u003C/td>\u003Ctd>\u003Cp>How the allow_list should be interpreted; either as \"exact\" or as \"regex\". - If regex, results which match with any regex condition in the allow_list would be allowed and not be returned as potential PII. - if exact, results which exactly match any value in the allow_list would be allowed and not be returned as potential PII.\u003C/p>\u003Cp>\u003Cstrong>TYPE:\u003C/strong> Optional[str]\u003Cstrong>DEFAULT:\u003C/strong> 'exact'\u003C/p>\u003C/td>\u003C/tr>\u003Ctr>\u003Ctd>\u003Cp>regex_flags\u003C/p>\u003C/td>\u003Ctd>\u003Cp>regex flags to be used for when allow_list_match is \"regex\"\u003C/p>\u003Cp>\u003Cstrong>TYPE:\u003C/strong> Optional[int]\u003Cstrong>DEFAULT:\u003C/strong> DOTALL | MULTILINE | IGNORECASE\u003C/p>\u003C/td>\u003C/tr>\u003C/tbody>\u003C/table>\u003Cp>\u003Cbr/>\u003C/p>\u003C/section>\u003C/section>\u003Cp style=\"line-height:3;\">請求舉例:\u003C/p>\u003Cp style=\"line-height:3;\">curl -X POST http://localhost:5002/analyze \\\u003Cbr/>-H \"Content-Type: application/json\" \\\u003Cbr/>-d '{\u003Cbr/> \"text\": \"我的名字是張偉,電話號碼是138-1234-5678,身份證:371427111111111111,銀行卡號:6214111111111111,ip地址:1.1.1.1,username:testuser,password:123456789pw,住在北京市朝陽區(qū)。\",\u003Cbr/> \"language\": \"zh\"\u003Cbr/>}'\u003C/p>\u003Cp style=\"line-height:3;\">返回結(jié)果:\u003C/p>\u003Cp style=\"line-height:3;\">[\u003Cbr/> {\u003Cbr/> \"analysis_explanation\": null,\u003Cbr/> \"end\": 71,\u003Cbr/> \"entity_type\": \"CREDIT_CARD\",\u003Cbr/> \"recognition_metadata\":\u003Cbr/> {\u003Cbr/> \"recognizer_identifier\": \"ZhCreditCardRecognizer_139805391664224\",\u003Cbr/> \"recognizer_name\": \"ZhCreditCardRecognizer\"\u003Cbr/> },\u003Cbr/> \"score\": 1.0,\u003Cbr/> \"start\": 55\u003Cbr/> },\u003Cbr/> {\u003Cbr/> \"analysis_explanation\": null,\u003Cbr/> \"end\": 84,\u003Cbr/> \"entity_type\": \"IP_ADDRESS\",\u003Cbr/> \"recognition_metadata\":\u003Cbr/> {\u003Cbr/> \"recognizer_identifier\": \"ZhIpRecognizer_139805391663648\",\u003Cbr/> \"recognizer_name\": \"ZhIpRecognizer\"\u003Cbr/> },\u003Cbr/> \"score\": 1.0,\u003Cbr/> \"start\": 77\u003Cbr/> },\u003Cbr/> {\u003Cbr/> \"analysis_explanation\": null,\u003Cbr/> \"end\": 25,\u003Cbr/> \"entity_type\": \"CHINA_MOBILE_NUMBER\",\u003Cbr/> \"recognition_metadata\":\u003Cbr/> {\u003Cbr/> \"recognizer_identifier\": \"PatternRecognizer_139805391666000\",\u003Cbr/> \"recognizer_name\": \"PatternRecognizer\"\u003Cbr/> },\u003Cbr/> \"score\": 0.8500000000000001,\u003Cbr/> \"start\": 13\u003Cbr/> },\u003Cbr/> {\u003Cbr/> \"analysis_explanation\": null,\u003Cbr/> \"end\": 26,\u003Cbr/> \"entity_type\": \"CHINA_LANDLINE_NUMBER\",\u003Cbr/> \"recognition_metadata\":\u003Cbr/> {\u003Cbr/> \"recognizer_identifier\": \"PatternRecognizer_139805391666288\",\u003Cbr/> \"recognizer_name\": \"PatternRecognizer\"\u003Cbr/> },\u003Cbr/> \"score\": 0.8500000000000001,\u003Cbr/> \"start\": 14\u003Cbr/> },\u003Cbr/> {\u003Cbr/> \"analysis_explanation\": null,\u003Cbr/> \"end\": 93,\u003Cbr/> \"entity_type\": \"USERNAME\",\u003Cbr/> \"recognition_metadata\":\u003Cbr/> {\u003Cbr/> \"recognizer_identifier\": \"PatternRecognizer_139805391667104\",\u003Cbr/> \"recognizer_name\": \"PatternRecognizer\"\u003Cbr/> },\u003Cbr/> \"score\": 0.8500000000000001,\u003Cbr/> \"start\": 85\u003Cbr/> },\u003Cbr/> {\u003Cbr/> \"analysis_explanation\": null,\u003Cbr/> \"end\": 102,\u003Cbr/> \"entity_type\": \"USERNAME\",\u003Cbr/> \"recognition_metadata\":\u003Cbr/> {\u003Cbr/> \"recognizer_identifier\": \"PatternRecognizer_139805391667104\",\u003Cbr/> \"recognizer_name\": \"PatternRecognizer\"\u003Cbr/> },\u003Cbr/> \"score\": 0.8500000000000001,\u003Cbr/> \"start\": 94\u003Cbr/> },\u003Cbr/> {\u003Cbr/> \"analysis_explanation\": null,\u003Cbr/> \"end\": 111,\u003Cbr/> \"entity_type\": \"PASSWORD\",\u003Cbr/> \"recognition_metadata\":\u003Cbr/> {\u003Cbr/> \"recognizer_identifier\": \"PatternRecognizer_139805391666768\",\u003Cbr/> \"recognizer_name\": \"PatternRecognizer\"\u003Cbr/> },\u003Cbr/> \"score\": 0.8500000000000001,\u003Cbr/> \"start\": 103\u003Cbr/> },\u003Cbr/> {\u003Cbr/> \"analysis_explanation\": null,\u003Cbr/> \"end\": 111,\u003Cbr/> \"entity_type\": \"USERNAME\",\u003Cbr/> \"recognition_metadata\":\u003Cbr/> {\u003Cbr/> \"recognizer_identifier\": \"PatternRecognizer_139805391667104\",\u003Cbr/> \"recognizer_name\": \"PatternRecognizer\"\u003Cbr/> },\u003Cbr/> \"score\": 0.8500000000000001,\u003Cbr/> \"start\": 103\u003Cbr/> },\u003Cbr/> {\u003Cbr/> \"analysis_explanation\": null,\u003Cbr/> \"end\": 123,\u003Cbr/> \"entity_type\": \"PASSWORD\",\u003Cbr/> \"recognition_metadata\":\u003Cbr/> {\u003Cbr/> \"recognizer_identifier\": \"PatternRecognizer_139805391666768\",\u003Cbr/> \"recognizer_name\": \"PatternRecognizer\"\u003Cbr/> },\u003Cbr/> \"score\": 0.8500000000000001,\u003Cbr/> \"start\": 112\u003Cbr/> },\u003Cbr/> {\u003Cbr/> \"analysis_explanation\": null,\u003Cbr/> \"end\": 123,\u003Cbr/> \"entity_type\": \"USERNAME\",\u003Cbr/> \"recognition_metadata\":\u003Cbr/> {\u003Cbr/> \"recognizer_identifier\": \"PatternRecognizer_139805391667104\",\u003Cbr/> \"recognizer_name\": \"PatternRecognizer\"\u003Cbr/> },\u003Cbr/> \"score\": 0.8500000000000001,\u003Cbr/> \"start\": 112\u003Cbr/> },\u003Cbr/> {\u003Cbr/> \"analysis_explanation\": null,\u003Cbr/> \"end\": 7,\u003Cbr/> \"entity_type\": \"PERSON\",\u003Cbr/> \"recognition_metadata\":\u003Cbr/> {\u003Cbr/> \"recognizer_identifier\": \"SpacyRecognizer_139805460569152\",\u003Cbr/> \"recognizer_name\": \"SpacyRecognizer\"\u003Cbr/> },\u003Cbr/> \"score\": 0.85,\u003Cbr/> \"start\": 5\u003Cbr/> },\u003Cbr/> {\u003Cbr/> \"analysis_explanation\": null,\u003Cbr/> \"end\": 132,\u003Cbr/> \"entity_type\": \"LOCATION\",\u003Cbr/> \"recognition_metadata\":\u003Cbr/> {\u003Cbr/> \"recognizer_identifier\": \"SpacyRecognizer_139805460569152\",\u003Cbr/> \"recognizer_name\": \"SpacyRecognizer\"\u003Cbr/> },\u003Cbr/> \"score\": 0.85,\u003Cbr/> \"start\": 126\u003Cbr/> },\u003Cbr/> {\u003Cbr/> \"analysis_explanation\": null,\u003Cbr/> \"end\": 26,\u003Cbr/> \"entity_type\": \"USERNAME\",\u003Cbr/> \"recognition_metadata\":\u003Cbr/> {\u003Cbr/> \"recognizer_identifier\": \"PatternRecognizer_139805391667104\",\u003Cbr/> \"recognizer_name\": \"PatternRecognizer\"\u003Cbr/> },\u003Cbr/> \"score\": 0.4,\u003Cbr/> \"start\": 13\u003Cbr/> },\u003Cbr/> {\u003Cbr/> \"analysis_explanation\": null,\u003Cbr/> \"end\": 26,\u003Cbr/> \"entity_type\": \"PASSWORD\",\u003Cbr/> \"recognition_metadata\":\u003Cbr/> {\u003Cbr/> \"recognizer_identifier\": \"PatternRecognizer_139805391666768\",\u003Cbr/> \"recognizer_name\": \"PatternRecognizer\"\u003Cbr/> },\u003Cbr/> \"score\": 0.4,\u003Cbr/> \"start\": 13\u003Cbr/> },\u003Cbr/> {\u003Cbr/> \"analysis_explanation\": null,\u003Cbr/> \"end\": 49,\u003Cbr/> \"entity_type\": \"PASSWORD\",\u003Cbr/> \"recognition_metadata\":\u003Cbr/> {\u003Cbr/> \"recognizer_identifier\": \"PatternRecognizer_139805391666768\",\u003Cbr/> \"recognizer_name\": \"PatternRecognizer\"\u003Cbr/> },\u003Cbr/> \"score\": 0.4,\u003Cbr/> \"start\": 31\u003Cbr/> },\u003Cbr/> {\u003Cbr/> \"analysis_explanation\": null,\u003Cbr/> \"end\": 49,\u003Cbr/> \"entity_type\": \"USERNAME\",\u003Cbr/> \"recognition_metadata\":\u003Cbr/> {\u003Cbr/> \"recognizer_identifier\": \"PatternRecognizer_139805391667104\",\u003Cbr/> \"recognizer_name\": \"PatternRecognizer\"\u003Cbr/> },\u003Cbr/> \"score\": 0.4,\u003Cbr/> \"start\": 31\u003Cbr/> },\u003Cbr/> {\u003Cbr/> \"analysis_explanation\": null,\u003Cbr/> \"end\": 43,\u003Cbr/> \"entity_type\": \"CHINA_LANDLINE_NUMBER\",\u003Cbr/> \"recognition_metadata\":\u003Cbr/> {\u003Cbr/> \"recognizer_identifier\": \"PatternRecognizer_139805391666288\",\u003Cbr/> \"recognizer_name\": \"PatternRecognizer\"\u003Cbr/> },\u003Cbr/> \"score\": 0.4,\u003Cbr/> \"start\": 31\u003Cbr/> },\u003Cbr/> {\u003Cbr/> \"analysis_explanation\": null,\u003Cbr/> \"end\": 40,\u003Cbr/> \"entity_type\": \"TAIWAN_LANDLINE_NUMBER\",\u003Cbr/> \"recognition_metadata\":\u003Cbr/> {\u003Cbr/> \"recognizer_identifier\": \"PatternRecognizer_139805391665712\",\u003Cbr/> \"recognizer_name\": \"PatternRecognizer\"\u003Cbr/> },\u003Cbr/> \"score\": 0.4,\u003Cbr/> \"start\": 31\u003Cbr/> },\u003Cbr/> {\u003Cbr/> \"analysis_explanation\": null,\u003Cbr/> \"end\": 39,\u003Cbr/> \"entity_type\": \"HONGKONG_LANDLINE_NUMBER\",\u003Cbr/> \"recognition_metadata\":\u003Cbr/> {\u003Cbr/> \"recognizer_identifier\": \"PatternRecognizer_139805391665232\",\u003Cbr/> \"recognizer_name\": \"PatternRecognizer\"\u003Cbr/> },\u003Cbr/> \"score\": 0.4,\u003Cbr/> \"start\": 31\u003Cbr/> },\u003Cbr/> {\u003Cbr/> \"analysis_explanation\": null,\u003Cbr/> \"end\": 40,\u003Cbr/> \"entity_type\": \"HONGKONG_MOBILE_NUMBER\",\u003Cbr/> \"recognition_metadata\":\u003Cbr/> {\u003Cbr/> \"recognizer_identifier\": \"PatternRecognizer_139805391665568\",\u003Cbr/> \"recognizer_name\": \"PatternRecognizer\"\u003Cbr/> },\u003Cbr/> \"score\": 0.4,\u003Cbr/> \"start\": 32\u003Cbr/> },\u003Cbr/> {\u003Cbr/> \"analysis_explanation\": null,\u003Cbr/> \"end\": 49,\u003Cbr/> \"entity_type\": \"CHINA_PASSPORT\",\u003Cbr/> \"recognition_metadata\":\u003Cbr/> {\u003Cbr/> \"recognizer_identifier\": \"ChinesePassportRecognizer_139805391663456\",\u003Cbr/> \"recognizer_name\": \"ChinesePassportRecognizer\"\u003Cbr/> },\u003Cbr/> \"score\": 0.4,\u003Cbr/> \"start\": 40\u003Cbr/> },\u003Cbr/> {\u003Cbr/> \"analysis_explanation\": null,\u003Cbr/> \"end\": 71,\u003Cbr/> \"entity_type\": \"USERNAME\",\u003Cbr/> \"recognition_metadata\":\u003Cbr/> {\u003Cbr/> \"recognizer_identifier\": \"PatternRecognizer_139805391667104\",\u003Cbr/> \"recognizer_name\": \"PatternRecognizer\"\u003Cbr/> },\u003Cbr/> \"score\": 0.4,\u003Cbr/> \"start\": 55\u003Cbr/> },\u003Cbr/> {\u003Cbr/> \"analysis_explanation\": null,\u003Cbr/> \"end\": 71,\u003Cbr/> \"entity_type\": \"PASSWORD\",\u003Cbr/> \"recognition_metadata\":\u003Cbr/> {\u003Cbr/> \"recognizer_identifier\": \"PatternRecognizer_139805391666768\",\u003Cbr/> \"recognizer_name\": \"PatternRecognizer\"\u003Cbr/> },\u003Cbr/> \"score\": 0.4,\u003Cbr/> \"start\": 55\u003Cbr/> },\u003Cbr/> {\u003Cbr/> \"analysis_explanation\": null,\u003Cbr/> \"end\": 67,\u003Cbr/> \"entity_type\": \"CHINA_LANDLINE_NUMBER\",\u003Cbr/> \"recognition_metadata\":\u003Cbr/> {\u003Cbr/> \"recognizer_identifier\": \"PatternRecognizer_139805391666288\",\u003Cbr/> \"recognizer_name\": \"PatternRecognizer\"\u003Cbr/> },\u003Cbr/> \"score\": 0.4,\u003Cbr/> \"start\": 55\u003Cbr/> },\u003Cbr/> {\u003Cbr/> \"analysis_explanation\": null,\u003Cbr/> \"end\": 64,\u003Cbr/> \"entity_type\": \"TAIWAN_LANDLINE_NUMBER\",\u003Cbr/> \"recognition_metadata\":\u003Cbr/> {\u003Cbr/> \"recognizer_identifier\": \"PatternRecognizer_139805391665712\",\u003Cbr/> \"recognizer_name\": \"PatternRecognizer\"\u003Cbr/> },\u003Cbr/> \"score\": 0.4,\u003Cbr/> \"start\": 55\u003Cbr/> },\u003Cbr/> {\u003Cbr/> \"analysis_explanation\": null,\u003Cbr/> \"end\": 63,\u003Cbr/> \"entity_type\": \"HONGKONG_MOBILE_NUMBER\",\u003Cbr/> \"recognition_metadata\":\u003Cbr/> {\u003Cbr/> \"recognizer_identifier\": \"PatternRecognizer_139805391665568\",\u003Cbr/> \"recognizer_name\": \"PatternRecognizer\"\u003Cbr/> },\u003Cbr/> \"score\": 0.4,\u003Cbr/> \"start\": 55\u003Cbr/> },\u003Cbr/> {\u003Cbr/> \"analysis_explanation\": null,\u003Cbr/> \"end\": 64,\u003Cbr/> \"entity_type\": \"HONGKONG_LANDLINE_NUMBER\",\u003Cbr/> \"recognition_metadata\":\u003Cbr/> {\u003Cbr/> \"recognizer_identifier\": \"PatternRecognizer_139805391665232\",\u003Cbr/> \"recognizer_name\": \"PatternRecognizer\"\u003Cbr/> },\u003Cbr/> \"score\": 0.4,\u003Cbr/> \"start\": 56\u003Cbr/> },\u003Cbr/> {\u003Cbr/> \"analysis_explanation\": null,\u003Cbr/> \"end\": 71,\u003Cbr/> \"entity_type\": \"CHINA_PASSPORT\",\u003Cbr/> \"recognition_metadata\":\u003Cbr/> {\u003Cbr/> \"recognizer_identifier\": \"ChinesePassportRecognizer_139805391663456\",\u003Cbr/> \"recognizer_name\": \"ChinesePassportRecognizer\"\u003Cbr/> },\u003Cbr/> \"score\": 0.4,\u003Cbr/> \"start\": 62\u003Cbr/> },\u003Cbr/> {\u003Cbr/> \"analysis_explanation\": null,\u003Cbr/> \"end\": 84,\u003Cbr/> \"entity_type\": \"PASSWORD\",\u003Cbr/> \"recognition_metadata\":\u003Cbr/> {\u003Cbr/> \"recognizer_identifier\": \"PatternRecognizer_139805391666768\",\u003Cbr/> \"recognizer_name\": \"PatternRecognizer\"\u003Cbr/> },\u003Cbr/> \"score\": 0.4,\u003Cbr/> \"start\": 77\u003Cbr/> },\u003Cbr/> {\u003Cbr/> \"analysis_explanation\": null,\u003Cbr/> \"end\": 84,\u003Cbr/> \"entity_type\": \"USERNAME\",\u003Cbr/> \"recognition_metadata\":\u003Cbr/> {\u003Cbr/> \"recognizer_identifier\": \"PatternRecognizer_139805391667104\",\u003Cbr/> \"recognizer_name\": \"PatternRecognizer\"\u003Cbr/> },\u003Cbr/> \"score\": 0.4,\u003Cbr/> \"start\": 77\u003Cbr/> },\u003Cbr/> {\u003Cbr/> \"analysis_explanation\": null,\u003Cbr/> \"end\": 93,\u003Cbr/> \"entity_type\": \"PASSWORD\",\u003Cbr/> \"recognition_metadata\":\u003Cbr/> {\u003Cbr/> \"recognizer_identifier\": \"PatternRecognizer_139805391666768\",\u003Cbr/> \"recognizer_name\": \"PatternRecognizer\"\u003Cbr/> },\u003Cbr/> \"score\": 0.4,\u003Cbr/> \"start\": 85\u003Cbr/> },\u003Cbr/> {\u003Cbr/> \"analysis_explanation\": null,\u003Cbr/> \"end\": 102,\u003Cbr/> \"entity_type\": \"PASSWORD\",\u003Cbr/> \"recognition_metadata\":\u003Cbr/> {\u003Cbr/> \"recognizer_identifier\": \"PatternRecognizer_139805391666768\",\u003Cbr/> \"recognizer_name\": \"PatternRecognizer\"\u003Cbr/> },\u003Cbr/> \"score\": 0.4,\u003Cbr/> \"start\": 94\u003Cbr/> },\u003Cbr/> {\u003Cbr/> \"analysis_explanation\": null,\u003Cbr/> \"end\": 121,\u003Cbr/> \"entity_type\": \"CHINA_LANDLINE_NUMBER\",\u003Cbr/> \"recognition_metadata\":\u003Cbr/> {\u003Cbr/> \"recognizer_identifier\": \"PatternRecognizer_139805391666288\",\u003Cbr/> \"recognizer_name\": \"PatternRecognizer\"\u003Cbr/> },\u003Cbr/> \"score\": 0.4,\u003Cbr/> \"start\": 112\u003Cbr/> },\u003Cbr/> {\u003Cbr/> \"analysis_explanation\": null,\u003Cbr/> \"end\": 121,\u003Cbr/> \"entity_type\": \"HONGKONG_LANDLINE_NUMBER\",\u003Cbr/> \"recognition_metadata\":\u003Cbr/> {\u003Cbr/> \"recognizer_identifier\": \"PatternRecognizer_139805391665232\",\u003Cbr/> \"recognizer_name\": \"PatternRecognizer\"\u003Cbr/> },\u003Cbr/> \"score\": 0.4,\u003Cbr/> \"start\": 113\u003Cbr/> },\u003Cbr/> {\u003Cbr/> \"analysis_explanation\": null,\u003Cbr/> \"end\": 121,\u003Cbr/> \"entity_type\": \"TAIWAN_LANDLINE_NUMBER\",\u003Cbr/> \"recognition_metadata\":\u003Cbr/> {\u003Cbr/> \"recognizer_identifier\": \"PatternRecognizer_139805391665712\",\u003Cbr/> \"recognizer_name\": \"PatternRecognizer\"\u003Cbr/> },\u003Cbr/> \"score\": 0.4,\u003Cbr/> \"start\": 113\u003Cbr/> }\u003Cbr/>]\u003C/p>\u003Cp style=\"line-height:3;\">api在官網(wǎng)presidio-analyzer/app.py基礎(chǔ)上,優(yōu)化并擴充了功能接口,包括:\u003C/p>\u003Col>\u003Cli>\u003Cp>registry_recognizer接口,實現(xiàn)客戶自定義recognizer;\u003C/p>\u003C/li>\u003Cli>\u003Cp>remove_recognizer接口,實現(xiàn)移除客戶自定義recognizer;\u003C/p>\u003C/li>\u003Cli>\u003Cp>為模型添加預(yù)置自定義recognizer,比如EMAIL,采用正則表達式來識別;\u003C/p>\u003C/li>\u003Cli>\u003Cp>添加多種analyzer引擎,spaCy、stanza、transformers并存,可以支持不同場景的識別;\u003C/p>\u003C/li>\u003C/ol>\u003Cp style=\"line-height:3;\"># -*- coding: utf-8 -*-\u003Cbr/>\"\"\"REST API server for analyzer.\"\"\"\u003Cbr/>import json\u003Cbr/>import logging\u003Cbr/>import os\u003Cbr/>import ipaddress\u003Cbr/>import re\u003Cbr/>from logging.config import fileConfig\u003Cbr/>from pathlib import Path\u003Cbr/>from typing import Tuple,List,Optional,Dict,Literal\u003Cbr/>\u003Cbr/>\u003Cbr/>from flask import Flask, Response, jsonify, request\u003Cbr/>from presidio_analyzer import AnalyzerEngine, AnalyzerEngineProvider, AnalyzerRequest\u003Cbr/>from werkzeug.exceptions import HTTPException\u003Cbr/>\u003Cbr/>DEFAULT_PORT = \"3000\"\u003Cbr/>\u003Cbr/>LOGGING_CONF_FILE = \"logging.ini\"\u003Cbr/>\u003Cbr/>WELCOME_MESSAGE = r\"\"\"\u003Cbr/>\u003Cbr/>\u003Cbr/>\u003Cbr/>_______ _______ _______ _______ _________ ______ _________ _______\u003Cbr/>( ____ )( ____ )( ____ \\( ____ \\\\__ __/( __ \\ \\__ __/( ___ )\u003Cbr/>| ( )|| ( )|| ( \\/| ( \\/ ) ( | ( \\ ) ) ( | ( ) |\u003Cbr/>| (____)|| (____)|| (__ | (_____ | | | | ) | | | | | | |\u003Cbr/>| _____)| __)| __) (_____ ) | | | | | | | | | | | |\u003Cbr/>| ( | (\\ ( | ( ) | | | | | ) | | | | | | |\u003Cbr/>| ) | ) \\ \\__| (____/\\/\\____) |___) (___| (__/ )___) (___| (___) |\u003Cbr/>|/ |/ \\__/(_______/\\_______)\\_______/(______/ \\_______/(_______)\u003Cbr/>\"\"\"\u003Cbr/>\u003Cbr/>class RegistryRecognizerRequest:\u003Cbr/>\u003Cbr/> def __init__(self, req_data: Dict):\u003Cbr/> self.entity = req_data.get(\"entity\")\u003Cbr/> self.language = req_data.get(\"language\")\u003Cbr/> self.regex = req_data.get(\"regex\")\u003Cbr/> self.context = req_data.get(\"context\")\u003Cbr/> self.deny_list = req_data.get(\"deny_list\")\u003Cbr/> \u003Cbr/>class RemoteRecognizerRequest:\u003Cbr/>\u003Cbr/> def __init__(self, req_data: Dict):\u003Cbr/> self.entity = req_data.get(\"entity\")\u003Cbr/> self.language = req_data.get(\"language\")\u003Cbr/> \u003Cbr/>class Server:\u003Cbr/> \"\"\"HTTP Server for calling Presidio Analyzer.\"\"\"\u003Cbr/>\u003Cbr/> def __init__(self):\u003Cbr/> fileConfig(Path(Path(__file__).parent, LOGGING_CONF_FILE))\u003Cbr/> self.logger = logging.getLogger(\"presidio-analyzer\")\u003Cbr/> #self.logger.setLevel(os.environ.get(\"LOG_LEVEL\", self.logger.level))\u003Cbr/> self.logger.setLevel(\"DEBUG\")\u003Cbr/> self.app = Flask(__name__)\u003Cbr/>\u003Cbr/> #nlp默認spacy引擎\u003Cbr/> analyzer_conf_file = os.environ.get(\"ANALYZER_CONF_FILE\")\u003Cbr/> nlp_engine_conf_file = os.environ.get(\"NLP_CONF_FILE\")\u003Cbr/> recognizer_registry_conf_file = os.environ.get(\"RECOGNIZER_REGISTRY_CONF_FILE\")\u003Cbr/> \u003Cbr/> #增加stanza引擎 對小語種的支持https://stanfordnlp.github.io/stanza/ner_models.html\u003Cbr/> stanza_nlp_engine_conf_file = os.environ.get(\"STANZA_NLP_CONF_FILE\")\u003Cbr/>\u003Cbr/> # spacy nlp\u003Cbr/> self.logger.info(\"Starting analyzer engine(spacy)\")\u003Cbr/> self.engine: AnalyzerEngine = AnalyzerEngineProvider(\u003Cbr/> analyzer_engine_conf_file=analyzer_conf_file,\u003Cbr/> nlp_engine_conf_file=nlp_engine_conf_file,\u003Cbr/> recognizer_registry_conf_file=recognizer_registry_conf_file\u003Cbr/> ).create_engine()\u003Cbr/> self.engine.context_aware_enhancer = LemmaContextAwareEnhancer(\u003Cbr/> context_similarity_factor=0.45, min_score_with_context_similarity=0.35\u003Cbr/> )\u003Cbr/> \u003Cbr/> # stanza nlp\u003Cbr/> self.logger.info(\"Starting analyzer engine(stanza)\")\u003Cbr/> self.stanza_engine: AnalyzerEngine = AnalyzerEngineProvider(\u003Cbr/> analyzer_engine_conf_file=analyzer_conf_file,\u003Cbr/> nlp_engine_conf_file=stanza_nlp_engine_conf_file,\u003Cbr/> recognizer_registry_conf_file=recognizer_registry_conf_file\u003Cbr/> ).create_engine()\u003Cbr/> \u003Cbr/> self.stanza_engine.context_aware_enhancer = LemmaContextAwareEnhancer(\u003Cbr/> context_similarity_factor=0.45, min_score_with_context_similarity=0.35\u003Cbr/> )\u003Cbr/>\u003Cbr/> ## 為zh模型自定義recognizer\u003Cbr/> # 創(chuàng)建電子郵件地址識別器\u003Cbr/> email_recognizer = PatternRecognizer(\u003Cbr/> supported_entity=\"EMAIL_ADDRESS\",\u003Cbr/> patterns=[email_pattern],\u003Cbr/> supported_language=\"zh\",\u003Cbr/> context=[\"郵箱\", \"電子郵件\", \"聯(lián)系方式\",\"mail\",\"email\"] # 添加中文上下文關(guān)鍵詞以提高準確性\u003Cbr/> )\u003Cbr/> self.engine.registry.add_recognizer(email_recognizer)\u003Cbr/> \u003Cbr/> ## end\u003Cbr/> self.logger.info(WELCOME_MESSAGE)\u003Cbr/>\u003Cbr/> @self.app.route(\"/health\")\u003Cbr/> def health() -> str:\u003Cbr/> \"\"\"Return basic health probe result.\"\"\"\u003Cbr/> return \"Presidio Analyzer service is up\"\u003Cbr/> @self.app.route(\"/remove_recognizer\", methods=[\"POST\"])\u003Cbr/> def remove_recognizer() -> str:\u003Cbr/> \"\"\"Remove a recognizer.\"\"\"\u003Cbr/> try:\u003Cbr/> req_data = RemoteRecognizerRequest(request.get_json())\u003Cbr/> if not req_data.entity:\u003Cbr/> raise Exception(\"No entity provided\")\u003Cbr/>\u003Cbr/> if not req_data.language or isinstance(req_data.language,list) is False:\u003Cbr/> raise Exception(\"No language provided, it must be of array type.\")\u003Cbr/> \u003Cbr/> # 存在先刪除\u003Cbr/> nlp_engine.registry.remove_recognizer(req_data.entity,req_data.language)\u003Cbr/> \u003Cbr/> except Exception as e:\u003Cbr/> self.logger.error(\u003Cbr/> f\"Error occurred while calling the interface remove_recognizer. {e}\"\u003Cbr/> )\u003Cbr/> return jsonify(error=e.args[0]), 500\u003Cbr/> return \"Remove successfully\"\u003Cbr/> \u003Cbr/> @self.app.route(\"/registry_recognizer\", methods=[\"POST\"])\u003Cbr/> def registry_recognizer() -> str:\u003Cbr/> \"\"\"Registry a recognizer.\"\"\"\u003Cbr/> try:\u003Cbr/> req_data = RegistryRecognizerRequest(request.get_json())\u003Cbr/> if not req_data.entity:\u003Cbr/> raise Exception(\"No entity provided\")\u003Cbr/>\u003Cbr/> if not req_data.language or isinstance(req_data.language,list) is False:\u003Cbr/> raise Exception(\"No language provided, it must be of array type.\")\u003Cbr/> \u003Cbr/> if not req_data.regex:\u003Cbr/> raise Exception(\"No regex provided\")\u003Cbr/> \u003Cbr/> if is_valid_regex(req_data.regex) is False:\u003Cbr/> raise Exception(f\"Invalid regex({req_data.regex})\")\u003Cbr/> \u003Cbr/> if req_data.context and isinstance(req_data.language,list) is False:\u003Cbr/> raise Exception(\"Context must be of array type.\")\u003Cbr/> \u003Cbr/> if req_data.deny_list and isinstance(req_data.deny_list,list) is False:\u003Cbr/> raise Exception(\"Deny_list must be of array type.\")\u003Cbr/> \u003Cbr/> # 存在先刪除\u003Cbr/> nlp_engine.registry.remove_recognizer(req_data.entity,req_data.language)\u003Cbr/>\u003Cbr/> pattern = Pattern(\u003Cbr/> name=custom_entity,\u003Cbr/> regex=req_data.regex,\u003Cbr/> score=0.4\u003Cbr/> )\u003Cbr/> # 創(chuàng)建新的recognizer并注冊\u003Cbr/> custom_recognizer = PatternRecognizer(\u003Cbr/> supported_entity=custom_entity,\u003Cbr/> patterns=[pattern],\u003Cbr/> supported_language=l,\u003Cbr/> context=req_data.context, # 添加中文上下文關(guān)鍵詞以提高準確性\u003Cbr/> deny_list=req_data.deny_list, # deny list代表根據(jù)關(guān)鍵字列表進行替換 字符串精準查詢替換 score=1\u003Cbr/> )\u003Cbr/> self.engine.registry.add_recognizer(custom_recognizer) \u003Cbr/> \u003Cbr/> except Exception as e:\u003Cbr/> self.logger.error(\u003Cbr/> f\"Error occurred while calling the interface registry_recognizer. {e}\"\u003Cbr/> )\u003Cbr/> return jsonify(error=e.args[0]), 500\u003Cbr/> return \"Registered successfully\"\u003Cbr/> \u003Cbr/> @self.app.route(\"/analyze\", methods=[\"POST\"])\u003Cbr/> def analyze() -> Tuple[str, int]:\u003Cbr/> \"\"\"Execute the analyzer function.\"\"\"\u003Cbr/> # Parse the request params\u003Cbr/> ##此次省略,可以參考官網(wǎng)\u003Cbr/>\u003Cbr/> @self.app.route(\"/recognizers\", methods=[\"GET\"])\u003Cbr/> def recognizers() -> Tuple[str, int]:\u003Cbr/> \"\"\"Return a list of supported recognizers.\"\"\"\u003Cbr/> ## 此次省略,可以參考官網(wǎng)\u003Cbr/> @self.app.route(\"/supportedentities\", methods=[\"GET\"])\u003Cbr/> def supported_entities() -> Tuple[str, int]:\u003Cbr/> \"\"\"Return a list of supported entities.\"\"\"\u003Cbr/> ##此次省略,可以參考官網(wǎng)\u003Cbr/> @self.app.errorhandler(HTTPException)\u003Cbr/> def http_exception(e):\u003Cbr/> return jsonify(error=e.description), e.code\u003Cbr/>\u003Cbr/>def create_app(): # noqa\u003Cbr/> server = Server()\u003Cbr/> return server.app\u003Cbr/>\u003Cbr/>if __name__ == \"__main__\":\u003Cbr/> app = create_app()\u003Cbr/> port = int(os.environ.get(\"PORT\", DEFAULT_PORT))\u003Cbr/> app.run(host=\"0.0.0.0\", port=port)\u003Cbr/>\u003Cbr/>\u003C/p>\u003Ch3>\u003Cstrong>配置文件部分\u003C/strong>\u003C/h3>\u003Cp style=\"line-height:3;\">主要修改presidio_analyzer/conf目錄下spacy.yaml、stanza.yaml、transformers.yaml文件,主要包括:\u003C/p>\u003Cp style=\"line-height:3;\">1. nlp_engine_name,代表選取什么引擎,支持:spacy、stanza、transformers;\u003C/p>\u003Cp style=\"line-height:3;\">2. models,代表語言和模型的對應(yīng)關(guān)系,不同語言對應(yīng)不同的模型,每個引擎都有屬于自己的模型列表;\u003C/p>\u003Cp style=\"line-height:3;\">3. ner_model_configuration,ner相關(guān)選項:\u003C/p>\u003Cp style=\"line-height:3;\">a. labels_to_ignore: A list of labels to ignore. For example, O (no entity) or entities you are not interested in returning.\u003C/p>\u003Cp style=\"line-height:3;\">b. model_to_presidio_entity_mapping: A mapping between the transformers model labels and the Presidio entity types.\u003C/p>\u003Cp style=\"line-height:3;\">c. low_confidence_score_multiplier: A multiplier to apply to the score of entities with low confidence.\u003C/p>\u003Cp style=\"line-height:3;\">d. low_score_entity_names: A list of entity types to apply the low confidence score multiplier to.\u003C/p>\u003Cp style=\"line-height:3;\">nlp_engine_name: spacy \u003Cbr/>models: \u003Cbr/> -\u003Cbr/> lang_code: en\u003Cbr/> model_name: en_core_web_lg\u003Cbr/>\u003Cbr/>ner_model_configuration:\u003Cbr/> model_to_presidio_entity_mapping:\u003Cbr/> PER: PERSON\u003Cbr/> PERSON: PERSON\u003Cbr/> NORP: NRP\u003Cbr/> FAC: LOCATION\u003Cbr/> LOC: LOCATION\u003Cbr/> LOCATION: LOCATION\u003Cbr/> GPE: LOCATION\u003Cbr/> ORG: ORGANIZATION\u003Cbr/> ORGANIZATION: ORGANIZATION\u003Cbr/> DATE: DATE_TIME\u003Cbr/> TIME: DATE_TIME\u003Cbr/>\u003Cbr/> low_confidence_score_multiplier: 0.4\u003Cbr/> low_score_entity_names:\u003Cbr/> -\u003Cbr/> labels_to_ignore:\u003Cbr/> - ORG\u003Cbr/> - ORGANIZATION # has many false positives\u003Cbr/> - CARDINAL\u003Cbr/> - EVENT\u003Cbr/> - LANGUAGE\u003Cbr/> - LAW\u003Cbr/> - MONEY\u003Cbr/> - ORDINAL\u003Cbr/> - PERCENT\u003Cbr/> - PRODUCT\u003Cbr/> - QUANTITY\u003Cbr/> - WORK_OF_ART\u003C/p>\u003Ch3>\u003Cstrong>支持\u003C/strong>\u003Cstrong>PII\u003C/strong>\u003Cstrong>類型\u003C/strong>\u003C/h3>\u003Cp style=\"line-height:3;\">PERSON\u003C/p>\u003Cp style=\"line-height:3;\">NRP\u003C/p>\u003Cp style=\"line-height:3;\">LOCATION\u003C/p>\u003Cp style=\"line-height:3;\">ORGANIZATION\u003C/p>\u003Cp style=\"line-height:3;\">DATE_TIME\u003C/p>\u003Cp style=\"line-height:3;\">-----下面是擴展預(yù)置自定義識別器(可以靈活擴展)\u003C/p>\u003Cp style=\"line-height:3;\">USERNAME\u003C/p>\u003Cp style=\"line-height:3;\">PASSWORD\u003C/p>\u003Cp style=\"line-height:3;\">CHINA_MOBILE_NUMBER\u003C/p>\u003Cp style=\"line-height:3;\">CHINA_LANDLINE_NUMBER\u003C/p>\u003Cp style=\"line-height:3;\">TAIWAN_MOBILE_NUMBER\u003C/p>\u003Cp style=\"line-height:3;\">TAIWAN_LANDLINE_NUMBER\u003C/p>\u003Cp style=\"line-height:3;\">HONGKONG_MOBILE_NUMBER\u003C/p>\u003Cp style=\"line-height:3;\">HONGKONG_LANDLINE_NUMBER\u003C/p>\u003Cp style=\"line-height:3;\">PHONE_NUMBER\u003C/p>\u003Cp style=\"line-height:3;\">EMAIL_ADDRESS\u003C/p>\u003Cp style=\"line-height:3;\">CHINA_ID\u003C/p>\u003Cp style=\"line-height:3;\">TAIWAN_ID\u003C/p>\u003Cp style=\"line-height:3;\">HKID\u003C/p>\u003Cp style=\"line-height:3;\">CHINA_BANK_ID\u003C/p>\u003Cp style=\"line-height:3;\">CREDIT_CARD\u003C/p>\u003Cp style=\"line-height:3;\">CHINA_PASSPORT\u003C/p>\u003Ch2>anonymizer\u003Cstrong>實現(xiàn)\u003C/strong>\u003C/h2>\u003Cp style=\"line-height:3;\">anonymizer實現(xiàn)比較簡單,原理就是依據(jù)analyzer的結(jié)果,對原始文本進行匿名編輯操作(在AI場景下,需要自己實現(xiàn)推理結(jié)果的還原)。官網(wǎng)描述的很清晰,舉個簡單例子:\u003C/p>\u003Cp style=\"line-height:3;\"># -*- coding: utf-8 -*-\u003Cbr/>from presidio_anonymizer import AnonymizerEngine\u003Cbr/>from presidio_anonymizer.entities import OperatorConfig, RecognizerResult\u003Cbr/>from faker import Faker\u003Cbr/>import logging\u003Cbr/>\u003Cbr/># 配置日志記錄\u003Cbr/>logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')\u003Cbr/>logger = logging.getLogger(__name__)\u003Cbr/>\u003Cbr/>def create_fake_name():\u003Cbr/> \"\"\"生成假名的函數(shù),用于匿名化PERSON 實體。\"\"\"\u003Cbr/> fake = Faker() # 在函數(shù)內(nèi)創(chuàng)建Faker 實例,避免全局對象\u003Cbr/> return fake.name()\u003Cbr/>\u003Cbr/>def anonymize_text(text: str, analyzer_results: list[RecognizerResult]) -> str:\u003Cbr/> \"\"\"\u003Cbr/> 對文本中的敏感信息進行匿名化處理。\u003Cbr/> \u003Cbr/> Args:\u003Cbr/> text (str): 要匿名化的文本。\u003Cbr/> analyzer_results (list[RecognizerResult]): 分析器識別的實體結(jié)果。\u003Cbr/> \u003Cbr/> Returns:\u003Cbr/> str: 匿名化后的文本。\u003Cbr/> \u003Cbr/> Raises:\u003Cbr/> ValueError: 如果輸入?yún)?shù)無效。\u003Cbr/> Exception: 如果匿名化過程發(fā)生錯誤。\u003Cbr/> \"\"\"\u003Cbr/> if not text or not analyzer_results:\u003Cbr/> logger.error(\"Invalid input: text or analyzer_results is empty\")\u003Cbr/> raise ValueError(\"Text and analyzer_results must not be empty\")\u003Cbr/>\u003Cbr/> try:\u003Cbr/> # 配置匿名化器\u003Cbr/> operators = {\"PERSON\": OperatorConfig(\"custom\", {\"lambda\": create_fake_name})}\u003Cbr/> anonymizer = AnonymizerEngine()\u003Cbr/>\u003Cbr/> # 執(zhí)行匿名化\u003Cbr/> result = anonymizer.anonymize(\u003Cbr/> text=text,\u003Cbr/> analyzer_results=analyzer_results,\u003Cbr/> operators=operators\u003Cbr/> )\u003Cbr/> logger.info(\"Text anonymization successful\")\u003Cbr/> return result.text\u003Cbr/>\u003Cbr/> except Exception as e:\u003Cbr/> logger.error(f\"Anonymization failed: {str(e)}\")\u003Cbr/> raise\u003Cbr/>\u003Cbr/>def main():\u003Cbr/> \"\"\"主函數(shù),演示文本匿名化流程。\"\"\"\u003Cbr/> try:\u003Cbr/> # 示例輸入\u003Cbr/> text_to_anonymize = \"My name is Raphael and I like to fish.\"\u003Cbr/> analyzer_results = [RecognizerResult(entity_type=\"PERSON\", start=11, end=18, score=0.8)]\u003Cbr/>\u003Cbr/> # 執(zhí)行匿名化\u003Cbr/> anonymized_text = anonymize_text(text_to_anonymize, analyzer_results)\u003Cbr/> print(f\"Anonymized text: {anonymized_text}\")\u003Cbr/>\u003Cbr/> except Exception as e:\u003Cbr/> logger.error(f\"Error in main: {str(e)}\")\u003Cbr/> print(f\"Error: {str(e)}\")\u003Cbr/>\u003Cbr/>if __name__ == \"__main__\":\u003Cbr/> main()\u003C/p>\u003Ch1>性能測試\u003C/h1>\u003Cp style=\"line-height:3;\">服務(wù)器:10核40GB(Intel(R) Xeon(R) Platinum 8255C CPU @ 2.50GHz)\u003C/p>\u003Cp style=\"line-height:3;\">locust測試框架\u003C/p>\u003Cp style=\"line-height:3;\">10user每個user每秒1個請求,每個請求500字符左右\u003C/p>\u003Cp style=\"line-height:3;\">spacy模型:中文最強模型https://spacy.io/models/zh#zh_core_web_trf\u003C/p>\u003Cp style=\"line-height:3;\">api中啟動一個AnalyzerEngine\u003C/p>\u003Csection>\u003C/section>\u003Cp style=\"line-height:3;\">\u003Cimg src=\"https://sdkfiledl.jiguang.cn/public-picture/2025-06-10/168619/640 (5).jpg\" style=\"max-width:100%;\" contenteditable=\"false\"/>\u003C/p>\u003Csection>\u003C/section>\u003Cp style=\"line-height:3;\">\u003Cimg src=\"https://sdkfiledl.jiguang.cn/public-picture/2025-06-10/981968/640 (6).jpg\" style=\"max-width:100%;\" contenteditable=\"false\"/>\u003C/p>\u003Cp style=\"line-height:3;\">結(jié)論:presidio-analyzer主要消耗CPU和內(nèi)存(text多長會導(dǎo)致oom,推薦不超過10k),10核支持3qps(rpm=180),推理達到10qps(rpm=600)大概要32核,transformers引擎因為使用transformer架構(gòu)模型,需要用gpu算力來運行,性價比不高,暫時放棄。(上面測試結(jié)果僅供參考)\u003C/p>\u003Ch1>經(jīng)驗分享\u003C/h1>\u003Cp style=\"line-height:3;\">在設(shè)計開發(fā)presidio過程,也遇到過一些問題和思考,這里分享算是拋磚引玉:\u003C/p>\u003Cp style=\"line-height:3;\">1. 在Presidio使用過程中,遇到了幾個代碼中bug,需要自己來依據(jù)需要修改,測試驗證盡量全面;\u003C/p>\u003Cp style=\"line-height:3;\">2. analyzer支持的text最大長度,主要依賴使用的model,需要自己實際測試驗證,避免oom;\u003C/p>\u003Cp style=\"line-height:3;\">3. 自定義recognizer的score可以通過context提升評分,通過score分數(shù)來控制誤識別率;\u003C/p>\u003Cp style=\"line-height:3;\">4. 注冊和移除recognizer接口,自定義和預(yù)置有差別,最好自己來實現(xiàn);\u003C/p>\u003Cp style=\"line-height:3;\">5. 多語言混合場景,兩個解決思路:\u003C/p>\u003Cp style=\"line-height:3;\">a. 采用transformer模型,一個大模型可以同時支持多個語言做ner,不過huggingface上的模型能力參差不齊,訓(xùn)練成本過高,還需要仔細篩選測試驗證;\u003C/p>\u003Cp style=\"line-height:3;\">b. 每個語言模型都跑一次,比如中英文混合,中文和英文模型都跑一遍后在匯總確認做匿名。\u003C/p>\u003Cp style=\"line-height:3;\">6. 生產(chǎn)環(huán)境打包為docker鏡像比較方便,模型文件都要提前下載打包到鏡像中,這樣可以在內(nèi)網(wǎng)離線部署運行;\u003C/p>\u003Cp style=\"line-height:3;\">7. anonymizer本身沒有使用模型,只是根據(jù)analyzer的結(jié)果進行字符串編輯,這一步可以考慮自己開發(fā)實現(xiàn)更為適合,因為匿名后的數(shù)據(jù)需要提交給大模型進行推理,可能會丟失關(guān)鍵信息,同時在大模型返回推理結(jié)果,可能還要還原文本;\u003C/p>\u003Cp style=\"line-height:3;\">8. 增加analyzer的并發(fā)處理能力,可以考慮同時啟動多個實例提升并發(fā)處理能力;也可以考慮在一個實例中初始化多個AnalyzerEngine,實現(xiàn)一個引擎池,多個請求可以分配給不同的AnalyzerEngine處理。兩個方案都可行。不過CPU和內(nèi)存資源消耗也會成倍增長。\u003C/p>\u003Ch1>參考\u003C/h1>\u003Col>\u003Cli>\u003Cp>https://microsoft.github.io/presidio/learn_presidio/\u003C/p>\u003C/li>\u003Cli>\u003Cp>https://spacy.io/models\u003C/p>\u003C/li>\u003Cli>\u003Cp>https://stanfordnlp.github.io/stanza/ner_models.html\u003C/p>\u003C/li>\u003Cli>\u003Cp>https://huggingface.co/models?pipeline_tag=token-classification\u003C/p>\u003C/li>\u003C/ol>\u003Cp style=\"line-height:3;\">\u003C/p>\u003Cp style=\"line-height:3;\">\u003C/p>","隨著人工智能技術(shù)的快速發(fā)展,尤其是大語言模型(LLM-large language model)在金融、醫(yī)療、客服等領(lǐng)域的廣泛應(yīng)用,處理海量數(shù)據(jù)已成為常態(tài)。",[12],"https://sdkfiledl.jiguang.cn/public-picture/2025-06-10/955960/Untitled design.png","隨著人工智能技術(shù)的快速發(fā)展,尤其是大語言模型(LLM-large language model)在金融、醫(yī)療、客服等領(lǐng)域的廣泛應(yīng)用,處理海量數(shù)據(jù)已成為","2025-06-10 10:20:11","2025-06-10 10:49:29","2025-06-10 11:03:56",[156],{"anchorText":157,"linkUrl":158},"SSP","http://www.youxiatong.com/adpub",{"id":87,"lastId":23,"lastTitle":23,"nextId":23,"nextTitle":23,"status":21,"title":88,"content":89,"summary":90,"tag":160,"author":23,"category":24,"coverLink":92,"seoTitle":88,"seoKeywords":12,"seoDescription":93,"publishTime":94,"createTime":95,"updateTime":96,"internalLinkList":161,"sideType":21,"languageType":32},[12],[162,163,164],{"anchorText":30,"linkUrl":31},{"anchorText":100,"linkUrl":101},{"anchorText":103,"linkUrl":101},{"id":17,"lastId":23,"lastTitle":23,"nextId":23,"nextTitle":23,"status":21,"title":18,"content":54,"summary":55,"tag":166,"author":23,"category":24,"coverLink":57,"seoTitle":18,"seoKeywords":12,"seoDescription":55,"publishTime":58,"createTime":59,"updateTime":60,"internalLinkList":167,"sideType":21,"languageType":32},[12],[],[],["Reactive",170],{"$snuxt-i18n-meta":171},{},["Set"],["ShallowReactive",174],{"blogBannerData":23,"hotBlogList":23,"aboutBlogList":23,"$kuwAeAxGO7":23},true,"/blog/91"]