为分类任务微调表示模型
深入讲解为分类任务微调表示模型的完整流程:分类头设计、全量微调 vs LoRA 的选择、小样本场景下的 SetFit 方案,以及过拟合防范与模型评估。
从稀疏检索(BM25)到稠密向量检索,再到混合检索与 Reranking——系统梳理语义搜索与 RAG 的完整技术栈,以及实际工程中的优化策略。
分块是因为嵌入模型有长度限制,且短文本的嵌入质量更高。解决上下文缺失:1)重叠分块——相邻块共享一部分内容;2)父子分块——用小块检索但返回时带上所属大块的上下文;3)给每个块加上文档标题和摘要作为前缀。处理跨片段依赖:可以在检索后用LLM判断是否需要相邻块,或者用滑动窗口合并连续命中的块。
1)优化分块策略——块太大语义模糊,太小信息不全;2)查询改写——用LLM把用户问题改写成更适合检索的形式;3)混合检索——向量+BM25关键词检索融合;4)加重排序模型——用交叉编码器对召回结果精排;5)微调嵌入模型——用领域数据做对比学习微调;6)HyDE——先让LLM生成假设答案,用答案的嵌入去检索。
用混合检索(hybrid search)。同时跑向量检索和BM25关键词检索,然后用RRF(Reciprocal Rank Fusion)等方法融合两路结果。向量检索负责语义匹配,BM25负责精确关键词匹配,取长补短。很多向量数据库(如Milvus、Weaviate)已经内置了混合检索功能。还可以加一层重排序模型做最终排序。
双编码器(向量检索)和交叉编码器(重排序)的精度差距很大。向量检索用双编码器,query和文档分别编码后算余弦相似度,效率高但交互不够充分。重排序用交叉编码器,把query和文档拼在一起联合编码,能捕捉更细粒度的语义交互,精度明显更高但速度慢。所以典型做法是:向量检索先召回top-100,重排序再从中选出top-5,兼顾效率和精度。
用户的原始输入往往不适合直接检索:1)口语化表达和文档的书面表达有gap;2)用户问题可能省略了上下文(多轮对话中);3)一个复杂问题可能需要拆成多个子查询分别检索。查询改写用LLM把用户输入转换成更适合检索的形式,比如补全指代、拆分子问题、改写成陈述句等。HyDE更进一步——直接让LLM生成一个假设答案,用答案去检索,效果往往比用问题检索更好。
1)给文档加时间戳和来源元数据,检索时优先返回最新的;2)在提示词中要求模型标注信息来源,遇到冲突时明确告知用户;3)用可信度标签——手动或自动给文档打分,检索时加权;4)让模型做事实性检查——对生成的回答和检索的文档做一致性验证;5)定期更新知识库,清理过时文档。
用反馈循环:1)生成模块评估每次检索结果的用处——哪些文档被引用了,哪些没用;2)基于这些反馈更新文档的可信度分数,影响后续检索排序;3)用用户反馈(点赞/点踩)作为RL的奖励信号,训练检索策略网络。本质是把检索当成可学习的决策问题,而不是固定的规则。
来源标注:在提示词中要求模型对每个论断标注引用的文档编号,前端把编号渲染成可点击的引用链接。确信度:1)用检索分数作为基础置信度;2)让模型自评确信度(但需标定);3)通过多次采样算一致性——多次生成的回答越一致,确信度越高;4)计算生成内容与检索文档的语义相似度作为 grounding分数。
每次任务完成后,用LLM提取关键经验(什么有效、什么坑、最佳实践),结构化存入知识库。后续任务时用RAG检索相关经验。避免覆盖的方法:1)用追加而不是更新——新经验作为新条目加入,不删旧的;2)定期用LLM合并相似经验,生成更全面的总结;3)给经验加时间戳和使用频率,检索时可以按相关性和时效性加权。
建两层索引:1)粗粒度层——对每章/每部分做摘要,用于回答梗概类问题;2)细粒度层——对原文分块做RAG索引,用于回答细节问题。查询时先用路由判断问题类型:宏观问题用摘要层,细节问题用RAG层,复合问题两层都用。摘要可以分层做:章节摘要→部分摘要→全书摘要,形成层次化的理解。
索引端:用CLIP等多模态嵌入模型对图像、视频帧、文本统一编码到同一向量空间,支持跨模态检索。存储端:每个文档块关联其包含的图像/视频的引用。生成端:用多模态LLM(如GPT-4V、Qwen-VL)同时处理检索到的文本和图像,生成回答时标注哪些图表相关,前端展示时直接嵌入原图/视频。
多层记忆架构:1)短期记忆——最近的对话保持在上下文中;2)中期记忆——用摘要压缩近几天的事件;3)长期记忆——所有历史记录存入向量数据库,用RAG检索。存储时对每天的记录用LLM提取关键事件、情绪、偏好等结构化信息。检索时同时用语义相似度和时间过滤。还可以建用户画像文档,定期更新,作为系统提示词的一部分。
RELATED