From 7d0d28406c9b62723b65c6025854f1907dc9cdd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B5=85=E5=BF=B5?= Date: Tue, 29 Sep 2026 14:32:25 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20HESUPIPE=20=E5=85=AC=E5=8F=B8=E4=BA=8B?= =?UTF-8?q?=E5=AE=9E=E5=8D=A1(=E5=AE=98=E7=BD=91=E7=A1=AC=E4=BA=8B?= =?UTF-8?q?=E5=AE=9E+=E9=98=B2=E7=BC=96=E9=80=A0=E8=A7=84=E5=88=99)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Code --- app/prompts/company_facts.md | 54 +++++++++++-------- .../2026-09-29-building-materials-ai-kefu.md | 12 ++--- tests/test_company_facts.py | 17 ++++-- 3 files changed, 52 insertions(+), 31 deletions(-) diff --git a/app/prompts/company_facts.md b/app/prompts/company_facts.md index 2cb13fb..48f8716 100644 --- a/app/prompts/company_facts.md +++ b/app/prompts/company_facts.md @@ -1,29 +1,39 @@ -# 公司事实卡(仅供回答客户关于公司的事实性问题) +# HESUPIPE 公司事实卡(仅供回答客户关于公司的事实性问题) -## 我是谁 -- Hesu Auto 是 Hesu Group 旗下专注汽车出口的公司 -- 中国首批汽车出口企业之一,累计出口 50,000+ 台 -- **累计出口到 70+ 国家与地区**(中东、非洲、南美、欧洲)——出口目的国口径,不是分支/网点覆盖 -- 与 30+ 汽车品牌深度合作:BYD、Changan、Geely、Leopard、ROX、Nissan、Zeeker、Li Auto 等 +## 公司概况 +- Henan Hesu Group Co., Ltd.(品牌 HESUPIPE),塑料管道系统出口制造商,高新技术企业 +- 1998年成立,2007年开始出口 +- 总部:河南郑州(河南省国家大学科技园东区17号楼) -## 卖什么 -- **新车与二手车都做** -- 全动力类型:燃油、混动、插混、纯电 -- 全车型类别:轿车、SUV、皮卡、重卡;乘用车、商用车、新能源车、车队/项目采购 +## 产品线总表(官网十大类) +- HDPE管道及管件:PE100/PE80燃气管、给水管(至1200mm)、硅芯管、灌溉管、热熔/电熔管件(SDR11 PN16) +- HDPE波纹管:双壁波纹管等,DN225-DN800(可定制) +- PVC管道及管件:1/2-40英寸(DN20-DN1000mm),SCH40/SCH80 +- PVC电工套管:CPVC套管、波纹保护管等 +- PPR管道及管件:25-160mm +- 球墨铸铁管;法兰阀门:软密封闸阀(DN100)等 +- HDPE渔网箱(深水养殖);门窗类:合金树脂/PVC/木塑 +- 其他相关产品:HDPE土工膜、疏浚橡胶管 -## 网络与运作 -- 模式:中国采购供应 → 迪拜(Jebel Ali)枢纽备货分拨 → 海外交付 -- 海外分支五处:Dubai、Ghana、Ethiopia、Djibouti、Belarus -- Abu Dhabi 有展车节点;Ghana 西非保税仓;Djibouti+Ethiopia 东非协同;Venezuela(南美)在网络节点内 +## 应用领域 +- 市政给水、燃气油气、排水排污、农业灌溉、电气与通信保护、疏浚、海水养殖、水井 + +## 认证 +- ISO 9001、ISO 14001、ISO 45001(官网关于我们页载明:2021年3月获证;证书编号未公开,细节问经理) + +## 销售网络与出口市场 +- 官网销售网络页未公布具体国家清单与分支名单 +- 官网公开项目案例国:智利、坦桑尼亚、布基纳法索、冈比亚、萨尔瓦多、危地马拉、圭亚那、蒙古、柬埔寨、菲律宾、马尔代夫 +- 案例:智利HDPE给水盘管、坦桑尼亚疏浚管线系统、菲律宾农村供水HDPE管 ## 使用规则(与 system.md 红线同级) - **统一兜底(最高优先)**:任何不清楚、事实卡没有、需要核实的问题——**不编造、不承诺、不否定、不断言**,统一动作只有一个:顺势引导留联系方式转客户经理——"这个我让我们经理给你准确答复——留个 WhatsApp,他直接联系你" -- **不扩展原则**:回答公司事实**只用本卡原词**——禁止添加城市/地址/街道等任何卡外细节(卡片没写城市就不提城市)。卡片没写的就是不知道,一律走统一兜底 -- 客户问公司情况/品牌/是否可信时,取上述事实**简短作答(1-2 句)**,建立信任 -- **分支问题与出口覆盖问题是两回事,分开答**: - - 问分支/网点("do you have branch in X")→ 只认卡里列的:五分支+节点(Dubai/Ghana/Ethiopia/Djibouti/Belarus/Abu Dhabi/Venezuela)必须答"有",**只说国家+节点类型,不提城市**,可逐字使用:"Yes, we've got a Ghana branch with bonded storage";卡里没有的 → **走统一兜底**——绝对禁止编造否定答案("Not yet"/"we don't have"/"没有") - - 问出口覆盖("do you ship to X")→ 70+ 国是**累计出口目的国**,不代表 X 一定有网点:答"已出口到 70+ 国家"事实 + **走统一兜底**(X 具体情况经理确认)——不承诺、不否定 +- **不扩展原则**:回答公司事实**只用本卡原词**——禁止添加规格、标准、项目、地址等任何卡外细节(卡片没写的规格就不提规格)。卡片没写的就是不知道,一律走统一兜底 +- 客户问公司情况/产品范围/是否可信时,取上述事实**简短作答(1-2 句)**,建立信任 +- **项目出口国与当地网点/库存是两回事,分开答**: + - 问"do you ship to X"→ 可答官网公开项目案例国事实 + **走统一兜底**(X 具体情况经理确认)——不承诺、不否定 + - 官网未公布分支/代理名单,问分支/代理/现货 → **走统一兜底**——绝对禁止编造否定答案("Not yet"/"we don't have") - 绝不主动长篇介绍公司,绝不用成营销腔——风格仍按【说话风格】 -- 涉及具体价格/交付时效/库存承诺 → 仍按【职能边界】转客户经理,本卡不改变任何红线;售后只说"有本地协同支持",不做任何保证 -- 事实卡没写的细节(某国代理、某车型现车、认证资质细节)→ **走统一兜底**(不编造,留资+经理沟通) -- 数字一律照抄本卡写法(如 50,000+、70+),不改写成中文数字 +- 涉及具体价格/交期/MOQ/库存承诺 → 仍按【职能边界】转客户经理,本卡不改变任何红线 +- 事实卡没写的细节(某国代理、某规格现货、认证编号、产能)→ **走统一兜底**(不编造,留资+经理沟通) +- 数字与规格一律照抄本卡写法(如 DN225-DN800、1/2-40英寸),不改写、不换算 diff --git a/docs/superpowers/plans/2026-09-29-building-materials-ai-kefu.md b/docs/superpowers/plans/2026-09-29-building-materials-ai-kefu.md index 7576db7..ac375bf 100644 --- a/docs/superpowers/plans/2026-09-29-building-materials-ai-kefu.md +++ b/docs/superpowers/plans/2026-09-29-building-materials-ai-kefu.md @@ -25,7 +25,7 @@ - Create: 整个项目骨架(从参考项目拷贝) - Delete: `static/blog.html`、redis 相关配置 -- [ ] **Step 1: 拷贝项目(排除密钥/数据/缓存)** +- [x] **Step 1: 拷贝项目(排除密钥/数据/缓存)** ```bash cd /d/refactor @@ -43,7 +43,7 @@ robocopy 返回码 0-7 都算成功(1=有文件拷贝),≥8 才是失败 robocopy 的 `/XD .git` 只排除源目录的 .git,不影响目标已有仓库。Step 6 前用 `git rev-parse --is-inside-work-tree` 确认输出 `true` 即可(若在全新环境重跑本计划则先 `git init`)。 -- [ ] **Step 2: 验证拷贝结果** +- [x] **Step 2: 验证拷贝结果** ```bash cd /d/refactor/ai-kefu-jc && ls app/ static/ tests/ scripts/ @@ -52,7 +52,7 @@ test ! -f .env && echo OK-no-env mkdir -p data ``` -- [ ] **Step 3: 清理无用件** +- [x] **Step 3: 清理无用件** ```bash rm static/blog.html @@ -63,7 +63,7 @@ rm static/blog.html 2. `docker-compose.yml` 删除整个 redis service 块(`cc-ai-kefu-redis`) 3. `.env.example` 删除 `REDIS_URL`/`REDIS_PASSWORD` 行及注释 -- [ ] **Step 4: 安装依赖并建 .env 占位** +- [x] **Step 4: 安装依赖并建 .env 占位** ```bash pip install -r requirements.txt -r requirements-dev.txt @@ -72,7 +72,7 @@ cp .env.example .env `.env` 中 `ZHIPU_API_KEY` 先留占位(跑测试不需真实 Key,LLM 全 mock)。 -- [ ] **Step 5: 基线测试——未改任何代码前必须全绿** +- [x] **Step 5: 基线测试——未改任何代码前必须全绿** ```bash python -m pytest -q @@ -80,7 +80,7 @@ python -m pytest -q 预期:170+ passed(参考项目全绿,拷贝后应同样全绿)。若有 Windows 环境性失败,先修复环境再继续(参考项目 conftest.py 头部有 Windows aiosqlite 清理说明)。 -- [ ] **Step 6: Commit** +- [x] **Step 6: Commit** ```bash git add -A && git commit -m "chore: 从汽车AI客服项目拷贝骨架并清理(blog页/redis)" diff --git a/tests/test_company_facts.py b/tests/test_company_facts.py index 967b7cc..080f9ed 100644 --- a/tests/test_company_facts.py +++ b/tests/test_company_facts.py @@ -27,15 +27,26 @@ def test_facts_concatenated_between_system_and_context(): import asyncio asyncio.run(svc.chat([{"role": "user", "content": "hi"}], context="⚠️ 提醒")) p = svc.provider.prompts[0] - assert "Hesu" in p # 事实在场 + assert "HESUPIPE" in p and "HDPE" in p # 建材事实在场 assert p.index(SYSTEM_PROMPT) < p.index(COMPANY_FACTS) < p.index("⚠️ 提醒") def test_facts_absent_from_extractor_prompt(): # extractor/evaluator 不拼事实卡(它们有自己的 prompt,不该看到公司事实) from app.services.ai_service import EVALUATOR_PROMPT, EXTRACTOR_PROMPT - assert "Hesu" not in EXTRACTOR_PROMPT - assert "Hesu" not in EVALUATOR_PROMPT + assert "HESUPIPE" not in EXTRACTOR_PROMPT + assert "HDPE" not in EXTRACTOR_PROMPT + assert "HESUPIPE" not in EVALUATOR_PROMPT + assert "HDPE" not in EVALUATOR_PROMPT + + +def test_facts_no_auto_words(): + # 建材化红线: 事实卡不得残留汽车项目词汇 + # (只查 COMPANY_FACTS——SYSTEM_PROMPT 属 Task 3,不在本测试管辖) + for word in ("BYD", "Hesu Auto", "Toyota"): + assert word not in COMPANY_FACTS, word + for word in ("vehicle", "sedan", "suv"): + assert word not in COMPANY_FACTS.lower(), word from app.services.boundary_filter import (