跳到主要内容
返回博客
Engineering2026-03-1215 min read

RAG 销售机器人:生产环境里真正能跑通的做法

SP

Sarah Park

Head of Engineering

过去一年我大概看了 40 个 AI 聊天机器人 demo。它们都能跑。然后它们都上线了,然后都炸了,大致都是同样的四种炸法。这篇讲 Anvil 的聊天机器人是怎么接线来避开这四种失败模式的,带的是我们吃过若干生产事故之后才落地的真实配置值。

快速背景。Anvil 的聊天机器人是一个 RAG(检索增强生成)系统,处理网站、微信、WhatsApp Cloud、Instagram DM、飞书上的 inbound 销售对话。它要资质评估线索、回答产品问题、必要时干净地交接给人。架构在 `services/ai-engine/` 和 `services/chat-service/`,模型路由走 `app/core/ai_router.py`。

失败模式 1:幻觉报价

最糟糕的一种,因为客户会记得机器人说了什么。用户问"Enterprise 套餐多少钱",机器人 — 它见过大量通用 SaaS 价格的训练数据 — 自信地编出"每月 $2,400"。用户在结账时期待这个价。你丢掉了交易,可能还丢掉了关系。

修复一:绝不允许 LLM 生成价格。任何包含价格意图的用户提问(cost、price、plan、多少钱、报价、计费、月、年、折扣,任何我们支持的语言 — DeepSeek-flash 在我们维护的标注集上分类精度约 98%)都被分类并路由到一个确定性响应。机器人返回一张从价格服务取出的卡片,不是生成的段落。卡片带一个"找销售"CTA,用于定制报价。

修复二:任何事实陈述用结构化检索。当用户问到需要具体数字、版本号、专有名词的问题时,我们在响应上打一个 `must_cite` 标志,机器人被约束为只能引用在检索里有可验证来源 chunk 的内容。如果检索没有返回覆盖这个问题的 chunk,机器人会说"我没有那个具体数字,我给你转人工"并触发交接。这用啰嗦换信任。每一次数字都是对的。

失败模式 2:过度谨慎拒答

相反方向的失败:模型怕幻觉怕到不肯做线索资质评估。潜在客户说"我们有 200 个销售,适配吗?"机器人回"我无法提供具体建议,请联系销售。"这种回复直接丢掉对话。用户来聊天是因为不想填表单。

修复:把系统提示词调成明确赋权。我们的提示词用平铺直叙的语言告诉机器人,它是一名销售工程师,拥有完整权限去做线索资质评估、推荐套餐、描述能力,只有在以下情形升级到人工:(a)交易超过 $100k ARR、(b)法务 / 合规 / 安全问题、(c)生气的客户、(d)用户明确要求、(e)事实问题上检索置信度低。其他情形,回答。承担风险。

我们 A/B 了赋权 vs 谨慎提示词。赋权把资质评估完成率从 31% 拉到 64%,事实错误没有可测的上升(事实错误被前面的检索 gate 限定,不被提示词限定)。谨慎提示词在 demo 里听起来更安全,赋权提示词赚钱。

失败模式 3:冷门功能问题检索漏召回

潜在客户问"你们的 webhook 签名用 HMAC-SHA256 还是 RSA?"覆盖这条的 chunk 在你的知识库里已经放了 6 个月,用了不同的词汇。Embedding 相似度是 0.62,低于你的阈值 0.7。检索什么都没返回。模型要么拒答(失败模式 2),要么幻觉(失败模式 1)。无论哪种,你输了。

这是我投入工程时间最多的失败模式。几层修复:

  • Chunk 大小:500 tokens,50 tokens overlap。更大的 chunk(1000+)会降低检索精度,因为 embedding 变成了太多概念的平均。更小的 chunk(200)丢上下文。500 是我们在 1,200 条真实客户问题的内部 eval 套件上跑出来的甜点。
  • Embedding 模型:OpenAI 的 `text-embedding-3-small`,1536 维。DeepSeek 没有 embedding 端点,这就是我们整个栈里仍然碰 OpenAI 的唯一一处。我们测过 `text-embedding-3-large`(3072 维),精度提升约 2.1%,不值 2.5x 的成本和翻倍的 Qdrant 存储。
  • 检索阈值:0.7 cosine,但我们检索 top-8 候选并全部过一个 re-ranker。低于 0.55 时,触发一个 query-rewrite 步骤:DeepSeek-flash 把用户问题改写成 3 个 paraphrase,我们对每个再检索一次。这恢复了大约 40% 由词汇不匹配导致的漏召回。
  • Hybrid 检索:纯向量检索会漏 SKU、版本字符串、专有名词这类关键词匹配。我们在 Elasticsearch 上叠 BM25,然后用 reciprocal rank fusion 合并结果。Hybrid 检索把我们 eval 集上的 recall@5 从 71% 拉到 89%。
  • 知识库卫生:最大的收益来自内容本身,不是算法。我们会自动标记 90 天没被检索过的 chunk 给编辑审,以及检索高但下游转化低的 chunk 给重写。

