服务架构 --- ![image-20240826152353199](image-20240826152353199.png) 流程结构 --- ```mermaid graph LR 工厂[工厂] --> 创建工厂 创建工厂 --> Celery实例 创建工厂 --> Flask实例 Celery实例 --> Redis中间件 Celery实例 --> Worker1 Celery实例 --> Worker2 Celery实例 --> Worker3 Celery实例 --> Worker4 Celery实例 --> Worker5 Flask实例 --> submit submit --> Redis中间件 Redis中间件 --> Worker1 Redis中间件 --> Worker2 Redis中间件 --> Worker3 Redis中间件 --> Worker4 Redis中间件 --> Worker5 Worker1 --> ALGNODE1 Worker2 --> ALGNODE2 Worker3 --> ALGNODE3 Worker4 --> ALGNODE4 Worker5 --> ALGNODE5 ``` ```mermaid graph LR ALGNODE[ALGNODE] --> 通用PDF抽取模块 通用PDF抽取模块 --> 图片解析 通用PDF抽取模块 --> 表格解析 通用PDF抽取模块 --> 正文解析 通用PDF抽取模块 --> 标题解析 图片解析 --> 图片OCR文本 表格解析 --> 表格内容 正文解析 --> 正文内容 标题解析 --> 标题内容 图片OCR文本 --> 通用数据回收 表格内容 --> 通用数据回收 正文内容 --> 通用数据回收 标题内容 --> 通用数据回收 通用数据回收 --> 采购数据 通用数据回收 --> 投标数据 采购数据 --> 预审 投标数据 --> 预审 采购数据 --> 初审 投标数据 --> 初审 采购数据 --> 详审 投标数据 --> 详审 采购数据 --> 报价评审 投标数据 --> 报价评审 预审 --> 回传 初审 --> 回传 详审 --> 回传 报价评审 --> 回传 ``` 代码层 --- ### 异步配置文件(backend/config.py) ```python class Config: CELERY = dict( CELERY_BROKER_URL = 'redis://localhost:6379/0', CELERY_RESULT_BACKEND = 'redis://localhost:6379/0', include = "backend.celery_task", task_ignore_result = True, timezone = 'Asia/Shanghai', enable_utc = False, task_track_started = True ) ``` ### 创建工厂(backend/__init__.py) ```python from flask import Flask from celery import Celery, Task celery_app = Celery(__name__) def create_app(test_config: dict = None) -> Flask: app = Flask(__name__) class FlaskTask(Task): def __call__(self, *args: object, **kwargs: object) -> object: with app.app_context(): return self.run(*args, **kwargs) if test_config is None: app.config.from_pyfile('config.py', silent=True) else: app.config.from_mapping(test_config) celery_app.config_from_object(app.config['CELERY']) celery_app.Task = FlaskTask celery_app.set_default() return app ``` ### 封包脚本(make_celery.py) ```python from backend import ( create_app, celery_app, ) app = create_app() ``` ### WEB配置 (gunicorn_config.py) ```python workers = 1 bind = "0.0.0.0:8000" backlog = 2048 loglevel = "INFO" daemon = True pidfile = "/var/run/backend.pid" accesslog = "/var/log/backend/access.log" errorlog = "/var/log/backend/error.log" ``` ### 执行脚本(run.sh) ```bash gunicorn --config gunicorn_config.py make_celery celery multi start worker -A make_celery:celery_app -P prefork -E --loglevel=INFO --logfile=/var/log/celery/%n%I.log --pidfile=/run/celery/%n.pid celery -A make_celery:celery_app events ``` 主要模块描述 --- 1、tools 大纲解析模块 2、get_info PDF信息抽取模块 3、matcher 段落定位模块 4、project_loc 项目业绩的表格定位模块 5、responser 格式化模块 6、lmu 摘要生成模块 7、LLMAgent 大模型调用模块 8、document_ 招标文件解析模块 9、extract_price 报价抽取 10、doc2pdf word文档转pdf模块 11、extract_financial_report 财报抽取 12、ocr_api 图片OCR类 ##### PDF中无边框表格内容抽取 ``` 1. camelot-py git源下载 git clone https://www.github.com/camelot-dev/camelot 修改pyproject.toml中 pdfminer-six = "^20231228" 安装命令: 进入camelot目录下,pip install -e . 2. 在wsl Debian中安装 ghostscript 【模块本身】 apt install ghostscript 3. ghostscript 下载 pip install ghostscript==0.7.0 【模块驱动】 4. 代码修改 【CV运行时不需要设置宽高,使用默认即可】 tables_pro = camelot.read_pdf( self.file_path, # flavor='stream', pages=str(page_number+1), # edge_tol=200, # row_tol=50, ) ```