尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

基于AI Agent与Streamlit的智能报价工作台搭建指南

基于AI Agent与Streamlit的智能报价工作台搭建指南 你是不是也经历过这样的场景客户发来一份产品清单你需要在十几个Excel表格里来回切换手动查找物料编码、匹配价格表、计算折扣、加上税费和运费最后生成一份报价单。整个过程耗时费力不说还容易因为看错行、公式引用错误导致报价出错轻则影响利润重则丢掉订单。这就是传统手工报价的典型痛点流程割裂、效率低下、容错率低。尤其是在产品型号多、价格策略复杂、客户定制化需求强的行业比如制造业、贸易、IT解决方案等这个问题尤为突出。今天我们要彻底甩掉这种低效模式。本文将带你一步步搭建一个基于AI的智能报价工作台。它的核心目标不是简单地自动化Excel而是让报价过程变得“聪明”起来你只需要输入客户需求和产品信息系统就能自动完成数据查询、价格计算、策略匹配甚至生成格式规范的报价单。这背后是AI大模型的理解能力与业务流程自动化的结合。我们将使用当前最易上手的技术栈Python Streamlit快速构建Web界面 LangChain编排AI流程 大模型API如文心一言、通义千问或GPT。即使你没有深厚的AI背景也能跟着本文完成搭建。文章将涵盖从核心思路、环境搭建、代码实现到部署上线的完整闭环。读完本文你将获得一个可运行的、具备基础AI报价能力的Web应用。理解如何将非结构化的业务需求一段文字描述转化为结构化的数据查询与计算任务。掌握用AI Agent的思路解决传统办公自动化问题的核心方法。获得一套可扩展的代码框架你可以轻松地将其适配到自己公司的产品库和报价规则上。让我们开始吧。1. 为什么是“AI报价工作台”而不仅仅是“Excel自动化”在深入代码之前我们必须先厘清一个关键概念我们构建的不是一个高级的Excel宏而是一个“工作台”。这两者有本质区别。传统自动化如VBA、Python pandas脚本解决的是“已知规则下的重复计算”。它要求规则必须预先被严格、完整地定义成代码逻辑。例如“如果客户类型为A则应用折扣率0.9如果采购量大于100则再享受0.95的批量折扣。”这种逻辑清晰但僵化。一旦客户提出“给我们一个最有竞争力的打包方案”这类模糊需求传统自动化就束手无策了。AI报价工作台的核心能力在于“理解”和“决策”。它试图解决的是规则模糊或跨系统查询的问题理解自然语言需求客户说“我要一批服务器CPU强一些预算大概20万左右”。AI可以解析出关键属性产品类别服务器关键参数CPU性能约束条件预算20万并转化为查询条件。处理非标查询价格表可能分散在多个系统ERP的物料主数据、CRM的客户协议价、Excel里的促销价。AI Agent可以规划步骤决定先去哪里查基础价再去哪里匹配折扣。进行简单推理与匹配在预算约束下推荐最合适的配置组合或者判断客户的询价是否符合某个特殊促销政策的条件。因此这个工作台的架构核心是一个“AI Agent”。它接收用户输入理解意图然后调用不同的“工具”Tools——比如查询数据库的工具、计算价格的工具、生成文档的工具——来完成整个报价流程。这比写死一套IF-ELSE逻辑要灵活和强大得多。2. 核心架构与组件选型我们的AI报价工作台将采用典型的分层架构如下图所示概念图用户界面层 (Web UI) ↓ AI智能体层 (Orchestrator Agent) ↓ 工具执行层 (Tools) — 查询工具 — 计算工具 — 文档工具 ↓ 数据服务层 — 产品数据库 — 价格策略表 — 客户信息表1. 用户界面层 (UI Layer)选型Streamlit理由对于Python开发者来说Streamlit是快速构建数据应用的原型利器。它允许你用纯Python脚本创建交互式Web应用无需前端知识。非常适合我们这种需要展示表格、输入文本、点击按钮生成结果的场景。2. AI智能体层 (Agent Layer)选型LangChain 大模型API理由LangChain是目前最流行的AI应用开发框架之一它抽象了与模型交互、管理对话历史、编排工具调用等复杂逻辑。我们将用它来创建我们的“报价Agent”。大模型选择上国内可以使用百度文心一言ERNIE、阿里通义千问、智谱GLM等提供的API国外则可以使用OpenAI GPT。3. 工具执行层 (Tools Layer)这是业务逻辑的核心。我们将创建几个关键的Python函数并让AI Agent学会在合适的时候调用它们。search_product(query): 根据描述查询产品数据库。calculate_price(product_id, quantity, customer_tier): 根据产品ID、数量、客户等级计算最终价格。generate_quotation(items, customer_info): 根据报价明细和客户信息生成PDF或格式化的HTML报价单。4. 数据服务层 (Data Layer)初期方案Pandas CSV/Excel文件理由为了简化演示我们使用CSV文件来模拟产品数据库和价格表。在实际项目中你可以轻松地将数据源替换为MySQL、PostgreSQL或MongoDB。进阶方案使用轻量级SQLite数据库或通过SQLAlchemy连接正式数据库。3. 环境准备与项目初始化请确保你的开发环境满足以下要求。3.1 基础环境操作系统Windows 10/11, macOS, 或 Linux (Ubuntu 20.04)Python版本3.8 或更高版本 (推荐 3.9)包管理工具pip (已随Python安装)3.2 创建项目目录与虚拟环境强烈建议使用虚拟环境来隔离项目依赖。# 1. 创建项目目录并进入 mkdir ai_quotation_workshop cd ai_quotation_workshop # 2. 创建Python虚拟环境 (以venv为例) python -m venv venv # 3. 激活虚拟环境 # Windows (PowerShell) .\venv\Scripts\Activate.ps1 # Windows (CMD) .\venv\Scripts\activate.bat # macOS / Linux source venv/bin/activate # 激活后命令行提示符前应显示 (venv)3.3 安装核心依赖创建一个requirements.txt文件列出所有需要的库。# requirements.txt streamlit1.28.0 langchain0.1.0 langchain-community0.0.10 openai1.3.0 # 如果使用OpenAI。国内用户可替换为 qianfan(百度)、dashscope(阿里)等 pandas2.0.0 python-dotenv1.0.0 # 用于管理API密钥等环境变量 reportlab4.0.0 # 用于生成PDF报价单然后使用pip安装pip install -r requirements.txt3.4 准备大模型API密钥本文以OpenAI GPT API为例因其生态文档最全。国内开发者请根据所选模型前往对应平台申请。访问 OpenAI Platform 创建API Key。在项目根目录创建.env文件用于安全存储密钥。# .env 文件内容 OPENAI_API_KEY你的实际api_key_here重要确保.env文件已被添加到.gitignore中切勿提交到代码仓库。4. 构建数据层模拟产品与价格数据库我们首先用CSV文件创建两个核心数据表。4.1 产品信息表 (products.csv)包含产品ID、名称、描述、类别和基础单价。product_id,name,description,category,unit_price P1001,ThinkPad X1 Carbon,14英寸商务轻薄本i7-1360P, 16GB RAM, 1TB SSD,笔记本电脑,12599.00 P1002,Dell Precision 5680,移动工作站i9-13980HX, RTX 5000 Ada, 64GB RAM,笔记本电脑,38999.00 P2001,华为 MateView 28.2,28.2英寸4K显示器98% P3色域无线投屏,显示器,4999.00 P3001,罗技 MX Keys 键盘,全尺寸无线蓝牙键盘智能背光跨计算机控制,外设,899.00 P3002,罗技 MX Master 3S 鼠标,无线蓝牙鼠标MagSpeed电磁滚轮多设备切换,外设,899.004.2 价格策略表 (price_rules.csv)定义不同客户等级或采购量对应的折扣。rule_id,customer_tier,min_quantity,discount_rate,description R001,普通客户,1,1.00,标准价 R002,普通客户,10,0.95,批量采购95折 R003,普通客户,50,0.90,大批量采购9折 R004,VIP客户,1,0.88,VIP客户尊享88折 R005,战略客户,1,0.85,战略合作客户85折4.3 创建数据访问模块我们创建一个data_manager.py文件封装所有数据读取和查询逻辑。# data_manager.py import pandas as pd import os class DataManager: def __init__(self, data_dir./data): self.data_dir data_dir self.products_df None self.price_rules_df None self._load_data() def _load_data(self): 加载CSV数据到内存 products_path os.path.join(self.data_dir, products.csv) rules_path os.path.join(self.data_dir, price_rules.csv) try: self.products_df pd.read_csv(products_path) self.price_rules_df pd.read_csv(rules_path) print(数据加载成功。) except FileNotFoundError as e: print(f数据文件未找到: {e}) # 创建空DataFrame防止后续报错 self.products_df pd.DataFrame(columns[product_id, name, description, category, unit_price]) self.price_rules_df pd.DataFrame(columns[rule_id, customer_tier, min_quantity, discount_rate, description]) def search_products(self, query: str, category: str None, max_price: float None): 根据查询词、类别和最高价搜索产品。 这是一个简单的基于关键词的搜索在实际应用中可替换为向量搜索。 df self.products_df.copy() # 简单的大小写不敏感的关键词过滤 if query: mask df[name].str.contains(query, caseFalse) | df[description].str.contains(query, caseFalse) df df[mask] if category: df df[df[category] category] if max_price: df df[df[unit_price] max_price] return df.to_dict(records) # 返回字典列表便于JSON序列化 def get_product_by_id(self, product_id: str): 根据产品ID获取单个产品详情 product self.products_df[self.products_df[product_id] product_id] if not product.empty: return product.iloc[0].to_dict() return None def get_applicable_rule(self, customer_tier: str, quantity: int): 根据客户等级和采购数量查找适用的价格规则。 规则逻辑优先匹配客户等级然后在同等级内找满足数量条件quantity min_quantity且折扣最大discount_rate最小的规则。 # 筛选出该客户等级的规则 tier_rules self.price_rules_df[self.price_rules_df[customer_tier] customer_tier] if tier_rules.empty: # 如果没有该客户等级的规则回退到‘普通客户’ tier_rules self.price_rules_df[self.price_rules_df[customer_tier] 普通客户] # 找出所有满足数量条件的规则 applicable tier_rules[tier_rules[min_quantity] quantity] if applicable.empty: # 如果没有满足数量条件的则取该等级下数量要求最低的规则通常是标准价 applicable tier_rules[tier_rules[min_quantity] tier_rules[min_quantity].min()] # 返回折扣最优discount_rate最小的规则 best_rule applicable.loc[applicable[discount_rate].idxmin()] return best_rule.to_dict() # 创建全局数据管理器实例方便其他模块导入 data_manager DataManager()这个模块提供了清晰的数据接口后续我们的AI工具将调用这些方法。5. 创建AI Agent与工具层这是整个系统的“大脑”。我们将使用LangChain来构建一个能理解用户需求并调用工具的Agent。5.1 定义工具函数首先在tools.py中定义AI Agent可以调用的具体函数。# tools.py from data_manager import data_manager from typing import Optional, Dict, Any import json def search_product_tool(query: str, category: Optional[str] None, max_price: Optional[float] None) - str: 工具根据描述搜索产品。 参数: query: 产品名称或描述关键词。 category: (可选) 产品类别过滤。 max_price: (可选) 最高价格过滤。 返回: 产品列表的JSON字符串。 results data_manager.search_products(query, category, max_price) # 限制返回数量避免上下文过长 limited_results results[:5] return json.dumps(limited_results, ensure_asciiFalse, indent2) def calculate_price_tool(product_id: str, quantity: int, customer_tier: str 普通客户) - str: 工具计算指定产品的最终价格。 参数: product_id: 产品ID。 quantity: 采购数量。 customer_tier: 客户等级。 返回: 计算结果的JSON字符串。 product data_manager.get_product_by_id(product_id) if not product: return json.dumps({error: f未找到产品ID: {product_id}}, ensure_asciiFalse) rule data_manager.get_applicable_rule(customer_tier, quantity) unit_price product[unit_price] discount_rate rule[discount_rate] final_unit_price unit_price * discount_rate total_price final_unit_price * quantity result { product_name: product[name], product_id: product_id, unit_price: unit_price, quantity: quantity, customer_tier: customer_tier, applicable_rule: rule[description], discount_rate: discount_rate, final_unit_price: round(final_unit_price, 2), total_price: round(total_price, 2) } return json.dumps(result, ensure_asciiFalse, indent2) def generate_quotation_tool(items: list, customer_info: Dict[str, Any]) - str: 工具生成报价单摘要。 参数: items: 列表每个元素是包含 product_id, quantity 的字典。 customer_info: 包含客户名称、等级等信息的字典。 返回: 报价单摘要的文本描述。 # 这是一个简化版实际项目中会生成PDF或HTML文件。 quotation_lines [] quotation_lines.append(f报价单 - 客户: {customer_info.get(name, 未知客户)}) quotation_lines.append(*50) total_amount 0.0 for item in items: pid item.get(product_id) qty item.get(quantity, 1) calc_result_json calculate_price_tool(pid, qty, customer_info.get(tier, 普通客户)) calc_result json.loads(calc_result_json) if error in calc_result: quotation_lines.append(f错误: {calc_result[error]}) continue line_total calc_result[total_price] total_amount line_total quotation_lines.append( f{calc_result[product_name]} (x{qty}) - 单价: ¥{calc_result[final_unit_price]} - 小计: ¥{line_total} ) quotation_lines.append(*50) quotation_lines.append(f总计: ¥{round(total_amount, 2)}) quotation_lines.append(f客户等级: {customer_info.get(tier, 普通客户)}) quotation_lines.append(\n(此为摘要完整报价单功能需连接PDF生成模块)) return \n.join(quotation_lines) # 将函数包装成LangChain可识别的Tool对象 from langchain.tools import Tool search_tool Tool( nameSearchProduct, funcsearch_product_tool, description根据产品名称或描述关键词搜索产品。输入应包含查询词并可选择包含类别(category)和最高价(max_price)。 ) calculate_tool Tool( nameCalculatePrice, funccalculate_price_tool, description计算特定产品的最终价格。输入必须包含产品ID(product_id)和数量(quantity)可选客户等级(customer_tier)。 ) quotation_tool Tool( nameGenerateQuotation, funcgenerate_quotation_tool, description根据产品列表和客户信息生成报价单。输入必须是一个JSON字符串包含items(产品列表)和customer_info(客户信息)。 )5.2 构建AI Agent接下来在agent.py中创建Agent。我们将使用OpenAI的函数调用Function Calling能力这是构建可靠Agent的最佳实践之一。# agent.py import os from dotenv import load_dotenv from langchain_openai import ChatOpenAI from langchain.agents import AgentExecutor, create_openai_tools_agent from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder from langchain.memory import ConversationBufferMemory from tools import search_tool, calculate_tool, quotation_tool # 加载环境变量中的API密钥 load_dotenv() api_key os.getenv(OPENAI_API_KEY) if not api_key: raise ValueError(请在 .env 文件中设置 OPENAI_API_KEY) # 1. 初始化大语言模型 # 使用 gpt-3.5-turbo 以控制成本也可替换为 gpt-4 获得更好效果 llm ChatOpenAI( modelgpt-3.5-turbo-1106, # 或 gpt-4 temperature0, # 设置为0使输出更确定适合工具调用 openai_api_keyapi_key ) # 2. 定义工具列表 tools [search_tool, calculate_tool, quotation_tool] # 3. 构建提示词模板 # 系统提示词至关重要它定义了Agent的角色和能力范围 system_prompt 你是一个专业的智能报价助手。你的任务是帮助用户根据他们的需求查找产品、计算价格并生成报价单。 你拥有以下工具 1. SearchProduct: 用于根据描述搜索产品。 2. CalculatePrice: 用于计算单个产品的最终价格。 3. GenerateQuotation: 用于为多个产品生成报价单摘要。 请遵循以下规则 - 首先理解用户的需求。用户可能想找产品也可能想直接计算价格或生成报价单。 - 如果用户的需求模糊例如“我想买台笔记本”你应该主动使用SearchProduct工具进行搜索并向用户展示几个选项。 - 如果用户提供了明确的产品ID和数量你可以直接使用CalculatePrice工具。 - 如果用户提供了多个产品清单和客户信息你可以使用GenerateQuotation工具。 - 每次只使用一个最必要的工具。如果工具返回的结果不完整再决定是否使用下一个工具。 - 始终以友好、专业、清晰的方式回复用户并呈现工具返回的结果。 - 如果用户的问题超出你的能力范围例如询问天气预报请礼貌地告知。 你的所有回复都应基于工具返回的事实数据不要编造信息。 prompt ChatPromptTemplate.from_messages([ (system, system_prompt), MessagesPlaceholder(variable_namechat_history), (human, {input}), MessagesPlaceholder(variable_nameagent_scratchpad), ]) # 4. 创建记忆使Agent能记住对话上下文 memory ConversationBufferMemory(memory_keychat_history, return_messagesTrue) # 5. 创建Agent agent create_openai_tools_agent(llm, tools, prompt) # 6. 创建Agent执行器 agent_executor AgentExecutor( agentagent, toolstools, memorymemory, verboseTrue, # 设置为True可以在控制台看到Agent的思考过程调试时非常有用 handle_parsing_errorsTrue # 处理解析错误 ) def run_agent_query(user_input: str) - str: 运行Agent处理用户输入并返回回复 try: response agent_executor.invoke({input: user_input}) return response[output] except Exception as e: return f处理请求时出现错误: {str(e)}6. 构建Streamlit Web界面现在我们将创建一个美观且实用的前端界面。创建app.py文件。# app.py import streamlit as st import json from agent import run_agent_query from data_manager import data_manager import pandas as pd st.set_page_config(page_titleAI智能报价工作台, page_icon, layoutwide) st.title( AI智能报价工作台) st.markdown( 欢迎使用智能报价助手你可以 1. **用自然语言描述你的需求**例如“帮我找一款5000元以下的显示器”AI会帮你搜索产品。 2. **直接计算价格**例如“计算P1001产品买5个给VIP客户的价格”。 3. **生成完整报价单**在下方表格中添加产品并填写客户信息。 ) # 初始化会话状态用于存储聊天历史和报价项目 if messages not in st.session_state: st.session_state.messages [] if quotation_items not in st.session_state: st.session_state.quotation_items [] # 侧边栏 - 数据概览和快捷操作 with st.sidebar: st.header( 数据概览) if st.button(刷新产品数据): data_manager._load_data() st.success(数据已刷新) st.subheader(产品类别) categories data_manager.products_df[category].unique().tolist() for cat in categories: st.caption(f- {cat}) st.divider() st.header(⚙️ 设置) # 这里可以未来添加模型选择、API设置等 st.caption(当前模型: GPT-3.5-turbo) # 主界面分为两列 col_chat, col_quotation st.columns([2, 1]) with col_chat: st.subheader( 与报价助手对话) # 显示聊天历史 for message in st.session_state.messages: with st.chat_message(message[role]): st.markdown(message[content]) # 聊天输入框 if prompt : st.chat_input(请输入你的需求例如我想买20台笔记本电脑预算40万): # 添加用户消息到历史并显示 st.session_state.messages.append({role: user, content: prompt}) with st.chat_message(user): st.markdown(prompt) # 显示AI回复占位符 with st.chat_message(assistant): message_placeholder st.empty() # 调用Agent获取回复 full_response run_agent_query(prompt) message_placeholder.markdown(full_response) # 添加AI回复到历史 st.session_state.messages.append({role: assistant, content: full_response}) with col_quotation: st.subheader( 手动创建报价单) with st.form(quotation_form): # 产品选择 product_options data_manager.products_df[[product_id, name]].apply(lambda x: f{x[product_id]} - {x[name]}, axis1).tolist() selected_product st.selectbox(选择产品, product_options, keyproduct_select) quantity st.number_input(数量, min_value1, value1, step1, keyqty_input) if st.form_submit_button(添加到报价单): if selected_product: product_id selected_product.split( - )[0] # 获取产品详情用于显示 product_info data_manager.get_product_by_id(product_id) if product_info: new_item { product_id: product_id, name: product_info[name], quantity: quantity, unit_price: product_info[unit_price] } st.session_state.quotation_items.append(new_item) st.success(f已添加 {product_info[name]} x{quantity}) # 显示当前报价单项目 if st.session_state.quotation_items: st.markdown(**当前报价项目**) items_df pd.DataFrame(st.session_state.quotation_items) st.dataframe(items_df, use_container_widthTrue, hide_indexTrue) # 客户信息输入 st.divider() customer_name st.text_input(客户名称, keycust_name) customer_tier st.selectbox(客户等级, [普通客户, VIP客户, 战略客户], keycust_tier) if st.button( 生成报价单, typeprimary): if not customer_name: st.warning(请填写客户名称) else: customer_info {name: customer_name, tier: customer_tier} # 调用工具生成报价单 from tools import generate_quotation_tool quotation_text generate_quotation_tool(st.session_state.quotation_items, customer_info) st.text_area(生成的报价单, quotation_text, height300) # 提供下载按钮简化版实际应生成PDF st.download_button( label下载为文本文件, dataquotation_text, file_namefquotation_{customer_name}.txt, mimetext/plain ) else: st.info(报价单为空请从左侧添加产品。) # 清空报价单按钮 if st.session_state.quotation_items and st.button(清空报价单): st.session_state.quotation_items [] st.rerun() # 页脚 st.divider() st.caption( 提示与助手对话时尽量描述清晰。系统会自动调用搜索、计算或生成工具。)7. 运行与效果验证现在让我们启动应用并验证核心功能。7.1 启动应用在项目根目录下运行以下命令streamlit run app.pyStreamlit会自动在默认浏览器中打开应用通常是http://localhost:8501。7.2 功能验证流程按照以下步骤测试系统的核心能力自然语言搜索在聊天框输入“帮我找一款笔记本电脑。”预期结果AI助手会调用SearchProduct工具返回产品列表中所有笔记本电脑的信息JSON格式并以友好的方式呈现给你。带条件的搜索输入“预算1万5有没有适合设计师的笔记本”预期结果AI会解析出“预算1万5”max_price15000和“设计师”可能匹配description中的关键词返回过滤后的结果。直接计算价格输入“如果VIP客户买15台P1001多少钱”预期结果AI会识别出产品IDP1001、数量15和客户等级VIP调用CalculatePrice工具返回详细的计算明细包括适用的折扣规则和总价。混合任务处理输入“我想给‘ABC公司’报个价他们要10台P1001和5台P2001他们是战略客户。”预期结果这是一个复杂的请求。理想的处理流程是AI先理解需要生成报价单然后分别计算两个产品的价格或直接调用GenerateQuotation工具最终汇总成一个完整的报价摘要。手动报价单功能在右侧面板从下拉框选择产品输入数量点击“添加到报价单”。填写客户名称和等级点击“生成报价单”。预期结果下方会显示格式化的报价单文本并可以下载为.txt文件。如果一切顺利你将看到一个交互式的Web应用它既能通过自然语言对话处理复杂的报价请求也能通过传统表单进行精确操作。这验证了AI Agent与业务流程结合的基本可行性。8. 常见问题与排查思路在搭建和运行过程中你可能会遇到以下问题问题现象可能原因排查方式解决方案运行streamlit run app.py时报ModuleNotFoundError依赖未安装或虚拟环境未激活1. 确认命令行前缀有(venv)。2. 运行pip list检查streamlit,langchain等包是否存在。在项目根目录下激活虚拟环境后执行pip install -r requirements.txt。应用启动后AI聊天功能无反应或报错OpenAI API密钥未设置或无效网络问题1. 检查项目根目录下.env文件是否存在且格式正确。2. 在agent.py中临时添加print(api_key)检查是否成功加载。3. 尝试在Python中直接调用openai.ChatCompletion.create测试连通性。1. 确保.env文件中OPENAI_API_KEYsk-...正确。2. 对于国内用户可能需要配置网络代理或使用国内模型需更换LangChain的LLM封装。AI助手回复“我不明白”或调用错误工具系统提示词system_prompt不够清晰用户输入太模糊1. 查看控制台因为设置了verboseTrue的Agent思考过程日志。2. 检查工具的描述description是否准确。1. 优化agent.py中的system_prompt更严格地规定Agent的行为。2. 让用户的输入更具体或在前端给出输入示例引导。搜索产品结果为空products.csv文件路径错误或内容为空搜索关键词不匹配1. 检查data/目录下文件是否存在。2. 在app.py侧边栏点击“刷新产品数据”。3. 检查data_manager.py中search_products函数的逻辑。1. 确保CSV文件路径正确。2. 尝试使用产品名称中的确切关键词进行搜索。价格计算错误如折扣未应用price_rules.csv规则未匹配get_applicable_rule函数逻辑有误1. 检查price_rules.csv中客户等级和数量门槛的设置。2. 在calculate_price_tool函数中添加print(rule)调试输出。1. 复核价格规则表的数据。2. 调试data_manager.get_applicable_rule函数确保其筛选逻辑符合业务预期例如是否正确处理了“数量门槛”的条件。Streamlit界面布局错乱Streamlit版本兼容性问题代码缩进或格式错误1. 检查app.py中st.columns的使用是否正确。2. 确保没有在同一个代码块中混合使用st.write和对象返回值。1. 参考Streamlit官方文档调整布局组件。2. 简化界面逐步排查是哪个组件导致的问题。9. 最佳实践与进阶扩展方向一个可用的原型只是起点。要将它转化为真正可靠的生产力工具还需要考虑以下方面9.1 工程化最佳实践配置管理将模型类型、API Base URL、温度等参数移出代码放入配置文件如config.yaml或环境变量。错误处理与日志在agent.py和tools.py中添加更完善的try-except块并记录日志到文件便于排查线上问题。数据持久化将聊天记录、生成的报价单存入数据库如SQLite或PostgreSQL而非仅保存在会话状态中。身份验证与授权为Web应用添加简单的登录功能区分不同用户的报价数据和权限。9.2 功能增强更智能的搜索用向量数据库如ChromaDB、Weaviate替代简单的关键词搜索。将产品描述转换为向量实现语义搜索让“适合编程的轻薄本”也能找到相关结果。多轮对话与澄清当用户需求模糊时如“我要一台电脑”让Agent主动追问关键参数预算、用途、品牌偏好。连接真实数据源将data_manager.py中的CSV读取替换为对接公司ERP、CRM或数据库的API调用。生成精美报价单使用reportlab或weasyprint库生成专业的PDF报价单包含公司Logo、条款等。报价历史与比较保存每次报价记录允许用户查看历史并对比不同方案。9.3 性能与成本优化Agent优化对于简单、明确的查询如直接计算价格可以设计规则引擎进行短路处理避免调用大模型降低成本和延迟。缓存策略对频繁查询的产品信息、价格规则进行缓存减少对数据库或外部API的调用。模型选择在成本与效果间权衡。复杂推理用GPT-4简单任务用GPT-3.5-turbo或更轻量的开源模型通过Ollama本地部署。9.4 部署上线本地部署使用docker-compose将应用、数据库容器化方便迁移和部署。云服务部署可部署在任意支持Python的云服务器或容器平台如阿里云ECS、腾讯云CVM、Railway、Fly.io。访问安全为Streamlit服务设置反向代理Nginx配置SSL证书HTTPS并设置访问密码。通过这个项目你不仅搭建了一个工具更掌握了一套方法论如何用AI Agent的思想将模糊的自然语言需求拆解为一系列确定性的工具调用最终完成一个复杂的业务流程。这个模式可以复用到客户服务、内部审批、数据查询等无数场景中。你可以基于这个框架不断迭代和丰富你的“工具库”让这个AI报价工作台变得越来越聪明、越来越贴合你的实际业务。
返回列表