这道题问的是[[RAG]]里文本怎么转成向量,其实核心就是给文档做索引,让检索又快又准。我一般会从[[分块]]策略、模型选型、[[嵌入]]优化和落地评估这几个环节来讲,重点是怎么在效果和工程成本之间做取舍。
先说分块。分块的粒度直接影响检索质量。我倾向按语义段落切,优先在标点、换行这些自然边界断,保证一个块是一个完整意思。如果文档结构清晰,比如企业SOP,就按章节切;如果是纯文本,我会把[[滑动窗口]]的chunk_size和overlap设为候选变量,结合文档结构、模型输入限制和同一评测集验证是否避免句子被拦腰切断。这里有个坑:分块太碎容易丢失上下文,比如退款政策里一句“超过30天不处理”单独拿出来可能歧义;分块太大又会让检索噪声变多。所以实际落地我经常混合策略:小块做检索,同时保留[[父文档]]信息,召回后把整段上下文喂给模型。
然后是Embedding模型选型。通用中文场景我会首选开源模型比如BGE或GTE,MTEB榜单可以参考,但最终还是要拿业务数据实测召回率。如果是中英混合的文档,比如外企的订单和客服记录,我会选E5或者BGE-large这种跨语言对齐好的模型。垂直领域,比如法律合同或医疗病历,通用模型对术语理解不够,最好用领域数据微调一下。选型有个前提:模型要对口业务场景,如果文档全是中文但模型偏英文,召回率直接崩。
嵌入生成时我会做几个优化。先说批量推理,用GPU一次编码一批文档,比逐条快很多。再一个是向量归一化,L2归一化后点积等价于余弦相似度,检索库用内积索引就行,加速明显。还有就是维度压缩,如果向量维度太高,比如1024维,存储和检索压力大,我会用PCA降到256维,精度损失能接受但速度翻倍。当然压缩前要测Recall@K,确保不跌太多。
质量保障是上线前的关键。离线我会算Top-K召回率和MRR,用一批标注好的query-doc对来评估。在线我会抽检人工看召回的相关性,建立bad case闭环。特别要注意的是,RAG不是向量化就完事了,如果检索结果质量差,生成必然跑偏。所以上线前我会用历史query回放,对比新旧流程的召回率和延迟,通过才切换,不通过就回滚。
最后说边界。分块和模型选型没有银弹,固定切分适合日志、代码这种结构简单的,语义切分适合新闻、报告;稠密向量适合语义匹配,稀疏向量比如[[BM25]]适合关键词精确匹配,真正落地常常两者混合。我倾向用[[混合检索]],把两条路的结果合并再[[重排]],这样既能抓住语义也能兜底精确匹配。
如果面试官追问,我会补充一点:RAG的向量化质量最终要靠端到端评测,不是单看召回率。我常用[[RAGAS]]框架,从[[Faithfulness]]、[[Context Precision]]等维度评估生成质量,再反推索引和检索的瓶颈。这样能避免“召回好但生成差”的脱节问题。