年后这两个月频繁组织架构变动,所以博客很久没更新。现在暂时算是尘埃落定,趁这段时间整理一下。

入职九个月,自己参与的项目有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安装环节疯狂踩坑,老司机都忍不住想摔键盘!明明官网下载的安装包,怎么就会报错呢?为什么别人的环境变…