中文语义相似度计算:Sentence-BERT 和大模型嵌入到底怎么选
【免费下载链接】Awesome-Chinese-LLM整理开源的中文大语言模型,以规模较小、可私有化部署、训练成本较低的模型为主,包括底座模型,垂直领域微调及应用,数据集与教程等。项目地址: https://gitcode.com/GitHub_Trending/aw/Awesome-Chinese-LLM
客服机器人半夜要判断"发票怎么开"和"申请开票的流程是什么"是不是同一个问题——这就是典型的中文语义相似度计算:把文本变成向量,算距离,输出 0 到 1 的分数。两条主流路线,Sentence-BERT 和大模型嵌入,原理、选型、部署一次讲清。
先看一个完整例子
拿 A="发票怎么开"、B="申请开票的流程是什么" 走一遍:
- 分词:各用 tokenizer 切成 token 序列
- 编码:各过一个嵌入模型,得到 512/1024 维的固定向量
- 算分:对两个向量求余弦相似度,得到 0.87
- 判定:0.87 高于阈值 0.80,判为同一意图,机器人直接复用标准答案
真正耗算力的只有"编码 + 余弦"两步,后面的工程细节都围绕它们展开。
两种方案各自靠什么算相似
Sentence-BERT:把句子压成一条固定向量
它是专用编码器:在海量中文句对上做对比学习微调,让意思相近的句子向量靠近、意思不同的远离。好比一张提前校准好的地图,每句话落一个坐标,查坐标距离就是相似度。CPU 可跑、毫秒级延迟;代价是遇到长难句和新说法,精度会下滑。
大模型嵌入:用生成模型的隐藏状态算相似度
直接取 Qwen、ChatGLM 这类开源中文底座(模型清单见 README.md)的末层隐藏状态当句子向量,或用对比数据再微调一下。生成模型读懂句子的瞬间,隐藏状态里已经装着对上下文的理解,向量天然吃得下口语长句和多意图句;代价是 7B 模型要 15–20G 显存、单次几十毫秒,扛不住高 QPS。
按场景选型:什么条件选什么
| 条件 | 选择 | 原因 |
|---|---|---|
| 算力预算:仅 CPU 或低显存 | Sentence-BERT | 毫秒级,无需显卡 |
| 时延要求:单请求 <20ms、高 QPS | Sentence-BERT | 编码器结构,批量极快 |
| 精度要求:口语化、长文本、多意图 | 大模型嵌入 | 上下文理解强 |
| 数据规模:千万级离线批量 | 量化后的大模型嵌入 | 单次慢,但可批量、异步 |
| 在线与精度都要 | 两级漏斗:SBERT 召回,嵌入大模型精排 | 大头流量走便宜链路 |
拿不准就先抽 500 条线上真实句对,两条链路各跑一遍,看分数分布再定。
落地时最关键的几个细节
- ⚡批处理:大模型嵌入攒批 + 4bit 量化,吞吐能翻几倍,别逐条调用
- 相似度阈值怎么定:没有通用值,用业务域 500–1000 对标注句对画分布定分位,别照抄 0.8
- 文本预处理:入库前统一去 Markdown、表情、空白并全半角归一,超长句按模型上限截断
- 向量缓存:标准问等高频文本按哈希缓存,不重复编码
- 部署资源:SBERT 8G 显存甚至 CPU 可跑;7B 嵌入建议 24G 显存或量化,上线前压测一轮
新手最容易踩的坑
- ⚠️让生成模型直接回答"这两句一样吗":慢、贵、输出不稳定。正确做法:用嵌入模型算向量;要复用生成模型就先微调成嵌入模型
- 换业务域沿用旧阈值:语料一换,同一分数带的含义就变了。正确做法:新场景用新标注数据重新校准
- 用中文覆盖弱的底座做短句匹配:分数普遍偏低、区分度差。正确做法:选中文预训练覆盖大的底座,实测对比后再定
建议按"SBERT 先跑通全链路、再上大模型嵌入做精排"的顺序落地,第一周即可上线可用版本。想深入看底座模型与垂直领域微调清单,doc/LLM.md 按底座整理了全部模型与衍生应用的对应关系。
【免费下载链接】Awesome-Chinese-LLM整理开源的中文大语言模型,以规模较小、可私有化部署、训练成本较低的模型为主,包括底座模型,垂直领域微调及应用,数据集与教程等。项目地址: https://gitcode.com/GitHub_Trending/aw/Awesome-Chinese-LLM
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考