from typing import Optional, List, Tuple import re FAQ = [ { "keywords": ["有哪些功能", "能做什么", "有什么功能", "功能介绍", "可以做什么"], "answer": "TradeMate(外贸小助手)主要有以下功能模块:\n\n" "1. **翻译** — 多语言翻译,支持外贸专业术语\n" "2. **客户管理** — 添加、编辑、分类客户,跟进记录\n" "3. **产品管理** — 产品库管理,支持分类和搜索\n" "4. **报价单** — 在线生成报价单,导出 PDF\n" "5. **营销文案** — AI 生成营销文案和开发信\n" "6. **WhatsApp 集成** — 发送消息、管理对话\n" "7. **数据看板** — 销售漏斗、客户分析\n\n" "你想了解哪个功能的详细用法?", }, { "keywords": ["添加客户", "新增客户", "创建客户", "怎么加客户", "客户录入"], "answer": "添加客户很简单:\n\n" "1. 点击底部导航栏 **「客户」** 进入客户列表\n" "2. 点击右上角 **「+」** 按钮\n" "3. 填写客户信息(名称、电话、邮箱、公司、国家等)\n" "4. 点击 **保存** 即可\n\n" "你也可以直接对我说「添加客户张三,电话13800138000」,我会帮你自动提取信息并创建客户。", }, { "keywords": ["生成报价单", "创建报价单", "怎么报价", "如何报价"], "answer": "生成报价单的步骤:\n\n" "1. 点击底部导航栏 **「报价」** 进入报价单列表\n" "2. 点击 **「新建报价单」**\n" "3. 选择客户(可从客户管理导入)\n" "4. 添加产品(从产品库选择或手动输入)\n" "5. 设置价格、数量、折扣等\n" "6. 点击 **生成**,系统会自动生成报价单\n" "7. 可以导出为 PDF 发送给客户", }, { "keywords": ["导出客户", "导出数据", "怎么导出", "下载客户"], "answer": "导出客户数据的方法:\n\n" "1. 进入 **「客户」** 页面\n" "2. 点击右上角菜单,选择 **「导出」**\n" "3. 支持 CSV 和 Excel 两种格式\n" "4. 选择导出范围(全部/当前筛选)\n" "5. 点击确认即可下载\n\n" "导出的文件包含客户名称、电话、邮箱、公司、国家等字段。", }, { "keywords": ["营销文案", "营销", "开发信", "怎么写开发信", "营销文案生成"], "answer": "生成营销文案的步骤:\n\n" "1. 进入 **「营销」** 页面\n" "2. 点击 **「新建营销文案」**\n" "3. 选择产品和目标客户\n" "4. 选择风格(专业/友好/促销等)和语言\n" "5. AI 会自动生成多版文案供你选择\n" "6. 你可以编辑修改后直接使用或保存", }, { "keywords": ["FOB", "CIF", "贸易术语", "EXW", "DDP"], "answer": "**FOB(Free On Board,离岸价)**\n" "卖方负责将货物运至装运港并装上船,风险在装运港越过船舷时转移给买方。\n\n" "**CIF(Cost, Insurance and Freight,到岸价)**\n" "卖方承担运费和保险费,将货物运至目的港,风险在装运港越过船舷时转移。\n\n" "主要区别:\n" "- FOB:买方负责运费和保险\n" "- CIF:卖方负责运费和保险\n\n" "选择哪种取决于你和客户的谈判约定。", }, { "keywords": ["忘记密码", "重置密码", "修改密码"], "answer": "目前 TradeMate 支持通过手机号验证码重置密码:\n\n" "1. 在登录页面点击 **「忘记密码」**\n" "2. 输入注册手机号\n" "3. 点击 **获取验证码**\n" "4. 输入验证码后设置新密码\n\n" "如有问题请联系管理员。", }, { "keywords": ["怎么登录", "无法登录", "登录不了"], "answer": "登录方式:\n\n" "1. **手机号登录** — 输入手机号和密码\n" "2. **微信登录** — 点击微信图标快速登录\n" "3. **游客模式** — 无需注册即可体验部分功能\n\n" "如果无法登录,请检查网络连接,或尝试重置密码。", }, ] def match_faq(query: str) -> Optional[str]: query_lower = query.lower().strip() best_score = 0 best_answer = None for item in FAQ: score = 0 for kw in item["keywords"]: if kw.lower() in query_lower: score += 1 if score > best_score: best_score = score best_answer = item["answer"] if best_score >= 1: return best_answer return None