AI应用运行时

本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 7.1 AI应用运行时的演进趋势 7.1.1 从云原生到AI原生 云原生时代的核心是应用。将单体应用拆解为更小、更独立、更具弹性的微服务,并高效地在云基础设施上进行部署、扩展和管理。 而Agent的工作流,不再是执行一段固定的main函数,而是一个动态的、长周期的、充满不确定性的“思考-行动”循环。需要极致弹性和成本效益。需要数小时上下文记忆、拥有完整文件系统、并能与浏览器进行复杂交互。 7.1.2 Agentic AI应用的典型场景 场景一:交互式智能内容创作助手 对轮对话、上下文记忆、模型自托管、异构任务流、流式响应。 场景二:个性化AI客服 事件驱动、企业数据、实时在线。 场景三:通用Agent平台+病毒式传播的AIGC创意应用 Agent智能体、代码执行验证、部署与分享、脉冲式流量、大文件处理。 7.1.3 AI原生应用运行时的核心能力 1、面向会话的状态管理与安全隔离 2、大规模实时弹性与精益成本管理 3、异构算力与标准化工具连接能力 7.2 模型运行时 7.2.1 企业模型使用的核心痛点 资源浪费:业务流量波动大,高峰10万,平日几千,预留峰值会导致算力闲置。 冷启动:低频模型无法保持实例存活,使用时冷启动耗时长。 定制化:业务产品需要定制化,产品迭代周期长。 7.2.2 Serverless模型运行时的核心能力 Serverless是什么? Serverless不是完全没有服务器,而是开发者不需要关心服务器的管理。对于开发者来说,只需关注代码,其他的交给云平台。主流Serverless平台包括阿里云函数计算、腾讯云云函数等。 Serverless和云服务器的区别? 云服务器只是一台远程的服务器;Serverless只上传代码片段(函数),不管服务器,当有请求触发时,代码才会运行。 1、异构算力和1/N卡切分使用 在算力层,Serverless模型运行时通过GPU虚拟化技术将单张GPU显卡划分为N个独立计算单元,每个实例具备隔离的显存空间与算力资源,不同实例通过GPU分时复用技术实现并行推理。 Serverless模型运行时通过池化技术,将CPU/GPU/XPU统一纳管到一个资源池,开发者可根据模型特性按需配置算力模型,比如语音识别等轻量任务分配CPU,图像生成等算力密集型任务分配GPU碎片,大语言模型等显存密集型任务分配GPU整卡或多卡。 2、负载感知调度和毫秒级闲置唤醒 在调度层,Serverless模型运行时通过负载感知调度系统实时监测请求队列深度、GPU显存占有率、实例健康状态等多维指标,基于池化技术构建三级响应机制:请求优先分配至活跃实例;当资源吃紧时,毫秒级唤醒闲置实例了;仅在极端流量下触发冷启动。 其核心技术突破在于利用CRID(用户空间检查点/恢复)技术冻结显存状态,并将显存数据临时置换至内存,并在新的请求调度前实现毫秒级/秒级状态恢复,较传统虚机/容器方案提速百倍。 3、集成加速框架和开发调试工具链 在开发层,Serverless模型运行时预集成加速框架深度优化模型运行效率:vLLM框架的Paged Attention技术通过显存分页管理提升3倍吞吐量;SGLang的RadixAttention实现注意力机制并行编译,降低60%推理延迟;TensorRT-LLM的量化融合策略提升2倍能效比。 开发工具链提供DevPod交互式环境,开发环节实现白屏化操作和实时反馈,集成在线IDE如VSCode/JupyterLab/SSH终端,开发者在云端环境具备比本地环境更高的生产效率;生产部署环节实现革命性简化——上传模型文件后,系统在30秒内自动生成Dockerfile、构建推理服务、输出OpenAPI文档及SDK。 总结,GPU碎片化技术提供原子级算力单元,为智能调度奠定资源基础;负载感知引擎通过毫秒级实例弹性,将碎片化算力转化为即时服务能力;开发工具链则构建自动化流水线,使技术红利直达开发者工作台。 7.2.3 Serverless模型运行时——AI大脑的终极载体 Serverless模型运行时实现了异构算力革命、智能调度进化、开发范式升级三重突破,是承载AI大脑的核心基座。 7.3 智能体运行时 7.3.1 AI应用形态的持续演进 1、“请求-响应”模式:无状态的事务性AI任务 通过快速复制无状态的计算实例来应对流量变化。 2、“对话”模式:有状态的协作式Agentic AI应用 7.3.2 Agent运行时的核心架构目标 1、围绕会话请求和资源调度模型,维持长时运行的状态延续 2、实现面向Active-Idle资源管理,解决长时运行的成本困境 7.3.3 现有架构支撑Agent运行时对比分析 7.3.4 为AI原生的“会话式”Serverless运行时 AI应用的会话既需要状态持久化,又需要高性能的本地计算和会话维度隔离能力。 一个会话,一个独立运行时: 原生会话状态保持 灵活可靠的安全隔离 毫秒级的弹性速度 7.4 工具与云沙箱 7.4.1 AI Agent与工具:从概念到能力 Agent常用工具类型: ...

