面向 IT 招投标培训机构的 AI 原生评审辅助系统。
基于 LangChain 1.2.10 + LangGraph 1.0.9 + FastAPI 构建,核心大模型为 DeepSeek-V3 / DeepSeek-Coder-V2。
IT 招采机构每天面对四类重复性高、耗费师资的业务:
| 场景 | 痛点 |
|---|---|
| 投标人答疑 | 同类问题反复出现,评审专家精力有限 |
| 投标文件评分 | 量大、主观评分项评分容易不一致 |
| 资质审查 | 评审专家无暇逐份精读打分 |
| 技术答辩 | 缺少随时可陪练并给出专业反馈的「评审专家」 |
TenderAgent 将这四类业务分别封装为独立的 AI Agent,每个 Agent 融合了企业私有知识、内置了完整业务流程、并配备了工程化容错机制。
| Agent | 业务能力 | 核心技术范式 |
|---|---|---|
| 智能问答(QA) | 基于招标知识库实时答疑 | RAG 混合检索 + BGE-M3 + Reranker 精排 + SSE 流式 |
| 投标文件评分(BidReview) | 自动评分客观项 / 方案响应项 / 编程题 | 三轨并行评分 + HitL 专家确认环 |
| 资质审查(Qualification) | 六维度评分并给出改进建议 | PDF 解析 + 结构化抽取 + 多维度并行评分 |
| 供应商答辩(Defense) | 五阶段全程技术答辩陪练 | 状态机对话 + Think Tool 双轨质量评估 |
四个 Agent 之上由 Orchestrator 编排层统一做意图路由与多 Agent 串联 Pipeline。
| 层面 | 选型 |
|---|---|
| 开发语言 | Python 3.11(严格锁定) |
| Web 框架 | FastAPI + SSE-Starlette |
| Agent 框架 | LangChain 1.2.10 + LangGraph 1.0.9 |
| 主力大模型 | DeepSeek-V3(问答 / 资质材料 / 答辩) |
| 代码评分模型 | DeepSeek-Coder-V2 |
| 向量数据库 | Milvus |
| 关系数据库 | PostgreSQL + SQLAlchemy(全异步) |
| 缓存 | Redis |
| 对象存储 | MinIO |
| 嵌入模型 | BGE-M3(进程内,dense + sparse 双输出) |
| 精排模型 | BGE-Reranker-large(进程内) |
| 意图分类 | MiniLM-L6-v2(进程内) |
| 前端 | Vue3 + TypeScript + Element Plus |
BGE-M3、BGE-Reranker、MiniLM 三个本地模型均为进程内调用,无需单独起服务,启动时随后端进程并行预热。
┌─────────────────────────────────────────────────┐
│ 前端层 Vue3 SPA (:3000) │
└────────────────────┬────────────────────────────┘
│ HTTP / SSE
┌────────────────────▼────────────────────────────┐
│ API 层 FastAPI (:8000) │
│ JWT 鉴权 / SSE 流式 / 文件上传 │
└────────────────────┬────────────────────────────┘
│
┌────────────────────▼────────────────────────────┐
│ 编排层 Orchestrator │
│ MiniLM 意图识别 → 单 Agent 路由 / Pipeline │
└──────┬───────────┬───────────┬───────────┬──────┘
│ │ │ │
┌────▼───┐ ┌───▼────┐ ┌───▼────┐ ┌───▼──────┐
│ QA │ │ BidReview │ │Qualification │ │Defense │ ← LangGraph StateGraph × 4
│ Agent │ │ Agent │ │ Agent │ │ Agent │
└────────┘ └────────┘ └────────┘ └──────────┘
公共层
├── LLM Factory(DeepSeek API 统一封装)
├── BGE-Reranker / MiniLM / MemorySaver
└── MCP Server(知识库检索 + Web 搜索)
│
┌────────────────────▼────────────────────────────┐
│ 数据层 PostgreSQL · Redis · Milvus · MinIO │
└─────────────────────────────────────────────────┘
git clone <repo-url>
cd TenderAgent
conda create -n edu_agent python=3.11 -y
conda activate edu_agent
pip install -r requirments.txt
cp .env.bid_reviewple .env.local
打开 .env.local,填写必填项:
DB_USER=your_db_user
DB_PASSWORD=your_db_password
DEEPSEEK_API_KEY=sk-xxxxxxxxxxxxxxxx
JWT_SECRET_KEY=any-random-secret-string
docker-compose --env-file .env.local up -d postgres redis minio etcd milvus langfuse
python scripts/init_minio.py # 创建 MinIO Bucket
python scripts/init_milvus.py # 创建 Milvus Collection
python scripts/seed_data.py # 写入测试用户与投标文件数据
python scripts/verify_env.py
# 在项目根目录(TenderAgent/)下执行
uvicorn backend.main:app --host 0.0.0.0 --port 8000
cd frontend
npm install
npm run dev
| 服务 | 端口 | 说明 |
|---|---|---|
| FastAPI 后端 | 8000 | REST + SSE 接口,/docs 查看 Swagger |
| Vue3 前端 | 3000 | 投标人 / 评审专家 / 管理员界面 |
| PostgreSQL | 5433 | 宿主机 5432 已占用,隔离到 5433 |
| Redis | 6380 | 宿主机 6379 已占用 |
| MinIO API | 9002 | 宿主机 9000 已占用 |
| MinIO 控制台 | 9003 | 对象存储管理 |
| Milvus | 19531 | 宿主机 19530 已占用 |
| Langfuse | 3001 | LLM 调用追踪与可观测性 |
所有连接配置统一从
.env.local读取,禁止硬编码端口号。
| 地址 | 说明 |
|---|---|
| http://localhost:3000 | 前端应用 |
| http://localhost:8000/docs | FastAPI 接口文档(Swagger) |
| http://localhost:3001 | Langfuse 可观测性平台 |
| http://localhost:9003 | MinIO 控制台 |
| 角色 | 密码 |
|---|---|
| bidder | Bidder@123456 |
| expert | Expert@123456 |
| admin | Admin@123456 |
TenderAgent/
├── backend/
│ ├── main.py # FastAPI 入口 & lifespan(模型预热 + DB 迁移)
│ ├── config.py # pydantic-settings 配置(从 .env.local 读取)
│ ├── dependencies.py # JWT 鉴权依赖注入
│ ├── api/v1/ # 路由:qa / bid_review / qualification / defense / auth
│ ├── agents/ # 四大 Agent
│ │ ├── qa/ # graph.py / nodes.py / state.py / prompts.py
│ │ ├── bid_review/
│ │ ├── qualification/
│ │ └── defense/
│ ├── core/
│ │ ├── llm_factory.py # LLM 统一工厂(DeepSeek via OpenAI 兼容接口)
│ │ ├── orchestrator.py # 编排器(意图路由 + Pipeline)
│ │ ├── knowledge_base.py # BGE-M3 向量检索
│ │ ├── reranker.py # BGE-Reranker 精排
│ │ ├── memory.py # MemorySaver 对话记忆管理
│ │ └── retry.py # 三层兜底重试
│ ├── db/migrations.py # 启动时自动执行的幂等 DDL 补丁
│ └── mcp/ # MCP Server(知识库检索 + Web 搜索)
├── frontend/src/
│ ├── views/ # 页面(qa / bid_review / qualification / defense / login)
│ ├── api/ # HTTP 客户端封装
│ └── stores/ # Pinia 状态管理
├── models/ # 本地模型权重(.gitignore,启动时自动下载)
│ ├── reranker/bge-reranker-large/
│ ├── classifier/all-MiniLM-L6-v2/
│ └── embedding/bge-m3/
├── scripts/
│ ├── init_milvus.py # 初始化向量集合
│ ├── seed_data.py # 填充测试数据
│ ├── build_knowledge_base.py # 导入知识库文档
│ └── verify_env.py # 环境自检
├── tests/ # 单元测试 + 集成测试(76 passed / 1 skipped)
├── requirments.txt
├── docker-compose.yml
└── .env.bid_reviewple
首次使用或知识库重建后,需手动导入招标资料文档:
# 重建 Milvus Collection(Phase D 后需执行)
python scripts/init_milvus.py
# 导入文档(支持 PDF / Word / Markdown)
python scripts/build_knowledge_base.py --file <文档路径> --tender_document_id <招标资料UUID>
系统内置三层兜底,任何情况下用户都能拿到响应:
| 层级 | 触发条件 | 处理方式 |
|---|---|---|
| 第一层:自动重试 | 网络抖动 / LLM 超时 | 间隔 1s / 3s 重试,最多 2 次 |
| 第二层:Agent 降级 | 重试后仍失败 | 问答直答 / 评分跳过 Judge0 / 资质材料给格式提示 / 答辩给基础反馈 |
| 第三层:系统兜底 | 所有降级均失败 | 友好提示 + 已完成结果持久化 + 错误记录 |
Q: 后端启动报 extra inputs are not permitted
.env.local 中保留旧字段没有问题,config.py 已设置 extra = "ignore" 自动忽略。
Q: Milvus 连接超时
确认 etcd 和 milvus-standalone 容器均已 healthy:
docker-compose ps | grep -E "milvus|etcd"
Q: 前端 SSE 无流式效果
QA 和答辩的 SSE 接口直连 http://localhost:8000,不经过 Vite proxy,属于正常设计。
Q: 供应商答辩如何快速结束?
点击输入框右侧的"结束答辩"按钮,AI 将跳过剩余阶段直接生成报告(约 10-30 秒)。
Q: 投标文件评分一直显示"AI 评分中"
评分为后台异步任务,刷新页面可获取最新状态。若超过 15 分钟未完成,记录将自动标记为 failed,可重新提交。
完整学习课件位于 TenderAgent课件/ 目录,共 10 章:
| 条款 | 内容 |
|---|---|
| 第一章 | 项目简介与 Agent 核心概念 |
| 第二章 | 工具介绍(async / Pydantic / LangChain / LangGraph / FastAPI) |
| 第三章 | 环境搭建与工程地基 |
| 第四章 | 供应商资质审查 Agent |
| 第五章 | RAG 智能问答系统 |
| 第六章 | 投标文件评分 Agent(含 HitL) |
| 第七章 | 供应商答辩 Agent |
| 第八章 | 系统集成与编排 |
| 第九章 | 前端集成扩展 |
| 第十章 | 收尾、能力迁移与答辩问题集 |
生成 HTML 讲义:
# 在 docs/ 目录下执行
mkdocs serve # 本地预览(:8080)
mkdocs build # 输出静态 HTML 到 site/
本项目仅供评审使用,未经授权不得用于商业目的。
© 黑马程序员