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

Qanything 2 0 源码解析系列3 文件解析服务

Qanything 2.0 源码解析系列3 : 文件解析服务

文章转载自: https://www.feifeixu.top/article/10748c4b-6561-80e9-b15d-c7309e6c021e

Qanything 2.0项目部署启动手把手教程 中分析了各个服务的启动命令。

其中,文件解析(插入文件服务)的启动命令如下:

nohup python3 -u qanything_kernel/dependent_server/insert_files_serve/insert_files_server.py --port 8110 --workers 1 > /workspace/QAnything/logs/debug_logs/insert_files_server.log 2>&1 &

📝 文件解析服务

insert_files_server.py主要是两个方法:

  1. check_and_process 从表中拿文件交给process_data方法处理
  2. process_data
    1. 文件切分doc
    2. doc向量化存milvus向量数据库

下面只介绍核心代码逻辑:

check_and_process

服务启动之前通过app.add_task方法将一个异步任务(check_and_process函数)添加到应用的任务列表中。

@app.listener('before_server_start')
async def setup_workers(app, loop):
    # 创建数据库连接池
    app.ctx.pool = await aiomysql.create_pool(**db_config, minsize=1, maxsize=16, loop=loop, autocommit=False,
                                              init_command='SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED')  # 更改事务隔离级别
    app.add_task(check_and_process(app.ctx.pool))

check_and_process 的核心是一个while True循环。该循环从File表中拿到status=’gray’ 的文件记录,一次取一个,交给process_data 函数处理。

调用上传文件接口时,给定的每个文件的状态都是gray,表示该文件已经上传成功,但是还没有进行解析。

process_data

proces_data的核心:

  1. 初始化LocalFileForInsert 类对象,在qanything_kernel/core/retriever/general_document.py中定义,包含了很多方法,是文件解析服务的核心类。每个文件都会初始化一个LocalFileForInsert 对象进行后续处理。

local_file = LocalFileForInsert(user_id, kb_id, file_id, file_location, file_name, file_url, chunk_size, mysql_client)

  1. 执行local_file.split_file_to_docs 方法,将文件切分成doc

    切分逻辑:

    1. 图片类型(png、jpg、jpeg): Qanything 2.0源码解析系列4: 图片解析逻辑
    2. pdf类型(pdf):writing, coming soon!
  2. 执行retriever.insert_documents(local_file.docs, chunk_size) 将doc进行split后通过bce-embedding模型向量化并存入Milvus数据库。

🤗 总结归纳

总结文章的内容

📎 参考文章

  • source code

http://www.kler.cn/news/317180.html

相关文章:

  • golang学习笔记8-运算符与输入
  • torch.stack
  • docker修改默认存储路径和网段
  • [ffmpeg] 录制
  • 2023年06月中国电子学会青少年软件编程(Python)等级考试试卷(二级)答案 + 解析
  • Apache的ab压力测试工具与性能监控
  • 【第十一章:Sentosa_DSML社区版-机器学习之分类】
  • windows C++ 并行编程-使用消息块筛选器
  • PyCharm安装详情教程
  • 基于OpenCV的单目测距
  • Apache Iceberg Architecture—Iceberg 架构详解
  • Seata学习笔记
  • 使用python写按键程序
  • Vue学习(五)生命周期、组件
  • IT行业的现状与未来发展趋势
  • 数据库主备副本物理复制和逻辑复制对比
  • 除猫毛用粘毛器还是宠物空气净化器?希喂/米家/352/范罗士/有哈空气净化器对比
  • vue3<script setup>中computed
  • ELK环境部署
  • Codeforces Round 971 (Div. 4) G1. Yunli‘s Subarray Queries (easy version)
  • 2024年中国科技核心期刊目录(科普卷)
  • 快速理解TCP协议(三)——TCP协议的三次握手与四次挥手
  • 苍穹外卖学习笔记(九)
  • 【Webpack--012】提取单独的CSS文件压缩CSS文件
  • leetcode:验证回文串
  • 综合时如何计算net delay?
  • 【最基础最直观的排序 —— 冒泡排序算法】
  • 公安局党建平台建设方案和必要性-———未来之窗行业应用跨平台架构
  • 电动车车牌识别系统源码分享
  • 【LIO-SAM】LIO-SAM论文翻译(2020年)