文章目录
Prompt实战之构建语义搜索引擎 4)向量化与 Embedding
完成文本切分后,我们已经将文档转化为结构清晰的片段。接下来,需要将这些文本片段转化为语言模型可以理解和比对的形式:向量(Vector)。
这一步通常称为向量化(Vectorization)或生成嵌入(Embedding),是构建语义搜索系统的核心环节。
4.1 什么是嵌入(Embedding)?
嵌入是将自然语言表示为稠密向量(如 1536 维浮点数向量)的过程,使得相似含义的句子具有相近的向量表示。
- 例如,“今天天气真好”和“The weather is great today.” 会被编码为接近的向量。
- 这样可以通过“计算向量距离”来判断语义相似度。
📌 向量化让机器能够“理解”文本之间的语义关系。
4.2 常用嵌入模型
模型 | 提供商 | 特点 |
---|---|---|
OpenAI Embeddings(如 text-embedding-3-small ) | OpenAI | 高质量通用模型,支持多语言 |
HuggingFace 模型(如 BAAI/bge-small-zh-v1.5 ) | 社区 | 支持离线本地部署 |
Cohere, Azure, Google Palm 等 | 第三方 | 可选,需配置 API |
本教程优先使用 OpenAI 嵌入模型,也会介绍本地模型替代方案。
4.3 使用 OpenAI Embedding 向量化文档
安装依赖
pip install openai
确保你已经设置了 API 密钥(例如设置环境变量 OPENAI_API_KEY
)。
示例代码
from langchain.embeddings import OpenAIEmbeddings
embedding_model = OpenAIEmbeddings(model="text-embedding-3-small")
# 传入已切分后的文档片段
doc_embeddings = embedding_model.embed_documents(
[doc.page_content for doc in split_docs]
)
print(f"生成了 {len(doc_embeddings)} 个向量,维度为 {len(doc_embeddings[0])}")
📌 每个文档片段都会被转化为一个向量(如 1536 维 float 列表)。
4.4 将文档与向量绑定
LangChain 的 Document
类支持携带 metadata,但不会自动绑定向量信息。因此在后续构建索引时,我们会统一将 (文本片段, 向量, 元信息)
存入向量数据库中。
4.5 使用本地模型向量化(选读)
如果你希望离线使用或避免调用 OpenAI 接口,可以使用 HuggingFace 模型,例如:
pip install sentence-transformers
from langchain.embeddings import HuggingFaceEmbeddings
embedding_model = HuggingFaceEmbeddings(
model_name="BAAI/bge-small-zh-v1.5" # 中文表现优秀
)
vectors = embedding_model.embed_documents(
[doc.page_content for doc in split_docs]
)
💡
bge
系列模型支持中文和英文,且适配 LangChain。
4.6 嵌入模型的选择建议
应用场景 | 建议模型 |
---|---|
多语言、英文为主 | OpenAI text-embedding-3-* |
中文为主 | BAAI/bge 系列(推荐) |
离线部署、隐私要求高 | HuggingFace 模型 |
4.7 本章小结
本章你学习了:
- 嵌入(Embedding)的定义与作用;
- 如何使用 OpenAI 或 HuggingFace 模型生成文档向量;
- 嵌入模型在语义搜索系统中的作用;
- 适配不同场景的嵌入模型选择策略。
练习区 🛠️
- 使用 OpenAI 的
text-embedding-3-small
模型为 100 个文档片段生成向量,记录耗时与向量维度。 - 比较
OpenAIEmbeddings
与HuggingFaceEmbeddings
在中文语料上的结果差异(可用向量间余弦相似度测试)。 - 修改嵌入模型,尝试调用
bge-large-zh
,观察生成时间与向量长度的变化。 - 编写一个函数:输入文本列表 → 输出向量列表,可用于后续的批量索引。