(LangChain)RAG系统链路之嵌入模型Embedding(三)

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 requests


class OllamaEmbeddings(Embeddings):
    def __init__(self, model: str = "llama2", base_url: str = "http://localhost:11434"):
        self.model = model
        self.base_url = base_url

    def _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

存储选择策略:

### 使用LangChain构建RAG 在构建检索增强生成(RAG)应用时,LangChain提供了强大的工具集来简化这一过程。具体来说,`langchain.utils`模块中的实用函数可以辅助处理数据准备和其他预处理工作[^1]。 对于核心的RAG实现,LangChain引入了可运行组件(Runnable)以及表达式语言(LCEL),这使得定义复杂的流水线变得简单直观[^2]。下面是一个简单的例子展示如何利用这些特性创建一个基本的RAG系统: ```python from langchain import LangChain, DocumentLoader, EmbeddingModel, VectorStore, Retriever, PromptTemplate, LLMChain # 初始化文档加载器用于读取并分割输入文本文件 document_loader = DocumentLoader() # 加载嵌入模型以转换文本片段成向量表示形式 embedding_model = EmbeddingModel() # 创建矢量存储实例保存经过编码后的文档片断 vector_store = VectorStore(embedding_function=embedding_model.embed) # 构建检索器对象以便后续查询最相似的内容项 retriever = Retriever(vector_store=vector_store) # 定义提示模板指导大语言模型(LLM)基于检索到的信息生成回复 prompt_template = PromptTemplate( input_variables=["context", "question"], template="Given this context:\n{context}\nAnswer the following question: {question}" ) # 组合上述各部分形成完整的LLM链路结构 rag_chain = LLMChain(llm=LangChain(), retriever=retriever, prompt=prompt_template) ``` 此代码段展示了如何集成不同类型的组件——从原始资料加载直至最终响应合成——从而搭建起一套有效的RAG解决方案。值得注意的是,在实际部署过程中可能还需要考虑更多细节配置选项和服务优化措施。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值