DRF使用超链接API实现真正RESTful

很多API并不是真正的实现了RESTful,而应该叫做RPC (Remote Procedure Call 远程过程调用),Roy Fielding曾经提到了它们的区别,原文如下:

JavaWeb开发进阶SpringMVC的DispatcherServlet

本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 DispatcherServlet简介 DispatcherServlet是Spring MVC框架的核心组件,充当前端控制器(Front Controller)的角色。它负责接收所有的HTTP请求,并将它们分发给适当的处理器(控制器)。DispatcherServlet是整个Spring MVC应用程序的入口点,管理请求的整个生命周期。 通过源码查看DispatcherServlet定义: public class DispatcherServlet extends FrameworkServlet public abstract class FrameworkServlet extends HttpServletBean implements ApplicationContextAware public abstract class HttpServletBean extends HttpServlet implements EnvironmentCapable, EnvironmentAware DispatcherServlet继承了FrameworkServlet,继承了HttpServletBean,继承了HttpServlet。HttpServlet来自jakarta.servlet.http.HttpServlet,也就是新版Servlet: <dependency> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> <version>6.1.0</version> <scope>provided</scope> </dependency> 果然,Spring MVC是基于Servlet的! DispatcherServlet注册 DispatcherServlet是个Servlet,需要注册后才能使用。有3种注册方式:web.xml、Spring MVC、Spring Boot ① web.xml <web-app> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/app-context.xml</param-value> </context-param> <servlet> <servlet-name>app</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value></param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>app</servlet-name> <url-pattern>/app/*</url-pattern> </servlet-mapping> </web-app> ② Spring MVC ...

Java官方笔记8泛型

本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 泛型 为什么需要泛型?generics enable types (classes and interfaces) to be parameters when defining classes, interfaces and methods. 说白了就像Python动态语言的变量,是动态的,可以指向任意类型。 泛型有个好处是不需要类型转换: List list = new ArrayList(); list.add("hello"); String s = (String) list.get(0); List<String> list = new ArrayList<String>(); list.add("hello"); String s = list.get(0); // no cast 这个例子的泛型,是指List的实现使用了泛型<T>,从而给使用带来了好处。 定义 class name<T1, T2, ..., Tn> { /* ... */ } 比如定义class List<T>,使用List<String> 将以下代码: public class Box { private Object object; public void set(Object object) { this.object = object; } public Object get() { return object; } } 改为泛型实现: ...

JMeter定时器设置延迟与同步

JMeter定时器一般用来设置延迟与同步。它的作用域和优先级如下:

Python元组拆包捡到8倍镜快准狠

