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

(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

存储选择策略:

http://www.lqws.cn/news/586153.html

相关文章:

  • spring-ai 工作流
  • 深入理解CSS定位:掌握网页布局的核心技术
  • SpringBoot 启动入口深度解析:main方法执行全流程
  • 【Python使用】嘿马云课堂web完整实战项目第2篇:CMS页面管理需求,后端工程搭建【附代码文档】
  • C++ 安装使用教程
  • Git命令使用心得
  • LeetCode 594. 最长和谐子序列
  • if __name__ == ‘__main__‘:
  • 【嵌入式ARM汇编基础】-ELF文件格式内部结构详解(三)
  • IDEA相关配置记录
  • 对selenium进行浏览器和驱动进行配置Windows | Linux
  • 【机器学习第四期(Python)】LightGBM 方法原理详解
  • Excel Report
  • Photoshop 插件 NBP Freqsep Control 2.0 安装全流程
  • C++ Programming Language —— 第4章:程序流程结构
  • 【启发式算法】Dynamic A*(D*)算法详细介绍(Python)
  • 「Java流程控制」while循环
  • 3.前端和后端参数不一致,后端接不到数据的解决方案
  • Redis 和 Mysql 如何保证数据一致性
  • [Python 基础课程]变量
  • 如何通过SSL证书配置防止源站IP泄露 - 全面防护指南
  • 源码包安装haproxy(rocky8)
  • Kafka 核心机制面试题--自问自答
  • 本地部署kafka4.0
  • PHP中的异常处理try-catch语句
  • Franka机器人赋能RoboCulture研究,打造生物实验室智能解决方案
  • 【科研绘图系列】R语言绘制世界地图分布(world map)
  • 炸鸡派-基础测试例程
  • AdGuard Home 安装及使用
  • 插入排序的简单介绍