做家居装修咨询的都知道,用户问一句“卫生间防水怎么做”,背后其实藏着一整套需求:他家是2005年的老房子还是精装新房、原墙砖要不要拆、预算在哪个档位、打算找施工队还是整装公司。可在传统渠道里,这些答案散落在搜索引擎的广告位、论坛的置顶帖、建材商的口播和装修公司客服的微信回复里,想从里面挑出跟自己房况匹配、又写得出处的内容,真的就是大海捞针。
我最近完整做了一个这类项目——为某线上家装平台上线一个“家居装修AI咨询助手”,用户直接在对话框提问,几秒钟内拿到有依据、能追溯、按场景拆解的装修建议。这篇文章就当项目复盘来写,把我们从需求拆解、方案选型,到知识库搭建、对话链路、上线调试的全过程梳理一遍。如果你正在做AI问答类应用,或者想切入家装这类垂直领域的AI助手,这篇应该能帮你少踩几个坑。
1. 装修咨询为什么这么难:先看清“大海捞针”的全貌
1.1 一次典型咨询背后的信息断裂
我拿一个真实场景举例。有位用户准备局部翻新一套2005年的老房,想把卫生间瓷砖敲掉重做防水。这个问题如果拆开看,至少包含四个子问题:原墙体基层要不要处理?防水材料选刚性还是柔性?涂刷之后闭水试验要多久?整体预算大概多少钱?
放在传统咨询链路里,这四个子问题的答案分别来自不同地方:墙体处理要看施工规范,材料选择要看产品参数页,闭水试验要看工序文档,预算只能靠装修公司报价。用户在搜索引擎里搜出来的,首先是大量装修公司的营销文章和竞价广告;翻到社区帖子,内容虽然真实,但每家房屋状况不一样,案例没法直接套用;再问装修公司客服,对方为了获客会顺着话头把报价和方案混在一起讲。整条信息链是断裂的,用户最终得到的是一个又像广告又像科普的模糊答案。
这个场景给我的直接感受是:用户缺的不是信息,而是一条能把“信息海洋”收敛成“结构化答案”的通道。AI咨询助手要解决的就是这个问题,先定位用户房屋类型和咨询重点,再用可信知识库去匹配,最后带着出处把答案讲清楚。
1.2 传统咨询渠道的四个断层
我在调研阶段把装修咨询的痛点归纳成四个断层:
- 知识分散:同一个问题的答案,散落在施工规范、厂商参数页、社区经验帖和熟人推荐里,没有统一入口。
- 场景缺失:搜索引擎和通用问答不会主动区分老房、新房、局部翻新、毛坯整装,答案经常答非所问。
- 不可追溯:人工客服口头回答,没有依据,用户事后出了问题想复盘也找不到原始出处。
- 情绪压力:销售导向的客服容易强推套餐,用户还没有建立信任就被迫做决策,安全感很低。
这四个断层决定了对AI助手的定位要求:它不能只是一个“聊天机器人皮肤”,本质上应该是“知识搜索引擎+对话式界面+引用溯源系统”的组合体。
1.3 项目边界:先做到什么程度才算成功
项目启动时,我们和平台方一起定下了一版可量化的验收清单:
- 能覆盖风格、材料、工艺、预算、工期五类核心咨询意图,外加闲聊兜底。
- 每个回答必须至少挂一个知识库来源,用户点开能看到原文摘要。
- 涉及水电改造、燃气、承重墙、高层外窗等安全问题时,必须出现风险提醒。
- 答不上来要明说,不能编造,必须引导到人工客服入口。
- 首段回答的目标响应时间控制在5秒以内。
同时也明确画了一条“不做”的边界:不做自动报价、不做设计图纸、不替代监理意见和合同纠纷的法律意见。这套边界最重要的作用,是让后续所有技术选型都有了一个明确的判断标准。没有边界,需求会被各种“能不能顺便也做一下”拉扯得无限膨胀。
2. 先聊聊架构选型:为什么我们不从微调一个大模型开始
2.1 微调的真实成本和RAG的适用边界
方案评审时,有小伙伴提出直接用开源大模型做微调,训练一个“装修专家”。这个想法听起来直接,但我们评估后没有选。
原因有三个。第一,微调需要大量端到端的高质量问答对,而装修咨询根本不存在标准答案库,同一个工序在不同房况、不同地区下结论可能完全相反,标注成本极高。第二,装修行业的知识更新很快,建材型号在换代、施工工艺在改进、安全规范在修订,微调一次模型动辄好几天,更新速度跟不上。第三,微调模型生成回答时,“这句话来自哪份规范”这件事是隐性的,想做到引用溯源非常痛苦。
RAG恰好补上这些短板:知识放在外部资料库,回答前先生成“查资料再回答”,回答时强制带引用编号,文档更新就像换书一样简单。类比一下,微调是让学生把知识点全部背进脑子里,RAG是给学生一座随时能翻的图书馆,再配一套严格的引用规范。
2.2 系统架构:五层模块与一次请求的完整流向
我们的系统分五层:
- 接入层:面向小程序、Web端和客服后台,统一走API网关。
- 对话管理层:维护会话历史、槽位持久化、多轮摘要。
- 理解层:做意图识别和实体抽取。
- 检索层:负责查询改写、向量召回、关键词召回和规则重排。
- 生成层:组装提示词,调用大模型,输出带引用的回答。
一次完整请求的数据流是这样的:用户输入→意图识别与实体抽取→更新槽位→查询改写→向量和关键词两路召回→融合重排→按元数据过滤→取Top5知识块→组装上下文→大模型生成→返回引用和风险提示。
这条链路比“直接问大模型”至少多出四五个环节,每个环节都是在为“场景匹配”和“可追溯”这两个核心目标服务。如果只是追求“答得快”,直接调通用大模型就行;但家装领域用户要的是“答得靠谱”,该做的过滤和校验一步都不能省。
2.3 技术栈与成本估算
技术选型上我们也做了取舍,核心原则是先保可维护性,再追求效果上限。
| 模块 | 选型 | 理由 |
|---|---|---|
| 对话模型 | 国产开源对话模型(约14B参数档) | 可私有化部署,调用成本低,中文上下文理解够用 |
| 嵌入模型 | 开源通用中文嵌入模型(768维) | 中文语义召回效果满足需求,无需专门训练 |
| 向量检索 | pgvector | 知识块规模在10万级以内,不需要单独引入重向量库 |
| 关键词检索 | 开源全文索引(BM25) | 对精确参数、型号类查询更敏感 |
| 重排策略 | 规则重排 | 先解决业务硬规则,模型重排放到后续迭代 |
成本估算其实不复杂。单轮对话平均消耗约900到1000个token,用主模型的单价乘一下,就能算出千次对话的大致成本。我们部署在私有GPU环境,主要开销是算力资源,实际跑下来比想象中可控。需要提醒的是,别只盯着生成模型的token成本,向量化、检索、日志存储这些沉默成本往往才是后期账单里的大头。
3. 知识库怎么搭才对:四类数据源和切分策略复盘
3.1 数据源筛选:哪些内容值得进知识库
装修领域的内容量很大,但大部分并不适合做成问答知识。我们把数据源收敛成四类:
- 规范与工艺类:施工技术规范,防水、水电、涂刷、铺贴等工序文档,每个步骤都有标准可查。
- 产品参数类:主流建材品牌公开的产品说明、用量数据、施工条件,这些是可核验的事实。
- 问答沉淀类:平台历史人工客服对话、社区高赞回复,经过脱敏、纠错后转化为结构化Q&A。
- 专家访谈类:与工长、监理做的结构化访谈,把经验沉淀成“什么情况下应该怎么处理”的知识条目。
数据清洗时重点做三件事:去掉广告、联系电话和促销话术;统一术语别名,比如“腻子”“刮大白”“批墙”实际指向同一工艺;给每个条目标注风险等级,涉及承重墙、燃气、电气、高层外窗的标记为高危。我自己的体会是,宁可知识库小一点,也不要收进来一堆没有出处、没有标准的内容,否则模型会把噪声当成事实传播出去。
3.2 知识切分:按“知识单元”而不是固定字数切
知识块的切分方式直接决定检索命中质量。最初我们也想过按固定512字切,但很快发现一个问题:固定切分会在最脆弱的地方切断语义,比如把“防水涂料施工次数”和“闭水试验时长”拆到两个块里,检索到前半段时,模型就会凭“印象”把后半段补出来,幻觉就是这么来的。
我们改成两级切分策略。先按文档结构切,尊重标题层级、表格和段落边界;再对每个块做“要素判断”,判断它属于工序描述、材料参数、验收标准还是安全提示,从中抽出结构化小条目。以卫生间防水为例,最终切成“基层处理”“防水层涂刷”“闭水试验”“常见遗漏点”四个知识单元,彼此独立,又能被联合引用。
三种切分策略的对比:
| 策略 | 优点 | 缺点 |
|---|---|---|
| 按固定字数切 | 实现最简单 | 语义断裂严重,幻觉率高 |
| 按标题层级切 | 结构基本完整 | 长段落仍然超限,检索精度一般 |
| 按知识单元+结构化切 | 命中率高,引用干净 | 需要前期规则和人工模板 |
3.3 元数据与标签:让答案匹配“你家的情况”
装修知识的“适用条件”非常重要,一条工艺在旧房和精装房里的做法可能完全不同。所以我们给每个知识块都挂了元数据,检索后先按字段过滤,再做排序。
下面这个JSON是我们当时的索引映射示例:
{ "id": "tech-toilet-waterproof-007", "type": "工艺", "houseType": ["老房翻新", "局部改造"], "area": ["卫生间"], "material": ["防水涂料", "聚氨酯", "丙纶"], "regionTag": "全国通用", "riskLevel": "中", "source": "某工艺规范文档·卫生间防水章节", "validTime": "2024-01-01" }houseType用于过滤“老房”和“新房”,area用于匹配“卫生间”“厨房”等场景,riskLevel触发安全约束,source用于生成引用链接。这个设计看起来不起眼,但它是整套系统里性价比最高的一笔投入。没有元数据,检索到的知识块再多,模型也不知道哪条能用在用户的场景里。
3.4 人工审核和版本更新机制
知识库的维护不能完全自动化。我们当时定了两条原则。第一,每一条新增知识块都要过“编辑确认+技术复核”两道关口,两个编辑对同一块判断不一致时,默认标为“存疑”,检索时排到末尾,避免把争议内容当标准答案输出。第二,每个知识块有上线时间,旧文档一旦过期就下架,不能被检索到。
踩过的具体例子是:某个建材品牌的老型号产品参数没有及时下架,模型就会对已经停产的型号继续输出性能数据,用户照着去买,发现根本买不到。这种问题模型自己发现不了,只能靠版本管理从源头解决。
4. 从检索到回答:对话引擎实现的四个关键动作
4.1 意图识别与实体抽取:先判断用户要什么
我们把用户问题先归到六类意图:风格咨询、材料咨询、工艺咨询、预算咨询、工期咨询、其他闲聊。每类意图对应不同的回答模板和检索范围。再抽四个关键实体:房屋类型、面积、翻新区域、装修阶段。
提示词要求模型以JSON格式输出结构化结果,像这样:
{ "intent": "工艺咨询", "entities": { "houseType": "老房翻新", "area": "卫生间", "stage": "防水施工", "budget": null } }不能把模型当分类器盲目信任,要叠加业务规则兜底。比如用户提到“多少钱”“预算”“报价”,强制划到预算咨询;提到具体建材品牌名,强制关联材料咨询。规则兜底最大的价值不是提升准确率,而是让极端case不至于整个跑偏。
4.2 多轮对话的查询改写与记忆管理
装修咨询天然是多轮的。用户先问“卫生间防水怎么做”,下一句“那如果地面已经贴砖了呢”,如果每轮都独立检索,第二问根本搜不到相关文档。我们做了两层处理。
第一层是槽位继承,把上一轮抽出的实体带进下一轮,自动把“那如果地面已经贴砖了呢”改写成“卫生间地面已经贴瓷砖的情况下如何做防水”。第二层是上下文压缩,当会话超过四轮,或者新问题与上一轮实体不一致时,用大模型把前文压成摘要加关键槽位,再拼进后续请求。伪代码思路大概是:
def build_user_prompt(history, slots, query): summary = summarize(history[:-2]) if len(history) > 4 else "" recent = history[-2:] return f""" 历史摘要:{summary} 最近对话:{recent} 关键信息:房屋类型={slots.houseType},区域={slots.area},阶段={slots.stage} 当前问题:{query} """这里有个很实在的注意点:不要把整段历史全塞给模型,既浪费token,又会让模型淹没在无关信息里。槽位保存比完全依赖摘要更可靠,摘要会模糊,结构化字段不会。
4.3 混合检索与重排:怎么把最相关的知识块顶上来
装修文档里的同义表达特别多,“刷防水”“做防水层”“防水施工”说的是同一件事。向量检索解决同义召回,但对精确型号和参数不敏感;BM25关键词检索相反,对同义词无能为力,对精确词却很准。我们选择两路都召回再做融合。
具体流程是:向量召回取Top50,BM25召回取Top50,用RRF做倒数排名融合,再按元数据规则重排。重排加分规则如下:
| 规则 | 加分 |
|---|---|
| 命中houseType(如“老房翻新”) | +3 |
| 命中area(如“卫生间”) | +2 |
| riskLevel匹配当前对话关注的安全点 | +1 |
| 来源优先级:规范文档 > 厂商参数 > 社区经验 | +2 |
重排后取Top5拼进生成上下文。这样做的核心原因,是让“老房”“卫生间”这类关键槽位有机会压过单纯的语义相似度,让回答真正贴着用户情况走。如果只按相似度排序,模型经常会把“防水”泛化成一大篇通用内容。
4.4 提示词模板与生成策略
生成环节,我们用的是结构化的系统提示词,核心内容如下:
- 角色定义:你是家居装修咨询助手,不代表任何装修公司,不推销任何产品。
- 回答规范:先给结论,再列依据和步骤;用口语表达,少堆术语。
- 引用规范:只能引用下方“资料上下文”中的内容,不要编造,每句话对应引用编号。
- 安全约束:问题涉及承重墙、燃气、水电改造、高层外墙等,必须在回答末尾附风险提示。
- 能力边界:资料库没有答案时,明确说明“需要进一步确认”,并引导人工客服入口。
参数上我们固定使用temperature=0.2、max_tokens=380。温度调低是有意为之:装修回答容错率低,宁可回答生硬一点,也不要模型自由发挥。用户Prompt的组装顺序是“历史摘要+当前问题+检索上下文”,检索上下文里每个知识块前面都加了编号。
4.5 引用与溯源:让答案“可信”而不是“像真的”
生成阶段,我们把每个知识块编号为[1][2][3],要求模型必须按编号引用。前端展示时,编号渲染成“查看来源”的链接,弹层里展示原文摘要。这一步不是锦上添花,而是整个产品的信任底座。
更关键的是引用校验。我们加了一条自动规则:模型引用的编号如果落在与主题无关的知识块上,直接判定生成失败并触发重新生成。真正见过AI助手翻车的人都知道,幻觉不可怕,可怕的是幻觉配了一个看起来很真的引用编号。所以引用校验在项目里的优先级,和参数校验是同一档。
5. 上线前踩过的坑:五个典型问题与排查实录
5.1 知识冲突:同一道工序,不同资料给的参数不一样
墙面防潮这个知识点,北方的常见做法是基层防水加保温层处理,南方则更强调通风和防水层外移。资料库抓取时两个方向的内容都进了知识库,模型就会随机引用,用户昨天得到一个答案,今天又得到一个相反的。
排查后发现根因不是模型,而是知识块缺少地区标签。我们把已有知识块批量补上regionTag字段,检索时优先命中同区域内容,同时在回答模板里加了一句“地区气候差异较大,具体做法建议以当地施工习惯和物业要求为准”。装修行业很少有放之四海而皆准的标准答案,很多结论自带限定条件,做知识库时一定要把限定条件存下来。
5.2 数值幻觉:材料用量、辅料配比最容易编
测试时发现一个高频问题:用户问“一袋腻子能刮多少平方米”,模型有时会给出一个精确到小数点的数字,而知识库里根本没有这个值;还有一次,它编了一个“某品牌官方推荐配比”,纯属无中生有。
处理方案有两个。第一,数值类问题在检索时做强制判断,知识块里没有对应数值,提示词就强制要求“只能提供计算方法和估算区间”,不允许给精确值。第二,把参数类问题单独拿出来做了12组回归测试集,上线前必须全部通过。数值类幻觉是家装问答里最伤信任的一类错误,宁可让用户自己算,也不能替他编数字。
5.3 对话历史污染:上一轮话题把本轮答案带偏
有一次测试对话里,用户先问“乳胶漆颜色怎么选”,接着问“那现在滚涂还是喷涂好”,模型给了一大段关于哑光漆和亮光漆在颜色表现上的区别,完全偏题。根因是系统把上一轮的长文本直接拼进了新Prompt,模型被颜色话题“带跑”。
我们调整了策略:历史摘要从“全量文本”改为“只保留实体槽位和一句话结论”,同时在查询改写阶段判断新问题与上一轮实体是否一致,不一致就重置场景槽位。修改后这类偏题率明显下降。这个坑也验证了前面说的,长历史不是记忆,是噪声。
5.4 兜底策略缺失:答不上来时硬答
上线前测试阶段,用户问“附近有没有靠谱的施工队”,模型竟然开始推荐装修公司,还煞有介事地描述了“服务口碑”。可知识库里根本没有具体公司数据,答案全靠编。
我们补了三档兜底策略:资料库范围外的问题,明确告知“暂时无法回答”,并引导人工客服;涉及具体供应商推荐的问题,不做推荐,只讲“判断施工队好坏的五个维度”;用户表达烦躁或负面情绪时,先安抚,再转人工介入。兜底话术看似不起眼,但它是用户体感的最后一道防线,上线前要专门设计并反复测试。
5.5 长会话窗口溢出:轮次多了模型反而变傻
第10轮对话之后,模型开始丢掉一开始抽取的关键实体,比如用户明明是“老房翻新”,后面几轮回答却按“精装新房”的逻辑走。根因是上下文窗口被大量历史文本占满,关键信息反而被淹没。
我们用“滑动窗口+槽位持久化”双通道解决:最近两轮原文完整保留,更早的轮次全部压成摘要;房屋类型、面积、翻新区域这些关键字段独立存JSON,每次生成前重新注入到系统提示词里。验证方式是把一个10轮会话切成3段做测试,槽位字段的准确率从约六成回到九成五以上。
这些问题整理成速查表,方便后面排查:
| 问题现象 | 根因 | 解决办法 | 验证方式 |
|---|---|---|---|
| 同一问题不同回答 | 知识块缺地区/房况标签 | 补元数据,检索加过滤 | 同题连问5次,对比答案 |
| 参数类数值被编造 | 知识库无源可引 | 数值类强制走检索+估算区间 | 12组参数回归测试 |
| 上一轮话题带偏回答 | 历史长文本污染 | 摘要+槽位重组Prompt | 横跨不同意图的连问测试 |
| 无数据时硬答 | 缺少兜底策略 | 三档兜底话术 | 20条超纲问题测试 |
| 长对话丢实体 | 上下文窗口溢出 | 滑动窗口+槽位持久化 | 10轮会话分段验证准确率 |
6. 评测方法、效果参考与下一步迭代方向
6.1 四维评分卡与回归测试集
项目上线前,我们建了一套120条问题的人工评测集,覆盖六类意图,外加20条高风险安全类问题。每条回答从四个维度打分:有用性(1到5分)、引用准确率、安全合规率(该触发风险提示的场景是否触发)、反感率(回答是否生硬或话术化)。
内部评测结果显示,工艺类和材料类问题的可用率最高,预算类最差,因为预算答案高度依赖本地市场行情,知识库只能提供结构和区间,做不到精准。评测集不是一次性工作,上线后要持续从对话日志里抽取高频问题补进去,我们每周固定做一次新增问题评测。
6.2 效果参考:咨询链路从“大海捞针”到“一问即答”
在内部AB测试的模拟环境下,真实用户完成一次完整咨询的平均耗时,从原来人工模式的约8到10分钟降到2分钟以内;人工客服需要接管的对话比例,从几乎百分之百降到三成左右;用户对回答的满意度评分,也有明显提升。
这里要特别说明,这些指标来自模拟环境演示和内部AB测试,不是真实外部运营数据。真正的上线效果还需要结合渠道流量和客服流程一起验证。我们内部还额外监控了一个指标:用户问完问题之后,有没有继续发起追问或点击来源链接。这个指标比“首答满意度”更能反映回答是否真正解决问题。
6.3 下一步:从“问答工具”到“装修流程助手”
一期上线之后,迭代方向基本明确。第一是数据闭环,每周从对话日志中提取“高频未收录问题清单”,自动生成知识库补全任务,这是知识库持续进化的关键。第二是工作流扩展,从纯问答升级到“回答完问题自动生成装修需求清单”,引导用户预约量房或报价评估。第三是多模态输出,把结构示意图、参数表引入知识库,让回答能带上图文说明,而不是只有纯文字。
如果资源有限,我建议优先做第一项。知识库不进化,AI助手的能力天花板会永远卡在验收那一天的版本里。
这个项目做完,我个人的体会是:家装这类AI问答助手,真正值钱的部分往往不在于模型有多聪明,而在于知识库的组织方式和端到端的反馈闭环。装修是一个低频、高客单、强信任的领域,用户要的不是一个聊得开心的机器人,而是一个能告诉他“这事该怎么办、为什么这么办、依据在哪里”的助手。如果你也在做类似的方向,我建议把70%的精力放在知识库治理和评测体系上,模型反而是所有环节里最好解决的那一环。