依据 04-quote-rule-specification.md 与 05-agent-workflow.md 搭建的本地报价 Agent。
设计原则:LLM 只负责理解资料与分类,价格与人工审核判定完全由确定性规则引擎计算。
config/quote_rules.yaml:可配置、带版本号的规则集(工时、费率、系数、审核阈值)。src/quote_agent/quote_engine.py:确定性报价引擎(工时明细、价格区间、人工审核判定、规则快照)。src/quote_agent/models.py:Pydantic 数据模型(需求 / 分类 / 报价 / 审核)。tests/:边界值测试(完整度 0.80、交期 0.70、金额阈值、精度、零件数、确定性)。- Docker 开发环境:宿主机无 Python,一切在容器内运行。
src/quote_agent/llm.py:Ollama 客户端(temperature=0、JSON 输出、失败自动修复一次)。src/quote_agent/extraction.py/classification.py:需求提取与项目分类 Agent(只出结构化需求,不出价格)。src/quote_agent/completeness.py:需求完整度确定性重算(QRS 9.1/9.2),不信任模型自报分值。src/quote_agent/file_parser.py:文本型 PDF / Excel / TXT 解析(图片 OCR 由视觉模型在 M3 接入)。src/quote_agent/cloud.py:云端 API 客户端 + 内存版 Mock 云端(HTTP,支持租约/心跳/幂等回传)。src/quote_agent/worker.py:按 AWF-001 主流程执行任务:领取→下载→解析→提取→校验→分类→报价→回传→清理。scripts/run_worker.py:Worker 入口(--demo可用本地 mock 云端全链路跑一个样例任务)。scripts/mock_cloud.py:独立 Mock 云端 HTTP 服务。scripts/try_ollama.py:验证 Ollama 连通性与 JSON 输出路径。
- 图片 OCR:JPG/PNG 直接以 base64 传给视觉模型(
qwen3-vl)阅读,替换"图片暂不可读"占位。 scripts/run_worker.py --demo的样例任务包含一张带英文标注的图片,可验证多文件混合链路。
- SQLite 离线缓存(
src/quote_agent/cache.py):已完成但未回传的结果写入pending_results,任务重新投递后按Idempotency-Key直接重传,不重复报价;全部阶段写入audit_log。 - Qdrant RAG(
src/quote_agent/rag.py):脱敏历史案例向量化检索(bge-m3embedding),案例只存脱敏字段,原始客户文件不入库。 - ReviewAgent(
src/quote_agent/review.py):LLM 审核助手,只能增加审核项与意见,不得修改价格/工时/系数;RAG 检索结果作为审核上下文。 scripts/seed_rag_cases.py:把examples/knowledge_cases/*.json写入向量库。
- 需求级 LLM 缓存(
src/quote_agent/llm.py的CachedLLM):按“system+user+模型+schema+图片内容”哈希,命中直接复用,避免重复推理;缓存表为 SQLite 的llm_cache(LLM_CACHE_ENABLED可关)。 - 模型分派(
src/quote_agent/llm.py):带图片任务用视觉模型(OLLAMA_MODEL),纯文本任务用轻量文本模型(TEXT_MODEL);提取 prompt 增加单任务正文上限,防大文件拖慢推理。 - LLM 提速:默认关闭 qwen3 thinking(
LLM_THINK=false)、结构化输出强制format=json、LLM_MAX_TOKENS限制输出长度;图片转录合并进提取(少一次调用)。 - 审核按需(
src/quote_agent/worker.py):仅规则引擎判定需人工审核时才跑 LLM 审核,其余任务跳过(省一次慢调用)。 - 并行化(
src/quote_agent/worker.py):文件下载/解析并行;分类 LLM 与 RAG 检索并行;各阶段耗时写入审计日志。
- Worker 默认以
PRICING_MODE=ai_quote运行:LLM 只评估工时/复杂度/加急/交付物(提示词含参考价格表),价格由src/quote_agent/ai_quote.py按工时 × 50元/h × 复杂度系数 × 加急系数 [+ 交付物单价]确定性计算,加急等级由系统按交期判定并覆盖。 - 与 AI_quote 原型一致:不评估需求完整度、不做项目分类、不因信息不足拒报,始终输出价格(
completeness_score/classification_confidence为 null,missing_information/clarification_questions为空数组)。 - 相似历史案例(
examples/knowledge_cases/,含 14 条脱敏真实成交案例)通过 Qdrant RAG 检索后拼入评估提示词(需RAG_ENABLED=true)。 - 旧的 QRS 规则模板引擎保留为
PRICING_MODE=qrs(费率卡 180–650 元/h,量级与原型法不同,仅作对比/回退)。 - 对接与参数见 14-ai-quote-method-handoff.md。
docker compose up -d qdrant
docker compose run --rm quote-agent python scripts/seed_rag_cases.py
docker compose run --rm -e RAG_ENABLED=true quote-agent python scripts/run_worker.py --demo --oncedocker compose build
docker compose run --rm quote-agent python scripts/validate_rules.py
docker compose run --rm quote-agent python scripts/test_quote.py
docker compose run --rm quote-agent pytest -q
docker compose run --rm quote-agent python scripts/try_ollama.py
docker compose run --rm quote-agent python scripts/run_worker.py --demo --once
docker compose up -d mock-cloud # 独立 Mock 云端(可选)config/quote_rules.yaml # 规则配置(唯一事实来源)
src/quote_agent/
config.py # 规则配置的 Pydantic 模型与加载/校验
models.py # 需求/分类/报价/审核数据结构
quote_engine.py # 确定性报价引擎
scripts/
validate_rules.py # 规则配置校验
test_quote.py # 报价引擎演示
run_worker.py # Worker 骨架(下一里程碑)
tests/ # pytest 测试
- 所有工时、费率、系数均为 QRS 文档中的示例占位值,上线前需业务负责人确认(见 QRS 第 18 节)。
quote_engine不依赖 LLM;需求提取、分类、审查由后续里程碑接入 Ollama。