大模型创业圈流传着一句话:“Demo 很丰满,上线很骨感。” 刚过去的 2024 年,无数团队在 Hackathon 上用一小时搭出了令人尖叫的 AI 应用,但当真的要把它变成客户愿意付费的产品时,问题排山倒海而来:模型一本正经地胡说八道、回答格式不统一、敏感内容难以拦截、成本随着调用量飙升……我们团队在做智能政策问答系统时,就完整经历了这一趟“泥巴战”。这篇文章不聊虚的,只讲三个最要命的分水岭,以及我们最终拼出来的一套可执行方案。
战场一:消灭幻觉——不是调 Prompt,而是搭“证据链”
所有人都知道要给模型“喂”上下文,但真正消灭幻觉的核心不是把文档一股脑塞进去,而是让模型先找证据,再开口。
我们采取的是 RAG(检索增强生成)+ 证据溯源 的两段式流水线。
可执行步骤
- 文档切片与元数据绑定
用 MarkdownHeaderTextSplitter 按标题切分,保留章节层级。每条切片自动打上“来源文件名、条款号、更新时间”等元数据,存入向量库的同时也保留一份结构化索引。
- 检索时多路召回,再加一道粗排
同时使用关键词(BM25)和稠密向量(bge-large-zh-v1.5)两路检索,取并集后,采用一个轻量级的交叉编码器(bge-reranker)对前 30 条文档重新排序。这一步极大减少无关段落进入最终上下文。
- 强制引用,让模型“自证清白”
在 System Prompt 中硬性规定:每条结论必须标明引用的原文片段出处编号。例如:
System:
你是一个专业的政策助手。请根据提供的参考资料回答用户问题,
并在答案尾部列出你所引用的参考编号,格式为【来源:① ②】。
如果没有相关参考,必须回答“未找到相关依据”,禁止编造。
同时在后处理环节编写正则校验:如果输出没有 【来源: 关键词,自动触发二次问答,并标记该回答置信度低。上线两周后,我们问答系统的“无幻觉准确率”从 68% 提升到了 91%,真实投诉下降了七成。
战场二:输出结构化——别让模型写作文,让它填表格
客户要的不是一段华丽的周报,而是一个能直接写入数据库的 JSON。这恰好是大模型的另一个坑:你让它输出 JSON,它偶尔给你多加一个逗号,或者干脆夹两句解释。
我们放弃了“Prompt 约束 + 正则修复”的脆弱方案,直接上 OpenAI 风格的 Function Calling。
实战案例:政策咨询结果格式化
定义一个函数 format_policy_answer,要求模型直接返回符合 Schema 的结果:
{
"name": "format_policy_answer",
"description": "将最终答案严格按此结构输出",
"parameters": {
"type": "object",
"properties": {
"conclusion": { "type": "string" },
"applicable_scope": { "type": "string" },
"risk_level": { "type": "string", "enum": ["低", "中", "高"] },
"references": {
"type": "array",
"items": { "type": "object", "properties": { "id": {"type":"integer"}, "quote": {"type":"string"} } }
}
},
"required": ["conclusion", "risk_level", "references"]
}
}
在调用 API 时强制使用 tool_choice。模型返回的不是自由文本,而是一个完整的函数调用请求,我们再将其解析为标准的业务对象,直接交付给后端。这样一来,下游系统永远只接触结构体,不再和自然语言搏斗。上线后,接口解析成功率达到了 100%,再也没有出现过“JSON 解析失败”的监控告警。
战场三:安全护栏——不是屏蔽词,而是“价值观手术”
早期我们以为做个敏感词表就能解决合规问题,结果发现用户会变着花样绕过(反问、假设场景、故意混淆)。真正的安全必须做在语义层。
三层过滤机制
- 输入护栏(Guardrails)
使用轻量级开源库(如 guardrails-ai)对用户输入做语义检测,识别是否有越狱、套取系统 prompt、恶意注入等行为。拦截后不返回模型错误详情,只统一回复“请求无法处理”。
- 输出护栏
直接利用大模型自身判断。我们在返回用户前,用另一个极小的专用模型(如 Qwen2-0.5B 微调的安全评估器)对主模型输出进行“价值对齐评分”,低于 0.85 分的答案直接丢弃,并记录到人工审核队列。
- 灰度发布与回滚
每次 Prompt 或模型升级,先在内部影子流量运行一周,对比新旧回答的安全分和用户满意度。一旦安全分下降 5%,自动回滚。
这三板斧让我们在客户的安全攻防演练中抗住了 300 多次主动攻击测试,并且没有因此产生额外的运维人力。
结语:一把“瑞士军刀”,不如一套好流程
创业初期,我们总想找到一款完美的模型或框架,能一次性解决所有问题。但后来发现,真正让产品活下去的,并不是某项酷炫的技术,而是 “检索增强 + 结构化输出 + 语义安全”的流程闭环。这三件事没做好的团队,哪怕用了千亿参数的模型,也照样会在生产环境里头破血流。
如果你正在经历同样的痛苦,不妨拿出一张纸,画出这三个战场的流程图,然后从最痛的那个环节开始迭代。不要追求一步到位,但每一步都必须能直接落地到代码里。这才是“行业热点”背后,真正值得花时间的地方。