第二章:langchain文本向量化(embed)搭建与详细教程-本地服务方式(下)

前言

在上篇文章介绍了langchain源码embed方法与基于api key方式构建向量模型。然而,某些情况,我们调用的模型不存在支持框架能将其转为openai api key形式或不被支持。基于此,我们使用服务端与客户端的方法来构建一个能替换上一章内容的方法。我们构建本地构建一个向量模型,通过服务方式发送,再被langchain所接受形式。当然,这个方法也适用大语言模型实现形式,只需要发送服务接口与langchain调用保持一致即可。

一、本地构建模型与服务端搭建代码

我这边本地使用transformer方法来构建一个text embed模型,而服务使用flask方法来实现,我已在代码内做了解读,将不再介绍。

1、完整代码

from flask import Flask, request, jsonify  # 导入Flask框架及其处理请求和响应的模块
from transformers import AutoTokenizer, AutoModel  # 导入Hugging Face的AutoTokenizer和AutoModel用于加载预训练模型
import torch  # PyTorch库,用于深度学习相关的操作
# 设置设备为GPU(如果有)或CPU
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
def init_embed_model_huggingface(model_path, device=device):
    tokenizer = AutoTokenizer.from_pretrained(model_path)  # 从指定路径加载预训练的分词器
    model = AutoModel.from_pretrained(model_path)  # 从指定路径加载预训练的模型
    model.to(device)  # 将模型移动到选定的设备(GPU/CPU)
    model.eval()  # 设置模型为评估模式,关闭dropout等训练时才需要的功能
    return tokenizer, model
model_path = '/langchain/embed_model/bge-small-zh-v1.5'  # 模型文件的本地路径
tokenizer, model = init_embed_model_huggingface(model_path)  # 初始化分词器和模型
app = Flask(__name__)  # 创建一个Flask应用实例
@app.route('/', methods=['POST'])  # 定义路由和允许的方法,这里只接受POST请求
def get_embedding():
    # 检查请求头中的Authorization字段是否匹配特定的Bearer Token
    if request.headers.get('Authorization') != 'Bearer sk-JaJE4fXaktHAI2MB295FAd58004f7eBcE255B63CdD6F2':
        return jsonify({"error": "Unauthorized"}), 403  # 如果不匹配,则返回未授权错误
    data = request.json  # 从请求中获取JSON格式的数据
    sentences = data.get('input')  # 获取"data"键对应的值,即要嵌入的句子列表
    if not sentences:
        return jsonify({"error": "No input provided"}), 400  # 如果没有提供输入,则返回错误信息
    encoded_input = tokenizer(sentences, padding=True, truncation=True, return_tensors='pt')  # 对输入文本进行编码
    # 将输入张量移动到与模型相同的设备上
    encoded_input = {key: tensor.to(device) for key, tensor in encoded_input.items()}
    with torch.no_grad():  # 禁用梯度计算,减少内存占用和加速计算
        model_output = model(**encoded_input)  # 使用模型进行前向计算
        sentence_embeddings = model_output[0][:, 0]  # 提取每个句子的第一个token的隐藏状态作为句子嵌入
    # 归一化并转换为列表格式
    sentence_embeddings = torch.nn.functional.normalize(sentence_embeddings, p=2, dim=1).tolist()
    
    # 构建响应内容,包含嵌入结果、使用的模型名称及对象类型
    response = {
        "data": [{"embedding": emb, "index": idx} for idx, emb in enumerate(sentence_embeddings)],
        "model": "BAAI/bge-small-zh-v1.5",
        "object": "list"
    }
    return jsonify(response)  # 返回JSON格式的响应
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=55000)  # 运行Flask应用,监听所有IP地址的55000端口

2、结果示例

启动成功后结果如下:
在这里插入图片描述

当然,上面构建模型可以使用transformer方式,也可以使用flagembed框架。无论使用什么方法来构建模型,只要能进行发送,被客户端提供的内容能给出结果即可。而想被langchain所调用,只需构建满足langchain接口即可,该接口或格式已在上一章进行了说明。所以总结,客户端的代码满足langchain格式即可,而服务端与客户端如何接口,就看你个人如何定义了。

二、基于flask服务端构建langchain调用的向量方法代码

在上面启动了服务端后,我们需要构建符合langchain可调用的text embed模型,而该模型构建需要什么接口,我已在上一章给出了解读,就是embed_documents与embed_query的2个方法,但也要记住异构的这2个方法哈(因langchain的Emebdding存在这个内容,这里不构建了)。

