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、有免费额度上限 新手、无显卡、快速上手
本地Embedding BAAI/bge-small-zh-v1.5 离线可用、免费、隐私安全 首次需下载模型、CPU速度一般 无API Key、本地部署爱好者

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

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

# 核心依赖:LangChain+向量库+通义千问+本地模型支持
pip install langchain langchain-community langchain-core chromadb dashscope sentence-transformers pypdf python-docx -i https://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向量化实战
import os
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import Chroma
from langchain_community.embeddings import DashScopeEmbeddings
# 沿用之前的多格式加载器
from langchain_community.document_loaders import TextLoader, PyPDFLoader, Docx2txtLoader

# ===================== 核心配置(必填) =====================
# 填入你的通义千问API Key
os.environ["DASHSCOPE_API_KEY"] = "sk-你的通义千问API Key"
# 向量库存储路径
PERSIST_DIRECTORY = "./embedding_vector_db"
# 测试文档(替换成你的TXT/PDF/DOCX)
TEST_FILE = "lpr_2026.txt"

# ===================== 1. 加载文档 =====================
def load_single_document(file_path):
    """加载单文档,支持TXT/PDF/DOCX"""
    if file_path.endswith(".txt"):
        loader = TextLoader(file_path, encoding="utf-8")
    elif file_path.endswith(".pdf"):
        loader = PyPDFLoader(file_path)
    elif file_path.endswith(".docx"):
        loader = Docx2txtLoader(file_path)
    else:
        raise ValueError("仅支持TXT/PDF/DOCX格式")
    return loader.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)
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import Chroma
from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain_community.document_loaders import TextLoader, 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卡可改为cuda
    encode_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 #大模型入门

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