我之前干过一件挺蠢的事:为了省事,把好几段文本直接用换行拼成一大段丢给模型做 Embedding,心想反正内容都相关,向量应该也差不多吧。结果检索的时候灾难了——搜出来的东西似是而非,明明每段各自的语义都挺清晰,拼在一起之后反而谁都匹配不上。从那以后我就记住了,这个坑真的别踩。
后来我才想明白问题出在哪。Embedding 模型不管你塞给它多少内容,最后都只输出一个向量,它得把所有信息"压缩"进这一串数字里。你只给它一段讲退款的文本,向量就老老实实落在"退款"那片区域;你再拼一段讲物流的,模型就得两头都照顾,最终的向量大概落在两者中间的某个位置——既不像退款,也不像物流。拿地图坐标打比方,这就像把北京和上海的坐标取了个平均,那个点落在中间,哪儿都不挨着。检索时拿它去匹配,自然两边都够不着。
还有个容易被忽略的点:模型能处理的上下文长度是有限的。拼得太长,后面的内容可能被截掉,或者权重被稀释,你以为信息都放进去了,其实模型根本没"看全"。
那正确的姿势是什么?我的经验是按语义单元切段,一段一个向量,各管各的。检索时分别去匹配,哪段相关就命中哪段,精度明显好很多。如果确实需要一个整体表示,也可以先分段生成向量再做聚合,而不是在文本层面先拼死。
当然,拼接也不是绝对不行。如果几段文本本来就围绕同一件事、语义高度一致,拼起来问题不大,还能省点调用次数。怕就怕把两件事混到一起——这是我踩过的坑,希望你别再踩一遍。下次做 Embedding 之前,先问自己一句:这几段真的是一回事吗?不是的话,老老实实切开。
参与讨论
暂无评论,快来发表你的观点吧!