失败模式 4:多轮里的语言漂移

用户用中文开聊。问 3 个问题。到第 5 轮,机器人开始用英文回。到第 7 轮,中英混用。这就是多轮语言漂移问题,它毁信任比几乎任何其他失败都快。

原因:LLM 匹配上下文里最近一条助手回合的语言比匹配用户的语言更强。如果第 3 轮机器人不小心用英文回了(可能因为检索到的 chunk 是英文),它从那以后就会向英文倾斜。

修复:钉死语言。我们在第 1 轮检测用户语言(DeepSeek-flash,在我们支持的 12 种语言上又快又稳),存进会话 metadata,然后给后续每个系统提示词注入一条硬指令:"用 <detected_language> 回复,不论检索内容的语言。引用前把检索内容翻译成 <detected_language>。"我们还在响应上做最终检查 — 如果一个带置信度的语言检测器标记漂移超过 5%,重新生成。

模型路由:Flash vs Pro

Anvil 的聊天流量走 DeepSeek。按我们的模型路由(`ai_router.py`),默认是 `deepseek-v4-flash` — 高吞吐、便宜约 3 倍,对聊天、RAG、意图分类、简单问答足够。在以下触发器命中时升级到 `deepseek-v4-pro`(质量敏感档):用户问的需要多步推理(用 meta-prompt 检测)、检索返回的 chunk 数 > 5 需要综合、对话超过 10 轮且用户表达不满、workspace 是 Enterprise 套餐(默认 Pro)。

上个月生产流量的真实数字:87% 的回合由 flash 服务,11% 由 pro 服务,2% 直接路由到人工交接、不调 LLM。flash p50 延迟 380ms,pro p50 是 1.1s。这种差在聊天 UX 上比任何其他界面都更明显。

人工交接触发器

一个不能让自己出场的机器人比没机器人更糟。我们自动触发交接,在以下情形:

  • 事实问题上低置信度:即使经过 rewrite,检索仍低于 0.55,或 LLM 自报不确定。
  • 抱怨关键词:分类器标到挫败、愤怒、升级语言。30 秒内路由到人。
  • 明确要求:"能找个人吗"、"人工"、"客服"、"真人",任何支持的语言。立即路由。
  • 高价值信号:enrichment 检测到公司规模 > 500 员工且对话在谈价格 — Enterprise 销售不该由机器人接。
  • 卡住的循环:用户连续问同一个问题两遍,说明机器人上一条没说到点上。交接。
  • 情感轨迹:逐轮情感连续 3 轮走负。即使没有抱怨关键词,这也是 fail-state 信号。

当交接触发时,人工 agent UI 收到完整对话、匹配的画像、线索评分、机器人用过的检索 chunk、以及 DeepSeek-flash 生成的一段话摘要。agent 不需要从零开始。

如果重做我会怎么做

两件事重做我会改。一:从第一天就投入 eval 基础设施。我们 1,200 条问题的 eval 套件是调系统时让我们保持诚实的东西,而我们建得太晚了 — 头六个月我们靠感觉发版,发了一堆没注意到的回归。把 eval 建在第二次改提示词之前。

二:把知识库当产品做,不是 marketing 的副产物。我们见过的聊天质量单次最大跃迁,来自把检索最多的 40 篇 KB 文章按检索友好性重写 — 短句、陈述句、一段一个事实、标题里显式同义词。一周的项目,对聊天质量的贡献比之后任何一次模型升级都多。

想要一个在生产里不让你尴尬的可用聊天机器人,大致就是这个形状。Anvil 把这一切开箱即用,但没有一项是秘密。算法都是公开的。工作量在每个选择的工程品味 — chunk 大小、阈值、提示词、路由、交接 — 以及让你知道一个选择错了的 eval 纪律。

SP

Sarah Park

Head of Engineering

热爱 AI 与增长,致力于通过智能自动化帮助品牌发现下一位客户。专注于 AI 与数字营销交叉领域的写作。

想看看 Anvil 实际怎么用?

立即用 AI 获客。无需信用卡。

开始免费试用