【項目歸檔】數據抓取+GenAI+數據分析

年后這兩個月頻繁組織架構變動,所以博客很久沒更新。現在暫時算是塵埃落定,趁這段時間整理一下。

入職九個月,自己參與的項目有4個,負責前后端開發,測試,devops(全棧/doge),總結一下背景,技術棧以及個人在開發方面的思考。
A和B分別是【Python開發】大模型應用開發項目整理
中數據抓取和GenAI部分。

A 數據抓取

A.1 背景

時間:2024.8-2024.10
原始數據只能從某Java Application上獲取,需獲取原始數據并傳入Web UI中進行下一步的處理。

A.2 技術棧

A.2.1 jnlp應用程序數據抓取

1.窗口定位:psutil,pygetwindow,win32process
2.數據獲取:keyboard(監聽和模擬鍵盤事件),pypeclip(剪貼板),win32api(鼠標)
3.GUI界面:pysimpleUI

亮點:
1.針對非英語版本的應用無法通過固定title定位的問題,采用psutil通過獲取pid獲取title,進而定位到window。
2. 針對用戶點擊過應用其他部分則無法獲取數據的問題,采用win32api將鼠標移至初始位置,再獲取數據,并添加retry機制提高成功率。

A.2.2 Selenium傳入數據

配置chromedriver.exe路徑,通過selenium拉起chrome,通過執行js腳本將數據填入page中的hidden element,前端進行解析。

亮點:
1.針對重復啟動chrome的問題,設置指定options參數,確保只啟動唯一chrome實例。
2.針對退出時chromedriver自動關掉而占用系統資源的問題,增加了關閉app時調用taskkill命令。

A.3 經驗和思考

個人感想: 這是入職后接手的第一個組件,接手時開發已經到了中后期,有基本功能,但遺留了較多歷史bug需要修復。另外由于嚴格的policy,導致在整個項目上線后,仍然需要user手動更新chromedriver,在一定程度上增加了user的使用成本。

經驗: 盡量減少user使用成本,及時索取feedback。對于無法避免的error,給出完善的refer doc和app提示。

B GenAI 數據分析

B.1 背景

時間:2024.10-2024.12
利用OpenAI的GPT模型,設定prompt來提取article的關鍵信息和摘要,將結果返回后端分析,給出recommendation。

B.2 技術棧

B.2.1 prompt調優

在與大語言模型(如GPT、Claude等)交互時,Prompt調優是提升輸出質量的關鍵技術。以下是一些常見的Prompt調優方法:

1. 明確任務指令

  • 使用清晰的動詞(如"總結"、“解釋”、“生成”、“對比”)
  • 指定輸出格式(如JSON、Markdown、代碼塊)
  • 設置約束條件(如字數限制、技術棧要求)

2. 提供示例(Few-Shot Learning)
在Prompt中插入輸入-輸出示例,引導模型學習模式。

3. 分步引導(Chain of Thought)
將復雜任務拆解為多個步驟,要求模型分步輸出思考過程。

4. 角色扮演
指定模型扮演特定角色(如資深程序員、學術專家、創意寫作導師)。

5. 控制輸出長度
使用明確的字數或標記限制,或指定輸出復雜度。

6. 提供上下文信息
在Prompt中添加相關背景知識或前置條件。

7. 避免歧義
使用精確術語,避免模糊詞匯(如"一些"、“相關”、“適當”)。

8. 迭代優化(A/B測試)
方法
對同一任務創建多個版本的Prompt,對比模型輸出質量。如何評估模型輸出?使用了Gemini模型進行evaluate,這也是業界常用方法,用其他llm來評估llm的輸出。

9. 使用系統提示(System Prompt)
在多輪對話中,使用System Prompt設置模型的行為基調。

10. 利用外部工具
結合Function Calling讓模型調用外部API獲取實時數據。

總結
Prompt調優的核心原則是明確性具體性引導性。對于復雜任務,建議采用迭代優化分步引導策略,逐步逼近理想結果。

B.2.2 異步處理

由于flask并不原生支持并發,所以使用事件循環和協程實現并發,用redis做backup queue,防止服務器down丟失task。

B.2.3 監控

上線后需要監控服務狀態

  • 日志(級別,按日存儲,支持查詢,排序)
  • Queue每小時峰值長度
  • 響應時間(每小時觸發request,記錄上游響應時間)

B.3 經驗和思考

高并發下一定需要異步,獲取結果可以callback和等待輪詢,python的異步常通過協程和事件循環實現,此外也可以嘗試用多線程。為了防止service down,需要記錄任務狀態備份。為了及時發現問題定位問題,需要在生命周期中做好監控和log。

C pipeline components

C.1 背景

時間:2025.1-2025.3
將GenAI相關功能包裝成API作為AI workflow的node,開放給center提供pipeline服務。

C.2 技術棧

C.2.1 FastAPI

