基于AI与规则引擎的智能报价系统:从Excel到Web应用的工程实践
1. 先搞清楚“AI报价工作台”到底要解决什么痛点如果你还在用Excel手工查表、复制粘贴、套公式来算报价那这个“AI报价工作台”的思路就是帮你把整个流程自动化、智能化。它不是一个现成的软件而是一个需要你动手搭建的系统。核心痛点很简单手工报价慢、易出错、规则复杂时容易漏项而且一旦报价规则比如折扣表、成本表更新所有历史报价单都可能需要手动重算。这个工作台的核心价值是把动态的报价规则和标准化的报价流程封装成一个Web应用。用户比如销售或客服在前端页面选择或输入几个关键参数如产品型号、数量、客户等级后台就能自动调用规则引擎初期可能就是处理好的Excel逻辑结合AI大模型的理解能力生成结构清晰、附带说明的报价单甚至能给出一些议价策略建议。它适合两类人看一是经常被繁琐报价流程困扰的业务人员想寻求效率提升二是开发者尤其是前端和全栈想学习如何将业务逻辑Excel函数、AI能力大模型提示词和Web应用结合做一个有实用价值的项目。最关键的这不是一个玩具而是一个有明确输入、处理、输出逻辑的工程化实践。2. 环境与工具准备别在配置上卡住动手之前先把环境理顺。这个项目会涉及前端、后端、数据处理和AI调用但别被吓到我们可以用最轻量的方式启动。前端环境前端负责用户交互和结果展示。直接用现代前端框架的脚手架能省很多事。核心工具Node.js (建议16.x或18.x LTS版本) npm/yarn/pnpm。开发环境Visual Studio Code (VSCode) 是首选插件丰富。需要安装的包以React为例# 创建一个新的React应用 npx create-react-app ai-quote-dashboard cd ai-quote-dashboard # 安装一些可能用到的UI库和工具 npm install antd axios如果使用Vue可以用vue create如果追求极简甚至一个HTMLJS文件也能开始但不利于后续扩展。后端环境后端负责业务逻辑计算和AI接口调用。Python是处理数据和AI调用的绝佳选择。核心工具Python 3.8。推荐框架FastAPI轻量、异步、自动生成API文档或 Flask更简单。需要安装的包pip install fastapi uvicorn pandas openpyxlpandas和openpyxl是用来读取和处理Excel报价规则表的核心库。AI能力接入这是“智能”的来源。我们通过调用大模型的API来实现。选择模型国内可选科大讯飞、百度文心、阿里通义、智谱GLM等国外需注意合规使用。选择一家提供稳定API服务的。核心准备去对应平台注册账号获取API Key密钥。这是调用服务的凭证。安装SDK通常平台会提供Python SDK。# 例如使用某平台的SDK pip install zhipuai数据准备你的报价规则表这是项目的大脑。你需要一个结构清晰的Excel文件例如product_price.xlsx: 产品基础价目表。discount_rules.xlsx: 客户等级/采购量对应的折扣规则。cost_details.xlsx: 成本明细表用于计算利润。把这些文件放在项目后端容易读取的目录下比如data/文件夹。3. 核心流程拆解从输入到报价单生成整个系统的工作流可以拆解为四个关键环节我们一步步来实现。3.1 第一步设计前端交互与参数收集前端页面不需要很复杂但信息要收全。一个典型的表单可能包括客户信息客户名称、客户等级下拉选择。产品信息产品型号下拉选择可搜索、购买数量数字输入。其他选项是否含税、是否需要加急服务复选框。操作按钮“生成报价”、“重置”、“导出PDF”。这里的关键是下拉框的选项如产品型号、客户等级最好能通过API从后端动态获取这样当Excel规则表更新时前端无需修改代码。使用axios库来发起这些请求。// 前端React组件示例获取产品列表 import React, { useState, useEffect } from react; import axios from axios; import { Select, InputNumber, Button } from antd; const QuoteForm () { const [products, setProducts] useState([]); const [formData, setFormData] useState({ productId: , quantity: 1 }); useEffect(() { // 组件加载时从后端获取产品列表 axios.get(/api/products).then(response { setProducts(response.data); }); }, []); const handleSubmit async () { // 提交表单数据到后端生成报价 const result await axios.post(/api/generate-quote, formData); // 处理返回的报价结果... }; return ( div Select options{products} onChange{value setFormData({...formData, productId: value})} / InputNumber min{1} value{formData.quantity} onChange{value setFormData({...formData, quantity: value})} / Button typeprimary onClick{handleSubmit}生成报价/Button /div ); };3.2 第二步后端业务逻辑与Excel数据处理这是报价计算的核心。后端接收到前端传来的参数后需要做以下几件事参数校验检查产品ID、数量是否有效。查询基础数据用pandas读取Excel找到对应产品的基础价格。import pandas as pd def get_product_base_price(product_id): df pd.read_excel(data/product_price.xlsx) product_row df[df[产品ID] product_id] if product_row.empty: raise ValueError(f未找到产品ID: {product_id}) return product_row.iloc[0][基础单价]应用业务规则根据客户等级和数量查询折扣规则表计算折扣率。def calculate_discount(customer_level, quantity): df pd.read_excel(data/discount_rules.xlsx) # 假设规则是先按客户等级找基准折扣再根据数量区间找额外折扣 level_discount df[df[客户等级] customer_level][基准折扣].values[0] # 简化逻辑找到数量所在的区间 quantity_rule df[(df[最小数量] quantity) (df[最大数量] quantity)] extra_discount quantity_rule[额外折扣].values[0] if not quantity_rule.empty else 0 return level_discount extra_discount执行计算计算折后单价、总价、税费如果含税、最终报价。base_price get_product_base_price(product_id) discount_rate calculate_discount(customer_level, quantity) discounted_unit_price base_price * (1 - discount_rate) total_price discounted_unit_price * quantity if include_tax: total_price * 1.13 # 假设税率为13% final_quote total_price3.3 第三步集成AI生成个性化说明与建议纯数字的报价单冷冰冰的。AI的作用是为这份报价增加“温度”和“策略”。设计提示词Prompt这是最关键的一步。你需要告诉AI背景、角色、任务和格式。角色你是一名专业的销售顾问。任务根据以下报价信息生成一段给客户的报价说明。需要突出产品价值解释价格构成如折扣来源并根据客户等级给出1-2条后续跟进的建议。报价信息{产品名称}数量{数量}原单价{原单价}适用折扣率{折扣率}折后单价{折后单价}总计{总计}含税/不含税。客户等级为{客户等级}。输出要求语言专业、友好控制在200字以内。调用AI API在后端计算完价格后将构造好的提示词发送给大模型。import zhipuai # 以智谱AI为例 zhipuai.api_key 你的API密钥 def generate_quote_narrative(quote_info): prompt f你是一名专业的销售顾问。根据以下报价信息生成一段给客户的报价说明... 报价信息{quote_info} response zhipuai.model_api.invoke( modelglm-4, promptprompt, temperature0.7, # 控制创造性报价建议可以稍高纯计算则用0.1 ) return response[data][choices][0][content]处理AI返回将AI生成的文本说明和之前计算好的结构化报价数据产品明细、单价、总价等一起组合成最终的报价结果返回给前端。注意AI的“幻觉”AI可能会编造不存在的产品特性或折扣理由。因此所有核心数据价格、折扣率必须来自你的业务规则表ExcelAI只负责文本润色和建议生成。切勿让AI直接计算关键数字。3.4 第四步结果展示、导出与状态管理前端拿到后端返回的完整报价结果后需要清晰展示结构化数据区用表格展示产品、单价、数量、折扣、小计、总计确保数字准确无误。AI生成区展示AI生成的报价说明和建议可以放在一个独立的卡片或区域。操作区提供“重新生成说明”仅重新调用AI、“导出为PDF”、“发送邮件”等按钮。导出功能可以使用前端库如jspdf或html2canvas将报价单DOM节点转换为PDF。更稳定的做法是后端生成PDF前端下载。状态管理一个完整的报价单生成后应该被保存下来可以存数据库或简单点存为JSON文件并生成一个唯一的报价单号。这样便于后续查询、修改或跟踪。4. 关键细节与避坑指南把流程跑通只是第一步要让这个工作台真正可用、可靠下面这些细节必须处理好。4.1 Excel数据与程序的耦合问题问题直接在后端代码里写死Excel文件路径和列名如df[产品ID]一旦Excel表格结构变化例如列名从“产品ID”改为“SKU”程序就会报错。解决方案配置化创建一个config.yaml或config.json文件专门定义Excel的路径、工作表名、列名映射。# config.yaml excel_files: product_price: path: data/product_price.xlsx sheet: Sheet1 columns: id: 产品ID name: 产品名称 price: 基础单价程序读取配置而不是硬编码。数据校验在启动服务或读取Excel时增加校验逻辑检查必要的列是否存在数据格式是否正确。缓存机制报价规则表通常不会频繁变动。不要每次请求都读取Excel可以将其加载到内存如Python字典中并设置一个文件监听或定时任务来更新缓存。4.2 AI提示词工程稳定输出想要的格式问题AI返回的文本格式不稳定有时是段落有时带列表有时还会说“作为AI模型我无法...”。解决方案明确指令在提示词中严格规定输出格式例如“请用以下JSON格式输出{“summary”: “一段话总结”, “suggestions”: [“建议一”, “建议二”]}”。大模型对JSON格式遵循得比较好。系统角色设定充分利用API中的system或role参数来设定AI的固定身份这比在用户提示词中写“你是...”更有效。后处理对AI返回的内容做一层后处理。例如如果要求返回纯文本说明但AI返回了Markdown符号就用正则表达式过滤掉。设置温度Temperature和核采样Top-p对于报价这种需要稳定性的场景将temperature调低如0.3top_p调低如0.8可以减少随机性让输出更可控。4.3 错误处理与用户体验问题网络波动导致AI调用失败或者Excel数据异常前端只显示一个“Internal Server Error”。解决方案后端分层捕获异常在数据读取、规则计算、AI调用等每个环节都用try...except包裹并抛出带有明确错误类型和信息的自定义异常。定义清晰的API错误码如1001: 产品不存在,1002: 折扣规则配置错误,2001: AI服务暂时不可用。前端友好提示根据后端返回的错误码在前端展示对应的友好提示而不是技术性的错误信息。例如“当前无法生成报价建议请稍后重试或联系管理员”。加载状态在发起“生成报价”请求后前端按钮应变为禁用并显示加载动画防止用户重复提交。4.4 性能与扩展性考量问题当产品表有上万条数据或者需要同时处理多个报价请求时系统变慢。解决方案数据索引将Excel数据读入内存后使用字典Dict或集合Set进行存储以产品ID为键实现O(1)复杂度的查询避免每次都在DataFrame里全表扫描。异步处理如果AI调用耗时较长可能2-5秒使用异步框架如FastAPI的async/await来处理/api/generate-quote请求避免阻塞其他快速请求如获取产品列表。限流与队列如果预计有高并发需要对AI调用接口实施限流或者将报价请求放入任务队列如Celery、RQ后端异步处理完成后通知前端。脱离Excel当规则变得非常复杂时应考虑将业务规则从Excel迁移到数据库如MySQL, PostgreSQL甚至规则引擎如Drools中这是项目后期演进的必然方向。5. 从Demo到生产还需要考虑什么如果你只想验证想法做到第3步就足够了。但如果想用于实际团队下面这些点必须规划。权限与多用户不同的销售员可能只能看到自己的客户或报价。需要引入用户登录、权限控制RBAC报价单需要关联创建者。报价单版本管理客户讨价还价后价格可能修改需要保存每一次修改的版本并能查看差异。审计日志记录谁、在什么时候、生成了哪份报价、输入参数是什么。这对于追溯问题和业务分析至关重要。与CRM/ERP集成真正的价值在于打通。报价单审核通过后能否一键生成销售订单客户信息能否从CRM系统自动带入这需要设计API与其他系统对接。部署前端可以打包成静态文件用Nginx托管。后端FastAPI应用可以用Uvicorn或Gunicorn部署在服务器上并用Supervisor或Systemd管理进程。记得设置好环境变量来管理API Key等敏感信息。最后也是最实际的建议不要一开始就追求大而全。先用一个最核心的产品、最简单的折扣规则把“前端输入 - 后端查表计算 - AI生成说明 - 前端展示”这个闭环跑通。然后再逐步加入客户管理、复杂规则、导出PDF、历史记录等功能。每加一个功能都确保原有的核心流程依然稳固。这样搭建起来的“AI报价工作台”才能真正甩掉手工查表算价的繁琐而不是变成另一个需要维护的“麻烦”。