LangChain 嵌入向量详解

文章目录

  • [LangChain 嵌入向量详解](#LangChain 嵌入向量详解)
    • [1. 什么是嵌入向量?](#1. 什么是嵌入向量?)
      • [1.1 从文本到数字](#1.1 从文本到数字)
      • [1.2 嵌入向量的特点](#1.2 嵌入向量的特点)
      • [1.3 向量相似度示意](#1.3 向量相似度示意)
    • [2. 为什么需要嵌入向量?](#2. 为什么需要嵌入向量?)
      • [2.1 主要应用场景](#2.1 主要应用场景)
      • [2.2 RAG 中的嵌入向量](#2.2 RAG 中的嵌入向量)
    • [3. 代码解析](#3. 代码解析)
      • [3.1 初始化嵌入模型](#3.1 初始化嵌入模型)
      • [3.2 嵌入文档(多个文本)](#3.2 嵌入文档(多个文本))
      • [3.3 降低向量维度](#3.3 降低向量维度)
    • [4. 参数详解](#4. 参数详解)
      • [4.1 OpenAIEmbeddings 参数](#4.1 OpenAIEmbeddings 参数)
      • [4.2 常用嵌入模型对比](#4.2 常用嵌入模型对比)
    • [5. 嵌入单个查询](#5. 嵌入单个查询)
      • [5.1 embed_query 方法](#5.1 embed_query 方法)
      • [5.2 embed_documents vs embed_query](#5.2 embed_documents vs embed_query)
    • [6. 完整示例](#6. 完整示例)
    • [7. 常见问题](#7. 常见问题)
      • [Q1: 向量维度越大越好吗?](#Q1: 向量维度越大越好吗?)
      • [Q2: 如何选择嵌入模型?](#Q2: 如何选择嵌入模型?)
      • [Q3: 嵌入向量可以手动比较吗?](#Q3: 嵌入向量可以手动比较吗?)
      • [Q4: 不同模型的向量能比较吗?](#Q4: 不同模型的向量能比较吗?)

LangChain 嵌入向量详解

本文介绍什么是嵌入向量(Embeddings),以及如何在 LangChain 中使用文本嵌入。

1. 什么是嵌入向量?

1.1 从文本到数字

计算机无法直接理解文本,但可以理解数字。嵌入向量是将文本转换为数字数组的技术:

复制代码
文本: "Hello world!"
     ↓
向量: [0.123, -0.456, 0.789, ..., 0.021]  # 1536 维

1.2 嵌入向量的特点

特点 说明
语义相似性 语义相似的文本,向量距离更近
可计算性 可以用余弦相似度、欧氏距离等计算
维度固定 同一模型生成的向量维度相同
可Embedding模型 text-embedding-3-large 生成 3072 维向量

1.3 向量相似度示意

复制代码
"你好"     → [0.1, 0.2, ...]  ──┐
"Hello"   → [0.9, 0.1, ...]  ──┼── 距离远,语义不相关
                               │
"Hi"      → [0.85, 0.15, ...] ─┘

2. 为什么需要嵌入向量?

2.1 主要应用场景

场景 说明
语义搜索 通过向量相似度搜索相关内容
文档检索 RAG(检索增强生成)的核心组件
文本分类 将文本分类到不同类别
聚类分析 按语义对文档进行聚类
去重检测 发现相似/重复内容

2.2 RAG 中的嵌入向量

复制代码
用户问题 → 嵌入向量 → 与文档向量匹配 → 检索最相关内容 → 输入 LLM 生成答案

3. 代码解析

3.1 初始化嵌入模型

python 复制代码
from langchain_openai import OpenAIEmbeddings

embeddings_model = OpenAIEmbeddings(
    model="text-embedding-3-large",           # 嵌入模型
    openai_api_key="sk-xxxx",                 # API 密钥
    openai_api_base="https://api.xxx.com/v1"  # API 地址
)

3.2 嵌入文档(多个文本)

python 复制代码
# 同时嵌入多个文本
embeded_result = embeddings_model.embed_documents(["Hello world!", "Hey bro"])

# 返回结果是一个列表
len(embeded_result)  # 2(两个文本)
len(embeded_result[0])  # 3072(text-embedding-3-large 的维度)

3.3 降低向量维度

python 复制代码
# 通过 dimensions 参数指定维度
embeddings_model = OpenAIEmbeddings(
    model="text-embedding-3-large",
    api_key="sk-xxxx",
    base_url="https://api.xxx.com/v1",
    dimensions=1024  # 指定为 1024 维(可节省存储空间)
)

embeded_result = embeddings_model.embed_documents(["Hello world!", "Hey bro"])
len(embeded_result[0])  # 1024

4. 参数详解

4.1 OpenAIEmbeddings 参数

参数 说明 默认值
model 嵌入模型名称 text-embedding-3-small
api_key / openai_api_key API 密钥 -
base_url / openai_api_base API 地址 https://api.openai.com/v1
dimensions 输出向量维度 模型原始维度

4.2 常用嵌入模型对比

模型 向量维度 说明
text-embedding-3-large 3072 最新、最大、最强
text-embedding-3-small 1536 性价比高
text-embedding-ada-002 1536 早期模型

5. 嵌入单个查询

5.1 embed_query 方法

python 复制代码
# 嵌入单个查询文本(用于搜索/匹配)
query_vector = embeddings_model.embed_query("Hello world!")
len(query_vector)  # 3072

5.2 embed_documents vs embed_query

方法 用途 输入 输出
embed_documents 嵌入文档库 文本列表 向量列表
embed_query 嵌入用户查询 单个文本 单个向量

6. 完整示例

python 复制代码
from langchain_openai import OpenAIEmbeddings

# 1. 初始化模型
embeddings_model = OpenAIEmbeddings(
    model="text-embedding-3-large",
    api_key="sk-xxxx",
    base_url="https://api.xxx.com/v1",
    dimensions=1024
)

# 2. 嵌入文档
docs = ["苹果是水果", "香蕉是水果", "汽车是交通工具"]
doc_vectors = embeddings_model.embed_documents(docs)

# 3. 嵌入用户查询
query = "什么水果是黄色的?"
query_vector = embeddings_model.embed_query(query)

# 4. 计算相似度(通常在向量数据库中自动完成)
# 这里可用余弦相似度进行比较

7. 常见问题

Q1: 向量维度越大越好吗?

不是。维度越大,精度越高,但存储和计算成本也增加。根据实际需求选择:

需求 推荐维度
存储优先 256-512
平衡 768-1024
精度优先 1536-3072

Q2: 如何选择嵌入模型?

  • 优先使用最新的 text-embedding-3-large
  • 如果成本敏感,可用 text-embedding-3-small

Q3: 嵌入向量可以手动比较吗?

可以,使用余弦相似度:

python 复制代码
import numpy as np

def cosine_similarity(a, b):
    return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))

sim = cosine_similarity(doc_vectors[0], doc_vectors[1])

Q4: 不同模型的向量能比较吗?

不能。必须使用同一个模型生成的向量才能进行相似度比较。

相关推荐
come112343 分钟前
Codex 下不同场景 模式选择
python
塞讯科技7 分钟前
13,500 个分支被植入窃密工作流:Gheist 如何用 GitHub 令牌搬走仓库密钥
网络安全·ai·github·软件供应链安全·供应链投毒
神也畏惧菠萝42 分钟前
Day08 Python流程控制从入门到上瘾:if/match/while/for四件套,从B站登录一路打到猜数字游戏
python·算法·数据存储·for·while·if·ifelse
言乐61 小时前
通过 3D 动画直观演示球形瓶内可滑动半圆机构在倾倒时防粘盖、回正时刮膏体的运动学过程
python·3d·django·virtualenv·pygame
二哈赛车手1 小时前
新人笔记---hermes定时功能设计,具体讲解以及可优化点
java·人工智能·笔记·spring·ai·typescript
quantdash_cc1 小时前
ETF 行情数据清洗实战:字段语义拆解、标的池整理与五个校验清单
python·数据分析·pandas·量化交易·股票数据·quantdash
小熊恋旧1 小时前
Python 面向对象编程:方法、属性、继承与多态详解
开发语言·python
威哥爱编程2 小时前
Python 智能体开发实战 05:一问教材内容它就编?先把答案从你自己的资料里检索出来
python·agent
java_prinln2 小时前
RAG 面试题介绍
python·agent
威哥爱编程2 小时前
Python 智能体开发实战 06:一个函数里塞了八百行?用状态机把批改流程拆成能回退的步骤
python·agent