资讯动态

文档分块后如何高效检索?嵌入模型选择与实战解析 | 语义+关键词混合检索全攻略

发布时间:2026/8/5 7:17:44 来源:尧图企业网站定制
本文探讨了文档分块后向量化处理的重要性详细介绍了通过OpenAI的text-embedding-3-small模型将文本转为稠密向量并实现基于语义相似度的用户关注企业检索。同时结合BM25算法实现关键词检索并引入BGE-M3模型生成稠密、稀疏及ColBERT多向量用于混合检索场景。文章还讨论了不同场景下嵌入模型的选择依据以及如何利用MTEB排行榜评估模型性能为文档检索系统构建提供了全面的解决方案。上文我们讲到如何对文档进行分块那文档分块后就能直接放入向量数据库中并检索了吗答案是否定的文档分块后需要通过嵌入模型将数据转成向量表示。所以本文主要讲述如何将数据转成向量以及选择合适的嵌入模型。在文档切块后通过embedding将文本计算成向量表示并存入向量库代码实现相似度匹配通过openAI的text-embedding-3-small嵌入模型实现查询哪位用户最关注“浙江某科技有限公司”。将文本转换成稠密向量Dense通过语义相似度找到这位用户。流程如下企业财务报表.csv实现import os from dotenv import load_dotenv load_dotenv() import pandas as pd import numpy as np from sklearn.metrics.pairwise import cosine_similarity from openai import OpenAI # 客户端 client OpenAI( base_urlos.getenv(PROXY_AI_BASE_URL), api_keyos.getenv(PROXY_AI_API_KEY) ) # # user_id, company_name # df pd.read_csv(企业财务报表.csv, encodingutf-8) # # 生成向量函数 # def get_embedding(text): rsp client.embeddings.create(input[text], modeltext-embedding-3-small) return np.array(rsp.data[0].embedding) # # 为每个企业生成一个简单的文本 # company_names df[company_name].unique() company_texts {c: f企业名称{c} for c in company_names} # # 生成企业向量 # company_vectors {} for c in company_names: vec get_embedding(company_texts[c]) company_vectors[c] vec print(f\n企业{c}) print(向量前10个值, vec[:10]) # -- 打印真实向量 # # 生成用户向量关注企业的平均向量 # user_vectors {} for user_id, group in df.groupby(user_id): vecs [company_vectors[row[company_name]] for _, row in group.iterrows()] user_vectors[user_id] np.mean(vecs, axis0) # # 随便选一个目标企业 # target_company 浙江某科技有限公司 target_vec company_vectors[target_company] # # 计算相似度 # results [] for uid, uvec in user_vectors.items(): sim cosine_similarity([uvec], [target_vec])[0][0] results.append((uid, sim)) result_df pd.DataFrame(results, columns[user_id, similarity]) result_df result_df.sort_values(bysimilarity, ascendingFalse) print(\n) print(f最可能关注 {target_company} 的用户) print(result_df.head())输出结果从结果上看user011是最关注“浙江某科技有限公司”的用户。关键词检索用BM25算法把关键词文本变成稀疏向量。其流程财务文本-分词营业收入、净利润、资产负债率…-统计词频-计算BM25分数重要关键词高分-输出【稀疏向量】{编号:分数}实现from collections import Counter import math # # 企业财务知识文本你的项目场景 # finance_texts [ 2024年公司营业收入12.5亿元同比增长18%净利润1.8亿元, 企业资产负债率22%流动比率1.98偿债能力处于健康水平, 研发投入1.9亿元占总营收比例15.2%同比提升2.3个百分点, 经营活动现金流净额3.2亿元比去年同期增加1.1亿元, 公司毛利率14.6%期间费用率控制在8.3%盈利能力稳定 ] # 超参数BM25标准 k1 1.5 b 0.75 # # 构建财务词表 # vocabulary set(word for text in finance_texts for word in text.split()) vocab_to_idx {word: idx for idx, word in enumerate(vocabulary)} # # 计算 IDF # N len(finance_texts) df Counter(word for text in finance_texts for word in set(text.split())) idf {word: math.log((N - df[word] 0.5) / (df[word] 0.5) 1) for word in vocabulary} # # 平均文本长度 # avg_text_len sum(len(text.split()) for text in finance_texts) / N # # BM25 稀疏嵌入关键词权重 # def bm25_sparse_embedding(text): tf Counter(text.split()) text_len len(text.split()) embedding {} for word, freq in tf.items(): if word in vocabulary: idx vocab_to_idx[word] score idf[word] * (freq * (k1 1)) / (freq k1 * (1 - b b * text_len / avg_text_len)) embedding[idx] score return embedding # # 输出每个财务文本的稀疏向量 # for i, text in enumerate(finance_texts): sparse_emb bm25_sparse_embedding(text) print(f\n 财务文本 {i1} ) print(f内容{text}) print(fBM25稀疏嵌入关键词权重{sparse_emb})结果混合检索通过bge-m3 生成三种向量用于RAG混合检索。实现import os import numpy as np from dotenv import load_dotenv from openai import OpenAI load_dotenv() # 线上BGE-M3 API配置 client OpenAI( base_urlos.getenv(PROXY_AI_BASE_URL), api_keyos.getenv(PROXY_AI_API_KEY) ) def get_bge_m3_three_vectors(text: str): 调用线上BGE-M3 API同时返回 dense / sparse / colbert 三种向量 response client.embeddings.create( inputtext, modelBAAI/bge-m3, encoding_formatfloat, extra_body{ return_sparse: True, return_colbert: True } ) data response.data[0] return { dense: np.array(data.embedding, dtypenp.float32), sparse: data.sparse_embedding, # dict: {index: weight} colbert: np.array(data.colbert_embedding, dtypenp.float32) } def main(): finance_text 2024年公司营业收入12.5亿元同比增长18%净利润1.8亿元 vectors get_bge_m3_three_vectors(finance_text) print( 财务文本 ) print(finance_text) print( * 60) print(\n✅ 稠密向量 Dense) print(f维度: {vectors[dense].shape}) print(f前8个值: {np.round(vectors[dense][:8], 4)}) print(\n✅ 稀疏向量 Sparse) print(f非零元素: {len(vectors[sparse])}) print(前5个权重:, dict(list(vectors[sparse].items())[:5])) print(\n✅ Colbert多向量) print(f形状: {vectors[colbert].shape} (token数 × 1024)) print(第一个token向量前5个值:, np.round(vectors[colbert][0][:5], 4)) if __name__ __main__: main()稠密向量 (Dense)→ 语义检索稀疏向量 (Sparse)→ 关键词匹配多向量 (Colbert)→ 细粒度匹配向量的表示形式稠密向量dense一串固定维度的浮点数组如384/768/1024/1536维每一维几乎都有值。代表BGE、OpenAI Embedding、Jina举例[0.123, -0.456, 0.789, ..., 0.222]优点表达语义强适合“ 语义相近 ” 检索缺点对精确匹配编号、ID、专有名词可能不如关键词检索稳定稀疏向量sparse大多元素是0维度巨大。但是非常稀疏常用 “词频/特征-权重 ” 字典表示。代表BM25、TF-IDF、bge-m3 sparse举例[0,0,0,2.3,0,0,1.8,...0,3.1]优点精确匹配强特别适合编号、ID、专有名词缺点对语义改写的泛化能力弱多向量Multi-vector一个文本多套向量表示检索时做更细粒度匹配代表ColBERT、BGE-M3优点检索精度高、混合检索跨语言检索缺点索引更大、检索更慢、工程复杂嵌入模型的选择不同场景下的嵌入模型选择场景embedding 类型模型什么时候选它传纯文本回答稠密 denseOpenAItext-embedding-3-smallJinajina-embeddings-v3用户提问是“说法各不相同”要靠语义找到相关的段落关键词/专有名词精确命中稀疏 sparse / BM25BM25精确命中关键词通常工业级RAG中文混合hybriddensesparseBAAI/bge-m3绝大多数情况下这是更稳的选择多语言中文支持多语言/中文更强的 densebge-m3 / Jina /OpenAI不同模型中文检索质量差异很大建议用你自己的小评测集验证MTEB排行榜衡量文本嵌入模型的参考下面的图会告诉你在不同参数规模下哪个模型最快哪个模型最准哪个最省资源。地址https://huggingface.co/spaces/mteb/leaderboardY轴Mean (Task)代表模型在所有基准任务上的平均得分。分数越高、语义理解能力越强检索越准。X轴Number of Active Parameters代表模型的激活参数量。数值越大、模型越重、能力越强。气泡颜色/大小颜色越深/越大表示允许输入/生成的token上限越高、就是上下文长度越长。点到气泡上可以看到具体的模型配置/版本。所以根据上图想要低成本快速上线的选择最左边的模型想要长上下文的选择最上面的模型。想要超长文档处理的选择最右边的模型。总结文档分块后不能直接检索必须通过嵌入模型转为向量再存入向量数据库才能实现高效语义 / 关键词匹配。结语抓住大模型时代的职业机遇AI大模型的发展不是“替代人类”而是“重塑职业价值”——它淘汰的是重复性、低附加值的工作却催生了更多需要“技术业务”交叉能力的高端岗位。对于求职者而言想要在这波浪潮中立足不仅需要掌握Python、TensorFlow/PyTorch等技术工具更要深入理解目标行业的业务逻辑如金融的风险控制、医疗的临床需求成为“懂技术、懂业务”的复合型人才。无论是技术研发岗如算法工程师、研究员还是业务落地岗如产品经理、应用工程师大模型都为不同背景的职场人提供了广阔的发展空间。只要保持学习热情紧跟技术趋势就能在AI大模型时代找到属于自己的职业新蓝海。最近两年大模型发展很迅速在理论研究方面得到很大的拓展基础模型的能力也取得重大突破大模型现在正在积极探索落地的方向如果与各行各业结合起来是未来落地的一个重大研究方向大模型应用工程师年包50w属于中等水平如果想要入门大模型那现在正是最佳时机2025年Agent的元年2026年将会百花齐放相应的应用将覆盖文本视频语音图像等全模态如果你对AI大模型入门感兴趣那么你需要的话可以点击这里大模型重磅福利入门进阶全套104G学习资源包免费分享扫描下方csdn官方合作二维码获取哦给大家推荐一个大模型应用学习路线这个学习路线的具体内容如下第一节提示词工程提示词是用于与AI模型沟通交流的这一部分主要介绍基本概念和相应的实践高级的提示词工程来实现模型最佳效果以现实案例为基础进行案例讲解在企业中除了微调之外最喜欢的就是用提示词工程技术来实现模型性能的提升第二节检索增强生成RAG可能大家经常会看见RAG这个名词这个就是将向量数据库与大模型结合的技术通过外部知识来增强改进提升大模型的回答结果这一部分主要介绍RAG架构与组件从零开始搭建RAG系统生成部署RAG性能优化等第三节微调预训练之后的模型想要在具体任务上进行适配那就需要通过微调来提升模型的性能能满足定制化的需求这一部分主要介绍微调的基础模型适配技术最佳实践的案例以及资源优化等内容第四节模型部署想要把预训练或者微调之后的模型应用于生产实践那就需要部署模型部署分为云端部署和本地部署部署的过程中需要考虑硬件支持服务器性能以及对性能进行优化使用过程中的监控维护等第五节人工智能系统和项目这一部分主要介绍自主人工智能系统包括代理框架决策框架多智能体系统以及实际应用然后通过实践项目应用前面学习到的知识包括端到端的实现行业相关情景等学完上面的大模型应用技术就可以去做一些开源的项目大模型领域现在非常注重项目的落地后续可以学习一些Agent框架等内容上面的资料做了一些整理有需要的同学可以下方添加二维码获取仅供学习使用

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价