案例 · 行业平台 · 已交付

RAG 法规问答系统:自然语言问 NMPA 条款

让法规非专业的研发员也能秒查 NMPA 条款

交付状态
已交付
工期
5 周
预算区间
¥22 万
客户类型
行业咨询平台
客户

某化妆品行业咨询平台 · 月活 8K

挑战

用户问"我这个配方加 0.5% 烟酰胺在欧盟能不能上",平台之前靠人工查 1.5 小时回复

方案

113K 条法规 chunked → pgvector 向量化 → Claude 3.5 重排 + 引用 → 自然语言回答带条款编号

项目复盘

5 周 里我们做了这些

背景

客户是化妆品行业咨询平台,月活 8K,主力用户是品牌方研发 / 法规 / 跨境团队。平台 2024 年上线了"法规检索"功能,覆盖 74 国 113K 条法规条款。但 6 个月数据:检索功能日均使用 80-120 次,用户反馈"找到了原文但看不懂",咨询师每天平均接到 30 条"我这个配方加 0.5% 烟酰胺在欧盟能不能上"的细节问题,每条人工回复要 1.5 小时。 核心问题:用户要的不是"找到法规原文",是"得到针对自己配方的明确答案"。这是从"检索"到"问答"的产品形态升级。

我们做了什么

总工期 5 周。 第 1 周|数据准备 + 分 chunk 策略。113K 法规条款不是一刀切按字符数分。我们按法规结构分:① 限制条款(含"应当"/"不得"/"禁止"动词的)单独成 chunk + 关键限制条件提到 metadata;② 解释条款(描述性)按 800 字符分;③ 附录列表(如禁用清单)每条目独立 chunk + 全清单作为 parent chunk。这样检索时既能命中具体条目又能拿到上下文。 第 2 周|Embedding + 入 pgvector。用 Gemini text-embedding-004(768 维)。113K chunk 入库,建 ivfflat 索引(lists=512),单次相似度查询 < 50ms。 第 3 周|检索召回调优。初版用纯向量检索,准确率 78%。问题:法规条款语言抽象("应当"/"不得"/"含 X 的产品需"),用户问"烟酰胺欧盟能不能用",向量检索召回的可能是"应当确保配方安全性"这种泛化条款,不是具体的烟酰胺限值。 第 4 周|query rewrite + Claude 重排。我们加了两层处理:① query rewrite——用 Gemini Lite 把用户口语化问题转成 3 个具体子查询(如"烟酰胺欧盟能不能用"→「烟酰胺 欧盟 1223 法规 限值」/「Niacinamide EU CosIng restriction」/「烟酰胺最大允许浓度 欧盟」);② 三个子查询分别检索 → 召回 30 条候选 → 用 Claude 3.5 Sonnet 重排(基于"对回答用户原问题的相关度"评分)→ 取 top 5 喂给最终回答 prompt。 第 5 周|引用溯源 + 灰度上线。每个回答必须引用至少 1 条具体法规条款(含国家 / 法规名 / 条号),点击可跳转原文。灰度先开放给 200 个内测用户。

数据结果

上线 3 个月: · 1,200+ 次问答/月(远超原本检索的 80-120 次) · 用户满意度评分 4.5/5 · 溯源准确率 96%(人工抽查 200 条回答,196 条引用条款准确) · 平台咨询师人工回复"细节问题"从 30 条/天降到 8 条/天 · 最大用例:跨境品牌秒查"成分 X 在 Y 国是否合规",省去之前的人工 1.5 小时 · 衍生:3 家其他化妆品平台主动询价类似 RAG 系统(CosDev 在谈中)

复盘 · 哪里做得不够

一开始用单纯向量检索准确率只有 78%,问题是法规条款语言抽象,需要语义重写 query。最终走 query rewrite + 重排两层方案。这个项目让团队学到"垂直领域 RAG 不能直接套用通用 RAG",必须先理解领域语言特点再设计检索策略。 RAG 能跑到 96% 是因为我们花了 1 周专门做 query rewrite——法规语言本身就是垂直领域。如果省掉这一周,最终系统只是一个"找到原文但答非所问"的 demo。

RAG 能跑到 96% 是因为我们花了 1 周专门做 query rewrite — 法规语言本身就是垂直领域。
CosDev · 黄智
技术栈
pgvectorGemini EmbeddingClaude 3.5 SonnetPostgreSQLPython

想做类似的项目?

把你的情境告诉我们,48 小时内给到初步方案 + 报价区间。