本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 元组拆包 元组是不可变列表,列表是通过索引取值的,元组也是: tuple_test = (1, 2, 3) a = tuple_test[0] b = tuple_test[1] c = tuple_test[2] 但Python是出了名的一行代码解决问题,元组拆包就是精髓技术之一: a, b, c = tuple_test print("%s %s %s" % tuple_test) 把元组一一对应拆出来,就叫做元组拆包。拆包有个要求,元组中的元素数量必须跟接受这些元素的空挡数一致,否则会报错: tuple_test = (1, 2, 3) a, b = tuple_test # ValueError: too many values to unpack (expected 2) _占位符 使用_占位符可以解决这个问题: tuple_test = (1, 2, 3) a, b, _ = tuple_test 这样就只获取到部分数据了,这在取函数返回值时特别有用,比如: import os _, filename = os.path.split("/home/dongfanger/.ssh/idrsa.pub") print(filename) # "idrsa.pub" *前缀 当返回值特别多时,_占位符写起来麻烦,可以用*来处理剩下的元素: >>> a, b, *rest = range(5) >>> a, b, *rest (0, 1, [2, 3, 4]) 注意rest是个列表,如果没有足够元素,会返回空列表: >>> a, b, *rest = range(2) >>> a, b, *rest (0, 1, []) *前缀变量能放在任意位置,比如,放在中间: >>> a, *body, c, d = range(5) >>> a, body, c, d (0, [1, 2], 3, 4) 放在前面: ...

SpringBoot官方笔记8其他

