当前位置: 首页 > 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/a/317180.html

相关文章:

  • 深入探索React合成事件(SyntheticEvent):跨浏览器的事件处理利器
  • Windows C++ TCP/IP 两台电脑上互相传输字符串数据
  • WEB攻防-通用漏洞SQL注入sqlmapOracleMongodbDB2等
  • redis7.x源码分析:(1) sds动态字符串
  • 文件输入输出——NOI
  • 应用于新能源汽车NCV4275CDT50RKG车规级LDO线性电压调节器芯片
  • 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)