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

WIN10 本地部署 BGE Embedding 向量化模型

WIN10 本地部署 BGE Embedding 向量化模型

  • 1.下载 BGE 模型
  • 2.安装
    • 1.创建虚拟环境
    • 2.安装依赖
    • 3.本地测试
  • 3.将服务封装为HTTP可调用形式
    • 1.生成向量值
    • 2.相似度测试

1.下载 BGE 模型

Hugging Face 官网

最好是科学上网,或者从其他渠道下载

2.安装

本文通过 Anconda 创建虚拟环境演示,可以直接用本地环境或其他虚拟形式,Anconda 的替代包可以用 Miniforge(命令是与 Anconda 兼容的)

1.创建虚拟环境

## 查看版本
conda -V
## 查看已有环境列表
conda env list
## 创建环境
conda create -n env-bge python=3.10

在这里插入图片描述

2.安装依赖

## 激活虚拟环境
conda activate env-bge
## 依赖包
pip install -U FlagEmbedding

在这里插入图片描述

3.本地测试

在模型文件所在的目录,打开控制台文件夹,并切换到虚拟环境 env-bge

测试命令

## 激活虚拟环境
conda activate env-bge
## BGE 命令
from FlagEmbedding import BGEM3FlagModel
model = BGEM3FlagModel('bge-m3', use_fp16=True)
sentences_1 = ["你多大了"]
sentences_2 = ["你几岁了"]
embeddings_1 = model.encode(sentences_1, batch_size=12, max_length=8192)['dense_vecs']
embeddings_2 = model.encode(sentences_2)['dense_vecs']
similarity = embeddings_1 @ embeddings_2.T

在这里插入图片描述

3.将服务封装为HTTP可调用形式

1.生成向量值

# encoding=utf-8
import http.server
import socketserver
import urllib.parse
from FlagEmbedding import FlagModel

# 设置HTTP服务的端口号
HOST = '0.0.0.0'
PORT = 8800

# 读取模型
model_zh = FlagModel('ZH\\bge-large-zh', use_fp16=True)
model_en = FlagModel('EN\\bge-large-en', use_fp16=True)
model_m3 = FlagModel('M3\\bge-m3', use_fp16=True)

# 创建一个请求处理类,继承自BaseHTTPRequestHandler
class SimpleHTTPRequestHandler(http.server.BaseHTTPRequestHandler):

    # 处理GET请求的方法
    def do_GET(self):
        try:
            query_string = self.path.split('?')[-1]
            params = urllib.parse.parse_qs(query_string)

            # 解析GET参数
            md_type = params.get('type', [''])[0]
            content = params.get('content', [''])[0]
            # print(f"params content_1:{content_1} \n content_2:{content_2}")
            if md_type == 'zh':
                embeddings = model_zh.encode(content)
            elif md_type == 'en':
                embeddings = model_en.encode(content)
            elif md_type == 'm3':
                embeddings = model_m3.encode(content)
            else:
                embeddings = 'md type is error'
            # print(result)
            # print(type(embeddings))
            # 返回
            self.send_response(200)  # 设置响应状态码为200
            self.send_header('Content-type', 'text/plain')  # 设置响应头
            self.end_headers()  # 结束响应头的发送
            if type(embeddings) == str :
                self.wfile.write(embeddings.encode())  # 向客户端发送响应内容
            else:
                self.wfile.write(str(embeddings.tolist()).encode())  # 向客户端发送响应内容

        except Exception as e:
            print(e)


# 创建并启动服务
httpd = socketserver.TCPServer((HOST, PORT), SimpleHTTPRequestHandler)
print(f'Serving at http://{HOST}:{PORT}')
httpd.serve_forever()

启动方式,激活虚拟环境,直接运行脚本

在这里插入图片描述

测试1错误的类型

http://127.0.0.1:8800?type=md&content=你好

在这里插入图片描述

测试2生成你好的向量值,结果长度 1024

http://127.0.0.1:8800?type=zh&content=你好

在这里插入图片描述

测试3生成Hello的向量值,结果长度 1024

在这里插入图片描述

2.相似度测试

# encoding=utf-8
import http.server
import socketserver
import urllib.parse
from FlagEmbedding import FlagModel

