
上篇我们聊了 RAG 的第一步怎么把文档切好。但切得好不等于找得准。一个真实场景你问 Agent「Spring 事务为什么会失效」它给你返回了一段 Redis 分布式锁的文档。这不是模型蠢是检索层出了问题。大多数人 RAG 效果不好第一反应是换更大的模型。但 80% 的检索失败根子在 Embedding 没选对、参数没配好、或者该微调时没微调。模型再强喂给它错误的上下文它也只会自信地胡说八道。这篇我们拆开讲透 RAG 的语义翻译器——**Embedding**怎么把文字变成语义坐标。介绍把文本转换成向量让计算机可以比较文本之间的语义相似度。一段文本Spring 事务为什么会失效经过 Embedding 模型之后会变成一串浮点数[0.21, -0.53, 0.82, 0.07, ...]这些向量就代表了文本的意思当语义越相似向量就会越接近把“文字游戏”变成了“数学计算”。比如服务器宕机了 - 服务不可用 Spring 事务失效 - Transactional 不生效但是又很多东西在不同的场景下表示的意思也不一样。比如“Transformer” 在 NLP 里是模型 在电力场景里可能是“变压器”Embedding 不是在“理解世界”而是把输入对象映射到一个高维向量空间使训练过程中学到的某些语义、关系和模式在这个空间中表现为可计算的几何关系。给每段文字安排一个“语义坐标”意思相近的文字坐标通常比较近意思差得远的文字坐标通常比较远。它负责“找相关知识”而不是负责“回答问题”。【科技区】 Java Python Redis ● ● ● 【生活区】 水果 美食 ● ● 【天气区】 下雨 下雪 ● ●“Spring 事务为什么会失效”这个问题会从 Java 区找到Spring 相关的资料。使用一般来说先用强模型跑通用评估指标找到瓶颈再决定是否微调。常用的模型如下模型维度MTEB 排名特点适合场景bge-large-en-v1.51024高英文最强之一英文 RAG、英文语义搜索bge-m31024很高多语言、可变维度、长文本、支持多种检索方式中文/英文/多语言 RAGmultilingual-e5-large1024高多语言通用 Embeddingquery/passage 区分多语言搜索、RAGgte-large1024高中英文均衡中文/英文 RAGnomic-embed-text768中高开源、可本地部署、资源需求相对友好本地 RAG、轻量级语义搜索参数介绍参数模板# config.yaml # # 1. Embedding 配置 # embedding: # Embedding 模型 model: BAAI/bge-m3 # 向量维度 dimension: 1024 # 是否对向量进行归一化 normalize: true # 单批次处理数量 batch_size: 32 # 最大输入 Token 数 max_tokens: 8192 # 推理设备 # cpu / cuda / mps device: cuda # 推理精度 # fp32 / fp16 / bf16 precision: fp16向量维度 dimension维度精度存储速度建议384低极小极快仅测试用768中小快资源紧张时1024高中中生产推荐1536很高大较慢边际收益不明显3072最高极大慢Embedding 模型用多少个数字来表示一段文字这就是这段文本的向量维度。可以理解为语义坐标的精度如下文本 -Embedding - [0.8, 0.2, 0.6] # 向量维度 Vector Dimension 3 # 三维坐标 Z ↑ │ ● 文本A │ / │ / │ / └──────────→ X / / ↓ Y维度只是模型最终输出向量的长度不是语义的数量。但是需要注意的是维度越高存储成本也越高。高维语义空间 Spring事务 ───────● \ \ ● Transactional \ ● Spring AOP Redis分布式锁 ─────────────●归一化 normalize部分模型或者推理框架会提供归一化输出L2 norm1把向量的长度调整为 1避免向量大小影响相似度计算可以让检索更多关注向量的方向。需要确保向量库使用余弦相似度或内积归一化后等价不过是否归一化不能一概而论需要结合 Embedding 模型和 Vector DB 使用的距离度量方式来配置。向量 A A [3, 4] 向量长度 √(3² 4²) √25 5 归一化 A [3/5, 4/5] [0.6, 0.8] |A| 1 向量 B B [6, 8] 长度 √(6² 8²) 10 归一化 B [6/10, 8/10] [0.6, 0.8]Batch Size设置一次给 Embedding 模型处理多少条文本如32表示一次处理 32 个 Chunk。batch size 越大吞吐率越高但是显存压力也越大。# API 调用 batch_size 100~500控制 QPS 和延迟 # 本地部署 batch_size 根据显存调整通常 32~128例子代码版from sentence_transformers import SentenceTransformer import faiss # 1. 加载模型 model SentenceTransformer(BAAI/bge-m3) # 2. 文档向量化 docs [ Spring事务通过AOP代理实现同类方法内部调用会绕过代理导致失效, Redis分布式锁使用SET NX EX实现需考虑锁过期和续期, RocketMQ通过业务唯一ID保证消息消费幂等 ] embeddings model.encode(docs, normalize_embeddingsTrue) # 3. 建索引 检索 index faiss.IndexFlatIP(embeddings.shape[1]) index.add(embeddings) # 4. 查询 query_vec model.encode([Spring事务为什么会失效], normalize_embeddingsTrue) scores, indices index.search(query_vec, top_k2) for idx, score in zip(indices[0], scores[0]): print(fScore: {score:.4f} | {docs[idx]})Embedding 微调微调的时机领域术语检索差如 “transformer 在NLP 场景中指电气变压器”时同义词不匹配用户搜“宕机”文档写“服务不可用”匹配不出来时负样本混淆不相关文档得分高于相关文档评估指标低Recall5 0.6。微调方法方法难度效果成本Prompt / Instruction低中零LoRA 微调中高低全参数微调高最高高微调的主要目的是调整模型把文本映射到向量空间的方式让应该相似的文本更接近应该不相似的文本更远。这是一个优化“语义空间”的过程。Instrution/ Prompt 引导在输入文本前加一段指令引导 Embedding 模型往特定方向编码。比较适合领域明确但数据量小的场景如纯技术文档、纯法律合同库。# 索引侧 instruction 为技术文档检索生成向量表示 embedding embed_model.embed(instruction chunk_text) # 查询侧 query_instruction 为检索生成向量 query_embedding embed_model.embed(query_instruction user_query)LoRA 微调只训练少量参数冻结底座模型显存占用低训练快。数据{query:Transactional 为什么没有生效,positive:Spring事务失效的常见原因包括方法自调用、非public方法、异常被catch、对象没有经过Spring代理等。,negative:Spring AOP通过动态代理实现切面增强常见代理方式包括JDK动态代理和CGLIB。} {query:Redis Lua脚本为什么能够保证原子性,positive:Redis Lua脚本在Redis服务端作为一个整体执行执行期间不会被其他命令插入因此可以保证脚本操作的原子性。,negative:Redis分布式锁通常通过SET NX EX实现并可以使用Redisson进行封装。} {query:RocketMQ 如何解决消息重复消费,positive:RocketMQ需要通过业务幂等机制解决重复消费例如使用业务唯一ID、数据库唯一索引或Redis幂等标记。,negative:RocketMQ通过Topic和Consumer Group实现消息的发布订阅和消费者集群。} {query:HashMap 在 JDK8 中是如何解决哈希冲突的,positive:JDK8 HashMap使用数组加链表或红黑树解决哈希冲突当链表长度达到阈值并满足条件时会树化。,negative:ConcurrentHashMap通过CAS和synchronized等机制实现并发安全。}代码示例import json import torch from datasets import Dataset from sentence_transformers import ( SentenceTransformer, SentenceTransformerTrainer, SentenceTransformerTrainingArguments ) from sentence_transformers.losses import MultipleNegativesRankingLoss from peft import LoraConfig # 1. 加载 Base Embedding 模型 model_name BAAI/bge-small-zh-v1.5 model SentenceTransformer( model_name ) # 2. 配置 LoRA lora_config LoraConfig( r8, # r是 LoRA 的低秩矩阵维度决定 LoRA 的参数量和表达能力r 越大通常表示适配能力越强但训练成本也越高。 lora_alpha16, # LoRA 的缩放系数LoRA 更新通常按照 alpha/r 进行缩放用来控制 LoRA 参数更新对原模型的影响程度 lora_dropout0.05, # 是 LoRA 分支上的 Dropout 比例用于降低过拟合风险。 # 不同模型这里可能不同 target_modules[ query, key, value ], biasnone, task_typeFEATURE_EXTRACTION ) # 3. 给 Embedding 模型添加 LoRA model[0].auto_model model[0].auto_model.add_adapter( lora_config ) # 4. 加载训练数据 data [] with open( data/train.jsonl, r, encodingutf-8 ) as f: for line in f: item json.loads(line) data.append({ anchor: item[query], positive: item[positive] }) dataset Dataset.from_list(data) # 5. 定义 Loss loss MultipleNegativesRankingLoss( modelmodel ) # 6. Training 参数 args SentenceTransformerTrainingArguments( output_dir./output/embedding-lora, num_train_epochs3, per_device_train_batch_size8, learning_rate2e-5, warmup_ratio0.1, fp16torch.cuda.is_available(), logging_steps10, save_strategyepoch, report_tonone ) # 7. 开始训练 trainer SentenceTransformerTrainer( modelmodel, argsargs, train_datasetdataset, lossloss ) trainer.train() # 8. 保存模型 model.save_pretrained( ./output/embedding-lora/final ) print(Training finished!)Embedding 常见的坑坑现象解法Embedding 和切分不匹配用中文模型嵌入英文 Chunk确保模型覆盖文档语言向量库距离度量选错用欧氏距离但向量已归一化归一化后用余弦或内积维度不一致升级模型后旧向量无法查询统一重索引或双写过渡Batch 太大API 超时或 OOM减小 batch_size查询不加指令短查询检索效果差查询侧加 instruction忽视负样本相关文档排不上去微调时加入 hard negatives学AI大模型的正确顺序千万不要搞错了2026年AI风口已来各行各业的AI渗透肉眼可见超多公司要么转型做AI相关产品要么高薪挖AI技术人才机遇直接摆在眼前有往AI方向发展或者本身有后端编程基础的朋友直接冲AI大模型应用开发转岗超合适就算暂时不打算转岗了解大模型、RAG、Prompt、Agent这些热门概念能上手做简单项目也绝对是求职加分王给大家整理了超全最新的AI大模型应用开发学习清单和资料手把手帮你快速入门学习路线:✅大模型基础认知—大模型核心原理、发展历程、主流模型GPT、文心一言等特点解析✅核心技术模块—RAG检索增强生成、Prompt工程实战、Agent智能体开发逻辑✅开发基础能力—Python进阶、API接口调用、大模型开发框架LangChain等实操✅应用场景开发—智能问答系统、企业知识库、AIGC内容生成工具、行业定制化大模型应用✅项目落地流程—需求拆解、技术选型、模型调优、测试上线、运维迭代✅面试求职冲刺—岗位JD解析、简历AI项目包装、高频面试题汇总、模拟面经以上6大模块看似清晰好上手实则每个部分都有扎实的核心内容需要吃透我把大模型的学习全流程已经整理好了抓住AI时代风口轻松解锁职业新可能希望大家都能把握机遇实现薪资/职业跃迁这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】