当前位置: 首页 > news >正文

doc-llm-autotest 基于大模型的文档自动化测试平台::用户提交文件进行文档测试

一、技术选型与功能设计

使用minio服务,进行文件的中转与存储。用户提交文件到doc-llm-controller,控制面将文件转存到minio中,关联此次任务id。然后doc-llm-worker轮询redis发现有需要执行的任务,拿到id后,根据id从minio拿取文件,然后将文件解析成结构化信息,再提交到大模型,进行文档测试。

那么此部分功能流程图大致如下:

image

相对应的,在整体业务流程中补充文件存取步骤,最后如下:

 

image

二、minio配置与使用

minio安装部署:我们使用docker镜像来部署minio服务,暴露9000端口提供给我们自己服务使用:

docker run -d --name doc-llm-minio -p 9000:9000 -p 9001:9001 --restart=always -e MINIO_ROOT_USER=root -e MINIO_ROOT_PASSWORD=password -v /home/workspace/minio:/data minio/minio:latest server /data --console-address ":9001"

通过python来调用minio服务:

# minio下载
pip install minio
from minio import Minio
from minio.error import S3Error
import io# 配置minio
client = Minio("localhost:9000",access_key="root",secret_key="xiao1234",secure=False,
)bucket_name = "doc-llm-bucket"
try:if not client.bucket_exists(bucket_name):client.make_bucket(bucket_name)else:print(f"Bucket '{bucket_name}' already exists.")
except S3Error as e:print(f"Error occurred: {e}")# 通过python上传文件到minio
def upload_file(local_file_path, object_name):try:client.fput_object(bucket_name, object_name, local_file_path)print(f"'{local_file_path}' is successfully uploaded as '{object_name}' to bucket '{bucket_name}'.")except S3Error as e:print(f"Error occurred while uploading: {e}")# 文件下载
def download_file(object_name, local_file_path):try:client.fget_object(bucket_name, object_name, local_file_path)print(f"'{object_name}' is successfully downloaded to '{local_file_path}'.")except S3Error as e:print(f"Error occurred while downloading: {e}")# 列出所有文件
def list_files():try:objects = client.list_objects(bucket_name)print(f"Objects in bucket '{bucket_name}':")for obj in objects:print(f"- {obj.object_name} (size: {obj.size} bytes)")except S3Error as e:print(f"Error occurred while listing objects: {e}")# 删除指定文件
def delete_file(object_name):try:client.remove_object(bucket_name, object_name)print(f"'{object_name}' is successfully deleted from bucket '{bucket_name}'.")except S3Error as e:print(f"Error occurred while deleting: {e}")

测试效果如下:

image

 三、控制面doc-llm-controller服务适配

总体思路:接口层接收到带文件的创建任务请求,先新增一条任务数据到mysql,其中doc字段为__PENDING_FILE__。然后拿到任务id后,调用推送文件服务将文件关联任务id一起推送到minio,结束后更新任务信息doc字段为:f"minio://{MINIO_BUCKET}/{object_name}"。

至此控制面业务结束。

services层:新增file_service.py,提供minio服务的调用