# 设置HTTP服务的端口号
HOST = '0.0.0.0'
PORT = 8800

# 读取模型
model_zh = FlagModel('ZH\\bge-large-zh', use_fp16=True)
model_en = FlagModel('EN\\bge-large-en', use_fp16=True)
model_m3 = FlagModel('M3\\bge-m3', use_fp16=True)

# 创建一个请求处理类,继承自BaseHTTPRequestHandler
class SimpleHTTPRequestHandler(http.server.BaseHTTPRequestHandler):

    # 处理GET请求的方法
    def do_GET(self):
        try:
            query_string = self.path.split('?')[-1]
            params = urllib.parse.parse_qs(query_string)

            # 解析GET参数
            md_type = params.get('type', [''])[0]
            # 解析GET参数
            content_1 = params.get('content_1', [''])[0]
            content_2 = params.get('content_2', [''])[0]
            # print(f"params content_1:{content_1} \n content_2:{content_2}")
            type=1
            embeddings_1=[]
            embeddings_2=[]
            if md_type == 'zh':
                embeddings_1 = model_zh.encode(content_1)
                embeddings_2 = model_zh.encode(content_2)
            elif md_type == 'en':
                embeddings_1 = model_zh.encode(content_1)
                embeddings_2 = model_zh.encode(content_2)
            elif md_type == 'm3':
                embeddings_1 = model_zh.encode(content_1)
                embeddings_2 = model_zh.encode(content_2)
            else:
                type = 2
            # print(result)
            # print(type(embeddings))
            # 返回
            self.send_response(200)  # 设置响应状态码为200
            self.send_header('Content-type', 'text/plain')  # 设置响应头
            self.end_headers()  # 结束响应头的发送
            if type == 2 :
                self.wfile.write('md type is error'.encode())  # 向客户端发送响应内容
            else:
                result = embeddings_1 @ embeddings_2.T
                self.wfile.write(str(result.tolist()).encode())  # 向客户端发送响应内容

        except Exception as e:
            print(e)


# 创建并启动服务
httpd = socketserver.TCPServer((HOST, PORT), SimpleHTTPRequestHandler)
print(f'Serving at http://{HOST}:{PORT}')
httpd.serve_forever()

启动方式,激活虚拟环境,直接运行脚本

在这里插入图片描述

调用

http://127.0.0.1:8800?type=zh&content_1=小明把小红的自行车骑坏了&content_2=被小明骑坏的自行车是小红的

在这里插入图片描述

换成相反说法,相似度仍然很高,看来是有点小问题的
http://127.0.0.1:8800?type=zh&content_1=小明把小红的自行车骑坏了&content_2=被小红骑坏的自行车是小明的

在这里插入图片描述

相关文章:

  • unxi-进程间通信
  • 使用PHP接入纯真IP库:实现IP地址地理位置查询
  • akka现有的分布式定时任务框架总结
  • 条件渲染
  • .Net 9下使用Tensorflow.net---DNN_Keras
  • AI时代前端开发技能变革与ScriptEcho:拥抱AI,提升效率
  • MongoDB 复制(副本集)
  • Uncaught TypeError: Module._malloc is not a function
  • 【学习笔记16】Java中常见的Exception(异常)
  • ROS2 同一个pkg里定义自定义action、msg报错
  • 爬虫解析库:Beautiful Soup的详细使用
  • 怎样把外网的文件放到内网?
  • Python3 运算符
  • 清影2.0(AI视频生成)技术浅析(五):音频处理技术
  • 超高速工业相机的应用
  • angular简易计算器
  • 27.C++继承 3 (复杂的菱形继承与菱形虚拟继承)
  • 蓝桥云课python代码
  • 影像集的过滤
  • 重新求职刷题DAY18
  • 工人日报刊文:反餐饮浪费,机关食堂的创新值得“抄作业”
  • 马斯克:大幅削减政治支出,仍将执掌特斯拉至少5年,除非去世
  • 失智老人有两个儿子却欠费住养老院两年多,法检合力指定监护人
  • 小马智行一季度营收增12%:Robotaxi收入增长两倍,预计车队规模年底到千台
  • 上海高桥镇10个重点项目集中签约,总投资近20亿元
  • 中国需加强自主创新和国际合作,提升产业链供应链韧性