(LangChain)RAG系统链路之嵌入模型Embedding(三)
1.RAG数据流水线示意图
构建RAG系统:涉及的技术链路环节: 文档加载器->文档转换器->文本嵌入模型->向量存储->检索器
2.什么是⽂本嵌⼊Text Embedding
⽂本嵌⼊(Text Embedding)是将⽂本(单词、短语、句⼦或⽂档)映射到⾼维向量空间的技术。
类⽐ :假设你是⼀个Java⼯程师,现在需要将⼀段⽂字(⽐如⽤户评论)存⼊数据库。 传统⽅式可能是存字符串,但计算机⽆法直接“理解”语义。
3.Embedding的作⽤
把⽂字转换成⼀个固定⻓度的数字数组(向量),⽐如 [0.2, -0.5, 0.8, ...] ,这个数 组能“编码”⽂字的含义。 想象每个词或句⼦是⼀个点,⽽Embedding就是给这些点在地图上标坐标。
语义相近的词(如“猫”和“狗”)坐标距离近,⽆关的词(如“猫”和“汽⻋”)坐标距离远。
语义搜索: 找含义相近的内容,不依赖关键词-># 搜索"如何养⼩猫咪" → 匹配到"幼猫护理指南"
智能分类:⾃动识别⽤户评论的情绪/类型
问答系统:快速找到与问题最相关的答案段落
4.什么是嵌⼊Embedding⼤模型
Embedding 模型的主要任务是将⽂本转换为数值向量表示
这些向量可以⽤于计算⽂本之间的相似度、进⾏信息检索和聚类分析
⽂本嵌⼊的整体链路 原始⽂本 → Embedding模型 → 数值向量 → 存储/⽐较
5.LLM ⼤模型 vs Embedding ⼤模型
组合应用场景:
场景1:智能客服系统
Embedding:把⽤户问题"我的订单怎么还没到?"转换成向量,快速匹配知识库中相似问题 LLM:根据匹配到的问题模板,⽣成具体回答:"您的订单已发货,预计明天送达"
场景2:论⽂查重
Embedding:把论⽂段落转为向量,计算与数据库的相似度
LLM:若发现⾼相似度,⾃动改写重复段落并给出修改建议
6.LangChain框架文本嵌入Embedding实操
LangChain框架中的Embedding
通过标准化接口集成了多种嵌入模型,支持开发者灵活调用
功能:对接各类文本嵌入模型的标准化接口
作用:将文本转换为向量,供后续检索/比较使用
类比:不同品牌手机充电器 → LangChain是万能充电头
核心API与属性:
6.1 在线嵌入模型使用,也可以使用其他的厂商
地址:https://bailian.console.aliyun.com/
找到这个自己需要的模型名称:
再去获取key:
把这key 复制下来就可以。
from langchain_community.embeddings import DashScopeEmbeddings
# 初始化模型
ali_embeddings = DashScopeEmbeddings(model="text-embedding-v2", # 第二代通用模型max_retries=3,dashscope_api_key="sk-005c3cxxxxxxxxxxxx",
)
# 分析商品评论情感倾向
comments = ["衣服质量很好,但是物流太慢了","性价比超高,会回购!","尺寸偏小,建议买大一号",
]# 生成嵌入向量
embeddings = ali_embeddings.embed_documents(comments)
print(embeddings)
print(len(embeddings)) # 3
print(len(embeddings[0])) # 1536
6.2本地私有化大模型
为什么要本地部署嵌入大模型?
对比云端风险:第三方API可能造成数据泄露,像严格要求数据安全的ZF/金融/医疗行业 内网隔离的环境
使用ollama下载嵌入大模型
地址:https://ollama.com/search?c=embed#下载嵌入模型
ollama run mofanke/acge_text_embedding
"Error: "mofanke/acge_text_embedding:latest" does not support generate"出现这个错误不用管
# 后台启动服务(默认端口11434)
ollama serve &#查看运行的模型
ollama ps(下面的地址请求通之前 ps命令中看不到运行的acge_text_embedding 。需要先请求一次 才能看到)
嵌入模型请求测试:
linux /mac使用这个测试:
curl http://localhost:11434/api/embeddings -d '{"model": "mofanke/acge_text_embedding", "prompt": "小王同学的模型~"}'
windows使用这个测试:
Invoke-WebRequest -Uri "http://localhost:11434/api/embeddings" ` -Method POST ` -ContentType "application/json" ` -Body '{"model": "mofanke/acge_text_embedding", "prompt": "小王同学的模型~"}'
from typing import List, Optional
from langchain.embeddings.base import Embeddings
import requestsclass OllamaEmbeddings(Embeddings):def __init__(self, model: str = "llama2", base_url: str = "http://localhost:11434"):self.model = modelself.base_url = base_urldef _embed(self, text: str) -> List[float]:try:response = requests.post(f"{self.base_url}/api/embeddings",json={"model": self.model,"prompt": text, # 注意:某些模型可能需要调整参数名(如"prompt"或"text")},)response.raise_for_status()return response.json().get("embedding", [])except Exception as e:raise ValueError(f"Ollama embedding error: {str(e)}")def embed_query(self, text: str) -> List[float]:return self._embed(text)def embed_documents(self, texts: List[str]) -> List[List[float]]:return [self._embed(text) for text in texts]embeddings = OllamaEmbeddings(model="mofanke/acge_text_embedding", base_url="http://localhost:11434"
)
# 分析商品评论情感倾向
comments = ["衣服质量很好,但是物流太慢了","性价比超高,会回购!","尺寸偏小,建议买大一号",
]
# 生成嵌入向量
embeddings = embeddings.embed_documents(comments)
print(embeddings)
print(len(embeddings)) # 3
print(len(embeddings[0])) # 1024
7.嵌入计算提效之-缓存
嵌入计算的痛点
嵌入生成成本高:每次调用模型API都需要计算资源
重复计算浪费:相同文本多次生成嵌入浪费资源
API调用限制:商业API有调用次数限制和成本
响应速度瓶颈:实时场景需要快速响应解决方案:缓存
降低计算成本:相同文本只需计算一次
提升响应速度:缓存读取比模型计算快10-100倍
突破API限制:本地缓存不受远程API配额限制
支持离线场景:网络不可用时仍能获取历史嵌入
注意:API设计区别
embed_documents:面向批量文档预处理(适合缓存)
embed_query:面向实时查询处理(默认不缓存)
from langchain.embeddings import CacheBackedEmbeddings
from langchain_community.embeddings import DashScopeEmbeddings
from langchain_community.storage import RedisStore# Step 1: 设置你的 Embedding 模型
embedding_model = DashScopeEmbeddings(model="text-embedding-v2",max_retries=3,dashscope_api_key="sk-xxxxxxxx",
)
# Step 2: 设置 Redis 存储后端(带密码)
redis_store = RedisStore(redis_url="redis://:password@ip:6379/0",ttl=3600,# 替换为你自己的 Redis 地址和密码
)
cached_embeddings = CacheBackedEmbeddings.from_bytes_store(embedding_model,redis_store,namespace="open-ai-v5", # 可选命名空间,用于隔离不同的模型或用途
)
texts = ["如何重置密码", "如何重置密码"] # 故意重复
# 首次调用(写入缓存)
vector1 = cached_embeddings.embed_documents(texts)
# 二次调用(读取缓存)
vector2 = cached_embeddings.embed_documents(texts)
print(f"结果一致性:{vector1 == vector2}") # 输出True
存储选择策略: