当前位置: 首页 > news >正文

Day23:Embedding与向量化保姆级教程!让大模型读懂你的文字

Day23:Embedding与向量化保姆级教程!让大模型读懂你的文字

📢 专栏导语

大家好,上期咱们搞定了PDF/Word多格式文档解析+智能分块,把一堆文档拆成了规整的文本碎块。但很多同学踩坑:文本拆完了,大模型还是“睁眼瞎”,检索答非所问

核心原因就是:机器看不懂汉字、英文,只认数字

今天这篇Embedding与向量化,就是RAG系统的**“翻译官+身份证办理中心”**,看完不仅懂原理,还能直接写代码、贴简历,新手也能醍醐灌顶!

今日学习目标: ✅ 搞懂Embedding到底是啥,告别死记硬背 ✅ 通义千问在线Embedding实战(零本地压力) ✅ 本地Embedding模型部署(离线自由) ✅ 生成向量结果+对比模型差异 ✅ 产出可直接运行的向量化代码


🧠 一、Embedding与向量化:大白话秒懂(拒绝晦涩公式)

❌ 劝退式定义(别看)

Embedding是将高维离散文本数据映射为低维连续稠密向量的过程,通过向量空间距离表征语义相似度…

✅ 人话版讲解(醍醐灌顶)

把Embedding当成“专属翻译官”

  • 人类:看懂“2026年3月1年期LPR为3.00%”这句话的意思

  • 机器:只认0和1组成的数字,对汉字一窍不通

  • Embedding:把人类的文字,翻译成机器能读懂的**“数字向量数组”,这个翻译过程就是向量化**

把向量化当成“办理语义身份证”

  • 每一段文本,都会生成一串唯一的数字向量(相当于身份证号)

  • 语义越像,向量之间的距离越近(比如“LPR利率”和“贷款市场报价利率”是近亲)

  • 语义无关,向量距离十万八千里(比如“LPR”和“苹果手机”完全不搭边)

RAG核心逻辑串讲: 文档加载→文本分块→Embedding向量化→存入向量库→检索匹配→大模型回答 向量化就是RAG的“咽喉”,这步做不好,后面全白搭!

🔍 两种Embedding方案选型(新手直接抄)

类型代表模型优点缺点适合人群
在线Embedding通义千问text-embedding-v3零部署、速度快、效果好、无需显卡需要API Key、有免费额度上限新手、无显卡、快速上手
本地EmbeddingBAAI/bge-small-zh-v1.5离线可用、免费、隐私安全首次需下载模型、CPU速度一般无API Key、本地部署爱好者

🛠️ 二、环境准备:一键安装依赖(复制即跑)

打开虚拟环境终端,执行以下命令,把所有依赖一次性装完,告别报错:

# 核心依赖:LangChain+向量库+通义千问+本地模型支持pipinstalllangchain langchain-community langchain-core chromadb dashscope sentence-transformers pypdf python-docx-ihttps://pypi.tuna.tsinghua.edu.cn/simple/
  • dashscope:通义千问官方SDK,用于在线Embedding

  • sentence-transformers:本地Embedding模型运行依赖

  • chromadb:轻量级向量库,存储向量结果


💻 三、实战一:通义千问在线Embedding(零门槛首选)

适配场景:没有显卡、不想本地部署,直接用阿里云通义千问Embedding API,新手闭眼冲!

✅ 第一步:获取通义千问API Key

  1. 打开阿里云DashScope控制台:https://dashscope.console.aliyun.com/

  2. 左侧菜单栏找到【API Key管理】,创建并复制Key(格式:sk-xxxx)

  3. 新用户有免费额度,日常学习完全够用

✅ 第二步:完整向量化代码(含文档分块+向量存储)

#!/usr/bin/env python3# -*- coding: utf-8 -*-# Day22:通义千问Embedding向量化实战importosfromlangchain.text_splitterimportRecursiveCharacterTextSplitterfromlangchain_community.vectorstoresimportChromafromlangchain_community.embeddingsimportDashScopeEmbeddings# 沿用之前的多格式加载器fromlangchain_community.document_loadersimportTextLoader,PyPDFLoader,Docx2txtLoader# ===================== 核心配置(必填) =====================# 填入你的通义千问API Keyos.environ["DASHSCOPE_API_KEY"]="sk-你的通义千问API Key"# 向量库存储路径PERSIST_DIRECTORY="./embedding_vector_db"# 测试文档(替换成你的TXT/PDF/DOCX)TEST_FILE="lpr_2026.txt"# ===================== 1. 加载文档 =====================defload_single_document(file_path):"""加载单文档,支持TXT/PDF/DOCX"""iffile_path.endswith(".txt"):loader=TextLoader(file_path,encoding="utf-8")eliffile_path.endswith(".pdf"):loader=PyPDFLoader(file_path)eliffile_path.endswith(".docx"):loader=Docx2txtLoader(file_path)else:raiseValueError("仅支持TXT/PDF/DOCX格式")returnloader.load()# 加载文档docs=load_single_document(TEST_FILE)print(f"✅ 文档加载完成,共{len(docs)}页/段")# ===================== 2. 中文智能分块 =====================text_splitter=RecursiveCharacterTextSplitter(chunk_size=300,# 单块300字符,适配中文语义chunk_overlap=50,# 重叠50字符,防止语义断裂separators=["\n\n","\n","。","!","?"," "]# 中文专属分割符)split_docs=text_splitter.split_documents(docs)print(f"✅ 文档分块完成,共{len(split_docs)}个文本块")# ===================== 3. 通义千问Embedding向量化 =====================print("🔧 正在调用通义千问Embedding进行向量化...")# 初始化通义千问Embedding模型(最新v3版,效果最优)embedding_model=DashScopeEmbeddings(model="text-embedding-v3")# ===================== 4. 向量入库+持久化 =====================vector_db=Chroma.from_documents(documents=split_docs,embedding=embedding_model,persist_directory=PERSIST_DIRECTORY)# 保存向量库到本地,下次直接加载vector_db.persist()print("🎉 向量化完成!向量已存入embedding_vector_db文件夹")# ===================== 今日输出:查看向量结果示例 =====================# 随机取一个文本块,生成向量并打印test_text=split_docs[0].page_content test_vector=embedding_model.embed_query(test_text)print("\n"+"="*60)print("📊 向量结果示例(前10维数字):")print(test_vector[:10])print(f"🔢 向量总维度:{len(test_vector)}")print("📄 对应文本:")print(test_text[:100]+"...")print("="*60)

💻 四、实战二:本地Embedding向量化(离线自由)

适配场景:没有API Key、需要离线部署、注重数据隐私,用本地开源BGE模型,完全免费!

✅ 完整本地向量化代码(替换即可运行)

#!/usr/bin/env python3# -*- coding: utf-8 -*-# Day22:本地Embedding向量化实战(无需API Key)fromlangchain.text_splitterimportRecursiveCharacterTextSplitterfromlangchain_community.vectorstoresimportChromafromlangchain_community.embeddingsimportHuggingFaceEmbeddingsfromlangchain_community.document_loadersimportTextLoader,PyPDFLoader,Docx2txtLoader# ===================== 核心配置 =====================PERSIST_DIRECTORY="./local_embedding_db"TEST_FILE="lpr_2026.txt"# ===================== 1. 加载+分块(和在线版一致) =====================docs=TextLoader(TEST_FILE,encoding="utf-8").load()text_splitter=RecursiveCharacterTextSplitter(chunk_size=300,chunk_overlap=50,separators=["\n\n","\n","。","!","?"," "])split_docs=text_splitter.split_documents(docs)# ===================== 2. 本地Embedding模型初始化 =====================print("🔧 正在加载本地Embedding模型(首次自动下载,约100MB)...")local_embedding=HuggingFaceEmbeddings(model_name="BAAI/bge-small-zh-v1.5",# 中文最优轻量模型model_kwargs={"device":"cpu"},# 有N卡可改为cudaencode_kwargs={"normalize_embeddings":True})# ===================== 3. 向量化+入库 =====================vector_db=Chroma.from_documents(documents=split_docs,embedding=local_embedding,persist_directory=PERSIST_DIRECTORY)vector_db.persist()print("🎉 本地向量化完成!")# ===================== 今日输出:向量结果示例 =====================test_text=split_docs[0].page_content test_vector=local_embedding.embed_query(test_text)print("\n"+"="*60)print("📊 本地向量结果示例(前10维):")print(test_vector[:10])print(f"🔢 向量总维度:{len(test_vector)}")print("="*60)

📊 五、向量结果解读+模型效果对比

1. 向量结果长啥样?

运行代码后,会输出类似这样的数字数组(前10维):

[-0.0234, 0.0567, -0.0129, 0.0890, -0.0345, 0.0678, -0.0092, 0.0453, -0.0761, 0.0219] 向量总维度:1024(通义千问v3)/ 512(本地BGE)
  • 维度越高,语义表征越精细,但计算速度越慢

  • 向量数值本身无意义,向量之间的距离才决定语义相似度

2. 两种Embedding效果差异

  • 通义千问Embedding:语义理解更准,长文本适配好,适合正式项目

  • 本地BGE Embedding:轻量快速,离线可用,日常学习足够


⚠️ 六、新手避坑指南(90%的人都踩过)

  1. API Key报错401:Key填错、未生效、权限不足,去控制台重新生成

  2. 本地模型下载失败:网络问题,改用国内镜像,或手动下载模型

  3. 向量维度不匹配:建库和加载必须用同一个Embedding模型,不能混用

  4. 分块不合理导致向量失效:别把句子砍断,坚持用递归分块


📢 博客互动区

小伙伴们运行代码遇到任何问题,欢迎在评论区留言~ 觉得教程有用的话,点赞+收藏+关注,不错过AI Agent三个月进阶全系列!

本文标签:#AI #RAG #Embedding #向量化 #通义千问 #AI Agent #大模型入门

http://www.jsqmd.com/news/530166/

相关文章:

  • Tesseract.js全栈OCR解决方案:从浏览器到服务器的文本识别技术指南
  • ARM Linux64环境下metaRTC编译全攻略:从源码下载到成功运行
  • Qwen3-ForcedAligner-0.6B效果展示:车载导航语音指令→意图识别+时间戳触发响应
  • 2026年贵阳LED庭院灯选购攻略:5步教你考察工厂,避开高价陷阱 - 精选优质企业推荐榜
  • hotspot桩代码
  • 深求·墨鉴(DeepSeek-OCR-2)开源OCR镜像:支持自定义词典的领域适配教程
  • ChatGPT的App开发实战:如何通过API集成提升开发效率
  • Ultra Adware Killer(超级广告杀手)
  • 20252904 2025-2026-2 《网络攻防实践》第2周作业
  • 别再只盯着漏洞扫描了!用这个‘easy溯源’Linux靶机,实战演练应急响应核心三板斧
  • 春联生成模型-中文-base效果验证:与人工撰写春联在传播力指标对比分析
  • Armbian系统维护全攻略:基于ophub/amlogic-s9xxx项目的版本管理与优化实践
  • 肌肉骨骼模拟:从生物力学建模到智能优化的开源解决方案
  • React15 - 为什么React 15应用在页面渲染时会多次执行类组件的render 函数?
  • 如何将openKylin配置成可以让匿名用户访问的FTP服务器(v0.1.0)
  • 颠覆式突破:SubtitleOCR让硬字幕提取效率提升300%,零基础上手智能处理全指南
  • Stable-Diffusion-v1-5-archiveWeb UI定制化:自定义CSS/快捷按钮/历史记录导出技巧
  • 破局流量焦虑:机床厂商网络推广的渠道甄选与策略重构 - 品牌推荐大师
  • DeepSeek-OCR-2效果实测:vLLM加速前后延迟对比(200ms→42ms)
  • 基础算法:差分(Difference Array)
  • XCOM 2模组管理架构深度解析:AML启动器的技术实现与优化策略
  • 20252904 2025-2026-2 《网络攻防实践》第2周作业.19766389
  • DeOldify模型轻量化探索:在STM32边缘设备上的部署可能性分析
  • 电缆生产厂家推荐哪家?2026年3月电缆生产厂家推荐名单 - 品牌2026
  • 2026年中国电缆一线品牌行业洞察:电缆标杆品牌深度解析与选购指南 - 品牌2026
  • 提供给需要学习的同学,C#读取,写入1200控制西门子V90源代码,博途V13C#源代码VS3...
  • Linux为什么要分区?
  • 博图中RTD/TC信号处理的常见问题与解决方案
  • Xenia Canary进阶指南:深度解析Xbox 360模拟器的专业配置与性能调优
  • 20254214乔若曦实验一《Python程序入门设计》