# 代码样例
def _ensure_bucket():"""确保 bucket 存在"""if not _minio_client.bucket_exists(MINIO_BUCKET):_minio_client.make_bucket(MINIO_BUCKET)def save_task_file(task_id: int, file_obj: FileStorage) -> str:"""把用户上传的文件存到 MinIO,文件名格式:{task_id}_{orig_filename}返回存入数据库的 doc 字段值,例如:minio://doc-llm-bucket/123_xxx.docx...doc_path = f"minio://{MINIO_BUCKET}/{object_name}"return doc_path

给doc_check_service, task_service 增加更新doc方法

# doc_check_service
def update_task_doc(task_id: int, doc: str) -> None:"""更新任务的 doc 字段"""task = task_service.get_task_by_id(task_id)if not task:raise TaskNotFoundError(f"任务 {task_id} 不存在")task_service.update_task_doc(task_id, doc)# task_service
def update_task_doc(task_id: int, doc: str) -> None:"""更新任务的 doc 字段"""with get_session() as session:task = session.scalar(select(TaskDocLLM).where(TaskDocLLM.task_id == task_id))if not task:raise ValueError(f"任务 {task_id} 不存在")task.doc = doc

更新接口函数,兼容传文本信息、文本文件两种方式:

@bp.route("/tasks/", methods=["POST"])
def create_doc_task():# 判断是不是文件上传if request.content_type and "multipart/form-data" in request.content_type:return _create_task_with_file()# 默认走老的 JSON 逻辑return _create_task_with_json()def _create_task_with_json():...task_id = doc_check_service.submit_doc_task(task_name, doc, product, feature)...def _create_task_with_file():....try:# 1. 先写一条任务,doc 用占位符,保证非空placeholder_doc = "__PENDING_FILE__"task_id = doc_check_service.submit_doc_task(task_name=task_name,doc=placeholder_doc,product=product,feature=feature,)doc_path = file_service.save_task_file(task_id, file_obj)# 3. 回写 doc 字段
        doc_check_service.update_task_doc(task_id, doc_path)...

用postman测试下接口效果,大致是OK的:

接口请求:

image

 flask这边日志、数据库、minio表现都OK,数据一致性有保障:

image

 

http://www.jsqmd.com/news/66955/

相关文章:

  • 第九届艺术、教育与管理国际学术会议(ICAEM 2026)
  • 详细介绍:指纹浏览器字体模拟实践
  • Adobe Stock 中国合作伙伴推荐:卓特视觉官网及代理服务详解
  • 2025年GEO 优化公司优化效果怎么样?:官方TOP10报
  • 2025年GEO 优化公司成功案例有哪些?:最新TOP10深
  • 案例深析 | 兰亭妙微如何助力“智选家居”实现数字化转型,线上销售额激增300%
  • 2025年上海资深离婚律师排名:著名离婚律师收费标准全解析
  • OEM Parking Brake Caliper Actuator for Mercedes-Benz S-Class (2014-2020) - Direct Fit Reliability
  • 2025年市场洞察公司年度排名:市场洞察哪家公司好
  • 2025年市面上知名的CTU货架批发厂家口碑推荐,轻型货架/贯通货架/仓库货架/钢制货架/模具架/CTU货架批发厂家推荐榜单
  • 2025年GEO 优化公司收费标准是什么?:最新深度解析精选
  • DASCTF 2025下半年赛 OnePanda战队WP
  • 2025 十大高清免费版权图片素材下载网站推荐
  • 2025年性价比高的 GEO 优化公司有哪些?:十大权威测评
  • 2025年杭州高德团购服务商排名:高德团购服务商家服务哪家便
  • 中科大2022Hackergame--Xcaptcha思路及做法(含python代码)
  • 2025玻璃钢格栅生产企业TOP5权威推荐:耐腐蚀格栅选型指
  • 2025年中国高性价比护栏网品牌企业推荐:知名的护栏网公司有
  • 工业搪瓷管服务商TOP5权威测评指南:精准选型破解锅炉节能痛
  • 2025年小程序开发公司哪家靠谱,避坑指南+3家经实战验证的可靠服务商推荐:含抖音小程序/微型小程序/支付宝小程序多平台小程序开发公司推荐
  • 2025年中国竹结构优质生产商十大排名:竹结构创意定制与精品
  • 2025年五大值得选的净化板制造厂技术实力全解析
  • 2025年GEO 优化公司哪家口碑好?:最新报告与解析揭秘
  • 2025年行业知名 GEO 服务商有哪些?:十大权威报告推荐
  • xcode切换arc mrc
  • Quick Open Safe Combination Disk Dial Rotation Assistant – Save Time Effort for Auto Repair
  • 2025 年结婚喜糖推荐首选:为什么越来越多人把「旺仔牛奶糖」装进婚礼糖盒?
  • Android Studio 多语言助手插件:让多语言管理变得简单高效 - 教程
  • 2025年GEO 服务商怎么对比选择?:专业指南与报告必读
  • 2025年12月尼龙齿套厂家优质企业推荐榜,耐高温尼龙齿套、齿式联轴器尼龙齿套、增强型尼龙齿套、聚焦服务品质与产品竞争力深度剖析