相比于之前的Flask,FastAPI的好處主要體現在以下幾個方面:

  1. 高性能:FastAPI基于Starlette,基于ASGI協議構建的異步處理引擎,在TechEmpower基準測試中實現每秒12萬次請求處理能力,與Golang的Gin框架(13.5萬次)及Node.js的Fastify(11.8萬次)處于同一性能梯隊,適合高并發場景。
  2. 異步支持:FastAPI原生支持異步編程,適合現代Web開發需求。
  3. 自動文檔生成:FastAPI自動生成OpenAPI和JSON Schema文檔,便于API的測試和調試。

所以我們最后在新項目中選用了FastAPI作為微服務框架。

C.2.2 Celery分布式任務處理+監控

之前的redis queue和in-memory queue也可以實現異步任務處理,只是無法快速擴展,無法監控任務狀態,需要自己寫錯誤處理,所以在新項目中嘗試引入Celery。好處:

  1. 多節點擴展+負載均衡: 擴展的話加worker就行
  2. 結果存儲:將任務的結果存儲在各種后端(如 Redis、MongoDB、數據庫等),方便后續查詢和處理。還可以通過任務 ID 查詢任務的結果,實現任務狀態監控和結果獲取。
  3. 任務重試: 支持任務重試機制,當任務失敗時可以自動重試,確保任務最終能夠成功執行。
    持久化隊列: 使用持久化的消息隊列(如 RabbitMQ 和 Redis),即使系統重啟,任務也不會丟失。監控和管理: 提供豐富的監控和管理工具,如 Flower(一個實時監控 Celery 集群的 Web 界面),了解任務的執行情況和系統狀態。

C.3 經驗和思考

在使用celery時,發現盡管有以上好處,但也增加了維護成本,需要同時維護微服務和worker腳本,對于小項目來說可能并不是很適合。所以以后在選擇使用技術的時候,也要考慮到使用成本的問題。

D 數據校驗

D.1 背景

時間:2025.3-2025.4
根據user給定的rules,對每列數據進行校驗,輸出校驗結果。

D.2 技術棧

D.2.1 JavaScript engine(低代碼平臺)

D.2.2 NER model

提取address中的city,county,iso code,用于匹配規則

D.3 經驗和思考

這個項目的底層架構是5/6年前的了,所以不支持異步和并發,因為infra性能較差也經常503,504,后來后端有些改進。在技術實現不復雜,復雜的地方在于user給定的校驗規則太多,需要大量的溝通,主要學到的就是郵件留痕,及時同步了。個人認為NER model可以用llm替代(不需要手寫每一條規則),整個項目也可以用Python重構提高并發(user請求量還挺大的),只是因為接手的時候已經到UAT階段,無法修改,但做了demo給leader展示,如果有機會重構的話則可以用。


部署

Jenkins+k8s+ArgoCD

Jenkins用來拉代碼,build docker image,手動將image更新到k8s腳本中,在ArgoCD中sync進行同步。

參考:
python事件循環深度剖析

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/79513.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/79513.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/79513.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

服務器熱備份,服務器熱備份的方法有哪些?

服務器熱備份是保障業務連續性的重要技術手段,通過實時數據同步和快速故障切換,確保在主服務器故障時備份服務器能無縫接管。以下是常見的服務器熱備份方法及其核心要點: 雙機熱備(Active-Standby/Active-Active) 主備…

【AI平臺】n8n入門6:調用MCP服務(非社區節點)

前言 前邊用n8n搭建一個MCP服務,現在,用n8n調用其他服務商提供的MCP服務。本文以高德地圖服務為例,記錄一下操作過程。 實現案例功能 MCP是啥 MCP(Model Context Protocol,模型上下文協議)是由Anthropi…

基于ArduinoIDE的任意型號單片機 + GPS北斗BDS衛星定位

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 文章目錄 前言1.1 器件選擇1.2 接線方案 二、驅動實現2.1 核心代碼解析(arduino/ESP32-S3) 三、坐標解析代碼四、典型問題排查總結 前言 北斗衛星導航…

經典算法 最小生成樹(prim算法)

最小生成樹 題目描述 給定一個 n 個點 m 條邊的無向圖,圖中可能存在重邊和自環,邊權可能為負數。 求最小生成樹的樹邊權重之和。如果最小生成樹不存在,則輸出 impossible。 給定一張邊帶權的無向圖 G (V, E),其中&#xff1a…

LeetCode算法題 (設計鏈表)Day16!!!C/C++

https://leetcode.cn/problems/design-linked-list/description/ 一、題目分析 你可以選擇使用單鏈表或者雙鏈表,設計并實現自己的鏈表。 單鏈表中的節點應該具備兩個屬性:val 和 next 。val 是當前節點的值,next 是指向下一個節點的指針/引…

《解鎖GCC版本升級:開啟編程新世界大門》

《解鎖GCC版本升級:開啟編程新世界大門》 一、引言:GCC 版本升級的魔法鑰匙 在編程的廣闊天地里,GCC(GNU Compiler Collection)宛如一座燈塔,為無數開發者照亮前行的道路。它是一款開源且功能強大的編譯器集合,支持 C、C++、Objective - C、Fortran、Ada 等多種編程語言…

