Tender Service 智能标书系统架构设计¶
文档版本:V1.0 编制日期:2026-07-23 文档性质:系统架构设计 事实基线:Tender Service 当前代码、数据模型、任务队列与部署结构 配套文档:系统架构与完整功能清单、MVP v1 接口总览
1. 概述¶
招投标业务是一类典型的知识密集型、时间约束型和强合规型业务。
一份招标文件通常包含项目背景、采购需求、技术参数、商务条款、资格条件、评分标准、交付要求等大量信息。不同内容分散在正文、表格、附件和补充文件中,既有明确条款,也存在需要结合上下文才能判断的隐含约束。
标书编制并不是简单的文字生成,而是一个连续的业务过程:
- 准确理解招标文件。
- 识别必须响应的要求。
- 规划投标文件结构。
- 调用企业知识与项目素材。
- 完成不同章节的内容编制。
- 持续检查内容完整性和一致性。
- 形成可编辑、可交付的正式文档。
Tender Service 围绕这一过程构建智能标书生产体系,将文档解析、大模型生成、企业知识检索、产品与图片素材、任务调度和文档输出整合为统一系统。
系统的核心目标不是用一次模型调用生成整本标书,而是把招标文件理解、内容规划、知识调用、正文生成和成果输出拆解为可管理、可追踪、可恢复的业务链路,使 AI 能力真正进入标书编制流程。
2. 业务背景与问题分析¶
2.1 招标文件理解成本高¶
招标文件篇幅长、格式复杂,内容可能同时存在于 PDF、Word、Excel 和附件中。项目概况、评分标准、技术要求、资格条件和关键时间节点分散在不同章节,人工研读容易出现遗漏。
传统处理方式通常存在以下问题:
- 文件格式和排版差异导致内容提取困难。
- 关键信息依赖人工逐页查找。
- 结构化结果与原始文件脱节。
- 不同人员对同一条款的理解不一致。
- 文件发生替换后,历史解析结果难以安全更新。
2.2 标书编制周期长¶
标书正文由多个章节组成,每个章节需要结合招标要求、评分标准、企业能力、产品参数和历史案例进行编写。
如果只使用通用文本生成,容易出现:
- 目录结构与招标要求不匹配。
- 正文缺少项目上下文。
- 各章节表述重复或相互矛盾。
- 产品、资质和案例信息无法准确引用。
- 长时间生成任务中断后需要从头开始。
2.3 企业知识分散¶
企业知识通常分散在历史标书、产品资料、资质文件、案例材料、图片素材和个人经验中。缺少统一管理时,编制人员需要反复寻找和复制内容,难以形成组织级知识资产。
知识管理面临的不只是“文件能否上传”,还包括:
- 文件能否稳定解析。
- 内容能否被切分和检索。
- 新版本能否安全替换旧版本。
- 检索结果能否进入生成上下文。
- 不同用户之间能否保持数据隔离。
2.4 AI 长任务需要工程化保障¶
文档解析、知识向量化和全文生成都属于长时间任务,不能依赖单个 HTTP 请求持续执行。
系统需要处理:
- 任务排队和并发限制。
- 任务进度实时反馈。
- 用户主动取消。
- Worker 异常退出。
- 网络、模型和存储临时故障。
- 重试时的数据幂等。
- 生成额度的预占和结算。
- 服务重启后的任务恢复。
2.5 输出成果必须可编辑、可交付¶
AI 生成的内容最终必须进入正式投标文件,而不是停留在对话框中。
系统需要保持目录、正文、样式和素材之间的结构关系,并输出符合办公场景要求的 Word 文档,支持用户继续编辑、审阅和提交。
3. 建设目标¶
Tender Service 的建设目标可以归纳为五个方面。
3.1 建立招标文件智能理解能力¶
将不同格式的招标文件统一转换为可处理文本,并进一步提取项目概况、采购需求、评分标准等结构化信息,为后续目录规划和正文生成提供统一事实基础。
3.2 建立端到端标书编制能力¶
覆盖标书创建、文件解析、目录生成、编写思路、章节正文、一键全文生成和 Word 输出,形成连续的标书生产流程。
3.3 建立企业知识融合能力¶
统一管理知识文档、产品数据、清单附件和图库素材,在生成正文前按项目和章节语义检索相关内容,使生成结果建立在企业真实资料之上。
3.4 建立可靠的 AI 任务运行体系¶
通过持久化任务、独立 Worker、任务状态机、租约、心跳、重试和恢复机制,使耗时 AI 任务具备可追踪、可取消、可恢复和可结算能力。
3.5 建立可运营、可演进的平台能力¶
将 Prompt、模型、场景绑定、额度、套餐、支付、日志和管理功能平台化,使系统能够在不同项目类型和业务阶段持续调整,而不依赖频繁修改核心代码。
4. 设计原则¶
4.1 业务流程优先¶
AI 能力必须服从标书编制流程。系统首先明确业务状态、输入输出和人工决策点,再决定模型在哪个环节参与。
4.2 结构化优先¶
招标文件不是一段普通文本。项目概况、采购要求、评分项、目录节点、编写思路和章节正文必须分别建模,避免把全部业务状态压缩到一个 Prompt 中。
4.3 确定性流程与概率性模型分离¶
任务流转、权限、额度、版本切换和数据写入由确定性代码控制;文档理解、语义检索和内容生成由模型完成。
模型可以提出结果,但不能直接决定系统事务是否完成。
4.4 生成前组织上下文¶
系统不把所有资料无差别塞入模型,而是根据标书、目录节点和业务场景组装上下文。上下文工程是生成质量的核心组成部分。
4.5 人机协同¶
AI 负责降低阅读、检索和初稿编制成本,用户保留目录调整、编写思路确认、正文修改、素材选择和最终交付权。
4.6 长任务异步化¶
文档解析、知识摄取、图片理解、产品解析和全文生成均通过任务队列执行。API 只负责创建任务、查询状态和传递事件。
4.7 数据可恢复¶
重要任务状态必须写入 PostgreSQL。Redis 用于队列、实时事件、缓存和临时协调,不作为关键业务结果的唯一存储。
4.8 多租户安全¶
用户数据从数据库查询、对象存储路径、缓存 key、向量检索到任务执行全过程保持隔离。
5. 系统边界¶
5.1 系统负责¶
- 用户登录、身份识别和数据隔离。
- 招标文件与业务附件上传。
- PDF、DOC、DOCX、XLS、XLSX 内容提取。
- 项目概况、需求和评分标准解析。
- 标书目录规划和人工调整。
- 编写思路生成与维护。
- 单章和全文正文生成。
- 企业知识库管理与语义检索。
- 产品资料解析和结构化。
- 图库管理、图片理解和文档抽图。
- 清单附件解析。
- Word 文档输出。
- Prompt 模板、版本和场景绑定。
- AI 任务调度、进度、取消、重试和恢复。
- 字数额度、订阅、订单和支付。
- 管理与运行审计。
5.2 系统当前不直接负责¶
- 招标公告采集和商机发现。
- CA 签章和电子投标平台提交。
- 投标报价决策。
- 法律意义上的自动合规结论。
- 完全无人参与的投标决策。
这些能力可以通过后续集成或独立领域服务扩展,但不应与当前标书生产核心链路混在一起。
6. 业务能力架构¶
6.1 一页式系统能力总图¶
flowchart TB
subgraph Access["用户与接入层"]
direction LR
UserWeb["用户端前台<br/>项目、解析、目录、正文"]
AdminWeb["管理后台<br/>Prompt、用户、套餐、日志"]
API["统一 API / SSE<br/>认证、查询、实时进度"]
MainFlow["标书生产主流程<br/>解析 → 规划 → 生成 → 编辑 → 导出"]
end
subgraph Business["业务能力层"]
direction TB
subgraph TenderDomain["智能标书生产"]
direction LR
Parse["招标文件智能解析<br/>概况、需求、评分标准"]
Outline["目录与编写规划<br/>骨架、节点、思路"]
Generate["内容智能生成<br/>单章、全文、AI 对话"]
Deliver["成果输出<br/>正文编辑、Word 导出"]
end
subgraph AssetDomain["企业知识与素材"]
direction LR
Knowledge["知识库与 RAG<br/>解析、切块、向量检索"]
Product["企业产品库<br/>Excel 解析、产品结构化"]
Image["智能图库<br/>文档抽图、图片理解"]
Checklist["清单附件<br/>PDF、Word、Excel 解析"]
end
subgraph PlatformDomain["平台运营与治理"]
direction LR
Tenant["用户与多租户<br/>JWT、角色、数据隔离"]
PromptOps["Prompt 运营<br/>模板、版本、场景绑定"]
TaskOps["任务运营<br/>状态、进度、取消、恢复"]
Billing["额度与商业化<br/>订阅、订单、支付、流水"]
end
end
subgraph Intelligence["智能编排与 AI 能力层"]
direction LR
Workflow["业务工作流编排<br/>FastAPI + Service + 状态机"]
Context["上下文工程<br/>ContextAssembler"]
PromptEngine["Prompt 解析引擎<br/>行业、角色、场景匹配"]
RAGEngine["RAG 引擎<br/>Chunk + Embedding + Retrieval"]
ModelGateway["模型网关<br/>路由、限流、重试、回退"]
Worker["异步执行集群<br/>8 类 ARQ Worker"]
end
subgraph Foundation["数据与基础设施层"]
direction LR
PostgreSQL[("PostgreSQL<br/>业务事实与任务状态")]
Redis[("Redis<br/>队列、SSE、锁、缓存")]
OSS[("S3 兼容 OSS<br/>文档与图片")]
Vector[("Qdrant / DashVector<br/>知识向量")]
Models["LLM / Embedding<br/>文本、视觉、向量模型"]
External["外部业务服务<br/>短信、支付宝、微信支付"]
end
UserWeb --> API
AdminWeb --> API
API --> MainFlow
MainFlow --> Parse
Parse --> Outline --> Generate --> Deliver
Knowledge --> Generate
Product --> Generate
Image --> Generate
Checklist --> Generate
API --> Tenant
PromptOps --> Parse
PromptOps --> Outline
PromptOps --> Generate
TaskOps --> Parse
TaskOps --> Generate
Billing --> Generate
Business --> Workflow
Workflow --> Context
Context --> PromptEngine
Context --> RAGEngine
PromptEngine --> ModelGateway
RAGEngine --> ModelGateway
Workflow --> Worker
Workflow --> PostgreSQL
Worker --> PostgreSQL
Worker --> Redis
Worker --> OSS
RAGEngine --> Vector
ModelGateway --> Models
Tenant --> External
Billing --> External
这张图从上到下表达四个层次:
- 用户通过前台、管理后台和 API 进入标书生产流程。
- 业务能力围绕标书生产、企业知识和平台治理组织。
- 智能编排层负责上下文、Prompt、RAG、模型调用和异步任务。
- PostgreSQL、Redis、OSS、向量库和外部模型构成运行基础。
flowchart LR
Project["项目与标书管理"]
Upload["文件与素材接入"]
Understand["招标文件智能理解"]
Plan["目录与编写规划"]
Knowledge["企业知识与素材检索"]
Generate["章节与全文生成"]
Review["人工校对与内容调整"]
Deliver["Word 成果输出"]
Operate["Prompt、任务、额度与运营"]
Project --> Upload
Upload --> Understand
Understand --> Plan
Plan --> Generate
Knowledge --> Generate
Generate --> Review
Review --> Deliver
Operate -.支撑.-> Understand
Operate -.支撑.-> Knowledge
Operate -.支撑.-> Generate
系统能力分为四个层次。
6.2 标书生产能力¶
- 标书项目管理。
- 招标文件解析。
- 项目要点和评分标准提取。
- 目录骨架生成。
- 目录节点编辑和排序。
- 编写思路生成。
- 单章正文生成。
- 一键全文生成。
- 正文人工编辑。
- Word 文档输出。
6.3 企业知识能力¶
- 知识库与知识文件管理。
- 文档提取、切块和向量化。
- 语义检索。
- 知识库助手。
- 产品库与产品资料解析。
- 图库与图片理解。
- 清单附件解析。
- 标书与知识、产品、图片的引用关系。
6.4 AI 运行能力¶
- 模型配置与调用适配。
- Prompt 模板和版本。
- 场景绑定。
- 上下文组装。
- 流式生成。
- 模型限流、重试和回退。
- usage 记录和字数结算。
6.5 平台支撑能力¶
- 用户认证和多租户隔离。
- 通用文件上传。
- 异步任务和 SSE。
- 对象存储。
- 订阅、额度和支付。
- 管理后台。
- 健康检查和运行日志。
7. 核心业务设计¶
7.1 招标文件智能解析¶
招标文件解析采用“文档提取 + 语义理解”两阶段设计。
第一阶段解决文件能否稳定转换为统一文本的问题:
- 客户端通过预签名 URL 将文件直接上传至对象存储。
- API 创建解析任务并将轻量任务 ID 写入 ARQ。
- Worker 从对象存储下载文件。
- 隔离子进程执行 PDF、Word 或 Excel 解析。
- 结果统一转换为 Markdown。
- 原始提取内容写入 PostgreSQL。
第二阶段解决文本如何转换为业务信息的问题:
- 根据场景解析已发布 Prompt。
- 调用解析模型提取项目概况。
- 识别采购需求和关键约束。
- 解析评分标准及评分项。
- 将结构化结果写入独立业务表。
- 通过 Redis Pub/Sub 向前端持续发送解析进度。
两阶段设计使文件解析故障与模型解析故障相互隔离,也使原始 Markdown 可以独立保存、复用和人工检查。
flowchart TD
Upload["OSS 直传"]
Confirm["确认上传并创建任务"]
Extract["隔离进程提取 Markdown"]
Source["保存原始文本"]
Analyze["LLM 语义解析"]
Overview["项目概况"]
Requirement["采购需求"]
Scoring["评分标准"]
Edit["人工校对与修正"]
Upload --> Confirm --> Extract --> Source --> Analyze
Analyze --> Overview
Analyze --> Requirement
Analyze --> Scoring
Overview --> Edit
Requirement --> Edit
Scoring --> Edit
7.2 目录规划¶
目录是连接招标要求与正文生成的中间结构。
系统先根据项目解析结果生成一二级目录骨架,再允许用户通过以下方式完善:
- 手工创建目录节点。
- 导入外部目录。
- AI 补全不完整目录。
- 调整章节标题和顺序。
- 生成章节候选并确认应用。
- 设置页数和字数预估。
- 为节点生成编写思路。
- 根据编写思路进一步生成子目录。
每个目录节点使用稳定 node_uid 作为业务标识。章节编号发生变化时,编写思路、正文和历史记录仍能关联到同一节点。
目录设计避免将“用户看到的编号”当作永久主键,使目录编辑和正文持久化可以独立演进。
7.3 编写思路¶
编写思路承担招标要求到正文内容之间的规划作用。
它描述一个章节应该回答什么问题、采用什么结构、引用哪些素材、突出哪些能力,而不是直接生成最终正文。
系统支持:
- 按章节标题预览编写思路。
- 按行业和货物角色选择不同 Prompt。
- 保存结构化编写思路 block。
- 用户确认后应用。
- 根据编写思路生成下级目录。
- 在正文生成时将编写思路作为核心上下文。
这一设计把内容规划与内容表达分离,有助于提高长文档结构稳定性。
7.4 章节正文生成¶
正文生成不是单一 Prompt 调用,而是一个上下文装配过程。
ContextAssembler 根据当前章节组装:
- 项目基础信息。
- 当前节点及目录路径。
- 兄弟章节信息。
- 节点编写思路。
- 关联评分标准。
- 手工清单。
- 已解析的清单附件。
- 知识库检索片段。
- 产品资料。
- 图片素材及其理解结果。
组装完成后,系统解析 section_content 场景 Prompt,调用写作模型流式生成,并将最终正文保存到章节表。
flowchart LR
Node["目录节点"]
Hint["编写思路"]
Score["评分要求"]
Checklist["清单附件"]
RAG["知识检索"]
Product["产品资料"]
Image["图片素材"]
Context["章节上下文"]
Prompt["场景 Prompt"]
LLM["写作模型"]
Content["章节正文"]
Node --> Context
Hint --> Context
Score --> Context
Checklist --> Context
RAG --> Context
Product --> Context
Image --> Context
Context --> Prompt --> LLM --> Content
7.5 一键全文生成¶
全文生成可能包含几十个章节,并持续较长时间,因此使用持久化运行模型。
系统创建:
- 一个
GenerationRun表示整次全文生成。 - 多个
GenerationSectionJob表示叶子章节生成任务。
运行过程包括:
- 读取当前目录树。
- 找出需要生成的叶子章节。
- 估算总字数。
- 预占用户额度。
- 创建章节任务。
- 按目录顺序分批入队。
- Worker 加载章节上下文并生成。
- 持续更新心跳和进度。
- 按实际生成字数结算。
- 收口全文运行和标书状态。
Worker 只接收 run ID 和 job ID,不在 Redis 中保存完整业务上下文。
该设计具有以下优势:
- 队列消息轻量。
- 任务状态可以持久化。
- 服务重启后可以恢复。
- 单章失败可以独立重试。
- 用户可以取消全文运行。
- SSE 丢失时可以从数据库读取最新状态。
- 额度可以按整次运行预占和结算。
7.6 文档成果输出¶
系统将目录、正文、图片和文档样式组合为正式 DOCX。
输出内容包括:
- 封面。
- 项目名称和项目编号。
- 系统免责声明。
- 多级目录标题。
- 章节正文。
- Markdown 表格和列表。
- 富文本内容。
- 图片。
- 用户选择或保存的文档样式。
文档输出与 AI 生成解耦。模型只负责生成内容,Word 服务负责文档结构、样式和文件格式。
8. 知识与素材架构¶
8.1 知识资产分类¶
系统将企业知识按使用方式划分为不同资产:
| 资产类型 | 主要内容 | 使用方式 |
|---|---|---|
| 知识文档 | 历史标书、案例、制度、技术资料 | 切块、向量检索、助手问答 |
| 产品资料 | 产品参数、型号、描述和图片 | 结构化查询、正文上下文 |
| 图库素材 | 项目图片、产品图、案例图 | 图片理解、章节引用 |
| 清单附件 | 工程量、设备、物料和响应清单 | 文本解析、正文上下文 |
| 招标文件 | 当前项目的需求和评分依据 | 结构化解析、目录和生成 |
不同资产采用不同的数据模型和处理方式,不强行统一为一种“知识文件”。
8.2 知识文件摄取¶
知识文件采用版本化摄取:
flowchart TD
File["知识文件"]
Parse["文档提取"]
Chunk["文本切块"]
Embed["Embedding"]
Candidate["写入候选版本"]
Verify["完整性检查"]
Switch["切换 active_version"]
Cleanup["清理旧版本"]
File --> Parse --> Chunk --> Embed --> Candidate --> Verify --> Switch --> Cleanup
关键机制:
- 文件解析在隔离进程执行。
- chunk 元数据保存在 PostgreSQL。
- 向量写入 Qdrant 或 DashVector。
- 新任务使用独立版本。
- 全部写入成功后再切换
active_version。 - 通过版本 fencing 防止旧 Worker 覆盖新任务。
- 定时任务协调长时间未完成的解析任务。
这保证了知识文件重新解析期间,旧版本仍可继续提供检索,不会因半成品索引造成知识库不可用。
8.3 语义检索¶
语义检索流程:
- 接收用户问题或章节检索请求。
- 根据配置决定是否改写查询。
- 生成 query embedding。
- 在指定知识库和活跃版本范围内检索。
- 按相似度和业务过滤条件筛选。
- 控制 top-k 和上下文长度。
- 返回片段、文件信息和引用元数据。
检索服务同时支撑:
- 知识库助手。
- 正文生成。
公开搜索接口不是必要前提,检索能力作为内部领域服务被不同业务流程复用。
8.4 产品资料结构化¶
产品资料通常来自 Excel,既包含单元格文本,也包含嵌入图片。
产品解析按照阶段执行:
- 提取文本。
- 提取图片。
- 识别产品字段。
- 分类图片用途。
- 关联图片与产品。
- 上传有效图片。
- 持久化产品。
每个阶段保存执行记录,便于定位错误和恢复任务。产品信息以结构化数据参与正文生成,不依赖全文向量检索。
8.5 图片素材理解¶
图片上传后可异步执行 AI 理解,提取:
- 标题。
- 内容描述。
- 标签。
- 分类。
- 使用场景。
- 建议章节。
- OCR 文本。
系统还支持从 PDF、DOC、DOCX 中抽取图片,先建立短期 extraction session,用户确认后再写入图库。
该设计避免未经确认的大量临时图片污染正式素材库。
9. AI 能力架构¶
9.1 场景化模型调用¶
不同业务任务具有不同的准确率、上下文长度、速度和成本要求。系统通过模型 profile 为以下场景分别配置模型:
- 文档解析。
- 项目概况提取。
- 评分标准提取。
- 目录骨架。
- 编写思路。
- 章节正文。
- AI 对话。
- 产品字段提取。
- 产品图片分类。
- 图库图片理解。
- Embedding。
系统不假设单一模型适合全部任务。
9.2 Prompt 运行平台¶
Prompt 使用数据库模板和版本管理:
- 模板与业务场景解耦。
- 每个模板维护多个版本。
- 草稿版本可编辑。
- 已发布版本进入运行时。
- 单个模板只保留一个当前发布版本。
- 场景绑定支持行业、货物角色和优先级。
- 运行时选择最具体的匹配规则,再回退到通用规则。
当前主要场景包括:
- 招标文件解析。
- 项目概况。
- 评分标准。
- 目录骨架。
- 通用和分类编写思路。
- 根据编写思路生成目录。
- 章节正文。
- 图片理解。
Prompt 管理使业务人员可以在不修改主流程代码的情况下调整模型行为,同时保留版本和发布边界。
9.3 上下文工程¶
系统把上下文分为四类:
| 上下文类别 | 内容 |
|---|---|
| 项目上下文 | 项目名称、行业、角色、采购信息 |
| 结构上下文 | 当前章节、父子关系、兄弟节点、编写思路 |
| 要求上下文 | 评分标准、采购要求、清单 |
| 企业知识上下文 | 知识片段、产品、图片、历史素材 |
上下文由服务端按场景组织,避免客户端自行拼装 Prompt,也避免不同接口形成不一致的知识调用方式。
9.4 工作流式智能协同¶
从系统能力看,招标解析、目录规划、知识检索、正文生成、图片理解和质量控制可以视为多个专业智能能力。
Tender Service 采用“受控工作流”协调这些能力:
flowchart LR
Orchestrator["业务状态机 / 任务编排"]
Parser["文档理解能力"]
Planner["目录规划能力"]
Retriever["知识检索能力"]
Writer["内容生成能力"]
Vision["图片理解能力"]
Exporter["文档输出能力"]
Orchestrator --> Parser
Orchestrator --> Planner
Orchestrator --> Retriever
Orchestrator --> Writer
Orchestrator --> Vision
Orchestrator --> Exporter
这些能力不直接相互修改状态,而是由 API、Service 和 Worker 组成的业务编排层控制。
这种设计保留了智能能力的专业分工,同时保证任务状态、权限、数据写入和费用结算仍由确定性系统管理。
10. 技术架构¶
10.1 总体技术架构¶
flowchart TB
subgraph Access["接入层"]
Web["用户端 Web"]
Admin["管理后台"]
Callback["支付平台回调"]
end
subgraph Application["应用层"]
FastAPI["FastAPI Router"]
Auth["认证与租户上下文"]
Domain["领域 Service"]
SSE["SSE 事件接口"]
end
subgraph Intelligence["智能能力层"]
ParseAI["解析模型"]
OutlineAI["目录与思路模型"]
WritingAI["正文模型"]
ChatAI["对话模型"]
VisionAI["图片理解模型"]
Embedding["Embedding"]
Prompt["Prompt 场景平台"]
end
subgraph Async["异步执行层"]
ARQ["Redis + ARQ"]
Workers["领域 Worker"]
Cron["Cron 与任务协调"]
end
subgraph Data["数据与知识层"]
PostgreSQL[("PostgreSQL")]
Redis[("Redis")]
OSS[("S3 兼容 OSS")]
Vector[("Qdrant / DashVector")]
end
Web --> FastAPI
Admin --> FastAPI
Callback --> FastAPI
FastAPI --> Auth --> Domain
FastAPI --> SSE
Domain --> Prompt
Domain --> ParseAI
Domain --> OutlineAI
Domain --> WritingAI
Domain --> ChatAI
Domain --> VisionAI
Domain --> Embedding
Domain --> ARQ
ARQ --> Workers
Cron --> Workers
Workers --> Domain
Domain --> PostgreSQL
Domain --> Redis
Domain --> OSS
Domain --> Vector
SSE --> Redis
SSE --> PostgreSQL
10.2 模块化单体¶
系统采用模块化单体架构:
- API、Service、模型和 Worker 位于同一代码仓库。
- 业务域通过目录和 Service 边界组织。
- PostgreSQL 是统一事务边界。
- Worker 复用领域 Service。
- 不同 Worker 进程按资源类型独立部署。
这种架构适合当前业务阶段:
- 核心领域之间存在大量事务和上下文共享。
- 单体部署降低跨服务契约和运维复杂度。
- Worker 拆分已经隔离主要计算负载。
- 未来可以按稳定领域边界进一步拆分,而不需要提前引入分布式事务。
10.3 API 与 Worker 分离¶
API 进程负责:
- 请求校验。
- 用户认证。
- 资源所有权检查。
- 轻量事务。
- 创建任务。
- 查询状态。
- SSE 输出。
Worker 进程负责:
- 文档解析。
- 快速结构化解析。
- 章节生成。
- 知识摄取。
- 产品解析。
- 清单解析。
- 图片理解。
- 订阅维护。
不同 Worker 使用独立 Redis queue,防止耗时任务相互阻塞。
10.4 存储分工¶
| 存储 | 定位 | 保存内容 |
|---|---|---|
| PostgreSQL | 业务事实与事务主库 | 用户、标书、解析结果、目录、正文、任务、额度、订单 |
| Redis | 短期协调与实时通道 | ARQ、Pub/Sub、验证码、锁、claim、会话、临时状态 |
| OSS | 二进制对象存储 | 招标文件、知识文件、产品文件、图片、临时抽图 |
| 向量库 | 语义检索索引 | 知识文件 chunk embedding |
关键业务完成状态不能只存在 Redis 中。
11. 数据架构¶
系统当前包含 46 张 SQLModel 表,按领域分为:
- 用户与系统。
- 通用任务。
- 标书、解析、目录和正文。
- 全文生成运行和章节 job。
- 知识库、文件、内容和 chunk。
- 产品库、产品和解析阶段。
- 图库和图片。
- Prompt 模板、版本和绑定。
- 订阅、额度、订单和支付。
11.1 标书聚合¶
Tender 是标书业务的聚合根,关联:
- 原始文件与解析内容。
- 项目概况、需求和评分标准。
- 目录 JSON 和目录节点业务标识。
- 编写思路。
- 章节正文。
- 清单附件。
- 知识库、产品和图片引用。
- 文档样式。
- 全文生成运行。
11.2 任务模型¶
系统同时使用两类任务模型:
IngestionTask:面向通用解析和日志。- 领域任务表:面向知识、产品、清单和全文生成等需要专门状态的数据。
通用任务提供统一查询和事件能力,领域任务保存业务专属阶段、版本和恢复信息。
11.3 版本模型¶
需要安全替换的内容使用显式版本:
- Prompt 模板版本。
- 知识文件 active version。
- 产品解析 job version。
- 全文生成 run/job。
版本不是展示字段,而是并发控制和运行隔离的一部分。
12. 异步任务与状态设计¶
12.1 任务状态机¶
长任务一般包含:
不同领域可以增加处理阶段,但必须具备明确终态。
12.2 幂等与并发控制¶
系统通过以下机制控制重复任务:
- 数据库唯一约束。
- Redis claim。
- 任务版本号。
- 行锁和事务。
- 订单状态锁定。
- Worker job ID。
- active version 切换。
任务重试必须读取当前数据库状态,不能默认上一次执行没有产生任何结果。
12.3 租约与心跳¶
全文生成 job 使用租约和心跳判断 Worker 是否仍在处理任务。
Worker 异常退出后,协调任务可以识别过期租约并重新调度。这样既能恢复任务,又能避免两个 Worker 同时写入同一章节。
12.4 取消¶
取消请求先写入数据库状态,Worker 在安全检查点读取取消标记。
系统不依赖强制终止进程来实现业务取消,避免在文件上传、数据库事务或外部模型调用中留下不可预测状态。
12.5 启动恢复¶
API 和 Worker 启动时执行必要协调:
- 检查遗留运行任务。
- 将无法恢复的任务收口为失败。
- 重新协调可恢复 job。
- 迁移旧缓存 key。
- 执行订阅维护补偿。
13. 实时反馈设计¶
系统通过 SSE 向客户端反馈:
- 招标文件解析进度。
- 通用任务日志。
- 子目录生成增量。
- 单章正文生成增量。
- 全文生成进度。
- 知识文件解析。
- 产品文件解析。
- 清单解析。
- 图片分析批次。
- AI 对话。
实时事件主要来自 Redis Pub/Sub。对于全文生成等关键流程,API 同时轮询 PostgreSQL 作为兜底。
SSE 只承担信息传递,不承担业务状态存储。客户端断线重连后,仍可以从任务查询接口恢复当前状态。
14. 额度与交易一致性¶
AI 生成会产生可计量成本,因此额度设计进入任务事务。
14.1 额度来源¶
- 永久额度。
- 月付或年付套餐额度。
- 不限量订阅。
- 年付套餐的周期额度。
14.2 扣减顺序¶
- 活跃不限量权益。
- 最早到期的有限套餐额度。
- 永久额度。
14.3 全文生成结算¶
flowchart LR
Estimate["估算字数"]
Reserve["预占额度"]
Generate["执行生成"]
Actual["统计实际字数"]
Settle["结算"]
Release["释放剩余预占"]
Extra["补扣超出部分"]
Estimate --> Reserve --> Generate --> Actual --> Settle
Settle --> Release
Settle --> Extra
额度预占避免用户同时启动多个全文任务导致超额使用。所有额度变化写入字数交易流水。
15. 安全架构¶
15.1 身份认证¶
- JWT 访问 token。
- Bearer Authorization。
- SSE 支持 query token。
- 密码使用 PBKDF2-SHA256。
- 短信验证码保存在 Redis。
- 验证码具备冷却、次数和失败限制。
15.2 多租户隔离¶
- 当前用户写入 ContextVar。
- SQLModel 查询钩子自动追加
user_id条件。 - 关键资源执行显式所有权检查。
- OSS key 包含用户或业务范围。
- Redis key 包含用户和资源标识。
- 向量检索限制知识库和活跃版本。
15.3 管理权限¶
管理员权限通过依赖显式控制,不以 URL 前缀作为唯一依据。
跨租户后台任务和管理查询必须显式声明绕过租户过滤,并在业务层限定查询范围。
15.4 文件安全¶
- 客户端使用短期预签名 URL。
- 服务端确认对象存在和文件元数据。
- 按业务限制扩展名和 MIME。
- 临时抽图和未绑定附件设置过期时间。
- 对象存储密钥不返回客户端。
15.5 密钥管理¶
- 本地环境使用 env 文件。
- 开发和测试可通过 Vault 注入。
- Docker 运行环境依赖外部注入。
- 日志和部署检查只验证配置存在,不输出密钥值。
16. 可靠性设计¶
16.1 故障隔离¶
- API 与计算 Worker 分离。
- 不同业务使用独立 queue。
- Office/PDF 解析运行在隔离子进程。
- 模型调用设置超时和重试。
- 向量版本切换避免半成品索引上线。
- 支付回调使用事务和幂等状态。
16.2 数据一致性¶
- PostgreSQL 事务保护业务写入。
- 任务终态与业务对象状态共同收口。
- 全文生成按实际字数结算。
- 支付成功、支付记录和订阅发放在事务内处理。
- Prompt 发布保证单一生效版本。
16.3 降级¶
- SSE 实时事件不可用时读取数据库状态。
- AI Chat 支持模型回退。
- 知识新版本构建期间继续使用旧版本。
- Vault 不可用时开发命令可以回退到本地 env。
16.4 健康检查¶
/health/live用于进程存活。/health/ready检查数据库、Redis 和核心写作模型配置。- Compose 为 API 和 Worker 配置进程级健康检查。
OSS 和向量库仍需要通过部署脚本或独立监控补充检查,不能只依赖单一 HTTP 健康接口。
17. 可观测性¶
系统当前可观测信息包括:
- API 和 Worker 结构化日志。
- 通用任务日志。
- 解析阶段和进度。
- 产品解析阶段记录。
- 全文生成 run/job 状态。
- Worker 心跳和租约。
- 模型 usage。
- 字数交易流水。
- 支付流水。
- 订阅维护日志。
- 用户操作日志。
建议观测指标按三类组织:
17.1 业务指标¶
- 标书创建量。
- 文件解析成功率。
- 目录生成成功率。
- 单章和全文生成完成率。
- 平均生成字数。
- 知识库引用率。
- Word 导出次数。
17.2 AI 指标¶
- 模型调用成功率。
- 首 token 延迟。
- 总生成耗时。
- token 和字数消耗。
- Prompt 场景错误率。
- RAG 检索耗时和有效召回数。
17.3 运行指标¶
- 各队列积压量。
- Worker 活跃数。
- job 重试率。
- 过期租约数量。
- PostgreSQL 连接与慢查询。
- Redis、OSS、向量库可用性。
18. 部署架构¶
flowchart TB
Gateway["反向代理 / 网关"]
API["FastAPI API"]
GenWorker["Generation Worker"]
ParseWorker["Tender Parse Worker"]
KnowledgeWorker["Knowledge Worker"]
ProductWorker["Product Worker"]
ChecklistWorker["Checklist Worker"]
ImageWorker["Image Worker"]
SubscriptionWorker["Subscription Worker"]
PostgreSQL[("PostgreSQL")]
Redis[("Redis")]
OSS[("OSS")]
Qdrant[("Qdrant")]
Model["外部或私有化模型服务"]
Gateway --> API
API --> PostgreSQL
API --> Redis
API --> OSS
Redis --> GenWorker
Redis --> ParseWorker
Redis --> KnowledgeWorker
Redis --> ProductWorker
Redis --> ChecklistWorker
Redis --> ImageWorker
Redis --> SubscriptionWorker
GenWorker --> PostgreSQL
ParseWorker --> PostgreSQL
KnowledgeWorker --> PostgreSQL
ProductWorker --> PostgreSQL
ChecklistWorker --> PostgreSQL
ImageWorker --> PostgreSQL
SubscriptionWorker --> PostgreSQL
KnowledgeWorker --> Qdrant
API --> Model
GenWorker --> Model
ParseWorker --> Model
KnowledgeWorker --> Model
ProductWorker --> Model
ImageWorker --> Model
部署特点:
- API 与各 Worker 独立容器。
- migration 使用独立执行容器。
- PostgreSQL、Redis、OSS 和向量库作为外部基础设施。
- Worker 可按队列负载单独扩容。
- LibreOffice 安装在需要文档解析的运行镜像中。
- 配置通过 Vault 或部署环境注入。
19. 当前架构能力总结¶
Tender Service 已形成以下完整主链路:
同时具备知识摄取、产品解析、图片理解、Prompt 运营、任务恢复和额度结算等平台能力。
系统的主要架构特征是:
- 以结构化标书数据为核心,而不是只保存对话和生成文本。
- 以业务工作流控制模型,而不是让模型直接控制系统状态。
- 以持久化任务支撑长时间生成。
- 以多类型企业资产构建生成上下文。
- 以数据库 Prompt 版本和场景绑定支撑持续运营。
- 以多租户、额度和支付能力形成完整 SaaS 运行基础。
20. 演进设计¶
后续演进应继续围绕“理解更准确、生成有依据、审核可闭环、协作可追踪”展开。
20.1 原文证据链¶
在文档提取阶段保存:
- 页码。
- 段落和表格位置。
- 文本块标识。
- 原始坐标或锚点。
项目概况、需求和评分项记录来源 block,使结构化结果可以定位回原文。
20.2 招标要求响应矩阵¶
建立独立响应项模型:
| 字段 | 含义 |
|---|---|
| requirement | 招标要求 |
| source_ref | 招标原文位置 |
| response_status | 未响应、部分响应、已响应 |
| section_uid | 对应标书章节 |
| evidence_refs | 知识、产品、资质或附件证据 |
| reviewer_status | 人工复核状态 |
响应矩阵成为解析、目录、生成和审核之间的统一连接层。
20.3 智能审核中心¶
审核能力按照确定性规则与语义检查分层:
- 必填章节和附件检查。
- 招标要求覆盖检查。
- 评分项响应检查。
- 项目名称、编号和主体信息一致性。
- 产品参数冲突。
- 禁用词和风险表述。
- 格式与篇幅检查。
- LLM 辅助的语义偏离识别。
审核结果必须包含问题类型、严重程度、位置、原因、修改建议和处理状态。
20.4 协作与版本¶
在稳定 node_uid 基础上扩展:
- 章节负责人。
- 评论与批注。
- 草稿和发布版本。
- 修改记录。
- 审核流。
- 章节锁。
- 最终导出版本快照。
20.5 受控 Agent 编排¶
当响应矩阵和审核中心建立后,可以引入受控的 Agent 工作流:
Agent 负责选择已有能力和提出下一步建议,业务状态机仍负责权限、事务、任务终态和人工确认。
21. 结语¶
智能标书系统的价值不在于“生成一篇长文章”,而在于把招标文件、企业知识、目录规划、正文生产和成果交付连接成一个可运行的业务系统。
Tender Service 通过结构化数据、场景化 Prompt、知识检索、异步任务和文档输出,将 AI 能力嵌入标书编制的关键节点。
系统架构坚持确定性流程控制与智能能力协同:让模型负责理解和生成,让系统负责状态、数据、权限、恢复与交付。由此形成一套可管理、可扩展、可运营的智能标书生产基础。