本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 Container Images FROM eclipse-temurin:17-jre as builder WORKDIR application ARG JAR_FILE=target/*.jar COPY ${JAR_FILE} application.jar RUN java -Djarmode=layertools -jar application.jar extract FROM eclipse-temurin:17-jre WORKDIR application COPY --from=builder application/dependencies/ ./ COPY --from=builder application/spring-boot-loader/ ./ COPY --from=builder application/snapshot-dependencies/ ./ COPY --from=builder application/application/ ./ ENTRYPOINT ["java", "org.springframework.boot.loader.JarLauncher"] $ docker build --build-arg JAR_FILE=path/to/myapp.jar . Production-ready Features The spring-boot-actuator module provides all of Spring Boot’s production-ready features. <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> </dependencies> Endpoints Actuator endpoints let you monitor and interact with your application. Spring Boot includes a number of built-in endpoints and lets you add your own. For example, the health endpoint provides basic application health information. ...

teprunner测试平台入门级部署手册发布啦

很多朋友是因为teprunner,也就是这个小众的pytest内核测试平台关注的公众号。为了让大家更好的上手teprunner,我更新了它的README,希望能让小伙伴们根据这些文档内容,一步一步的在自己本地电脑上把项目跑起来。项目跑起来之后,就可以参考前面一系列的学习教程,自己动手做一遍,在做的过程中和teprunner进行对比,不懂的点逐一突破,由点到面,完整实现。**这种学习方式能更快速的掌

tep集成mitmproxy录制流量自动生成用例

本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 使用 操作过程非常简单,流程如下: ①配置过滤域名 必须配置,不然会有很多无效流量造成数据冗余。 ②启动代理 「示例」使用了反向代理,tep自带FastApi启动Mock服务: 「实际」使用正向代理,并手动配置代理。命令说明在utils/mitm.py文件中有: ③录制流量 「示例」通过Postman发起请求: 「实际」在网页上点点点。 自动生成用例 用例就在tests/mitm实时生成好了,用例文件名为当前时间: 每录制一个请求,就能在测试用例中看到实时添加了一条测试步骤: # 接口描述 # 数据 # 请求 response = request( "{method}", url="{url}", headers={headers}, {body_grammar} ) # 数据提取 # var = response.jmespath("expression") # 断言 assert response.status_code < 400 录制完成以后,就可以再次编辑测试用例完善它。 原理 utils/mitm.py源码如下: #!/usr/bin/python ## encoding=utf-8 ## mitmproxy录制流量自动生成用例 import os import time from mitmproxy import ctx project_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) tests_dir = os.path.join(project_dir, "tests") ## tests/mitm mitm_dir = os.path.join(tests_dir, "mitm") if not os.path.exists(mitm_dir): os.mkdir(mitm_dir) ## 当前时间作为文件名 filename = time.strftime("%Y%m%d_%H_%M_%S", time.localtime()) + ".py" case_file = os.path.join(mitm_dir, filename) ## 生成用例文件 template = """from tep.client import request def test(): """ if not os.path.exists(case_file): with open(case_file, "w", encoding="utf8") as fw: fw.write(template) class Record: def __init__(self, domains): self.domains = domains def response(self, flow): if self.match(flow.request.url): # method method = flow.request.method.lower() ctx.log.error(method) # url url = flow.request.url ctx.log.error(url) # headers headers = dict(flow.request.headers) ctx.log.error(headers) # body body = flow.request.text or {} ctx.log.error(body) with open(case_file, "a", encoding="utf8") as fa: fa.write(self.step(method, url, headers, body)) def match(self, url): if not self.domains: ctx.log.error("必须配置过滤域名") exit(-1) for domain in self.domains: if domain in url: return True return False def step(self, method, url, headers, body): if method == "get": body_grammar = f"params={body}" else: body_grammar = f"json={body}" return f""" # 接口描述 # 数据 # 请求 response = request( "{method}", url="{url}", headers={headers}, {body_grammar} ) # 数据提取 # var = response.jmespath("expression") # 断言 assert response.status_code < 400 """ ## ==================================配置开始================================== addons = [ Record( # 过滤域名 [ "http://www.httpbin.org", "http://127.0.0.1:5000" ], ) ] ## ==================================配置结束================================== """ ==================================命令说明开始================================== ## 正向代理 mitmdump -s mitm.py ## 反向代理 mitmdump -s mitm.py --mode reverse:http://127.0.0.1:5000 --listen-host 127.0.0.1 --listen-port 8000 ==================================命令说明结束================================== """ 通过mitmproxy命令启动代理后,获取当前时间作为文件名在tests/mitm下生成用例文件,给addons添加插件Record类,通过response钩子捕获请求信息,对请求进行域名过滤,域名匹配成功的请求就使用测试步骤代码模板,填充method、url、headers、body数据,追加到测试用例文件中。 ...

2026-01-11 · 2 分钟 · 267 字 · 测试开发刚哥 · 原创项目 · #Tep

大模型时代,测试工作会有什么变化

本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 “ChatGPT是倾盆大雨前的第一场雨”,OpenAI首席科学家Ilya Sutskever。 大模型是指在人工智能领域,尤其是机器学习和深度学习中,具有大量参数和复杂结构的模型。 大模型通过在大量数据上进行预训练,然后针对特定任务进行微调,最终部署到应用中以执行复杂任务。 最近百度推出的“萝卜快跑”打车(Robotaxi),就是大模型应用之一。收集大量驾驶数据,包括视频、图像、雷达、车辆传感器等数据,对数据进行标注、归一化和增强等预处理。然后对大模型进行预训练,学习道路环境、交通规则、物体识别等。根据自动驾驶需求,对模型进行微调,保持车道、避让障碍物、识别交通标识等。将训练好的模型集成到自动驾驶系统中,在模拟环境和封闭场地进行测试。经过充分的模拟和实车测试后,部署到出租车上,实现无人驾驶。 未来世界,到底是个什么样的世界啊。 截止2024年初,已有诞生了近百个参数规模大于100亿的模型,在图像语言、推荐系统、医疗诊断、办公软件等各行各业,掀起了滔天巨浪,甚至有人感叹第四次工业革命是不是就要到来。 从个人体验来说,日常工作中使用ChatGPT时间已经远远超过了搜索引擎。测试工作虽然没有颠覆式改变,但可以预见未来会有不少变化。 以下纯属我的猜想。 功能用例。AI可以根据需求文档分析出功能用例。只要针对垂直业务进行大量训练,一个既懂业务,又懂测试用例设计的机器人,是很可能出现的。 自动化用例。AI可以自动生成,自动执行,自动断言,自动完成自动化测试。流量录制回放已经替代了部分回归测试工作,有AI能力加持,很难不去想象,未来是不是会出现“无人回归测试”。 代码评审。AI可以分析增量代码,计算出影响范围,给出改动点、影响点和测试点。ChatGPT已经很懂代码了,再结合精准测试分析,这项技术会愈加成熟。 测试数据。AI可以生成各种各样的测试数据。文件数据、内存动态数据、数据库存储数据,想要什么给你什么。 测试工具。AI可以快速生成测试工具。ChatGPT具备强大的代码生成能力,创建工具将变得简单快捷。 AI未来是否会取代人类?测试工作的特点之一是重复性,AI恰好就是解决重复问题的,所以很多重复性测试工作,一定会被AI取代。但是AI始终无法取代测试人员,为什么? 因为AI不能替测试人员背锅呀。