1、完整代码

import requests
from langchain_core.embeddings import Embeddings

class EmbeddingsModel_flask(Embeddings):
    # 初始化方法,用于设置模型参数和API密钥
    def __init__(self, api_key=None, base_url=None, model="BAAI/bge-small-zh-v1.5", **kwargs):
        # 设置模型名称,默认为"BAAI/bge-small-zh-v1.5"
        self.model = model
        # 设置API的基础URL,如果未提供则从kwargs中获取
        self.base_url = base_url or kwargs.get("base_url")
        # 设置API密钥
        self.api_key = api_key

    # 获取嵌入向量的私有方法
    def _get_embeddings(self, texts):
        # 设置请求头,包括授权信息和内容类型
        headers = {
            'Authorization': f'Bearer {self.api_key}',
            'Content-Type': 'application/json'
        }
        # 设置请求体,包含输入文本
        data = {"input": texts}
        # 发送POST请求到API,获取嵌入向量
        response = requests.post(self.base_url, json=data, headers=headers)

        # 检查响应状态码,如果是200则表示成功
        if response.status_code == 200:
            # 从响应中提取嵌入向量
            return [item['embedding'] for item in response.json()['data']]
        else:
            # 如果响应状态码不是200,则抛出异常
            raise Exception(f"Error: {response.text}")

    # 嵌入文档的方法
    def embed_documents(self, texts, chunk_size=None):
        # 调用私有方法获取嵌入向量
        return self._get_embeddings(texts)

    # 嵌入查询的方法
    def embed_query(self, text):
        # 调用私有方法获取嵌入向量
        embeddings = self._get_embeddings([text])
        # 返回第一个嵌入向量,如果没有则返回None
        return embeddings[0] if embeddings else None

# 写一个本地加载的Demo
def embed_model_flask():
    api_url = "http://132.142.995.20:55000/"  # 修改这里的URL以匹配服务器端点
    api_key_embeddings = "sk-JaJE4fXaktHAI2MB295FAd5804f7eBcE5B63CdD6F2"

    embeddings_model = EmbeddingsModel_flask(api_key=api_key_embeddings, base_url=api_url)
    return embeddings_model

if __name__ == "__main__":
	api_url = "http://132.142.995.20:55000/"  # 修改这里的URL以匹配服务器端点
    api_key_embeddings = "sk-JaJEfXaktHAI2MB295FAd5004f7eBcE255B63CdD6F2"
    client = EmbeddingsModel_flask(api_key=api_key_embeddings, base_url=api_url)
    data = ["今天天气很好", "我们很开心,和大家一起出来玩"]
    embedding = client.embed_query(data[0])  # 单个查询
    print("Single query embedding:", embedding)
    embeddings = client.embed_documents(data)  # 多文档查询
    print("Multiple documents embeddings:", embeddings)

2、结果示例

在这里插入图片描述

总结

当然,使用服务是一个可行方法,但至于用什么来做,可根据你的想法来。这里,你需要构建满足langchain接口即可。另外,该模式不仅使用text embed模型,也适用任何其它模型,如大语言模型。

