【项目归档】数据抓取+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。

  1. 针对用户点击过应用其他部分则无法获取数据的问题,采用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事件循环深度剖析

相关推荐
心仪悦悦7 分钟前
如何搭建spark yarn模式的集群
大数据·分布式·spark
大G哥5 小时前
【微服务】SpringBoot制作Docker镜像接入SkyWalking详解
spring boot·docker·微服务·架构·skywalking
乌旭6 小时前
AIGC算力消耗白皮书:Stable Diffusion vs Midjourney的架构成本差异
人工智能·深度学习·stable diffusion·架构·aigc·midjourney·gpu算力
小羊在奋斗7 小时前
基于C++、JsonCpp、Muduo库实现的分布式RPC通信框架
c++·分布式·rpc
程序员学习随笔7 小时前
分布式理论:常见分布式协议的概览与解析
分布式
小龙在山东7 小时前
flask 获取各种请求数据:GET form-data x-www-form-urlencoded JSON headers 上传文件
python·flask·json
deepdata_cn9 小时前
开源分布式数据库(TiDB)
数据库·分布式
火云牌神10 小时前
本地大模型编程实战(32)用websocket显示大模型的流式输出
python·websocket·llm·fastapi·流式输出
夏旭泽11 小时前
系统架构-架构评估
架构·系统架构