toLua筆記

基本 LuaState luaStatenew LuaState(); luaState.Start(); luaState.DoString("xxx"); luaState.DoFile("yyy.lua"); luaState.Require("zzz");//不要加.lua后綴 luaState.CheckTop();//檢查解析器棧頂為空 luaState.Dispose(); luaStatenull;…

go實現雙向鏈表

需求 實現雙向鏈表的節點生成、正反向遍歷、指定刪除。 實現 package mainimport ("fmt" )type zodiac_sign struct {number intdizhi stringanimal stringyear intprevious *zodiac_signnext *zodiac_sign }// 添加 // func add_node_by_order(pr…

AI實踐指南:AGENT、RAG和MCP在Java中的簡單實現

在當今AI快速發展的時代,有幾個核心概念正在改變我們構建智能應用的方式。本文將用簡單易懂的語言介紹三個重要概念:AGENT(AI代理)、RAG(檢索增強生成)和MCP(多通道感知)&#xff0c…

解決VMware虛擬機能搜索到網頁但打不開的問題

🌴 問題描述 很奇怪,不知道為什么,我安裝的Windows 10虛擬機能在瀏覽器中搜索到網頁,但點擊具體的網頁鏈接就是死活不能加載出來,如下圖所示: 點擊第一個鏈接,加載了四五分鐘,結果就…

JVM性能調優的基礎知識 | JVM內部優化與運行時優化

目錄 JVM內部的優化邏輯 JVM的執行引擎 解釋執行器 即時編譯器 JVM采用哪種方式? 即時編譯器類型 JVM的分層編譯5大級別: 分層編譯級別: 熱點代碼: 如何找到熱點代碼? java兩大計數器: OSR 編譯…

什么是多租戶系統

隨著云計算和 SaaS(Software as a Service)模式的普及,多租戶架構(Multi-Tenant Architecture)成為 SaaS 產品設計中的核心模式之一。多租戶架構允許多個用戶(租戶)共享同一套基礎設施和應用&am…

多線程系列三:這就是線程的狀態?

1.認識線程的狀態 NEW:Thread對象已經創建好了,但還沒有調用start方法在系統中創建線程 RUNNABLE:就緒狀態,表示這個線程正在CPU上執行,或準備就緒,隨時可以去CPU上執行 BLOCKED:表示由于鎖競爭…

【C語言練習】019. 使用結構體數組存儲復雜數據

019. 使用結構體數組存儲復雜數據 019. 使用結構體數組存儲復雜數據示例1:定義一個結構體并創建結構體數組定義結構體創建并初始化結構體數組輸出結果 示例2:動態輸入數據到結構體數組定義結構體動態輸入數據示例輸入和輸出 示例3:使用結構體…

**Java面試大冒險:謝飛機的幽默與技術碰撞記**

互聯網大廠Java求職者面試:一場嚴肅與搞笑交織的技術盛宴 場景: 互聯網大廠面試間 人物: 面試官: 一位嚴肅的資深架構師,對技術要求嚴格。謝飛機: 一位搞笑的程序員,技術實力參差不齊。 第一…

MySQL進階(三)

五、鎖 1. 概述 鎖是計算機協調多個進程或線程并發訪問某一資源的機制(避免爭搶)。 在數據庫中,除傳統的計算資源(如 CPU、RAM、I/O 等)的爭用以外,數據也是一種供許多用戶共享的資源。如何保證數據并發…

【BLE】【nRF Connect】 精講nRF Connect自動化測試套件(宏錄制、XML腳本)

目錄 前言 1. nRF Connect自動化測試介紹 1.1. nRF connect宏錄制功能介紹 1.2. 電腦端XML方式 1.3 實際應用案例 1.3.1 BLE 穩定性測試 1.3.2 設備固件更新(DFU)測試 1.3.3 批量設備配置 1.4 操作步驟 1.5 注意事項 2. nRF Connect日志記錄 2.1. 日志記錄功能 …

【數據結構】堆的完整實現

堆的完整實現 堆的完整實現GitHub地址前言堆的核心功能實現重溫堆的定義堆結構定義1. 堆初始化與銷毀2. 元素交換函數3. 堆化操作向上調整(子→父)向下調整(父→子) 4. 堆元素插入5. 堆元素刪除6. 輔助功能函數堆的判空獲取堆頂元…

如何優化MySQL主從復制的性能?

優化MySQL主從復制的性能需要從硬件、配置、架構設計和運維策略等多方面入手。以下是詳細的優化方案: 一、減少主庫寫入壓力 1. ?主庫優化? 二進制日志(binlog)優化?: 使用 binlog_formatROW 以獲得更高效的復制和更少的數…

MySQL安裝完全指南:從零開始到配置優化(附避坑指南)

🔥 前言:為什么你總是裝不好MySQL? (實話實說)每次看到新手在MySQL安裝環節瘋狂踩坑,老司機都忍不住想摔鍵盤!明明官網下載的安裝包,怎么就會報錯呢?為什么別人的環境變…