基于gcc的stm32环境搭建源码+文档说明.zip,个人经导师指导并认可通过的高分设计项目,评审分99分,代码完整确保可以运行,小白也可以亲自搞定,主要针对计算机相关专业的正在做毕业设计的学生和需要项目实战练习的学习者,可作为毕业设计、课程设计、期末大作业,代码资料完整,下载可用。 基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的stm32环境搭建源码+文档说明.zip基于gcc的
内容概要:本文档是2017年全国大学生电子设计竞赛的试题,针对单相用电器分析监测装置的设计制作提出了具体任务和要求。该装置需具备学习和分析监测两种模式,在学习模式下测试并存储电器特征参量,在分析监测模式下实时指示用电器类别和工作状态。基本要求包括电器电流范围、可识别的电器工作状态数、响应时间、最小电流电器的自制等。发挥部分则鼓励提高装置性能,如学习功能优化、增强识别能力、低功耗设计以及无线传输等功能。文档还详细规定了参赛注意事项,如参赛队伍组成、比赛时间安排、纪律要求等,并给出了评分标准,涵盖设计报告、基本要求完成情况及发挥部分的表现; 适合人群:参加全国大学生电子设计竞赛的本科生及高职高专学生,特别是对电子设计、单相用电器监测感兴趣的团队; 使用场景及目标:①作为竞赛指南,帮助参赛队伍明确设计目标和要求;②指导参赛队伍进行单相用电器分析监测装置的设计制作,确保满足竞赛的基本要求和发挥部分的要求; 其他说明:文档强调了参赛纪律,要求参赛者必须是有正式学籍的全日制在校生,并且在竞赛期间只能在学校指定场地内进行设计制作,不得他人交流。此外,文档还提供了详细的评分标准,以确保评审过程的公平性和透明度。
<think>好的,我现在需要帮助用户解决如何在本地使用LangChain结合BGE-large-zh-v1.5向量模型的问题。用户之前可能已经了解过这个模型的基本信息,现在需要具体的部署步骤。 首先,我得回忆一下BGE模型的相关知识。根据引用[1]和[2],BGE-large-zh-v1.5是FlagEmbedding项目的一部分,专注于文本检索和语义相似度计算。用户需要在本地部署,所以需要安装相关的库,比如transformers和langchain。 接下来,安装步骤。用户需要安装langchain和transformers库,可能还需要sentence-transformers,因为BGE模型是基于这个框架的。安装命令应该是pip install这些包。 然后,模型的加载。根据引用[1],使用AutoTokenizer和AutoModel从HuggingFace加载模型,指定模型名称BAAI/bge-large-zh-v1.5。这里可能需要提醒用户确保网络通畅,或者如果下载慢的话使用镜像源。 接着,如何将模型集成到LangChain中。LangChain的HuggingFaceEmbeddings类可以包装本地模型,所以需要创建实例,传入模型和tokenizer。可能还需要设置encode_kwargs参数,比如normalize_embeddings为True,这对某些应用场景有帮助。 验证部署部分,用户需要测试生成的嵌入向量是否符合预期,比如检查向量的维度和是否归一化。这里可能需要给出示例代码,比如用model.encode方法测试一个句子。 此外,用户可能需要知道如何在实际应用中使用这个嵌入模型,比如在文档检索或问答系统中。可以提到结合FAISS或Chroma进行向量存储,并给出简单的示例步骤。 还要注意可能的常见问题,比如模型下载失败、设备支持(是否使用GPU)、以及归一化的重要性。例如,引用[2]提到模型经过优化,归一化可能影响相似度计算的结果。 最后,生成相关问题的时候,要考虑用户可能的后续疑问,比如性能优化、处理长文本的方法,或者其他模型对比的优势。这些都需要基于之前的步骤和模型特点来设计。</think>以下是在本地使用LangChain结合BGE-large-zh-v1.5向量模型的完整部署方法: ### 一、环境准备 1. 安装依赖库 ```bash pip install langchain transformers sentence-transformers ``` ### 二、模型部署 1. 本地模型加载(需4.3GB存储空间) ```python from langchain.embeddings import HuggingFaceEmbeddings from transformers import AutoModel, AutoTokenizer model_name = "BAAI/bge-large-zh-v1.5" tokenizer = AutoTokenizer.from_pretrained(model_name) model = AutoModel.from_pretrained(model_name) ``` 2. LangChain集成配置 ```python embed_model = HuggingFaceEmbeddings( model_name=model_name, model_kwargs={'device': 'cpu'}, # 或'cuda'使用GPU encode_kwargs={ 'normalize_embeddings': True # 推荐开启归一化[^2] } ) ``` ### 三、使用验证 ```python # 生成文本向量 text = "自然语言处理技术" embedding = embed_model.embed_query(text) print(f"向量维度:{len(embedding)}") # 应输出1024维 ``` ### 四、实际应用示例 ```python from langchain.text_splitter import CharacterTextSplitter from langchain.vectorstores import FAISS # 文档处理 documents = ["文本内容1", "文本内容2..."] text_splitter = CharacterTextSplitter(chunk_size=500, chunk_overlap=50) docs = text_splitter.create_documents(documents) # 创建向量库 vector_store = FAISS.from_documents(docs, embed_model) ``` ### 注意事项 1. 首次运行会自动下载模型文件(约2.4GB) 2. 推荐使用GPU加速(需安装PyTorch GPU版本) 3. 归一化参数`normalize_embeddings`对相似度计算效果显著[^2] 4. 长文本建议分割为512token以内的片段
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tangjunjun-owen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值